UNPKG

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
{ "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",