fix(i18n): add 9 missing translation keys to all locales (#5960)

* fix(i18n): add missing grokBuild translation keys to all locales

providerForm.requiredFields and failover.tooltip.takeoverRequired were
missing from all four locale files (en, zh, zh-TW, ja). The Grok Build
provider form validation toast and the failover tooltip fell back to
hardcoded Chinese defaultValue, which leaked simplified Chinese into
zh-TW and zh-Hant UI even though fallbackLng is set to en.

Add the two keys to every locale so each language shows its own
translation.

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(i18n): add 6 more missing translation keys to all locales

A broader scan found six more keys referenced in code with hardcoded
Chinese defaultValue but missing from all four locale files (en, zh,
zh-TW, ja):

- provider.duplicateLiveIdsLoadFailed (App.tsx provider duplicate toast)
- codexConfig.noCommonConfigToApply (useCodexCommonConfig snippet error)
- claudeDesktop.route.stopBlockedByTakeover (ClaudeDesktopRouteToggle warning)
- notifications.proxyReasonClaudeDesktop (useProviderActions proxy reason)
- proxy.server.stopped / proxy.server.stopFailed (useProxyStatus toasts)

Add proper per-language translations to all locales, matching the
existing sibling-key style (e.g. proxy.server.started/startFailed uses
the same {{detail}} interpolation).

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(i18n): add missing unpriced translations

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Jason <farion1231@gmail.com>
This commit is contained in:
mhy1227
2026-07-31 18:18:32 +08:00
committed by GitHub
parent 4bfb3fc30d
commit a354f08a3d
4 changed files with 64 additions and 28 deletions
+16 -7
View File
@@ -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}}"
+16 -7
View File
@@ -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}}"
+16 -7
View File
@@ -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}}"
+16 -7
View File
@@ -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}}"