i18ntk
Version:
i18n Tool Kit - Zero-dependency internationalization toolkit for setup, scanning, analysis, validation, auto translation, fixing, reporting, and runtime translation loading.
780 lines (779 loc) • 174 kB
JSON
{
"meta": {
"version": "4.7.0",
"updated": "2026-07-07",
"lang": "vi"
},
"common": {
"welcome": "Chào mừng",
"hello": "Xin chào",
"goodbye": "Tạm biệt",
"yes": "Đúng",
"no": "KHÔNG",
"save": "Cứu",
"cancel": "Hủy bỏ",
"delete": "Xóa bỏ",
"edit": "Biên tập",
"loading": "Đang tải...",
"offlineTitle": "Bạn đang ngoại tuyến",
"offlineMessage": "Vui lòng kiểm tra kết nối internet của bạn",
"tryReconnect": "Hãy thử kết nối lại",
"logout": "Đăng xuất",
"login": "Đăng nhập",
"amount": "Số lượng",
"success": "Thành công",
"error": "Lỗi",
"warning": "Cảnh báo",
"info": "Thông tin:",
"debug": "Gỡ lỗi",
"progress": "Tiến triển:",
"remaining": "Còn lại:",
"total": "Tổng cộng:",
"completed": "7. Đã hoàn tất thành công!",
"missing": "Mất tích",
"partial": "một phần",
"sameAsSource": "Tương tự như nguồn:",
"formatMismatch": "Định dạng không khớp:",
"typeMismatch": "Loại không khớp:",
"structureMismatch": "Cấu trúc không phù hợp:",
"invalidOption": "Tùy chọn không hợp lệ",
"separator": "==================================================",
"initializationFailed": "❌ Khởi tạo không thành công: {error}",
"stackTrace": "Dấu vết ngăn xếp: {stack}",
"pressEnterToContinue": "Nhấn Enter để tiếp tục...",
"pressEnterToReturn": "Nhấn Enter để quay lại menu chính...",
"stepCompleted": "Bước chân '{stepName}' hoàn thành.",
"stepFailed": "Bước chân '{stepName}' thất bại.",
"runningStep": "Bước chạy: {stepName}",
"command": "Yêu cầu: {command}",
"startingWorkflow": "Đang bắt đầu quy trình làm việc...",
"workflowCompleted": "Quy trình làm việc đã hoàn tất.",
"checkReports": "Kiểm tra báo cáo để biết chi tiết.",
"errorExecutingCommand": "Lỗi thực thi lệnh: {error}",
"genericError": "❌ Lỗi: {error}",
"errors": {
"errors": "Lỗi:",
"genericError": "❌ Lỗi: {error}",
"initializationFailed": "❌ Khởi tạo không thành công: {error}",
"initializationCancelled": "❌ Việc khởi tạo bị người dùng hủy bỏ.",
"translationKeyNotFound": "Không tìm thấy khóa dịch: {key}",
"sourceDirectoryNotFound": "Không tìm thấy thư mục nguồn: {directory}",
"configLoadingFailed": "Tải cấu hình không thành công",
"invalidSourceDirectory": "Thư mục nguồn không hợp lệ: {directory}",
"securityViolation": "Đã phát hiện vi phạm an ninh",
"authenticationFailed": "Xác thực không thành công",
"sourceEqualsI18nWarn": "⚠️ sourceDir bằng i18nDir ({sourceDir}). Rơi trở lại {fallback} để quét nguồn."
},
"errorGeneratingStatusSummary": "Lỗi tạo tóm tắt trạng thái: {error}",
"errorRunningDebugTool": "Lỗi chạy công cụ debug'{displayName}': {error}",
"errorReadingDebugLogs": "Lỗi đọc nhật ký gỡ lỗi: {error}",
"errorAnalyzingLogFile": "Lỗi phân tích tệp nhật ký: {error}",
"errorAnalyzingTranslationKeys": "Lỗi phân tích khóa dịch: {error}",
"errorAnalyzingTranslationCompleteness": "Lỗi phân tích tính đầy đủ của bản dịch: {error}",
"analyzingTranslationCompleteness": "Phân tích tính đầy đủ của bản dịch trên tất cả các ngôn ngữ...",
"i18nDirectoryNotFound": "⚠️ Không tìm thấy thư mục i18n: {i18nDir}",
"translationCompletenessAnalysisFailed": "⚠️ Phân tích tính đầy đủ của bản dịch không thành công: {error}",
"failedToAnalyzeLanguage": "❌ Không phân tích được ngôn ngữ {language}: {error}",
"errorReadingI18nDirectory": "❌ Lỗi đọc thư mục i18n:",
"languageCompletenessTitle": "📈 DỊCH HOÀN THÀNH THEO NGÔN NGỮ",
"errorAnalyzingTranslationFormat": "Lỗi phân tích định dạng dịch: {error}",
"errorAnalyzingTranslationType": "Lỗi phân tích loại dịch: {error}",
"errorAnalyzingTranslationStructure": "Lỗi phân tích cấu trúc dịch: {error}",
"errorAnalyzingTranslationFormatMismatch": "Lỗi phân tích định dạng bản dịch không khớp: {error}",
"errorAnalyzingTranslationTypeMismatch": "Lỗi phân tích loại bản dịch không khớp: {error}",
"errorAnalyzingTranslationStructureMismatch": "Lỗi phân tích cấu trúc dịch không khớp: {error}",
"errorAnalyzingTranslationSameAsSource": "Lỗi phân tích bản dịch giống với nguồn: {error}",
"title": "Trạng thái",
"nextStep1": "1. Kiểm tra phân tích sử dụng:",
"nextStep2": "2. Xác thực bản dịch:",
"nextStep3": "3. Phân tích tính đầy đủ:",
"nextStep4": "4. Hoàn thiện các bản dịch còn thiếu:",
"nextStep5": "5. Tạo báo cáo tóm tắt:",
"nextStep6": "6. Xem xét và hoàn thiện bản dịch:",
"generating": "Đang tạo báo cáo tóm tắt...",
"review": "Đang xem xét bản dịch...",
"finalizing": "Đang hoàn thiện bản dịch...",
"finalized": "Đã hoàn tất thành công!",
"warnings": "Cảnh báo:",
"completedKeys": "Các phím đã hoàn thành:",
"missingKeys": "Thiếu phím:",
"partialKeys": "Phím một phần:",
"home": "Trang chủ",
"settings": "Cài đặt",
"startingSettings": "🎛️ Bắt đầu Cài đặt CLI...",
"confirm": "Xác nhận",
"errorExiting": "Lỗi khi thoát."
},
"errors": {
"invalidOption": "❌ Tùy chọn không hợp lệ: {option}. Vui lòng thử lại.",
"readlineClosed": "Luồng đầu vào bị đóng; chạy ở chế độ không tương tác.",
"noPackageJson": "Không tìm thấy gói.json. Không thể tự động phát hiện khung i18n.",
"noI18nDir": "Không tìm thấy thư mục i18n trong thư mục gốc của dự án.",
"noI18nConfig": "Không tìm thấy tệp cấu hình i18n trong thư mục gốc của dự án.",
"errorReadingDebugLogs": "Lỗi đọc nhật ký gỡ lỗi: {error}"
},
"scanner": {
"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",
"help_options": {
"source_dir": "Thư mục nguồn để quét các vấn đề i18n",
"output_dir": "Thư mục cho các báo cáo và kết quả quét",
"framework": "Khung mục tiêu (phản ứng, vue, góc cạnh, vanilla)",
"patterns": "Các mẫu biểu thức chính quy tùy chỉnh để phát hiện văn bản",
"exclude": "Các mẫu tệp cần loại trừ khỏi quá trình quét",
"output_report": "Tạo báo cáo quét chi tiết",
"min_length": "Độ dài văn bản tối thiểu cần cân nhắc khi dịch",
"max_length": "Độ dài văn bản tối đa cần cân nhắc khi dịch",
"include_tests": "Bao gồm các tệp kiểm tra trong quá trình quét"
},
"starting": "🔍 Khởi động trình quét văn bản cho khung: {framework}",
"sourceDirectory": "📁 Quét thư mục: {sourceDir}",
"frameworkDetected": "🎯 Khung được phát hiện: {framework}",
"scanningFiles": "📊 Đang quét {fileCount} tập tin...",
"foundTexts": "📝 Đã tìm thấy {textCount} văn bản cần dịch",
"generatingReport": "📊 Tạo báo cáo chi tiết...",
"reportSaved": "💾 Báo cáo quét được lưu vào: {reportPath}",
"noTextsFound": "✅ Không tìm thấy văn bản tiếng Anh được mã hóa cứng",
"scanComplete": "🎉 Quá trình quét hoàn tất thành công!",
"analysisTitle": "🔍 PHÂN TÍCH QUÉT DỊCH",
"fileSummary": "📄 {file}: {count} văn bản được tìm thấy",
"textLocation": "📍 Dòng {line}: {text}",
"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",
"context": "📝 Bối cảnh: {context}",
"severity": "⚠️ Mức độ nghiêm trọng: {severity}",
"recommendation": "💡 Khuyến nghị: {recommendation}",
"welcome": {
"title": "🎯 Chào mừng bạn đến với Trình quét văn bản!",
"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."
},
"frameworkPrompt": {
"title": "🎯 Chọn khung",
"available": "Các khung có sẵn: phản ứng, vue, góc cạnh, vanilla",
"description": "Nhập loại khung (hoặc nhấn Enter để tự động phát hiện):",
"input": "Khung:"
},
"directoryPrompt": {
"title": "📁 Chọn thư mục nguồn",
"current": "Thư mục hiện tại: {dir}",
"description": "Nhập thư mục cần quét (hoặc nhấn Enter cho hiện tại):",
"input": "Thư mục:"
},
"options": {
"includeTests": "Bao gồm các tập tin kiểm tra?",
"excludeDirs": "Các thư mục cần loại trừ (được phân tách bằng dấu phẩy):",
"customPatterns": "Các mẫu tùy chỉnh để quét (regex):"
},
"reportGenerated": "Báo cáo quét được tạo: {path}"
},
"fixer": {
"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",
"starting": "🚀 Bắt đầu sửa bản dịch cho các ngôn ngữ: {languages}",
"sourceDirectory": "📁 Thư mục nguồn: {sourceDir}",
"sourceLanguage": "🔤 Ngôn ngữ nguồn: {sourceLanguage}",
"markers": "🏷️ Các điểm cần khắc phục: {markers}",
"scanningLanguage": "📊 Đang quét {language}...",
"noLanguages": "❌ Không có ngôn ngữ được chỉ định để sửa lỗi.",
"allComplete": "🎉 Tất cả các bản dịch đã hoàn tất!",
"fullReportSaved": "📊 Báo cáo đầy đủ được lưu vào: {reportPath}",
"reviewReport": "Vui lòng xem lại báo cáo trước khi tiếp tục.",
"backupCreated": "💾 Sao lưu được tạo thành công.",
"applyingFixes": "🔄 Áp dụng các bản sửa lỗi...",
"fixingComplete": "✅ Sửa bản dịch hoàn tất!",
"operationCancelled": "❌ Thao tác bị hủy bởi người dùng.",
"analysisTitle": "🔍 PHÂN TÍCH SỬA DỊCH",
"analysisSeparator": "==================================================",
"totalIssues": "Tổng số vấn đề được tìm thấy: {totalIssues}",
"missingTranslations": "Thiếu bản dịch: {missing}",
"placeholderTranslations": "Bản dịch giữ chỗ: {placeholder}",
"noIssues": "✅ Không tìm thấy vấn đề gì Tất cả các bản dịch đã hoàn tất.",
"detailedIssues": "📋 DETAILED ISSUES:",
"detailedSeparator": "--------------------------------------------------",
"filePath": "📄 {file} → {path}",
"missingKey": "❌ THIẾU: {source} → {new}",
"placeholderKey": "⚠️ GIỮ CHỖ: \"{target}\" → \"{new}\"",
"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 đủ.",
"confirmationTitle": "🤔 Bạn có muốn tiếp tục với những bản sửa lỗi này không?",
"confirmationOptions": "Tùy chọn:",
"optionYes": "y - Có, áp dụng mọi cách khắc phục",
"optionNo": "n - Không, hủy thao tác",
"optionShow": "s - Hiển thị các vấn đề chi tiết",
"choicePrompt": "Sự lựa chọn của bạn (y/n/s):",
"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...",
"reportGenerated": "📊 Đã tạo báo cáo trình sửa lỗi: {path}",
"summary": "Tóm tắt trình sửa lỗi:",
"welcome": {
"title": "🎯 Chào mừng bạn đến với Trình sửa lỗi dịch thuật!",
"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."
},
"markerPrompt": {
"title": "🏷️ Định cấu hình điểm đánh dấu giữ chỗ",
"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):",
"currentDefaults": "Dấu hiệu mặc định: {markers}",
"input": "Điểm đánh dấu (hoặc nhấn Enter để mặc định):"
},
"languagePrompt": {
"title": "🌍 Chọn ngôn ngữ để sửa",
"available": "Ngôn ngữ có sẵn: {languages}",
"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ả:",
"input": "Ngôn ngữ:",
"noLanguages": "Không tìm thấy ngôn ngữ nào để khắc phục."
},
"directoryPrompt": {
"title": "📁 Chọn thư mục",
"current": "Thư mục hiện tại: {dir}",
"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):",
"input": "Thư mục:"
},
"backupLocation": "Vị trí dự phòng: {dir}",
"completed": "Sửa xong.",
"creatingBackup": "Tạo bản sao lưu trong {dir}...",
"dryRunMode": "Chế độ chạy khô: {mode}",
"error": "Trình sửa lỗi không thành công: {error}",
"fixing": "sửa chữa {language}...",
"foundLanguages": "Thành lập {count} ngôn ngữ: {languages}",
"languageFixed": "{language}: cố định {fixed} (các) phím, bị bỏ qua {skipped}.",
"running": "Đang chạy trình sửa lỗi dịch...",
"totalFixed": "Tổng số cố định: {count}"
},
"autorun": {
"stepAnalyzeTranslations": "Phân tích bản dịch",
"stepCompletedWithIcon": "✅ Đã hoàn thành: {stepName}",
"stepValidateTranslations": "Xác thực bản dịch",
"stepRunning": "♥️ Bước {stepNumber}/{totalSteps}: {stepName}",
"separator": "==================================================",
"stepFailed": "❌ Thất bại: {stepName}",
"errorLabel": "Lỗi",
"autoRunScriptTitle": "🧪 Quy trình làm việc tự động chạy",
"usageTitle": "Cách sử dụng",
"runAllSteps": "Chạy: nút i18ntk-autorun.js",
"configureSettingsFirst": "Cấu hình: cờ i18ntk-config.json hoặc CLI",
"runSpecificSteps": "Sử dụng --steps=1,3 hoặc --list để hiển thị các bước",
"showHelp": "--trợ giúp để biết thêm thông tin",
"examplesTitle": "Ví dụ",
"configExample": "nút i18ntk-autorun.js --ui-lingu=zh",
"stepsExample1": "nút i18ntk-autorun.js --steps=analyze,validate",
"stepsExample2": "nút i18ntk-autorun.js --list",
"customSettingsConfiguration": "Cài đặt tự động chạy tùy chỉnh",
"availableSteps": "Các bước có sẵn",
"startingAutoRunWorkflow": "🚀 Đang bắt đầu quy trình làm việc Tự động chạy...",
"workflowIncludesSteps": "Quy trình làm việc bao gồm {count} các bước:",
"missingRequiredFile": "Thiếu file cần thiết: {file}",
"workflowStopped": "Quy trình làm việc đã dừng do lỗi.",
"workflowCompleted": "🎉 Quy trình làm việc đã hoàn tất!",
"successfulSteps": "Các bước thành công: {count}",
"failedSteps": "Các bước không thành công: {count}",
"stepInitializeProject": "Khởi tạo dự án",
"stepCheckUsage": "Kiểm tra việc sử dụng khóa",
"stepGenerateSummary": "Tạo báo cáo tóm tắt",
"runInitializationFirst": "Vui lòng chạy khởi tạo trước.",
"initializationCheckPassed": "Kiểm tra khởi tạo đã trôi qua.",
"runningStep": "Bước chạy: {stepName}",
"commandLabel": "Yêu cầu: {command}",
"stepCompletedWithTime": "Bước chân '{stepName}' hoàn thành vào {duration}bệnh đa xơ cứng.",
"stepCompleted": "Bước chân '{stepName}' hoàn thành.",
"stepFailedWithError": "Bước chân '{stepName}' thất bại với lỗi: {error}",
"requiredStepFailed": "Bước bắt buộc không thành công. Đang dừng quy trình làm việc.",
"optionalStepFailed": "Bước tùy chọn không thành công. Tiếp tục quy trình làm việc.",
"stepRequired": "(Yêu cầu)",
"stepOptional": "(Không bắt buộc)",
"startingExecution": "Bắt đầu thực hiện...",
"pressEnterToContinue": "Nhấn Enter để tiếp tục...",
"runningSelectedSteps": "Đang chạy các bước đã chọn...",
"invalidStepNumber": "Số bước không hợp lệ: {stepNum}",
"executionReport": "Báo cáo thực hiện:",
"requiredFailedSteps": "Các bước bắt buộc không thành công: {count}",
"stepDetails": "Chi tiết bước:",
"reportSavedTo": "Báo cáo được lưu vào: {path}",
"overallStatusSuccess": "SUCCESS",
"overallStatusFailed": "FAILED",
"overallStatus": "Tình trạng chung: {status}",
"pressEnterForDefaults": "Nhấn Enter để sử dụng cài đặt mặc định cho bất kỳ lời nhắc nào.",
"sourceDirPrompt": "Nhập thư mục nguồn (mặc định: {default}):",
"sourceLangPrompt": "Nhập ngôn ngữ nguồn (mặc định: {default}):",
"targetLangsPrompt": "Nhập ngôn ngữ đích (được phân tách bằng dấu phẩy, mặc định: {default}):",
"translationMarkerPrompt": "Nhập dấu dịch (mặc định: {default}):",
"outputDirPrompt": "Nhập thư mục đầu ra cho các báo cáo (mặc định: {default}):",
"settingsUpdatedSuccessfully": "Đã cập nhật cài đặt thành công!",
"errorConfiguringSettings": "Lỗi cấu hình cài đặt: {error}",
"configurationComplete": "Cấu hình hoàn tất.",
"runAutoRunCommand": "Bây giờ bạn có thể chạy lệnh tự động chạy.",
"configurationFailed": "Cấu hình không thành công: {error}",
"noValidStepNumbers": "Không có số bước hợp lệ nào được cung cấp.",
"autoRunFailed": "Tự động chạy không thành công: {error}",
"stepCompleteTranslations": "Bản dịch hoàn chỉnh",
"stepAnalyzeSizing": "Phân tích kích thước",
"stepCompletedIcon": "✅",
"stepRunningWithNumber": "[{stepNumber}/{totalSteps}] Bước chân '{stepName}' đang chạy...",
"stepFailedIcon": "❌",
"translationLoadWarning": "Cảnh báo: Không thể tải {lang} bản dịch",
"configReadError": "Lỗi đọc {file}"
},
"analyze": {
"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",
"source_directory": "📁 Thư mục nguồn: {sourceDir}",
"i18n_directory": "🌐 Danh mục I18n: {i18nDir}",
"loading_translation_files": "📋 Đang tải file dịch...",
"sourceDirectoryLabel": "📁 Thư mục nguồn: {sourceDir}",
"sourceLanguageLabel": "🌍 Ngôn ngữ nguồn: {sourceLanguage}",
"strictModeLabel": "⚙️ Chế độ nghiêm ngặt: {mode}",
"found_translation_files_count": "✅ Đã tìm thấy {count} tập tin dịch",
"analyzing_translations": "🔍 Phân tích bản dịch...",
"analysis_completed_successfully": "🎉 Phân tích đã hoàn tất thành công!",
"analysis_results": "📊 ANALYSIS RESULTS",
"language_analysis_stats": "{language}: {translatedKeys}/{totalKeys} ({percentage}% dịch)",
"sample_missing_keys": "Mẫu phím bị thiếu:",
"missing_key": "- {key}",
"and_more_missing": "...Và {count} hơn.",
"sample_unused_keys": "Ví dụ về các khóa không được sử dụng:",
"unused_key": "- {key}",
"and_more_unused": "...Và {count} hơn.",
"recommendations": "📋 KHUYẾN NGHỊ",
"add_missing_translations": "💡 Thêm các bản dịch còn thiếu để cải thiện mức độ phù hợp.",
"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ẽ.",
"next_steps": "📋 NEXT STEPS",
"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.",
"run_with_output_report": "2. Chạy --output-report để biết báo cáo chi tiết.",
"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.",
"rerun_analysis": "4. Chạy lại phân tích để xác minh các cải tiến.",
"analysis_summary": "📊 ANALYSIS SUMMARY",
"source_files_scanned": "Các tập tin nguồn được quét: {fileCount}",
"translation_files_checked": "Các tập tin dịch đã được kiểm tra: {translationFileCount}",
"total_keys": "Tổng số phím: {totalKeys}",
"translated_keys": "Các phím đã dịch: {translatedKeys}",
"missing_keys": "Thiếu phím: {missingKeys}",
"unused_keys": "Các phím chưa sử dụng: {unusedKeys}",
"translation_coverage": "Phạm vi dịch thuật: {coverage}%",
"analysis_passed_for_language": "✅ Phân tích được thông qua {language}",
"analysis_failed_for_language": "❌ Phân tích thất bại {language} ({missingKeys} mất tích, {unusedKeys} chưa sử dụng)",
"starting": "🔍 Bắt đầu phân tích bản dịch...",
"foundLanguages": "📋 Đã tìm thấy {count} ngôn ngữ để phân tích: {languages}",
"analyzing": "🔄 Phân tích {language}...",
"reportTitle": "📊 BÁO CÁO PHÂN TÍCH DỊCH",
"generated": "Đã tạo: {timestamp}",
"status": "Trạng thái: {translated}/{total} phím ({percentage}% dịch)",
"filesAnalyzed": "Các tập tin được phân tích: {analyzed}/{total}",
"keysNeedingTranslation": "Các phím cần dịch: {count}",
"fileBreakdown": "📋 PHÂN TÍCH TẬP TIN",
"error": "Lỗi",
"completed": "✅ Đã hoàn thành phân tích cho {language}",
"progress": "📊 Tiến độ chung: {translated}/{total} ngôn ngữ được xử lý",
"reportSaved": "Đã lưu báo cáo: {reportPath}",
"summary": "📊 ANALYSIS SUMMARY",
"finished": "✅ Phân tích hoàn tất thành công!",
"statusFileMissing": "❌ Thiếu file dịch",
"sourceKeys": "📊 Chìa khóa nguồn: {count}",
"translation": "📊 Bản dịch: {translated}/{total} ({percentage}%)",
"structure": "🗂️ Cấu trúc: {status}",
"consistent": "Nhất quán",
"inconsistent": "Không nhất quán",
"missingKeys": "Thiếu phím: {count}",
"extraKeys": "Phím bổ sung: {count}",
"issues": "⚠️ Các vấn đề được tìm thấy: {count}",
"issueType": {
"not_translated": "Không được dịch: {count}",
"empty_value": "Giá trị trống: {count}",
"partial_translation": "Bản dịch một phần: {count}",
"format_mismatch": "Định dạng không khớp: {count}",
"type_mismatch": "Loại không khớp: {count}",
"structure_mismatch": "Cấu trúc không phù hợp: {count}",
"same_as_source": "Tương tự như nguồn: {count}"
},
"keysToTranslate": "📋 PHÍM ĐỂ DỊCH",
"key": "Chìa khóa",
"english": "Tiếng Anh",
"needsTranslation": "CẦN DỊCH",
"andMoreKeys": "...Và {count} nhiều phím hơn.",
"noLanguages": "⚠️ Không tìm thấy ngôn ngữ mục tiêu.",
"languageStats": "{language}: {percentage}% hoàn thành ({translated}/{total} phím)",
"invalidReportFilePath": "Đường dẫn tệp báo cáo không hợp lệ",
"failedToWriteReportFile": "Không thể ghi tệp báo cáo một cách an toàn"
},
"complete": {
"configLoadedSuccessfully": "Đã tải cấu hình thành công",
"configLoadingFailed": "Tải cấu hình không thành công",
"sourceLanguageNotFound": "Không tìm thấy thư mục ngôn ngữ nguồn: {sourceLanguage}",
"couldNotParseTarget": "Không thể phân tích tệp mục tiêu: {file}",
"couldNotParseSource": "Không thể phân tích tệp nguồn: {file}",
"reportGenerated": "Báo cáo được tạo: {path}",
"generateReportPrompt": "Bạn có muốn tạo một báo cáo không?",
"title": "🌍 HOÀN THÀNH DỊCH I18NTK",
"separator": "============================================================",
"sourceDir": "📁 Thư mục nguồn: {sourceDir}",
"sourceLanguage": "🌐 Ngôn ngữ nguồn: {sourceLanguage}",
"dryRunMode": "🧪 Chế độ chạy khô - sẽ không có thay đổi nào được thực hiện",
"languages": "🌍 Ngôn ngữ có sẵn: {languages}",
"addingMissingKeys": "➕ Thêm khóa bị thiếu vào file dịch...",
"processing": "🔄 Đang xử lý {language}...",
"addedKeys": "✅ Đã thêm {count} phím bị thiếu",
"noChangesNeeded": "✅ Không cần thay đổi gì {language}",
"summaryTitle": "📊 TÓM TẮT HOÀN THÀNH",
"totalChanges": "📝 Tổng số thay đổi: {totalChanges}",
"languagesProcessed": "🌍 Ngôn ngữ được xử lý: {languagesProcessed}",
"missingKeysAdded": "➕ Thiếu phím bổ sung: {missingKeysAdded}",
"nextStepsTitle": "📋 NEXT STEPS",
"nextStep1": "1. Chạy phân tích mức sử dụng:",
"nextStep2": "nút i18ntk-usage.js --output-report",
"nextStep3": "2. Xác thực bản dịch:",
"nextStep4": "nút i18ntk-validate.js",
"nextStep5": "3. Phân tích mẫu:",
"nextStep6": "nút i18ntk-analyze.js",
"allKeysAvailable": "🎉 Tất cả các khóa dịch hiện đã có sẵn!",
"runWithoutDryRun": "💡 Chạy không cần --dry-run để áp dụng các thay đổi",
"deletingOldReport": "🗑️ Đang xóa báo cáo cũ...",
"generatingFreshAnalysis": "📊 Tạo phân tích sử dụng mới...",
"couldNotGenerate": "❌ Không thể tạo phân tích sử dụng",
"reportNotFound": "📋 Không tìm thấy báo cáo sử dụng. Sử dụng các phím chung...",
"foundMissingKeys": "📋 Đã tìm thấy {count} khóa bị thiếu trong phân tích sử dụng",
"couldNotParse": "❌ Không thể phân tích báo cáo sử dụng. Sử dụng các phím chung...",
"errorDuringCompletion": "❌ Lỗi khi hoàn thành: {error}",
"fatalError": "❌Lỗi nghiêm trọng: {error}",
"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"
},
"sizing": {
"separator": "================================================================================",
"lineSeparator": "--------------------------------------------------------------------------------",
"analysisStats": "{stats}",
"sourceDirectoryLabel": "📁 Thư mục nguồn: {sourceDir}",
"sourceLanguageLabel": "🌍 Ngôn ngữ nguồn: {sourceLanguage}",
"strictModeLabel": "⚙️ Chế độ nghiêm ngặt: {mode}",
"invalidSourceDirectoryError": "Đường dẫn thư mục nguồn không hợp lệ: {sourceDir}",
"sourceDirectoryNotFoundError": "Không tìm thấy thư mục nguồn: {sourceDir}",
"invalidOutputDirectoryError": "Đường dẫn thư mục đầu ra không hợp lệ: {outputDir}",
"invalidReportFileError": "Đường dẫn tệp báo cáo không hợp lệ",
"problematic_keys": "Các phím có vấn đề: {problematicKeys}",
"problematicKeysLabel": "Các phím có vấn đề: {problematicKeys}",
"long_translations": "Bản dịch dài: {longTranslations}",
"failedToSaveReportError": "Không thể lưu báo cáo một cách an toàn",
"invalidCsvFileError": "Đường dẫn tệp CSV không hợp lệ",
"failedToSaveCsvError": "Không thể lưu báo cáo CSV một cách an toàn",
"fatalError": "❌ Phân tích kích thước không thành công: {error}",
"starting_i18n_sizing_analysis": "Đang bắt đầu phân tích kích thước i18n...",
"source_directory": "Thư mục nguồn: {sourceDir}",
"found_languages": "Ngôn ngữ được tìm thấy: {languages}",
"analyzing_file_sizes": "Đang phân tích kích thước tệp...",
"analyzing_translation_content": "Phân tích nội dung dịch...",
"generating_size_comparisons": "Đang tạo so sánh kích thước...",
"no_languages_found_for_comparison": "Không tìm thấy ngôn ngữ nào để so sánh",
"sizing_analysis_results": "Kết quả phân tích kích thước I18n",
"file_sizes_title": "Kích thước tệp",
"file_sizes_header": "Kích thước ngôn ngữ(KB) Dòng ký tự",
"file_size_row": "{lang} {sizeKB} {lines} {characters}",
"language_statistics_title": "Thống kê ngôn ngữ",
"language_stats_header": "Ngôn ngữ Phím Ký tự Độ dài trung bình Độ dài tối đa Trống Dài",
"language_stats_row": "{lang} {totalKeys} {totalCharacters} {averageKeyLength} {maxKeyLength} {emptyKeys} {longKeys}",
"size_variations_title": "Biến thể kích thước",
"size_variations_header": "Ngôn ngữ Char Diff % Diff có vấn đề",
"size_variation_row": "{lang} {characterDifference} {percentageDifference}% {problematic}",
"problematic_yes": "Đúng",
"problematic_no": "KHÔNG",
"recommendations_title": "Khuyến nghị",
"recommendation_item": "{index}. {recommendation}",
"problematic_key_detail": "{index}. Chìa khóa: '{key}' - Các biến thể: {variations}",
"generating_detailed_report": "Đang tạo báo cáo chi tiết...",
"keysHaveSignificantSizeVariations": "phím có sự thay đổi kích thước đáng kể",
"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",
"longer": "dài hơn",
"shorter": "ngắn hơn",
"review_translations": "Xem xét xem xét {lang} bản dịch - chúng là {percentageDifference}% {comparison} hơn đường cơ sở",
"report_saved_to": "Báo cáo được lưu vào: {reportPath}",
"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ở",
"csv_report_saved_to": "Báo cáo CSV được lưu vào: {csvPath}",
"human_report_saved": "Đã lưu báo cáo có thể đọc được: {reportPath}",
"folder_summary_title": "Tóm tắt thư mục",
"folder_summary_table_header": "Kích thước ngôn ngữ (KB) Phím Độ dài trung bình Tổng ký tự",
"folder_summary_row": "{lang} {sizeKB} {totalKeys} {avgLength} {totalChars}",
"language_comparison_title": "So sánh ngôn ngữ",
"language_comparison_row": "{lang}: {diff} ký tự ({percent}%) {status}",
"summary_stats": "📊 Tóm tắt: {totalLanguages} ngôn ngữ, {totalKeys} phím - Báo cáo được lưu vào {reportPath}",
"detailedKeysDescription": "Hiển thị phân tích cấp khóa chi tiết trong bảng điều khiển",
"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 đủ",
"no_translation_files_found": "Không tìm thấy tệp dịch",
"analysis_completed": "Phân tích hoàn thành vào {duration}bệnh đa xơ cứng",
"analysis_failed": "Phân tích không thành công: {errorMessage}",
"starting_analysis": "Bắt đầu phân tích...",
"found_files": "Thành lập {count} tập tin",
"failed_to_parse_language_error": "Không thể phân tích cú pháp {language} bản dịch: {errorMessage}",
"recommendations": {
"keys_have_significant_size_variations": "phím có sự thay đổi kích thước đáng kể",
"consider_reviewing_translations": "Xem xét xem xét {lang} bản dịch - chúng là {percentageDifference}% {comparison} hơn đường cơ sở",
"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"
},
"detailed_key_analysis_title": "Phân tích khóa chi tiết",
"key_analysis_detail": "{lang}: {length} ký tự ({status}) - {translation}",
"key_analysis_header": "Chìa khóa: {key}",
"status_empty": "trống",
"status_long": "dài",
"status_ok": "Được rồi"
},
"usage": {
"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",
"source_directory_thissourcedir": "📁 Thư mục nguồn: {sourceDir}",
"translationCompletenessTitle": "🌍 Bản dịch hoàn chỉnh:",
"i18n_directory_thisi18ndir": "🌐 Danh mục I18n: {i18nDir}",
"failed_to_parse_filename_error": "⚠️ Không phân tích được {fileName}: {errorMessage}",
"analyzing_source_files": "🔍 Phân tích file nguồn...",
"found_files_in_source": "📂 Đã tìm thấy {numFiles} tập tin trong thư mục nguồn",
"found_thisusedkeyssize_unique_": "🎯 Đã tìm thấy {usedKeysSize} phím được sử dụng độc đáo",
"total_key_usages_totalkeysfoun": "📊 Tổng số công dụng chính: {totalKeysFound}",
"loading_available_translation_": "📋 Đang tải các khóa dịch có sẵn...",
"found_thisavailablekeyssize_av": "✅ Đã tìm thấy {availableKeysSize} phím có sẵn",
"foundTranslationFiles": "✅ Đã tìm thấy {count} tập tin dịch",
"errorReadingI18nDirectory": "⚠️ Lỗi đọc thư mục i18n: {error}",
"pressEnterToReturnToMenu": "📝 Nhấn Enter để quay lại menu chính...",
"notTranslatedKeysTotal": "⚠️ Phím chưa dịch: {total}",
"noSourceFilesFound": "⚠️ Không tìm thấy tệp nguồn trong thư mục nguồn.",
"reviewNotTranslatedKeys": "💡 Xem lại các key chưa dịch",
"analysisCompletedSuccessfully": "🎉 Phân tích đã hoàn tất thành công!",
"detectedSourceDirectory": "Thư mục nguồn được phát hiện: {sourceDir}",
"detectedI18nDirectory": "Đã phát hiện thư mục i18n: {i18nDir}",
"fileInfo": "📄 {namespace}: {keys} phím",
"failedToAnalyzeUsage": "❌ Không phân tích được cách sử dụng: {error}",
"failedToAnalyzeFile": "❌ Phân tích file không thành công: {error}",
"failedToExtractKeys": "❌ Không thể trích xuất khóa từ {filePath}: {error}",
"analysisFailedError": "❌ Phân tích thất bại: {error}",
"analyzerInitialized": "Đã khởi tạo trình phân tích",
"analyzerInitFailed": "Khởi tạo trình phân tích không thành công: {error}",
"argsParsed": "Đối số được phân tích cú pháp",
"processedFiles": "Đã xử lý {processedFiles} của {totalFiles} tập tin.",
"argsParseFailed": "Phân tích đối số không thành công: {error}",
"translationDiscoveryError": "Lỗi khám phá bản dịch: {error}",
"fileTraversalError": "Lỗi truyền tải tệp: {error}",
"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.",
"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.",
"usageAnalysisFailed": "⚠️ Phân tích cách sử dụng không thành công: {error}",
"translationFileParseError": "⚠️ Lỗi phân tích file dịch: {error}",
"translationKeysLoadError": "⚠️ Lỗi tải khóa dịch: {error}",
"languageCompletenessStats": "🌐 {language}: {translated}/{total} ({completeness}% dịch)",
"missingKeysCount": "⚠️ Thiếu chìa khóa: {count}",
"analyzingTranslationCompleteness": "Đang phân tích mức độ hoàn chỉnh của bản dịch...",
"unusedKeysCount": "Các phím chưa sử dụng: {count}",
"usedKeysCount": "Các phím đã sử dụng: {count}",
"availableKeysCount": "Các phím có sẵn: {count}",
"analysisResults": "Kết quả phân tích:",
"i18nDirectoryNotFound": "⚠️ Không tìm thấy thư mục I18n. Vui lòng kiểm tra đường dẫn.",
"sourceDirectoryNotFound": "⚠️ Không tìm thấy thư mục nguồn: {dir}",
"checkUsage": {
"title": "🔍 I18NTK USAGE ANALYSIS",
"analyzing_source_files": "🔍 Phân tích file nguồn...",
"source_directory_thissourcedir": "📁 Thư mục nguồn: {sourceDir}",
"i18n_directory_thisi18ndir": "📁 thư mục i18n: {i18nDir}",
"found_files_in_source": "✅ Đã tìm thấy {numFiles} tập tin trong thư mục nguồn",
"no_source_files_found": "⚠️ Không tìm thấy tệp nguồn trong thư mục được chỉ định",
"processedFiles": "📊 Đã xử lý {processedFiles} của {totalFiles} tập tin",
"failedToProcessFile": "❌ Xử lý không thành công",
"found_thisusedkeyssize_unique_": "🔍 Đã tìm thấy {usedKeysSize} phím được sử dụng độc đáo",
"total_key_usages_totalkeysfoun": "📊 Tổng số công dụng chính: {totalKeysFound}",
"loading_available_translation_": "📂 Đang tải các khóa dịch có sẵn...",
"found_thisavailablekeyssize_av": "✅ Đã tìm thấy {availableKeysSize} phím có sẵn",
"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...",
"usage_analysis_results": "📊 USAGE ANALYSIS RESULTS",
"source_files_scanned_thisfileu": "📁 Tệp nguồn được quét: {fileUsageSize}",
"available_translation_keys_thi": "✅ Các phím dịch có sẵn: {availableKeysSize}",
"used_translation_keys_thisused": "🔍 Phím dịch đã sử dụng: {usedKeysSize}",
"dynamic_keys_detected_dynamick": "⚡ Đã phát hiện thấy phím động: {dynamicKeysLength}",
"unused_keys_unusedkeyslength": "🗑️ Phím chưa sử dụng: {unusedKeysLength}",
"missing_keys_missingkeyslength": "❌ Thiếu chìa khóa: {missingKeysLength}",
"translation_completeness_title": "📈 BẢN DỊCH HOÀN THÀNH",
"language_completeness_stats": "{language}: {translated}/{total} phím ({percentage}%)",
"n_sample_unused_keys": "🗑️ MẪU PHÍM CHƯA SỬ DỤNG (5 đầu tiên):",
"key": "🔑 {key}",
"and_unusedkeyslength_5_more": "... Và {count} nhiều phím không được sử dụng hơn",
"n_sample_missing_keys": "❌ MẪU PHÍM THIẾU (5 đầu tiên):",
"and_missingkeyslength_5_more": "... Và {count} còn thiếu nhiều chìa khóa hơn",
"n_generating_detailed_report": "📊 Tạo báo cáo chi tiết...",
"report_saved_reportpath": "📄 Đã lưu báo cáo: {reportPath}",
"n_recommendations": "💡 KHUYẾN NGHỊ:",
"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",
"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",
"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ệ)",
"all_translation_keys_are_prope": "✅ Tất cả các phím dịch đều được sử dụng đúng cách!",
"n_next_steps": "🎯 NEXT STEPS:",
"2_check_the_detailed_report_fo": "2. Kiểm tra báo cáo chi tiết các vấn đề cụ thể",
"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",
"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.",
"2_run_with_outputreport_for_de": "2. Chạy --output-report để biết báo cáo chi tiết.",
"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.",
"4_rerun_analysis_to_verify_imp": "4. Chạy lại phân tích để xác minh các cải tiến.",
"noSourceFilesFound": "Không tìm thấy tập tin nguồn để phân tích.",
"i18nDirectoryNotFound": "Không tìm thấy thư mục I18n: {i18nDir}",
"noTranslationLanguagesFound": "Không tìm thấy ngôn ngữ dịch.",
"failedToAnalyzeFile": "Không thể phân tích tập tin {filePath}: {error}",
"failedToAnalyzeLanguage": "Không thể phân tích ngôn ngữ {language}: {error}",
"translationCompletenessAnalysisFailed": "Phân tích tính hoàn chỉnh của bản dịch không thành công: {error}",
"n": "\\N"
},
"complete": {
"configLoadedSuccessfully": "Đã tải cấu hình thành công",
"configLoadingFailed": "Tải cấu hình không thành công",
"title": "🌍 HOÀN THÀNH DỊCH I18NTK",
"separator": "============================================================",
"sourceDir": "📁 Thư mục nguồn: {sourceDir}",
"sourceLanguage": "🌐 Ngôn ngữ nguồn: {sourceLanguage}",
"dryRunMode": "🧪 Chế độ chạy khô - sẽ không có thay đổi nào được thực hiện",
"languages": "🌍 Ngôn ngữ có sẵn: {languages}",
"addingMissingKeys": "➕ Thêm khóa bị thiếu vào file dịch...",
"processing": "🔄 Đang xử lý {language}...",
"addedKeys": "✅ Đã thêm {count} phím bị thiếu",
"changeDetails": "📝 {file}: {key}",
"andMore": "...Và {count} hơn",
"noChangesNeeded": "✅ Không cần thay đổi gì {language}",
"summaryTitle": "📊 TÓM TẮT HOÀN THÀNH",
"totalChanges": "📝 Tổng số thay đổi: {totalChanges}",
"languagesProcessed": "🌍 Ngôn ngữ được xử lý: {languagesProcessed}",
"missingKeysAdded": "➕ Thiếu phím bổ sung: {missingKeysAdded}",
"nextStepsTitle": "📋 NEXT STEPS",
"nextStep1": "1. Chạy phân tích mức sử dụng:",
"nextStep2": "nút i18ntk-usage.js --output-report",
"nextStep3": "2. Xác thực bản dịch:",
"nextStep4": "nút i18ntk-validate.js",
"nextStep5": "3. Phân tích mẫu:",
"nextStep6": "nút i18ntk-analyze.js",
"allKeysAvailable": "🎉 Tất cả các khóa dịch hiện đã có sẵn!",
"runWithoutDryRun": "💡 Chạy không cần --dry-run để áp dụng các thay đổi",
"deletingOldReport": "🗑️ Đang xóa báo cáo cũ...",
"generatingFreshAnalysis": "📊 Tạo phân tích sử dụng mới...",
"couldNotGenerate": "❌ Không thể tạo phân tích sử dụng",
"reportNotFound": "📋 Không tìm thấy báo cáo sử dụng. Sử dụng các phím chung...",
"foundMissingKeys": "📋 Đã tìm thấy {count} khóa bị thiếu trong phân tích sử dụng",
"couldNotParse": "❌ Không thể phân tích báo cáo sử dụng. Sử dụng các phím chung..."
},
"noTranslationLanguagesFound": "Không tìm thấy ngôn ngữ dịch",
"failedToAnalyzeLanguage": "Không thể phân tích ngôn ngữ",
"translationCompletenessAnalysisFailed": "Phân tích tính hoàn chỉnh của bản dịch không thành công",
"failedToProcessFile": "Không thể xử lý tệp:",
"failedToSaveReport": "Không lưu được báo cáo sử dụng: {error}",
"i18nDirectoryDoesNotExist": "Thư mục I18n không tồn tại: {dir}",
"reportSavedTo": "Báo cáo sử dụng được lưu vào: {reportPath}",
"sourceDirectoryDoesNotExist": "Thư mục nguồn không tồn tại: {dir}",
"noSourceDirectoryConfigured": "(không có cấu hình)"
},
"validate": {
"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",
"title": "🔍 Trình xác thực bản dịch I18n",
"message": "Đang bắt đầu quá trình xác thực...",
"sourceDirectory": "📁 Thư mục nguồn: {dir}",
"sourceLanguage": "🌍 Ngôn ngữ nguồn: {sourceLanguage}",
"strictMode": "⚙️ Chế độ nghiêm ngặt: {mode}",
"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\".",
"validatingLanguages": "🌍 Xác thực ngôn ngữ: {langs}",
"validatingLanguage": "🔍 Xác thực ngôn ngữ: {lang}",
"filesCount": "📄 Tệp: {count}",
"keysCount": "🔑 Chìa khóa: {count}",
"missingFilesCount": "📁 Thiếu tập tin: {count}",
"syntaxErrorsCount": "❌ Lỗi cú pháp: {count}",
"translationPercentage": "🎯 Bản dịch: {percentage}% ({translated}/{total} phím)",
"validationSummary": "📊 TÓM TẮT XÁC NHẬN",
"validation_failed": "❌ Xác thực không thành công: {error}",
"totalErrors": "❌ Tổng số lỗi: {count}",
"totalWarnings": "⚠️ Tổng số cảnh báo: {count}",
"errorsSection": "❌ ERRORS",
"warningsSection": "⚠️ WARNINGS",
"recommendationsSection": "💡 KHUYẾN NGHỊ",
"fixErrorsFirst": "1. Sửa tất cả các lỗi trước",
"resolveMissingFilesAndSyntaxErrors": "1. Giải quyết thiếu file và lỗi cú pháp",
"fixStructuralInconsistencies": "2. Khắc phục sự không nhất quán về cấu trúc",
"completeMissingTranslations": "3. Hoàn thiện các bản dịch còn thiếu",
"rerunValidation": "4. Chạy lại xác thực để xác minh các bản sửa lỗi",
"addressWarnings": "Giải quyết các cảnh báo để cải thiện chất lượng",
"reviewWarnings": "Xem lại cảnh báo và khắc phục khi thích hợp",
"considerRunningWithStrict": "2. Cân nhắc việc chạy với cờ --strict để xác thực chặt chẽ hơn",
"allValidationsPassed": "🎉 Tất cả các xác nhận đã được thông qua!",
"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",
"deletedOldReport": "🗑️ Đã xóa báo cáo xác thực cũ",
"sourceDir": "📁 Thư mục nguồn: {sourceDir}",
"i18nDir": "🌐 Danh mục I18n: {i18nDir}",
"loadingTranslationFiles": "📋 Đang tải file dịch...",
"foundTranslationFilesCount": "✅ Đã tìm thấy {count} tập tin dịch",
"analyzingTranslations": "🔍 Phân tích bản dịch...",
"validationCompletedSuccessfully": "🎉 Xác thực hoàn tất thành công!",
"validationErrorsFound": "⚠️ Đã tìm thấy lỗi xác thực: {count}",
"validationWarningsFound": "⚠️ Đã tìm thấy cảnh báo xác thực: {count}",
"validationPassed": "✅ Quá trình xác thực được thông qua không có lỗi",
"validationFailed": "Xác thực không thành công: {error}",
"startingValidationProcess": "🔍 Bắt đầu quá trình xác nhận...",
"validationProcessCompletedSuccessfully": "✅ Quá trình xác thực hoàn tất thành công",
"stackTrace": "Dấu vết ngăn xếp: {stack}",
"authenticationFailed": "❌ Xác thực không thành công. Truy cập bị từ chối.",
"fatalValidationError": "❌ Lỗi xác thực nghiêm trọng: {error}",
"configAccess": "Truy cập cấu hình để xác thực",
"configValidated": "Cấu hình được xác thực thành công",
"configError": "Lỗi cấu hình: {error}",
"validatorInit": "Đang khởi tạo trình xác nhận I18n",
"validatorInitialized": "Trình xác thực I18n đã được khởi tạo thành công",
"validatorInitError": "Lỗi khởi tạo trình xác thực: {error}",
"argsParsing": "Phân tích đối số dòng lệnh",
"argsParsed": "Đối số dòng lệnh được phân tích thành công",
"argsParseError": "Lỗi phân tích đối số: {error}",
"languagesScan": "Quét các ngôn ngữ có sẵn",
"languagesFound": "Thành lập {count} ngôn ngữ",
"languagesScanError": "Lỗi quét ngôn ngữ: {error}",
"filesScan": "Thành lập {count} tập tin trong {language}",
"filesScanError": "Lỗi quét tập tin: {error}",
"jsonValidated": "Cú pháp JSON được xác thực: {filePath}",
"jsonValidationError": "Lỗi xác thực JSON: {error}",
"languageValidation": "Xác thực ngôn ngữ: {language}",
"languageValidationError": "Lỗi xác thực ngôn ngữ: {error}",
"fileDeleted": "Đã xóa tệp",
"runStarted": "Bắt đầu chạy xác thực",
"runCompleted": "Quá trình xác thực đã hoàn tất thành công",
"runError": "Chạy xác thực không thành công: {error}",
"scriptExecution": "Thực thi tập lệnh",
"validationCompleted": "Xác thực hoàn tất",
"validationError": "Lỗi xác thực: {error}",
"separator": "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━",
"languageHeader": "🌐 Ngôn ngữ: {language}",
"validationResults": "📊 Kết quả xác thực",
"noErrors": "✅ Không tìm thấy lỗi",
"noWarnings": "✅ Không tìm thấy cảnh báo",
"summaryHeader": "📋 OVERALL SUMMARY",
"progressIndicator": "⏳ Đang xử lý...",
"completedIndicator": "✅ Đã hoàn thành",
"errorIndicator": "❌ Lỗi",
"warningIndicator": "⚠️ Cảnh báo",
"infoIndicator": "ℹ️ Thông tin",
"sourceDirNotConfigured": "Thư mục nguồn chưa được cấu hình",
"sourceLanguageNotConfigured": "Ngôn ngữ nguồn chưa được định cấu hình",
"translationFunctionNotInitialized": "Chức năng dịch không được khởi tạo đúng cách",
"sourceLanguageDirectoryNotFound": "Không tìm thấy thư mục ngôn ngữ nguồn",
"specifiedLanguageNotFound": "Không tìm thấy ngôn ngữ được chỉ định",
"noJsonFilesFound": "Không tìm thấy tệp JSON nào trong thư mục nguồn: {sourceDir}",
"i18nDirectoryNotFound": "Không tìm thấy thư mục I18n: {i18nDir}",
"invalidDirectoryPaths": "Đã phát hiện đường dẫn thư mục không hợp lệ",
"invalidSampleFilePath": "Đường dẫn tệp mẫu không hợp lệ",
"failedToCreateSampleTranslationFile": "Không tạo được tệp dịch mẫu",
"invalidFilePathDetected": "Đã phát hiện đường dẫn tệp không hợp lệ",
"failedToWriteFile": "Không thể ghi tập tin: {filePath}",
"invalidSourceDirectory": "Thư mục nguồn không hợp lệ: {sourceDir}",
"invalidSourceLanguageDirectory": "Thư mục ngôn ngữ nguồn không hợp lệ: {sourceDir}"
},
"adminCli": {
"setupPinProtectionTitle": "🔐 Thiết lập Bảo vệ mã PIN của quản trị viên",
"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ị.",
"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?",
"setupCancelled": "Đã hủy thiết lập bảo vệ mã PIN của quản trị viên.",
"enterPinPrompt": "Nhập mã PIN gồm 4-6 chữ số:",
"pinFormatError": "❌ PIN phải có 4-6 chữ số. Vui lòng thử lại.",
"confirmPinPrompt": "Xác nhận mã PIN:",
"pinMismatchError": "❌ Mã PIN không khớp. Vui lòng thử lại.",
"pinProtectionEnabledSuccess": "✅ Bảo vệ mã PIN của quản trị viên đã được kích hoạt thành công!",
"pinRecoveryWarning": "⚠️ Hãy nhớ mã PIN của bạn - không thể khôi phục được nếu bị mất.",
"setupPinProtectionFailed": "❌ Không thiết lập được bảo vệ mã PIN quản trị viên.",
"errorSettingUpPin": "❌ Lỗi cài đặt mã PIN quản trị viên: {message}",
"authRequiredForOperation": "🔐 Yêu cầu xác thực quản trị viên cho: {operation}",
"invalidPinFormat": "❌ Định dạng mã PIN không hợp lệ. Mã PIN phải có 4-6 chữ số.",
"authenticationSuccess": "✅ Xác thực thành công!",
"invalidPinAttemptsRemaining": "❌ Mã PIN không hợp lệ. {remaining} những nỗ lực còn lại.",
"authenticationFailedAccessDenied": "❌ Xác thực không thành công. Truy cập bị từ chối.",
"authenticationError": "❌ Lỗi xác thực: {message}",
"pinProtectionNotEnabled": "Tính năng bảo vệ mã PIN của quản trị viên hiện chưa được bật.",
"disablingPinProtectionTitle": "🔓 Tắt tính năng bảo vệ mã PIN của quản trị viên",
"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?",
"operationCancelled": "Hoạt động bị hủy bỏ.",
"pinProtectionDisabledSuccess": "✅ Bảo vệ mã PIN của quản trị viên bị vô hiệu hóa.",
"disablePinProtectionFailed": "❌ Không thể tắt tính năng bảo vệ mã PIN của quản trị viên.",
"errorDisablingPinProtection": "❌ Lỗi vô hiệu hóa bảo vệ quản trị viên: {message}",
"adminProtectionStatusTitle": "🔐 Trạng thái bảo vệ của quản trị viên",
"statusEnabled": "Trạng thái: ✅ ĐÃ BẬT",
"protectionDetails": "Bảo vệ: Cần có mã PIN 4-6 chữ số cho hoạt động của quản trị viên",
"lockoutDetails": "Khóa máy: 3 lần thử không thành công = khóa 15 phút",
"statusDisabled": "Tình trạng: ❌ TẮT",
"noAuthRequired": "Bảo vệ: Không cần xác thực",