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": "閒置逾時,Shell 已結束",
"shellClosed": "Shell 已結束",
"shellClosedHint": "SSH 連線仍可用,其他窗格、SFTP 和通道不受影響",
"reopenShell": "重新開啟 Shell",
"reopening": "正在開啟…",
"disconnected": "連線已中斷",
"disconnectedHint": "SSH 連線已結束或網路中斷。點擊下方一鍵重新連線。",
"reconnect": "重新連線",
"suspended": "連線已暫停",
"suspendedHint": "長時間未操作,連線已進入暫停以節省資源",
"resume": "恢復連線",
"connectFailed": "連線失敗",
"connectFailedHint": "請檢查主機、連接埠、使用者名稱與認證方式",
"retryConnect": "重試連線",
"connecting": "正在連線…",
"reconnecting": "自動重連中{{attempt}}…",
"reconnectingAttempt": " ({{count}})",
"localShellExited": "本機 Shell 已結束"
},
"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": "建立本機 Shell 失敗",
"createRemoteShellFailed": "建立遠端 Shell 失敗",
"createShellFailed": "建立 Shell 失敗: {{error}}"
},
"clipboard": {
"readFailed": "讀取剪貼簿失敗",
"writeFailed": "寫入剪貼簿失敗"
},
"input": {
"failed": "終端機輸入失敗"
},
"connection": {
"errorPrefix": "錯誤: {{message}}",
"autoReconnecting": "自動重連中 ({{attempt}})...",
"autoReconnectLimit": "自動重連已達上限 ({{max}}){{reasonSuffix}}",
"autoReconnectLimitReason": " — {{reason}}",
"disconnectedRetry": "連線中斷,{{seconds}}s 後第 {{attempt}}/{{max}} 次重連...",
"autoReconnectBanner": "[自動重連] {{seconds}}s 後嘗試 {{attempt}}/{{max}}",
"disconnectedBanner": "[連線已中斷] {{reason}}",
"noConfig": "無可用連線資訊"
}
}