diff --git a/ui/src/lib/i18n.ts b/ui/src/lib/i18n.ts index 0d2f79a1..9be55403 100644 --- a/ui/src/lib/i18n.ts +++ b/ui/src/lib/i18n.ts @@ -2236,7 +2236,7 @@ const resources = { languageSwitcher: 'Ngôn ngữ', }, nav: { - general: 'Tổng quan', + general: 'Chung', home: 'Trang chủ', analytics: 'Phân tích', identityAccess: 'Nhận dạng & Quyền truy cập', @@ -2244,15 +2244,15 @@ const resources = { cliproxyPlus: 'CLIProxy Plus', cliproxyOverview: 'Tổng quan', controlPanel: 'Bảng điều khiển', - githubCopilot: 'Phi công phụ GitHub', - cursorIde: 'IDE con trỏ', + githubCopilot: 'GitHub Copilot', + cursorIde: 'Cursor IDE', accounts: 'Tài khoản', allAccounts: 'Tất cả tài khoản', sharedData: 'Dữ liệu được chia sẻ', compatibleClis: 'CLI tương thích', - factoryDroid: 'Nhà máy Droid', + factoryDroid: 'Factory Droid', system: 'Hệ thống', - health: 'Sức khỏe', + health: 'Trạng thái', settings: 'Cài đặt', openrouterTooltip: 'Hơn 349 mô hình qua OpenRouter', }, @@ -2260,8 +2260,8 @@ const resources = { profiles: 'Hồ sơ', cliproxy: 'CLIProxy', accounts: 'Tài khoản', - health: 'Sức khỏe', - configurationRequired: 'Yêu cầu cấu hình', + health: 'Trạng thái', + configurationRequired: 'Cần cấu hình', }, auth: { dashboardTitle: 'Bảng điều khiển CCS', @@ -2292,7 +2292,7 @@ const resources = { editTitle: 'Chỉnh sửa hồ sơ', createTitle: 'Tạo hồ sơ API', name: 'Tên', - namePlaceholder: 'api của tôi', + namePlaceholder: 'my-api', baseUrl: 'URL cơ sở', baseUrlPlaceholder: 'https://api.example.com', apiKey: 'Khóa API', @@ -2300,32 +2300,31 @@ const resources = { defaultModelHint: 'Để trống để sử dụng: {{model}}', modelMappingTitle: 'Lập bản đồ mô hình (Opus/Sonnet/Haiku)', modelMappingDesc: - 'Định cấu hình ID mô hình khác nhau cho mỗi cấp. Hữu ích cho các proxy API định tuyến các loại mô hình khác nhau đến các chương trình phụ trợ khác nhau.', + '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)', sonnetModel: 'Mô hình Sonnet (ANTHROPIC_DEFAULT_SONNET_MODEL)', haikuModel: 'Mô hình Haiku (ANTHROPIC_DEFAULT_HAIKU_MODEL)', cancel: 'Hủy bỏ', saving: 'Đang lưu...', update: 'Cập nhật', - create: 'Tạo nên', + create: 'Tạo', }, modelTierMapping: { title: 'Ánh xạ tầng mô hình', - advanced: 'Trình độ cao', + advanced: 'Nâng cao', description: 'Định cấu hình các mô hình khác nhau cho các cấp độ opus/sonnet/haiku của Claude Code.', autoSuggest: 'Tự động đề xuất dựa trên {{provider}}', - opusPlaceholder: 'ví dụ: nhân loại/claude-opus-4', - sonnetPlaceholder: 'ví dụ: nhân chủng học/claude-sonnet-4', - haikuPlaceholder: 'ví dụ: nhân loại/claude-3.5-haiku', + opusPlaceholder: 'vd: anthropic/claude-opus-4', + sonnetPlaceholder: 'ví dụ: anthropic/claude-sonnet-4', + haikuPlaceholder: 'vd: anthropic/claude-3.5-haiku', footer: - 'Các bộ này ANTHOPIC_DEFAULT_OPUS_MODEL, ANTHOPIC_DEFAULT_SONNET_MODEL, ANTHOPIC_DEFAULT_HAIKU_MODEL.', + 'Các biến này thiết lập ANTHROPIC_DEFAULT_OPUS_MODEL, ANTHROPIC_DEFAULT_SONNET_MODEL, ANTHROPIC_DEFAULT_HAIKU_MODEL.', }, envEditor: { sensitive: 'nhạy cảm', none: 'Không có biến môi trường nào được cấu hình.', - noneHint: - 'Thêm các biến bằng cách sử dụng thông tin đầu vào bên dưới hoặc chỉnh sửa trực tiếp JSON.', + noneHint: 'Thêm biến bằng ô nhập bên dưới hoặc chỉnh sửa trực tiếp JSON.', addVariable: 'Thêm biến môi trường', keyPlaceholder: 'VARIABLE_NAME', valuePlaceholder: 'giá trị', @@ -2335,16 +2334,16 @@ const resources = { variantNameRequired: 'Tên biến thể *', variantNamePlaceholder: 'ví dụ: my-gemini, g3, flash', invokeHintPrefix: 'Sử dụng tên này để gọi:', - model: 'Người mẫu', + model: 'Mô hình', modelPlaceholder: 'ví dụ: gemini-2.5-pro, claude-opus-4-5', choosePresetInstead: 'Thay vào đó hãy chọn từ các cài đặt trước', - selectModel: 'Chọn một mô hình', - customModelName: 'Tên mẫu tùy chỉnh...', - enterAnyModel: 'Nhập bất kỳ tên mẫu máy nào được CLIProxy hỗ trợ', + selectModel: 'Chọn mô hình', + customModelName: 'Tên mô hình tùy chỉnh...', + enterAnyModel: 'Nhập bất kỳ tên mô hình nào được CLIProxy hỗ trợ', defaultModel: 'Mặc định: {{model}}', - providerDefault: 'nhà cung cấp mặc định', - back: 'Mặt sau', - skip: 'Nhảy', + providerDefault: 'mặc định theo nhà cung cấp', + back: 'Quay lại', + skip: 'Bỏ qua', creating: 'Đang tạo...', createVariant: 'Tạo biến thể', skipHint: 'Bỏ qua nếu bạn chỉ muốn thêm tài khoản mà không tạo biến thể', @@ -2355,8 +2354,8 @@ const resources = { presetNamePlaceholder: 'ví dụ: Cấu hình 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ẫu mặc định', - defaultModelDesc: 'Được sử dụng khi không yêu cầu cấp độ cụ thể', + defaultModel: 'Mô hình mặc định', + defaultModelDesc: 'Dùng khi không yêu cầu cấp mô hình cụ thể', opusModel: 'Opus (Có khả năng nhất)', opusModelDesc: 'Đối với các nhiệm vụ lý luận phức tạp', sonnetModel: 'Sonnet (Cân bằng)', @@ -2369,17 +2368,17 @@ const resources = { }, componentModelSelector: { selectModel: 'Chọn mô hình', - availableModelsCount: 'Các mẫu có sẵn ({{count}})', + availableModelsCount: 'Mô hình khả dụng ({{count}})', preview: 'Xem trước', }, copilotSettings: { - enableCopilot: 'Kích hoạt phi công phụ', + enableCopilot: 'Bật Copilot', enableCopilotDesc: 'Cho phép sử dụng đăng ký GitHub Copilot', basicSettings: 'Cài đặt cơ bản', accountType: 'Loại tài khoản', accountTypeIndividual: 'Cá nhân', - accountTypeBusiness: 'Việc kinh doanh', - accountTypeEnterprise: 'Doanh nghiệp', + accountTypeBusiness: 'Doanh nghiệp', + accountTypeEnterprise: 'Enterprise', rateLimiting: 'Giới hạn tỷ lệ', rateLimitSeconds: 'Giới hạn tốc độ (giây)', noLimit: 'Không giới hạn', @@ -2391,7 +2390,7 @@ const resources = { }, providerModelSelector: { selectModel: 'Chọn mô hình', - noModelsForProvider: 'Không có mẫu nào cho nhà cung cấp này', + noModelsForProvider: 'Không có mô hình nào cho nhà cung cấp này', broken: 'BROKEN', deprecated: 'DEPRECATED', paid: 'PAID', @@ -2400,9 +2399,9 @@ const resources = { modelKnownIssues: 'Mô hình này có vấn đề đã biết', viewIssueDetails: 'Xem chi tiết vấn đề', modelDeprecated: 'Mô hình này không được dùng nữa', - recommended: 'Khuyến khích', - allModelsCount: 'Tất cả các mẫu ({{count}})', - noModelsAvailable: 'Không có mẫu nào có sẵn', + recommended: 'Đề xuất', + allModelsCount: 'Tất cả mô hình ({{count}})', + noModelsAvailable: 'Không có mô hình khả dụng', }, createAuthProfileDialog: { title: 'Tạo tài khoản mới', @@ -2414,52 +2413,52 @@ const resources = { 'Tên phải bắt đầu bằng một chữ cái và chỉ chứa các chữ cái, số, dấu gạch ngang hoặc dấu gạch dưới.', enableSharedHistory: 'Bật đồng bộ hóa lịch sử chia sẻ với các tài khoản xác thực ccs khác', historySyncGroupOptional: 'Nhóm đồng bộ hóa lịch sử (tùy chọn)', - historySyncGroupPlaceholder: 'mặc định, chạy nước rút-a, client-x', + historySyncGroupPlaceholder: 'default, sprint-a, client-x', historySyncGroupHint: 'Để trống để sử dụng nhóm chia sẻ mặc định. Dấu cách được chuẩn hóa thành dấu gạch ngang.', deeperContinuity: 'Nâng cao: chế độ liên tục sâu hơn', deeperContinuityHint: - 'Thêm đồng bộ hóa cho session-env, file-history, shell-snapshots và todos. Thông tin xác thực vẫn bị cô lập.', + 'Thêm đồng bộ cho session-env, file-history, shell-snapshots và todos. Thông tin xác thực vẫn tách biệt.', invalidContextGroup: 'Nhóm phải bắt đầu bằng một chữ cái và chỉ sử dụng các chữ cái, số, dấu gạch ngang hoặc dấu gạch dưới (tối đa {{max}} ký tự).', - command: 'Yêu cầu', + command: 'Lệnh', commandFallback: 'ccs auth create ', afterRunPrefix: 'Sau khi chạy lệnh:', afterRunStep1: 'Hoàn tất đăng nhập Claude trong trình duyệt của bạn', afterRunStep2: 'Quay lại đây và làm mới để xem tài khoản mới', poolingHint: - 'Thay vào đó, bạn muốn định tuyến Claude OAuth gộp lại? Sử dụng nhóm CLIProxy Claude từ nút hành động của trang Tài khoản.', + 'Muốn dùng định tuyến Claude OAuth dạng pool? Dùng CLIProxy Claude pool từ nút hành động ở trang Tài khoản.', close: 'Đóng', copied: 'Đã sao chép!', copyCommand: 'Sao chép lệnh', }, cliproxyModelCategory: { - google: 'Google (Song Tử)', + google: 'Google (Gemini)', openai: 'OpenAI (GPT)', - anthropic: 'Nhân loại (Claude)', - antigravity: 'phản trọng lực', + anthropic: 'Anthropic (Claude)', + antigravity: 'Antigravity', other: 'Khác', }, cliproxyOverviewComponents: { - availableModels: 'Các mẫu có sẵn', - noModelsAvailable: 'Không có mẫu nào có sẵn', - startSessionHint: 'Bắt đầu phiên CLIProxy để tìm nạp các mô hình có sẵn', + availableModels: 'Mô hình khả dụng', + noModelsAvailable: 'Không có mô hình khả dụng', + startSessionHint: 'Bắt đầu phiên CLIProxy để tải danh sách mô hình khả dụng', totalCount: 'tổng cộng {{count}}', availableThroughGroupedByProvider: - 'Các mô hình có sẵn đến {{backendLabel}}, được nhóm theo nhà cung cấp', + 'Các mô hình khả dụng qua {{backendLabel}}, được nhóm theo nhà cung cấp', moreCount: '+{{count}} thêm', }, categorizedModelSelector: { - selectModel: 'Chọn một mô hình', - noModelsAvailable: 'Không có mẫu nào có sẵn', - modelPlaceholder: 'Người mẫu...', + selectModel: 'Chọn mô hình', + noModelsAvailable: 'Không có mô hình khả dụng', + modelPlaceholder: 'Mô hình...', }, openrouterQuickStart: { - recommended: 'Khuyến khích', + recommended: 'Đề xuất', title: 'Bắt đầu với OpenRouter', description: 'Truy cập các mô hình {{modelCountLabel}} từ OpenAI, Anthropic, Google, Meta, v.v. - tất cả đều thông qua một API.', - featureOneApi: 'Một API, tất cả các nhà cung cấp', + featureOneApi: 'Một API cho mọi nhà cung cấp', featureTierMapping: 'Ánh xạ tầng mô hình', createOpenRouterProfile: 'Tạo hồ sơ OpenRouter', getApiKeyAt: 'Nhận khóa API của bạn tại', @@ -2474,18 +2473,18 @@ const resources = { neverUsed: 'Chưa bao giờ sử dụng', justNow: 'Vừa rồi', unknown: 'Không xác định', - daysAgo: '{{count}}ngày trước', + daysAgo: '{{count}} ngày trước', hoursAgo: '{{count}} giờ trước', minutesAgo: '{{count}} phút trước', }, proxyStatusWidget: { - justNow: 'ngay bây giờ', + justNow: 'vừa xong', minutesAgo: '{{count}} phút trước', hoursAgo: '{{count}} giờ trước', syncReady: 'Sẵn sàng đồng bộ hóa', noConfig: 'Không có cấu hình', remoteProxy: 'Proxy từ xa', - active: 'Tích cực', + active: 'Đang hoạt động', trafficAutoRouted: 'Lưu lượng truy cập tự động được định tuyến đến máy chủ từ xa', tooltipSync: 'Đồng bộ hóa hồ sơ với CLIProxy', tooltipRestart: 'Khởi động lại', @@ -2521,26 +2520,26 @@ const resources = { 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.', details: 'Chi tiết', - syncNow: 'Đồng bộ hóa ngay bây giờ', + 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.', createProfilesFirst: 'Trước tiên hãy tạo hồ sơ API bằng tab Hồ sơ.', - modelLabel: 'Người mẫu:', + modelLabel: 'Mô hình:', ready: 'Sẵn sàng', profilesToSync_one: '{{count}} hồ sơ để đồng bộ hóa', profilesToSync_other: '{{count}} hồ sơ cần đồng bộ hóa', cancel: 'Hủy bỏ', syncing: 'Đang đồng bộ hóa...', synced: 'Đã đồng bộ hóa!', - syncNow: 'Đồng bộ hóa ngay bây giờ', + syncNow: 'Đồng bộ ngay', }, errorLogs: { title: 'Nhật ký lỗi', - failedRequests_one: '{{count}} yêu cầu không thành công', - failedRequests_other: '{{count}} yêu cầu không thành công', + failedRequests_one: '{{count}} yêu cầu thất bại', + failedRequests_other: '{{count}} yêu cầu thất bại', cliproxyDiagnostics: 'Chẩn đoán CLIProxy', showingCount: 'Hiển thị 50 trong số {{total}} nhật ký', selectLog: 'Chọn nhật ký để xem chi tiết', @@ -2549,13 +2548,13 @@ const resources = { copyRawContent: 'Sao chép nội dung nhật ký thô', tabOverview: 'Tổng quan', tabHeaders: 'Tiêu đề', - tabRequest: 'Lời yêu cầu', - tabResponse: 'Phản ứng', - tabRaw: 'thô', - modelLabel: 'Người mẫu:', + tabRequest: 'Yêu cầu', + tabResponse: 'Phản hồi', + tabRaw: 'Raw', + modelLabel: 'Mô hình:', quotaResetsIn: 'Đặt lại hạn ngạch trong', - method: 'Phương pháp', - provider: 'nhà cung cấp', + method: 'Phương thức', + provider: 'Nhà cung cấp', version: 'Phiên bản', endpoint: 'Điểm cuối', url: 'URL', @@ -2563,19 +2562,18 @@ const resources = { na: 'không áp dụng', noHeaders: 'Không có tiêu đề nào', noRequestBody: 'Không có nội dung yêu cầu', - noResponseBody: 'Không có cơ quan phản hồi', + noResponseBody: 'Không có nội dung phản hồi', rateLimitedMsg: - 'Tỷ lệ giới hạn. Chuyển sang tài khoản khác hoặc đợi đặt lại hạn ngạch. Mẫu {{model}} đã hết hạn mức.', + 'Bị giới hạn tốc độ. Hãy chuyển sang tài khoản khác hoặc chờ reset hạn ngạch. Mô hình {{model}} đã hết quota.', rateLimitedMsgNoModel: - 'Tỷ lệ giới hạn. Chuyển sang tài khoản khác hoặc đợi đặt lại hạn ngạch.', + 'Bị giới hạn tốc độ. Hãy chuyển sang tài khoản khác hoặc chờ reset hạn ngạch.', authFailedMsg: 'Xác thực không thành công. Xác thực lại thông qua Cài đặt CLIProxy hoặc kiểm tra khóa API.', notFoundMsg: 'Không tìm thấy điểm cuối. Điểm cuối này có thể không tồn tại trên nhà cung cấp này.', serverErrorMsg: - 'Lỗi máy chủ từ thượng nguồn. Hãy thử lại sau hoặc kiểm tra trang trạng thái của nhà cung cấp.', - timeoutMsg: - 'Yêu cầu đã hết thời gian chờ. Kiểm tra kết nối mạng hoặc tăng cài đặt thời gian chờ.', + 'Lỗi máy chủ từ upstream. Hãy thử lại sau hoặc kiểm tra trang trạng thái của nhà cung cấp.', + timeoutMsg: 'Yêu cầu hết thời gian chờ. Kiểm tra kết nối mạng hoặc tăng timeout.', unknown: 'không rõ', }, editAccountContext: { @@ -2584,8 +2582,8 @@ const resources = { 'Định cấu hình cách "{{name}}" chia sẻ lịch sử và tính liên tục với các tài khoản xác thực ccs khác.', syncMode: 'Chế độ đồng bộ', selectContextMode: 'Chọn chế độ ngữ cảnh', - isolatedOption: 'bị cô lập (không đồng bộ)', - sharedOption: 'được chia sẻ (đã bật đồng bộ hóa)', + isolatedOption: 'tách biệt (không đồng bộ)', + sharedOption: 'chia sẻ (đã bật đồng bộ)', sharedModeHint: 'Chế độ chia sẻ sử dụng lại ngữ cảnh không gian làm việc cho các tài khoản trong cùng một nhóm đồng bộ lịch sử.', isolatedModeHint: @@ -2605,17 +2603,17 @@ const resources = { credentialsIsolated: 'Thông tin xác thực và .anthropic vẫn được tách riêng cho mỗi tài khoản ở tất cả các chế độ.', cancel: 'Hủy bỏ', - save: 'Cứu', + save: 'Lưu', saving: 'Đang lưu...', }, historySyncLearningMap: { title: 'Cách đồng bộ hóa lịch sử hoạt động', description: - 'Bị cô lập -> Được chia sẻ -> Sâu sắc hơn. Sử dụng Đồng bộ hóa mỗi hàng cho tất cả các thay đổi.', + 'Tách biệt -> Chia sẻ -> Sâu hơn. Dùng Sync trên từng dòng để áp dụng thay đổi.', learningMap: 'Bản đồ học tập', - isolated: 'Bị cô lập', + isolated: 'Tách biệt', shared: 'Đã chia sẻ', - deeper: 'sâu hơn', + deeper: 'Sâu hơn', cliproxyManaged_one: '{{count}} Tài khoản nhóm CLIProxy Claude được quản lý trong trang Action Center / CLIProxy.', cliproxyManaged_other: @@ -2632,15 +2630,15 @@ const resources = { name: 'Tên', type: 'Kiểu', defaultBadge: 'mặc định', - created: 'Tạo', + created: 'Ngày tạo', lastUsed: 'Được sử dụng lần cuối', historySync: 'Đồng bộ hóa lịch sử', - actions: 'hành động', + actions: 'Hành động', syncTitle: 'Chỉnh sửa chế độ đồng bộ, nhóm và độ sâu liên tục', confirmLegacyTitle: 'Xác nhận chế độ hiện tại của tài khoản cũ này là rõ ràng', sync: 'Đồng bộ hóa', confirm: 'Xác nhận', - active: 'Tích cực', + active: 'Đang hoạt động', setDefault: 'Đặt mặc định', deleteAccount: 'Xóa tài khoản', cannotDeleteDefault: 'Không thể xóa tài khoản mặc định', @@ -2651,12 +2649,12 @@ const resources = { deleteDialogDesc: '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 bỏ', + delete: 'Xóa', sharedGroupStandard: 'được chia sẻ ({{group}}, tiêu chuẩn)', - sharedGroupDeeper: 'đã chia sẻ ({{group}}, sâu hơn)', - sharedGroupLegacy: 'được chia sẻ ({{group}}, kế thừa tiêu chuẩn)', - isolatedLegacy: 'bị cô lập (mặc định cũ)', - isolated: 'bị cô lập', + 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ũ)', + isolated: 'tách biệt', }, addAccountDialog: { title: 'Thêm tài khoản {{displayName}}', @@ -2666,7 +2664,7 @@ const resources = { 'Nhấp vào Xác thực. Mã xác minh sẽ xuất hiện để bạn nhập vào trang web của nhà cung cấp.', descOauth: 'Nhấp vào Xác thực để nhận URL OAuth. Mở nó trong bất kỳ trình duyệt nào để đăng nhập.', - powerUserEnabled: 'Đã bật chế độ người dùng cấp quyền', + powerUserEnabled: 'Đã bật chế độ power user', powerUserSkipped: 'Danh sách kiểm tra trách nhiệm của AGY bị bỏ qua khỏi Cài đặt > Proxy. Bạn chấp nhận hoàn toàn trách nhiệm về rủi ro tài khoản/OAuth.', authMethod: 'Phương thức xác thực', @@ -2675,7 +2673,7 @@ const resources = { nicknameOptional: 'Biệt danh (tùy chọn)', nicknamePlaceholder: 'ví dụ: công việc, cá nhân', nicknameRequiredHint: - 'Cần thiết cho nhà cung cấp này. Sử dụng tên thân thiện duy nhất (ví dụ: cơ quan, cá nhân).', + 'Bắt buộc với nhà cung cấp này. Dùng tên thân thiện duy nhất (ví dụ: work, personal).', nicknameOptionalHint: 'Một cái tên thân thiện để xác định tài khoản này. Tự động tạo từ email nếu để trống.', waitingForAuth: 'Đang chờ xác thực...', @@ -2695,17 +2693,17 @@ const resources = { submitting: 'Đang gửi...', preparingUrl: 'Đang chuẩn bị URL đăng nhập...', cancel: 'Hủy bỏ', - importingToken: 'Đang nhập mã thông báo từ Kiro IDE...', + importingToken: 'Đang nhập token từ Kiro IDE...', authenticate: 'Xác thực', importFromIde: 'Nhập từ IDE', - importing: 'Đang nhập khẩu...', + importing: 'Đang nhập...', }, flowViz: { backToProviders: 'Quay lại nhà cung cấp', showDetails: 'Hiển thị chi tiết', hideDetails: 'Ẩn chi tiết', resetLayout: 'Đặt lại bố cục', - provider: 'nhà cung cấp', + provider: 'Nhà cung cấp', totalRequests: 'Tổng số yêu cầu', accounts: 'Tài khoản', connectionTimeline: 'Dòng thời gian kết nối', @@ -2729,13 +2727,13 @@ const resources = { pauseAccount: 'Tạm dừng tài khoản', quotaLoading: 'Hạn ngạch...', quota: 'hạn ngạch', - quotaUnavailable: 'Giới hạn hạn ngạch không có sẵn', + quotaUnavailable: 'Thông tin quota chưa khả dụng', reauthNeeded: 'Reauth cần thiết', 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', }, antigravityChecklist: { - title: 'Trách nhiệm OAuth chống trọng lực', + title: 'Trách nhiệm OAuth Antigravity', subtitle: 'Hoàn thành tất cả 4 bước trước khi bạn có thể xác thực.', mandatory: 'Bắt buộc', completion: 'Hoàn thành', @@ -2745,7 +2743,7 @@ const resources = { title: 'Cảnh báo an toàn tài khoản OAuth', subtitle: 'Vấn đề #509 · Rủi ro Gemini + AGY OAuth', firstLine: - 'Vấn đề số 509 báo cáo về việc đình chỉ/cấm tài liệu gắn liền với ccs agy và việc sử dụng tài khoản chung giữa ccs gemini và ccs agy.', + 'Issue #509 ghi nhận các trường hợp bị đình chỉ/cấm liên quan đến ccs agy và việc dùng chung tài khoản giữa ccs gemini và ccs agy.', secondLine: 'Chỉ tiếp tục nếu bạn chấp nhận hoàn toàn trách nhiệm về OAuth và rủi ro truy cập tài khoản.', issueLabel: 'Đọc vấn đề #509', @@ -2753,10 +2751,10 @@ const resources = { }, cliproxyDialog: { name: 'Tên', - provider: 'nhà cung cấp', + provider: 'Nhà cung cấp', account: 'Tài khoản', accountOptional: 'Tài khoản (tùy chọn)', - model: 'Người mẫu', + model: 'Mô hình', modelOptional: 'Mô hình (tùy chọn)', defaultTarget: 'Mục tiêu mặc định', defaultTier: 'Cấp mặc định', @@ -2764,21 +2762,21 @@ const resources = { selectProvider: 'Chọn nhà cung cấp...', useDefaultAccount: 'Sử dụng tài khoản mặc định', defaultSuffix: '(mặc định)', - opus: 'tác phẩm', - sonnet: 'bài sonnet', - haiku: 'thơ haiku', - claudeCode: 'Mã Claude', - factoryDroid: 'Nhà máy Droid', + opus: 'Opus', + sonnet: 'Sonnet', + haiku: 'Haiku', + claudeCode: 'Claude Code', + factoryDroid: 'Factory Droid', cancel: 'Hủy bỏ', - create: 'Tạo nên', + create: 'Tạo', creating: 'Đang tạo...', saveChanges: 'Lưu thay đổi', saving: 'Đang lưu...', - placeholderName: 'Song Tử của tôi', + placeholderName: 'Gemini của tôi', placeholderModel: 'gemini-2.5-pro', - placeholderComposite: 'tổng hợp của tôi', - placeholderModelId: 'id mẫu', - placeholderAccountId: 'id tài khoản', + placeholderComposite: 'my-composite', + 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}}', }, @@ -2795,14 +2793,14 @@ const resources = { overrideToClaude: 'Ghi đè lên Claude', overrideToClaudeExplicit: 'Ghi đè lên Claude (rõ ràng)', setAsDefault: 'Đặt làm mặc định', - provider: 'nhà cung cấp', - custom: 'Phong tục', + provider: 'Nhà cung cấp', + custom: 'Tùy chỉnh', }, settings: { sectionLoadFailed: 'Không tải được phần', unknownError: 'Đã xảy ra lỗi không xác định', reloadPage: 'Tải lại trang', - refresh: 'Làm cho khỏe lại', + refresh: 'Làm mới', copy: 'Sao chép', copied: 'Đã sao chép', saved: 'Đã lưu', @@ -2812,23 +2810,23 @@ const resources = { settingsTabs: { web: 'Web', env: 'Env', - think: 'Nghĩ', - proxy: 'ủy quyền', + think: 'Thinking', + proxy: 'Proxy', auth: 'Xác thực', - backup: 'Hỗ trợ', + backup: 'Sao lưu', }, settingsAuth: { - failedFetchTokens: 'Không tìm nạp được mã thông báo xác thực', - failedSaveTokens: 'Không lưu được mã thông báo', - tokensUpdated: 'Đã cập nhật mã thông báo. Khởi động lại CLIProxy để áp dụng.', + failedFetchTokens: 'Không thể tải token xác thực', + failedSaveTokens: 'Không thể lưu token', + tokensUpdated: 'Đã cập nhật token. Khởi động lại CLIProxy để áp dụng.', failedRegenerate: 'Không thể tạo lại bí mật', secretRegenerated: 'Bí mật quản lý mới được tạo. Khởi động lại CLIProxy để áp dụng.', - failedReset: 'Không thể đặt lại mã thông báo', - tokensReset: 'Mã thông báo được đặt lại về mặc định. Khởi động lại CLIProxy để áp dụng.', + failedReset: 'Không thể đặt lại token', + tokensReset: 'Token đã được đặt lại về mặc định. Khởi động lại CLIProxy để áp dụng.', description: - 'Định cấu hình mã thông báo xác thực CLIProxy. Các thay đổi yêu cầu khởi động lại CLIProxy.', + '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: 'Phong tục', + custom: 'Tùy chỉnh', apiKeyDesc: 'Được sử dụng bởi Claude Code để xác thực bằng CLIProxy', apiKeyPlaceholder: 'Khóa API', managementSecret: 'Bí mật quản lý', @@ -2838,23 +2836,23 @@ const resources = { resetDefaults: 'Đặt lại về mặc định', resetDesc: 'Đặt lại cả khóa API và bí mật quản lý về giá trị mặc định.', saving: 'Đang lưu...', - save: 'Cứu', + save: 'Lưu', }, settingsGlobalEnv: { description: - 'Các biến môi trường được đưa vào tất cả các hồ sơ đăng ký không phải của Claude (gemini, codex, agy, ghcp, v.v.)', + '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.)', enabled: 'Đã bật Env toàn cầu', disabled: 'Env toàn cầu bị vô hiệu hóa', - enabledDesc: 'Các lọ Env sẽ được đưa vào hồ sơ của bên thứ ba', - disabledDesc: 'Env vars sẽ không được tiêm', + 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', addNew: 'Thêm biến mới', keyName: 'KEY_NAME', value: 'giá trị', - add: 'Thêm vào', + add: 'Thêm', quickAdd: 'Thêm nhanh các biến phổ biến', - allConfigured: 'Tất cả các biến chung được cấu hình', + allConfigured: 'Tất cả biến phổ biến đã được cấu hình', }, settingsBackups: { failedFetch: 'Không tìm nạp được bản sao lưu', @@ -2881,26 +2879,25 @@ const resources = { 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', - noneConfiguredHint: - 'Cài đặt công cụ CLI để kích hoạt các nhà cung cấp dịch vụ tìm kiếm trên web', + 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', notInstalled: 'chưa được cài đặt', - model: 'Người mẫu:', + model: 'Mô hình:', howInstall: 'Cách cài đặt {{name}} CLI', installGlobally: 'Cài đặt trên toàn cầu', - requiresKey: '(yêu cầu khóa API xAI)', + requiresKey: '(cần khóa API xAI)', freeTier: '(Có sẵn cấp MIỄN PHÍ)', viewDocs: 'Xem tài liệu', }, settingsProxy: { - failedLoadAgyMode: 'Không tải được chế độ người dùng cấp nguồn AGY', - failedUpdateAgyMode: 'Không thể cập nhật chế độ người dùng thành thạo AGY', - failedVerifyAgyMode: 'Không thể xác minh tính bền vững của chế độ người dùng cấp nguồn AGY', + failedLoadAgyMode: 'Không thể tải chế độ power user AGY', + failedUpdateAgyMode: 'Không thể cập nhật chế độ power user AGY', + failedVerifyAgyMode: 'Không thể xác minh trạng thái lưu của chế độ power user AGY', notPersistedAgyMode: - 'Chế độ sử dụng nguồn AGY không được duy trì. Cấu hình có thể đã được sửa đổi bởi một quy trình khác.', - agyModeEnabled: 'Đã bật chế độ người dùng cấp nguồn AGY.', - agyModeDisabled: 'Chế độ người dùng có quyền lực AGY bị tắt.', + 'Chế độ power user AGY chưa được lưu bền vững. Cấu hình có thể đã bị tiến trình khác sửa.', + agyModeEnabled: 'Đã bật chế độ power user AGY.', + agyModeDisabled: 'Đã tắt chế độ power user AGY.', typePhraseToContinue: 'Nhập "{{value}}" để tiếp tục.', description: 'Định cấu hình kết nối {{backend}} cục bộ hoặc từ xa cho cấu hình dựa trên proxy', @@ -2908,61 +2905,61 @@ const resources = { backend: 'CLIProxy', instanceStatus: 'Trạng thái phiên bản', connectionMode: 'Chế độ kết nối', - local: 'Địa phương', - remote: 'Xa', + local: 'Cục bộ', + 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: 'Nhị phân phụ trợ', + backendBinary: 'Binary backend', stopProxyToSwitch: - 'Dừng proxy đang chạy trong Trạng thái phiên bản để chuyển đổi chương trình phụ trợ.', + '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', plusDesc: 'Hỗ trợ nhà cung cấp đầy đủ bao gồm Kiro và GitHub Copilot', - originalDesc: 'Nhị phân gốc (chỉ Gemini, Codex, AntiGravity)', + originalDesc: 'Binary gốc (chỉ Gemini, Codex, Antigravity)', variantsIncompatible: 'Các biến thể Kiro/Copilot hiện tại sẽ không hoạt động với CLIProxyAPI. Chuyển sang CLIProxyAPIPlus hoặc xóa các biến thể đó.', - safety: 'Sự an toàn', - agyModeTitle: 'Chế độ người dùng năng lượng chống trọng lực', + safety: 'An toàn', + agyModeTitle: 'Chế độ power user Antigravity', agyModeDesc: 'Bỏ qua danh sách kiểm tra trách nhiệm AGY trong quy trình Thêm tài khoản và `ccs agy`.', agyWarning: 'Chỉ sử dụng nếu bạn hiểu đầy đủ về mẫu rủi ro bị đình chỉ/cấm OAuth (#509). CCS không thể chịu trách nhiệm về việc mất tài khoản.', - finalConfirm: 'Yêu cầu xác nhận cuối cùng', + finalConfirm: 'Xác nhận cuối cùng', finalConfirmDesc: 'Việc bật tính năng này sẽ bỏ qua các điểm kiểm tra an toàn AGY trong cả bảng điều khiển và CLI. Xem lại vấn đề #509 và nhập cụm từ chính xác để tiếp tục.', step1: 'Bước 1', readIssue: 'Đọc vấn đề #509', step2: 'Bước 2', - typePrefix: 'Kiểu', + 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', - exactPhrase: 'Yêu cầu chính xác cụm từ.', - enableAgyMode: 'Bật Chế độ người dùng cấp cao', - toggleAgyMode: 'Chuyển đổi chế độ người dùng thành thạo AGY', + 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', fallbackSettings: 'Cài đặt dự phòng', enableFallback: 'Cho phép dự phòng về cục bộ', enableFallbackDesc: 'Sử dụng proxy cục bộ nếu không thể truy cập được từ xa', autoStartLocal: 'Tự động khởi động proxy cục bộ', autoStartLocalDesc: 'Tự động khởi động proxy cục bộ khi dự phòng', - advanced: 'Trình độ cao', + advanced: 'Nâng cao', debugMode: 'Chế độ gỡ lỗi', debugModeDesc: 'Bật chẩn đoán dành cho nhà phát triển trong bảng điều khiển trình duyệt', debugModeEnabled: 'Đã bật chế độ gỡ lỗi. Kiểm tra bảng điều khiển trình duyệt để biết nhật ký chi tiết.', localProxy: 'Proxy cục bộ', - port: 'Cảng', + port: 'Cổng', autoStart: 'Tự động khởi động', localAutoStartDesc: 'Tự động khởi động proxy cục bộ khi cần', remoteConfigTitle: 'Cấu hình máy chủ từ xa', - host: 'Chủ nhà', + host: 'Host', hostPlaceholder: '192.168.1.100 hoặc proxy.example.com', defaultPort: 'mặc định: {{value}}', - portPlaceholder: 'Để trống trong {{value}}', + portPlaceholder: 'Để trống để dùng {{value}}', protocol: 'Giao thức', http: 'HTTP', https: 'HTTPS', apiKeyOptional: 'Khóa API (tùy chọn)', apiKeyPlaceholder: 'Đối với điểm cuối API /v1/*', - apiKeyDesc: 'Được sử dụng cho các yêu cầu API tới /v1/chat/completions', + 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: @@ -2979,7 +2976,7 @@ const resources = { settingsThinking: { description: 'Định cấu hình tư duy/lý luận mở rộng cho các mô hình được hỗ trợ.', supportedProviders: 'Nhà cung cấp được hỗ trợ', - modeTitle: 'Chế độ suy nghĩ', + modeTitle: 'Chế độ Thinking', modeAutoDesc: 'Tự động thiết lập tư duy dựa trên tầng mô hình', modeOffDesc: 'Vô hiệu hóa suy nghĩ mở rộng', modeManualDesc: 'Đặt mức ghi đè liên tục hoặc sử dụng cờ CLI mỗi lần chạy', @@ -2997,18 +2994,18 @@ const resources = { showWarningsDesc: 'Hiển thị cảnh báo khi các giá trị suy nghĩ bị hạn chế hoặc điều chỉnh', cliEnvOverride: 'Ghi đè CLI & Env', supportLine1Prefix: 'Ngân sách suy nghĩ:', - supportLine1Suffix: '(dựa trên mã thông báo)', + supportLine1Suffix: '(dựa trên token)', supportLine2Prefix: 'Nỗ lực lý luận:', - supportLine2SuffixPrefix: '(hậu tố hoặc', - supportLine2SuffixPostfix: ': trung bình/cao/xcao)', - supportLine3Prefix: 'Nỗ lực ghim hậu tố Codex (ví dụ:', - supportLine3Suffix: '); các mô hình không có hậu tố sẽ sử dụng chế độ Suy nghĩ.', + supportLine2SuffixPrefix: '(hậu tố hoặc ', + supportLine2SuffixPostfix: ': medium/high/xhigh)', + supportLine3Prefix: 'Hậu tố Codex cố định mức effort (ví dụ ', + supportLine3Suffix: '); model không hậu tố sẽ dùng chế độ Thinking.', }, analytics: { title: 'Phân tích', subtitle: 'Theo dõi việc sử dụng và thông tin chi tiết', month: 'Tháng', - allTime: 'mọi lúc', + allTime: 'Tất cả thời gian', updated: 'Đã cập nhật {{value}}', }, analyticsSummary: { @@ -3016,11 +3013,11 @@ const resources = { totalTokensSubtitle: '{{input}} vào / {{output}} ra', totalCost: 'Tổng chi phí', totalCostSubtitle: 'trung bình ${{value}}/ngày', - cacheTokens: 'Mã thông báo bộ đệm', + cacheTokens: 'Token bộ đệm', cacheTokensSubtitle: '${{cost}} ({{percent}}% chi phí)', inputCost: 'Chi phí đầu vào', outputCost: 'Chi phí đầu ra', - tokensSubtitle: '{{value}} mã thông báo', + tokensSubtitle: '{{value}} token', }, apiProfiles: { title: 'Hồ sơ API', @@ -3040,7 +3037,7 @@ const resources = { 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.', - delete: 'Xóa bỏ', + delete: 'Xóa', unsavedChangesTitle: 'Những thay đổi chưa được lưu', unsavedChangesDesc: 'Bạn có những thay đổi chưa được lưu trong "{{current}}". Hủy và chuyển sang "{{next}}"?', @@ -3049,12 +3046,12 @@ const resources = { accountsPage: { title: 'Tài khoản', managePrefix: 'Quản lý', - manageSuffix: 'tài khoản và giới thiệu nhóm từ một bảng điều khiển.', + manageSuffix: 'tài khoản và nhóm đồng bộ từ một nơi.', mobileManageSuffix: 'tính liên tục cho mỗi tài khoản.', primaryActions: 'Hành động chính', createAccount: 'Tạo tài khoản', authClaudeInPool: 'Xác thực Claude trong Pool', - openClaudePoolSettings: 'Mở cài đặt hồ bơi Claude', + openClaudePoolSettings: 'Mở cài đặt Claude pool', openCliProxyClaudePool: 'Mở CLIProxy Claude Pool', migrationFollowup: 'Theo dõi di chuyển', legacyContextPending: '{{count}} tài khoản vẫn cần xác nhận chế độ lần đầu.', @@ -3073,11 +3070,11 @@ const resources = { 'Chỉ đồng bộ hóa không gian làm việc của dự án. Mặc định tốt nhất cho hầu hết các đội.', sharedDeeper: 'Chia sẻ sâu hơn', sharedDeeperPrefix: 'Thêm', - isolated: 'Bị cô lập', + isolated: 'Tách biệt', isolatedDesc: 'Không có liên kết. Tốt nhất cho sự tách biệt nghiêm ngặt.', quickCommands: 'Lệnh nhanh', quickCommandsDesc: 'Sao chép và chạy trong terminal.', - workspaceBadge: 'ccs auth Không gian làm việc', + workspaceBadge: 'Không gian làm việc `ccs auth`', historySyncBadge: 'Kiểm soát đồng bộ hóa lịch sử', authAccounts: 'Tài khoản xác thực', tableScopePrefix: 'Bảng này được cố ý đặt trong phạm vi', @@ -3089,24 +3086,24 @@ const resources = { loadingAccounts: 'Đang tải tài khoản...', }, health: { - justNow: 'ngay bây giờ', + justNow: 'vừa xong', secondsAgo: '{{count}} giây trước', minutesAgo: '{{count}} phút trước', hoursAgo: '{{count}} giờ trước', systemHealth: 'Tình trạng hệ thống', - build: 'xây dựng {{version}}', + build: 'bản dựng {{version}}', lastScan: 'Lần quét cuối cùng:', autoRefresh: 'Tự động làm mới:', - refresh: 'Làm cho khỏe lại', - checks: 'Séc', + refresh: 'Làm mới', + checks: 'Kiểm tra', version: 'Phiên bản', platform: 'Nền tảng', liveMonitoring: 'Giám sát trực tiếp đang hoạt động', copied: 'Đã sao chép vào bảng nhớ tạm', - refreshing: 'Kiểm tra sức khoẻ mới...', + refreshing: 'Đang làm mới trạng thái...', fix: 'Sửa chữa', applyFix: 'Áp dụng bản sửa lỗi', - healthLabel: 'sức khỏe', + healthLabel: 'trạng thái', }, updates: { actionRequired: 'Hành động bắt buộc', @@ -3118,11 +3115,11 @@ const resources = { needsAction: 'Cần hành động', doneCount: 'Xong', searchPlaceholder: 'Tìm kiếm hành động hoặc lệnh', - noNotices: 'Không có thông báo phù hợp với quan điểm này.', + 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.', published: 'Đã xuất bản {{date}}', markDone: 'Đánh dấu là xong', - dismiss: 'Miễn nhiệm', + dismiss: 'Ẩn', reopen: 'Mở lại', doNext: 'Làm tiếp theo', impactedIntegrations: 'Tích hợp bị ảnh hưởng', @@ -3142,13 +3139,13 @@ const resources = { }, cliproxyPage: { connected: 'Đã kết nối', - notConnected: 'Không được kết nối', - variant: 'khác nhau', - parentNotConnected: 'Phụ huynh không được kết nối', + notConnected: 'Chưa kết nối', + variant: 'Biến thể', + parentNotConnected: 'Profile gốc chưa kết nối', viaProvider: 'qua {{provider}}', emptyTitle: 'Trình quản lý hồ sơ CCS', emptyDesc: - 'Quản lý xác thực OAuth, tùy chọn tài khoản và lựa chọn mô hình cho nhà cung cấp CLIProxy. Định cấu hình cách CCS định tuyến các yêu cầu đến các chương trình phụ trợ AI khác nhau.', + 'Quản lý xác thực OAuth, tùy chọn tài khoản và chọn mô hình cho nhà cung cấp CLIProxy. Cấu hình cách CCS định tuyến yêu cầu đến các backend AI khác nhau.', emptyControlPanelPrefix: 'Để biết số liệu thống kê sử dụng trực tiếp và theo dõi thời gian thực, hãy truy cập', controlPanel: 'Bảng điều khiển', @@ -3162,7 +3159,7 @@ const resources = { variantDisplay: '{{name}} (biến thể {{provider}})', }, copilotPage: { - title: 'Phi công phụ', + title: 'Copilot', subtitle: 'Proxy GitHub Copilot', setup: 'Cài đặt', auth: 'Xác thực', @@ -3171,13 +3168,13 @@ const resources = { unofficialItem1: 'API được thiết kế ngược - có thể bị hỏng bất cứ lúc nào', unofficialItem2: 'Việc sử dụng quá mức có thể gây ra hạn chế tài khoản', unofficialItem3: 'Không bảo hành, không chịu trách nhiệm từ CCS', - yes: 'Đúng', - no: 'KHÔNG', + yes: 'Có', + no: 'Không', installed: 'Đã cài đặt', - missing: 'Mất tích', + missing: 'Thiếu', integration: 'Tích hợp', enabled: 'Đã bật', - disabled: 'Tàn tật', + disabled: 'Đã tắt', github: 'GitHub', connected: 'Đã kết nối', notConnected: 'Chưa kết nối', @@ -3186,21 +3183,21 @@ const resources = { status: 'Trạng thái', running: 'Đang chạy', stopped: 'Đã dừng', - port: 'Cảng', + port: 'Cổng', stopping: 'Đang dừng...', stop: 'Dừng lại', starting: 'Đang bắt đầu...', start: 'Bắt đầu', installing: 'Đang cài đặt...', installCopilotApi: 'Cài đặt copilot-api', - proxy: 'ủy quyền', - active: 'Tích cực', + proxy: 'Proxy', + active: 'Đang hoạt động', inactive: 'Không hoạt động', }, cursorPage: { - title: 'Con trỏ', - beta: 'bản thử nghiệm', - subtitle: 'Điều khiển tích hợp con trỏ chuyên dụng', + title: 'Cursor', + beta: 'Beta', + subtitle: 'Bảng điều khiển tích hợp Cursor', unofficialTitle: 'API không chính thức - Bạn phải tự chịu rủi ro khi sử dụng', unofficialItem1: 'Tích hợp thiết kế ngược có thể bị hỏng bất cứ lúc nào', unofficialItem2: 'Lạm dụng hoặc sử dụng quá mức có thể có nguy cơ bị hạn chế tài khoản', @@ -3209,92 +3206,92 @@ const resources = { authentication: 'Xác thực', daemon: 'Daemon', enabled: 'Đã bật', - disabled: 'Tàn tật', + disabled: 'Đã tắt', expired: 'Hết hạn', connected: 'Đã kết nối', - notConnected: 'Không được kết nối', + notConnected: 'Chưa kết nối', running: 'Đang chạy', stopped: 'Đã dừng', - actions: 'hành động', + actions: 'Hành động', disableIntegration: 'Vô hiệu hóa tích hợp', enableIntegration: 'Kích hoạt tích hợp', autoDetectAuth: 'Tự động phát hiện xác thực', manualAuthImport: 'Nhập xác thực thủ công', stopDaemon: 'Dừng Daemon', startDaemon: 'Khởi động Daemon', - port: 'Cảng', - configuration: 'Cấu hình con trỏ', + port: 'Cổng', + configuration: 'Cấu hình Cursor', lastModified: 'Sửa đổi lần cuối:', neverSaved: 'Chưa bao giờ lưu', saving: 'Đang lưu...', - save: 'Cứu', + save: 'Lưu', modelConfig: 'Cấu hình mô hình', settings: 'Cài đặt', info: 'Thông tin', - presets: 'cài đặt trước', + presets: 'Cài đặt sẵn', presetsDesc: 'Áp dụng ánh xạ mô hình được cấu hình sẵn', modelMapping: 'Ánh xạ mô hình', modelMappingDesc: 'Định cấu hình mô hình nào sẽ sử dụng cho từng tầng', - defaultModel: 'Mẫu mặc định', - defaultModelDesc: 'Được sử dụng khi không có yêu cầu cấp độ cụ thể.', + defaultModel: 'Mô hình mặc định', + defaultModelDesc: 'Dùng khi không chỉ định tier cụ thể.', opusModel: 'Opus (Có khả năng nhất)', opusModelDesc: 'Lý luận phức tạp và phản hồi chất lượng cao nhất.', sonnetModel: 'Sonnet (Cân bằng)', sonnetModelDesc: 'Khối lượng công việc mã hóa chung và trò chuyện hàng ngày.', haikuModel: 'Haiku (Nhanh)', - haikuModelDesc: 'Đường dẫn yêu cầu có độ trễ thấp và nhẹ.', + haikuModelDesc: 'Đường dẫn yêu cầu nhẹ, độ trễ thấp.', runtimeSettings: 'Cài đặt thời gian chạy', autoStartDaemon: 'Daemon tự động khởi động', - autoStartDesc: 'Tự động khởi động daemon con trỏ khi sử dụng tích hợp.', + autoStartDesc: 'Tự động khởi động daemon Cursor khi dùng tích hợp.', ghostMode: 'Chế độ ma', - ghostModeDesc: 'Yêu cầu chế độ x-ghost để giảm việc đo từ xa.', - provider: 'nhà cung cấp', + ghostModeDesc: 'Gửi x-ghost-mode để giảm telemetry.', + provider: 'Nhà cung cấp', filePath: 'Đường dẫn tệp', - availableModels: 'Các mẫu có sẵn', + availableModels: 'Mô hình khả dụng', loadingModels: 'Đang tải mô hình...', noModels: 'Chưa có siêu dữ liệu mô hình nào. Bắt đầu daemon và làm mới.', default: 'Mặc định', rawConfiguration: 'Cấu hình thô (JSON)', - manualImportTitle: 'Nhập xác thực con trỏ thủ công', + manualImportTitle: 'Nhập xác thực Cursor thủ công', manualImportDesc: - 'Cung cấp mã thông báo truy cập con trỏ và ID máy nếu tính năng tự động phát hiện không khả dụng.', - accessToken: 'Mã thông báo truy cập', - accessTokenPlaceholder: 'Dán mã thông báo truy cập con trỏ', + 'Cung cấp access token và machine ID của Cursor nếu không tự phát hiện được.', + accessToken: 'Access token', + accessTokenPlaceholder: 'Dán access token của Cursor', machineId: 'ID máy', machineIdPlaceholder: 'Hex 32 ký tự (UUID không có dấu gạch nối)', cancel: 'Hủy bỏ', - import: 'Nhập khẩu', + import: 'Nhập', selectModel: 'Chọn mô hình', useDefaultModel: 'Sử dụng mô hình mặc định', - availableModelCount: 'Các mẫu có sẵn ({{count}})', + availableModelCount: 'Mô hình khả dụng ({{count}})', invalidPort: 'Cổng phải là số nguyên từ 1 đến 65535', defaultModelRequired: 'Mô hình mặc định là bắt buộc', - savedConfig: 'Đã lưu cấu hình con trỏ và ánh xạ mô hình', + 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.', - noModelsAvailable: 'Chưa có mẫu nào. Khởi động daemon và làm mới trước.', + 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', - integrationEnabled: 'Đã bật tích hợp con trỏ', - integrationDisabled: 'Tích hợp con trỏ bị vô hiệu hóa', + 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', - credentialsImported: 'Thông tin xác thực con trỏ đã được nhập', + credentialsImported: 'Đã nhập thông tin xác thực Cursor', autoDetectFailed: 'Tự động phát hiện không thành công', - manualRequired: 'Cần có mã thông báo và ID máy', + manualRequired: 'Cần token và machine ID', manualImportFailed: 'Nhập thủ công không thành công', failedStartDaemon: 'Không thể khởi động daemon', - daemonStarted: 'Daemon bắt đầu', + daemonStarted: 'Đã khởi động daemon', daemonStartedWithPid: 'Daemon đã khởi động (PID: {{pid}})', failedStopDaemon: 'Không thể dừng daemon', - daemonStopped: 'Daemon dừng lại', + daemonStopped: 'Đã dừng daemon', rawLoading: 'Cài đặt thô vẫn đang tải. Vui lòng đợi và thử lại.', invalidJson: 'JSON không hợp lệ', rawSaved: 'Đã lưu cài đặt thô', rawChanged: 'Cài đặt thô đã thay đổi bên ngoài. Làm mới và thử lại.', failedSaveRaw: 'Không lưu được cài đặt thô', - savedAll: 'Đã lưu cấu hình con trỏ', + savedAll: 'Đã lưu cấu hình Cursor', }, droidPage: { loadingDiagnostics: 'Đang tải chẩn đoán Droid...', @@ -3312,14 +3309,14 @@ const resources = { version: 'Phiên bản', overridePath: 'Ghi đè (CCS_DROID_PATH)', configFiles: 'Tệp cấu hình', - path: 'Con đường', + path: 'Đường dẫn', resolved: 'Đã giải quyết', size: 'Kích cỡ', lastModified: 'Sửa đổi lần cuối', parseWarning: 'Cảnh báo phân tích cú pháp: {{value}}', readWarning: 'Đọc cảnh báo: {{value}}', warnings: 'Cảnh báo', - byokSummary: 'BYOK Tóm tắt', + byokSummary: 'Tóm tắt BYOK', activeModelSelector: 'Bộ chọn mô hình hoạt động', customModels: 'Mô hình tùy chỉnh', ccsManaged: 'do CCS quản lý', @@ -3328,12 +3325,12 @@ const resources = { providers: 'Nhà cung cấp', none: 'không có', customModelsTitle: 'Mô hình tùy chỉnh', - modelName: 'Tên/Mẫu mã', - provider: 'nhà cung cấp', + modelName: 'Tên/model', + provider: 'Nhà cung cấp', baseUrl: 'URL cơ sở', noCustomModels: 'Không có mô hình tùy chỉnh', docsAlignedNotes: 'Ghi chú được căn chỉnh trong Tài liệu', - factoryDocs: 'Tài liệu nhà máy', + factoryDocs: 'Tài liệu Factory', providerFactCheckDocs: 'Tài liệu kiểm tra thực tế của nhà cung cấp', providerValues: 'Giá trị của nhà cung cấp: {{value}}', settingsHierarchy: 'Phân cấp cài đặt: {{value}}', @@ -3352,20 +3349,20 @@ const resources = { sharedPage: { commands: 'Lệnh', skills: 'Kỹ năng', - agents: 'Đại lý', + agents: 'Agent', title: 'Dữ liệu được chia sẻ', - subtitle: 'Các lệnh, kỹ năng và đặc vụ được chia sẻ trên các phiên bản của Claude', + 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ẻ', - visible: 'Dễ thấy', - markdownDetail: 'Chế độ xem chi tiết đánh dấu', + visible: 'Hiển thị', + markdownDetail: 'Chế độ xem chi tiết Markdown', filterPrefix: 'Lọc:', - configurationRequired: 'Yêu cầu cấu hình', + configurationRequired: 'Cần cấu hình', countsUnavailable: 'Số lượng không có sẵn', 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: '(mới mẻ...)', + refreshing: '(đang làm mới...)', loadingShared: 'Đang tải chia sẻ {{tab}}...', failedLoadShared: 'Không tải được chia sẻ {{tab}}', retry: 'Thử lại', @@ -3373,12 +3370,12 @@ const resources = { '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.', noMatch: 'Không có {{tab}} khớp với "{{query}}".', selectOne: 'Chọn {{tab}} để xem toàn bộ nội dung.', - pathLabel: 'Con đường', + pathLabel: 'Đường dẫn', resolvedSource: 'Nguồn đã giải quyết', - loadingMarkdown: 'Đang tải nội dung đánh dấu...', + loadingMarkdown: 'Đang tải nội dung Markdown...', failedLoadContent: 'Không tải được nội dung', retryContent: 'Thử lại nội dung', - noMarkdown: 'Không có nội dung đánh dấu có sẵn.', + noMarkdown: 'Không có nội dung Markdown khả dụng.', }, }, },