diff --git a/ui/src/lib/i18n.ts b/ui/src/lib/i18n.ts index deb44b6e..4585d5f1 100644 --- a/ui/src/lib/i18n.ts +++ b/ui/src/lib/i18n.ts @@ -2248,11 +2248,11 @@ const resources = { cursorIde: 'Cursor IDE', accounts: 'Tài khoản', allAccounts: 'Tất cả tài khoản', - sharedData: 'Dữ liệu được chia sẻ', + sharedData: 'Dữ liệu dùng chung', compatibleClis: 'CLI tương thích', factoryDroid: 'Factory Droid', system: 'Hệ thống', - health: 'Trạng thái', + health: 'Sức khỏe', settings: 'Cài đặt', openrouterTooltip: 'Hơn 349 mô hình qua OpenRouter', }, @@ -2260,7 +2260,7 @@ const resources = { profiles: 'Hồ sơ', cliproxy: 'CLIProxy', accounts: 'Tài khoản', - health: 'Trạng thái', + health: 'Sức khỏe', configurationRequired: 'Cần cấu hình', }, auth: { @@ -2276,13 +2276,12 @@ const resources = { }, commonToast: { apiKeyRequired: 'Cần có khóa API', - accountAddedPresetFailed: - 'Đã thêm tài khoản nhưng không áp dụng được giá trị đặt trước mặc định', + accountAddedPresetFailed: 'Đã thêm tài khoản nhưng không áp dụng được preset mặc định', settingsCopied: 'Đã sao chép cài đặt vào bảng nhớ tạm', - enterPresetName: 'Vui lòng nhập tên đặt trước để lưu', + enterPresetName: 'Vui lòng nhập tên preset để lưu', codeCopied: 'Đã sao chép mã vào bảng nhớ tạm', copyCodeFailed: 'Không sao chép được mã', - appliedModelAllTiers: 'Mô hình áp dụng cho tất cả các tầng', + appliedModelAllTiers: 'Đã áp dụng mô hình cho tất cả các tier', settingsSaved: 'Đã lưu cài đặt', defaultTargetUpdated: 'Đã cập nhật mục tiêu mặc định', failedUpdateDefaultTarget: @@ -2298,7 +2297,7 @@ const resources = { apiKey: 'Khóa API', defaultModel: 'Mô hình mặc định (ANTHROPIC_MODEL)', defaultModelHint: 'Để trống để sử dụng: {{model}}', - modelMappingTitle: 'Lập bản đồ mô hình (Opus/Sonnet/Haiku)', + modelMappingTitle: 'Ánh xạ mô hình (Opus/Sonnet/Haiku)', modelMappingDesc: 'Cấu hình ID mô hình riêng cho từng tier. Hữu ích với API proxy định tuyến từng loại mô hình đến backend khác nhau.', opusModel: 'Mô hình Opus (ANTHROPIC_DEFAULT_OPUS_MODEL)', @@ -2349,9 +2348,9 @@ const resources = { skipHint: 'Bỏ qua nếu bạn chỉ muốn thêm tài khoản mà không tạo biến thể', }, customPresetDialog: { - title: 'Đặt trước tùy chỉnh', - presetNameOptional: 'Tên đặt trước (tùy chọn)', - presetNamePlaceholder: 'ví dụ: Cấu hình tùy chỉnh của tôi', + title: 'Preset tùy chỉnh', + presetNameOptional: 'Tên preset (tùy chọn)', + presetNamePlaceholder: 'ví dụ: Preset tùy chỉnh của tôi', codexTipPrefix: 'Mẹo Codex: hậu tố', codexTipSuffix: 'nỗ lực ghim. Các mô hình không có hậu tố sử dụng cài đặt Tư duy.', defaultModel: 'Mô hình mặc định', @@ -2363,7 +2362,7 @@ const resources = { haikuModel: 'Haiku (Nhanh)', haikuModelDesc: 'Phản hồi nhanh cho các tác vụ đơn giản', cancel: 'Hủy bỏ', - savePreset: 'Lưu cài đặt trước', + savePreset: 'Lưu preset', applyPreset: 'Áp dụng cài sẵn', }, componentModelSelector: { @@ -2377,7 +2376,7 @@ const resources = { basicSettings: 'Cài đặt cơ bản', accountType: 'Loại tài khoản', accountTypeIndividual: 'Cá nhân', - accountTypeBusiness: 'Doanh nghiệp', + accountTypeBusiness: 'Business', accountTypeEnterprise: 'Enterprise', rateLimiting: 'Giới hạn tỷ lệ', rateLimitSeconds: 'Giới hạn tốc độ (giây)', @@ -2518,14 +2517,14 @@ const resources = { ready: 'Sẵn sàng', noConfig: 'Không có cấu hình', syncsProfilesDesc: 'Đồng bộ hóa cấu hình API với cấu hình CLIProxy cục bộ', - runDoctorHint: 'Chạy ccs doctor --fix để tạo config.', + runDoctorHint: 'Chạy ccs doctor --fix để tạo cấu hình.', details: 'Chi tiết', syncNow: 'Đồng bộ ngay', }, syncDialog: { title: 'Đồng bộ hóa hồ sơ với CLIProxy cục bộ', description: 'Đồng bộ hóa cấu hình API CCS của bạn với CLIProxy config.yaml cục bộ.', - noProfiles: 'Không có cấu hình nào được định cấu hình để đồng bộ hóa.', + noProfiles: 'Không có profile nào để đồng bộ.', createProfilesFirst: 'Trước tiên hãy tạo hồ sơ API bằng tab Hồ sơ.', modelLabel: 'Mô hình:', ready: 'Sẵn sàng', @@ -2552,7 +2551,7 @@ const resources = { tabResponse: 'Phản hồi', tabRaw: 'Raw', modelLabel: 'Mô hình:', - quotaResetsIn: 'Đặt lại hạn ngạch trong', + quotaResetsIn: 'Quota sẽ được đặt lại sau', method: 'Phương thức', provider: 'Nhà cung cấp', version: 'Phiên bản', @@ -2650,7 +2649,7 @@ const resources = { 'Bạn có chắc chắn muốn xóa tài khoản "{{name}}" không? Thao tác này sẽ xóa hồ sơ và tất cả dữ liệu phiên của nó. Không thể hoàn tác hành động này.', cancel: 'Hủy bỏ', delete: 'Xóa', - sharedGroupStandard: 'được chia sẻ ({{group}}, tiêu chuẩn)', + sharedGroupStandard: 'chia sẻ ({{group}}, tiêu chuẩn)', sharedGroupDeeper: 'chia sẻ ({{group}}, sâu hơn)', sharedGroupLegacy: 'chia sẻ ({{group}}, kế thừa tiêu chuẩn)', isolatedLegacy: 'tách biệt (mặc định cũ)', @@ -2728,7 +2727,7 @@ const resources = { quotaLoading: 'Hạn ngạch...', quota: 'hạn ngạch', quotaUnavailable: 'Thông tin quota chưa khả dụng', - reauthNeeded: 'Reauth cần thiết', + reauthNeeded: 'Cần xác thực lại', removeAndReadd: 'Xóa và thêm lại tài khoản', autoRefreshFailed: 'Tự động làm mới không thành công', }, @@ -2778,7 +2777,7 @@ const resources = { placeholderModelId: 'model-id', placeholderAccountId: 'account-id', editCompositeTitle: 'Chỉnh sửa biến thể tổng hợp: {{name}}', - editSingleTitle: 'Chỉnh sửa một biến thể: {{name}}', + editSingleTitle: 'Chỉnh sửa biến thể: {{name}}', }, profileEditor: { profileInfo: 'Thông tin hồ sơ', @@ -2810,7 +2809,7 @@ const resources = { settingsTabs: { web: 'Web', env: 'Env', - think: 'Thinking', + think: 'Tư duy', proxy: 'Proxy', auth: 'Xác thực', backup: 'Sao lưu', @@ -2827,7 +2826,7 @@ const resources = { 'Cấu hình token xác thực CLIProxy. Các thay đổi yêu cầu khởi động lại CLIProxy.', apiKey: 'Khóa API', custom: 'Tùy chỉnh', - apiKeyDesc: 'Được sử dụng bởi Claude Code để xác thực bằng CLIProxy', + apiKeyDesc: 'Được Claude Code dùng để xác thực qua CLIProxy', apiKeyPlaceholder: 'Khóa API', managementSecret: 'Bí mật quản lý', managementSecretDesc: 'Được bảng điều khiển CCS sử dụng để truy cập API quản lý CLIProxy', @@ -2840,13 +2839,13 @@ const resources = { }, settingsGlobalEnv: { description: - 'Biến môi trường được áp dụng cho tất cả hồ sơ không phải Claude subscription (gemini, codex, agy, ghcp, v.v.)', + 'Biến môi trường được áp dụng cho tất cả hồ sơ không dùng Claude subscription (gemini, codex, agy, ghcp, v.v.)', enabled: 'Đã bật Env toàn cầu', disabled: 'Env toàn cầu bị vô hiệu hóa', enabledDesc: 'Biến Env sẽ được áp dụng cho các hồ sơ bên thứ ba', disabledDesc: 'Biến Env sẽ không được áp dụng', envVars: 'Biến môi trường', - noneConfigured: 'Không có biến môi trường nào được định cấu hình', + noneConfigured: 'Không có biến môi trường nào được cấu hình', addNew: 'Thêm biến mới', keyName: 'KEY_NAME', value: 'giá trị', @@ -2878,7 +2877,7 @@ const resources = { disabled: 'Tìm kiếm trên web bị vô hiệu hóa', checking: 'Đang kiểm tra trạng thái...', providers: 'Nhà cung cấp', - noneConfigured: 'Không có nhà cung cấp nào được định cấu hình', + noneConfigured: 'Không có nhà cung cấp nào được cấu hình', noneConfiguredHint: 'Cài công cụ CLI để bật các nhà cung cấp WebSearch', checkProviders: 'Kiểm tra các nhà cung cấp', installed: 'đã cài đặt', @@ -2909,7 +2908,7 @@ const resources = { remote: 'Từ xa', localDesc: 'Chạy nhị phân {{backend}} trên máy này', remoteDesc: 'Kết nối với máy chủ {{backend}} từ xa', - backendBinary: 'Binary backend', + backendBinary: 'Tệp thực thi backend', stopProxyToSwitch: 'Dừng proxy đang chạy trong Trạng thái phiên bản trước khi chuyển backend.', default: 'Mặc định', @@ -2931,7 +2930,7 @@ const resources = { step2: 'Bước 2', typePrefix: 'Nhập', typeSuffix: 'để kích hoạt.', - typePhraseAria: 'Nhập I ACCEPT RISK để bật chế độ người dùng nâng cao Antigravity', + typePhraseAria: 'Nhập I ACCEPT RISK để bật chế độ power user Antigravity', exactPhrase: 'Phải nhập chính xác cụm từ.', enableAgyMode: 'Bật chế độ power user', toggleAgyMode: 'Chuyển đổi chế độ power user AGY', @@ -2952,7 +2951,7 @@ const resources = { remoteConfigTitle: 'Cấu hình máy chủ từ xa', host: 'Host', hostPlaceholder: '192.168.1.100 hoặc proxy.example.com', - defaultPort: 'mặc định: {{value}}', + defaultPort: 'mặc định {{value}}', portPlaceholder: 'Để trống để dùng {{value}}', protocol: 'Giao thức', http: 'HTTP', @@ -2962,8 +2961,7 @@ const resources = { apiKeyDesc: 'Dùng cho các yêu cầu API đến /v1/chat/completions', managementKeyOptional: 'Khóa quản lý (tùy chọn)', managementKeyPlaceholder: 'Đối với điểm cuối /v0/management/*', - managementKeyDesc: - 'Được sử dụng cho API quản lý trang tổng quan. Quay trở lại Khóa API nếu không được đặt.', + managementKeyDesc: 'Dùng cho API quản lý dashboard. Nếu bỏ trống sẽ dùng Khóa API.', testing: 'Đang thử nghiệm...', testConnection: 'Kiểm tra kết nối', connectedLatency: 'Đã kết nối ({{value}}ms)', @@ -3033,7 +3031,7 @@ const resources = { noProfileMatch: 'Không có hồ sơ nào khớp với "{{query}}"', profileCount: '{{count}} hồ sơ', profileCount_other: '{{count}} hồ sơ', - configuredCount: '{{count}} đã được định cấu hình', + configuredCount: '{{count}} đã cấu hình', deleteProfileTitle: 'Xóa hồ sơ', deleteProfileDesc: 'Bạn có chắc chắn muốn xóa "{{name}}" không? Thao tác này sẽ xóa tệp cài đặt và không thể hoàn tác.', @@ -3082,7 +3080,7 @@ const resources = { tableScopeSuffix: 'để thay đổi chế độ/nhóm/độ sâu.', accountMatrix: 'Ma trận tài khoản', sharedTotalDesc: - 'Tổng số được chia sẻ: {{count}}. Các hành động bao gồm cài đặt Đồng bộ hóa và xác nhận kế thừa.', + 'Tổng số tài khoản chia sẻ: {{count}}. Bao gồm thao tác Sync và xác nhận kế thừa.', loadingAccounts: 'Đang tải tài khoản...', }, health: { @@ -3116,9 +3114,9 @@ const resources = { doneCount: 'Xong', searchPlaceholder: 'Tìm kiếm hành động hoặc lệnh', noNotices: 'Không có thông báo nào khớp với chế độ xem này.', - noUpdates: 'Không có bản cập nhật có sẵn.', + noUpdates: 'Hiện không có bản cập nhật nào.', published: 'Đã xuất bản {{date}}', - markDone: 'Đánh dấu là xong', + markDone: 'Đánh dấu hoàn tất', dismiss: 'Ẩn', reopen: 'Mở lại', doNext: 'Làm tiếp theo', @@ -3268,12 +3266,11 @@ const resources = { defaultModelRequired: 'Mô hình mặc định là bắt buộc', savedConfig: 'Đã lưu cấu hình Cursor và ánh xạ mô hình', failedSaveConfig: 'Không lưu được cấu hình', - modelsLoadingWait: - 'Các mô hình vẫn đang tải. Vui lòng đợi trước khi áp dụng cài đặt trước.', + modelsLoadingWait: 'Mô hình vẫn đang tải. Vui lòng đợi trước khi áp dụng preset.', noModelsAvailable: 'Chưa có mô hình nào. Hãy khởi động daemon rồi làm mới.', - appliedCodexPreset: 'Đã áp dụng cài đặt trước Codex GPT-5.3', - appliedClaudePreset: 'Đã áp dụng cài đặt trước Claude 4.6', - appliedGeminiPreset: 'Đã áp dụng cài đặt trước Gemini 3', + appliedCodexPreset: 'Đã áp dụng preset Codex GPT-5.3', + appliedClaudePreset: 'Đã áp dụng preset Claude 4.6', + appliedGeminiPreset: 'Đã áp dụng preset Gemini 3', integrationEnabled: 'Đã bật tích hợp Cursor', integrationDisabled: 'Đã tắt tích hợp Cursor', failedUpdateIntegration: 'Không cập nhật được trạng thái tích hợp', @@ -3350,24 +3347,24 @@ const resources = { commands: 'Lệnh', skills: 'Kỹ năng', agents: 'Agent', - title: 'Dữ liệu được chia sẻ', + title: 'Dữ liệu dùng chung', subtitle: 'Các lệnh, kỹ năng và agent được chia sẻ giữa các phiên Claude', - totalShared: 'Tổng số được chia sẻ', + totalShared: 'Tổng số mục dùng chung', visible: 'Hiển thị', markdownDetail: 'Chế độ xem chi tiết Markdown', filterPrefix: 'Lọc:', configurationRequired: 'Cần cấu hình', - countsUnavailable: 'Số lượng không có sẵn', + countsUnavailable: 'Không có số liệu', retryCounts: 'Số lần thử lại', filterPlaceholder: 'Lọc {{tab}} theo tên, mô tả hoặc đường dẫn', showing: 'Đang hiển thị {{visible}} trong số {{total}} {{tab}}', showingQuery: 'cho "{{query}}"', refreshing: '(đang làm mới...)', - loadingShared: 'Đang tải chia sẻ {{tab}}...', - failedLoadShared: 'Không tải được chia sẻ {{tab}}', + loadingShared: 'Đang tải {{tab}} dùng chung...', + failedLoadShared: 'Không tải được danh sách {{tab}} dùng chung', retry: 'Thử lại', noSharedFound: - 'Không tìm thấy {{tab}} được chia sẻ. Chạy `ccs sync` hoặc thêm các mục trong thư mục dùng chung của bạn.', + 'Không tìm thấy {{tab}} dùng chung. Chạy `ccs sync` hoặc thêm mục trong thư mục dùng chung của bạn.', noMatch: 'Không có {{tab}} khớp với "{{query}}".', selectOne: 'Chọn {{tab}} để xem toàn bộ nội dung.', pathLabel: 'Đường dẫn',