i18n: complete internationalization for v3.8+ features

- Add health status translations (operational, degraded, failed, circuitOpen)
- Add proxy panel translations (serviceAddress, stats, stopped state)
- Add usage filter translations (appType, statusCode, searchPlaceholder)
- Add providerIcon click hints (clickToChange, clickToSelect)
- Add config load error translations for main.tsx
- Complete Japanese proxy section (failoverQueue, autoFailover)
- Fix date/time locale in usage charts and tables
- Use t() function in all hardcoded UI strings
This commit is contained in:
Jason
2025-12-20 21:38:37 +08:00
parent ec649e7718
commit 2fb3b5405a
17 changed files with 373 additions and 82 deletions
+48 -3
View File
@@ -378,7 +378,19 @@
"daysAgo": "{{count}} day ago",
"multiplePlans": "{{count}} plans",
"expand": "Expand",
"collapse": "Collapse"
"collapse": "Collapse",
"modelIdPlaceholder": "e.g., claude-3-5-sonnet-20241022",
"displayNamePlaceholder": "e.g., Claude 3.5 Sonnet",
"appType": "App Type",
"allApps": "All Apps",
"statusCode": "Status Code",
"searchProviderPlaceholder": "Search provider...",
"searchModelPlaceholder": "Search model...",
"timeRange": "Time Range",
"input": "Input",
"output": "Output",
"cacheWrite": "Write",
"cacheRead": "Read"
},
"usageScript": {
"title": "Configure Usage Query",
@@ -448,7 +460,9 @@
"tip3": "• Entire config must be wrapped in () to form object literal expression"
},
"errors": {
"usage_query_failed": "Usage query failed"
"usage_query_failed": "Usage query failed",
"configLoadFailedTitle": "Configuration Load Failed",
"configLoadFailedMessage": "Unable to read configuration file:\n{{path}}\n\nError details:\n{{detail}}\n\nPlease check if the JSON is valid, or restore from a backup file (e.g., config.json.bak) in the same directory.\n\nThe app will exit so you can fix this."
},
"presetSelector": {
"title": "Select Configuration Type",
@@ -847,7 +861,9 @@
"label": "Icon",
"colorLabel": "Icon Color",
"selectIcon": "Select Icon",
"preview": "Preview"
"preview": "Preview",
"clickToChange": "Click to change icon",
"clickToSelect": "Click to select icon"
},
"migration": {
"success": "Configuration migrated successfully"
@@ -855,7 +871,36 @@
"agents": {
"title": "Agents"
},
"health": {
"operational": "Operational",
"degraded": "Degraded",
"failed": "Failed",
"circuitOpen": "Circuit Open",
"consecutiveFailures": "{{count}} consecutive failures"
},
"proxy": {
"panel": {
"serviceAddress": "Service Address",
"addressCopied": "Address copied",
"currentProvider": "Current Provider:",
"waitingFirstRequest": "Current Provider: Waiting for first request...",
"stoppedTitle": "Proxy Service Stopped",
"stoppedDescription": "Use the toggle in the top right to start the service",
"openSettings": "Configure Proxy Service",
"stats": {
"activeConnections": "Active Connections",
"totalRequests": "Total Requests",
"successRate": "Success Rate",
"uptime": "Uptime"
}
},
"settings": {
"toast": {
"saved": "Proxy configuration saved",
"saveFailed": "Save failed: {{error}}"
}
},
"switchFailed": "Switch failed: {{error}}",
"failoverQueue": {
"title": "Failover Queue",
"description": "Manage failover order for each app's providers",
+93 -3
View File
@@ -378,7 +378,19 @@
"daysAgo": "{{count}} 日前",
"multiplePlans": "{{count}} プラン",
"expand": "展開",
"collapse": "折りたたむ"
"collapse": "折りたたむ",
"modelIdPlaceholder": "例: claude-3-5-sonnet-20241022",
"displayNamePlaceholder": "例: Claude 3.5 Sonnet",
"appType": "アプリ種別",
"allApps": "すべてのアプリ",
"statusCode": "ステータスコード",
"searchProviderPlaceholder": "プロバイダーを検索...",
"searchModelPlaceholder": "モデルを検索...",
"timeRange": "期間",
"input": "Input",
"output": "Output",
"cacheWrite": "Write",
"cacheRead": "Read"
},
"usageScript": {
"title": "利用状況を設定",
@@ -448,7 +460,9 @@
"tip3": "• 全体を () で囲み、オブジェクトリテラル式にしてください"
},
"errors": {
"usage_query_failed": "利用状況の取得に失敗しました"
"usage_query_failed": "利用状況の取得に失敗しました",
"configLoadFailedTitle": "設定の読み込みに失敗しました",
"configLoadFailedMessage": "設定ファイルを読み込めません:\n{{path}}\n\nエラー詳細:\n{{detail}}\n\nJSON が正しいか確認するか、同じディレクトリのバックアップファイル(config.json.bak など)から復元してください。\n\nアプリを終了して修正してください。"
},
"presetSelector": {
"title": "設定タイプを選択",
@@ -847,12 +861,88 @@
"label": "アイコン",
"colorLabel": "アイコンカラー",
"selectIcon": "アイコンを選択",
"preview": "プレビュー"
"preview": "プレビュー",
"clickToChange": "クリックでアイコンを変更",
"clickToSelect": "クリックでアイコンを選択"
},
"migration": {
"success": "設定の移行が完了しました"
},
"agents": {
"title": "エージェント"
},
"health": {
"operational": "正常",
"degraded": "低下",
"failed": "失敗",
"circuitOpen": "サーキットオープン",
"consecutiveFailures": "{{count}} 回連続失敗"
},
"proxy": {
"panel": {
"serviceAddress": "サービスアドレス",
"addressCopied": "アドレスをコピーしました",
"currentProvider": "現在のプロバイダー:",
"waitingFirstRequest": "現在のプロバイダー: 最初のリクエスト待ち...",
"stoppedTitle": "プロキシサービス停止中",
"stoppedDescription": "右上のトグルでサービスを開始できます",
"openSettings": "プロキシサービスを設定",
"stats": {
"activeConnections": "アクティブ接続",
"totalRequests": "総リクエスト数",
"successRate": "成功率",
"uptime": "稼働時間"
}
},
"settings": {
"toast": {
"saved": "プロキシ設定を保存しました",
"saveFailed": "保存に失敗しました: {{error}}"
}
},
"switchFailed": "切り替えに失敗しました: {{error}}",
"failoverQueue": {
"title": "フェイルオーバーキュー",
"description": "各アプリのプロバイダーのフェイルオーバー順序を管理します",
"info": "現在アクティブなプロバイダーが常に優先されます。リクエストが失敗すると、システムはキュー順に他のプロバイダーを試行します。",
"selectProvider": "キューに追加するプロバイダーを選択",
"noAvailableProviders": "追加できるプロバイダーがありません",
"empty": "フェイルオーバーキューが空です。自動フェイルオーバーを有効にするにはプロバイダーを追加してください。",
"dragHint": "ドラッグでフェイルオーバー順序を調整します。番号が小さいほど優先度が高くなります。",
"toggleEnabled": "有効/無効",
"addSuccess": "フェイルオーバーキューに追加しました",
"addFailed": "追加に失敗しました",
"removeSuccess": "フェイルオーバーキューから削除しました",
"removeFailed": "削除に失敗しました",
"reorderSuccess": "キュー順序を更新しました",
"reorderFailed": "順序の更新に失敗しました",
"toggleFailed": "状態の更新に失敗しました"
},
"autoFailover": {
"info": "フェイルオーバーキューに複数のプロバイダーが設定されている場合、リクエストが失敗すると優先度順に試行します。プロバイダーが連続失敗のしきい値に達すると、サーキットブレーカーが開き、一時的にスキップされます。",
"configSaved": "自動フェイルオーバー設定を保存しました",
"configSaveFailed": "保存に失敗しました",
"retrySettings": "リトライとタイムアウト設定",
"failureThreshold": "失敗しきい値",
"failureThresholdHint": "この回数連続で失敗するとサーキットブレーカーが開きます(推奨: 3-10)",
"timeout": "回復待ち時間(秒)",
"timeoutHint": "サーキットが開いた後、回復を試みるまでの待ち時間(推奨: 30-120)",
"circuitBreakerSettings": "サーキットブレーカー詳細設定",
"successThreshold": "回復成功しきい値",
"successThresholdHint": "半開状態でこの回数成功するとサーキットブレーカーが閉じます",
"errorRate": "エラー率しきい値 (%)",
"errorRateHint": "この値を超えるとサーキットブレーカーが開きます",
"minRequests": "最小リクエスト数",
"minRequestsHint": "エラー率を計算する前の最小リクエスト数",
"explanationTitle": "仕組み",
"failureThresholdLabel": "失敗しきい値",
"failureThresholdExplain": "この回数連続で失敗すると、サーキットブレーカーが開き、プロバイダーは一時的に利用不可になります",
"timeoutLabel": "回復待ち時間",
"timeoutExplain": "サーキットが開いた後、半開状態を試みるまでの待ち時間",
"successThresholdLabel": "回復成功しきい値",
"successThresholdExplain": "半開状態でこの回数成功するとサーキットブレーカーが閉じ、プロバイダーが再び利用可能になります",
"errorRateLabel": "エラー率しきい値",
"errorRateExplain": "失敗しきい値に達していなくても、エラー率がこの値を超えるとサーキットブレーカーが開きます"
}
}
}
+48 -3
View File
@@ -378,7 +378,19 @@
"daysAgo": "{{count}} 天前",
"multiplePlans": "{{count}} 个套餐",
"expand": "展开",
"collapse": "收起"
"collapse": "收起",
"modelIdPlaceholder": "例如: claude-3-5-sonnet-20241022",
"displayNamePlaceholder": "例如: Claude 3.5 Sonnet",
"appType": "应用类型",
"allApps": "全部应用",
"statusCode": "状态码",
"searchProviderPlaceholder": "搜索供应商...",
"searchModelPlaceholder": "搜索模型...",
"timeRange": "时间范围",
"input": "Input",
"output": "Output",
"cacheWrite": "Write",
"cacheRead": "Read"
},
"usageScript": {
"title": "配置用量查询",
@@ -448,7 +460,9 @@
"tip3": "• 整个配置必须用 () 包裹,形成对象字面量表达式"
},
"errors": {
"usage_query_failed": "用量查询失败"
"usage_query_failed": "用量查询失败",
"configLoadFailedTitle": "配置加载失败",
"configLoadFailedMessage": "无法读取配置文件:\n{{path}}\n\n错误详情:\n{{detail}}\n\n请手动检查 JSON 是否有效,或从同目录的备份文件(如 config.json.bak)恢复。\n\n应用将退出以便您进行修复。"
},
"presetSelector": {
"title": "选择配置类型",
@@ -847,7 +861,9 @@
"label": "图标",
"colorLabel": "图标颜色",
"selectIcon": "选择图标",
"preview": "预览"
"preview": "预览",
"clickToChange": "点击更换图标",
"clickToSelect": "点击选择图标"
},
"migration": {
"success": "配置迁移成功"
@@ -855,7 +871,36 @@
"agents": {
"title": "智能体"
},
"health": {
"operational": "正常",
"degraded": "降级",
"failed": "失败",
"circuitOpen": "熔断",
"consecutiveFailures": "连续失败 {{count}} 次"
},
"proxy": {
"panel": {
"serviceAddress": "服务地址",
"addressCopied": "地址已复制",
"currentProvider": "当前 Provider",
"waitingFirstRequest": "当前 Provider:等待首次请求…",
"stoppedTitle": "代理服务已停止",
"stoppedDescription": "使用右上角开关即可启动服务",
"openSettings": "配置代理服务",
"stats": {
"activeConnections": "活跃连接",
"totalRequests": "总请求数",
"successRate": "成功率",
"uptime": "运行时间"
}
},
"settings": {
"toast": {
"saved": "代理配置已保存",
"saveFailed": "保存失败: {{error}}"
}
},
"switchFailed": "切换失败: {{error}}",
"failoverQueue": {
"title": "故障转移队列",
"description": "管理各应用的供应商故障转移顺序",