i18ntk 4.7.0 → 4.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/CHANGELOG.md +34 -1
  2. package/README.md +15 -4
  3. package/main/i18ntk-ui.js +35 -30
  4. package/main/i18ntk-usage.js +2 -2
  5. package/main/i18ntk-validate.js +1 -1
  6. package/main/manage/commands/ValidateCommand.js +1 -1
  7. package/main/manage/index.js +52 -47
  8. package/main/manage/managers/LanguageMenu.js +3 -1
  9. package/main/manage/services/ConfigurationService.js +1 -1
  10. package/main/manage/services/FrameworkDetectionService.js +1 -1
  11. package/main/manage/services/UsageService.js +2 -2
  12. package/package.json +11 -7
  13. package/settings/settings-manager.js +19 -3
  14. package/ui-locales/ar.json +2636 -0
  15. package/ui-locales/cs.json +2636 -0
  16. package/ui-locales/de.json +17 -1
  17. package/ui-locales/el.json +2636 -0
  18. package/ui-locales/en.json +17 -1
  19. package/ui-locales/es.json +17 -1
  20. package/ui-locales/fr.json +17 -1
  21. package/ui-locales/he.json +2636 -0
  22. package/ui-locales/hi.json +2636 -0
  23. package/ui-locales/hu.json +2636 -0
  24. package/ui-locales/it.json +2636 -0
  25. package/ui-locales/ja.json +17 -1
  26. package/ui-locales/ko.json +2636 -0
  27. package/ui-locales/nl.json +2636 -0
  28. package/ui-locales/pl.json +2636 -0
  29. package/ui-locales/pt.json +2636 -0
  30. package/ui-locales/ru.json +17 -1
  31. package/ui-locales/sv.json +2636 -0
  32. package/ui-locales/th.json +2636 -0
  33. package/ui-locales/tr.json +2636 -0
  34. package/ui-locales/uk.json +2636 -0
  35. package/ui-locales/vi.json +2636 -0
  36. package/ui-locales/zh.json +17 -1
  37. package/utils/config-helper.js +2 -2
  38. package/utils/config-manager.js +3 -4
  39. package/utils/env-manager.js +1 -1
  40. package/utils/locale-optimizer.js +1 -1
@@ -0,0 +1,2636 @@
1
+ {
2
+ "meta": {
3
+ "version": "4.7.0",
4
+ "updated": "2026-07-07",
5
+ "lang": "vi"
6
+ },
7
+ "common": {
8
+ "welcome": "Chào mừng",
9
+ "hello": "Xin chào",
10
+ "goodbye": "Tạm biệt",
11
+ "yes": "Đúng",
12
+ "no": "KHÔNG",
13
+ "save": "Cứu",
14
+ "cancel": "Hủy bỏ",
15
+ "delete": "Xóa bỏ",
16
+ "edit": "Biên tập",
17
+ "loading": "Đang tải...",
18
+ "offlineTitle": "Bạn đang ngoại tuyến",
19
+ "offlineMessage": "Vui lòng kiểm tra kết nối internet của bạn",
20
+ "tryReconnect": "Hãy thử kết nối lại",
21
+ "logout": "Đăng xuất",
22
+ "login": "Đăng nhập",
23
+ "amount": "Số lượng",
24
+ "success": "Thành công",
25
+ "error": "Lỗi",
26
+ "warning": "Cảnh báo",
27
+ "info": "Thông tin:",
28
+ "debug": "Gỡ lỗi",
29
+ "progress": "Tiến triển:",
30
+ "remaining": "Còn lại:",
31
+ "total": "Tổng cộng:",
32
+ "completed": "7. Đã hoàn tất thành công!",
33
+ "missing": "Mất tích",
34
+ "partial": "một phần",
35
+ "sameAsSource": "Tương tự như nguồn:",
36
+ "formatMismatch": "Định dạng không khớp:",
37
+ "typeMismatch": "Loại không khớp:",
38
+ "structureMismatch": "Cấu trúc không phù hợp:",
39
+ "invalidOption": "Tùy chọn không hợp lệ",
40
+ "separator": "==================================================",
41
+ "initializationFailed": "❌ Khởi tạo không thành công: {error}",
42
+ "stackTrace": "Dấu vết ngăn xếp: {stack}",
43
+ "pressEnterToContinue": "Nhấn Enter để tiếp tục...",
44
+ "pressEnterToReturn": "Nhấn Enter để quay lại menu chính...",
45
+ "stepCompleted": "Bước chân '{stepName}' hoàn thành.",
46
+ "stepFailed": "Bước chân '{stepName}' thất bại.",
47
+ "runningStep": "Bước chạy: {stepName}",
48
+ "command": "Yêu cầu: {command}",
49
+ "startingWorkflow": "Đang bắt đầu quy trình làm việc...",
50
+ "workflowCompleted": "Quy trình làm việc đã hoàn tất.",
51
+ "checkReports": "Kiểm tra báo cáo để biết chi tiết.",
52
+ "errorExecutingCommand": "Lỗi thực thi lệnh: {error}",
53
+ "genericError": "❌ Lỗi: {error}",
54
+ "errors": {
55
+ "errors": "Lỗi:",
56
+ "genericError": "❌ Lỗi: {error}",
57
+ "initializationFailed": "❌ Khởi tạo không thành công: {error}",
58
+ "initializationCancelled": "❌ Việc khởi tạo bị người dùng hủy bỏ.",
59
+ "translationKeyNotFound": "Không tìm thấy khóa dịch: {key}",
60
+ "sourceDirectoryNotFound": "Không tìm thấy thư mục nguồn: {directory}",
61
+ "configLoadingFailed": "Tải cấu hình không thành công",
62
+ "invalidSourceDirectory": "Thư mục nguồn không hợp lệ: {directory}",
63
+ "securityViolation": "Đã phát hiện vi phạm an ninh",
64
+ "authenticationFailed": "Xác thực không thành công",
65
+ "sourceEqualsI18nWarn": "⚠️ sourceDir bằng i18nDir ({sourceDir}). Rơi trở lại {fallback} để quét nguồn."
66
+ },
67
+ "errorGeneratingStatusSummary": "Lỗi tạo tóm tắt trạng thái: {error}",
68
+ "errorRunningDebugTool": "Lỗi chạy công cụ debug'{displayName}': {error}",
69
+ "errorReadingDebugLogs": "Lỗi đọc nhật ký gỡ lỗi: {error}",
70
+ "errorAnalyzingLogFile": "Lỗi phân tích tệp nhật ký: {error}",
71
+ "errorAnalyzingTranslationKeys": "Lỗi phân tích khóa dịch: {error}",
72
+ "errorAnalyzingTranslationCompleteness": "Lỗi phân tích tính đầy đủ của bản dịch: {error}",
73
+ "analyzingTranslationCompleteness": "Phân tích tính đầy đủ của bản dịch trên tất cả các ngôn ngữ...",
74
+ "i18nDirectoryNotFound": "⚠️ Không tìm thấy thư mục i18n: {i18nDir}",
75
+ "translationCompletenessAnalysisFailed": "⚠️ Phân tích tính đầy đủ của bản dịch không thành công: {error}",
76
+ "failedToAnalyzeLanguage": "❌ Không phân tích được ngôn ngữ {language}: {error}",
77
+ "errorReadingI18nDirectory": "❌ Lỗi đọc thư mục i18n:",
78
+ "languageCompletenessTitle": "📈 DỊCH HOÀN THÀNH THEO NGÔN NGỮ",
79
+ "errorAnalyzingTranslationFormat": "Lỗi phân tích định dạng dịch: {error}",
80
+ "errorAnalyzingTranslationType": "Lỗi phân tích loại dịch: {error}",
81
+ "errorAnalyzingTranslationStructure": "Lỗi phân tích cấu trúc dịch: {error}",
82
+ "errorAnalyzingTranslationFormatMismatch": "Lỗi phân tích định dạng bản dịch không khớp: {error}",
83
+ "errorAnalyzingTranslationTypeMismatch": "Lỗi phân tích loại bản dịch không khớp: {error}",
84
+ "errorAnalyzingTranslationStructureMismatch": "Lỗi phân tích cấu trúc dịch không khớp: {error}",
85
+ "errorAnalyzingTranslationSameAsSource": "Lỗi phân tích bản dịch giống với nguồn: {error}",
86
+ "title": "Trạng thái",
87
+ "nextStep1": "1. Kiểm tra phân tích sử dụng:",
88
+ "nextStep2": "2. Xác thực bản dịch:",
89
+ "nextStep3": "3. Phân tích tính đầy đủ:",
90
+ "nextStep4": "4. Hoàn thiện các bản dịch còn thiếu:",
91
+ "nextStep5": "5. Tạo báo cáo tóm tắt:",
92
+ "nextStep6": "6. Xem xét và hoàn thiện bản dịch:",
93
+ "generating": "Đang tạo báo cáo tóm tắt...",
94
+ "review": "Đang xem xét bản dịch...",
95
+ "finalizing": "Đang hoàn thiện bản dịch...",
96
+ "finalized": "Đã hoàn tất thành công!",
97
+ "warnings": "Cảnh báo:",
98
+ "completedKeys": "Các phím đã hoàn thành:",
99
+ "missingKeys": "Thiếu phím:",
100
+ "partialKeys": "Phím một phần:",
101
+ "home": "Trang chủ",
102
+ "settings": "Cài đặt",
103
+ "startingSettings": "🎛️ Bắt đầu Cài đặt CLI...",
104
+ "confirm": "Xác nhận",
105
+ "errorExiting": "Lỗi khi thoát."
106
+ },
107
+ "errors": {
108
+ "invalidOption": "❌ Tùy chọn không hợp lệ: {option}. Vui lòng thử lại.",
109
+ "readlineClosed": "Luồng đầu vào bị đóng; chạy ở chế độ không tương tác.",
110
+ "noPackageJson": "Không tìm thấy gói.json. Không thể tự động phát hiện khung i18n.",
111
+ "noI18nDir": "Không tìm thấy thư mục i18n trong thư mục gốc của dự án.",
112
+ "noI18nConfig": "Không tìm thấy tệp cấu hình i18n trong thư mục gốc của dự án.",
113
+ "errorReadingDebugLogs": "Lỗi đọc nhật ký gỡ lỗi: {error}"
114
+ },
115
+ "scanner": {
116
+ "help_message": "Cách sử dụng máy quét văn bản I18n: nút i18ntk-scanner.js [tùy chọn] Tùy chọn: --source-dir <dir> Thư mục nguồn cần quét (mặc định: ./src) --output <file> Tệp đầu ra cho kết quả quét (mặc định: ./i18ntk-scanner-report.json) --framework <name> Khung để nhắm mục tiêu (phản ứng, vue, góc cạnh, vanilla) --patterns <patterns> Các mẫu biểu thức chính quy tùy chỉnh (được phân tách bằng dấu phẩy) --include-tests Bao gồm các tệp kiểm tra trong quá trình quét --exclude-dirs <dirs> Các thư mục cần loại trừ (được phân tách bằng dấu phẩy) --help Hiển thị trợ giúp này Ví dụ: node i18ntk-scanner.js --source-dir=./src --framework=react node i18ntk-scanner.js --patterns 'console.log\\((.*?)\\)' --include-tests node i18ntk-scanner.js --output=./scan-results.json",
117
+ "help_options": {
118
+ "source_dir": "Thư mục nguồn để quét các vấn đề i18n",
119
+ "output_dir": "Thư mục cho các báo cáo và kết quả quét",
120
+ "framework": "Khung mục tiêu (phản ứng, vue, góc cạnh, vanilla)",
121
+ "patterns": "Các mẫu biểu thức chính quy tùy chỉnh để phát hiện văn bản",
122
+ "exclude": "Các mẫu tệp cần loại trừ khỏi quá trình quét",
123
+ "output_report": "Tạo báo cáo quét chi tiết",
124
+ "min_length": "Độ dài văn bản tối thiểu cần cân nhắc khi dịch",
125
+ "max_length": "Độ dài văn bản tối đa cần cân nhắc khi dịch",
126
+ "include_tests": "Bao gồm các tệp kiểm tra trong quá trình quét"
127
+ },
128
+ "starting": "🔍 Khởi động trình quét văn bản cho khung: {framework}",
129
+ "sourceDirectory": "📁 Quét thư mục: {sourceDir}",
130
+ "frameworkDetected": "🎯 Khung được phát hiện: {framework}",
131
+ "scanningFiles": "📊 Đang quét {fileCount} tập tin...",
132
+ "foundTexts": "📝 Đã tìm thấy {textCount} văn bản cần dịch",
133
+ "generatingReport": "📊 Tạo báo cáo chi tiết...",
134
+ "reportSaved": "💾 Báo cáo quét được lưu vào: {reportPath}",
135
+ "noTextsFound": "✅ Không tìm thấy văn bản tiếng Anh được mã hóa cứng",
136
+ "scanComplete": "🎉 Quá trình quét hoàn tất thành công!",
137
+ "analysisTitle": "🔍 PHÂN TÍCH QUÉT DỊCH",
138
+ "fileSummary": "📄 {file}: {count} văn bản được tìm thấy",
139
+ "textLocation": "📍 Dòng {line}: {text}",
140
+ "foundText": "Thành lập {count} các trường hợp văn bản được mã hóa cứng tiềm năng",
141
+ "context": "📝 Bối cảnh: {context}",
142
+ "severity": "⚠️ Mức độ nghiêm trọng: {severity}",
143
+ "recommendation": "💡 Khuyến nghị: {recommendation}",
144
+ "welcome": {
145
+ "title": "🎯 Chào mừng bạn đến với Trình quét văn bản!",
146
+ "description": "Công cụ này quét mã nguồn của bạn để tìm văn bản tiếng Anh được mã hóa cứng có thể cần dịch."
147
+ },
148
+ "frameworkPrompt": {
149
+ "title": "🎯 Chọn khung",
150
+ "available": "Các khung có sẵn: phản ứng, vue, góc cạnh, vanilla",
151
+ "description": "Nhập loại khung (hoặc nhấn Enter để tự động phát hiện):",
152
+ "input": "Khung:"
153
+ },
154
+ "directoryPrompt": {
155
+ "title": "📁 Chọn thư mục nguồn",
156
+ "current": "Thư mục hiện tại: {dir}",
157
+ "description": "Nhập thư mục cần quét (hoặc nhấn Enter cho hiện tại):",
158
+ "input": "Thư mục:"
159
+ },
160
+ "options": {
161
+ "includeTests": "Bao gồm các tập tin kiểm tra?",
162
+ "excludeDirs": "Các thư mục cần loại trừ (được phân tách bằng dấu phẩy):",
163
+ "customPatterns": "Các mẫu tùy chỉnh để quét (regex):"
164
+ },
165
+ "reportGenerated": "Báo cáo quét được tạo: {path}"
166
+ },
167
+ "fixer": {
168
+ "help_message": "Cách sử dụng Trình sửa lỗi dịch thuật I18n: nút i18ntk-fixer.js [tùy chọn] Tùy chọn: --source-dir <dir> Thư mục nguồn cần quét (mặc định: ./locales) --ngôn ngữ <langs> Danh sách ngôn ngữ được phân tách bằng dấu phẩy để sửa --markers <markers> Các điểm đánh dấu được phân tách bằng dấu phẩy để coi là chưa được dịch --no-backup Bỏ qua việc tạo bản sao lưu tự động --help Hiển thị trợ giúp này Ví dụ: node i18ntk-fixer.js --lacular de,fr node i18ntk-fixer.js --source-dir=./locales --markers NOT_TRANSLATED nút i18ntk-fixer.js --no-backup",
169
+ "starting": "🚀 Bắt đầu sửa bản dịch cho các ngôn ngữ: {languages}",
170
+ "sourceDirectory": "📁 Thư mục nguồn: {sourceDir}",
171
+ "sourceLanguage": "🔤 Ngôn ngữ nguồn: {sourceLanguage}",
172
+ "markers": "🏷️ Các điểm cần khắc phục: {markers}",
173
+ "scanningLanguage": "📊 Đang quét {language}...",
174
+ "noLanguages": "❌ Không có ngôn ngữ được chỉ định để sửa lỗi.",
175
+ "allComplete": "🎉 Tất cả các bản dịch đã hoàn tất!",
176
+ "fullReportSaved": "📊 Báo cáo đầy đủ được lưu vào: {reportPath}",
177
+ "reviewReport": "Vui lòng xem lại báo cáo trước khi tiếp tục.",
178
+ "backupCreated": "💾 Sao lưu được tạo thành công.",
179
+ "applyingFixes": "🔄 Áp dụng các bản sửa lỗi...",
180
+ "fixingComplete": "✅ Sửa bản dịch hoàn tất!",
181
+ "operationCancelled": "❌ Thao tác bị hủy bởi người dùng.",
182
+ "analysisTitle": "🔍 PHÂN TÍCH SỬA DỊCH",
183
+ "analysisSeparator": "==================================================",
184
+ "totalIssues": "Tổng số vấn đề được tìm thấy: {totalIssues}",
185
+ "missingTranslations": "Thiếu bản dịch: {missing}",
186
+ "placeholderTranslations": "Bản dịch giữ chỗ: {placeholder}",
187
+ "noIssues": "✅ Không tìm thấy vấn đề gì Tất cả các bản dịch đã hoàn tất.",
188
+ "detailedIssues": "📋 DETAILED ISSUES:",
189
+ "detailedSeparator": "--------------------------------------------------",
190
+ "filePath": "📄 {file} → {path}",
191
+ "missingKey": "❌ THIẾU: {source} → {new}",
192
+ "placeholderKey": "⚠️ GIỮ CHỖ: \"{target}\" → \"{new}\"",
193
+ "moreIssues": "... Và {count} nhiều vấn đề hơn. Kiểm tra tập tin báo cáo để biết chi tiết đầy đủ.",
194
+ "confirmationTitle": "🤔 Bạn có muốn tiếp tục với những bản sửa lỗi này không?",
195
+ "confirmationOptions": "Tùy chọn:",
196
+ "optionYes": "y - Có, áp dụng mọi cách khắc phục",
197
+ "optionNo": "n - Không, hủy thao tác",
198
+ "optionShow": "s - Hiển thị các vấn đề chi tiết",
199
+ "choicePrompt": "Sự lựa chọn của bạn (y/n/s):",
200
+ "nonInteractiveMode": "⚡ Đã phát hiện chế độ không tương tác - tự động áp dụng các bản sửa lỗi...",
201
+ "reportGenerated": "📊 Đã tạo báo cáo trình sửa lỗi: {path}",
202
+ "summary": "Tóm tắt trình sửa lỗi:",
203
+ "welcome": {
204
+ "title": "🎯 Chào mừng bạn đến với Trình sửa lỗi dịch thuật!",
205
+ "description": "Công cụ này sẽ giúp bạn sửa các bản dịch và phần giữ chỗ bị hỏng trên các tệp ngôn ngữ của bạn."
206
+ },
207
+ "markerPrompt": {
208
+ "title": "🏷️ Định cấu hình điểm đánh dấu giữ chỗ",
209
+ "description": "Nhập các điểm đánh dấu cho biết văn bản chưa được dịch (được phân tách bằng dấu phẩy):",
210
+ "currentDefaults": "Dấu hiệu mặc định: {markers}",
211
+ "input": "Điểm đánh dấu (hoặc nhấn Enter để mặc định):"
212
+ },
213
+ "languagePrompt": {
214
+ "title": "🌍 Chọn ngôn ngữ để sửa",
215
+ "available": "Ngôn ngữ có sẵn: {languages}",
216
+ "description": "Nhập ngôn ngữ cần sửa (cách nhau bằng dấu phẩy) hoặc nhấn Enter cho tất cả:",
217
+ "input": "Ngôn ngữ:",
218
+ "noLanguages": "Không tìm thấy ngôn ngữ nào để khắc phục."
219
+ },
220
+ "directoryPrompt": {
221
+ "title": "📁 Chọn thư mục",
222
+ "current": "Thư mục hiện tại: {dir}",
223
+ "description": "Nhập thư mục chứa các tệp ngôn ngữ của bạn (hoặc nhấn Enter cho hiện tại):",
224
+ "input": "Thư mục:"
225
+ },
226
+ "backupLocation": "Vị trí dự phòng: {dir}",
227
+ "completed": "Sửa xong.",
228
+ "creatingBackup": "Tạo bản sao lưu trong {dir}...",
229
+ "dryRunMode": "Chế độ chạy khô: {mode}",
230
+ "error": "Trình sửa lỗi không thành công: {error}",
231
+ "fixing": "sửa chữa {language}...",
232
+ "foundLanguages": "Thành lập {count} ngôn ngữ: {languages}",
233
+ "languageFixed": "{language}: cố định {fixed} (các) phím, bị bỏ qua {skipped}.",
234
+ "running": "Đang chạy trình sửa lỗi dịch...",
235
+ "totalFixed": "Tổng số cố định: {count}"
236
+ },
237
+ "autorun": {
238
+ "stepAnalyzeTranslations": "Phân tích bản dịch",
239
+ "stepCompletedWithIcon": "✅ Đã hoàn thành: {stepName}",
240
+ "stepValidateTranslations": "Xác thực bản dịch",
241
+ "stepRunning": "♥️ Bước {stepNumber}/{totalSteps}: {stepName}",
242
+ "separator": "==================================================",
243
+ "stepFailed": "❌ Thất bại: {stepName}",
244
+ "errorLabel": "Lỗi",
245
+ "autoRunScriptTitle": "🧪 Quy trình làm việc tự động chạy",
246
+ "usageTitle": "Cách sử dụng",
247
+ "runAllSteps": "Chạy: nút i18ntk-autorun.js",
248
+ "configureSettingsFirst": "Cấu hình: cờ i18ntk-config.json hoặc CLI",
249
+ "runSpecificSteps": "Sử dụng --steps=1,3 hoặc --list để hiển thị các bước",
250
+ "showHelp": "--trợ giúp để biết thêm thông tin",
251
+ "examplesTitle": "Ví dụ",
252
+ "configExample": "nút i18ntk-autorun.js --ui-lingu=zh",
253
+ "stepsExample1": "nút i18ntk-autorun.js --steps=analyze,validate",
254
+ "stepsExample2": "nút i18ntk-autorun.js --list",
255
+ "customSettingsConfiguration": "Cài đặt tự động chạy tùy chỉnh",
256
+ "availableSteps": "Các bước có sẵn",
257
+ "startingAutoRunWorkflow": "🚀 Đang bắt đầu quy trình làm việc Tự động chạy...",
258
+ "workflowIncludesSteps": "Quy trình làm việc bao gồm {count} các bước:",
259
+ "missingRequiredFile": "Thiếu file cần thiết: {file}",
260
+ "workflowStopped": "Quy trình làm việc đã dừng do lỗi.",
261
+ "workflowCompleted": "🎉 Quy trình làm việc đã hoàn tất!",
262
+ "successfulSteps": "Các bước thành công: {count}",
263
+ "failedSteps": "Các bước không thành công: {count}",
264
+ "stepInitializeProject": "Khởi tạo dự án",
265
+ "stepCheckUsage": "Kiểm tra việc sử dụng khóa",
266
+ "stepGenerateSummary": "Tạo báo cáo tóm tắt",
267
+ "runInitializationFirst": "Vui lòng chạy khởi tạo trước.",
268
+ "initializationCheckPassed": "Kiểm tra khởi tạo đã trôi qua.",
269
+ "runningStep": "Bước chạy: {stepName}",
270
+ "commandLabel": "Yêu cầu: {command}",
271
+ "stepCompletedWithTime": "Bước chân '{stepName}' hoàn thành vào {duration}bệnh đa xơ cứng.",
272
+ "stepCompleted": "Bước chân '{stepName}' hoàn thành.",
273
+ "stepFailedWithError": "Bước chân '{stepName}' thất bại với lỗi: {error}",
274
+ "requiredStepFailed": "Bước bắt buộc không thành công. Đang dừng quy trình làm việc.",
275
+ "optionalStepFailed": "Bước tùy chọn không thành công. Tiếp tục quy trình làm việc.",
276
+ "stepRequired": "(Yêu cầu)",
277
+ "stepOptional": "(Không bắt buộc)",
278
+ "startingExecution": "Bắt đầu thực hiện...",
279
+ "pressEnterToContinue": "Nhấn Enter để tiếp tục...",
280
+ "runningSelectedSteps": "Đang chạy các bước đã chọn...",
281
+ "invalidStepNumber": "Số bước không hợp lệ: {stepNum}",
282
+ "executionReport": "Báo cáo thực hiện:",
283
+ "requiredFailedSteps": "Các bước bắt buộc không thành công: {count}",
284
+ "stepDetails": "Chi tiết bước:",
285
+ "reportSavedTo": "Báo cáo được lưu vào: {path}",
286
+ "overallStatusSuccess": "SUCCESS",
287
+ "overallStatusFailed": "FAILED",
288
+ "overallStatus": "Tình trạng chung: {status}",
289
+ "pressEnterForDefaults": "Nhấn Enter để sử dụng cài đặt mặc định cho bất kỳ lời nhắc nào.",
290
+ "sourceDirPrompt": "Nhập thư mục nguồn (mặc định: {default}):",
291
+ "sourceLangPrompt": "Nhập ngôn ngữ nguồn (mặc định: {default}):",
292
+ "targetLangsPrompt": "Nhập ngôn ngữ đích (được phân tách bằng dấu phẩy, mặc định: {default}):",
293
+ "translationMarkerPrompt": "Nhập dấu dịch (mặc định: {default}):",
294
+ "outputDirPrompt": "Nhập thư mục đầu ra cho các báo cáo (mặc định: {default}):",
295
+ "settingsUpdatedSuccessfully": "Đã cập nhật cài đặt thành công!",
296
+ "errorConfiguringSettings": "Lỗi cấu hình cài đặt: {error}",
297
+ "configurationComplete": "Cấu hình hoàn tất.",
298
+ "runAutoRunCommand": "Bây giờ bạn có thể chạy lệnh tự động chạy.",
299
+ "configurationFailed": "Cấu hình không thành công: {error}",
300
+ "noValidStepNumbers": "Không có số bước hợp lệ nào được cung cấp.",
301
+ "autoRunFailed": "Tự động chạy không thành công: {error}",
302
+ "stepCompleteTranslations": "Bản dịch hoàn chỉnh",
303
+ "stepAnalyzeSizing": "Phân tích kích thước",
304
+ "stepCompletedIcon": "✅",
305
+ "stepRunningWithNumber": "[{stepNumber}/{totalSteps}] Bước chân '{stepName}' đang chạy...",
306
+ "stepFailedIcon": "❌",
307
+ "translationLoadWarning": "Cảnh báo: Không thể tải {lang} bản dịch",
308
+ "configReadError": "Lỗi đọc {file}"
309
+ },
310
+ "analyze": {
311
+ "help_message": "Cách sử dụng Trình phân tích dịch I18n: nút i18ntk-analyze.js [tùy chọn] Tùy chọn: --source-dir <dir> Thư mục nguồn cần quét (mặc định: ./src) --i18n-dir <dir> Thư mục I18n (mặc định: ./src/locales) --output-report Tạo báo cáo chi tiết --output-dir <dir> Thư mục đầu ra cho các báo cáo (mặc định: ./reports) --help Hiển thị trợ giúp này Ví dụ: node i18ntk-analyze.js --output-report node i18ntk-analyze.js --source-dir=./app --i18n-dir=./locales node i18ntk-analyze.js --output-dir=./analysis --output-report",
312
+ "source_directory": "📁 Thư mục nguồn: {sourceDir}",
313
+ "i18n_directory": "🌐 Danh mục I18n: {i18nDir}",
314
+ "loading_translation_files": "📋 Đang tải file dịch...",
315
+ "sourceDirectoryLabel": "📁 Thư mục nguồn: {sourceDir}",
316
+ "sourceLanguageLabel": "🌍 Ngôn ngữ nguồn: {sourceLanguage}",
317
+ "strictModeLabel": "⚙️ Chế độ nghiêm ngặt: {mode}",
318
+ "found_translation_files_count": "✅ Đã tìm thấy {count} tập tin dịch",
319
+ "analyzing_translations": "🔍 Phân tích bản dịch...",
320
+ "analysis_completed_successfully": "🎉 Phân tích đã hoàn tất thành công!",
321
+ "analysis_results": "📊 ANALYSIS RESULTS",
322
+ "language_analysis_stats": "{language}: {translatedKeys}/{totalKeys} ({percentage}% dịch)",
323
+ "sample_missing_keys": "Mẫu phím bị thiếu:",
324
+ "missing_key": "- {key}",
325
+ "and_more_missing": "...Và {count} hơn.",
326
+ "sample_unused_keys": "Ví dụ về các khóa không được sử dụng:",
327
+ "unused_key": "- {key}",
328
+ "and_more_unused": "...Và {count} hơn.",
329
+ "recommendations": "📋 KHUYẾN NGHỊ",
330
+ "add_missing_translations": "💡 Thêm các bản dịch còn thiếu để cải thiện mức độ phù hợp.",
331
+ "remove_unused_translations": "💡 Loại bỏ các bản dịch không sử dụng để giữ cho dự án của bạn sạch sẽ.",
332
+ "next_steps": "📋 NEXT STEPS",
333
+ "review_analysis_results": "1. Xem lại kết quả phân tích trong bảng điều khiển hoặc báo cáo đã tạo.",
334
+ "run_with_output_report": "2. Chạy --output-report để biết báo cáo chi tiết.",
335
+ "add_or_remove_translations": "3. Thêm bản dịch còn thiếu hoặc xóa những bản dịch không sử dụng.",
336
+ "rerun_analysis": "4. Chạy lại phân tích để xác minh các cải tiến.",
337
+ "analysis_summary": "📊 ANALYSIS SUMMARY",
338
+ "source_files_scanned": "Các tập tin nguồn được quét: {fileCount}",
339
+ "translation_files_checked": "Các tập tin dịch đã được kiểm tra: {translationFileCount}",
340
+ "total_keys": "Tổng số phím: {totalKeys}",
341
+ "translated_keys": "Các phím đã dịch: {translatedKeys}",
342
+ "missing_keys": "Thiếu phím: {missingKeys}",
343
+ "unused_keys": "Các phím chưa sử dụng: {unusedKeys}",
344
+ "translation_coverage": "Phạm vi dịch thuật: {coverage}%",
345
+ "analysis_passed_for_language": "✅ Phân tích được thông qua {language}",
346
+ "analysis_failed_for_language": "❌ Phân tích thất bại {language} ({missingKeys} mất tích, {unusedKeys} chưa sử dụng)",
347
+ "starting": "🔍 Bắt đầu phân tích bản dịch...",
348
+ "foundLanguages": "📋 Đã tìm thấy {count} ngôn ngữ để phân tích: {languages}",
349
+ "analyzing": "🔄 Phân tích {language}...",
350
+ "reportTitle": "📊 BÁO CÁO PHÂN TÍCH DỊCH",
351
+ "generated": "Đã tạo: {timestamp}",
352
+ "status": "Trạng thái: {translated}/{total} phím ({percentage}% dịch)",
353
+ "filesAnalyzed": "Các tập tin được phân tích: {analyzed}/{total}",
354
+ "keysNeedingTranslation": "Các phím cần dịch: {count}",
355
+ "fileBreakdown": "📋 PHÂN TÍCH TẬP TIN",
356
+ "error": "Lỗi",
357
+ "completed": "✅ Đã hoàn thành phân tích cho {language}",
358
+ "progress": "📊 Tiến độ chung: {translated}/{total} ngôn ngữ được xử lý",
359
+ "reportSaved": "Đã lưu báo cáo: {reportPath}",
360
+ "summary": "📊 ANALYSIS SUMMARY",
361
+ "finished": "✅ Phân tích hoàn tất thành công!",
362
+ "statusFileMissing": "❌ Thiếu file dịch",
363
+ "sourceKeys": "📊 Chìa khóa nguồn: {count}",
364
+ "translation": "📊 Bản dịch: {translated}/{total} ({percentage}%)",
365
+ "structure": "🗂️ Cấu trúc: {status}",
366
+ "consistent": "Nhất quán",
367
+ "inconsistent": "Không nhất quán",
368
+ "missingKeys": "Thiếu phím: {count}",
369
+ "extraKeys": "Phím bổ sung: {count}",
370
+ "issues": "⚠️ Các vấn đề được tìm thấy: {count}",
371
+ "issueType": {
372
+ "not_translated": "Không được dịch: {count}",
373
+ "empty_value": "Giá trị trống: {count}",
374
+ "partial_translation": "Bản dịch một phần: {count}",
375
+ "format_mismatch": "Định dạng không khớp: {count}",
376
+ "type_mismatch": "Loại không khớp: {count}",
377
+ "structure_mismatch": "Cấu trúc không phù hợp: {count}",
378
+ "same_as_source": "Tương tự như nguồn: {count}"
379
+ },
380
+ "keysToTranslate": "📋 PHÍM ĐỂ DỊCH",
381
+ "key": "Chìa khóa",
382
+ "english": "Tiếng Anh",
383
+ "needsTranslation": "CẦN DỊCH",
384
+ "andMoreKeys": "...Và {count} nhiều phím hơn.",
385
+ "noLanguages": "⚠️ Không tìm thấy ngôn ngữ mục tiêu.",
386
+ "languageStats": "{language}: {percentage}% hoàn thành ({translated}/{total} phím)",
387
+ "invalidReportFilePath": "Đường dẫn tệp báo cáo không hợp lệ",
388
+ "failedToWriteReportFile": "Không thể ghi tệp báo cáo một cách an toàn"
389
+ },
390
+ "complete": {
391
+ "configLoadedSuccessfully": "Đã tải cấu hình thành công",
392
+ "configLoadingFailed": "Tải cấu hình không thành công",
393
+ "sourceLanguageNotFound": "Không tìm thấy thư mục ngôn ngữ nguồn: {sourceLanguage}",
394
+ "couldNotParseTarget": "Không thể phân tích tệp mục tiêu: {file}",
395
+ "couldNotParseSource": "Không thể phân tích tệp nguồn: {file}",
396
+ "reportGenerated": "Báo cáo được tạo: {path}",
397
+ "generateReportPrompt": "Bạn có muốn tạo một báo cáo không?",
398
+ "title": "🌍 HOÀN THÀNH DỊCH I18NTK",
399
+ "separator": "============================================================",
400
+ "sourceDir": "📁 Thư mục nguồn: {sourceDir}",
401
+ "sourceLanguage": "🌐 Ngôn ngữ nguồn: {sourceLanguage}",
402
+ "dryRunMode": "🧪 Chế độ chạy khô - sẽ không có thay đổi nào được thực hiện",
403
+ "languages": "🌍 Ngôn ngữ có sẵn: {languages}",
404
+ "addingMissingKeys": "➕ Thêm khóa bị thiếu vào file dịch...",
405
+ "processing": "🔄 Đang xử lý {language}...",
406
+ "addedKeys": "✅ Đã thêm {count} phím bị thiếu",
407
+ "noChangesNeeded": "✅ Không cần thay đổi gì {language}",
408
+ "summaryTitle": "📊 TÓM TẮT HOÀN THÀNH",
409
+ "totalChanges": "📝 Tổng số thay đổi: {totalChanges}",
410
+ "languagesProcessed": "🌍 Ngôn ngữ được xử lý: {languagesProcessed}",
411
+ "missingKeysAdded": "➕ Thiếu phím bổ sung: {missingKeysAdded}",
412
+ "nextStepsTitle": "📋 NEXT STEPS",
413
+ "nextStep1": "1. Chạy phân tích mức sử dụng:",
414
+ "nextStep2": "nút i18ntk-usage.js --output-report",
415
+ "nextStep3": "2. Xác thực bản dịch:",
416
+ "nextStep4": "nút i18ntk-validate.js",
417
+ "nextStep5": "3. Phân tích mẫu:",
418
+ "nextStep6": "nút i18ntk-analyze.js",
419
+ "allKeysAvailable": "🎉 Tất cả các khóa dịch hiện đã có sẵn!",
420
+ "runWithoutDryRun": "💡 Chạy không cần --dry-run để áp dụng các thay đổi",
421
+ "deletingOldReport": "🗑️ Đang xóa báo cáo cũ...",
422
+ "generatingFreshAnalysis": "📊 Tạo phân tích sử dụng mới...",
423
+ "couldNotGenerate": "❌ Không thể tạo phân tích sử dụng",
424
+ "reportNotFound": "📋 Không tìm thấy báo cáo sử dụng. Sử dụng các phím chung...",
425
+ "foundMissingKeys": "📋 Đã tìm thấy {count} khóa bị thiếu trong phân tích sử dụng",
426
+ "couldNotParse": "❌ Không thể phân tích báo cáo sử dụng. Sử dụng các phím chung...",
427
+ "errorDuringCompletion": "❌ Lỗi khi hoàn thành: {error}",
428
+ "fatalError": "❌Lỗi nghiêm trọng: {error}",
429
+ "configurationValidationFailed": "Xác thực cấu hình không thành công: thiếu các trường bắt buộc"
430
+ },
431
+ "sizing": {
432
+ "separator": "================================================================================",
433
+ "lineSeparator": "--------------------------------------------------------------------------------",
434
+ "analysisStats": "{stats}",
435
+ "sourceDirectoryLabel": "📁 Thư mục nguồn: {sourceDir}",
436
+ "sourceLanguageLabel": "🌍 Ngôn ngữ nguồn: {sourceLanguage}",
437
+ "strictModeLabel": "⚙️ Chế độ nghiêm ngặt: {mode}",
438
+ "invalidSourceDirectoryError": "Đường dẫn thư mục nguồn không hợp lệ: {sourceDir}",
439
+ "sourceDirectoryNotFoundError": "Không tìm thấy thư mục nguồn: {sourceDir}",
440
+ "invalidOutputDirectoryError": "Đường dẫn thư mục đầu ra không hợp lệ: {outputDir}",
441
+ "invalidReportFileError": "Đường dẫn tệp báo cáo không hợp lệ",
442
+ "problematic_keys": "Các phím có vấn đề: {problematicKeys}",
443
+ "problematicKeysLabel": "Các phím có vấn đề: {problematicKeys}",
444
+ "long_translations": "Bản dịch dài: {longTranslations}",
445
+ "failedToSaveReportError": "Không thể lưu báo cáo một cách an toàn",
446
+ "invalidCsvFileError": "Đường dẫn tệp CSV không hợp lệ",
447
+ "failedToSaveCsvError": "Không thể lưu báo cáo CSV một cách an toàn",
448
+ "fatalError": "❌ Phân tích kích thước không thành công: {error}",
449
+ "starting_i18n_sizing_analysis": "Đang bắt đầu phân tích kích thước i18n...",
450
+ "source_directory": "Thư mục nguồn: {sourceDir}",
451
+ "found_languages": "Ngôn ngữ được tìm thấy: {languages}",
452
+ "analyzing_file_sizes": "Đang phân tích kích thước tệp...",
453
+ "analyzing_translation_content": "Phân tích nội dung dịch...",
454
+ "generating_size_comparisons": "Đang tạo so sánh kích thước...",
455
+ "no_languages_found_for_comparison": "Không tìm thấy ngôn ngữ nào để so sánh",
456
+ "sizing_analysis_results": "Kết quả phân tích kích thước I18n",
457
+ "file_sizes_title": "Kích thước tệp",
458
+ "file_sizes_header": "Kích thước ngôn ngữ(KB) Dòng ký tự",
459
+ "file_size_row": "{lang} {sizeKB} {lines} {characters}",
460
+ "language_statistics_title": "Thống kê ngôn ngữ",
461
+ "language_stats_header": "Ngôn ngữ Phím Ký tự Độ dài trung bình Độ dài tối đa Trống Dài",
462
+ "language_stats_row": "{lang} {totalKeys} {totalCharacters} {averageKeyLength} {maxKeyLength} {emptyKeys} {longKeys}",
463
+ "size_variations_title": "Biến thể kích thước",
464
+ "size_variations_header": "Ngôn ngữ Char Diff % Diff có vấn đề",
465
+ "size_variation_row": "{lang} {characterDifference} {percentageDifference}% {problematic}",
466
+ "problematic_yes": "Đúng",
467
+ "problematic_no": "KHÔNG",
468
+ "recommendations_title": "Khuyến nghị",
469
+ "recommendation_item": "{index}. {recommendation}",
470
+ "problematic_key_detail": "{index}. Chìa khóa: '{key}' - Các biến thể: {variations}",
471
+ "generating_detailed_report": "Đang tạo báo cáo chi tiết...",
472
+ "keysHaveSignificantSizeVariations": "phím có sự thay đổi kích thước đáng kể",
473
+ "longTranslationsDetected": "${lang} có bản dịch ${data.longKeys} dài hơn 100 ký tự - hãy cân nhắc việc chia nhỏ chúng",
474
+ "longer": "dài hơn",
475
+ "shorter": "ngắn hơn",
476
+ "review_translations": "Xem xét xem xét {lang} bản dịch - chúng là {percentageDifference}% {comparison} hơn đường cơ sở",
477
+ "report_saved_to": "Báo cáo được lưu vào: {reportPath}",
478
+ "considerReviewingTranslations": "Xem xét xem xét ${lang} bản dịch - chúng dài hơn ${data.percentageDifference}% so với đường cơ sở",
479
+ "csv_report_saved_to": "Báo cáo CSV được lưu vào: {csvPath}",
480
+ "human_report_saved": "Đã lưu báo cáo có thể đọc được: {reportPath}",
481
+ "folder_summary_title": "Tóm tắt thư mục",
482
+ "folder_summary_table_header": "Kích thước ngôn ngữ (KB) Phím Độ dài trung bình Tổng ký tự",
483
+ "folder_summary_row": "{lang} {sizeKB} {totalKeys} {avgLength} {totalChars}",
484
+ "language_comparison_title": "So sánh ngôn ngữ",
485
+ "language_comparison_row": "{lang}: {diff} ký tự ({percent}%) {status}",
486
+ "summary_stats": "📊 Tóm tắt: {totalLanguages} ngôn ngữ, {totalKeys} phím - Báo cáo được lưu vào {reportPath}",
487
+ "detailedKeysDescription": "Hiển thị phân tích cấp khóa chi tiết trong bảng điều khiển",
488
+ "too_many_keys_warning": "⚠️ Quá nhiều phím để hiển thị trong bảng điều khiển - hãy kiểm tra tệp báo cáo chi tiết để có phân tích đầy đủ",
489
+ "no_translation_files_found": "Không tìm thấy tệp dịch",
490
+ "analysis_completed": "Phân tích hoàn thành vào {duration}bệnh đa xơ cứng",
491
+ "analysis_failed": "Phân tích không thành công: {errorMessage}",
492
+ "starting_analysis": "Bắt đầu phân tích...",
493
+ "found_files": "Thành lập {count} tập tin",
494
+ "failed_to_parse_language_error": "Không thể phân tích cú pháp {language} bản dịch: {errorMessage}",
495
+ "recommendations": {
496
+ "keys_have_significant_size_variations": "phím có sự thay đổi kích thước đáng kể",
497
+ "consider_reviewing_translations": "Xem xét xem xét {lang} bản dịch - chúng là {percentageDifference}% {comparison} hơn đường cơ sở",
498
+ "long_translations_detected": "{lang} có {longKeys} bản dịch dài hơn {threshold} ký tự - hãy cân nhắc việc chia nhỏ chúng"
499
+ },
500
+ "detailed_key_analysis_title": "Phân tích khóa chi tiết",
501
+ "key_analysis_detail": "{lang}: {length} ký tự ({status}) - {translation}",
502
+ "key_analysis_header": "Chìa khóa: {key}",
503
+ "status_empty": "trống",
504
+ "status_long": "dài",
505
+ "status_ok": "Được rồi"
506
+ },
507
+ "usage": {
508
+ "help_message": "Trình phân tích sử dụng I18n Cách sử dụng: nút i18ntk-usage.js [tùy chọn] Tùy chọn: --source-dir <dir> Thư mục nguồn cần quét (mặc định: ./src) --i18n-dir <dir> Thư mục I18n (mặc định: ./src/locales) --output-report Tạo báo cáo chi tiết --output-dir <dir> Thư mục đầu ra cho các báo cáo (mặc định: ./reports) --help Hiển thị trợ giúp này Ví dụ: node i18ntk-usage.js --output-report node i18ntk-usage.js --source-dir=./app --i18n-dir=./locales node i18ntk-usage.js --output-dir=./analysis --output-report",
509
+ "source_directory_thissourcedir": "📁 Thư mục nguồn: {sourceDir}",
510
+ "translationCompletenessTitle": "🌍 Bản dịch hoàn chỉnh:",
511
+ "i18n_directory_thisi18ndir": "🌐 Danh mục I18n: {i18nDir}",
512
+ "failed_to_parse_filename_error": "⚠️ Không phân tích được {fileName}: {errorMessage}",
513
+ "analyzing_source_files": "🔍 Phân tích file nguồn...",
514
+ "found_files_in_source": "📂 Đã tìm thấy {numFiles} tập tin trong thư mục nguồn",
515
+ "found_thisusedkeyssize_unique_": "🎯 Đã tìm thấy {usedKeysSize} phím được sử dụng độc đáo",
516
+ "total_key_usages_totalkeysfoun": "📊 Tổng số công dụng chính: {totalKeysFound}",
517
+ "loading_available_translation_": "📋 Đang tải các khóa dịch có sẵn...",
518
+ "found_thisavailablekeyssize_av": "✅ Đã tìm thấy {availableKeysSize} phím có sẵn",
519
+ "foundTranslationFiles": "✅ Đã tìm thấy {count} tập tin dịch",
520
+ "errorReadingI18nDirectory": "⚠️ Lỗi đọc thư mục i18n: {error}",
521
+ "pressEnterToReturnToMenu": "📝 Nhấn Enter để quay lại menu chính...",
522
+ "notTranslatedKeysTotal": "⚠️ Phím chưa dịch: {total}",
523
+ "noSourceFilesFound": "⚠️ Không tìm thấy tệp nguồn trong thư mục nguồn.",
524
+ "reviewNotTranslatedKeys": "💡 Xem lại các key chưa dịch",
525
+ "analysisCompletedSuccessfully": "🎉 Phân tích đã hoàn tất thành công!",
526
+ "detectedSourceDirectory": "Thư mục nguồn được phát hiện: {sourceDir}",
527
+ "detectedI18nDirectory": "Đã phát hiện thư mục i18n: {i18nDir}",
528
+ "fileInfo": "📄 {namespace}: {keys} phím",
529
+ "failedToAnalyzeUsage": "❌ Không phân tích được cách sử dụng: {error}",
530
+ "failedToAnalyzeFile": "❌ Phân tích file không thành công: {error}",
531
+ "failedToExtractKeys": "❌ Không thể trích xuất khóa từ {filePath}: {error}",
532
+ "analysisFailedError": "❌ Phân tích thất bại: {error}",
533
+ "analyzerInitialized": "Đã khởi tạo trình phân tích",
534
+ "analyzerInitFailed": "Khởi tạo trình phân tích không thành công: {error}",
535
+ "argsParsed": "Đối số được phân tích cú pháp",
536
+ "processedFiles": "Đã xử lý {processedFiles} của {totalFiles} tập tin.",
537
+ "argsParseFailed": "Phân tích đối số không thành công: {error}",
538
+ "translationDiscoveryError": "Lỗi khám phá bản dịch: {error}",
539
+ "fileTraversalError": "Lỗi truyền tải tệp: {error}",
540
+ "sourceEqualsI18nWarn": "{reason}. Phân tích sử dụng sẽ không quét các tệp ngôn ngữ dưới dạng mã nguồn.",
541
+ "i18nEqualsSourceWarn": "⚠️ Thư mục I18n và thư mục nguồn giống nhau. Điều này có thể gây ra vấn đề với việc phân tích.",
542
+ "usageAnalysisFailed": "⚠️ Phân tích cách sử dụng không thành công: {error}",
543
+ "translationFileParseError": "⚠️ Lỗi phân tích file dịch: {error}",
544
+ "translationKeysLoadError": "⚠️ Lỗi tải khóa dịch: {error}",
545
+ "languageCompletenessStats": "🌐 {language}: {translated}/{total} ({completeness}% dịch)",
546
+ "missingKeysCount": "⚠️ Thiếu chìa khóa: {count}",
547
+ "analyzingTranslationCompleteness": "Đang phân tích mức độ hoàn chỉnh của bản dịch...",
548
+ "unusedKeysCount": "Các phím chưa sử dụng: {count}",
549
+ "usedKeysCount": "Các phím đã sử dụng: {count}",
550
+ "availableKeysCount": "Các phím có sẵn: {count}",
551
+ "analysisResults": "Kết quả phân tích:",
552
+ "i18nDirectoryNotFound": "⚠️ Không tìm thấy thư mục I18n. Vui lòng kiểm tra đường dẫn.",
553
+ "sourceDirectoryNotFound": "⚠️ Không tìm thấy thư mục nguồn: {dir}",
554
+ "checkUsage": {
555
+ "title": "🔍 I18NTK USAGE ANALYSIS",
556
+ "analyzing_source_files": "🔍 Phân tích file nguồn...",
557
+ "source_directory_thissourcedir": "📁 Thư mục nguồn: {sourceDir}",
558
+ "i18n_directory_thisi18ndir": "📁 thư mục i18n: {i18nDir}",
559
+ "found_files_in_source": "✅ Đã tìm thấy {numFiles} tập tin trong thư mục nguồn",
560
+ "no_source_files_found": "⚠️ Không tìm thấy tệp nguồn trong thư mục được chỉ định",
561
+ "processedFiles": "📊 Đã xử lý {processedFiles} của {totalFiles} tập tin",
562
+ "failedToProcessFile": "❌ Xử lý không thành công",
563
+ "found_thisusedkeyssize_unique_": "🔍 Đã tìm thấy {usedKeysSize} phím được sử dụng độc đáo",
564
+ "total_key_usages_totalkeysfoun": "📊 Tổng số công dụng chính: {totalKeysFound}",
565
+ "loading_available_translation_": "📂 Đang tải các khóa dịch có sẵn...",
566
+ "found_thisavailablekeyssize_av": "✅ Đã tìm thấy {availableKeysSize} phím có sẵn",
567
+ "message": "Đang phân tích việc sử dụng khóa dịch trong toàn bộ dự án của bạn...",
568
+ "usage_analysis_results": "📊 USAGE ANALYSIS RESULTS",
569
+ "source_files_scanned_thisfileu": "📁 Tệp nguồn được quét: {fileUsageSize}",
570
+ "available_translation_keys_thi": "✅ Các phím dịch có sẵn: {availableKeysSize}",
571
+ "used_translation_keys_thisused": "🔍 Phím dịch đã sử dụng: {usedKeysSize}",
572
+ "dynamic_keys_detected_dynamick": "⚡ Đã phát hiện thấy phím động: {dynamicKeysLength}",
573
+ "unused_keys_unusedkeyslength": "🗑️ Phím chưa sử dụng: {unusedKeysLength}",
574
+ "missing_keys_missingkeyslength": "❌ Thiếu chìa khóa: {missingKeysLength}",
575
+ "translation_completeness_title": "📈 BẢN DỊCH HOÀN THÀNH",
576
+ "language_completeness_stats": "{language}: {translated}/{total} phím ({percentage}%)",
577
+ "n_sample_unused_keys": "🗑️ MẪU PHÍM CHƯA SỬ DỤNG (5 đầu tiên):",
578
+ "key": "🔑 {key}",
579
+ "and_unusedkeyslength_5_more": "... Và {count} nhiều phím không được sử dụng hơn",
580
+ "n_sample_missing_keys": "❌ MẪU PHÍM THIẾU (5 đầu tiên):",
581
+ "and_missingkeyslength_5_more": "... Và {count} còn thiếu nhiều chìa khóa hơn",
582
+ "n_generating_detailed_report": "📊 Tạo báo cáo chi tiết...",
583
+ "report_saved_reportpath": "📄 Đã lưu báo cáo: {reportPath}",
584
+ "n_recommendations": "💡 KHUYẾN NGHỊ:",
585
+ "consider_removing_unused_trans": "🗑️ Cân nhắc loại bỏ các bản dịch không sử dụng để giảm kích thước gói",
586
+ "add_missing_translation_keys_t": "➕ Thêm các phím dịch còn thiếu để duy trì tính nhất quán",
587
+ "review_dynamic_keys_manually_t": "🔍 Xem lại các khóa động theo cách thủ công (chúng có thể hợp lệ)",
588
+ "all_translation_keys_are_prope": "✅ Tất cả các phím dịch đều được sử dụng đúng cách!",
589
+ "n_next_steps": "🎯 NEXT STEPS:",
590
+ "2_check_the_detailed_report_fo": "2. Kiểm tra báo cáo chi tiết các vấn đề cụ thể",
591
+ "help_message": "Trình phân tích sử dụng I18n Cách sử dụng: nút i18ntk-usage.js [tùy chọn] Tùy chọn: --source-dir <dir> Thư mục nguồn cần quét (mặc định: ./src) --i18n-dir <dir> Thư mục I18n (mặc định: ./src/locales) --output-report Tạo báo cáo chi tiết --output-dir <dir> Thư mục đầu ra cho các báo cáo (mặc định: ./reports) --help Hiển thị trợ giúp này Ví dụ: node i18ntk-usage.js --output-report node i18ntk-usage.js --source-dir=./app --i18n-dir=./locales node i18ntk-usage.js --output-dir=./analysis --output-report",
592
+ "1_review_the_analysis_results": "1. Xem lại kết quả phân tích trong bảng điều khiển hoặc báo cáo đã tạo.",
593
+ "2_run_with_outputreport_for_de": "2. Chạy --output-report để biết báo cáo chi tiết.",
594
+ "3_remove_unused_keys_or_add_mi": "3. Xóa các khóa không sử dụng hoặc thêm các khóa bị thiếu vào mã nguồn của bạn.",
595
+ "4_rerun_analysis_to_verify_imp": "4. Chạy lại phân tích để xác minh các cải tiến.",
596
+ "noSourceFilesFound": "Không tìm thấy tập tin nguồn để phân tích.",
597
+ "i18nDirectoryNotFound": "Không tìm thấy thư mục I18n: {i18nDir}",
598
+ "noTranslationLanguagesFound": "Không tìm thấy ngôn ngữ dịch.",
599
+ "failedToAnalyzeFile": "Không thể phân tích tập tin {filePath}: {error}",
600
+ "failedToAnalyzeLanguage": "Không thể phân tích ngôn ngữ {language}: {error}",
601
+ "translationCompletenessAnalysisFailed": "Phân tích tính hoàn chỉnh của bản dịch không thành công: {error}",
602
+ "n": "\\N"
603
+ },
604
+ "complete": {
605
+ "configLoadedSuccessfully": "Đã tải cấu hình thành công",
606
+ "configLoadingFailed": "Tải cấu hình không thành công",
607
+ "title": "🌍 HOÀN THÀNH DỊCH I18NTK",
608
+ "separator": "============================================================",
609
+ "sourceDir": "📁 Thư mục nguồn: {sourceDir}",
610
+ "sourceLanguage": "🌐 Ngôn ngữ nguồn: {sourceLanguage}",
611
+ "dryRunMode": "🧪 Chế độ chạy khô - sẽ không có thay đổi nào được thực hiện",
612
+ "languages": "🌍 Ngôn ngữ có sẵn: {languages}",
613
+ "addingMissingKeys": "➕ Thêm khóa bị thiếu vào file dịch...",
614
+ "processing": "🔄 Đang xử lý {language}...",
615
+ "addedKeys": "✅ Đã thêm {count} phím bị thiếu",
616
+ "changeDetails": "📝 {file}: {key}",
617
+ "andMore": "...Và {count} hơn",
618
+ "noChangesNeeded": "✅ Không cần thay đổi gì {language}",
619
+ "summaryTitle": "📊 TÓM TẮT HOÀN THÀNH",
620
+ "totalChanges": "📝 Tổng số thay đổi: {totalChanges}",
621
+ "languagesProcessed": "🌍 Ngôn ngữ được xử lý: {languagesProcessed}",
622
+ "missingKeysAdded": "➕ Thiếu phím bổ sung: {missingKeysAdded}",
623
+ "nextStepsTitle": "📋 NEXT STEPS",
624
+ "nextStep1": "1. Chạy phân tích mức sử dụng:",
625
+ "nextStep2": "nút i18ntk-usage.js --output-report",
626
+ "nextStep3": "2. Xác thực bản dịch:",
627
+ "nextStep4": "nút i18ntk-validate.js",
628
+ "nextStep5": "3. Phân tích mẫu:",
629
+ "nextStep6": "nút i18ntk-analyze.js",
630
+ "allKeysAvailable": "🎉 Tất cả các khóa dịch hiện đã có sẵn!",
631
+ "runWithoutDryRun": "💡 Chạy không cần --dry-run để áp dụng các thay đổi",
632
+ "deletingOldReport": "🗑️ Đang xóa báo cáo cũ...",
633
+ "generatingFreshAnalysis": "📊 Tạo phân tích sử dụng mới...",
634
+ "couldNotGenerate": "❌ Không thể tạo phân tích sử dụng",
635
+ "reportNotFound": "📋 Không tìm thấy báo cáo sử dụng. Sử dụng các phím chung...",
636
+ "foundMissingKeys": "📋 Đã tìm thấy {count} khóa bị thiếu trong phân tích sử dụng",
637
+ "couldNotParse": "❌ Không thể phân tích báo cáo sử dụng. Sử dụng các phím chung..."
638
+ },
639
+ "noTranslationLanguagesFound": "Không tìm thấy ngôn ngữ dịch",
640
+ "failedToAnalyzeLanguage": "Không thể phân tích ngôn ngữ",
641
+ "translationCompletenessAnalysisFailed": "Phân tích tính hoàn chỉnh của bản dịch không thành công",
642
+ "failedToProcessFile": "Không thể xử lý tệp:",
643
+ "failedToSaveReport": "Không lưu được báo cáo sử dụng: {error}",
644
+ "i18nDirectoryDoesNotExist": "Thư mục I18n không tồn tại: {dir}",
645
+ "reportSavedTo": "Báo cáo sử dụng được lưu vào: {reportPath}",
646
+ "sourceDirectoryDoesNotExist": "Thư mục nguồn không tồn tại: {dir}",
647
+ "noSourceDirectoryConfigured": "(không có cấu hình)"
648
+ },
649
+ "validate": {
650
+ "help_message": "Cách sử dụng trình xác thực dịch thuật I18n: nút i18ntk-validate.js [tùy chọn] Tùy chọn: --source-dir <dir> Thư mục nguồn cần quét (mặc định: ./src) --i18n-dir <dir> Thư mục I18n (mặc định: ./src/locales) --output-report Tạo báo cáo chi tiết --output-dir <dir> Thư mục đầu ra cho các báo cáo (mặc định: ./reports) --help Hiển thị trợ giúp này Ví dụ: node i18ntk-validate.js --output-report node i18ntk-validate.js --source-dir=./app --i18n-dir=./locales node i18ntk-validate.js --output-dir=./analysis --output-report",
651
+ "title": "🔍 Trình xác thực bản dịch I18n",
652
+ "message": "Đang bắt đầu quá trình xác thực...",
653
+ "sourceDirectory": "📁 Thư mục nguồn: {dir}",
654
+ "sourceLanguage": "🌍 Ngôn ngữ nguồn: {sourceLanguage}",
655
+ "strictMode": "⚙️ Chế độ nghiêm ngặt: {mode}",
656
+ "noTargetLanguages": "Không có ngôn ngữ đích nào được định cấu hình; bỏ qua xác nhận mục tiêu. Thêm ngôn ngữ qua \"i18ntk init --lacular=de,fr\".",
657
+ "validatingLanguages": "🌍 Xác thực ngôn ngữ: {langs}",
658
+ "validatingLanguage": "🔍 Xác thực ngôn ngữ: {lang}",
659
+ "filesCount": "📄 Tệp: {count}",
660
+ "keysCount": "🔑 Chìa khóa: {count}",
661
+ "missingFilesCount": "📁 Thiếu tập tin: {count}",
662
+ "syntaxErrorsCount": "❌ Lỗi cú pháp: {count}",
663
+ "translationPercentage": "🎯 Bản dịch: {percentage}% ({translated}/{total} phím)",
664
+ "validationSummary": "📊 TÓM TẮT XÁC NHẬN",
665
+ "validation_failed": "❌ Xác thực không thành công: {error}",
666
+ "totalErrors": "❌ Tổng số lỗi: {count}",
667
+ "totalWarnings": "⚠️ Tổng số cảnh báo: {count}",
668
+ "errorsSection": "❌ ERRORS",
669
+ "warningsSection": "⚠️ WARNINGS",
670
+ "recommendationsSection": "💡 KHUYẾN NGHỊ",
671
+ "fixErrorsFirst": "1. Sửa tất cả các lỗi trước",
672
+ "resolveMissingFilesAndSyntaxErrors": "1. Giải quyết thiếu file và lỗi cú pháp",
673
+ "fixStructuralInconsistencies": "2. Khắc phục sự không nhất quán về cấu trúc",
674
+ "completeMissingTranslations": "3. Hoàn thiện các bản dịch còn thiếu",
675
+ "rerunValidation": "4. Chạy lại xác thực để xác minh các bản sửa lỗi",
676
+ "addressWarnings": "Giải quyết các cảnh báo để cải thiện chất lượng",
677
+ "reviewWarnings": "Xem lại cảnh báo và khắc phục khi thích hợp",
678
+ "considerRunningWithStrict": "2. Cân nhắc việc chạy với cờ --strict để xác thực chặt chẽ hơn",
679
+ "allValidationsPassed": "🎉 Tất cả các xác nhận đã được thông qua!",
680
+ "considerRunningUsageAnalysis": "Hãy cân nhắc việc chạy phân tích mức sử dụng: nút i18ntk-usage.js",
681
+ "deletedOldReport": "🗑️ Đã xóa báo cáo xác thực cũ",
682
+ "sourceDir": "📁 Thư mục nguồn: {sourceDir}",
683
+ "i18nDir": "🌐 Danh mục I18n: {i18nDir}",
684
+ "loadingTranslationFiles": "📋 Đang tải file dịch...",
685
+ "foundTranslationFilesCount": "✅ Đã tìm thấy {count} tập tin dịch",
686
+ "analyzingTranslations": "🔍 Phân tích bản dịch...",
687
+ "validationCompletedSuccessfully": "🎉 Xác thực hoàn tất thành công!",
688
+ "validationErrorsFound": "⚠️ Đã tìm thấy lỗi xác thực: {count}",
689
+ "validationWarningsFound": "⚠️ Đã tìm thấy cảnh báo xác thực: {count}",
690
+ "validationPassed": "✅ Quá trình xác thực được thông qua không có lỗi",
691
+ "validationFailed": "Xác thực không thành công: {error}",
692
+ "startingValidationProcess": "🔍 Bắt đầu quá trình xác nhận...",
693
+ "validationProcessCompletedSuccessfully": "✅ Quá trình xác thực hoàn tất thành công",
694
+ "stackTrace": "Dấu vết ngăn xếp: {stack}",
695
+ "authenticationFailed": "❌ Xác thực không thành công. Truy cập bị từ chối.",
696
+ "fatalValidationError": "❌ Lỗi xác thực nghiêm trọng: {error}",
697
+ "configAccess": "Truy cập cấu hình để xác thực",
698
+ "configValidated": "Cấu hình được xác thực thành công",
699
+ "configError": "Lỗi cấu hình: {error}",
700
+ "validatorInit": "Đang khởi tạo trình xác nhận I18n",
701
+ "validatorInitialized": "Trình xác thực I18n đã được khởi tạo thành công",
702
+ "validatorInitError": "Lỗi khởi tạo trình xác thực: {error}",
703
+ "argsParsing": "Phân tích đối số dòng lệnh",
704
+ "argsParsed": "Đối số dòng lệnh được phân tích thành công",
705
+ "argsParseError": "Lỗi phân tích đối số: {error}",
706
+ "languagesScan": "Quét các ngôn ngữ có sẵn",
707
+ "languagesFound": "Thành lập {count} ngôn ngữ",
708
+ "languagesScanError": "Lỗi quét ngôn ngữ: {error}",
709
+ "filesScan": "Thành lập {count} tập tin trong {language}",
710
+ "filesScanError": "Lỗi quét tập tin: {error}",
711
+ "jsonValidated": "Cú pháp JSON được xác thực: {filePath}",
712
+ "jsonValidationError": "Lỗi xác thực JSON: {error}",
713
+ "languageValidation": "Xác thực ngôn ngữ: {language}",
714
+ "languageValidationError": "Lỗi xác thực ngôn ngữ: {error}",
715
+ "fileDeleted": "Đã xóa tệp",
716
+ "runStarted": "Bắt đầu chạy xác thực",
717
+ "runCompleted": "Quá trình xác thực đã hoàn tất thành công",
718
+ "runError": "Chạy xác thực không thành công: {error}",
719
+ "scriptExecution": "Thực thi tập lệnh",
720
+ "validationCompleted": "Xác thực hoàn tất",
721
+ "validationError": "Lỗi xác thực: {error}",
722
+ "separator": "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━",
723
+ "languageHeader": "🌐 Ngôn ngữ: {language}",
724
+ "validationResults": "📊 Kết quả xác thực",
725
+ "noErrors": "✅ Không tìm thấy lỗi",
726
+ "noWarnings": "✅ Không tìm thấy cảnh báo",
727
+ "summaryHeader": "📋 OVERALL SUMMARY",
728
+ "progressIndicator": "⏳ Đang xử lý...",
729
+ "completedIndicator": "✅ Đã hoàn thành",
730
+ "errorIndicator": "❌ Lỗi",
731
+ "warningIndicator": "⚠️ Cảnh báo",
732
+ "infoIndicator": "ℹ️ Thông tin",
733
+ "sourceDirNotConfigured": "Thư mục nguồn chưa được cấu hình",
734
+ "sourceLanguageNotConfigured": "Ngôn ngữ nguồn chưa được định cấu hình",
735
+ "translationFunctionNotInitialized": "Chức năng dịch không được khởi tạo đúng cách",
736
+ "sourceLanguageDirectoryNotFound": "Không tìm thấy thư mục ngôn ngữ nguồn",
737
+ "specifiedLanguageNotFound": "Không tìm thấy ngôn ngữ được chỉ định",
738
+ "noJsonFilesFound": "Không tìm thấy tệp JSON nào trong thư mục nguồn: {sourceDir}",
739
+ "i18nDirectoryNotFound": "Không tìm thấy thư mục I18n: {i18nDir}",
740
+ "invalidDirectoryPaths": "Đã phát hiện đường dẫn thư mục không hợp lệ",
741
+ "invalidSampleFilePath": "Đường dẫn tệp mẫu không hợp lệ",
742
+ "failedToCreateSampleTranslationFile": "Không tạo được tệp dịch mẫu",
743
+ "invalidFilePathDetected": "Đã phát hiện đường dẫn tệp không hợp lệ",
744
+ "failedToWriteFile": "Không thể ghi tập tin: {filePath}",
745
+ "invalidSourceDirectory": "Thư mục nguồn không hợp lệ: {sourceDir}",
746
+ "invalidSourceLanguageDirectory": "Thư mục ngôn ngữ nguồn không hợp lệ: {sourceDir}"
747
+ },
748
+ "adminCli": {
749
+ "setupPinProtectionTitle": "🔐 Thiết lập Bảo vệ mã PIN của quản trị viên",
750
+ "setupPinProtectionDescription": "Điều này sẽ yêu cầu mã PIN gồm 4-6 chữ số cho các hoạt động quản trị.",
751
+ "enablePinProtectionPrompt": "Bạn có muốn bật tính năng bảo vệ mã PIN của quản trị viên không?",
752
+ "setupCancelled": "Đã hủy thiết lập bảo vệ mã PIN của quản trị viên.",
753
+ "enterPinPrompt": "Nhập mã PIN gồm 4-6 chữ số:",
754
+ "pinFormatError": "❌ PIN phải có 4-6 chữ số. Vui lòng thử lại.",
755
+ "confirmPinPrompt": "Xác nhận mã PIN:",
756
+ "pinMismatchError": "❌ Mã PIN không khớp. Vui lòng thử lại.",
757
+ "pinProtectionEnabledSuccess": "✅ Bảo vệ mã PIN của quản trị viên đã được kích hoạt thành công!",
758
+ "pinRecoveryWarning": "⚠️ Hãy nhớ mã PIN của bạn - không thể khôi phục được nếu bị mất.",
759
+ "setupPinProtectionFailed": "❌ Không thiết lập được bảo vệ mã PIN quản trị viên.",
760
+ "errorSettingUpPin": "❌ Lỗi cài đặt mã PIN quản trị viên: {message}",
761
+ "authRequiredForOperation": "🔐 Yêu cầu xác thực quản trị viên cho: {operation}",
762
+ "invalidPinFormat": "❌ Định dạng mã PIN không hợp lệ. Mã PIN phải có 4-6 chữ số.",
763
+ "authenticationSuccess": "✅ Xác thực thành công!",
764
+ "invalidPinAttemptsRemaining": "❌ Mã PIN không hợp lệ. {remaining} những nỗ lực còn lại.",
765
+ "authenticationFailedAccessDenied": "❌ Xác thực không thành công. Truy cập bị từ chối.",
766
+ "authenticationError": "❌ Lỗi xác thực: {message}",
767
+ "pinProtectionNotEnabled": "Tính năng bảo vệ mã PIN của quản trị viên hiện chưa được bật.",
768
+ "disablingPinProtectionTitle": "🔓 Tắt tính năng bảo vệ mã PIN của quản trị viên",
769
+ "confirmDisablePinProtection": "Bạn có chắc chắn muốn tắt bảo vệ mã PIN của quản trị viên không?",
770
+ "operationCancelled": "Hoạt động bị hủy bỏ.",
771
+ "pinProtectionDisabledSuccess": "✅ Bảo vệ mã PIN của quản trị viên bị vô hiệu hóa.",
772
+ "disablePinProtectionFailed": "❌ Không thể tắt tính năng bảo vệ mã PIN của quản trị viên.",
773
+ "errorDisablingPinProtection": "❌ Lỗi vô hiệu hóa bảo vệ quản trị viên: {message}",
774
+ "adminProtectionStatusTitle": "🔐 Trạng thái bảo vệ của quản trị viên",
775
+ "statusEnabled": "Trạng thái: ✅ ĐÃ BẬT",
776
+ "protectionDetails": "Bảo vệ: Cần có mã PIN 4-6 chữ số cho hoạt động của quản trị viên",
777
+ "lockoutDetails": "Khóa máy: 3 lần thử không thành công = khóa 15 phút",
778
+ "statusDisabled": "Tình trạng: ❌ TẮT",
779
+ "noAuthRequired": "Bảo vệ: Không cần xác thực",
780
+ "unprotectedRisk": "Rủi ro: Hoạt động hành chính không được bảo vệ",
781
+ "errorCheckingAdminStatus": "❌ Lỗi kiểm tra trạng thái quản trị viên: {message}",
782
+ "authRequired": "🔐 Yêu cầu xác thực quản trị viên.",
783
+ "invalidPin": "❌ Mã PIN không hợp lệ.",
784
+ "authSuccess": "✅ Xác thực thành công!",
785
+ "adminPinSetupCli": "quản trị viên_pin_setup_cli",
786
+ "adminAuthFailedCli": "quản trị viên_auth_failed_cli",
787
+ "adminAuthDisabledCli": "quản trị viên_auth_disabled_cli",
788
+ "protectedAccess": "Quyền truy cập được bảo vệ: Cần có xác thực quản trị viên cho các hoạt động nhạy cảm.",
789
+ "enterPin": "Nhập mã PIN quản trị viên:",
790
+ "accessGranted": "Đã cấp quyền truy cập."
791
+ },
792
+ "adminPin": {
793
+ "setup_title": "🔐 Thiết lập mã PIN quản trị viên",
794
+ "setup_separator": "============================================================",
795
+ "setup_description": "Tạo mã PIN gồm 4-6 chữ số để quản trị viên truy cập vào các cài đặt nhạy cảm.",
796
+ "required_for_title": "Mã PIN này sẽ được yêu cầu cho:",
797
+ "required_for_1": "• Thay đổi cài đặt bảo mật",
798
+ "required_for_2": "• Sửa đổi cấu hình nâng cao",
799
+ "required_for_3": "• Truy cập các công cụ gỡ lỗi",
800
+ "required_for_4": "• Đặt lại cài đặt",
801
+ "setup_note": "💡 Lưu ý: Bạn sẽ thấy dấu sao (*) khi gõ - đây chỉ là những ký tự ẩn.",
802
+ "setup_digits_only": "Chỉ các số 0-9 mới được chấp nhận làm chữ số PIN.",
803
+ "invalid_pin_length": "❌ Mã PIN không hợp lệ. Phải có 4-6 chữ số (chỉ các số 0-9).",
804
+ "invalid_pin_example": "Ví dụ: 1234 hoặc 567890",
805
+ "pins_do_not_match": "❌ Mã PIN không khớp.",
806
+ "setup_success": "✅ PIN quản trị viên đã được đặt thành công!",
807
+ "setup_warning": "⚠️ Hãy giữ mã PIN này an toàn. Nó không thể lấy lại được nếu bị mất.",
808
+ "setup_error": "❌ Lỗi thiết lập mã PIN:",
809
+ "session_expired": "⏰ Phiên quản trị đã hết hạn do không hoạt động.",
810
+ "no_pin_set_setting_up": "⚠️ Không có mã PIN quản trị viên nào được đặt. Đang thiết lập mã PIN...",
811
+ "no_pin_configured_access_denied": "⚠️ Chưa định cấu hình mã PIN quản trị viên. Truy cập bị từ chối.",
812
+ "use_admin_settings_to_set_pin": "💡 Sử dụng cài đặt quản trị viên để thiết lập mã PIN trước.",
813
+ "locked_out": "🔒 Quyền truy cập của quản trị viên bị khóa do thử quá nhiều lần không thành công.",
814
+ "wait_before_retry": "Vui lòng đợi 5 phút trước khi thử lại.",
815
+ "access_granted": "✅ Đã cấp quyền truy cập quản trị viên.",
816
+ "incorrect_pin": "❌ Mã PIN không chính xác. {attempts} những nỗ lực còn lại.",
817
+ "verify_pin_error": "❌ Lỗi xác minh mã PIN:",
818
+ "already_configured": "✅ Mã PIN quản trị viên đã được cấu hình.",
819
+ "optional_setup_title": "🔐 Thiết lập mã PIN quản trị viên (Tùy chọn)",
820
+ "optional_setup_description": "Tính năng bảo vệ mã PIN của quản trị viên tăng cường bảo mật cho các hoạt động nhạy cảm như:",
821
+ "setup_prompt": "Bạn có muốn thiết lập mã PIN quản trị viên không? (có/không):",
822
+ "skipping_setup": "⏭️ Bỏ qua việc thiết lập mã PIN quản trị viên. Bạn có thể thiết lập nó sau trong cài đặt.",
823
+ "setup_prompt_error": "❌ Lỗi khi nhắc thiết lập mã PIN:",
824
+ "protectedAccess": "Quyền truy cập được bảo vệ: Cần có xác thực quản trị viên cho các hoạt động nhạy cảm.",
825
+ "enterPin": "Nhập mã PIN quản trị viên:",
826
+ "accessGranted": "Đã cấp quyền truy cập.",
827
+ "invalidPin": "❌ Mã PIN không hợp lệ. Vui lòng thử lại.",
828
+ "weak_pin_warning": "⚠️ CẢNH BÁO: Mã PIN này có vẻ yếu hoặc phổ biến.",
829
+ "weak_pin_suggestion": "💡 Cân nhắc sử dụng mã PIN mạnh hơn với các chữ số đa dạng.",
830
+ "use_anyway_prompt": "Nhập \"có\" để vẫn sử dụng hoặc nhấn Enter để chọn mã PIN khác:",
831
+ "enter_new_pin": "Nhập mã PIN quản trị viên mới (4-6 chữ số):",
832
+ "confirm_pin": "Xác nhận mã PIN quản trị viên:",
833
+ "not_set": "Chưa đặt",
834
+ "pin_display_mask": "####"
835
+ },
836
+ "debug": {
837
+ "title": "🔧 Công cụ gỡ lỗi",
838
+ "separator": "============================================================",
839
+ "mainDebuggerSystemDiagnostics": "1. Chẩn đoán hệ thống",
840
+ "_consoleTranslationsCheck": "// 2. Kiểm tra bản dịch bảng điều khiển",
841
+ "_exportMissingKeys": "// 3. Xuất các khóa dịch bị thiếu",
842
+ "_replaceHardcodedConsole": "// 4. Thay thế chuỗi bảng điều khiển được mã hóa cứng",
843
+ "_consoleKeyChecker": "// 5. Trình kiểm tra khóa bảng điều khiển",
844
+ "debugLogs": "2. Nhật ký gỡ lỗi",
845
+ "backToMainMenu": "0. Quay lại Menu chính",
846
+ "selectOption": "Chọn một công cụ gỡ lỗi:",
847
+ "runningDebugTool": "Đang chạy {displayName}...",
848
+ "debugToolNotFound": "❌ Không tìm thấy công cụ gỡ lỗi: {toolName}",
849
+ "errorRunningDebugTool": "Lỗi chạy công cụ debug'{displayName}': {error}",
850
+ "recentDebugLogs": "📄 Nhật ký gỡ lỗi gần đây",
851
+ "noDebugLogsFound": "❌ Không tìm thấy nhật ký gỡ lỗi.",
852
+ "debugLogsDirectoryNotFound": "❌ Không tìm thấy thư mục nhật ký gỡ lỗi.",
853
+ "selectLogPrompt": "Chọn file nhật ký để xem (1-{count}):",
854
+ "invalidChoiceSelectRange": "Lựa chọn không hợp lệ. Vui lòng chọn từ phạm vi có sẵn.",
855
+ "contentOf": "📄 Nội dung của {filename}:",
856
+ "pressEnterToContinue": "Nhấn Enter để tiếp tục..."
857
+ },
858
+ "detect_language_mismatches": {
859
+ "tool_title": "🔍 Công cụ phát hiện ngôn ngữ không khớp",
860
+ "separator": "=====================================",
861
+ "analyzing_file": "📄 Phân tích {language}.json...",
862
+ "error_analyzing_file": "❌ Phân tích lỗi {filename}: {errorMessage}",
863
+ "results_title": "📊 KẾT QUẢ PHÁT HIỆN SAI NGÔN NGỮ",
864
+ "results_separator": "========================================",
865
+ "summary_title": "📋 SUMMARY:",
866
+ "total_files_analyzed": "Tổng số tệp được phân tích: {totalFiles}",
867
+ "files_with_mismatches": "Các tập tin không khớp: {filesWithMismatches}",
868
+ "total_mismatches_found": "Tổng số điểm không khớp được tìm thấy: {totalMismatches}",
869
+ "no_mismatches_found": "✅ Không tìm thấy ngôn ngữ không khớp! Tất cả các bản dịch dường như đều có ngôn ngữ chính xác của chúng.",
870
+ "detailed_results_title": "🔍 DETAILED RESULTS:",
871
+ "file_mismatch_header": "📄 {filename} ({language})",
872
+ "mismatches_count": "Thành lập {count} (những) không khớp:",
873
+ "mismatch_details": "{index}. Chìa khóa: {key}",
874
+ "mismatch_value": "Giá trị: \"{value}\"",
875
+ "mismatch_issue": "Vấn đề: {description}",
876
+ "recommendations_title": "💡 KHUYẾN NGHỊ:",
877
+ "recommendation_1": "1. Xem lại và dịch tất cả các mục được đánh dấu bằng [TRANSLATE]",
878
+ "recommendation_2": "2. Thay thế tiền tố ngôn ngữ (ví dụ: [DE], [FR]) bằng bản dịch thích hợp",
879
+ "recommendation_3": "3. Dịch văn bản tiếng Anh sang ngôn ngữ mục tiêu thích hợp",
880
+ "recommendation_4": "4. Sử dụng ngôn ngữ tương đương với ngôn ngữ bản địa cho tất cả văn bản mà người dùng nhìn thấy",
881
+ "recommendation_5": "5. Chạy lại công cụ này sau khi chỉnh sửa để xác minh các bản sửa lỗi",
882
+ "detailed_report_saved": "📄 Báo cáo chi tiết được lưu vào: {reportPath}",
883
+ "error_saving_report": "❌ Lỗi lưu báo cáo: {errorMessage}",
884
+ "auto_fix_mode": "🔧 Chế độ tự động sửa lỗi {dryRun}",
885
+ "auto_fix_separator": "=====================================",
886
+ "fixed_file": "✅ Đã sửa {filename}",
887
+ "auto_fix_summary_title": "📊 Tự động sửa lỗi",
888
+ "total_fixes_applied": "Tổng số bản sửa lỗi được áp dụng: {count}",
889
+ "preview_fixes_title": "🔍 Xem trước bản sửa lỗi:",
890
+ "fix_details": "{file}: {key} Cũ: \"{old}\" Mới: \"{new}\"",
891
+ "more_fixes": "... Và {count} nhiều bản sửa lỗi hơn",
892
+ "run_with_apply_fixes": "💡 Chạy với --apply để áp dụng các bản sửa lỗi này",
893
+ "error_general": "❌ Lỗi:",
894
+ "mainDebuggerSystemDiagnostics": "Trình gỡ lỗi chính/Chẩn đoán hệ thống",
895
+ "exportMissingKeys": "Xuất các khóa bị thiếu",
896
+ "replaceHardcodedConsole": "Thay thế bảng điều khiển được mã hóa cứng",
897
+ "consoleKeyChecker": "Trình kiểm tra khóa bảng điều khiển",
898
+ "debugLogs": "Nhật ký gỡ lỗi",
899
+ "backToMainMenu": "Quay lại Menu chính",
900
+ "invalidChoiceSelectRange": "❌ Lựa chọn không hợp lệ. Vui lòng chọn một số trong phạm vi hiển thị.",
901
+ "runningDebugTool": "Chạy công cụ gỡ lỗi: {displayName}",
902
+ "debugToolNotFound": "Công cụ gỡ lỗi '{toolName}' không tìm thấy.",
903
+ "recentDebugLogs": "Nhật ký gỡ lỗi gần đây",
904
+ "noDebugLogsFound": "Không tìm thấy nhật ký gỡ lỗi.",
905
+ "logEntry": "Đăng nhập: {timestamp} - {message}",
906
+ "debugLogsDirectoryNotFound": "Không tìm thấy thư mục nhật ký gỡ lỗi."
907
+ },
908
+ "help": {
909
+ "title": "📊 TRỢ GIÚP QUẢN LÝ I18NTK",
910
+ "usage": "Cách sử dụng: nút main/manage/index.js [tùy chọn]",
911
+ "interactiveMode": "💡 Sử dụng: node main/manage/index.js --command=<command> để thực hiện trực tiếp",
912
+ "showHelp": "📖 Sử dụng: node main/manage/index.js --help cho các lệnh có sẵn",
913
+ "availableCommands": "📖 Các lệnh có sẵn:",
914
+ "initProject": "🚀 Khởi tạo ngôn ngữ mới",
915
+ "analyzeTranslations": "🔍 Phân tích bản dịch",
916
+ "validateTranslations": "✅ Xác thực bản dịch",
917
+ "checkUsage": "📊 Kiểm tra việc sử dụng khóa",
918
+ "initCommand": "init - Khởi tạo ngôn ngữ mới",
919
+ "analyzeCommand": "analyze - Phân tích bản dịch",
920
+ "validateCommand": "xác thực - Xác thực bản dịch",
921
+ "usageCommand": "cách sử dụng - Kiểm tra việc sử dụng khóa",
922
+ "sizingCommand": "định cỡ - Phân tích kích thước",
923
+ "completeCommand": "hoàn thành - Bản dịch hoàn chỉnh (phủ sóng 100%)",
924
+ "summaryCommand": "tóm tắt - Hiển thị trạng thái dự án",
925
+ "debugCommand": "gỡ lỗi - Gỡ lỗi các vấn đề dịch thuật",
926
+ "scannerCommand": "máy quét - Quét tìm chìa khóa",
927
+ "translateCommand": "dịch - Tự động dịch tập tin ngôn ngữ",
928
+ "menu": {
929
+ "pressEnterToContinue": "Nhấn Enter để tiếp tục...",
930
+ "title": "🌐 MENU QUẢN LÝ I18NTK",
931
+ "description": "Menu tương tác để quản lý quốc tế hóa",
932
+ "exit": "🚪 Thoát"
933
+ },
934
+ "commands": {
935
+ "init": "init - Khởi tạo ngôn ngữ mới",
936
+ "analyze": "analyze - Phân tích bản dịch",
937
+ "validate": "xác thực - Xác thực bản dịch",
938
+ "usage": "cách sử dụng - Kiểm tra việc sử dụng khóa",
939
+ "sizing": "định cỡ - Phân tích kích thước",
940
+ "complete": "hoàn thành - Bản dịch hoàn chỉnh (phủ sóng 100%)",
941
+ "summary": "tóm tắt - Hiển thị trạng thái dự án",
942
+ "debug": "gỡ lỗi - Gỡ lỗi các vấn đề dịch thuật"
943
+ },
944
+ "options": {
945
+ "sourceDir": "--nguồn-thư mục <dir> Thư mục nguồn để phân tích",
946
+ "output": "--đầu ra <file> Tệp đầu ra cho báo cáo",
947
+ "verbose": "--verbose, -v Hiển thị thông tin chi tiết",
948
+ "keepReports": "--keep-reports Giữ các báo cáo hiện có",
949
+ "deleteReports": "--delete-reports Xóa các báo cáo hiện có",
950
+ "help": "--help, -h Hiển thị trợ giúp này"
951
+ },
952
+ "examples": {
953
+ "title": "Ví dụ:",
954
+ "example1": "nút i18ntk-manage.js",
955
+ "example2": "nút i18ntk-manage.js --source-dir ./locales",
956
+ "example3": "nút i18ntk-manage.js --output summary-report.txt",
957
+ "example4": "nút i18ntk-manage.js --verbose",
958
+ "example5": "nút i18ntk-manage.js --source-dir ./locales --output report.json"
959
+ },
960
+ "features": {
961
+ "initProject": "🚀 Khởi tạo ngôn ngữ mới",
962
+ "analyzeTranslations": "🔍 Phân tích bản dịch",
963
+ "validateTranslations": "✅ Xác thực bản dịch",
964
+ "checkUsage": "📊 Kiểm tra việc sử dụng khóa",
965
+ "completeTranslations": "🎯 Bản dịch hoàn chỉnh (phủ sóng 100%)",
966
+ "showSizing": "📏 Phân tích kích thước",
967
+ "runWorkflow": "🔄 Chạy toàn bộ quy trình làm việc",
968
+ "showStatus": "📋 Hiển thị trạng thái dự án",
969
+ "deleteReports": "🗑️ Xóa tất cả báo cáo",
970
+ "changeLanguage": "🌍 Thay đổi ngôn ngữ giao diện người dùng",
971
+ "settings": "⚙️ Cài đặt",
972
+ "showHelp": "❓ Trợ giúp",
973
+ "debugTools": "🔧 Công cụ gỡ lỗi"
974
+ },
975
+ "messages": {
976
+ "selectOption": "Chọn một tùy chọn:",
977
+ "invalidOption": "Tùy chọn không hợp lệ. Vui lòng thử lại.",
978
+ "operationCompleted": "✅ Thao tác đã hoàn tất thành công!",
979
+ "pressEnter": "Nhấn Enter để tiếp tục...",
980
+ "goodbye": "👋 Tạm biệt!",
981
+ "unknownCommand": "Lệnh không xác định: {command}",
982
+ "nonInteractive": "⚠️ Đã phát hiện chế độ không tương tác. Menu hiển thị chỉ để tham khảo."
983
+ },
984
+ "i18n_helper": {
985
+ "translation_file_not_found": "Không tìm thấy tập tin dịch: {translationFile}",
986
+ "error_loading_translations": "Lỗi tải bản dịch: {errorMessage}",
987
+ "translation_not_found": "Không tìm thấy bản dịch cho khóa: {key}",
988
+ "translation_key_not_string": "Khóa dịch không phân giải thành chuỗi: {key}",
989
+ "error_reading_locales_directory": "Lỗi đọc thư mục địa phương: {errorMessage}"
990
+ }
991
+ },
992
+ "init": {
993
+ "initializationTitle": "🚀 Bộ công cụ quản lý i18n - Khởi tạo dự án",
994
+ "initializationCancelled": "🚫 Việc khởi tạo bị người dùng hủy bỏ.",
995
+ "sourceDirectoryLabel": "📁 Thư mục nguồn: {dir}",
996
+ "requiredTitle": "Yêu cầu khởi tạo",
997
+ "requiredBody": "Dự án này phải được khởi tạo trước khi chạy lệnh này.",
998
+ "promptRunNow": "Bạn có muốn chạy quá trình khởi tạo ngay bây giờ không? (có/không):",
999
+ "sourceLanguageLabel": "🌍 Ngôn ngữ nguồn: {language}",
1000
+ "detectedI18nFrameworks": "🔍 Đã phát hiện (các) khung i18n: {frameworks}",
1001
+ "pinMustBe4Digits": "🔐 PIN phải có 4 chữ số.",
1002
+ "existingDirectoriesFound": "📁 Thư mục dịch hiện có được tìm thấy:",
1003
+ "useExistingDirectoryPrompt": "Bạn có muốn sử dụng thư mục hiện có? (có/không)",
1004
+ "selectDirectoryPrompt": "Chọn thư mục bằng cách nhập số (hoặc chọn 'Tạo thư mục mới')",
1005
+ "enterNewDirectoryName": "Nhập tên cho thư mục dịch mới của bạn",
1006
+ "createdNewDirectory": "✅ Tạo thư mục mới: {dir}",
1007
+ "directoryAlreadyExists": "⚠️ Danh mục đã tồn tại: {dir}",
1008
+ "invalidDirectoryName": "❌ Tên thư mục được cung cấp không hợp lệ.",
1009
+ "usingExistingDirectory": "Sử dụng thư mục hiện có: {dir}",
1010
+ "adminPinSetupOptional": "🔐 Tùy chọn thiết lập mã PIN quản trị viên (được khuyến nghị để bảo mật)",
1011
+ "adminPinSeparator": "------------------------------",
1012
+ "adminPinDescription1": "PIN quản trị viên: số gồm 4 chữ số để truy cập an toàn",
1013
+ "adminPinDescription2": "Để trống để bỏ qua thiết lập mã PIN",
1014
+ "adminPinDescription3": "Nếu bạn đặt mã PIN, mã PIN này sẽ được yêu cầu cho tất cả các hành động bảo mật trong tương lai.",
1015
+ "adminPinDescription4": "Mã hóa AES-256-GCM được sử dụng để lưu trữ mã PIN an toàn.",
1016
+ "adminPinSetupPrompt": "Nhập mã PIN quản trị viên (4 chữ số) hoặc để trống để bỏ qua:",
1017
+ "skippingAdminPinSetup": "Đang bỏ qua thiết lập mã PIN của quản trị viên...",
1018
+ "settingUpAdminPin": "🔐 Đang thiết lập mã PIN quản trị...",
1019
+ "enterAdminPin": "Nhập mã PIN quản trị viên:",
1020
+ "confirmAdminPin": "Xác nhận mã PIN của quản trị viên:",
1021
+ "pinMismatch": "Mã PIN không khớp. Vui lòng thử lại.",
1022
+ "adminPinSetupSuccess": "🔐 Thiết lập mã PIN quản trị viên thành công!",
1023
+ "adminPinSetupFailure": "🔐 Thiết lập mã PIN quản trị viên không thành công. Vui lòng thử lại.",
1024
+ "adminProtectionEnabled": "🔐 Đã bật tính năng bảo vệ của quản trị viên. Tất cả các hành động đều yêu cầu xác thực mã PIN.",
1025
+ "adminProtectionDisabled": "🔐 Bảo vệ quản trị viên bị vô hiệu hóa. Tất cả các hành động hiện có sẵn mà không cần mã PIN.",
1026
+ "autoDetectedI18nDirectory": "Thư mục i18n được tự động phát hiện: {directory}",
1027
+ "initializingProject": "⚙️ Đang khởi tạo cấu hình dự án...",
1028
+ "createdSampleTranslationFile": "✅ Đã tạo file dịch mẫu: {file}",
1029
+ "languageSelectionTitle": "🌐 Cấu hình ngôn ngữ",
1030
+ "available": "Có sẵn",
1031
+ "defaultLanguages": "📝 Ngôn ngữ mặc định: {languages}",
1032
+ "enterLanguageCodes": "🎯 Nhập mã ngôn ngữ đích (được phân tách bằng dấu phẩy, ví dụ: de, es, fr, ru):",
1033
+ "targetLanguages": "🌍 Ngôn ngữ mục tiêu",
1034
+ "foundSourceFiles": "📄 Đã tìm thấy {count} tập tin nguồn để phân tích",
1035
+ "processingLanguage": "🔄 Ngôn ngữ xử lý: {language}",
1036
+ "fileProcessingResult": "✅ Đã xử lý {file}: {translated}/{total} phím ({percentage}%)",
1037
+ "overallProgress": "📊 Tiến độ chung: {translated}/{total} khóa được xử lý ({percentage}%)",
1038
+ "initializationSummaryTitle": "📋 Tóm tắt khởi tạo",
1039
+ "languageSummary": "{icon} {name} ({code}): {percentage}% hoàn thành",
1040
+ "languageFiles": "📄 Tệp: {count}",
1041
+ "languageKeys": "🔤 Chìa khóa: {translated}/{total}",
1042
+ "languageMissing": "⚠️ Thiếu: {count}",
1043
+ "initializationCompletedSuccessfully": "🎉 Quá trình khởi tạo dự án đã hoàn tất thành công!",
1044
+ "nextStepsTitle": "🚀 Các bước tiếp theo",
1045
+ "nextStep1": "1. Xem lại các tệp dịch đã tạo trong thư mục locales/ của bạn",
1046
+ "nextStep2": "2. Thêm bản dịch cho từng ngôn ngữ đích",
1047
+ "nextStep3": "3. Chạy lại 'npm run i18ntk' để xác thực bản dịch",
1048
+ "detectedFrameworks": "✅ Đã phát hiện (các) khung i18n: {frameworks}",
1049
+ "setup": {
1050
+ "title": "Cài đặt",
1051
+ "question": "Câu hỏi thiết lập",
1052
+ "opt_single": "Tệp đơn",
1053
+ "opt_modular": "Mô-đun",
1054
+ "opt_existing": "hiện có",
1055
+ "choice_prompt": "Chọn một tùy chọn:",
1056
+ "opt_confirm": "Xác nhận",
1057
+ "opt_cancel": "Hủy bỏ",
1058
+ "apply_all_prompt": "Áp dụng cấu trúc này cho tất cả các ngôn ngữ? (có/không):",
1059
+ "per_language_intro": "Bạn đã chọn định cấu hình ngôn ngữ riêng lẻ. Dưới đây là các ngôn ngữ có sẵn:",
1060
+ "available_languages": "Ngôn ngữ có sẵn: {languages}",
1061
+ "include_prompt": "Nhập mã ngôn ngữ được phân tách bằng dấu phẩy để bao gồm (ví dụ: 'de,fr,es'):"
1062
+ },
1063
+ "warnings": {
1064
+ "noPackageJson": "Không tìm thấy gói.json. Không thể tự động phát hiện khung i18n."
1065
+ },
1066
+ "errorsPackageJsonRead": "Lỗi đọc package.json: {error}",
1067
+ "errorsNoFramework": "Không phát hiện thấy khung i18n. Vui lòng cài đặt một hoặc chỉ định thủ công.",
1068
+ "suggestions": {
1069
+ "noFramework": "Không phát hiện thấy khung i18n. Hãy cân nhắc sử dụng một trong những cách sau:",
1070
+ "installFramework": "Để cài đặt khung, hãy chạy: npm install <package-name>"
1071
+ },
1072
+ "frameworks": {
1073
+ "react": "- Phản ứng i18next (Reac-i18next)",
1074
+ "vue": "- Vue i18n (vue-i18n)",
1075
+ "i18next": "- i18next (i18next)",
1076
+ "nuxt": "- Nuxt i18n (@nuxtjs/i18n)",
1077
+ "svelte": "- Mảnh dẻ i18n (mảnh dẻ-i18n)"
1078
+ },
1079
+ "continueWithoutI18nPrompt": "Không phát hiện thấy khung i18n. Bạn có muốn tiếp tục mà không có ai không? (có/không):",
1080
+ "detectedI18nFramework": "Đã phát hiện khung i18n: {frameworks}",
1081
+ "existingDirectoryItem": "{index}. {location}",
1082
+ "usingExistingStructure": "Sử dụng cấu trúc hiện có: {dir}",
1083
+ "creatingSourceDirectory": "Tạo thư mục nguồn: {dir}",
1084
+ "creatingSourceLanguageDirectory": "Tạo thư mục ngôn ngữ nguồn: {dir}",
1085
+ "errors": {
1086
+ "errorExecutingCommand": "Lỗi thực thi lệnh: {error}",
1087
+ "sourceDirectoryNotFound": "Không tìm thấy thư mục nguồn: {dir}",
1088
+ "sourceLanguageDirectoryNotFound": "Không tìm thấy thư mục ngôn ngữ nguồn: {dir}",
1089
+ "noJsonFilesInSourceDirectory": "Không tìm thấy tệp JSON nào trong thư mục nguồn: {dir}",
1090
+ "invalidFilePathDetected": "Đã phát hiện đường dẫn tệp không hợp lệ",
1091
+ "initializationFailed": "Khởi tạo không thành công: {error}",
1092
+ "noFramework": "Không phát hiện thấy khung i18n. Tiếp tục với chế độ chung.",
1093
+ "packageJsonRead": "Lỗi đọc package.json."
1094
+ },
1095
+ "processingFile": "Xử lý {file} vì {language}...",
1096
+ "fileAlreadyExistsMerging": "Tài liệu {file} đã tồn tại rồi. Hợp nhất các khóa mới.",
1097
+ "createdNewFile": "Đã tạo tập tin mới: {file}",
1098
+ "updatedFile": "Tập tin được cập nhật: {file}",
1099
+ "skippingExcludedFile": "Bỏ qua {file} vì {language} vì nó bị loại trừ.",
1100
+ "continuingWithoutAdminPin": "Tiếp tục mà không cần thiết lập mã PIN quản trị viên.",
1101
+ "createdSourceLanguageDirectory": "Đã tạo thư mục ngôn ngữ nguồn: {dir}",
1102
+ "errorSettingUpAdminPin": "Lỗi khi thiết lập mã PIN quản trị viên: {error}",
1103
+ "noTargetLanguagesSpecified": "Không có ngôn ngữ mục tiêu được chỉ định.",
1104
+ "translationFilesCreatedWarning": "Các tệp dịch đã được tạo bằng phần giữ chỗ; xem xét trước khi sử dụng sản xuất.",
1105
+ "warningCannotReadSourceDir": "Cảnh báo: không thể đọc thư mục nguồn {dir}: {error}",
1106
+ "warningInvalidLanguageCodes": "Cảnh báo: mã ngôn ngữ không hợp lệ bị bỏ qua: {languages}",
1107
+ "warningProceedingWithoutFramework": "Tiếp tục mà không phát hiện thấy khung i18n.",
1108
+ "backup": {
1109
+ "title": "Cài đặt sao lưu",
1110
+ "description": "Theo mặc định, các bản sao lưu bị tắt để tránh đệ quy sao lưu và ô nhiễm kho lưu trữ.",
1111
+ "enablePrompt": "Bật sao lưu tự động? (có/không):",
1112
+ "keepPrompt": "Có bao nhiêu bản sao lưu sẽ được giữ tự động (1-3, mặc định 1):"
1113
+ },
1114
+ "completionSummaryTitle": "Tóm tắt hoàn thành",
1115
+ "completionSummaryBasicTitle": "Tóm tắt hoàn thành (Cơ bản)",
1116
+ "totalChanges": "Tổng số thay đổi: {count}",
1117
+ "languagesProcessed": "Ngôn ngữ được xử lý: {count}",
1118
+ "missingKeysAdded": "Các phím bị thiếu đã được thêm vào: {count}",
1119
+ "reportPrompt": "Bạn có muốn tạo một báo cáo không? (Có/không):",
1120
+ "reportGenerated": "Báo cáo được tạo: {reportPath}",
1121
+ "reportFailed": "Không tạo được báo cáo: {error}",
1122
+ "completionError": "Lỗi khi hoàn thành: {error}",
1123
+ "optimize": {
1124
+ "title": "Tối ưu hóa kích thước gói hàng",
1125
+ "preview": "Đang chạy bản xem trước tối ưu hóa ngôn ngữ...",
1126
+ "reduceTip": "Bạn có thể giảm kích thước gói bằng cách chỉ chọn ngôn ngữ bạn cần.",
1127
+ "prompt": "Bạn có muốn chạy tối ưu hóa tương tác ngay bây giờ không? (có/không):",
1128
+ "starting": "Đang bắt đầu tối ưu hóa ngôn ngữ tương tác...",
1129
+ "completed": "Tối ưu hóa gói hoàn tất.",
1130
+ "later": "Bạn có thể chạy tối ưu hóa ngôn ngữ sau với:",
1131
+ "unavailable": "Không thể cung cấp tối ưu hóa ngôn ngữ: {error}"
1132
+ }
1133
+ },
1134
+ "language": {
1135
+ "title": "🌍 Thay đổi ngôn ngữ",
1136
+ "separator": "============================================================",
1137
+ "current": "Ngôn ngữ hiện tại: {language}",
1138
+ "available": "Ngôn ngữ có sẵn:",
1139
+ "languageOption": "{index}. {displayName}{current}",
1140
+ "backToMainMenu": "Quay lại Menu chính",
1141
+ "prompt": "Chọn ngôn ngữ (0-8):",
1142
+ "cancelled": "Đã hủy thay đổi ngôn ngữ.",
1143
+ "invalid": "Lựa chọn không hợp lệ. Vui lòng thử lại.",
1144
+ "changed": "Ngôn ngữ đã thay đổi thành: {language}",
1145
+ "changeFailed": "Không thể thay đổi ngôn ngữ: {error}",
1146
+ "pressEnterToContinue": "Nhấn Enter để tiếp tục..."
1147
+ },
1148
+ "maintainLanguagePurity": {
1149
+ "workflow_title": "🚀 Quy trình bảo trì độ tinh khiết của ngôn ngữ",
1150
+ "step1_title": "📊 BƯỚC 1: Đánh giá mức độ thuần khiết ngôn ngữ ban đầu",
1151
+ "step2_title": "🔧 BƯỚC 2: Phát hiện và tự động sửa lỗi ngôn ngữ không khớp",
1152
+ "step3_title": "🌐 BƯỚC 3: Áp dụng bản dịch tự động",
1153
+ "step4_title": "✅ BƯỚC 4: Đánh giá mức độ thuần khiết ngôn ngữ cuối cùng",
1154
+ "workflow_error": "❌ Lỗi quy trình làm việc: {errorMessage}",
1155
+ "running_initial_validation": "Đang chạy xác thực độ thuần khiết của ngôn ngữ ban đầu...",
1156
+ "initial_assessment_complete": "✅ Hoàn tất đánh giá ban đầu: {count} phát hiện vi phạm",
1157
+ "initial_assessment_warnings": "⚠️ Đánh giá ban đầu đã hoàn thành kèm theo cảnh báo",
1158
+ "detecting_fixing_mismatches": "Phát hiện và sửa lỗi ngôn ngữ không khớp...",
1159
+ "detection_complete_applying_fixes": "Phát hiện hoàn tất. Đang áp dụng tính năng sửa lỗi tự động...",
1160
+ "mismatch_fixes_complete": "✅ Hoàn tất sửa lỗi không khớp ngôn ngữ: {count} sửa lỗi được áp dụng",
1161
+ "mismatch_fixes_warnings": "⚠️ Đã hoàn tất sửa lỗi không khớp ngôn ngữ kèm theo cảnh báo",
1162
+ "applying_automatic_translations": "Áp dụng dịch tự động...",
1163
+ "translation_preview_complete": "Bản xem trước bản dịch đã hoàn tất. Áp dụng dịch..."
1164
+ },
1165
+ "menu": {
1166
+ "title": "🌐 MENU QUẢN LÝ I18NTK",
1167
+ "separator": "============================================================",
1168
+ "options": {
1169
+ "init": "🚀 Khởi tạo ngôn ngữ mới",
1170
+ "analyze": "🔍 Phân tích bản dịch",
1171
+ "validate": "✅ Xác thực bản dịch",
1172
+ "usage": "📊 Kiểm tra việc sử dụng khóa",
1173
+ "complete": "🎯 Bản dịch hoàn chỉnh (phủ sóng 100%)",
1174
+ "sizing": "📏 Phân tích kích thước",
1175
+ "fix": "🛠️ Sửa bản dịch giữ chỗ",
1176
+ "scanner": "🔍 Quét các vấn đề về i18n",
1177
+ "translate": "🌐 Dịch tự động",
1178
+ "workflow": "🔄 Chạy toàn bộ quy trình làm việc",
1179
+ "status": "📋 Hiển thị trạng thái dự án",
1180
+ "delete": "🗑️ Xóa tất cả báo cáo",
1181
+ "language": "🌍 Thay đổi ngôn ngữ giao diện người dùng",
1182
+ "settings": "⚙️ Cài đặt",
1183
+ "help": "❓ Trợ giúp",
1184
+ "debug": "🔧 Công cụ gỡ lỗi",
1185
+ "exit": "🚪 Thoát"
1186
+ },
1187
+ "update": "📦 Gói cập nhật",
1188
+ "goodbye": "👋 Tạm biệt!",
1189
+ "invalidChoice": "Lựa chọn không hợp lệ. Vui lòng chọn 0-15.",
1190
+ "returning": "Đang quay lại menu chính...",
1191
+ "invalidOption": "Tùy chọn không hợp lệ. Vui lòng thử lại.",
1192
+ "nonInteractiveModeWarning": "Đã phát hiện chế độ không tương tác. Menu hiển thị chỉ để tham khảo.",
1193
+ "useDirectExecution": "Sử dụng: nút main/manage/index.js --command=<command> để thực hiện trực tiếp.",
1194
+ "useHelpForCommands": "Sử dụng: node main/manage/index.js --help cho các lệnh có sẵn.",
1195
+ "returnToMainMenu": "Nhấn Enter để trở về Menu chính.",
1196
+ "pressEnterToContinue": "Nhấn Enter để tiếp tục...",
1197
+ "selectOptionPrompt": "Chọn một tùy chọn:",
1198
+ "selectDebugToolPrompt": "Chọn một công cụ gỡ lỗi:",
1199
+ "selectLogPrompt": "Chọn một tệp nhật ký (1-{count}):",
1200
+ "autoDetectedI18nDirectory": "Thư mục i18n được tự động phát hiện: {directory}",
1201
+ "executingCommand": "Lệnh thực thi: {command}",
1202
+ "unknownCommand": "Lệnh không xác định: {command}",
1203
+ "languageOption": "{index}. {displayName}{current}",
1204
+ "debugTools": {
1205
+ "1": "Phân tích tệp nhật ký",
1206
+ "2": "Phân tích việc sử dụng khóa dịch",
1207
+ "3": "Phân tích tính hoàn chỉnh của bản dịch",
1208
+ "4": "Phân tích định dạng dịch",
1209
+ "5": "Phân tích kiểu dịch",
1210
+ "6": "Phân tích cấu trúc dịch thuật"
1211
+ },
1212
+ "native_translations": {
1213
+ "exact_translation_found": "✅ {keyPath}: {value}",
1214
+ "no_exact_translation": "⚠️ Không có bản dịch chính xác cho '{keyPath}', các khóa tương tự được tìm thấy:",
1215
+ "similar_key": "- {key} ({similarity}% cuộc thi đấu)",
1216
+ "processing_language_files": "🔄 Đang xử lý {count} tập tin ngôn ngữ...",
1217
+ "file_not_found": "⚠️ Không tìm thấy tệp: {file}",
1218
+ "processing_translations": "🌍 Đang xử lý {code} bản dịch...",
1219
+ "backup_created": "📋 Đã tạo bản sao lưu: {filename}",
1220
+ "error_parsing_json": "❌ Lỗi phân tích cú pháp {code}.json: {errorMessage}",
1221
+ "existing_keys_found": "📊 {code}: Thành lập {count} khóa hiện có",
1222
+ "error_writing_json": "❌ Viết sai {code}.json: {errorMessage}",
1223
+ "translations_replaced": "📊 {code}: {count} bản dịch thay thế",
1224
+ "translation_replacement_complete": "✅ Thay thế bản dịch hoàn tất!",
1225
+ "total_replacements": "📊 Tổng số lần thay thế: {count}",
1226
+ "dry_run_mode": "⚠️ CHẾ ĐỘ CHẠY DRY - Không có tập tin nào được sửa đổi",
1227
+ "tool_title": "🌍 Trình thay thế bản dịch gốc v1.9.1",
1228
+ "tool_separator": "======================================",
1229
+ "dry_run_warning": "⚠️ Chạy ở chế độ DRY RUN - không có tập tin nào bị sửa đổi",
1230
+ "error_during_replacement": "❌ Lỗi trong quá trình thay thế bản dịch:"
1231
+ }
1232
+ },
1233
+ "config": {
1234
+ "dirFallbackWarning": "⚠️ Danh mục {dir} không tìm thấy. sử dụng {fallback}.",
1235
+ "dirInvalidError": "❌ Thư mục không hợp lệ: {dir}"
1236
+ },
1237
+ "operations": {
1238
+ "completed": "✅ Thao tác đã hoàn tất thành công!",
1239
+ "deleteReportsTitle": "🗑️ Xóa báo cáo, nhật ký và bộ nhớ đệm",
1240
+ "scanningForFiles": "🔍 Đang quét file để xóa...",
1241
+ "noFilesFoundToDelete": "✅ Không tìm thấy tập tin nào để xóa.",
1242
+ "availableDirectories": "📁 Danh mục có sẵn:",
1243
+ "allDirectories": "Tất cả các thư mục",
1244
+ "andMore": "và hơn thế nữa...",
1245
+ "cancelOption": "Hủy bỏ",
1246
+ "cancelReportOption": "Hủy/Quay lại Menu",
1247
+ "invalidSelection": "❌ Lựa chọn không hợp lệ.",
1248
+ "foundFilesInSelectedDirectories": "📊 Đã tìm thấy {count} tập tin trong thư mục đã chọn:",
1249
+ "deletionOptions": "🗑️ Tùy chọn xóa:",
1250
+ "deleteAllFiles": "Xóa tất cả các tập tin",
1251
+ "keepLast3Files": "Giữ 3 tệp cuối cùng (theo ngày)",
1252
+ "keepLast5Files": "Giữ 5 tệp cuối cùng (theo ngày)",
1253
+ "noFilesToDelete": "✅ Không có tập tin để xóa.",
1254
+ "filesToDeleteCount": "📋 Các tập tin cần xóa: {count}",
1255
+ "filesToKeepCount": "📋 Hồ sơ cần lưu giữ: {count}",
1256
+ "confirmDeletion": "⚠️ Bạn có chắc chắn muốn xóa những tập tin này? (có/không):",
1257
+ "deletedFile": "✅ Đã xóa: {filename}",
1258
+ "failedToDeleteFile": "❌ Không xóa được {filename}: {error}",
1259
+ "cancelled": "❌ Hoạt động bị hủy bỏ.",
1260
+ "init": {
1261
+ "title": "🚀 Khởi tạo ngôn ngữ mới"
1262
+ },
1263
+ "usage": {
1264
+ "title": "📊 Kiểm tra việc sử dụng khóa",
1265
+ "noUsedKeysHint": "Tìm thấy bản dịch nhưng không có cách sử dụng trong nguồn. Kiểm tra --source-dir và TranslationPatterns."
1266
+ },
1267
+ "analyze": {
1268
+ "title": "🔍 Phân tích bản dịch"
1269
+ },
1270
+ "validate": {
1271
+ "title": "✅ Xác thực bản dịch"
1272
+ },
1273
+ "settings": {
1274
+ "title": "⚙️ Quản lý cài đặt",
1275
+ "separator": "============================================================"
1276
+ },
1277
+ "complete": {
1278
+ "deletingOldReport": "🗑️ Xóa báo cáo sử dụng cũ để phân tích mới",
1279
+ "generatingFreshAnalysis": "🔄 Tạo phân tích sử dụng mới...",
1280
+ "couldNotGenerate": "⚠️ Không thể tạo phân tích sử dụng. Sử dụng các phím bị thiếu phổ biến.",
1281
+ "reportNotFound": "⚠️ Không tìm thấy báo cáo sử dụng. Đang tạo phân tích mới...",
1282
+ "foundMissingKeys": "🔍 Đã tìm thấy {count} khóa bị thiếu trong phân tích sử dụng",
1283
+ "couldNotParse": "⚠️ Không thể phân tích báo cáo sử dụng. Sử dụng các phím bị thiếu phổ biến.",
1284
+ "title": "🎯 HOÀN THÀNH DỊCH",
1285
+ "separator": "============================================================",
1286
+ "sourceDir": "📁 Thư mục nguồn: {sourceDir}",
1287
+ "sourceLanguage": "🔤 Ngôn ngữ nguồn: {sourceLanguage}",
1288
+ "dryRunMode": "🧪 CHẾ ĐỘ CHẠY DRY - Không có tập tin nào bị sửa đổi",
1289
+ "languages": "🎯 Ngôn ngữ mục tiêu: {languages}",
1290
+ "addingMissingKeys": "➕ Thêm khóa bị thiếu vào file dịch...",
1291
+ "processing": "🔄 Đang xử lý {language}...",
1292
+ "addedKeys": "✅ Đã thêm {count} phím",
1293
+ "changeDetails": "📝 {file}: {key}",
1294
+ "noChangesNeeded": "✅ Không cần thay đổi gì {language}",
1295
+ "summaryTitle": "📊 TÓM TẮT HOÀN THÀNH",
1296
+ "totalChanges": "📝 Tổng số thay đổi: {totalChanges}",
1297
+ "languagesProcessed": "🌐 Ngôn ngữ được xử lý: {languagesProcessed}",
1298
+ "missingKeysAdded": "➕ Thiếu phím bổ sung: {missingKeysAdded}",
1299
+ "nextStepsTitle": "📋 NEXT STEPS",
1300
+ "nextStep1": "1. Chạy phân tích mức sử dụng:",
1301
+ "nextStep2": "2. Xác thực bản dịch:",
1302
+ "nextStep3": "3. Phân tích tính đầy đủ:",
1303
+ "allKeysAvailable": "🎉 Tất cả các khóa dịch hiện đã có sẵn!",
1304
+ "runWithoutDryRun": "💡 Chạy không cần --dry-run để áp dụng các thay đổi",
1305
+ "pressEnterToContinue": "Nhấn Enter để tiếp tục..."
1306
+ },
1307
+ "updatePackage": {
1308
+ "title": "📦 Cập nhật gói i18n-toolkit",
1309
+ "description": "Điều này sẽ cập nhật gói bộ công cụ i18n lên phiên bản mới nhất có sẵn trên npm.",
1310
+ "command": "Lệnh chạy",
1311
+ "confirm": "Bạn có chắc chắn muốn tiếp tục cập nhật không? (có/không):",
1312
+ "updating": "Đang cập nhật gói... Quá trình này có thể mất chút thời gian.",
1313
+ "success": "✅ i18n-toolkit được cập nhật thành công!",
1314
+ "error": "❌ Cập nhật i18n-toolkit không thành công",
1315
+ "cancelled": "❌ Cập nhật bị hủy."
1316
+ }
1317
+ },
1318
+ "security": {
1319
+ "pathValidationFailed": "path_validation_failed",
1320
+ "invalidInputType": "không hợp lệ_input_type",
1321
+ "pathTraversalAttempt": "path_traversal_attempt",
1322
+ "pathValidated": "✅ Đường dẫn được xác thực thành công",
1323
+ "pathValidationError": "path_validation_error",
1324
+ "fileTooLarge": "Bảo mật: Tệp quá lớn: {filePath}",
1325
+ "fileReadError": "Bảo mật: Lỗi đọc tệp: {errorMessage}",
1326
+ "contentTooLargeForFile": "Bảo mật: Nội dung quá lớn đối với tệp: {filePath}",
1327
+ "fileWriteError": "Bảo mật: Lỗi ghi tệp: {errorMessage}",
1328
+ "jsonStringTooLarge": "Bảo mật: chuỗi JSON quá lớn",
1329
+ "jsonParseError": "Bảo mật: Lỗi phân tích cú pháp JSON: {errorMessage}",
1330
+ "inputContainsDisallowedCharacters": "Bảo mật: Đầu vào chứa các ký tự không được phép",
1331
+ "unknownCommandArgument": "Bảo mật: Đối số lệnh không xác định: {key}",
1332
+ "unknown_command_argument": "Bảo mật: Đối số lệnh không xác định: {key}",
1333
+ "unknownConfigKey": "Bảo mật: Khóa cấu hình không xác định: {key}",
1334
+ "unknown_config_key": "Bảo mật: Khóa cấu hình không xác định: {key}",
1335
+ "securityAlert": "[CẢNH BÁO BẢO MẬT] {timestamp}: {event}",
1336
+ "contentTooLarge": "Bảo mật: Nội dung quá lớn đối với tệp: {validatedPath}",
1337
+ "inputDisallowedCharacters": "Bảo mật: Đầu vào chứa các ký tự không được phép",
1338
+ "unknownCommandArg": "Đối số lệnh không xác định",
1339
+ "logMessage": "[BẢO VỆ {level}] {timestamp}: {event}",
1340
+ "alertMessage": "[CẢNH BÁO BẢO MẬT] {timestamp}: {event}",
1341
+ "securityWarning": "[CẢNH BÁO BẢO MẬT] {timestamp}: {event}",
1342
+ "json_parse_error": "Bảo mật: Lỗi phân tích cú pháp JSON: {errorMessage}",
1343
+ "file_too_large": "Tệp quá lớn",
1344
+ "file_read_error": "Lỗi đọc tập tin",
1345
+ "content_too_large_for_file": "Nội dung quá lớn cho tập tin",
1346
+ "file_write_error": "Lỗi ghi tập tin",
1347
+ "json_string_too_large": "Chuỗi JSON quá lớn",
1348
+ "recursion_detected": "Đệ quy được phát hiện trong {operation}",
1349
+ "operation_timeout": "Thời gian chờ hoạt động: {operation}",
1350
+ "operation_error": "Lỗi vận hành trong {operation}: {error}",
1351
+ "directory_read_error": "Lỗi đọc thư mục: {errorMessage}",
1352
+ "security_alert": "Cảnh báo bảo mật"
1353
+ },
1354
+ "settings-cli": {
1355
+ "settings": {
1356
+ "mainMenu": {
1357
+ "title": "Thực đơn chính:",
1358
+ "uiSettings": "Cài đặt giao diện người dùng",
1359
+ "uiSettingsDesc": "Tùy chọn ngôn ngữ, chủ đề và giao diện",
1360
+ "directorySettings": "Cài đặt thư mục",
1361
+ "directorySettingsDesc": "Đường dẫn thư mục nguồn và đầu ra",
1362
+ "scriptDirectorySettings": "Cài đặt thư mục tập lệnh",
1363
+ "scriptDirectorySettingsDesc": "Đường dẫn thư mục cho các hoạt động tập lệnh riêng lẻ",
1364
+ "processingSettings": "Cài đặt xử lý",
1365
+ "processingSettingsDesc": "Kích thước lô, tính đồng thời và hiệu suất",
1366
+ "advancedSettings": "Cài đặt nâng cao",
1367
+ "advancedSettingsDesc": "Tùy chọn xác thực, ghi nhật ký và chuyên gia",
1368
+ "viewAllSettings": "Xem tất cả cài đặt",
1369
+ "viewAllSettingsDesc": "Hiển thị cấu hình hiện tại",
1370
+ "importExport": "Nhập/Xuất",
1371
+ "importExportDesc": "Sao lưu và khôi phục cài đặt",
1372
+ "resetToDefaults": "Đặt lại về mặc định",
1373
+ "resetToDefaultsDesc": "Khôi phục cài đặt gốc",
1374
+ "reportBug": "Báo cáo lỗi",
1375
+ "reportBugDesc": "Gửi báo cáo vấn đề trên GitHub",
1376
+ "saveChanges": "Lưu thay đổi",
1377
+ "saveChangesDesc": "Lưu cài đặt hiện tại vào tập tin",
1378
+ "updatePackage": "Gói cập nhật",
1379
+ "updatePackageDesc": "Cập nhật gói i18n-toolkit qua npm",
1380
+ "help": "Giúp đỡ",
1381
+ "helpDesc": "Hiển thị thông tin trợ giúp chi tiết",
1382
+ "quit": "Từ bỏ",
1383
+ "quitDesc": "Thoát cài đặt (có lời nhắc lưu nếu cần)",
1384
+ "unsavedChangesWarning": "⚠️ Bạn có những thay đổi chưa được lưu",
1385
+ "saveChangesBeforeQuit": "Bạn có muốn lưu các thay đổi trước khi thoát không? (có/không):",
1386
+ "selectOption": "Chọn một tùy chọn:",
1387
+ "goodbyeMessage": "Cảm ơn bạn đã sử dụng trình quản lý cài đặt i18n!"
1388
+ },
1389
+ "goodbyeMessage": "Cảm ơn bạn đã sử dụng trình quản lý cài đặt i18n!",
1390
+ "relativePathHint": "Sử dụng các đường dẫn tương đối từ thư mục này (ví dụ: ./src/i18n/locales)",
1391
+ "currentDirectory": "Thư mục dự án hiện tại"
1392
+ },
1393
+ "settings_manager": {
1394
+ "error_loading_settings": "❌ Lỗi tải cài đặt:",
1395
+ "error_saving_settings": "❌ Lỗi lưu cài đặt:",
1396
+ "error_setting_value": "❌ Giá trị cài đặt lỗi:",
1397
+ "missing_required_setting": "❌ Thiếu cài đặt bắt buộc: {prop}",
1398
+ "invalid_language": "❌ Ngôn ngữ không hợp lệ: {language}",
1399
+ "invalid_source_language": "❌ Ngôn ngữ nguồn không hợp lệ: {sourceLanguage}",
1400
+ "default_languages_must_be_array": "❌ Ngôn ngữ mặc định phải là một mảng",
1401
+ "invalid_date_format": "❌ Định dạng ngày không hợp lệ: {dateFormat}. Các định dạng hợp lệ: {validFormats}",
1402
+ "invalid_time_format": "❌ Định dạng thời gian không hợp lệ: {timeFormat}. Các định dạng hợp lệ: {validFormats}",
1403
+ "notifications_types_must_be_object": "❌ notification.types phải là một đối tượng",
1404
+ "exclude_files_must_be_array": "❌ loại trừCác tệp phải là một mảng",
1405
+ "exclude_dirs_must_be_array": "❌ loại trừDirs phải là một mảng",
1406
+ "include_extensions_must_be_array": "❌ includeExtensions phải là một mảng",
1407
+ "invalid_batch_size": "❌ Kích thước lô không hợp lệ. Phải là số dương",
1408
+ "invalid_max_concurrent_files": "❌ Các tập tin đồng thời tối đa không hợp lệ. Phải là số dương",
1409
+ "invalid_sizing_threshold": "❌ Ngưỡng kích thước không hợp lệ. Phải là số dương",
1410
+ "invalid_timeout": "❌ Thời gian chờ không hợp lệ. Phải có ít nhất 1000ms",
1411
+ "invalid_sizing_format": "❌ Định dạng kích thước không hợp lệ: {sizingFormat}. Các định dạng hợp lệ: {validFormats}",
1412
+ "error_validating_settings": "❌ Lỗi xác thực cài đặt:",
1413
+ "backup_created": "📋 Đã tạo bản sao lưu: {backupPath}",
1414
+ "error_creating_backup": "❌ Lỗi tạo bản sao lưu:",
1415
+ "language_not_supported": "Ngôn ngữ '{language}' không được hỗ trợ. Có sẵn: {availableLanguages}",
1416
+ "ui_language_set": "🌍 Ngôn ngữ giao diện người dùng được đặt thành: {language}"
1417
+ }
1418
+ },
1419
+ "settings": {
1420
+ "title": "⚙️ Quản lý cài đặt",
1421
+ "separator": "============================================================",
1422
+ "goodbyeMessage": "Cảm ơn bạn đã sử dụng trình quản lý cài đặt i18ntk!",
1423
+ "relativePathHint": "Sử dụng các đường dẫn tương đối từ thư mục này (ví dụ: ./src/i18n/locales)",
1424
+ "currentDirectory": "Thư mục dự án hiện tại",
1425
+ "startingSettings": "Bắt đầu cài đặt:",
1426
+ "pin": "PIN:",
1427
+ "reportBug": {
1428
+ "title": "Báo cáo lỗi",
1429
+ "description": "Báo cáo bất kỳ vấn đề hoặc lỗi nào bạn gặp phải",
1430
+ "guidance": "Để báo cáo vấn đề một cách hiệu quả:",
1431
+ "checkLogs": "1. Kiểm tra nhật ký gỡ lỗi trong thư mục dự án của bạn",
1432
+ "documentIssue": "2. Ghi lại vấn đề với các bước tái hiện",
1433
+ "contactSupport": "3. Liên hệ với quản trị viên hệ thống hoặc nhóm hỗ trợ của bạn",
1434
+ "completed": "Hướng dẫn báo cáo lỗi được hiển thị",
1435
+ "instructions": "Thực hiện theo các hướng dẫn ở trên để báo cáo lỗi."
1436
+ },
1437
+ "mainMenu": {
1438
+ "title": "Thực đơn chính:",
1439
+ "uiSettings": "Cài đặt giao diện người dùng",
1440
+ "uiSettingsDesc": "Tùy chọn ngôn ngữ, chủ đề và giao diện",
1441
+ "directorySettings": "Cài đặt thư mục",
1442
+ "directorySettingsDesc": "Đường dẫn thư mục nguồn và đầu ra",
1443
+ "processingSettings": "Cài đặt xử lý",
1444
+ "processingSettingsDesc": "Kích thước lô, tính đồng thời và hiệu suất",
1445
+ "advancedSettings": "Cài đặt nâng cao",
1446
+ "advancedSettingsDesc": "Các tùy chọn xác thực, ghi nhật ký và chuyên gia",
1447
+ "viewAllSettings": "Xem tất cả cài đặt",
1448
+ "viewAllSettingsDesc": "Hiển thị cấu hình hiện tại",
1449
+ "importExport": "Nhập/Xuất",
1450
+ "updatePackage": "Gói cập nhật",
1451
+ "updatePackageDesc": "Cập nhật gói i18n-toolkit qua npm",
1452
+ "importExportDesc": "Sao lưu và khôi phục cài đặt",
1453
+ "resetToDefaults": "Đặt lại về mặc định",
1454
+ "resetToDefaultsDesc": "Khôi phục cài đặt gốc",
1455
+ "reportBug": "Báo cáo lỗi",
1456
+ "reportBugDesc": "Gửi báo cáo vấn đề trên GitHub",
1457
+ "saveChanges": "Lưu thay đổi",
1458
+ "saveChangesDesc": "Lưu cài đặt hiện tại vào tập tin",
1459
+ "help": "Giúp đỡ",
1460
+ "helpDesc": "Hiển thị thông tin trợ giúp chi tiết",
1461
+ "quit": "Từ bỏ",
1462
+ "quitDesc": "Thoát cài đặt (có lời nhắc lưu nếu cần)",
1463
+ "unsavedChangesWarning": "⚠️ Bạn có những thay đổi chưa được lưu",
1464
+ "saveChangesBeforeQuit": "Bạn có muốn lưu các thay đổi trước khi thoát không? (có/không):",
1465
+ "selectOption": "Chọn một tùy chọn:",
1466
+ "goodbyeMessage": "Cảm ơn bạn đã sử dụng trình quản lý cài đặt i18n!",
1467
+ "selectSettingPrompt": "Chọn cài đặt để chỉnh sửa (hoặc 'b' để quay lại):",
1468
+ "enterNewValue": "Nhập giá trị mới:",
1469
+ "updatedSuccessfully": "{setting} đã cập nhật thành công!",
1470
+ "scriptDirectorySettings": "Cài đặt thư mục tập lệnh",
1471
+ "scriptDirectoryDesc": "Chỉ định thư mục tùy chỉnh cho từng tập lệnh",
1472
+ "scriptDirectorySettingsDesc": "Bạn có thể đặt thư mục tùy chỉnh cho từng tập lệnh. Nếu không được đặt, cài đặt chung sẽ được sử dụng.",
1473
+ "currentDirectory": "Thư mục dự án hiện tại",
1474
+ "securitySettings": "Cài đặt bảo mật",
1475
+ "securitySettingsDesc": "Mã PIN quản trị viên và các tùy chọn bảo mật khác",
1476
+ "backupSettings": "Cài đặt sao lưu",
1477
+ "backupSettingsDesc": "Sao lưu và khôi phục cài đặt cấu hình",
1478
+ "autoTranslate": "Tự động dịch",
1479
+ "autoTranslateDesc": "Điều chỉnh việc xử lý phần giữ chỗ, đồng thời, phân nhóm và báo cáo"
1480
+ },
1481
+ "updatePackage": {
1482
+ "title": "Gói cập nhật",
1483
+ "description": "Cập nhật gói i18n-toolkit qua npm",
1484
+ "command": "cập nhật npm i18ntk -g",
1485
+ "success": "Cập nhật hoàn tất thành công.",
1486
+ "failed": "Cập nhật không thành công.",
1487
+ "prompt": "Bạn có muốn cập nhật gói ngay bây giờ không? (có/không):",
1488
+ "promptDesc": "Lưu ý: Thao tác này sẽ cập nhật gói i18ntk lên phiên bản mới nhất.",
1489
+ "confirm": "y",
1490
+ "cancelled": "Đã hủy cập nhật.",
1491
+ "error": "Không thể cập nhật gói",
1492
+ "updating": "Đang cập nhật gói..."
1493
+ },
1494
+ "admin": {
1495
+ "selectOption": "Chọn tùy chọn:",
1496
+ "updateSuccess": "Mã PIN quản trị viên đã được cập nhật thành công!",
1497
+ "updateFailed": "Không cập nhật được mã PIN quản trị viên.",
1498
+ "protectionRemoved": "Đã xóa bảo vệ mã PIN của quản trị viên.",
1499
+ "configSuccess": "Mã PIN quản trị viên đã được định cấu hình thành công!",
1500
+ "configFailed": "Không định cấu hình được mã PIN quản trị viên.",
1501
+ "setupPinPrompt": "Bạn có muốn thiết lập mã PIN quản trị viên không? (có/không):",
1502
+ "pinUpdatedSuccess": "Mã PIN quản trị viên đã được cập nhật thành công!",
1503
+ "pinUpdatedFailed": "Không cập nhật được mã PIN quản trị viên.",
1504
+ "pinRemoved": "Đã xóa bảo vệ mã PIN của quản trị viên.",
1505
+ "pinConfiguredSuccess": "Mã PIN quản trị viên đã được định cấu hình thành công!",
1506
+ "pinConfiguredFailed": "Không định cấu hình được mã PIN quản trị viên.",
1507
+ "accessDenied": "❌ Truy cập bị từ chối. Quay trở lại thực đơn.",
1508
+ "setupPin": "🔐 Đang thiết lập mã PIN quản trị viên...",
1509
+ "setupFailed": "❌ Không thiết lập được mã PIN quản trị viên. Cài đặt không thay đổi.",
1510
+ "pinConfigured": "👉 Mã PIN quản trị viên hiện đã được định cấu hình.",
1511
+ "options": "Tùy chọn:",
1512
+ "changePin": "1) Thay đổi mã PIN hiện tại",
1513
+ "removePin": "2) Loại bỏ bảo vệ mã PIN",
1514
+ "cancel": "3) Hủy bỏ",
1515
+ "verifyCurrentPin": "🔐 Trước tiên hãy xác minh mã PIN hiện tại:",
1516
+ "settingNewPin": "🔄 Đang thiết lập mã PIN mới...",
1517
+ "verifyToRemove": "🔐 Xác minh mã PIN hiện tại để xóa tính năng bảo vệ:",
1518
+ "noPinConfigured": "🔓 Hiện không có mã PIN quản trị viên nào được định cấu hình.",
1519
+ "pinBenefits": "Thiết lập mã PIN quản trị viên sẽ tăng cường bảo mật cho:",
1520
+ "benefitSecurity": "• Thay đổi cài đặt bảo mật",
1521
+ "benefitAdvanced": "• Sửa đổi cấu hình nâng cao",
1522
+ "benefitDebug": "• Truy cập các công cụ gỡ lỗi",
1523
+ "benefitReset": "• Đặt lại cài đặt",
1524
+ "setupCancelled": "⏭️ Đã hủy thiết lập mã PIN quản trị viên.",
1525
+ "operationCancelled": "❌ Hoạt động bị hủy bỏ.",
1526
+ "startingSettings": "🎛️ Bắt đầu Cài đặt CLI...",
1527
+ "authRequired": "🔒 Yêu cầu xác thực quản trị viên cho: {label}",
1528
+ "pinSetupTitle": "Thiết lập mã PIN quản trị viên",
1529
+ "browserOpenFailed": "Không thể tự động mở trình duyệt.",
1530
+ "manualVisit": "Vui lòng truy cập thủ công: {url}",
1531
+ "browserOpened": "✅ Đã mở trình duyệt thành công!"
1532
+ },
1533
+ "importExport": {
1534
+ "title": "Cài đặt nhập/xuất",
1535
+ "export": "Xuất cài đặt",
1536
+ "import": "Cài đặt nhập",
1537
+ "backup": "Tạo bản sao lưu",
1538
+ "enterFilename": "Nhập tên file (hoặc nhấn Enter để mặc định):",
1539
+ "exportSuccess": "Đã xuất cài đặt sang {file}",
1540
+ "exportFailed": "Không xuất được cài đặt: {error}",
1541
+ "importFilename": "Nhập tên tệp để nhập:",
1542
+ "fileNotFound": "Không tìm thấy tập tin.",
1543
+ "invalidFormat": "Định dạng tệp cài đặt không hợp lệ.",
1544
+ "confirmImport": "Điều này sẽ thay thế tất cả các cài đặt hiện tại. Tiếp tục? (có/không):",
1545
+ "importSuccess": "Cài đặt đã được nhập thành công.",
1546
+ "importFailed": "Không thể nhập cài đặt: {error}",
1547
+ "backupSuccess": "Đã tạo bản sao lưu: {file}",
1548
+ "backupFailed": "Không tạo được bản sao lưu: {error}",
1549
+ "exportFilenamePrompt": "Nhập tên file xuất:",
1550
+ "importConfirm": "Nhập tệp cài đặt này? (có/không):",
1551
+ "importFilenamePrompt": "Nhập tên tệp nhập:",
1552
+ "manageBackups": "Quản lý bản sao lưu",
1553
+ "restore": "Khôi phục cài đặt"
1554
+ },
1555
+ "selectOption": "Chọn một tùy chọn:",
1556
+ "resetToDefaultsTitle": "Đặt lại cài đặt về mặc định",
1557
+ "resetWarning1": "⚠️ Thao tác này sẽ đặt lại TẤT CẢ cài đặt về giá trị mặc định.",
1558
+ "resetWarning2": "Không thể hoàn tác hành động này.",
1559
+ "resetConfirm": "Bạn có chắc chắn muốn tiếp tục không? (có/không):",
1560
+ "resetSuccess": "Đặt lại cài đặt về mặc định thành công.",
1561
+ "resetFailed": "Không thể đặt lại cài đặt: {error}",
1562
+ "resetDone": "Đặt lại cài đặt về mặc định thành công.",
1563
+ "resetScriptDirsDone": "Đã đặt lại thành công các thư mục tập lệnh về mặc định của hệ thống.",
1564
+ "saveSuccess": "Đã lưu cài đặt thành công.",
1565
+ "saveFailed": "Không lưu được cài đặt.",
1566
+ "saveError": "Đã cung cấp cài đặt không hợp lệ",
1567
+ "pressEnter": "Nhấn Enter để tiếp tục...",
1568
+ "initFailed": "Không thể khởi tạo cài đặt: {error}",
1569
+ "invalidValueFormat": "Định dạng giá trị không hợp lệ.",
1570
+ "help": {
1571
+ "title": "Trợ giúp cài đặt",
1572
+ "navigationTitle": "Điều hướng",
1573
+ "navigation1": "1. Cài đặt chung - Định cấu hình ngôn ngữ giao diện người dùng, chủ đề và các tùy chọn cơ bản",
1574
+ "navigation2": "2. Cài đặt thư mục - Đặt thư mục nguồn và đầu ra cho tệp dịch",
1575
+ "navigation3": "3. Cài đặt xử lý - Định cấu hình các tùy chọn kích thước lô, đồng thời và hiệu suất",
1576
+ "navigation4": "4. Cài đặt nâng cao - Truy cập các tùy chọn xác thực, ghi nhật ký và cấu hình chuyên gia",
1577
+ "categoriesTitle": "Danh mục cài đặt",
1578
+ "categoryUI": "• Cài đặt giao diện người dùng: Ngôn ngữ giao diện, chủ đề màu sắc và tùy chọn hiển thị",
1579
+ "categoryDirectory": "• Cài đặt thư mục: Vị trí tập tin nguồn và thư mục báo cáo đầu ra",
1580
+ "categoryProcessing": "• Cài đặt xử lý: Xử lý hàng loạt, giới hạn tệp và điều chỉnh hiệu suất",
1581
+ "categoryAdvanced": "• Cài đặt nâng cao: Chế độ gỡ lỗi, ghi nhật ký kiểm tra và các tùy chọn bảo mật",
1582
+ "envVarsTitle": "Biến môi trường",
1583
+ "envVar1": "• I18N_SOURCE_DIR: Ghi đè đường dẫn thư mục nguồn mặc định",
1584
+ "envVar2": "• I18N_OUTPUT_DIR: Ghi đè đường dẫn thư mục đầu ra mặc định",
1585
+ "envVar3": "• I18N_DEBUG: Bật chế độ gỡ lỗi (đúng/sai)",
1586
+ "cliUsageTitle": "Ví dụ sử dụng CLI",
1587
+ "cliUsage1": "• npx i18ntk --settings: Mở menu cài đặt tương tác",
1588
+ "cliUsage2": "• npx i18ntk --settings --lang de: Mở cài đặt bằng tiếng Đức",
1589
+ "cliUsage3": "• npx i18ntk --reset-settings: Đặt lại tất cả cài đặt về mặc định",
1590
+ "navigation": "Sử dụng các phím số để chọn tùy chọn, 'b' để quay lại",
1591
+ "editing": "Nhập các giá trị mới khi được nhắc hoặc nhấn Enter để cập nhật",
1592
+ "saving": "Sử dụng 's' để lưu các thay đổi trước khi thoát",
1593
+ "reset": "Sử dụng tùy chọn 7 để đặt lại tất cả cài đặt về mặc định"
1594
+ },
1595
+ "categories": {
1596
+ "uiSettings": "Cài đặt giao diện người dùng",
1597
+ "directorySettings": "Cài đặt thư mục",
1598
+ "processingSettings": "Cài đặt xử lý",
1599
+ "advancedSettings": "Cài đặt nâng cao",
1600
+ "scriptDirectorySettings": "Cài đặt thư mục tập lệnh",
1601
+ "securitySettings": "Cài đặt bảo mật",
1602
+ "autoTranslate": "Cài đặt dịch tự động"
1603
+ },
1604
+ "security": {
1605
+ "title": "🔐 Cài đặt bảo mật",
1606
+ "description": "Định cấu hình các tùy chọn bảo mật và bảo vệ mã PIN của quản trị viên",
1607
+ "currentPin": "Mã PIN hiện tại:",
1608
+ "pinConfigured": "✅ Đã cấu hình",
1609
+ "pinNotConfigured": "❌ Chưa được cấu hình",
1610
+ "pinDisplay": "Hiển thị mã PIN:",
1611
+ "menu": {
1612
+ "enableDisable": "1) Bật/Tắt mã PIN quản trị viên",
1613
+ "setupChange": "2) Thiết lập/Thay đổi mã PIN quản trị viên",
1614
+ "sessionTimeout": "3) Thời gian chờ của phiên",
1615
+ "maxAttempts": "4) Số lần thất bại tối đa",
1616
+ "lockoutDuration": "5) Thời gian khóa",
1617
+ "back": "b) Quay lại Menu chính"
1618
+ },
1619
+ "prompts": {
1620
+ "enablePin": "Bật tính năng bảo vệ mã PIN của quản trị viên? (có/không):",
1621
+ "disablePin": "Tắt tính năng bảo vệ mã PIN của quản trị viên? (có/không):",
1622
+ "enterTimeout": "Nhập thời gian chờ của phiên (phút):",
1623
+ "enterMaxAttempts": "Nhập số lần thử thất bại tối đa:",
1624
+ "enterLockoutDuration": "Nhập thời gian khóa (phút):"
1625
+ },
1626
+ "messages": {
1627
+ "pinEnabled": "Đã bật tính năng bảo vệ mã PIN của quản trị viên",
1628
+ "pinDisabled": "Bảo vệ mã PIN của quản trị viên đã bị vô hiệu hóa",
1629
+ "timeoutUpdated": "Đã cập nhật thời gian chờ của phiên thành {minutes} phút",
1630
+ "maxAttemptsUpdated": "Số lần thử thất bại tối đa được cập nhật thành {attempts}",
1631
+ "lockoutDurationUpdated": "Đã cập nhật thời lượng khóa thành {minutes} phút"
1632
+ }
1633
+ },
1634
+ "fields": {
1635
+ "backup.enabled": {
1636
+ "label": "Enable Backup",
1637
+ "description": "Enable automatic backup of settings",
1638
+ "help": "Enable/disable backup feature"
1639
+ },
1640
+ "backup.singleFileMode": {
1641
+ "label": "Single File Mode",
1642
+ "description": "Use single file for backups",
1643
+ "help": "Backup settings in a single file"
1644
+ },
1645
+ "backup.singleBackupFile": {
1646
+ "label": "Backup File Path",
1647
+ "description": "Path to the backup file",
1648
+ "help": "Path to the single backup file"
1649
+ },
1650
+ "backup.retentionDays": {
1651
+ "label": "Retention Period",
1652
+ "description": "Days to keep backup files",
1653
+ "help": "Number of days to retain old backup files"
1654
+ },
1655
+ "backup.maxBackups": {
1656
+ "label": "Maximum Backups",
1657
+ "description": "Maximum backup files to keep",
1658
+ "help": "Maximum number of backup files to keep"
1659
+ },
1660
+ "backup.confirm": {
1661
+ "label": "Confirm Backup",
1662
+ "description": "Require confirmation for backup operations",
1663
+ "help": "Confirm backup operation"
1664
+ },
1665
+ "i18nDir": {
1666
+ "label": "Thư mục I18n",
1667
+ "description": "Thư mục chứa file dịch",
1668
+ "current": "Hiện hành: {value}",
1669
+ "help": "Đường dẫn tới thư mục chứa file dịch"
1670
+ },
1671
+ "projectRoot": {
1672
+ "label": "Dự án gốc",
1673
+ "description": "Thư mục gốc của dự án",
1674
+ "current": "Hiện hành: {value}",
1675
+ "help": "Đường dẫn đến thư mục gốc của dự án"
1676
+ },
1677
+ "checkUsage": {
1678
+ "usage_analysis_failed": "Phân tích mức sử dụng không thành công",
1679
+ "usage_analysis_success": "Phân tích sử dụng thành công",
1680
+ "usage_analysis_complete": "Phân tích sử dụng hoàn tất",
1681
+ "usage_analysis_in_progress": "Đang tiến hành phân tích mức sử dụng",
1682
+ "usage_analysis_started": "Đã bắt đầu phân tích mức sử dụng",
1683
+ "usage_analysis_skipped": "Phân tích mức sử dụng bị bỏ qua"
1684
+ },
1685
+ "language": {
1686
+ "label": "Ngôn ngữ giao diện",
1687
+ "description": "Ngôn ngữ cho giao diện người dùng",
1688
+ "current": "Hiện hành: {value}",
1689
+ "help": "Chọn ngôn ngữ giao diện ưa thích của bạn"
1690
+ },
1691
+ "scriptDirectories": {
1692
+ "analyzeLabel": "Phân tích thư mục tập lệnh",
1693
+ "analyzeHelp": "Phân tích thư mục tập lệnh để tìm sự cố",
1694
+ "completeLabel": "Hoàn thành thư mục thiết lập",
1695
+ "initLabel": "Khởi tạo thư mục tập lệnh",
1696
+ "manageLabel": "Quản lý thư mục tập lệnh",
1697
+ "sizingLabel": "Thư mục tập lệnh định cỡ",
1698
+ "summaryLabel": "Thư mục báo cáo tóm tắt",
1699
+ "usageLabel": "Thư mục báo cáo sử dụng",
1700
+ "validateLabel": "Xác thực thư mục tập lệnh"
1701
+ },
1702
+ "theme": {
1703
+ "label": "Chủ đề màu sắc",
1704
+ "description": "Tùy chọn chủ đề giao diện người dùng",
1705
+ "current": "Hiện hành: {value}",
1706
+ "help": "Chọn giữa chủ đề sáng và tối"
1707
+ },
1708
+ "dateFormat": {
1709
+ "label": "Định dạng ngày",
1710
+ "description": "Định dạng hiển thị ngày tháng",
1711
+ "current": "Hiện hành: {value}",
1712
+ "help": "Chọn cách hiển thị ngày trong báo cáo"
1713
+ },
1714
+ "notifications": {
1715
+ "enabled": {
1716
+ "label": "Bật thông báo",
1717
+ "description": "Hiển thị thông báo trên màn hình",
1718
+ "current": "Hiện hành: {value}",
1719
+ "help": "Bật thông báo trên màn hình cho các hoạt động đã hoàn thành"
1720
+ }
1721
+ },
1722
+ "sourceDir": {
1723
+ "label": "Thư mục nguồn",
1724
+ "description": "Thư mục chứa file dịch",
1725
+ "current": "Hiện hành: {value}",
1726
+ "help": "Đường dẫn tới thư mục chứa file dịch nguồn"
1727
+ },
1728
+ "sourceLanguage": {
1729
+ "label": "Ngôn ngữ nguồn",
1730
+ "description": "Ngôn ngữ chính cho bản dịch",
1731
+ "current": "Hiện hành: {value}",
1732
+ "help": "Ngôn ngữ chính được sử dụng làm nguồn dịch"
1733
+ },
1734
+ "outputDir": {
1735
+ "label": "Thư mục đầu ra",
1736
+ "description": "Thư mục cho các báo cáo được tạo",
1737
+ "current": "Hiện hành: {value}",
1738
+ "help": "Nơi lưu trữ các báo cáo và tệp đã xử lý"
1739
+ },
1740
+ "batchSize": {
1741
+ "label": "Kích thước lô",
1742
+ "description": "Số lượng mặt hàng được xử lý mỗi đợt",
1743
+ "current": "Hiện hành: {value}",
1744
+ "help": "Có bao nhiêu tệp cần xử lý trong mỗi đợt"
1745
+ },
1746
+ "maxConcurrentFiles": {
1747
+ "label": "Tệp đồng thời tối đa",
1748
+ "description": "Số tệp tối đa được xử lý đồng thời",
1749
+ "current": "Hiện hành: {value}",
1750
+ "help": "Số lượng tệp tối đa cần xử lý cùng lúc"
1751
+ },
1752
+ "sizingThreshold": {
1753
+ "label": "Ngưỡng kích thước (%)",
1754
+ "description": "Ngưỡng cảnh báo về sự thay đổi kích thước",
1755
+ "current": "Hiện hành: {value}%",
1756
+ "help": "Ngưỡng phần trăm để phát hiện kích thước không khớp"
1757
+ },
1758
+ "strictMode": {
1759
+ "label": "Chế độ xác thực nghiêm ngặt",
1760
+ "description": "Bật chế độ xác thực nghiêm ngặt",
1761
+ "current": "Hiện hành: {value}",
1762
+ "help": "Cho phép xác thực nghiêm ngặt cho các tệp dịch"
1763
+ },
1764
+ "enableAuditLog": {
1765
+ "label": "Bật nhật ký kiểm tra",
1766
+ "description": "Theo dõi tất cả các thay đổi về bản dịch",
1767
+ "current": "Hiện hành: {value}",
1768
+ "help": "Ghi lại tất cả các thay đổi được thực hiện đối với tệp dịch"
1769
+ },
1770
+ "backupBeforeChanges": {
1771
+ "label": "Tự động sao lưu",
1772
+ "description": "Tạo bản sao lưu trước khi sửa đổi",
1773
+ "current": "Hiện hành: {value}",
1774
+ "help": "Tự động tạo bản sao lưu trước khi thực hiện thay đổi"
1775
+ },
1776
+ "advanced_maxConcurrentFiles": {
1777
+ "label": "Tệp đồng thời tối đa",
1778
+ "description": "Số tệp tối đa được xử lý đồng thời",
1779
+ "current": "Hiện hành: {value}",
1780
+ "help": "Số lượng tệp tối đa cần xử lý cùng lúc"
1781
+ },
1782
+ "advanced_strictMode": {
1783
+ "label": "Chế độ xác thực nghiêm ngặt",
1784
+ "description": "Bật chế độ xác thực nghiêm ngặt",
1785
+ "current": "Hiện hành: {value}",
1786
+ "help": "Cho phép xác thực nghiêm ngặt cho các tệp dịch"
1787
+ },
1788
+ "adminPinEnabled": {
1789
+ "label": "Bảo vệ mã PIN của quản trị viên",
1790
+ "description": "Bật xác thực mã PIN quản trị viên cho các cài đặt nhạy cảm",
1791
+ "current": "Hiện hành: {value}",
1792
+ "help": "Yêu cầu mã PIN quản trị viên để thay đổi cài đặt bảo mật và nâng cao"
1793
+ },
1794
+ "sessionTimeout": {
1795
+ "label": "Thời gian chờ của phiên",
1796
+ "description": "Thời gian chờ của phiên quản trị viên tính bằng phút",
1797
+ "current": "Hiện hành: {value} phút",
1798
+ "help": "Phiên quản trị viên duy trì hoạt động trong bao lâu trước khi yêu cầu xác thực lại"
1799
+ },
1800
+ "maxFailedAttempts": {
1801
+ "label": "Số lần thất bại tối đa",
1802
+ "description": "Số lần nhập mã PIN không thành công tối đa trước khi khóa",
1803
+ "current": "Hiện hành: {value} nỗ lực",
1804
+ "help": "Số lần thử mã PIN không thành công được cho phép trước khi khóa tạm thời"
1805
+ },
1806
+ "lockoutDuration": {
1807
+ "label": "Thời lượng khóa",
1808
+ "description": "Thời gian khóa sau khi thử thất bại",
1809
+ "current": "Hiện hành: {value} phút",
1810
+ "help": "Hệ thống vẫn bị khóa trong bao lâu sau lần thử thất bại tối đa"
1811
+ },
1812
+ "scriptDirectories_analyze": {
1813
+ "label": "Phân tích thư mục tập lệnh",
1814
+ "description": "Thư mục tùy chỉnh để phân tích tập lệnh",
1815
+ "current": "Hiện hành: {value}",
1816
+ "help": "Chỉ định thư mục nguồn tùy chỉnh cho tập lệnh phân tích. Để trống để sử dụng cài đặt chung."
1817
+ },
1818
+ "scriptDirectories_complete": {
1819
+ "label": "Hoàn thành thư mục thiết lập",
1820
+ "description": "Thư mục tùy chỉnh cho tập lệnh thiết lập hoàn chỉnh",
1821
+ "current": "Hiện hành: {value}",
1822
+ "help": "Chỉ định thư mục nguồn tùy chỉnh cho tập lệnh thiết lập hoàn chỉnh. Để trống để sử dụng cài đặt chung."
1823
+ },
1824
+ "scriptDirectories_init": {
1825
+ "label": "Khởi tạo thư mục tập lệnh",
1826
+ "description": "Thư mục tùy chỉnh để khởi tạo tập lệnh",
1827
+ "current": "Hiện hành: {value}",
1828
+ "help": "Chỉ định thư mục nguồn tùy chỉnh cho tập lệnh khởi tạo. Để trống để sử dụng cài đặt chung."
1829
+ },
1830
+ "scriptDirectories_manage": {
1831
+ "label": "Quản lý thư mục tập lệnh",
1832
+ "description": "Thư mục tùy chỉnh để quản lý tập lệnh",
1833
+ "current": "Hiện hành: {value}",
1834
+ "help": "Chỉ định thư mục nguồn tùy chỉnh cho tập lệnh quản lý. Để trống để sử dụng cài đặt chung."
1835
+ },
1836
+ "scriptDirectories_sizing": {
1837
+ "label": "Thư mục tập lệnh định cỡ",
1838
+ "description": "Thư mục tùy chỉnh để định cỡ tập lệnh",
1839
+ "current": "Hiện hành: {value}",
1840
+ "help": "Chỉ định thư mục nguồn tùy chỉnh cho tập lệnh định cỡ. Để trống để sử dụng cài đặt chung."
1841
+ },
1842
+ "scriptDirectories_summary": {
1843
+ "label": "Thư mục báo cáo tóm tắt",
1844
+ "description": "Thư mục tùy chỉnh cho tập lệnh báo cáo tóm tắt",
1845
+ "current": "Hiện hành: {value}",
1846
+ "help": "Chỉ định thư mục nguồn tùy chỉnh cho tập lệnh báo cáo tóm tắt. Để trống để sử dụng cài đặt chung."
1847
+ },
1848
+ "scriptDirectories_usage": {
1849
+ "label": "Thư mục báo cáo sử dụng",
1850
+ "description": "Thư mục tùy chỉnh cho tập lệnh báo cáo sử dụng",
1851
+ "current": "Hiện hành: {value}",
1852
+ "help": "Chỉ định thư mục nguồn tùy chỉnh cho tập lệnh báo cáo sử dụng. Để trống để sử dụng cài đặt chung."
1853
+ },
1854
+ "scriptDirectories_validate": {
1855
+ "label": "Xác thực thư mục tập lệnh",
1856
+ "description": "Thư mục tùy chỉnh để xác thực tập lệnh",
1857
+ "current": "Hiện hành: {value}",
1858
+ "help": "Chỉ định thư mục nguồn tùy chỉnh cho tập lệnh xác thực. Để trống để sử dụng cài đặt chung."
1859
+ },
1860
+ "security_adminPinEnabled": {
1861
+ "label": "Bảo vệ mã PIN của quản trị viên",
1862
+ "description": "Bật xác thực mã PIN quản trị viên cho các cài đặt nhạy cảm",
1863
+ "current": "Hiện hành: {value}",
1864
+ "help": "Yêu cầu mã PIN quản trị viên để thay đổi cài đặt bảo mật và nâng cao"
1865
+ },
1866
+ "fields": {
1867
+ "adminPinEnabled": {
1868
+ "label": "Bảo vệ mã PIN của quản trị viên",
1869
+ "description": "Bật xác thực mã PIN quản trị viên cho các cài đặt nhạy cảm",
1870
+ "help": "Yêu cầu mã PIN quản trị viên để thay đổi cài đặt bảo mật và nâng cao"
1871
+ }
1872
+ },
1873
+ "security_pinProtection_enabled": {
1874
+ "label": "Bảo vệ mã PIN",
1875
+ "description": "Bật bảo vệ mã PIN cho cài đặt nhạy cảm",
1876
+ "current": "Hiện hành: {value}",
1877
+ "help": "Yêu cầu mã PIN để thay đổi cài đặt bảo mật và nâng cao"
1878
+ },
1879
+ "pinProtection_configure": {
1880
+ "label": "Định cấu hình tập lệnh được bảo vệ bằng mã PIN",
1881
+ "description": "Định cấu hình tập lệnh nào yêu cầu bảo vệ mã PIN",
1882
+ "help": "Chọn các tập lệnh riêng lẻ yêu cầu xác thực mã PIN"
1883
+ },
1884
+ "pinProtection_debugMenu": {
1885
+ "label": "Menu công cụ gỡ lỗi",
1886
+ "description": "Yêu cầu mã PIN cho Menu Công cụ gỡ lỗi",
1887
+ "current": "Hiện hành: {value}",
1888
+ "help": "Bật bảo vệ mã PIN để truy cập các công cụ gỡ lỗi"
1889
+ },
1890
+ "pinProtection_deleteReports": {
1891
+ "label": "Xóa báo cáo",
1892
+ "description": "Yêu cầu mã PIN để xóa báo cáo",
1893
+ "current": "Hiện hành: {value}",
1894
+ "help": "Bật bảo vệ mã PIN để xóa báo cáo"
1895
+ },
1896
+ "pinProtection_summaryReports": {
1897
+ "label": "Báo cáo tóm tắt",
1898
+ "description": "Yêu cầu mã PIN cho báo cáo tóm tắt",
1899
+ "current": "Hiện hành: {value}",
1900
+ "help": "Bật bảo vệ mã PIN để tạo báo cáo tóm tắt"
1901
+ },
1902
+ "pinProtection_settingsMenu": {
1903
+ "label": "Trình đơn cài đặt",
1904
+ "description": "Yêu cầu mã PIN cho Menu Cài đặt",
1905
+ "current": "Hiện hành: {value}",
1906
+ "help": "Bật bảo vệ mã PIN để truy cập cài đặt"
1907
+ },
1908
+ "pinProtection_initScript": {
1909
+ "label": "Khởi tạo tập lệnh",
1910
+ "description": "Yêu cầu mã PIN để khởi tạo tập lệnh",
1911
+ "current": "Hiện hành: {value}",
1912
+ "help": "Bật bảo vệ mã PIN để chạy tập lệnh khởi tạo"
1913
+ },
1914
+ "pinProtection_resetDefaults": {
1915
+ "label": "Đặt lại bảo vệ mã PIN",
1916
+ "description": "Đặt lại tất cả cài đặt bảo vệ mã PIN về mặc định",
1917
+ "help": "Đặt lại tất cả các biện pháp bảo vệ mã PIN tập lệnh riêng lẻ về giá trị mặc định"
1918
+ },
1919
+ "removeUiLanguages": {
1920
+ "label": "Xóa ngôn ngữ giao diện người dùng",
1921
+ "description": "Xóa các ngôn ngữ UI chưa được cài đặt",
1922
+ "help": "Xóa các ngôn ngữ UI chưa được cài đặt trên hệ thống"
1923
+ },
1924
+ "${helperKey}": {
1925
+ "help": "Giúp đỡ"
1926
+ },
1927
+ "reports_format": {
1928
+ "label": "Định dạng báo cáo",
1929
+ "help": "Chọn đánh dấu cho các báo cáo có thể đọc được, json để tự động hóa hoặc văn bản cho nhật ký đơn giản."
1930
+ },
1931
+ "autoTranslate_placeholderMode": {
1932
+ "label": "Chế độ xử lý giữ chỗ",
1933
+ "help": "Cách xử lý các chuỗi chứa phần giữ chỗ trong quá trình dịch tự động."
1934
+ },
1935
+ "autoTranslate_concurrency": {
1936
+ "label": "Yêu cầu dịch đồng thời",
1937
+ "help": "Yêu cầu nhà cung cấp đồng thời tối đa. Google hỗ trợ tới 100 trong i18ntk; DeepL và LibreTranslate được giới hạn ở mức thấp hơn."
1938
+ },
1939
+ "autoTranslate_batchSize": {
1940
+ "label": "Phân đoạn văn bản mỗi đợt",
1941
+ "help": "Số lượng phân đoạn văn bản được lên lịch cho mỗi đợt."
1942
+ },
1943
+ "autoTranslate_progressInterval": {
1944
+ "label": "Khoảng thời gian cập nhật tiến độ",
1945
+ "help": "Các phân đoạn văn bản đã hoàn thành giữa các bản cập nhật tiến độ."
1946
+ },
1947
+ "autoTranslate_retryCount": {
1948
+ "label": "Đếm lại lần thử",
1949
+ "help": "Số lần thử lại tối đa cho mỗi yêu cầu không thành công."
1950
+ },
1951
+ "autoTranslate_retryDelay": {
1952
+ "label": "Độ trễ thử lại (ms)",
1953
+ "help": "Độ trễ thử lại cơ bản tính bằng mili giây."
1954
+ },
1955
+ "autoTranslate_timeout": {
1956
+ "label": "Yêu cầu hết thời gian (ms)",
1957
+ "help": "Hết thời gian chờ yêu cầu của nhà cung cấp dịch thuật."
1958
+ },
1959
+ "autoTranslate_dryRunFirst": {
1960
+ "label": "Xem trước chạy thử trước",
1961
+ "help": "Xem trước những gì sẽ được dịch trước khi ghi tập tin."
1962
+ },
1963
+ "autoTranslate_onlyMissingOrEnglish": {
1964
+ "label": "Chỉ thiếu phím tiếng Anh hoặc",
1965
+ "help": "Giữ lại các giá trị mục tiêu đã dịch hiện có và chỉ dịch các giá trị bị thiếu, điểm đánh dấu, bản sao nguồn hoặc có thể là tiếng Anh."
1966
+ },
1967
+ "autoTranslate_reportStdout": {
1968
+ "label": "In báo cáo tới thiết bị đầu cuối",
1969
+ "help": "In báo cáo sau dịch sang thiết bị xuất chuẩn."
1970
+ },
1971
+ "autoTranslate_bom": {
1972
+ "label": "Viết BOM UTF-8",
1973
+ "help": "Viết các tệp JSON đã dịch bằng BOM UTF-8."
1974
+ },
1975
+ "autoTranslate_protectionEnabled": {
1976
+ "label": "Bảo vệ các điều khoản, chìa khóa, giá trị thương hiệu",
1977
+ "help": "Bật các thuật ngữ, khóa, giá trị và mẫu được bảo vệ mà người dùng có thể chỉnh sửa."
1978
+ },
1979
+ "autoTranslate_protectionFile": {
1980
+ "label": "Tệp JSON bảo vệ",
1981
+ "help": "Tệp JSON dự án chứa các quy tắc bảo vệ Tự động dịch."
1982
+ },
1983
+ "autoTranslate_promptProtectionSetup": {
1984
+ "label": "Yêu cầu tạo file bảo vệ",
1985
+ "help": "Yêu cầu tạo tệp bảo vệ khi Tự động Dịch chạy lần đầu tiên."
1986
+ },
1987
+ "autoTranslate_promptProtectionUpdate": {
1988
+ "label": "Yêu cầu cập nhật quy tắc bảo vệ",
1989
+ "help": "Hỏi xem có nên cập nhật các quy tắc bảo vệ trước khi người quản lý dịch hay không."
1990
+ },
1991
+ "backup": {
1992
+ "enabled": {
1993
+ "label": "Bật sao lưu",
1994
+ "description": "Bật tự động sao lưu cài đặt",
1995
+ "help": "Bật/tắt tính năng sao lưu"
1996
+ },
1997
+ "singleFileMode": {
1998
+ "label": "Chế độ tập tin đơn",
1999
+ "description": "Sử dụng một tập tin để sao lưu",
2000
+ "help": "Cài đặt sao lưu trong một tập tin duy nhất"
2001
+ },
2002
+ "singleBackupFile": {
2003
+ "label": "Đường dẫn tệp sao lưu",
2004
+ "description": "Đường dẫn đến tập tin sao lưu",
2005
+ "help": "Đường dẫn đến tập tin sao lưu duy nhất"
2006
+ },
2007
+ "retentionDays": {
2008
+ "label": "Thời gian lưu giữ",
2009
+ "description": "Số ngày lưu giữ tập tin sao lưu",
2010
+ "help": "Số ngày giữ lại file backup cũ"
2011
+ },
2012
+ "maxBackups": {
2013
+ "label": "Sao lưu tối đa",
2014
+ "description": "Các tập tin sao lưu tối đa để giữ",
2015
+ "help": "Số lượng tệp sao lưu tối đa cần giữ"
2016
+ },
2017
+ "confirm": {
2018
+ "label": "Xác nhận sao lưu",
2019
+ "description": "Yêu cầu xác nhận cho các hoạt động sao lưu",
2020
+ "help": "Xác nhận hoạt động sao lưu"
2021
+ }
2022
+ }
2023
+ },
2024
+ "actions": {
2025
+ "editSetting": "Biên tập {setting}:",
2026
+ "settingUpdated": "✅ {setting} đã cập nhật thành công!",
2027
+ "invalidValue": "❌ Giá trị không hợp lệ. Vui lòng thử lại.",
2028
+ "pressEnter": "Nhấn Enter để tiếp tục...",
2029
+ "backToMenu": "Quay lại menu chính",
2030
+ "saveSuccess": "✅ Đã lưu cài đặt thành công!",
2031
+ "saveFailed": "❌ Không lưu được cài đặt: {error}",
2032
+ "resetConfirm": "Bạn có chắc chắn muốn đặt lại tất cả cài đặt về mặc định không? (có/không):",
2033
+ "resetSuccess": "✅ Đặt lại cài đặt về mặc định thành công!",
2034
+ "importSuccess": "✅ Đã nhập cài đặt thành công!",
2035
+ "exportSuccess": "✅ Đã xuất cài đặt thành công!",
2036
+ "fileNotFound": "❌ Không tìm thấy tập tin: {path}",
2037
+ "invalidFormat": "❌ Định dạng tệp cài đặt không hợp lệ",
2038
+ "pinProtectionUpdated": "✅ Bảo vệ mã PIN cho {script} đã cập nhật thành công!",
2039
+ "pinProtectionReset": "✅ Tất cả cài đặt bảo vệ mã PIN được đặt lại về mặc định!",
2040
+ "pinProtectionConfigure": "Định cấu hình bảo vệ mã PIN cho từng tập lệnh riêng lẻ",
2041
+ "pinProtectionSelectScript": "Chọn tập lệnh để chuyển đổi bảo vệ bằng mã PIN:",
2042
+ "pinProtectionCurrentStatus": "Tình trạng hiện tại: {status}",
2043
+ "pinProtectionEnabled": "Đã bật",
2044
+ "pinProtectionDisabled": "Tàn tật",
2045
+ "pinProtectionToggle": "Chuyển đổi bảo vệ mã PIN",
2046
+ "pinProtectionResetAll": "Đặt lại tất cả về mặc định",
2047
+ "pinProtectionBack": "Quay lại Cài đặt bảo mật"
2048
+ },
2049
+ "themes": {
2050
+ "light": "Ánh sáng",
2051
+ "dark": "Tối tăm",
2052
+ "system": "Hệ thống"
2053
+ },
2054
+ "languages": {
2055
+ "en": "Tiếng Anh",
2056
+ "de": "tiếng Đức",
2057
+ "es": "tiếng Tây Ban Nha",
2058
+ "fr": "người Pháp",
2059
+ "ru": "tiếng Nga",
2060
+ "ja": "tiếng Nhật",
2061
+ "zh": "Tiếng Trung",
2062
+ "it": "Tiếng Ý",
2063
+ "pt": "Tiếng Bồ Đào Nha",
2064
+ "nl": "Tiếng Hà Lan",
2065
+ "pl": "Tiếng Ba Lan",
2066
+ "sv": "Tiếng Thụy Điển",
2067
+ "uk": "Tiếng Ukraina",
2068
+ "cs": "Tiếng Séc",
2069
+ "tr": "Tiếng Thổ Nhĩ Kỳ",
2070
+ "ko": "Tiếng Hàn",
2071
+ "ar": "Tiếng Ả Rập",
2072
+ "hi": "Tiếng Hindi",
2073
+ "th": "Tiếng Thái",
2074
+ "vi": "Tiếng Việt",
2075
+ "he": "Tiếng Do Thái",
2076
+ "el": "Tiếng Hy Lạp",
2077
+ "hu": "Tiếng Hungary"
2078
+ },
2079
+ "viewAll": {
2080
+ "title": "Xem tất cả cài đặt"
2081
+ },
2082
+ "current": "Hiện hành",
2083
+ "back": "Quay lại menu chính",
2084
+ "selectSettingPrompt": "Chọn cài đặt cần chỉnh sửa (hoặc b để quay lại, r để đặt lại):",
2085
+ "invalidOption": "Tùy chọn không hợp lệ.",
2086
+ "editing": "Chỉnh sửa",
2087
+ "enterNewValue": "Nhập giá trị mới (hoặc nhấn Enter để giữ giá trị hiện tại, nhập 'mặc định' để sử dụng mặc định hệ thống):",
2088
+ "validOptions": "Tùy chọn hợp lệ",
2089
+ "updatedSuccessfully": "đã cập nhật thành công!",
2090
+ "noHelp": "Không có trợ giúp nào cho cài đặt này",
2091
+ "resetScriptDirectories": "Đặt lại về giá trị mặc định",
2092
+ "resetScriptDirectoriesTitle": "Đặt lại thư mục tập lệnh về mặc định",
2093
+ "resetScriptDirectoriesWarning1": "Điều này sẽ đặt lại tất cả các cấu hình thư mục tập lệnh về mặc định hệ thống của chúng.",
2094
+ "resetScriptDirectoriesWarning2": "Tất cả các đường dẫn thư mục tùy chỉnh sẽ bị xóa. Không thể hoàn tác hành động này.",
2095
+ "resetScriptDirectoriesConfirm": "Bạn có chắc chắn muốn đặt lại tất cả các thư mục tập lệnh về mặc định không? (có/không):",
2096
+ "backup": {
2097
+ "title": "Cài đặt sao lưu",
2098
+ "description": "Sao lưu cài đặt hiện tại vào một tập tin",
2099
+ "confirm": "Bạn có chắc chắn muốn sao lưu cài đặt hiện tại không? (có/không):",
2100
+ "success": "✅ Cài đặt được sao lưu thành công vào {backupFile}",
2101
+ "failed": "❌ Sao lưu cài đặt không thành công: {error}",
2102
+ "enabled": "Bật sao lưu",
2103
+ "enabledHelp": "Bật/tắt tính năng sao lưu",
2104
+ "singleFileMode": "Chế độ tập tin đơn",
2105
+ "singleFileModeHelp": "Cài đặt sao lưu trong một tập tin duy nhất",
2106
+ "singleBackupFile": "Tệp sao lưu đơn",
2107
+ "singleBackupFileHelp": "Đường dẫn đến tập tin sao lưu duy nhất",
2108
+ "retentionDays": "Ngày lưu giữ",
2109
+ "retentionDaysHelp": "Số ngày giữ lại file backup cũ",
2110
+ "maxBackups": "Sao lưu tối đa",
2111
+ "maxBackupsHelp": "Số lượng tệp sao lưu tối đa cần giữ",
2112
+ "confirmHelp": "Xác nhận hoạt động sao lưu",
2113
+ "confirmYes": "Đúng",
2114
+ "confirmNo": "KHÔNG"
2115
+ },
2116
+ "validation": {
2117
+ "valid": "Có hiệu lực",
2118
+ "validatingPaths": "Đang xác thực các đường dẫn đã định cấu hình...",
2119
+ "validationComplete": "Xác thực đường dẫn hoàn tất: {valid}/{total} có hiệu lực."
2120
+ }
2121
+ },
2122
+ "summary": {
2123
+ "separator": "============================================================",
2124
+ "configurationTitle": "🔧 Cấu hình:",
2125
+ "sourceLanguage": "Ngôn ngữ nguồn: {sourceLanguage}",
2126
+ "supportedExtensions": "Các tiện ích mở rộng được hỗ trợ: {extensions}",
2127
+ "excludedFiles": "Các tập tin bị loại trừ: {files}",
2128
+ "reportContent": "{report}",
2129
+ "fatalError": "❌Lỗi nghiêm trọng: {error}",
2130
+ "helpTitle": "📊 MÁY TẠO BÁO CÁO TÓM TẮT I18NTK",
2131
+ "helpDescription": "Phân tích cấu trúc thư mục i18n và tạo báo cáo tóm tắt toàn diện bao gồm số liệu thống kê chính, phân tích cấu trúc tệp và kiểm tra xác thực.",
2132
+ "helpUsage": "Cách sử dụng: nút i18ntk-summary.js [tùy chọn]",
2133
+ "helpOptions": "--nguồn-thư mục <dir> Thư mục nguồn để phân tích",
2134
+ "helpSourceDir": "--nguồn-thư mục <dir> Thư mục nguồn để phân tích",
2135
+ "helpOutput": "--đầu ra <file> Tệp đầu ra cho báo cáo",
2136
+ "helpVerbose": "--verbose, -v Hiển thị thông tin chi tiết",
2137
+ "helpKeepReports": "--keep-reports Giữ các báo cáo hiện có",
2138
+ "helpDeleteReports": "--delete-reports Xóa các báo cáo hiện có",
2139
+ "helpHelp": "--help, -h Hiển thị trợ giúp này",
2140
+ "helpExamples": "Ví dụ:",
2141
+ "helpExample1": "nút i18ntk-summary.js",
2142
+ "helpExample2": "nút i18ntk-summary.js --source-dir ./locales",
2143
+ "helpExample3": "nút i18ntk-summary.js --output summary-report.txt",
2144
+ "helpExample4": "nút i18ntk-summary.js --verbose",
2145
+ "helpExample5": "nút i18ntk-summary.js --source-dir ./locales --output report.json",
2146
+ "couldNotReadFile": "⚠️ Không thể đọc tập tin: {filePath}",
2147
+ "couldNotParseJSFile": "⚠️ Không thể phân tích tệp JS/TS: {filePath}",
2148
+ "errorReadingFile": "⚠️ Lỗi đọc file {filePath}: {error}",
2149
+ "analyzingFolder": "🔍 Phân tích cấu trúc thư mục...",
2150
+ "noLanguageDirectoriesFound": "❌ Không tìm thấy thư mục ngôn ngữ trong thư mục nguồn được chỉ định.",
2151
+ "foundLanguages": "✅ Đã tìm thấy {count} ngôn ngữ: {languages}",
2152
+ "referenceLanguageFiles": "📁 Ngôn ngữ tham khảo '{language}' có {count} tập tin",
2153
+ "analyzingLanguage": "🌍 Phân tích ngôn ngữ: {language}",
2154
+ "keysInFiles": "📊 Đã tìm thấy {keys} phím trên {files} tập tin",
2155
+ "checkingInconsistentKeys": "🔍 Kiểm tra các khóa không nhất quán giữa các ngôn ngữ...",
2156
+ "generatingSummaryReport": "📝 Đang tạo báo cáo tóm tắt...",
2157
+ "reportTitle": "📊 I18NTK SUMMARY REPORT",
2158
+ "generated": "Đã tạo: {timestamp}",
2159
+ "sourceDirectory": "Thư mục nguồn: {dir}",
2160
+ "overview": "📈 OVERVIEW",
2161
+ "languagesCount": "Ngôn ngữ: {count}",
2162
+ "totalFiles": "Tổng số tập tin: {count}",
2163
+ "totalKeys": "Tổng số phím: {count}",
2164
+ "avgKeysPerLanguage": "Số phím trung bình cho mỗi ngôn ngữ: {count}",
2165
+ "languagesBreakdown": "🌍 PHÂN TÍCH NGÔN NGỮ",
2166
+ "languageBreakdown": "{language}: {files} tập tin, {keys} phím",
2167
+ "fileStructure": "📁 CẤU TRÚC TỆP",
2168
+ "fileKeys": "{file}: {keys} phím",
2169
+ "missingInLanguages": "⚠️ Thiếu: {languages}",
2170
+ "issuesFound": "❌ ISSUES FOUND",
2171
+ "missingFiles": "📁 Thiếu tập tin:",
2172
+ "emptyFiles": "📄 Tệp trống:",
2173
+ "malformedFiles": "⚠️ Tệp không đúng định dạng:",
2174
+ "duplicateKeys": "🔑 Chìa khóa trùng lặp:",
2175
+ "inconsistentKeys": "🔍 Các phím không nhất quán:",
2176
+ "missingKeys": "Mất tích: {keys}{more}",
2177
+ "extraKeys": "Thêm: {keys}{more}",
2178
+ "noIssuesFound": "✅ NO ISSUES FOUND",
2179
+ "allFilesConsistent": "Tất cả các tệp dịch đều nhất quán giữa các ngôn ngữ.",
2180
+ "recommendations": "💡 KHUYẾN NGHỊ",
2181
+ "createMissingFiles": "• Tạo các tập tin dịch bị thiếu",
2182
+ "addContentToEmptyFiles": "• Thêm nội dung vào các tập tin dịch trống",
2183
+ "fixMalformedFiles": "• Sửa các tệp JSON/JS không đúng định dạng",
2184
+ "removeDuplicateKeys": "• Xóa các khóa trùng lặp khỏi tập tin",
2185
+ "synchronizeKeys": "• Đồng bộ hóa các phím trên tất cả các ngôn ngữ",
2186
+ "splitLargeFiles": "• Xem xét việc chia các tệp lớn thành các không gian tên nhỏ hơn",
2187
+ "addMoreLanguages": "• Cân nhắc thêm nhiều ngôn ngữ hơn",
2188
+ "nextSteps": "🎯 NEXT STEPS",
2189
+ "nextStep1": "1. Khắc phục mọi sự cố được xác định ở trên",
2190
+ "nextStep2": "2. Chạy xác thực để đảm bảo tính nhất quán",
2191
+ "nextStep3": "3. Cân nhắc sử dụng i18ntk-validate để xác thực chi tiết",
2192
+ "nextStep4": "4. Khuyến nghị giám sát thường xuyên",
2193
+ "couldNotFindI18nDirectory": "❌ Không tìm thấy thư mục i18n. Vui lòng chỉ định --source-dir.",
2194
+ "sourceDirectoryDoesNotExist": "❌ Thư mục nguồn không tồn tại: {dir}",
2195
+ "i18nSummaryReportGenerator": "📊 Trình tạo báo cáo tóm tắt I18N",
2196
+ "analysisComplete": "✅ Hoàn thành phân tích",
2197
+ "analyzedLanguages": "📊 Ngôn ngữ được phân tích: {count}",
2198
+ "processedFiles": "📁 File đã xử lý: {count}",
2199
+ "foundTranslationKeys": "🔑 Đã tìm thấy phím dịch: {count}",
2200
+ "foundIssues": "❌ Đã tìm thấy {count} vấn đề",
2201
+ "noIssuesConsole": "✅ Không tìm thấy vấn đề nào - tất cả các tệp đều nhất quán!",
2202
+ "errorDuringAnalysis": "❌ Lỗi trong quá trình phân tích: {error}",
2203
+ "usageReportTitle": "📊 I18NTK USAGE REPORT",
2204
+ "usageReportGenerated": "Đã tạo: {timestamp}",
2205
+ "usageReportSourceDir": "Thư mục nguồn: {sourceDir}",
2206
+ "usageReportI18nDir": "Thư mục I18n: {i18nDir}",
2207
+ "usageReportSummary": "📈 SUMMARY",
2208
+ "usageReportSourceFilesScanned": "Các tập tin nguồn được quét: {count}",
2209
+ "usageReportTranslationFilesFound": "Các tập tin dịch được tìm thấy: {count}",
2210
+ "usageReportAvailableKeys": "Các phím dịch có sẵn: {count}",
2211
+ "usageReportUsedKeys": "Các phím dịch được sử dụng: {count}",
2212
+ "usageReportDynamicKeys": "Phím dịch động: {count}",
2213
+ "usageReportUnusedKeys": "Các phím dịch không được sử dụng: {count}",
2214
+ "usageReportMissingKeys": "Thiếu phím dịch: {count}",
2215
+ "usageReportNotTranslatedKeys": "Các phím chưa được dịch: {count}",
2216
+ "usageReportTranslationCompleteness": "🌍 BẢN DỊCH HOÀN THÀNH",
2217
+ "usageReportLanguageCompleteness": "{language}: {completeness}% ({translated}/{total})",
2218
+ "usageReportNotTranslatedInLanguage": "Không được dịch: {count} phím",
2219
+ "usageReportTranslationFilesDiscovered": "📁 TẬP TIN DỊCH",
2220
+ "usageReportFileInfo": "{relativePath} (không gian tên: {namespace}, kiểu: {type})",
2221
+ "usageReportUnusedTranslationKeys": "🗑️ PHÍM DỊCH CHƯA SỬ DỤNG",
2222
+ "usageReportUnusedKeysDescription": "Các khóa này tồn tại trong tệp dịch nhưng không được sử dụng trong mã nguồn:",
2223
+ "usageReportUnusedKey": "• {key}",
2224
+ "usageReportMoreUnusedKeys": "... Và {count} nhiều phím không được sử dụng hơn",
2225
+ "usageReportMissingTranslationKeys": "❌ THIẾU PHÍM DỊCH",
2226
+ "usageReportMissingKeysDescription": "Các khóa này được sử dụng trong mã nguồn nhưng bị thiếu trong các tệp dịch:",
2227
+ "usageReportMissingKey": "• {key}",
2228
+ "usageReportUsedIn": "Được sử dụng trong: {filePath}",
2229
+ "usageReportMoreFiles": "... Và {count} nhiều tập tin hơn",
2230
+ "usageReportDynamicTranslationKeys": "⚡ PHÍM DỊCH ĐỘNG",
2231
+ "usageReportDynamicKeysDescription": "Các khóa này được sử dụng động (được xây dựng khi chạy):",
2232
+ "usageReportDynamicKey": "• {key}",
2233
+ "usageReportFileUsageBreakdown": "📊 PHÂN TÍCH SỬ DỤNG TỆP",
2234
+ "usageReportFileUsage": "{filePath}: {count} phím",
2235
+ "status": {
2236
+ "generating": "⏳ Đang tạo...",
2237
+ "completed": "✅ Đã hoàn thành"
2238
+ },
2239
+ "help": {
2240
+ "usage": "Cách sử dụng: nút main/manage/index.js [tùy chọn]",
2241
+ "interactiveMode": "💡 Sử dụng: node main/manage/index.js --command=<command> để thực hiện trực tiếp",
2242
+ "initProject": "🚀 Khởi tạo ngôn ngữ mới",
2243
+ "analyzeTranslations": "🔍 Phân tích bản dịch",
2244
+ "validateTranslations": "✅ Xác thực bản dịch",
2245
+ "checkUsage": "📊 Kiểm tra việc sử dụng khóa",
2246
+ "showHelp": "📖 Sử dụng: node main/manage/index.js --help cho các lệnh có sẵn",
2247
+ "availableCommands": "📖 Các lệnh có sẵn:",
2248
+ "initCommand": "init - Khởi tạo ngôn ngữ mới",
2249
+ "analyzeCommand": "analyze - Phân tích bản dịch",
2250
+ "validateCommand": "xác thực - Xác thực bản dịch",
2251
+ "usageCommand": "cách sử dụng - Kiểm tra việc sử dụng khóa",
2252
+ "sizingCommand": "định cỡ - Phân tích kích thước",
2253
+ "completeCommand": "hoàn thành - Bản dịch hoàn chỉnh (phủ sóng 100%)",
2254
+ "summaryCommand": "tóm tắt - Hiển thị trạng thái dự án",
2255
+ "scannerCommand": "máy quét - Quét các vấn đề về i18n",
2256
+ "translateCommand": "dịch - Tự động dịch tập tin ngôn ngữ",
2257
+ "debugCommand": "gỡ lỗi - Gỡ lỗi các vấn đề dịch thuật"
2258
+ },
2259
+ "test_complete_system": {
2260
+ "starting_test": "🧪 Bắt đầu kiểm tra hệ thống hoàn chỉnh",
2261
+ "separator": "=",
2262
+ "testing_ui_translations": "📝 Kiểm tra bản dịch giao diện người dùng...",
2263
+ "testing_settings_manager": "⚙️ Kiểm tra Trình quản lý cài đặt...",
2264
+ "testing_main_scripts": "🔧 Kiểm tra các tập lệnh chính...",
2265
+ "checking_translation_consistency": "🌐 Kiểm tra tính nhất quán của bản dịch...",
2266
+ "non_critical_missing_keys": "ℹ️ {file}: {count} phím bị thiếu không quan trọng",
2267
+ "extra_keys": "ℹ️ {file}: {count} phím phụ",
2268
+ "generating_report": "📊 Đang tạo báo cáo...",
2269
+ "final_test_report_title": "📋 FINAL TEST REPORT",
2270
+ "passed": "✅ Đạt: {passed}",
2271
+ "failed": "❌ Thất bại: {failed}",
2272
+ "warnings": "⚠️ Cảnh báo: {warnings}",
2273
+ "missing_translations_title": "🔍 Thiếu bản dịch ({count}):",
2274
+ "missing_translation_key": "- {key}",
2275
+ "missing_translations_more": "... Và {count} hơn",
2276
+ "errors_title": "❌ Lỗi:",
2277
+ "error_message": "- {error}",
2278
+ "overall_status": "📊 Tình trạng chung: {status}",
2279
+ "success_message": "✅ {message}",
2280
+ "failure_message": "❌ {message}",
2281
+ "failure_error_message": "{errorMessage}",
2282
+ "warning_message": "⚠️ {message}",
2283
+ "test_runner_failed": "❌ Người chạy thử không thành công:",
2284
+ "recommendations": {
2285
+ "add_missing_translation_keys": "Thêm các phím dịch còn thiếu để duy trì tính nhất quán",
2286
+ "fix_failing_scripts": "Sửa các tập lệnh bị lỗi trước khi triển khai",
2287
+ "review_warning_messages": "Xem xét và giải quyết các thông báo cảnh báo",
2288
+ "system_ready_for_deployment": "Hệ thống đã sẵn sàng để triển khai"
2289
+ },
2290
+ "hardcodedTexts": {
2291
+ "addMissingTranslationKeys": "Thêm các phím dịch còn thiếu để duy trì tính nhất quán",
2292
+ "fixFailingScripts": "Sửa các tập lệnh bị lỗi trước khi triển khai",
2293
+ "reviewWarningMessages": "Xem xét và giải quyết các thông báo cảnh báo",
2294
+ "systemReadyForDeployment": "Hệ thống đã sẵn sàng để triển khai"
2295
+ }
2296
+ },
2297
+ "testConsoleI18n": {
2298
+ "found_target_file": "Đã tìm thấy tệp mục tiêu: {fileName}",
2299
+ "scanning_files_for_console_statements": "Đang quét tệp để tìm câu lệnh trên bảng điều khiển...",
2300
+ "found_javascript_files": "Thành lập {count} Các tệp JavaScript.",
2301
+ "console_i18n_analysis_results": "Kết quả phân tích bảng điều khiển I18n",
2302
+ "total_console_statements": "Tổng số câu lệnh trên bảng điều khiển: {count}",
2303
+ "translated_statements": "Các tuyên bố được dịch: {count}",
2304
+ "hardcoded_statements": "Các câu lệnh được mã hóa cứng: {count}",
2305
+ "translation_coverage": "Phạm vi dịch thuật: {percentage}%",
2306
+ "coverage_by_file": "Bảo hiểm theo tập tin:",
2307
+ "file_coverage_stats": "{emoji} {fileName}: {coverage}% ({translated}/{total})",
2308
+ "hardcoded_console_statements": "Báo cáo bảng điều khiển được mã hóa cứng:",
2309
+ "file_header": "Tài liệu: {file}",
2310
+ "line_statement": "Đường kẻ {line}: {statement}",
2311
+ "suggested_key": "Khóa được đề xuất: {key}",
2312
+ "suggested_replacement": "Đề nghị thay thế: {replacement}",
2313
+ "recommendations": "Khuyến nghị:",
2314
+ "recommendation_1": "1. Thay thế các chuỗi được mã hóa cứng bằng lệnh gọi i18n.t().",
2315
+ "recommendation_2": "2. Thêm khóa mới vào tệp JSON dịch có liên quan.",
2316
+ "recommendation_3": "3. Đảm bảo tất cả các thông báo trên bảng điều khiển đều hướng tới người dùng và cần được dịch.",
2317
+ "recommendation_4": "4. Sử dụng các ký tự mẫu hoặc nối chuỗi cho các thông báo động, chuyển các biến tới i18n.t().",
2318
+ "translation_keys_to_add": "Khóa dịch được đề xuất để thêm:",
2319
+ "add_keys_instruction": "Sao chép cấu trúc JSON sau vào tệp dịch của bạn:",
2320
+ "perfect_translation_coverage": "Bảo hiểm dịch thuật hoàn hảo!",
2321
+ "all_statements_using_translation": "Tất cả các câu lệnh trên bảng điều khiển đều đang sử dụng hệ thống dịch thuật.",
2322
+ "i18n_console_translation_checker": "Trình kiểm tra bản dịch bảng điều khiển I18n",
2323
+ "script_description_line1": "Tập lệnh này quét tất cả các tệp JavaScript để tìm câu lệnh trên bảng điều khiển",
2324
+ "script_description_line2": "và kiểm tra xem họ có đang sử dụng hệ thống dịch thuật hay không.",
2325
+ "analysis_completed_in_duration": "Phân tích hoàn thành vào {duration} giây.",
2326
+ "report_saved_to_path": "Báo cáo được lưu vào: {path}",
2327
+ "found_hardcoded_messages": "Thành lập {count} tin nhắn được mã hóa cứng. Thoát với mã lỗi 1.",
2328
+ "all_console_messages_use_translation": "Tất cả các tin nhắn trên bảng điều khiển đều sử dụng bản dịch. Thoát với mã 0.",
2329
+ "consoleTranslationsCheck": "Kiểm tra bản dịch bảng điều khiển"
2330
+ },
2331
+ "translate_mismatches": {
2332
+ "title": "🌐 Trợ giúp dịch thuật {dryRun}",
2333
+ "separator": "=====================================",
2334
+ "processing_file": "📄 Đang xử lý {language}.json...",
2335
+ "translation_summary_title": "📊 Tóm tắt bản dịch:",
2336
+ "total_translations_applied": "Tổng số bản dịch được áp dụng: {totalTranslations}",
2337
+ "run_with_apply_instruction": "💡 Chạy với --apply để áp dụng các bản dịch này",
2338
+ "no_translation_mappings": "⚠️ Không có bản đồ dịch cho {language}",
2339
+ "translation_applied": "✅ {key}: \"{oldValue}\" → \"{newValue}\"",
2340
+ "saved_translations": "💾 Đã lưu {count} bản dịch sang {filename}",
2341
+ "found_translatable_items": "🔍 Đã tìm thấy {count} các mục có thể dịch",
2342
+ "no_automatic_translations": "✨ Không có bản dịch tự động",
2343
+ "error_processing_file": "❌ Lỗi xử lý {filename}: {errorMessage}",
2344
+ "coverage_report_title": "📊 Báo cáo phạm vi dịch thuật",
2345
+ "coverage_report_separator": "===============================",
2346
+ "file_header": "📄 {filename}:",
2347
+ "total_keys": "Tổng số phím: {total}",
2348
+ "translated_keys": "Đã dịch: {translated}",
2349
+ "untranslated_markers": "Các dấu hiệu chưa được dịch: {untranslated}",
2350
+ "contains_english": "Chứa tiếng Anh: {hasEnglish}",
2351
+ "coverage_percentage": "Bảo hiểm: {coverage}%",
2352
+ "error_general": "❌ Lỗi:",
2353
+ "use_help": "Sử dụng --help để biết thông tin sử dụng"
2354
+ },
2355
+ "cleaningUpReportFiles": "Dọn dẹp các tập tin báo cáo cũ...",
2356
+ "couldNotDelete": "Không thể xóa {file}: {error}",
2357
+ "deletedOldReportFiles": "Đã xóa {count} (các) tệp báo cáo cũ.",
2358
+ "errorCleaningUpReports": "Lỗi khi dọn dẹp báo cáo: {error}",
2359
+ "noOldReportFilesToDelete": "Không có tập tin báo cáo cũ để xóa.",
2360
+ "reportFilesPreserved": "Các tập tin báo cáo được bảo tồn.",
2361
+ "reportSaveFailed": "Không thể lưu báo cáo vào: {reportPath}",
2362
+ "reportSaved": "Báo cáo được lưu vào: {reportPath}"
2363
+ },
2364
+ "ui": {
2365
+ "autoDetectedI18nDirectory": "Thư mục i18n được tự động phát hiện: {path}",
2366
+ "executingCommand": "Lệnh thực thi: {command}",
2367
+ "unknownCommand": "Lệnh không xác định: {command}",
2368
+ "errorExecutingCommand": "Lỗi thực thi lệnh: {error}",
2369
+ "errorLoadingTranslationFile": "Lỗi tải tệp dịch cho '{language}': {error}",
2370
+ "errorSavingLanguagePreference": "Lỗi lưu tùy chọn ngôn ngữ: {error}",
2371
+ "noActiveReadlineInterface": "Không có giao diện readline hoạt động",
2372
+ "uiLanguageUpdated": "Ngôn ngữ giao diện người dùng được cập nhật thành: {language}",
2373
+ "selectOptionPrompt": "Chọn một tùy chọn:",
2374
+ "pressEnterToReturn": "Nhấn Enter để quay lại menu chính...",
2375
+ "detectedSourceDirectory": "Thư mục nguồn được phát hiện: {sourceDir}",
2376
+ "detectedI18nDirectory": "Đã phát hiện thư mục i18n: {directory}",
2377
+ "toolkitTitle": "i18ntk - Bộ công cụ quản lý i18n dành cho doanh nghiệp",
2378
+ "versionInfo": "Phiên bản: {version}",
2379
+ "releaseDate": "Ngày phát hành: {date}",
2380
+ "maintainer": "Người bảo trì: {maintainer}",
2381
+ "nodeVersion": "Node.js: {version}",
2382
+ "license": "Giấy phép: {license}",
2383
+ "whatsNew": "✨ Có gì mới trong v{version}:",
2384
+ "changeItem": "{change}",
2385
+ "documentation": "📚 Tài liệu: {url}",
2386
+ "issues": "🐛 Vấn đề: {url}",
2387
+ "versionInfoUnavailable": "thông tin phiên bản i18ntk không có sẵn",
2388
+ "versionInfoError": "Lỗi: {error}"
2389
+ },
2390
+ "validateLanguagePurity": {
2391
+ "phrase_debug_tools": "công cụ gỡ lỗi",
2392
+ "phrase_settings": "cài đặt",
2393
+ "phrase_configuration": "cấu hình",
2394
+ "phrase_invalid_choice": "lựa chọn không hợp lệ",
2395
+ "phrase_please_select": "vui lòng chọn",
2396
+ "phrase_back_to_main_menu": "quay lại menu chính",
2397
+ "phrase_error": "lỗi",
2398
+ "phrase_warning": "cảnh báo",
2399
+ "phrase_success": "thành công",
2400
+ "phrase_failed": "thất bại",
2401
+ "phrase_loading": "đang tải",
2402
+ "phrase_saving": "tiết kiệm",
2403
+ "phrase_full_system_debug": "gỡ lỗi toàn bộ hệ thống",
2404
+ "phrase_configuration_debug": "gỡ lỗi cấu hình",
2405
+ "phrase_translation_debug": "gỡ lỗi dịch thuật",
2406
+ "phrase_performance_debug": "gỡ lỗi hiệu suất",
2407
+ "phrase_admin_pin_setup": "thiết lập mã pin quản trị viên",
2408
+ "phrase_enter_admin_pin": "nhập mã pin quản trị viên",
2409
+ "phrase_confirm_admin_pin": "xác nhận mã pin của quản trị viên",
2410
+ "phrase_authentication_failed": "xác thực không thành công",
2411
+ "phrase_access_denied": "quyền truy cập bị từ chối",
2412
+ "phrase_security_log": "nhật ký bảo mật",
2413
+ "language_german": "tiếng Đức",
2414
+ "language_french": "người Pháp",
2415
+ "language_spanish": "tiếng Tây Ban Nha",
2416
+ "language_russian": "tiếng Nga",
2417
+ "language_japanese": "tiếng Nhật",
2418
+ "language_chinese": "Tiếng Trung",
2419
+ "validator_title": "🔍 Trình xác thực độ tinh khiết của ngôn ngữ",
2420
+ "validating_file": "📄 Xác thực {language}.json ({name})...",
2421
+ "valid_file_message": "✅ Hợp lệ - Không vi phạm độ tinh khiết của ngôn ngữ",
2422
+ "invalid_file_message": "❌ Không hợp lệ - {count} (các) vi phạm được phát hiện",
2423
+ "no_validation_rules": "Không có quy tắc xác thực nào được xác định cho ngôn ngữ: {language}",
2424
+ "error_reading_file": "Lỗi đọc tập tin: {errorMessage}",
2425
+ "issue_forbidden_marker": "Chứa điểm đánh dấu bị cấm: {marker}",
2426
+ "issue_english_phrase": "Chứa cụm từ tiếng Anh: \"{phrase}\"",
2427
+ "issue_english_words": "Chứa các từ tiếng Anh: {words}",
2428
+ "issue_missing_cyrillic": "Văn bản dài phải chứa các ký tự Cyrillic cho tiếng Nga",
2429
+ "issue_missing_japanese": "Văn bản dài phải chứa ký tự tiếng Nhật",
2430
+ "issue_missing_chinese": "Văn bản dài phải chứa ký tự tiếng Trung",
2431
+ "summary_title": "📊 TÓM TẮT XÁC NHẬN",
2432
+ "overall_results_header": "📋 Kết quả chung cuộc:",
2433
+ "total_files_validated": "Tổng số tệp được xác thực: {count}",
2434
+ "valid_files": "Các tập tin hợp lệ: {count}",
2435
+ "invalid_files": "Các tập tin không hợp lệ: {count}",
2436
+ "total_violations": "Tổng số vi phạm: {count}",
2437
+ "violations_by_file_header": "❌ VI PHẠM BẰNG TẬP TIN:"
2438
+ },
2439
+ "workflow": {
2440
+ "title": "Quản lý quy trình làm việc",
2441
+ "description": "Quản lý quy trình công việc i18n.",
2442
+ "select_workflow_file": "Chọn một tệp quy trình làm việc để chạy:",
2443
+ "no_workflow_files": "Không tìm thấy tệp quy trình công việc nào trong thư mục quy trình công việc.",
2444
+ "invalid_selection": "Lựa chọn không hợp lệ. Vui lòng nhập số tương ứng với tệp quy trình công việc.",
2445
+ "workflow_execution_started": "Bắt đầu quy trình làm việc: {workflowName}",
2446
+ "workflow_execution_completed": "Quy trình làm việc đã hoàn thành: {workflowName}",
2447
+ "workflow_execution_failed": "Quy trình làm việc không thành công: {workflowName} - {error}",
2448
+ "workflow_cancelled": "Đã hủy thực hiện quy trình công việc.",
2449
+ "press_enter_to_continue": "Nhấn Enter để tiếp tục!",
2450
+ "starting": "🚀 Bắt đầu công việc...",
2451
+ "completed": "✅ Quá trình làm việc đã hoàn tất thành công!",
2452
+ "checkReports": "📄 Kiểm tra báo cáo để biết chi tiết.",
2453
+ "exitingCompleted": "📝 Quy trình làm việc đã hoàn tất. Đang thoát...",
2454
+ "summary": {
2455
+ "title": "📋 WORKFLOW SUMMARY",
2456
+ "separator": "===================",
2457
+ "completedAt": "🕐 Công việc đã hoàn thành lúc: {timestamp}",
2458
+ "initialViolations": "📊 Vi phạm lần đầu: {count}",
2459
+ "finalViolations": "📉 Vi phạm cuối cùng: {count}",
2460
+ "totalFixes": "🔧 Tổng số bản sửa lỗi được áp dụng: {count}",
2461
+ "improvement": "📈 Cải thiện: {percentage}%",
2462
+ "stepResults": "📝 STEP RESULTS:",
2463
+ "stepDetail": "{number}. {status} {stepName}",
2464
+ "violations": "Vi phạm: {count}",
2465
+ "fixesApplied": "Các bản sửa lỗi được áp dụng: {count}",
2466
+ "nextSteps": "💡 NEXT STEPS:",
2467
+ "congratulations": "🎉 Xin chúc mừng! Tất cả các tệp ngôn ngữ hiện có độ tinh khiết ngôn ngữ hoàn hảo!",
2468
+ "cicdIntegration": "✅ Cân nhắc việc tích hợp trình xác thực vào hệ thống CI/CD của bạn",
2469
+ "automatedChecks": "✅ Thiết lập kiểm tra tự động cho các bản dịch mới",
2470
+ "greatProgress": "🎯 Tiến bộ vượt bậc! Hầu hết các vấn đề đã được giải quyết.",
2471
+ "manualReview": "🔍 Xem xét thủ công các vi phạm còn lại",
2472
+ "addMappings": "🌐 Cân nhắc thêm nhiều ánh xạ dịch hơn cho các trường hợp biên",
2473
+ "goodProgress": "📈 Đã đạt được tiến triển tốt nhưng cần phải nỗ lực nhiều hơn nữa.",
2474
+ "expandMappings": "🔧 Mở rộng ánh xạ dịch tự động",
2475
+ "professionalReview": "👥 Xem xét việc xem xét thủ công các bản dịch phức tạp",
2476
+ "runAgain": "🔄 Chạy lại quy trình làm việc sau khi thêm nhiều ánh xạ hơn",
2477
+ "limitedProgress": "⚠️ Tiến độ có hạn. Có thể cần can thiệp thủ công.",
2478
+ "reviewMappings": "🔍 Xem lại bản đồ dịch và thêm những bản đồ còn thiếu",
2479
+ "professionalServices": "👥 Cân nhắc dịch vụ dịch thuật chuyên nghiệp",
2480
+ "checkIssues": "🔧 Kiểm tra các sự cố hệ thống trong tệp ngôn ngữ",
2481
+ "success": "✅",
2482
+ "warning": "⚠️"
2483
+ }
2484
+ },
2485
+ "consoleI18nTester": {
2486
+ "found_target_file": "Đã tìm thấy tệp mục tiêu",
2487
+ "scanning_files_for_console_statements": "Quét các tập tin để tìm câu lệnh console",
2488
+ "found_javascript_files": "Đã tìm thấy tệp javascript",
2489
+ "console_i18n_analysis_results": "Kết quả phân tích Console i18n",
2490
+ "total_console_statements": "Tổng số câu lệnh trên bảng điều khiển",
2491
+ "translated_statements": "Báo cáo đã được dịch",
2492
+ "hardcoded_statements": "Câu lệnh được mã hóa cứng",
2493
+ "translation_coverage": "Phạm vi dịch thuật",
2494
+ "coverage_by_file": "Bảo hiểm theo tập tin",
2495
+ "file_coverage_stats": "Số liệu thống kê về phạm vi bảo hiểm của tệp",
2496
+ "hardcoded_console_statements": "Câu lệnh console được mã hóa cứng",
2497
+ "file_header": "Tiêu đề tệp",
2498
+ "line_statement": "Tuyên bố dòng",
2499
+ "suggested_key": "Khóa được đề xuất",
2500
+ "suggested_replacement": "Đề xuất thay thế",
2501
+ "recommendations": "Khuyến nghị",
2502
+ "recommendation_1": "Khuyến nghị 1",
2503
+ "recommendation_2": "Khuyến nghị 2",
2504
+ "recommendation_3": "Khuyến nghị 3",
2505
+ "recommendation_4": "Khuyến nghị 4",
2506
+ "translation_keys_to_add": "Phím dịch để thêm",
2507
+ "add_keys_instruction": "Hướng dẫn thêm phím",
2508
+ "perfect_translation_coverage": "Phạm vi dịch thuật hoàn hảo",
2509
+ "all_statements_using_translation": "Tất cả các báo cáo sử dụng bản dịch",
2510
+ "i18n_console_translation_checker": "Trình kiểm tra bản dịch bảng điều khiển I18n",
2511
+ "script_description_line1": "Dòng mô tả kịch bản 1",
2512
+ "script_description_line2": "Dòng mô tả tập lệnh2",
2513
+ "analysis_completed_in_duration": "Phân tích hoàn thành trong thời gian",
2514
+ "report_saved_to_path": "Báo cáo đã được lưu vào đường dẫn",
2515
+ "found_hardcoded_messages": "Đã tìm thấy tin nhắn được mã hóa cứng",
2516
+ "all_console_messages_use_translation": "Tất cả các tin nhắn trên bảng điều khiển đều sử dụng bản dịch"
2517
+ },
2518
+ "exportTranslations": {
2519
+ "createdDirectory": "Thư mục đã tạo",
2520
+ "foundFiles": "Tập tin được tìm thấy",
2521
+ "createdTemplate": "Mẫu đã tạo",
2522
+ "skippedExisting": "Đã bỏ qua Hiện có",
2523
+ "title": "Tiêu đề",
2524
+ "creatingTemplates": "Tạo mẫu",
2525
+ "summary": "Bản tóm tắt",
2526
+ "summaryLanguages": "Ngôn ngữ tóm tắt",
2527
+ "summaryFilesPerLanguage": "Tệp tóm tắt theo ngôn ngữ",
2528
+ "summaryTotalFiles": "Tóm tắt Tổng số tệp",
2529
+ "success": "Thành công",
2530
+ "location": "Vị trí",
2531
+ "nextSteps": "Các bước tiếp theo"
2532
+ },
2533
+ "dashboard": {
2534
+ "title": "Tiêu đề",
2535
+ "overview": "Tổng quan"
2536
+ },
2537
+ "auth": {
2538
+ "title": "Tiêu đề",
2539
+ "email": "E-mail",
2540
+ "password": "Mật khẩu",
2541
+ "signIn": "Đăng nhập",
2542
+ "forgotPassword": "Quên mật khẩu",
2543
+ "signUp": "Đăng ký"
2544
+ },
2545
+ "checkUsage": {
2546
+ "usage_analysis_failed": "Phân tích sử dụng không thành công."
2547
+ },
2548
+ "completeTranslations": {
2549
+ "warning_could_not_parse_filepa": "Cảnh báo: không thể phân tích đường dẫn tệp: {filePath}"
2550
+ },
2551
+ "pressEnterToContinue": "Nhấn Enter để tiếp tục...",
2552
+ "status": {
2553
+ "exitingCompleted": "Quy trình làm việc đã hoàn tất. Đang thoát..."
2554
+ },
2555
+ "prompt": {
2556
+ "yesTokens": [
2557
+ "y",
2558
+ "Đúng"
2559
+ ],
2560
+ "noTokens": [
2561
+ "N",
2562
+ "KHÔNG"
2563
+ ]
2564
+ },
2565
+ "translate": {
2566
+ "title": "Tự động dịch",
2567
+ "sourceDirectory": {
2568
+ "title": "Thư mục miền địa phương nguồn",
2569
+ "currentProject": "Dự án hiện tại: {dir}",
2570
+ "accepted": "Được chấp nhận: đường dẫn tuyệt đối hoặc đường dẫn liên quan đến dự án hiện tại.",
2571
+ "localeRootExample": "./locales (sau đó chọn ngôn ngữ nguồn: en)",
2572
+ "folderHint": "Thư mục có thể chứa trực tiếp các tệp JSON hoặc các thư mục ngôn ngữ như ./locales/en.",
2573
+ "defaultNotFound": "Không tìm thấy thư mục mặc định: {dir}",
2574
+ "enterExisting": "Vui lòng nhập thư mục hiện có chứa các tệp ngôn ngữ JSON.",
2575
+ "directoryNotFound": "Không tìm thấy thư mục: {dir}",
2576
+ "enterFolderExample": "Nhập một thư mục hiện có, ví dụ ./locales/en.",
2577
+ "notDirectory": "Không phải là một thư mục: {dir}",
2578
+ "using": "Sử dụng thư mục nguồn: {dir}"
2579
+ },
2580
+ "targetLanguages": {
2581
+ "title": "(Các) ngôn ngữ đích",
2582
+ "allConfigured": "a) Tất cả các ngôn ngữ đích được định cấu hình: {languages}",
2583
+ "noneConfigured": "a) Tất cả các ngôn ngữ đích được định cấu hình: không có ngôn ngữ nào được định cấu hình",
2584
+ "enterCodes": "Hoặc nhập một hoặc nhiều mã ngôn ngữ được phân tách bằng dấu phẩy/dấu cách.",
2585
+ "sourceExcluded": "Ngôn ngữ nguồn \"{lang}\" sẽ tự động bị loại trừ.",
2586
+ "noneSelected": "Không có ngôn ngữ đích hợp lệ nào được chọn. Đang hủy bỏ.",
2587
+ "configureHint": "Định cấu hình Ngôn ngữ mặc định trong .i18ntk-config hoặc nhập mã mục tiêu theo cách thủ công.",
2588
+ "selected": "Ngôn ngữ mục tiêu: {languages}"
2589
+ },
2590
+ "protection": {
2591
+ "title": "Các điều khoản và khóa được bảo vệ"
2592
+ },
2593
+ "common": {
2594
+ "default": "Mặc định: {value}",
2595
+ "examples": "Ví dụ:",
2596
+ "exampleValue": "Ví dụ: {value}",
2597
+ "examplesInline": "Ví dụ: {examples}",
2598
+ "pressEnterDefault": "Nhấn Enter để sử dụng mặc định.",
2599
+ "usingDefault": "Sử dụng mặc định: {value}"
2600
+ },
2601
+ "sourceLanguage": {
2602
+ "title": "Mã ngôn ngữ nguồn",
2603
+ "hint": "Điều này phải khớp với ngôn ngữ của các giá trị JSON nguồn.",
2604
+ "using": "Sử dụng ngôn ngữ nguồn: {lang}",
2605
+ "invalid": "Mã ngôn ngữ không hợp lệ. Sử dụng hơn 2 ký tự (ví dụ: en, de, fr)."
2606
+ },
2607
+ "files": {
2608
+ "title": "Những tập tin nào để dịch?",
2609
+ "all": "a) Tất cả các tệp JSON ({count}: {files})",
2610
+ "choicePrompt": "Lựa chọn [a/tất cả hoặc số tập tin]:",
2611
+ "invalidChoice": "Lựa chọn không hợp lệ. Đang hủy bỏ."
2612
+ },
2613
+ "dryRun": {
2614
+ "previewFor": "Xem trước chạy thử cho \"{lang}\"..."
2615
+ },
2616
+ "confirm": {
2617
+ "proceed": "Tiến hành dịch thực tế?",
2618
+ "yesNoPrompt": "[y]es / [n]o:",
2619
+ "cancelled": "Bản dịch bị hủy."
2620
+ },
2621
+ "run": {
2622
+ "translatingTo": "Dịch sang \"{lang}\"...",
2623
+ "failedFor": "Không thành công vì \"{lang}\": {error}"
2624
+ },
2625
+ "summary": {
2626
+ "title": "Bản tóm tắt:",
2627
+ "complete": "Bản dịch hoàn tất!"
2628
+ },
2629
+ "nonInteractive": {
2630
+ "useDirect": "Chế độ không tương tác. Thay vào đó hãy sử dụng CLI trực tiếp:"
2631
+ },
2632
+ "errors": {
2633
+ "sourceDirectoryNotFound": "Không tìm thấy thư mục miền địa phương nguồn: {dir}"
2634
+ }
2635
+ }
2636
+ }