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,335 @@
|
||||
{
|
||||
"action": {
|
||||
"confirm": "Xác nhận",
|
||||
"cancel": "Hủy",
|
||||
"close": "Đóng",
|
||||
"delete": "Xóa",
|
||||
"save": "Lưu",
|
||||
"create": "Tạo",
|
||||
"copy": "Sao chép",
|
||||
"copied": "Đã sao chép",
|
||||
"refresh": "Làm mới",
|
||||
"gotIt": "Đã hiểu",
|
||||
"edit": "Sửa",
|
||||
"open": "Mở",
|
||||
"clone": "Nhân bản",
|
||||
"reconnect": "Kết nối lại",
|
||||
"disconnect": "Ngắt kết nối",
|
||||
"submit": "OK"
|
||||
},
|
||||
"status": {
|
||||
"loading": "Đang tải...",
|
||||
"processing": "Đang xử lý...",
|
||||
"connecting": "Đang kết nối...",
|
||||
"connected": "Đã kết nối",
|
||||
"disconnected": "Đã ngắt kết nối",
|
||||
"background": "Chạy nền",
|
||||
"suspended": "Đã tạm dừng",
|
||||
"reconnecting": "Đang kết nối lại",
|
||||
"error": "Lỗi kết nối",
|
||||
"reading": "Đang tải...",
|
||||
"saving": "Đang lưu..."
|
||||
},
|
||||
"error": {
|
||||
"title": "Đã xảy ra lỗi",
|
||||
"body": "Ứng dụng gặp sự cố bất ngờ",
|
||||
"recoverable": "Lỗi này có thể khôi phục. Hãy thử làm mới trang.",
|
||||
"refreshPage": "Làm mới trang",
|
||||
"restartApp": "Khởi động lại ứng dụng",
|
||||
"supportHint": "Nếu sự cố vẫn tiếp diễn, hãy kiểm tra nhật ký hoặc liên hệ hỗ trợ"
|
||||
},
|
||||
"toast": {
|
||||
"closeAria": "Đóng thông báo"
|
||||
},
|
||||
"metrics": {
|
||||
"timezone": "Múi giờ {{value}}",
|
||||
"memory": "Bộ nhớ {{percent}}%{{detail}}",
|
||||
"sessionTransfer": "Lưu lượng phiên {{value}}"
|
||||
},
|
||||
"palette": {
|
||||
"title": "Bảng lệnh",
|
||||
"aria": "Bảng lệnh",
|
||||
"placeholder": "Tìm lệnh, phiên, hoặc đoạn mã lệnh...",
|
||||
"empty": "Không có kết quả phù hợp",
|
||||
"emptyHint": "Thử từ khóa khác",
|
||||
"resultCount": "{{count}} kết quả",
|
||||
"badge": {
|
||||
"command": "Lệnh",
|
||||
"session": "Phiên",
|
||||
"snippet": "Đoạn mã"
|
||||
},
|
||||
"hint": {
|
||||
"nav": "Di chuyển",
|
||||
"run": "Chạy",
|
||||
"close": "Đóng"
|
||||
},
|
||||
"cmd": {
|
||||
"newSession": "Phiên mới",
|
||||
"newSessionDesc": "Tạo hồ sơ phiên SSH mới",
|
||||
"quickConnect": "Kết nối nhanh",
|
||||
"quickConnectDesc": "Kết nối trực tiếp bằng thông tin máy chủ",
|
||||
"localTerminal": "Terminal cục bộ",
|
||||
"localTerminalDesc": "Mở shell cục bộ",
|
||||
"settings": "Mở cài đặt",
|
||||
"settingsDesc": "Tùy chọn ứng dụng",
|
||||
"toggleSidebar": "Bật/tắt thanh bên",
|
||||
"toggleSidebarDesc": "Ẩn thanh bên để tập trung vào terminal",
|
||||
"newTab": "Tab mới",
|
||||
"closeTab": "Đóng tab hiện tại",
|
||||
"closeAllTabs": "Đóng tất cả tab",
|
||||
"portForward": "Chuyển tiếp cổng mới",
|
||||
"upgradePro": "Nâng cấp OpsXShell Pro",
|
||||
"editSession": "Sửa phiên: {{name}}"
|
||||
}
|
||||
},
|
||||
"tab": {
|
||||
"welcome": "Chào mừng",
|
||||
"new": "Tab mới",
|
||||
"settings": "Cài đặt",
|
||||
"portForward": "Chuyển tiếp cổng",
|
||||
"terminal": "Terminal",
|
||||
"batch": "Thực thi hàng loạt",
|
||||
"newTerminal": "Terminal mới",
|
||||
"kind": {
|
||||
"terminal": "Terminal",
|
||||
"sftp": "SFTP",
|
||||
"portforward": "Chuyển tiếp",
|
||||
"serial": "Serial",
|
||||
"rdp": "RDP",
|
||||
"vnc": "VNC",
|
||||
"batch": "Hàng loạt",
|
||||
"settings": "Cài đặt"
|
||||
},
|
||||
"menu": {
|
||||
"closeOthers": "Đóng các tab khác",
|
||||
"closeRight": "Đóng các tab bên phải",
|
||||
"closeLeft": "Đóng các tab bên trái",
|
||||
"closeAll": "Đóng tất cả",
|
||||
"clone": "Nhân đôi tab"
|
||||
}
|
||||
},
|
||||
"sidebar": {
|
||||
"brandSub": "Terminal SSH / SFTP",
|
||||
"collapse": "Thu gọn thanh bên (Ctrl/Cmd+B)",
|
||||
"collapseAria": "Thu gọn thanh bên",
|
||||
"expand": "Mở rộng thanh bên",
|
||||
"expandAria": "Mở rộng thanh bên",
|
||||
"toggle": "Bật/tắt thanh bên",
|
||||
"searchPlaceholder": "Tìm kiếm...",
|
||||
"localShell": {
|
||||
"openDefault": "Mở shell cục bộ mặc định",
|
||||
"choose": "Chọn shell",
|
||||
"title": "Shell cục bộ",
|
||||
"subtitle": "Mở terminal trên máy này",
|
||||
"default": "Mặc định"
|
||||
}
|
||||
},
|
||||
"connectionPanel": {
|
||||
"title": "Kết nối",
|
||||
"empty": "Không có kết nối",
|
||||
"emptyDesc": "Chưa có kết nối nào đang hoạt động. Chúng sẽ hiển thị tại đây sau khi bạn kết nối tới máy chủ.",
|
||||
"stat": {
|
||||
"total": "Tổng",
|
||||
"active": "Đang hoạt động",
|
||||
"background": "Chạy nền",
|
||||
"error": "Ngắt kết nối/lỗi"
|
||||
},
|
||||
"status": {
|
||||
"connected": "Đã kết nối",
|
||||
"connecting": "Đang kết nối",
|
||||
"background": "Chạy nền",
|
||||
"suspended": "Đã tạm dừng",
|
||||
"error": "Lỗi",
|
||||
"disconnected": "Đã ngắt kết nối",
|
||||
"reconnecting": "Đang kết nối lại"
|
||||
},
|
||||
"refCount": "×{{count}} tham chiếu",
|
||||
"reconnect": "Kết nối lại",
|
||||
"reconnecting": "Đang kết nối lại...",
|
||||
"disconnect": "Ngắt kết nối"
|
||||
},
|
||||
"pro": {
|
||||
"upgrade": "Nâng cấp Pro",
|
||||
"feature": "Tính năng Pro",
|
||||
"unlock": "Mở khóa {{feature}}",
|
||||
"comingSoon": "Sắp ra mắt",
|
||||
"activateSuccess": "Đã kích hoạt",
|
||||
"activateFailed": "Kích hoạt thất bại",
|
||||
"licenseActivated": "Giấy phép Pro đã được kích hoạt",
|
||||
"paymentPending": "Sau khi thanh toán, hãy dán giấy phép của bạn vào đây hoặc thử kích hoạt lại sau",
|
||||
"invalidLicense": "Kích hoạt thất bại: giấy phép không hợp lệ",
|
||||
"goUpgrade": "Nâng cấp",
|
||||
"haveLicense": "Có giấy phép? Kích hoạt",
|
||||
"title": "OpsXShell Pro · Mở khóa các tính năng vận hành chuyên nghiệp",
|
||||
"subtitleComingSoon": "{{feature}} sắp ra mắt · nâng cấp Pro để truy cập sớm",
|
||||
"subtitleUnlock": "Đang mở khóa: {{feature}}",
|
||||
"subtitleDefault": "Chuyển tiếp cổng, proxy, serial, AI, hàng loạt và phát sóng",
|
||||
"activated": "Đã kích hoạt Pro",
|
||||
"expiresAt": " · hợp lệ đến {{date}}",
|
||||
"lifetime": " · giấy phép trọn đời",
|
||||
"oneTimeFee": "Mua một lần · trọn đời trên thiết bị này · không cần đăng ký",
|
||||
"pasteLicense": "Dán giấy phép",
|
||||
"activateButton": "Kích hoạt",
|
||||
"clearLicense": "Xóa giấy phép cục bộ",
|
||||
"paymentNote": "Thanh toán được xử lý bởi Waffo; ứng dụng này không thu thập thông tin thẻ.",
|
||||
"testDeviceId": "Môi trường thử nghiệm · ID thiết bị: {{deviceId}}",
|
||||
"later": "Để sau",
|
||||
"viewPro": "Xem Pro",
|
||||
"wallComingSoonSuffix": " · sắp ra mắt",
|
||||
"wallUnlock": "Mở khóa {{feature}}",
|
||||
"wallMessageComingSoon": "Tính năng Pro này vẫn đang được phát triển. Nâng cấp để truy cập sớm.",
|
||||
"wallMessageDefault": "Tính năng này yêu cầu OpsXShell Pro. Nâng cấp để sử dụng trên thiết bị này.",
|
||||
"checkoutUnavailable": "Không thể thanh toán ({{status}})",
|
||||
"freeTier": "Miễn phí",
|
||||
"proTier": "Pro",
|
||||
"freeItems": {
|
||||
"ssh": "Terminal SSH",
|
||||
"sftp": "Quản lý tệp SFTP",
|
||||
"local": "Terminal cục bộ",
|
||||
"crud": "Tạo/đọc/sửa/xóa phiên",
|
||||
"import": "Nhập đơn lẻ / ssh_config"
|
||||
},
|
||||
"proItems": {
|
||||
"forward": "Chuyển tiếp cổng",
|
||||
"proxy": "Proxy phiên / SOCKS",
|
||||
"serial": "Terminal Serial",
|
||||
"ai": "Trợ lý AI terminal",
|
||||
"batch": "Thực thi hàng loạt / đồng bộ phát sóng",
|
||||
"broadcast": "Đồng bộ đầu vào phát sóng",
|
||||
"importExport": "Nhập/xuất máy chủ hàng loạt",
|
||||
"desktop": "Màn hình từ xa RDP / VNC"
|
||||
}
|
||||
},
|
||||
"launcher": {
|
||||
"title": "Khởi động nhanh",
|
||||
"description": "Phiên, shell cục bộ và bảng điều khiển thiết bị",
|
||||
"cards": {
|
||||
"quickConnect": {
|
||||
"title": "Kết nối nhanh",
|
||||
"desc": "người_dùng@máy_chủ:cổng"
|
||||
},
|
||||
"saveSession": {
|
||||
"title": "Lưu phiên",
|
||||
"desc": "Thông tin xác thực, nhóm, proxy"
|
||||
},
|
||||
"serial": {
|
||||
"title": "Terminal Serial",
|
||||
"desc": "Tốc độ baud và cài đặt cổng"
|
||||
}
|
||||
},
|
||||
"sectionLocalShell": "Shell cục bộ",
|
||||
"sectionSavedSessions": "Phiên đã lưu",
|
||||
"systemDefault": "Mặc định hệ thống"
|
||||
},
|
||||
"statusBar": {
|
||||
"socksLabel": "Chuyển tiếp",
|
||||
"socksIdle": "Mở chuyển tiếp cổng · nhấp chuột phải để sao chép SOCKS",
|
||||
"socksRunning": "SOCKS5 đang chạy · nhấp để quản lý · nhấp chuột phải để sao chép",
|
||||
"forwardOpenIdle": "Mở chuyển tiếp cổng · nhấp chuột phải để sao chép socks5://127.0.0.1:{{port}}",
|
||||
"forwardOpenRunning": "SOCKS5 đang chạy (:{{port}}) · nhấp để quản lý · nhấp chuột phải để sao chép",
|
||||
"forwardStarted": "Đã bắt đầu chuyển tiếp",
|
||||
"forwardStartedDynamic": "Đã khởi động SOCKS5: socks5://127.0.0.1:{{port}}",
|
||||
"socksStartFailed": "Khởi động thất bại: {{message}}",
|
||||
"socksStopFailed": "Dừng thất bại: {{message}}",
|
||||
"socksCopied": "Đã sao chép socks5://127.0.0.1:{{port}}"
|
||||
},
|
||||
"portForward": {
|
||||
"title": "Chuyển tiếp cổng",
|
||||
"connectedAs": "Đã kết nối: {{target}}",
|
||||
"notConnected": "Chưa kết nối — hãy thiết lập SSH trước",
|
||||
"socksDefaultHint": "SOCKS5 cục bộ: 127.0.0.1:1080",
|
||||
"socksRunning": "SOCKS5 đang chạy",
|
||||
"socksStart": "Khởi động SOCKS5",
|
||||
"addRule": "Thêm",
|
||||
"emptyTitle": "Không có chuyển tiếp cổng",
|
||||
"emptyDesc": "Khởi động SOCKS5, hoặc thêm quy tắc Cục bộ / Từ xa",
|
||||
"emptyAction": "Khởi động 127.0.0.1:1080",
|
||||
"typeLocal": "Cục bộ",
|
||||
"typeRemote": "Từ xa",
|
||||
"typeDynamic": "Động",
|
||||
"running": "Đang chạy",
|
||||
"socksProxy": "SOCKS5: 127.0.0.1:{{port}}",
|
||||
"remoteToLocal": "Từ xa {{remote}} → cục bộ {{local}}",
|
||||
"stats": "{{connections}} kết nối · ↑{{up}} · ↓{{down}}",
|
||||
"copyProxy": "Sao chép proxy",
|
||||
"copyRule": "Nhân đôi quy tắc",
|
||||
"editRule": "Sửa",
|
||||
"stopListener": "Dừng",
|
||||
"start": "Khởi động",
|
||||
"delete": "Xóa",
|
||||
"editTitle": "Sửa chuyển tiếp",
|
||||
"addTitle": "Thêm chuyển tiếp",
|
||||
"typeLocalDesc": "Cục bộ → từ xa",
|
||||
"typeRemoteDesc": "Từ xa → cục bộ",
|
||||
"typeDynamicDesc": "SOCKS5",
|
||||
"selectType": "Loại",
|
||||
"drawerSubtitle": "Đường hầm qua phiên SSH hiện tại",
|
||||
"ruleFields": "Chi tiết",
|
||||
"dynamicHint": "SOCKS5 cục bộ tại 127.0.0.1:1080. Lưu lượng thoát qua địa chỉ IP công cộng của máy chủ SSH này.",
|
||||
"dynamicSingleHint": "Một quy tắc Động cho mỗi máy chủ SSH, cổng cố định 1080.",
|
||||
"dynamicPortHint": "If the port is busy, pick another local port (e.g. 1081).",
|
||||
"ruleList": "Quy tắc",
|
||||
"ruleListEmpty": "Chưa có quy tắc Cục bộ / Từ xa nào",
|
||||
"addSection": "Thêm mới",
|
||||
"errorDynamicExists": "Quy tắc Động đã tồn tại (1080). Hãy khởi động hoặc dừng nó thay vì thêm mới.",
|
||||
"diagram": {
|
||||
"title": "Cách hoạt động",
|
||||
"localApp": "Ứng dụng cục bộ",
|
||||
"sshHost": "Máy chủ SSH",
|
||||
"remoteService": "Dịch vụ từ xa",
|
||||
"remoteClient": "Máy khách từ xa",
|
||||
"localService": "Dịch vụ cục bộ",
|
||||
"localClient": "Cục bộ",
|
||||
"browser": "Máy khách cục bộ",
|
||||
"socksProxy": "SOCKS cục bộ",
|
||||
"anyTarget": "Bất kỳ đích nào",
|
||||
"localSide": "Cục bộ",
|
||||
"remoteSide": "Từ xa",
|
||||
"firewall": "Tường lửa",
|
||||
"viaApp": "qua OpsXShell",
|
||||
"viaSsh": "qua SSH",
|
||||
"toTarget": "tới đích",
|
||||
"toListen": "lắng nghe",
|
||||
"targetDb": "CSDL",
|
||||
"targetWeb": "Web",
|
||||
"targetApi": "API",
|
||||
"remotePeerA": "Từ xa A",
|
||||
"remotePeerB": "Từ xa B",
|
||||
"remotePeerC": "Từ xa C",
|
||||
"cloudA": "Đám mây A",
|
||||
"cloudB": "Đám mây B",
|
||||
"internet": "Internet",
|
||||
"localCaption": "Cục bộ: truy cập một cổng từ xa như thể nó là cổng cục bộ.",
|
||||
"remoteCaption": "Từ xa: quyền truy cập từ xa được chuyển tiếp tới dịch vụ cục bộ.",
|
||||
"dynamicCaption": "Động: máy này trở thành proxy SOCKS5 thoát qua IP công cộng của máy chủ SSH hiện tại."
|
||||
},
|
||||
"ruleName": "Tên",
|
||||
"ruleNamePlaceholder": "vd. MySQL",
|
||||
"localListenPort": "Cổng lắng nghe cục bộ",
|
||||
"localTargetPort": "Cổng đích cục bộ",
|
||||
"remoteTargetPort": "Cổng đích từ xa",
|
||||
"remoteListenPort": "Cổng lắng nghe từ xa",
|
||||
"portPlaceholder": "vd. 3306",
|
||||
"remoteHost": "Máy chủ từ xa",
|
||||
"remoteHostPlaceholder": "localhost hoặc IP",
|
||||
"socksRuleName": "Proxy SOCKS5",
|
||||
"defaultLocalName": "Chuyển tiếp cục bộ",
|
||||
"defaultRemoteName": "Chuyển tiếp từ xa",
|
||||
"sessionRestoredTitle": "Phiên đã được khôi phục",
|
||||
"sessionRestoredDesc": "Tab chuyển tiếp cổng từ phiên trước đó của bạn đã được khôi phục.\nKết nối lại SSH để sử dụng lại.",
|
||||
"stopEditTitle": "Dừng trước khi sửa",
|
||||
"stopEditMessage": "Chuyển tiếp này đang chạy. Dừng nó trước khi sửa?",
|
||||
"stopEditConfirm": "Dừng và sửa",
|
||||
"deleteTitle": "Xóa quy tắc",
|
||||
"deleteRunning": "Chuyển tiếp đang chạy sẽ được dừng trước.",
|
||||
"deleteConfirm": "Xóa quy tắc này?",
|
||||
"errorNamePort": "Nhập tên và cổng hợp lệ (1–65535)",
|
||||
"errorTargetPort": "Nhập cổng đích hợp lệ (1–65535)",
|
||||
"errorRemoteHost": "Nhập máy chủ từ xa",
|
||||
"errorNotConnected": "Chưa kết nối",
|
||||
"errorStartFailed": "Khởi động thất bại",
|
||||
"errorStopFailed": "Dừng thất bại",
|
||||
"errorSocksRunning": "SOCKS5 đã đang chạy",
|
||||
"copySuffix": "Sao chép"
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user