diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index 499299981..bfc1aaa76 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -172,7 +172,8 @@ "oauthHint": "Google official uses OAuth personal authentication, no need to fill in API Key. The browser will automatically open for login on first use.", "apiKeyPlaceholder": "Enter Gemini API Key" } - } + }, + "duplicateLiveIdsLoadFailed": "Failed to read provider identifiers from config, please fix the config and try again" }, "claudeCode": { "needsRouting": "Needs Routing", @@ -221,7 +222,8 @@ "tooltip": { "active": "Claude Desktop local routing is running - {{address}}:{{port}}", "inactive": "Turn on Claude Desktop local routing for providers that need model mapping or format conversion. Configured address: {{address}}:{{port}}" - } + }, + "stopBlockedByTakeover": "Another app is using proxy takeover. Please disable that app's takeover in settings before stopping local routing." } }, "notifications": { @@ -270,7 +272,8 @@ "backfillWarning": "Switched successfully, but failed to save changes back to the previous provider", "windowControlFailed": "Window control failed: {{error}}", "officialBlockedByProxy": "Cannot switch to official provider while local routing is active. Using routing with official APIs may cause account bans.", - "proxyOfficialWarning": "Current provider {{name}} is official. Consider switching to a third-party provider before using local routing." + "proxyOfficialWarning": "Current provider {{name}} is official. Consider switching to a third-party provider before using local routing.", + "proxyReasonClaudeDesktop": "Using Claude Desktop local routing mode" }, "confirm": { "deleteProvider": "Delete Provider", @@ -1168,7 +1171,8 @@ "fetchModelsAuthFailed": "API Key is invalid or lacks permission", "fetchModelsNotSupported": "This provider does not support fetching model list", "fetchModelsEndpointNotFound": "No reachable models endpoint found. Please check the Base URL or confirm whether the provider exposes this API.", - "fetchModelsTimeout": "Request timed out, please check network connection" + "fetchModelsTimeout": "Request timed out, please check network connection", + "requiredFields": "Please fill in provider name, API endpoint, API Key and model" }, "copilot": { "authSection": "GitHub Copilot Authentication", @@ -1365,7 +1369,8 @@ "reasoningEffortHint": "Enable when the upstream supports thinking-depth control such as low/high/max. Enabling this also turns on thinking mode and converts Codex's reasoning.effort into the upstream Chat parameter.", "reasoningGroupTitle": "Reasoning Capability", "reasoningSectionHint": "Preset providers are configured automatically; custom providers are inferred from name/URL. Override manually only when auto-detection is wrong.", - "advancedSectionHint": "Includes upstream format, model mapping, reasoning overrides and custom User-Agent. Providers using the Chat Completions protocol require routing takeover to be enabled." + "advancedSectionHint": "Includes upstream format, model mapping, reasoning overrides and custom User-Agent. Providers using the Chat Completions protocol require routing takeover to be enabled.", + "noCommonConfigToApply": "The common config snippet is empty or contains nothing to write" }, "geminiConfig": { "envFile": "Environment Variables (.env)", @@ -1464,6 +1469,7 @@ "totalRequests": "Total Requests", "totalCost": "Total Cost", "cost": "Cost", + "unpriced": "Unpriced", "perMillion": "(per million)", "trends": "Usage Trends", "rangeToday": "Last 24 hours (hourly)", @@ -2549,7 +2555,8 @@ }, "tooltip": { "enabled": "{{app}} failover enabled\nRequests follow queue priority (P1→P2→...)", - "disabled": "Enable {{app}} failover\nSwitches to queue P1 immediately, then falls back on failures" + "disabled": "Enable {{app}} failover\nSwitches to queue P1 immediately, then falls back on failures", + "takeoverRequired": "Take over {{app}} first, then enable failover" } }, "proxy": { @@ -2727,7 +2734,9 @@ }, "server": { "started": "Routing service started - {{address}}:{{port}}", - "startFailed": "Failed to start routing service: {{detail}}" + "startFailed": "Failed to start routing service: {{detail}}", + "stopped": "Routing service stopped", + "stopFailed": "Failed to stop routing service: {{detail}}" }, "stoppedWithRestore": "Routing service stopped, all routing configs restored", "stopWithRestoreFailed": "Stop failed: {{detail}}" diff --git a/src/i18n/locales/ja.json b/src/i18n/locales/ja.json index 8651cd053..377275154 100644 --- a/src/i18n/locales/ja.json +++ b/src/i18n/locales/ja.json @@ -172,7 +172,8 @@ "oauthHint": "Google 公式は OAuth 個人認証を使用するため API Key は不要です。初回利用時にブラウザが開きます。", "apiKeyPlaceholder": "Gemini API Key を入力" } - } + }, + "duplicateLiveIdsLoadFailed": "設定内のプロバイダー識別子を読み込めませんでした。設定を修正してから再度お試しください" }, "claudeCode": { "needsRouting": "ルーティングが必要", @@ -221,7 +222,8 @@ "tooltip": { "active": "Claude Desktop ローカルルーティングは起動中です - {{address}}:{{port}}", "inactive": "モデルマッピングや形式変換が必要なプロバイダー向けに Claude Desktop ローカルルーティングを起動します。設定アドレス: {{address}}:{{port}}" - } + }, + "stopBlockedByTakeover": "別のアプリがプロキシテイクオーバーを使用しています。設定で該当アプリのテイクオーバーを無効にしてから、ローカルルーティングを停止してください。" } }, "notifications": { @@ -270,7 +272,8 @@ "backfillWarning": "切り替え成功しましたが、前のプロバイダーへの設定保存に失敗しました", "windowControlFailed": "ウィンドウ操作に失敗しました: {{error}}", "officialBlockedByProxy": "ローカルルーティングモード中は公式プロバイダーに切り替えできません。ルーティング経由で公式 API にアクセスするとアカウントが停止される可能性があります。", - "proxyOfficialWarning": "現在のプロバイダー {{name}} は公式です。ローカルルーティングを使用する前にサードパーティプロバイダーに切り替えてください。" + "proxyOfficialWarning": "現在のプロバイダー {{name}} は公式です。ローカルルーティングを使用する前にサードパーティプロバイダーに切り替えてください。", + "proxyReasonClaudeDesktop": "Claude Desktop ローカルルーティングモードを使用中" }, "confirm": { "deleteProvider": "プロバイダーを削除", @@ -1168,7 +1171,8 @@ "fetchModelsAuthFailed": "API Key が無効か、権限がありません", "fetchModelsNotSupported": "このプロバイダーはモデル一覧の取得に対応していません", "fetchModelsEndpointNotFound": "利用可能なモデル一覧エンドポイントが見つかりません。Base URL を確認するか、プロバイダーが該当 API を公開しているかご確認ください", - "fetchModelsTimeout": "リクエストがタイムアウトしました。ネットワーク接続を確認してください" + "fetchModelsTimeout": "リクエストがタイムアウトしました。ネットワーク接続を確認してください", + "requiredFields": "プロバイダー名、API エンドポイント、API Key、モデルを入力してください" }, "copilot": { "authSection": "GitHub Copilot 認証", @@ -1365,7 +1369,8 @@ "reasoningEffortHint": "上流が low/high/max などの思考の深さの制御に対応している場合に有効化します。有効にすると思考モードも自動的にオンになり、Codex の reasoning.effort を上流の Chat パラメータに変換します。", "reasoningGroupTitle": "思考能力", "reasoningSectionHint": "プリセットの供給元は自動的に設定され、カスタム供給元は名前/URL から自動推論されます。自動識別が正しくない場合のみ手動で上書きしてください。", - "advancedSectionHint": "上流フォーマット、モデルマッピング、思考能力、カスタム User-Agent の設定を含みます。Chat Completions プロトコルを使用するプロバイダーはルーティング引き継ぎの有効化が必要です。" + "advancedSectionHint": "上流フォーマット、モデルマッピング、思考能力、カスタム User-Agent の設定を含みます。Chat Completions プロトコルを使用するプロバイダーはルーティング引き継ぎの有効化が必要です。", + "noCommonConfigToApply": "共通設定スニペットが空か、書き込む内容がありません" }, "geminiConfig": { "envFile": "環境変数 (.env)", @@ -1464,6 +1469,7 @@ "totalRequests": "総リクエスト数", "totalCost": "総コスト", "cost": "コスト", + "unpriced": "価格未設定", "perMillion": "(100万あたり)", "trends": "利用トレンド", "rangeToday": "直近24時間 (時間別)", @@ -2549,7 +2555,8 @@ }, "tooltip": { "enabled": "{{app}} フェイルオーバーが有効\nキューの優先度(P1→P2→...)で使用します", - "disabled": "{{app}} フェイルオーバーを有効にする\nキューの P1 に即時切替し、失敗時は次を順に試行します" + "disabled": "{{app}} フェイルオーバーを有効にする\nキューの P1 に即時切替し、失敗時は次を順に試行します", + "takeoverRequired": "先に {{app}} を引き継いでから、フェイルオーバーを有効にしてください" } }, "proxy": { @@ -2727,7 +2734,9 @@ }, "server": { "started": "ルーティングサービスが開始されました - {{address}}:{{port}}", - "startFailed": "ルーティングサービスの開始に失敗しました: {{detail}}" + "startFailed": "ルーティングサービスの開始に失敗しました: {{detail}}", + "stopped": "ルーティングサービスが停止しました", + "stopFailed": "ルーティングサービスの停止に失敗しました: {{detail}}" }, "stoppedWithRestore": "ルーティングサービスが停止し、すべてのルーティング設定が復元されました", "stopWithRestoreFailed": "停止に失敗しました: {{detail}}" diff --git a/src/i18n/locales/zh-TW.json b/src/i18n/locales/zh-TW.json index c64686b44..535bcdc98 100644 --- a/src/i18n/locales/zh-TW.json +++ b/src/i18n/locales/zh-TW.json @@ -172,7 +172,8 @@ "oauthHint": "Google 官方使用 OAuth 個人驗證,無需填寫 API Key。首次使用時會自動開啟瀏覽器進行登入。", "apiKeyPlaceholder": "請輸入 Gemini API Key" } - } + }, + "duplicateLiveIdsLoadFailed": "讀取設定中的供應商識別碼失敗,請先修復設定後再試" }, "claudeCode": { "needsRouting": "需要路由", @@ -221,7 +222,8 @@ "tooltip": { "active": "Claude Desktop 本地路由已開啟 - {{address}}:{{port}}", "inactive": "開啟 Claude Desktop 本地路由,用於需要模型對應或格式轉換的供應商。目前設定位址:{{address}}:{{port}}" - } + }, + "stopBlockedByTakeover": "其他應用正在使用代理接管。請先在設定中關閉對應應用接管,再停止本機路由。" } }, "notifications": { @@ -270,7 +272,8 @@ "backfillWarning": "切換成功,但舊供應商設定回填失敗,您手動修改的設定可能未儲存", "windowControlFailed": "視窗控制失敗:{{error}}", "officialBlockedByProxy": "本地路由模式下不能切換至官方供應商,使用路由存取官方 API 可能導致帳號被封鎖", - "proxyOfficialWarning": "目前供應商 {{name}} 是官方供應商,建議切換至第三方供應商後再使用本地路由" + "proxyOfficialWarning": "目前供應商 {{name}} 是官方供應商,建議切換至第三方供應商後再使用本地路由", + "proxyReasonClaudeDesktop": "使用 Claude Desktop 本機路由模式" }, "confirm": { "deleteProvider": "刪除供應商", @@ -1169,7 +1172,8 @@ "fetchModelsAuthFailed": "API Key 無效或無權限", "fetchModelsNotSupported": "該供應商不支援取得模型清單", "fetchModelsEndpointNotFound": "未找到可用的模型清單端點,請檢查 Base URL 或確認供應商是否開放該 API", - "fetchModelsTimeout": "請求逾時,請檢查網路連線" + "fetchModelsTimeout": "請求逾時,請檢查網路連線", + "requiredFields": "請填寫供應商名稱、API 位址、API Key 和模型" }, "copilot": { "authSection": "GitHub Copilot 驗證", @@ -1366,7 +1370,8 @@ "reasoningEffortHint": "上游支援 low/high/max 等思考深度控制時啟用。啟用後會自動啟用思考模式,並把 Codex 的 reasoning.effort 轉成上游 Chat 參數。", "reasoningGroupTitle": "思考能力", "reasoningSectionHint": "預設供應商已自動設定;自訂供應商會按名稱/位址自動推斷。僅當自動識別不準時才需手動覆寫。", - "advancedSectionHint": "包含上游格式、模型映射、思考能力與自訂 User-Agent。使用 Chat Completions 協定的供應商需開啟路由接管才能使用。" + "advancedSectionHint": "包含上游格式、模型映射、思考能力與自訂 User-Agent。使用 Chat Completions 協定的供應商需開啟路由接管才能使用。", + "noCommonConfigToApply": "通用設定片段為空或沒有可寫入的內容" }, "geminiConfig": { "envFile": "環境變數 (.env)", @@ -1465,6 +1470,7 @@ "totalRequests": "總請求數", "totalCost": "總成本", "cost": "成本", + "unpriced": "未定價", "perMillion": "(每百萬)", "trends": "使用趨勢", "rangeToday": "過去 24 小時 (按小時)", @@ -2550,7 +2556,8 @@ }, "tooltip": { "enabled": "{{app}} 故障轉移已啟用\n按佇列優先順序(P1→P2→...)選擇供應商", - "disabled": "啟用 {{app}} 故障轉移\n將立即切換至佇列 P1,並在失敗時自動切換至下一個" + "disabled": "啟用 {{app}} 故障轉移\n將立即切換至佇列 P1,並在失敗時自動切換至下一個", + "takeoverRequired": "請先接管 {{app}},再啟用故障轉移" } }, "proxy": { @@ -2728,7 +2735,9 @@ }, "server": { "started": "路由服務已啟動 - {{address}}:{{port}}", - "startFailed": "啟動路由服務失敗:{{detail}}" + "startFailed": "啟動路由服務失敗:{{detail}}", + "stopped": "路由服務已停止", + "stopFailed": "停止路由服務失敗:{{detail}}" }, "stoppedWithRestore": "路由服務已關閉,已還原所有路由設定", "stopWithRestoreFailed": "停止失敗:{{detail}}" diff --git a/src/i18n/locales/zh.json b/src/i18n/locales/zh.json index 5af4d6a15..d56a37d1e 100644 --- a/src/i18n/locales/zh.json +++ b/src/i18n/locales/zh.json @@ -172,7 +172,8 @@ "oauthHint": "Google 官方使用 OAuth 个人认证,无需填写 API Key。首次使用时会自动打开浏览器进行登录。", "apiKeyPlaceholder": "请输入 Gemini API Key" } - } + }, + "duplicateLiveIdsLoadFailed": "读取配置中的供应商标识失败,请先修复配置后再试" }, "claudeCode": { "needsRouting": "需要路由", @@ -221,7 +222,8 @@ "tooltip": { "active": "Claude Desktop 本地路由已开启 - {{address}}:{{port}}", "inactive": "开启 Claude Desktop 本地路由,用于需要模型映射或格式转换的供应商。当前配置地址:{{address}}:{{port}}" - } + }, + "stopBlockedByTakeover": "其它应用正在使用代理接管。请先在设置中关闭对应应用接管,再停止本地路由。" } }, "notifications": { @@ -270,7 +272,8 @@ "backfillWarning": "切换成功,但旧供应商配置回填失败,您手动修改的配置可能未保存", "windowControlFailed": "窗口控制失败:{{error}}", "officialBlockedByProxy": "本地路由模式下不能切换到官方供应商,使用路由访问官方 API 可能导致账号被封禁", - "proxyOfficialWarning": "当前供应商 {{name}} 是官方供应商,建议切换到第三方供应商后再使用本地路由" + "proxyOfficialWarning": "当前供应商 {{name}} 是官方供应商,建议切换到第三方供应商后再使用本地路由", + "proxyReasonClaudeDesktop": "使用 Claude Desktop 本地路由模式" }, "confirm": { "deleteProvider": "删除供应商", @@ -1168,7 +1171,8 @@ "fetchModelsAuthFailed": "API Key 无效或无权限", "fetchModelsNotSupported": "该供应商不支持获取模型列表", "fetchModelsEndpointNotFound": "未找到可用的模型列表端点,请检查 Base URL 或确认供应商是否开放该接口", - "fetchModelsTimeout": "请求超时,请检查网络连接" + "fetchModelsTimeout": "请求超时,请检查网络连接", + "requiredFields": "请填写供应商名称、API 地址、API Key 和模型" }, "copilot": { "authSection": "GitHub Copilot 认证", @@ -1365,7 +1369,8 @@ "reasoningEffortHint": "上游支持 low/high/max 等思考深度控制时启用。启用后会自动启用思考模式,并把 Codex 的 reasoning.effort 转成上游 Chat 参数。", "reasoningGroupTitle": "思考能力", "reasoningSectionHint": "预设供应商已自动配置;自定义供应商会按名称/地址自动推断。仅当自动识别不准时才需手动覆盖。", - "advancedSectionHint": "包含上游格式、模型映射、思考能力与自定义 User-Agent。使用 Chat Completions 协议的供应商需开启路由接管才能使用。" + "advancedSectionHint": "包含上游格式、模型映射、思考能力与自定义 User-Agent。使用 Chat Completions 协议的供应商需开启路由接管才能使用。", + "noCommonConfigToApply": "通用配置片段为空或没有可写入的内容" }, "geminiConfig": { "envFile": "环境变量 (.env)", @@ -1464,6 +1469,7 @@ "totalRequests": "总请求数", "totalCost": "总成本", "cost": "成本", + "unpriced": "未定价", "perMillion": "(每百万)", "trends": "使用趋势", "rangeToday": "过去 24 小时 (按小时)", @@ -2549,7 +2555,8 @@ }, "tooltip": { "enabled": "{{app}} 故障转移已启用\n按队列优先级(P1→P2→...)选择供应商", - "disabled": "启用 {{app}} 故障转移\n将立即切换到队列 P1,并在失败时自动切换到下一个" + "disabled": "启用 {{app}} 故障转移\n将立即切换到队列 P1,并在失败时自动切换到下一个", + "takeoverRequired": "请先接管 {{app}},再启用故障转移" } }, "proxy": { @@ -2727,7 +2734,9 @@ }, "server": { "started": "路由服务已启动 - {{address}}:{{port}}", - "startFailed": "启动路由服务失败: {{detail}}" + "startFailed": "启动路由服务失败: {{detail}}", + "stopped": "路由服务已停止", + "stopFailed": "停止路由服务失败:{{detail}}" }, "stoppedWithRestore": "路由服务已关闭,已恢复所有路由配置", "stopWithRestoreFailed": "停止失败: {{detail}}"