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:
1 parent
fea6d8db04
commit
b0d0e3a5f3
301 files changed
+28002
-2705
No files matched your search
@@ -0,0 +1,119 @@
|
||||
{
|
||||
"toolbar": {
|
||||
"splitHorizontal": "Chia trái/phải",
|
||||
"splitVertical": "Chia trên/dưới",
|
||||
"addPane": "Thêm pane",
|
||||
"closePane": "Đóng pane hiện tại",
|
||||
"maximizePane": "Phóng to pane hiện tại",
|
||||
"restoreLayout": "Khôi phục bố cục chia",
|
||||
"broadcast": "Phát sóng",
|
||||
"broadcastAria": "Phát sóng đầu vào",
|
||||
"broadcastOn": "Phát sóng đang bật: đồng bộ đầu vào tới {{count}} terminal trong phạm vi",
|
||||
"broadcastOffPro": "Phát sóng đầu vào (Pro) · {{count}} terminal trong phạm vi",
|
||||
"broadcastNeedPanesTab": "Tab này cần ít nhất 2 pane sẵn sàng để phát sóng (chia trước tiên)",
|
||||
"broadcastNeedPanesAll": "Tất cả tab terminal cần ít nhất 2 terminal sẵn sàng để phát sóng",
|
||||
"broadcastScopeAria": "Phạm vi phát sóng",
|
||||
"broadcastScopeTab": "Pane của tab hiện tại",
|
||||
"broadcastScopeAll": "Tất cả tab terminal",
|
||||
"broadcastActive": "Đang phát sóng · {{count}}",
|
||||
"aiAssistant": "Trợ lý AI",
|
||||
"aiOpen": "Mở trợ lý AI terminal",
|
||||
"aiClose": "Đóng trợ lý AI terminal",
|
||||
"aiTitle": "Trợ lý AI terminal (Pro)",
|
||||
"paneCount": "{{current}}/{{max}}",
|
||||
"labelLocal": "Terminal cục bộ",
|
||||
"labelSsh": "Terminal SSH",
|
||||
"closePaneLabel": "Đóng pane hiện tại",
|
||||
"closeTabLabel": "Đóng tab terminal hiện tại",
|
||||
"targetSshSession": "Phiên SSH hiện tại"
|
||||
},
|
||||
"overlay": {
|
||||
"shellClosedIdle": "Hết thời gian chờ nhàn rỗi; shell đã thoát",
|
||||
"shellClosed": "Shell đã thoát",
|
||||
"shellClosedHint": "Kết nối SSH vẫn còn; các pane khác, SFTP và đường hầm không bị ảnh hưởng",
|
||||
"reopenShell": "Mở lại shell",
|
||||
"reopening": "Đang mở…",
|
||||
"disconnected": "Đã ngắt kết nối",
|
||||
"disconnectedHint": "Phiên SSH đã kết thúc hoặc mạng bị ngắt. Nhấn bên dưới để kết nối lại.",
|
||||
"reconnect": "Kết nối lại",
|
||||
"suspended": "Kết nối đã bị tạm dừng",
|
||||
"suspendedHint": "Không hoạt động một thời gian; kết nối đã bị tạm dừng để tiết kiệm tài nguyên",
|
||||
"resume": "Tiếp tục kết nối",
|
||||
"connectFailed": "Kết nối thất bại",
|
||||
"connectFailedHint": "Kiểm tra máy chủ, cổng, tên người dùng và xác thực",
|
||||
"retryConnect": "Thử kết nối lại",
|
||||
"connecting": "Đang kết nối…",
|
||||
"reconnecting": "Đang tự kết nối lại{{attempt}}…",
|
||||
"reconnectingAttempt": " ({{count}})",
|
||||
"localShellExited": "Shell cục bộ đã thoát"
|
||||
},
|
||||
"hostKey": {
|
||||
"titleNew": "Xác minh khóa máy chủ",
|
||||
"titleChanged": "Khóa máy chủ đã thay đổi",
|
||||
"descNew": "Kết nối đầu tiên tới máy chủ này. Xác minh dấu vết trước khi tin tưởng.",
|
||||
"descChanged": "Khóa SSH của máy chủ này không còn khớp với bản ghi cục bộ. Có nguy cơ MITM.",
|
||||
"host": "Máy chủ",
|
||||
"type": "Loại",
|
||||
"fingerprint": "Dấu vết SHA256",
|
||||
"previousFingerprint": "Dấu vết trước đó",
|
||||
"reject": "Từ chối",
|
||||
"acceptOnce": "Tin tưởng một lần",
|
||||
"acceptAlways": "Luôn tin tưởng",
|
||||
"acceptAlwaysChanged": "Tin tưởng và cập nhật"
|
||||
},
|
||||
"contextMenu": {
|
||||
"aria": "Thao tác terminal",
|
||||
"copy": "Sao chép",
|
||||
"paste": "Dán",
|
||||
"selectAll": "Chọn tất cả",
|
||||
"clear": "Xóa màn hình",
|
||||
"splitRight": "Chia bên phải",
|
||||
"splitDown": "Chia xuống dưới",
|
||||
"maximizePane": "Phóng to pane hiện tại",
|
||||
"restoreLayout": "Khôi phục bố cục chia"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "Tìm kiếm...",
|
||||
"previous": "Trước đó (Shift+Enter)",
|
||||
"next": "Kế tiếp (Enter)",
|
||||
"close": "Đóng (Escape)"
|
||||
},
|
||||
"zmodem": {
|
||||
"uploadTransferring": "tải lên rz: {{detail}}",
|
||||
"downloadTransferring": "tải xuống sz: {{detail}}",
|
||||
"selectLocalFile": "Chọn tệp cục bộ",
|
||||
"pickUploadTitle": "Chọn tệp để tải lên (rz)",
|
||||
"uploadedCount": "Đã tải lên {{count}} tệp",
|
||||
"downloadedSingle": "{{path}}",
|
||||
"downloadedCount": "Đã tải xuống {{count}} tệp → {{dir}}",
|
||||
"transferDone": "Truyền hoàn tất",
|
||||
"transferFailed": "Truyền thất bại {{message}}",
|
||||
"uploadSuccessTerminal": "✓ Đã tải lên {{count}} tệp tới thư mục làm việc từ xa",
|
||||
"downloadSuccessTerminal": "✓ Đã tải xuống {{path}}",
|
||||
"savedDownloadsSingle": "✓ Đã lưu vào Downloads",
|
||||
"savedDownloadsMultiple": "✓ Đã lưu {{count}} tệp vào Downloads",
|
||||
"nativeApiUnavailable": "API gốc không khả dụng",
|
||||
"readFailed": "Đọc thất bại: {{name}}",
|
||||
"writeFailed": "Ghi thất bại: {{name}}",
|
||||
"createLocalShellFailed": "Không thể tạo shell cục bộ",
|
||||
"createRemoteShellFailed": "Không thể tạo shell từ xa",
|
||||
"createShellFailed": "Không thể tạo shell: {{error}}"
|
||||
},
|
||||
"clipboard": {
|
||||
"readFailed": "Không thể đọc clipboard",
|
||||
"writeFailed": "Không thể ghi clipboard"
|
||||
},
|
||||
"input": {
|
||||
"failed": "Đầu vào terminal thất bại"
|
||||
},
|
||||
"connection": {
|
||||
"errorPrefix": "Lỗi: {{message}}",
|
||||
"autoReconnecting": "Đang tự kết nối lại ({{attempt}})...",
|
||||
"autoReconnectLimit": "Đã đạt giới hạn tự kết nối lại ({{max}}){{reasonSuffix}}",
|
||||
"autoReconnectLimitReason": " — {{reason}}",
|
||||
"disconnectedRetry": "Đã ngắt kết nối, thử lại {{attempt}}/{{max}} sau {{seconds}} giây...",
|
||||
"autoReconnectBanner": "[Tự kết nối lại] Đang thử lại {{attempt}}/{{max}} sau {{seconds}} giây",
|
||||
"disconnectedBanner": "[Đã ngắt kết nối] {{reason}}",
|
||||
"noConfig": "Không có thông tin kết nối"
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user