feat(i18n): add multi-language support (ja/ko/vi/ru/zh-TW) with system auto-detection

- Extend AppLanguage to 7 locales: zh-CN, zh-TW, en, ja, ko, vi, ru
- Auto-detect system language via navigator.languages; fallback to English
- Add BCP47 locale mapping for date formatting and sorting
- Create 50 translation JSON files (5 languages × 10 namespaces, 1137 keys each)
- Update language selector with native language names
- Extend locale key parity test to cover all 7 languages (70 assertions)
- Add VNC/RDP desktop, serial terminal, AI agent, port forwarding, and SFTP features
- Add credential encryption, host metrics, session backup crypto, and zmodem bridge
- Update Rust backend: desktop services, host metrics, SSH/SFTP enhancements
This commit is contained in:
Logan.Li committed 2026-08-12 00:07:48 +08:00
1 parent fea6d8db04
commit b0d0e3a5f3
301 files changed
+28002 -2705

No files matched your search

+87
View File
@@ -0,0 +1,87 @@
{
"panel": {
"title": "Agent CLI",
"modelConfigured": "{{provider}} · {{model}}",
"modelNotConfigured": "モデルが未設定です",
"sshReady": "SSH · {{target}}",
"sshNotConnected": "リモート SSH に接続されていません",
"defaultTarget": "現在の SSH セッション",
"emptyHint": "運用タスクを記述して送信してください。同じスレッドで続行するか、+ をタップして新しいトピックを作成できます。",
"newTopic": "新しいトピック",
"close": "閉じる",
"thinking": "考え中…",
"conclusion": "結論",
"copy": "コピー",
"copied": "コピーしました",
"stop": "停止",
"send": "送信",
"placeholder": "タスクまたはフォローアップ… (Enter で送信 · Shift+Enter で改行)",
"hintFollowUp": "フォローアップにはこのスレッドのコンテキストが含まれます",
"hintSelection": "選択した {{lines}} 行を含めます",
"hintSteps": "最大 {{max}} ステップ · 何も保存しません",
"footerNote": "高リスクは確認が必要 · クリティカルはブロック · セッションは保存されません"
},
"safety": {
"aria": "エージェントの安全モード",
"strict": {
"label": "厳格",
"short": "中リスク以上を確認",
"description": "ファイル変更、権限編集、より高リスクなコマンドは確認が必要です。本番環境や不慣れなホストに最適です。"
},
"relaxed": {
"label": "緩和",
"short": "高リスクのみ確認",
"description": "読み取り専用や日常の編集は自動実行 · 削除、再起動、インストール等は確認が必要です。"
}
},
"risk": {
"safe": "安全",
"low": "低リスク",
"medium": "中リスク",
"high": "高リスク",
"critical": "ブロック"
},
"step": {
"round": "ステップ {{round}}",
"awaiting": "承認待ち",
"running": "実行中",
"done": "完了",
"confirmTitle": "ステップ {{round}} · {{risk}}",
"confirmMessage": "SSH · {{target}}\n{{mode}}\n\n$ {{command}}",
"rejected": "ステップ {{round}} のコマンドは拒否されました。",
"terminated": "終了しました",
"stoppedMessage": "停止しました。実行中のリモートコマンドに中断要求を送信しました。"
},
"confirm": {
"reject": "拒否",
"once": "1 回のみ",
"always": "常に",
"hint": "Enter · 1 回のみ Esc · 拒否 常に · このセッションで同種の確認をスキップ"
},
"error": {
"noProvider": "先に「設定 → AI」で AI プロバイダーを設定してください",
"noApiKey": "「{{provider}}」に保存された API キーはありません",
"emptyTask": "タスクまたはフォローアップを入力してください",
"sshRequired": "接続済みのリモート SSH セッションが必要です",
"modelEmpty": "モデルがコンテンツを返しませんでした",
"protocolFailed": "モデルがツールプロトコルに 2 回失敗しました · 停止",
"noConclusion": "モデルが利用可能な結論を返しませんでした",
"multipleCommands": "モデルが複数のコマンドを返しました · 実行を拒否",
"invalidCommand": "モデルが単一行のコマンドを返しませんでした · 実行を拒否",
"repeatLoop": "繰り返しのコマンドループを検出 · 停止: {{command}}",
"criticalBlocked": "コマンドが破壊的なハードブロックに該当 · 上書き不可: {{command}}",
"execFailed": "ssh-exec 失敗: {{error}}",
"execUnknown": "不明なエラー",
"execNoOutput": "コマンドは出力なしで完了",
"maxSteps": "{{max}} ステップの上限に達しました · 範囲を絞って再試行してください"
},
"output": {
"empty": "(出力なし)",
"truncatedMiddle": "... [{{count}} 行省略] ...",
"totalLines": "合計行数: {{count}}{{truncatedSuffix}}",
"truncatedSuffix": " (先頭/末尾を保持)",
"errorLines": "エラー/警告の可能性がある行 ({{count}}):\n{{lines}}",
"noErrorKeywords": "明らかなエラーキーワードは見つかりませんでした",
"snippetLabel": "出力スニペット:\n{{snippet}}"
}
}