From d16207e3c5f7052d09a6a824fbaa5a3c13e88f49 Mon Sep 17 00:00:00 2001 From: duanfuxiang Date: Thu, 12 Jun 2025 16:08:05 +0800 Subject: [PATCH] update . --- src/lang/locale/en.ts | 25 ++++++++++++++ src/lang/locale/zh-cn.ts | 25 ++++++++++++++ src/settings/components/FormComponents.tsx | 14 ++++---- .../components/ModelProviderSettings.tsx | 33 +++++++++++-------- 4 files changed, 78 insertions(+), 19 deletions(-) diff --git a/src/lang/locale/en.ts b/src/lang/locale/en.ts index 9cdbf65..3c5f4b2 100644 --- a/src/lang/locale/en.ts +++ b/src/lang/locale/en.ts @@ -239,6 +239,31 @@ export default { searchOrEnterModelName: 'Search or enter model name...', enterCustomModelName: 'Enter custom model name', custom: 'Custom: ', + testConnection: { + testApiConnection: 'Test API Connection', + testingConnection: 'Testing connection...', + connectionSuccess: 'Connection test successful', + connectionFailed: 'Connection test failed', + notSupported: 'Testing {provider} API connection is not supported', + invalidApiKey: 'Invalid or missing API key', + invalidBaseUrl: 'Invalid base URL configuration', + requestTimeout: 'Request timeout, please check network connection', + networkError: 'Network connection failed', + unauthorizedError: 'API key authorization failed', + forbiddenError: 'Access denied, please check API key permissions', + rateLimitError: 'Rate limit exceeded, please try again later', + serverError: 'Internal server error', + noDefaultModel: 'No default model available for {provider}', + invalidResponse: 'Invalid response format', + // UI text + showApiKey: 'Show API Key', + hideApiKey: 'Hide API Key', + testConnectionTooltip: 'Test API connection', + testing: 'Testing', + success: 'Success', + failed: 'Failed', + test: 'Test', + }, }, // Model Parameters Section diff --git a/src/lang/locale/zh-cn.ts b/src/lang/locale/zh-cn.ts index e870775..cb7dfa3 100644 --- a/src/lang/locale/zh-cn.ts +++ b/src/lang/locale/zh-cn.ts @@ -240,6 +240,31 @@ export default { searchOrEnterModelName: '搜索或输入模型名称...', enterCustomModelName: '输入自定义模型名称', custom: '自定义: ', + testConnection: { + testApiConnection: '测试 API 连接', + testingConnection: '正在测试连接...', + connectionSuccess: '连接测试成功', + connectionFailed: '连接测试失败', + notSupported: '不支持测试 {provider} 的 API 连接', + invalidApiKey: 'API Key 无效或缺失', + invalidBaseUrl: '基础 URL 设置错误', + requestTimeout: '请求超时,请检查网络连接', + networkError: '网络连接失败', + unauthorizedError: 'API Key 授权失败', + forbiddenError: '访问被拒绝,请检查 API Key 权限', + rateLimitError: '请求频率过高,请稍后重试', + serverError: '服务器内部错误', + noDefaultModel: '{provider} 没有可用的默认模型', + invalidResponse: '响应格式无效', + // UI 文本 + showApiKey: '显示 API Key', + hideApiKey: '隐藏 API Key', + testConnectionTooltip: '测试 API 连接', + testing: '测试中', + success: '成功', + failed: '失败', + test: '测试', + }, }, // 模型参数部分 diff --git a/src/settings/components/FormComponents.tsx b/src/settings/components/FormComponents.tsx index 8a9ef77..a49c41d 100644 --- a/src/settings/components/FormComponents.tsx +++ b/src/settings/components/FormComponents.tsx @@ -1,5 +1,7 @@ import React, { useEffect, useState } from "react"; +import { t } from '../../lang/helpers'; + export type DropdownComponentProps = { name: string; description?: string; @@ -310,7 +312,7 @@ export const ApiKeyComponent: React.FC = ({ type="button" className="infio-api-key-toggle" onClick={toggleVisibility} - title={isVisible ? "隐藏API Key" : "显示API Key"} + title={isVisible ? t("settings.ModelProvider.testConnection.hideApiKey") : t("settings.ModelProvider.testConnection.showApiKey")} > {isVisible ? ( @@ -332,19 +334,19 @@ export const ApiKeyComponent: React.FC = ({ className={`infio-api-key-test ${isTestingConnection ? 'testing' : ''} ${testResult ? testResult : ''}`} onClick={handleTest} disabled={isTestingConnection || !localValue.trim()} - title="测试API连通性" + title={t("settings.ModelProvider.testConnection.testConnectionTooltip")} > {isTestingConnection ? ( <>
- 测试中 + {t("settings.ModelProvider.testConnection.testing")} ) : testResult === 'success' ? ( <> - 成功 + {t("settings.ModelProvider.testConnection.success")} ) : testResult === 'error' ? ( <> @@ -353,7 +355,7 @@ export const ApiKeyComponent: React.FC = ({ - 失败 + {t("settings.ModelProvider.testConnection.failed")} ) : ( <> @@ -362,7 +364,7 @@ export const ApiKeyComponent: React.FC = ({ - 测试 + {t("settings.ModelProvider.testConnection.test")} )} diff --git a/src/settings/components/ModelProviderSettings.tsx b/src/settings/components/ModelProviderSettings.tsx index 704998f..fe526e9 100644 --- a/src/settings/components/ModelProviderSettings.tsx +++ b/src/settings/components/ModelProviderSettings.tsx @@ -181,7 +181,7 @@ const CustomProviderSettings: React.FC = ({ plugin, // 对于Ollama和OpenAICompatible,不支持测试API连接 if (provider === ApiProvider.Ollama || provider === ApiProvider.OpenAICompatible) { - throw new Error(`不支持测试 ${provider} 的API连接`); + throw new Error(t("settings.ModelProvider.testConnection.notSupported", { provider })); } // 创建LLM管理器实例 @@ -193,7 +193,7 @@ const CustomProviderSettings: React.FC = ({ plugin, // 对于没有默认模型的提供商,使用通用的测试模型 if (!testModelId) { - throw new Error(`No default chat model available for ${provider}`); + throw new Error(t("settings.ModelProvider.testConnection.noDefaultModel", { provider })); } // 构造测试模型对象 @@ -235,7 +235,7 @@ const CustomProviderSettings: React.FC = ({ plugin, // ApiKeyComponent expects no return value on success, just no thrown error return; } else { - throw new Error('Invalid response format'); + throw new Error(t("settings.ModelProvider.testConnection.invalidResponse")); } } catch (apiError) { clearTimeout(timeoutId); @@ -246,26 +246,33 @@ const CustomProviderSettings: React.FC = ({ plugin, console.error(`❌ ${provider} connection test failed:`, error); // 根据错误类型提供更具体的错误信息 - let errorMessage = '连接测试失败'; + let errorMessage = t("settings.ModelProvider.testConnection.connectionFailed"); if (error.message?.includes('API key')) { - errorMessage = 'API Key 无效或缺失'; + errorMessage = t("settings.ModelProvider.testConnection.invalidApiKey"); } else if (error.message?.includes('base URL') || error.message?.includes('baseURL')) { - errorMessage = '基础URL设置错误'; + errorMessage = t("settings.ModelProvider.testConnection.invalidBaseUrl"); } else if (error.message?.includes('timeout') || error.name === 'AbortError') { - errorMessage = '请求超时,请检查网络连接'; + errorMessage = t("settings.ModelProvider.testConnection.requestTimeout"); } else if (error.message?.includes('fetch')) { - errorMessage = '网络连接失败'; + errorMessage = t("settings.ModelProvider.testConnection.networkError"); } else if (error.message?.includes('401')) { - errorMessage = 'API Key 授权失败'; + errorMessage = t("settings.ModelProvider.testConnection.unauthorizedError"); } else if (error.message?.includes('403')) { - errorMessage = '访问被拒绝,请检查API Key权限'; + errorMessage = t("settings.ModelProvider.testConnection.forbiddenError"); } else if (error.message?.includes('429')) { - errorMessage = '请求频率过高,请稍后重试'; + errorMessage = t("settings.ModelProvider.testConnection.rateLimitError"); } else if (error.message?.includes('500')) { - errorMessage = '服务器内部错误'; + errorMessage = t("settings.ModelProvider.testConnection.serverError"); } else if (error.message) { - errorMessage = error.message; + // 如果错误消息本身已经是翻译过的(比如不支持的提供商),直接使用 + if (error.message.includes(t("settings.ModelProvider.testConnection.notSupported", { provider: '' }).slice(0, 10))) { + errorMessage = error.message; + } else if (error.message.includes(t("settings.ModelProvider.testConnection.noDefaultModel", { provider: '' }).slice(0, 10))) { + errorMessage = error.message; + } else { + errorMessage = error.message; + } } alert(errorMessage); // 必须抛出错误,这样ApiKeyComponent才能正确显示失败状态