From 6501132d80f0559a44ee368ec00a5c093668b322 Mon Sep 17 00:00:00 2001 From: duanfuxiang Date: Thu, 12 Jun 2025 15:19:07 +0800 Subject: [PATCH] update model settings multi lang. --- src/core/rag/embedding.ts | 1 - src/lang/helpers.ts | 9 +++++++- src/lang/locale/en.ts | 21 ++++++++++++++++++ src/lang/locale/zh-cn.ts | 18 +++++++++++++++ .../components/ModelProviderSettings.tsx | 22 ++++++++----------- .../components/ProviderModelsPicker.tsx | 13 ++++++----- src/utils/api.ts | 1 - 7 files changed, 63 insertions(+), 22 deletions(-) diff --git a/src/core/rag/embedding.ts b/src/core/rag/embedding.ts index 831fc8d..9c8c07c 100644 --- a/src/core/rag/embedding.ts +++ b/src/core/rag/embedding.ts @@ -56,7 +56,6 @@ export const getEmbeddingModel = ( } }, getBatchEmbeddings: async (texts: string[]) => { - console.log("use getBatchEmbeddings", texts.length) try { if (!openai.apiKey) { throw new LLMAPIKeyNotSetException( diff --git a/src/lang/helpers.ts b/src/lang/helpers.ts index 1f9a654..9abbc5a 100644 --- a/src/lang/helpers.ts +++ b/src/lang/helpers.ts @@ -56,7 +56,7 @@ const localeMap: { [k: string]: Partial } = { const locale = localeMap[moment.locale()]; -export function t(str: string): any { +export function t(str: string, params?: Record): any { if (!locale) { console.error({ plugin: "infio-copilot", @@ -75,5 +75,12 @@ export function t(str: string): any { if (result === undefined) return str; } + // Handle parameter interpolation + if (params && typeof result === 'string') { + return result.replace(/\{([^}]+)\}/g, (match, key) => { + return params[key] !== undefined ? String(params[key]) : match; + }); + } + return result; } diff --git a/src/lang/locale/en.ts b/src/lang/locale/en.ts index 04fe5b8..9cdbf65 100644 --- a/src/lang/locale/en.ts +++ b/src/lang/locale/en.ts @@ -216,8 +216,29 @@ export default { }, Models: { chatModel: 'Chat model:', + chatModelDescription: 'Model used for daily conversations and Q&A, handling most chat interactions', autocompleteModel: 'Autocomplete model:', + autocompleteModelDescription: 'Model used for code and text autocompletion, providing intelligent writing suggestions', embeddingModel: 'Embedding model:', + embeddingModelDescription: 'Model used for document vectorization and semantic search, supporting RAG functionality', + }, + + // Model Provider Settings + ModelProvider: { + noApiKeySet: 'No API key has been set', + setApiKey: 'Set {provider} API Key', + modelSelection: 'Model Selection', + oneClickConfig: 'One-Click Config', + oneClickConfigTooltip: 'Automatically configure models to recommended models from providers with API keys set', + chatModelConfigured: 'Chat model configured automatically: {provider}/{model}', + autocompleteModelConfigured: 'Autocomplete model configured automatically: {provider}/{model}', + embeddingModelConfigured: 'Embedding model configured automatically: {provider}/{model}', + provider: 'Provider', + model: 'Model', + selectModel: 'Select model...', + searchOrEnterModelName: 'Search or enter model name...', + enterCustomModelName: 'Enter custom model name', + custom: 'Custom: ', }, // Model Parameters Section diff --git a/src/lang/locale/zh-cn.ts b/src/lang/locale/zh-cn.ts index a3619de..e870775 100644 --- a/src/lang/locale/zh-cn.ts +++ b/src/lang/locale/zh-cn.ts @@ -224,6 +224,24 @@ export default { embeddingModelDescription: '用于文档向量化和语义搜索的模型,支持 RAG 功能', }, + // 模型提供商设置 + ModelProvider: { + noApiKeySet: '当前未设置任何 API Key', + setApiKey: '设置 {provider} API Key', + modelSelection: '模型选择', + oneClickConfig: '一键配置', + oneClickConfigTooltip: '自动配置模型为已设置 API Key 的提供商的推荐模型', + chatModelConfigured: '已自动配置聊天模型:{provider}/{model}', + autocompleteModelConfigured: '已自动配置自动补全模型:{provider}/{model}', + embeddingModelConfigured: '已自动配置嵌入模型:{provider}/{model}', + provider: '提供商', + model: '模型', + selectModel: '选择模型...', + searchOrEnterModelName: '搜索或输入模型名称...', + enterCustomModelName: '输入自定义模型名称', + custom: '自定义: ', + }, + // 模型参数部分 ModelParameters: { title: '模型参数', diff --git a/src/settings/components/ModelProviderSettings.tsx b/src/settings/components/ModelProviderSettings.tsx index 797413a..cba3050 100644 --- a/src/settings/components/ModelProviderSettings.tsx +++ b/src/settings/components/ModelProviderSettings.tsx @@ -82,7 +82,7 @@ const CustomProviderSettings: React.FC = ({ plugin, if (settedProviders.length === 0) { // 提示用户未设置任何key - alert("当前未设置任何key"); + alert(t("settings.ModelProvider.noApiKeySet")); return; } @@ -104,13 +104,13 @@ const CustomProviderSettings: React.FC = ({ plugin, newSettings.chatModelProvider = selectedProvider; newSettings.chatModelId = defaultModels.chat; hasUpdates = true; - console.log(`已自动配置聊天模型:${selectedProvider}/${defaultModels.chat}`); + console.log(t("settings.ModelProvider.chatModelConfigured", { provider: selectedProvider, model: defaultModels.chat })); } if (defaultModels.autoComplete) { newSettings.applyModelProvider = selectedProvider; newSettings.applyModelId = defaultModels.autoComplete; hasUpdates = true; - console.log(`已自动配置自动补全模型:${selectedProvider}/${defaultModels.autoComplete}`); + console.log(t("settings.ModelProvider.autocompleteModelConfigured", { provider: selectedProvider, model: defaultModels.autoComplete })); } } @@ -122,7 +122,7 @@ const CustomProviderSettings: React.FC = ({ plugin, newSettings.embeddingModelProvider = embeddingProvider; newSettings.embeddingModelId = embeddingDefaultModels.embedding; hasUpdates = true; - console.log(`已自动配置嵌入模型:${embeddingProvider}/${embeddingDefaultModels.embedding}`); + console.log(t("settings.ModelProvider.embeddingModelConfigured", { provider: embeddingProvider, model: embeddingDefaultModels.embedding })); } } @@ -217,7 +217,7 @@ const CustomProviderSettings: React.FC = ({ plugin, // 生成包含链接的API Key描述 const generateApiKeyDescription = (provider: ApiProvider): React.ReactNode => { const apiUrl = getProviderApiUrl(provider); - const baseDescription = t("settings.ApiProvider.enterApiKeyDescription"); + const baseDescription = String(t("settings.ApiProvider.enterApiKeyDescription")); if (!apiUrl) { // 如果没有URL,直接移除占位符 @@ -253,11 +253,7 @@ const CustomProviderSettings: React.FC = ({ plugin,
{provider !== ApiProvider.Ollama && ( - 设置 {provider} API Key - - } + name={t("settings.ModelProvider.setApiKey", { provider })} placeholder={t("settings.ApiProvider.enterApiKey")} description={generateApiKeyDescription(provider)} value={providerSetting.apiKey || ''} @@ -306,13 +302,13 @@ const CustomProviderSettings: React.FC = ({ plugin, {/* 模型选择区域 */}
-

模型选择

+

{t("settings.ModelProvider.modelSelection")}

diff --git a/src/settings/components/ProviderModelsPicker.tsx b/src/settings/components/ProviderModelsPicker.tsx index 94aef50..d5b8e8b 100644 --- a/src/settings/components/ProviderModelsPicker.tsx +++ b/src/settings/components/ProviderModelsPicker.tsx @@ -2,6 +2,7 @@ import * as Popover from "@radix-ui/react-popover"; import Fuse, { FuseResult } from "fuse.js"; import React, { useEffect, useMemo, useRef, useState } from "react"; +import { t } from "../../lang/helpers"; import { ApiProvider } from "../../types/llm/model"; import { InfioSettings } from "../../types/settings"; // import { PROVIDERS } from '../constants'; @@ -224,7 +225,7 @@ export const ComboBoxComponent: React.FC = ({ if (!exactMatch) { results.unshift({ id: searchTerm, - html: [{ text: `${modelIds.length > 0 ? '自定义: ' : ''}${searchTerm}`, isHighlighted: false }] + html: [{ text: `${modelIds.length > 0 ? t("settings.ModelProvider.custom") : ''}${searchTerm}`, isHighlighted: false }] }); } } @@ -268,7 +269,7 @@ export const ComboBoxComponent: React.FC = ({
{/* Provider Selection - Now visible outside */}
- + 0 ? "搜索或输入模型名称..." : "输入自定义模型名称"} + placeholder={modelIds.length > 0 ? t("settings.ModelProvider.searchOrEnterModelName") : t("settings.ModelProvider.enterCustomModelName")} value={searchTerm} onChange={(e) => { setSearchTerm(e.target.value); @@ -348,7 +349,7 @@ export const ComboBoxComponent: React.FC = ({ updateModel(modelProvider, selectedOption.id); } } else if (searchTerm.trim()) { - // 如果没有选项但有输入内容,直接使用输入内容 + // If no options but there is input content, use the input content directly updateModel(modelProvider, searchTerm.trim()); } setSearchTerm(""); diff --git a/src/utils/api.ts b/src/utils/api.ts index 530202d..b032c9f 100644 --- a/src/utils/api.ts +++ b/src/utils/api.ts @@ -147,7 +147,6 @@ export const infioDefaultModelInfo: ModelInfo = { let infioModelsCache: Record | null = null; async function fetchInfioModels(apiKey?: string): Promise> { - console.log("fetchInfioModels apiKey", apiKey) if (infioModelsCache) { return infioModelsCache; }