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

+119
View File
@@ -0,0 +1,119 @@
{
"toolbar": {
"splitHorizontal": "左右に分割",
"splitVertical": "上下に分割",
"addPane": "ペインを追加",
"closePane": "現在のペインを閉じる",
"maximizePane": "現在のペインを最大化",
"restoreLayout": "分割レイアウトを復元",
"broadcast": "ブロードキャスト",
"broadcastAria": "入力をブロードキャスト",
"broadcastOn": "ブロードキャスト中: スコープ内の {{count}} ターミナルへ入力を同期",
"broadcastOffPro": "入力をブロードキャスト (Pro) · スコープ内の {{count}} ターミナル",
"broadcastNeedPanesTab": "このタブはブロードキャストに最低 2 つの準備完了ペインが必要です (先に分割してください)",
"broadcastNeedPanesAll": "全ターミナルタブがブロードキャストに最低 2 つの準備完了ターミナルを必要とします",
"broadcastScopeAria": "ブロードキャストのスコープ",
"broadcastScopeTab": "現在のタブのペイン",
"broadcastScopeAll": "全ターミナルタブ",
"broadcastActive": "ブロードキャスト中 · {{count}}",
"aiAssistant": "AI アシスタント",
"aiOpen": "ターミナル AI アシスタントを開く",
"aiClose": "ターミナル AI アシスタントを閉じる",
"aiTitle": "ターミナル AI アシスタント (Pro)",
"paneCount": "{{current}}/{{max}}",
"labelLocal": "ローカルターミナル",
"labelSsh": "SSH ターミナル",
"closePaneLabel": "現在のペインを閉じる",
"closeTabLabel": "現在のターミナルタブを閉じる",
"targetSshSession": "現在の SSH セッション"
},
"overlay": {
"shellClosedIdle": "アイドルタイムアウト · シェルが終了しました",
"shellClosed": "シェルが終了しました",
"shellClosedHint": "SSH 接続は維持 · 他のペイン、SFTP、トンネルには影響しません",
"reopenShell": "シェルを再開",
"reopening": "開いています…",
"disconnected": "切断されました",
"disconnectedHint": "SSH セッションが終了したか、ネットワークが切断されました。下のボタンで再接続できます。",
"reconnect": "再接続",
"suspended": "接続が一時停止",
"suspendedHint": "しばらく操作がなかったため、リソース節約のため接続を一時停止しました",
"resume": "接続を再開",
"connectFailed": "接続失敗",
"connectFailedHint": "ホスト、ポート、ユーザー名、認証を確認してください",
"retryConnect": "接続を再試行",
"connecting": "接続中…",
"reconnecting": "自動再接続中{{attempt}}…",
"reconnectingAttempt": " ({{count}})",
"localShellExited": "ローカルシェルが終了しました"
},
"hostKey": {
"titleNew": "ホスト鍵を確認",
"titleChanged": "ホスト鍵が変更されました",
"descNew": "このホストへの初回接続です。信頼する前にフィンガープリントを確認してください。",
"descChanged": "このホストの SSH 鍵がローカルの記録と一致しません。MITM のリスクの可能性があります。",
"host": "ホスト",
"type": "タイプ",
"fingerprint": "SHA256 フィンガープリント",
"previousFingerprint": "以前のフィンガープリント",
"reject": "拒否",
"acceptOnce": "一度だけ信頼",
"acceptAlways": "常に信頼",
"acceptAlwaysChanged": "それでも信頼して更新"
},
"contextMenu": {
"aria": "ターミナルの操作",
"copy": "コピー",
"paste": "貼り付け",
"selectAll": "すべて選択",
"clear": "画面をクリア",
"splitRight": "右に分割",
"splitDown": "下に分割",
"maximizePane": "現在のペインを最大化",
"restoreLayout": "分割レイアウトを復元"
},
"search": {
"placeholder": "検索...",
"previous": "前へ (Shift+Enter)",
"next": "次へ (Enter)",
"close": "閉じる (Escape)"
},
"zmodem": {
"uploadTransferring": "rz アップロード: {{detail}}",
"downloadTransferring": "sz ダウンロード: {{detail}}",
"selectLocalFile": "ローカルファイルを選択",
"pickUploadTitle": "アップロードするファイルを選択 (rz)",
"uploadedCount": "{{count}} 個のファイルをアップロード",
"downloadedSingle": "{{path}}",
"downloadedCount": "{{count}} 個のファイルをダウンロード → {{dir}}",
"transferDone": "転送完了",
"transferFailed": "転送失敗 {{message}}",
"uploadSuccessTerminal": "✓ {{count}} 個のファイルをリモートの作業ディレクトリにアップロード",
"downloadSuccessTerminal": "✓ {{path}} をダウンロード",
"savedDownloadsSingle": "✓ ダウンロードに保存",
"savedDownloadsMultiple": "✓ {{count}} 個のファイルをダウンロードに保存",
"nativeApiUnavailable": "ネイティブ API は利用できません",
"readFailed": "読み取り失敗: {{name}}",
"writeFailed": "書き込み失敗: {{name}}",
"createLocalShellFailed": "ローカルシェルの作成に失敗",
"createRemoteShellFailed": "リモートシェルの作成に失敗",
"createShellFailed": "シェルの作成に失敗: {{error}}"
},
"clipboard": {
"readFailed": "クリップボードの読み取りに失敗",
"writeFailed": "クリップボードへの書き込みに失敗"
},
"input": {
"failed": "ターミナル入力に失敗"
},
"connection": {
"errorPrefix": "エラー: {{message}}",
"autoReconnecting": "自動再接続中 ({{attempt}})...",
"autoReconnectLimit": "自動再接続の上限に達しました ({{max}}){{reasonSuffix}}",
"autoReconnectLimitReason": " — {{reason}}",
"disconnectedRetry": "切断しました · {{seconds}} 秒後に {{attempt}}/{{max}} を再試行...",
"autoReconnectBanner": "[自動再接続] {{seconds}} 秒後に {{attempt}}/{{max}} を再試行",
"disconnectedBanner": "[切断] {{reason}}",
"noConfig": "接続情報がありません"
}
}