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',