i18ntk 4.1.0 → 4.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +64 -5
- package/README.md +73 -17
- package/SECURITY.md +10 -4
- package/main/i18ntk-analyze.js +10 -20
- package/main/i18ntk-backup.js +106 -44
- package/main/i18ntk-init.js +153 -157
- package/main/i18ntk-setup.js +36 -13
- package/main/i18ntk-sizing.js +44 -27
- package/main/i18ntk-translate.js +311 -41
- package/main/i18ntk-usage.js +272 -103
- package/main/i18ntk-validate.js +38 -31
- package/main/manage/commands/AnalyzeCommand.js +7 -17
- package/main/manage/commands/CommandRouter.js +6 -6
- package/main/manage/commands/SizingCommand.js +5 -2
- package/main/manage/commands/TranslateCommand.js +73 -56
- package/main/manage/commands/ValidateCommand.js +58 -26
- package/main/manage/index.js +11 -42
- package/main/manage/managers/InteractiveMenu.js +11 -40
- package/main/manage/services/InitService.js +114 -118
- package/main/manage/services/UsageService.js +247 -96
- package/package.json +19 -14
- package/runtime/enhanced.d.ts +5 -5
- package/runtime/enhanced.js +49 -25
- package/runtime/i18ntk.d.ts +30 -7
- package/runtime/index.d.ts +48 -19
- package/runtime/index.js +175 -90
- package/settings/settings-cli.js +115 -38
- package/settings/settings-manager.js +24 -6
- package/ui-locales/de.json +192 -11
- package/ui-locales/en.json +182 -8
- package/ui-locales/es.json +193 -12
- package/ui-locales/fr.json +189 -8
- package/ui-locales/ja.json +190 -8
- package/ui-locales/ru.json +191 -9
- package/ui-locales/zh.json +194 -9
- package/utils/cli-helper.js +8 -12
- package/utils/config-helper.js +1 -1
- package/utils/config-manager.js +8 -6
- package/utils/localized-confirm.js +55 -0
- package/utils/menu-layout.js +41 -0
- package/utils/report-writer.js +110 -0
- package/utils/security.js +15 -22
- package/utils/translate/api.js +31 -3
- package/utils/translate/placeholder.js +42 -1
- package/utils/translate/report.js +32 -4
- package/utils/translate/safe-network.js +24 -4
- package/utils/usage-insights.js +435 -0
- package/utils/usage-source.js +50 -0
- package/utils/watch-locales.js +1 -8
package/ui-locales/ru.json
CHANGED
|
@@ -536,7 +536,7 @@
|
|
|
536
536
|
"argsParseFailed": "Разбор аргументов не удался: {error}",
|
|
537
537
|
"translationDiscoveryError": "Ошибка обнаружения перевода: {error}",
|
|
538
538
|
"fileTraversalError": "Ошибка обхода файла: {error}",
|
|
539
|
-
"sourceEqualsI18nWarn": "
|
|
539
|
+
"sourceEqualsI18nWarn": "{reason}. Анализ использования не будет сканировать файлы локали как исходный код.",
|
|
540
540
|
"i18nEqualsSourceWarn": "⚠️ Каталог I18n и исходный каталог совпадают. Это может вызвать проблемы с анализом.",
|
|
541
541
|
"usageAnalysisFailed": "⚠️ Анализ использования не удался: {error}",
|
|
542
542
|
"translationFileParseError": "⚠️ Ошибка разбора файла перевода: {error}",
|
|
@@ -642,7 +642,8 @@
|
|
|
642
642
|
"failedToSaveReport": "Не удалось сохранить отчет об использовании: {error}",
|
|
643
643
|
"i18nDirectoryDoesNotExist": "Каталог I18n не существует: {dir}",
|
|
644
644
|
"reportSavedTo": "Отчет об использовании сохранен в: {reportPath}",
|
|
645
|
-
"sourceDirectoryDoesNotExist": "Исходный каталог не существует: {dir}"
|
|
645
|
+
"sourceDirectoryDoesNotExist": "Исходный каталог не существует: {dir}",
|
|
646
|
+
"noSourceDirectoryConfigured": "(ничего не настроено)"
|
|
646
647
|
},
|
|
647
648
|
"validate": {
|
|
648
649
|
"help_message": "Использование средства проверки перевода I18n: узел i18ntk-validate.js [опции] Параметры: --source-dir <dir> Исходный каталог для сканирования (по умолчанию: ./src) --i18n-dir <dir> Каталог I18n (по умолчанию: ./src/locales) --output-report Создать подробный отчет --output-dir <dir> Выходной каталог для отчетов (по умолчанию: ./reports) --help Показать эту справку Примеры: 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",
|
|
@@ -922,7 +923,7 @@
|
|
|
922
923
|
"summaryCommand": "резюме - Показать статус проекта",
|
|
923
924
|
"debugCommand": "debug - Отладка проблем с переводом",
|
|
924
925
|
"scannerCommand": "сканер - Сканировать ключи",
|
|
925
|
-
"translateCommand": "Translate — автоматически переводить файлы локали
|
|
926
|
+
"translateCommand": "Translate — автоматически переводить файлы локали",
|
|
926
927
|
"menu": {
|
|
927
928
|
"pressEnterToContinue": "Нажмите Enter, чтобы продолжить...",
|
|
928
929
|
"title": "🌐 МЕНЮ УПРАВЛЕНИЯ I18NTK",
|
|
@@ -1102,7 +1103,32 @@
|
|
|
1102
1103
|
"translationFilesCreatedWarning": "Файлы перевода были созданы с заполнителями; проверка перед использованием в производстве.",
|
|
1103
1104
|
"warningCannotReadSourceDir": "Предупреждение: невозможно прочитать исходный каталог {dir}: {error}",
|
|
1104
1105
|
"warningInvalidLanguageCodes": "Внимание: неверные коды языков игнорируются: {languages}",
|
|
1105
|
-
"warningProceedingWithoutFramework": "Продолжаем без обнаружения платформы i18n."
|
|
1106
|
+
"warningProceedingWithoutFramework": "Продолжаем без обнаружения платформы i18n.",
|
|
1107
|
+
"backup": {
|
|
1108
|
+
"title": "Настройки резервного копирования",
|
|
1109
|
+
"description": "Резервное копирование отключено по умолчанию, чтобы избежать рекурсии резервного копирования и загрязнения репозитория.",
|
|
1110
|
+
"enablePrompt": "Включить автоматическое резервное копирование? (да/нет):",
|
|
1111
|
+
"keepPrompt": "Сколько резервных копий должно сохраняться автоматически (1–3, по умолчанию 1):"
|
|
1112
|
+
},
|
|
1113
|
+
"completionSummaryTitle": "Итоги завершения",
|
|
1114
|
+
"completionSummaryBasicTitle": "Краткое описание завершения (базовое)",
|
|
1115
|
+
"totalChanges": "Всего изменений: {count}",
|
|
1116
|
+
"languagesProcessed": "Обработанные языки: {count}",
|
|
1117
|
+
"missingKeysAdded": "Добавлены недостающие ключи: {count}",
|
|
1118
|
+
"reportPrompt": "Хотите, чтобы был создан отчет? (Да/Нет):",
|
|
1119
|
+
"reportGenerated": "Отчет создан: {reportPath}",
|
|
1120
|
+
"reportFailed": "Не удалось создать отчет: {error}",
|
|
1121
|
+
"completionError": "Ошибка при завершении: {error}",
|
|
1122
|
+
"optimize": {
|
|
1123
|
+
"title": "Оптимизация размера пакета",
|
|
1124
|
+
"preview": "Выполняется предпросмотр оптимизации локалей...",
|
|
1125
|
+
"reduceTip": "Можно уменьшить размер пакета, выбрав только нужные языки.",
|
|
1126
|
+
"prompt": "Запустить интерактивную оптимизацию сейчас? (д/Н): ",
|
|
1127
|
+
"starting": "Запуск интерактивной оптимизации локалей...",
|
|
1128
|
+
"completed": "Оптимизация пакета завершена.",
|
|
1129
|
+
"later": "Оптимизацию локалей можно запустить позже:",
|
|
1130
|
+
"unavailable": "Не удалось предложить оптимизацию локалей: {error}"
|
|
1131
|
+
}
|
|
1106
1132
|
},
|
|
1107
1133
|
"language": {
|
|
1108
1134
|
"title": "🌍 Изменить язык",
|
|
@@ -1147,7 +1173,7 @@
|
|
|
1147
1173
|
"sizing": "📏 Анализ размеров",
|
|
1148
1174
|
"fix": "🛠️ Исправьте переводы заполнителей.",
|
|
1149
1175
|
"scanner": "🔍 Сканирование на наличие проблем с i18n",
|
|
1150
|
-
"translate": "🌐 Автоматический перевод
|
|
1176
|
+
"translate": "🌐 Автоматический перевод",
|
|
1151
1177
|
"workflow": "🔄 Запуск полного рабочего процесса",
|
|
1152
1178
|
"status": "📋 Показать статус проекта",
|
|
1153
1179
|
"delete": "🗑️ Удалить все отчеты",
|
|
@@ -1293,7 +1319,7 @@
|
|
|
1293
1319
|
"invalidInputType": "инвалид_вход_тип",
|
|
1294
1320
|
"pathTraversalAttempt": "path_traversal_attempt",
|
|
1295
1321
|
"pathValidated": "✅ Путь успешно подтвержден",
|
|
1296
|
-
"pathValidationError": "
|
|
1322
|
+
"pathValidationError": "путь_проверка_ошибка",
|
|
1297
1323
|
"fileTooLarge": "Безопасность: Файл слишком большой: {filePath}",
|
|
1298
1324
|
"fileReadError": "Безопасность: Ошибка чтения файла: {errorMessage}",
|
|
1299
1325
|
"contentTooLargeForFile": "Безопасность: Содержимое слишком велико для файла: {filePath}",
|
|
@@ -1447,7 +1473,9 @@
|
|
|
1447
1473
|
"securitySettings": "Настройки безопасности",
|
|
1448
1474
|
"securitySettingsDesc": "PIN-код администратора и другие параметры безопасности",
|
|
1449
1475
|
"backupSettings": "Настройки резервного копирования",
|
|
1450
|
-
"backupSettingsDesc": "Резервное копирование и восстановление настроек конфигурации"
|
|
1476
|
+
"backupSettingsDesc": "Резервное копирование и восстановление настроек конфигурации",
|
|
1477
|
+
"autoTranslate": "Автоперевод",
|
|
1478
|
+
"autoTranslateDesc": "Настройка плейсхолдеров, параллелизма, пакетов и отчетов"
|
|
1451
1479
|
},
|
|
1452
1480
|
"updatePackage": {
|
|
1453
1481
|
"title": "Обновить пакет",
|
|
@@ -1569,7 +1597,8 @@
|
|
|
1569
1597
|
"processingSettings": "Настройки обработки",
|
|
1570
1598
|
"advancedSettings": "Расширенные настройки",
|
|
1571
1599
|
"scriptDirectorySettings": "Настройки каталога скриптов",
|
|
1572
|
-
"securitySettings": "Настройки безопасности"
|
|
1600
|
+
"securitySettings": "Настройки безопасности",
|
|
1601
|
+
"autoTranslate": "Настройки автоперевода"
|
|
1573
1602
|
},
|
|
1574
1603
|
"security": {
|
|
1575
1604
|
"title": "🔐 Настройки безопасности",
|
|
@@ -1925,6 +1954,70 @@
|
|
|
1925
1954
|
"description": "Требовать подтверждения для операций резервного копирования",
|
|
1926
1955
|
"help": "Подтвердите операцию резервного копирования"
|
|
1927
1956
|
}
|
|
1957
|
+
},
|
|
1958
|
+
"reports_format": {
|
|
1959
|
+
"label": "Формат отчета",
|
|
1960
|
+
"help": "Выберите markdown для читаемых отчетов, json для автоматизации или text для простых журналов."
|
|
1961
|
+
},
|
|
1962
|
+
"autoTranslate_placeholderMode": {
|
|
1963
|
+
"label": "Режим плейсхолдеров",
|
|
1964
|
+
"help": "Как обрабатывать строки с плейсхолдерами при автопереводе."
|
|
1965
|
+
},
|
|
1966
|
+
"autoTranslate_concurrency": {
|
|
1967
|
+
"label": "Одновременные запросы перевода",
|
|
1968
|
+
"help": "Максимум одновременных запросов к провайдеру. Google поддерживает до 100 в i18ntk; DeepL и LibreTranslate ограничены ниже."
|
|
1969
|
+
},
|
|
1970
|
+
"autoTranslate_batchSize": {
|
|
1971
|
+
"label": "Текстовых сегментов на пакет",
|
|
1972
|
+
"help": "Сколько текстовых сегментов планируется в один пакет."
|
|
1973
|
+
},
|
|
1974
|
+
"autoTranslate_progressInterval": {
|
|
1975
|
+
"label": "Интервал прогресса",
|
|
1976
|
+
"help": "Число готовых сегментов между обновлениями прогресса."
|
|
1977
|
+
},
|
|
1978
|
+
"autoTranslate_retryCount": {
|
|
1979
|
+
"label": "Повторы",
|
|
1980
|
+
"help": "Максимум повторов для сбойного запроса."
|
|
1981
|
+
},
|
|
1982
|
+
"autoTranslate_retryDelay": {
|
|
1983
|
+
"label": "Задержка повтора (мс)",
|
|
1984
|
+
"help": "Базовая задержка повтора в миллисекундах."
|
|
1985
|
+
},
|
|
1986
|
+
"autoTranslate_timeout": {
|
|
1987
|
+
"label": "Тайм-аут запроса (мс)",
|
|
1988
|
+
"help": "Тайм-аут запроса к провайдеру перевода."
|
|
1989
|
+
},
|
|
1990
|
+
"autoTranslate_dryRunFirst": {
|
|
1991
|
+
"label": "Сначала предпросмотр",
|
|
1992
|
+
"help": "Показать, что будет переведено, до записи файлов."
|
|
1993
|
+
},
|
|
1994
|
+
"autoTranslate_onlyMissingOrEnglish": {
|
|
1995
|
+
"label": "Только отсутствующие или английские ключи",
|
|
1996
|
+
"help": "Сохранять уже переведенные целевые значения и переводить только пустые, маркеры, копии исходника или вероятно английские значения."
|
|
1997
|
+
},
|
|
1998
|
+
"autoTranslate_reportStdout": {
|
|
1999
|
+
"label": "Печатать отчет в терминал",
|
|
2000
|
+
"help": "Выводить отчет после перевода в stdout."
|
|
2001
|
+
},
|
|
2002
|
+
"autoTranslate_bom": {
|
|
2003
|
+
"label": "Писать UTF-8 BOM",
|
|
2004
|
+
"help": "Записывать JSON-файлы с UTF-8 BOM."
|
|
2005
|
+
},
|
|
2006
|
+
"autoTranslate_protectionEnabled": {
|
|
2007
|
+
"label": "Защита брендов, ключей и значений",
|
|
2008
|
+
"help": "Включить защищенные термины, ключи, значения и шаблоны."
|
|
2009
|
+
},
|
|
2010
|
+
"autoTranslate_protectionFile": {
|
|
2011
|
+
"label": "JSON-файл защиты",
|
|
2012
|
+
"help": "JSON-файл проекта с правилами защиты автоперевода."
|
|
2013
|
+
},
|
|
2014
|
+
"autoTranslate_promptProtectionSetup": {
|
|
2015
|
+
"label": "Спрашивать о создании файла защиты",
|
|
2016
|
+
"help": "Спрашивать при первом запуске автоперевода."
|
|
2017
|
+
},
|
|
2018
|
+
"autoTranslate_promptProtectionUpdate": {
|
|
2019
|
+
"label": "Спрашивать о бновлении правил защиты",
|
|
2020
|
+
"help": "Спрашивать перед переводами из меню."
|
|
1928
2021
|
}
|
|
1929
2022
|
},
|
|
1930
2023
|
"actions": {
|
|
@@ -2143,7 +2236,7 @@
|
|
|
2143
2236
|
"completeCommand": "Complete – Полные переводы (100% покрытие)",
|
|
2144
2237
|
"summaryCommand": "резюме - Показать статус проекта",
|
|
2145
2238
|
"scannerCommand": "сканер — сканирование на наличие проблем с i18n",
|
|
2146
|
-
"translateCommand": "Translate — автоматически переводить файлы локали
|
|
2239
|
+
"translateCommand": "Translate — автоматически переводить файлы локали",
|
|
2147
2240
|
"debugCommand": "debug - Отладка проблем с переводом"
|
|
2148
2241
|
},
|
|
2149
2242
|
"test_complete_system": {
|
|
@@ -2441,5 +2534,94 @@
|
|
|
2441
2534
|
"pressEnterToContinue": "Нажмите Enter, чтобы продолжить...",
|
|
2442
2535
|
"status": {
|
|
2443
2536
|
"exitingCompleted": "Рабочий процесс завершен. Выход..."
|
|
2537
|
+
},
|
|
2538
|
+
"prompt": {
|
|
2539
|
+
"yesTokens": [
|
|
2540
|
+
"да",
|
|
2541
|
+
"д",
|
|
2542
|
+
"y",
|
|
2543
|
+
"yes"
|
|
2544
|
+
],
|
|
2545
|
+
"noTokens": [
|
|
2546
|
+
"н",
|
|
2547
|
+
"нет",
|
|
2548
|
+
"n",
|
|
2549
|
+
"no"
|
|
2550
|
+
]
|
|
2551
|
+
},
|
|
2552
|
+
"translate": {
|
|
2553
|
+
"title": "Автоперевод",
|
|
2554
|
+
"sourceDirectory": {
|
|
2555
|
+
"title": "Каталог исходной локали",
|
|
2556
|
+
"currentProject": "Текущий проект: {dir}",
|
|
2557
|
+
"accepted": "Можно указать абсолютный путь или путь относительно текущего проекта.",
|
|
2558
|
+
"localeRootExample": "./locales (затем выберите исходный язык: en)",
|
|
2559
|
+
"folderHint": "Папка может содержать JSON-файлы напрямую или языковые папки, например ./locales/en.",
|
|
2560
|
+
"defaultNotFound": "Каталог по умолчанию не найден: {dir}",
|
|
2561
|
+
"enterExisting": "Введите существующий каталог с JSON-файлами локалей.",
|
|
2562
|
+
"directoryNotFound": "Каталог не найден: {dir}",
|
|
2563
|
+
"enterFolderExample": "Введите существующую папку, например ./locales/en.",
|
|
2564
|
+
"notDirectory": "Это не каталог: {dir}",
|
|
2565
|
+
"using": "Используется исходный каталог: {dir}",
|
|
2566
|
+
"noJsonDirect": "JSON-файлы напрямую не найдены: {dir}",
|
|
2567
|
+
"usingLanguageFolder": "Используется папка исходного языка: {dir}",
|
|
2568
|
+
"noJsonWithLanguageFolder": "JSON-файлы не найдены: {dir}\nТакже проверена папка исходного языка: {languageDir}",
|
|
2569
|
+
"noJson": "JSON-файлы не найдены: {dir}"
|
|
2570
|
+
},
|
|
2571
|
+
"targetLanguages": {
|
|
2572
|
+
"title": "Целевые языки",
|
|
2573
|
+
"allConfigured": "a) Все настроенные целевые языки: {languages}",
|
|
2574
|
+
"noneConfigured": "a) Все настроенные целевые языки: нет",
|
|
2575
|
+
"enterCodes": "Или введите один или несколько кодов языка через запятую или пробел.",
|
|
2576
|
+
"sourceExcluded": "Исходный язык \"{lang}\" будет исключен автоматически.",
|
|
2577
|
+
"noneSelected": "Не выбраны допустимые целевые языки. Отмена.",
|
|
2578
|
+
"configureHint": "Настройте defaultLanguages в .i18ntk-config или введите коды вручную.",
|
|
2579
|
+
"selected": "Целевые языки: {languages}"
|
|
2580
|
+
},
|
|
2581
|
+
"protection": {
|
|
2582
|
+
"title": "Защищенные термины и ключи"
|
|
2583
|
+
},
|
|
2584
|
+
"common": {
|
|
2585
|
+
"default": "По умолчанию: {value}",
|
|
2586
|
+
"examples": "Примеры:",
|
|
2587
|
+
"exampleValue": "Пример: {value}",
|
|
2588
|
+
"examplesInline": "Примеры: {examples}",
|
|
2589
|
+
"pressEnterDefault": "Нажмите Enter, чтобы использовать значение по умолчанию.",
|
|
2590
|
+
"usingDefault": "Используется по умолчанию: {value}"
|
|
2591
|
+
},
|
|
2592
|
+
"sourceLanguage": {
|
|
2593
|
+
"title": "Код исходного языка",
|
|
2594
|
+
"hint": "Он должен совпадать с языком значений в исходных JSON.",
|
|
2595
|
+
"using": "Исходный язык: {lang}",
|
|
2596
|
+
"invalid": "Недопустимый код языка. Используйте 2+ символа (напр. en, de, fr)."
|
|
2597
|
+
},
|
|
2598
|
+
"files": {
|
|
2599
|
+
"title": "Какие файлы перевести?",
|
|
2600
|
+
"all": "a) Все JSON-файлы ({count}: {files})",
|
|
2601
|
+
"choicePrompt": "Выбор [a/all или номер файла]: ",
|
|
2602
|
+
"invalidChoice": "Недопустимый выбор. Отмена."
|
|
2603
|
+
},
|
|
2604
|
+
"dryRun": {
|
|
2605
|
+
"previewFor": "Предпросмотр для \"{lang}\"..."
|
|
2606
|
+
},
|
|
2607
|
+
"confirm": {
|
|
2608
|
+
"proceed": "Продолжить реальный перевод?",
|
|
2609
|
+
"yesNoPrompt": "[д]а / [н]ет: ",
|
|
2610
|
+
"cancelled": "Перевод отменен."
|
|
2611
|
+
},
|
|
2612
|
+
"run": {
|
|
2613
|
+
"translatingTo": "Перевод на \"{lang}\"...",
|
|
2614
|
+
"failedFor": "Ошибка для \"{lang}\": {error}"
|
|
2615
|
+
},
|
|
2616
|
+
"summary": {
|
|
2617
|
+
"title": "Сводка:",
|
|
2618
|
+
"complete": "Перевод завершен!"
|
|
2619
|
+
},
|
|
2620
|
+
"nonInteractive": {
|
|
2621
|
+
"useDirect": "Неинтерактивный режим. Используйте прямую CLI:"
|
|
2622
|
+
},
|
|
2623
|
+
"errors": {
|
|
2624
|
+
"sourceDirectoryNotFound": "Каталог исходной локали не найден: {dir}"
|
|
2625
|
+
}
|
|
2444
2626
|
}
|
|
2445
2627
|
}
|
package/ui-locales/zh.json
CHANGED
|
@@ -183,7 +183,7 @@
|
|
|
183
183
|
"totalIssues": "发现问题总数: {totalIssues}",
|
|
184
184
|
"missingTranslations": "缺少翻译: {missing}",
|
|
185
185
|
"placeholderTranslations": "占位符翻译: {placeholder}",
|
|
186
|
-
"noIssues": "✅
|
|
186
|
+
"noIssues": "✅ 没有发现问题。所有翻译均已完成。",
|
|
187
187
|
"detailedIssues": "📋详细问题:",
|
|
188
188
|
"detailedSeparator": "--------------------------------------------------",
|
|
189
189
|
"filePath": "📄 {file} → {path}",
|
|
@@ -536,7 +536,7 @@
|
|
|
536
536
|
"argsParseFailed": "参数解析失败: {error}",
|
|
537
537
|
"translationDiscoveryError": "翻译发现错误: {error}",
|
|
538
538
|
"fileTraversalError": "文件遍历错误: {error}",
|
|
539
|
-
"sourceEqualsI18nWarn": "
|
|
539
|
+
"sourceEqualsI18nWarn": "{reason}。使用情况分析不会将语言环境文件扫描为源代码。",
|
|
540
540
|
"i18nEqualsSourceWarn": "⚠️ I18n目录和源码目录是一样的。这可能会导致分析出现问题。",
|
|
541
541
|
"usageAnalysisFailed": "⚠️ 使用情况分析失败: {error}",
|
|
542
542
|
"translationFileParseError": "⚠️翻译文件解析错误: {error}",
|
|
@@ -642,7 +642,8 @@
|
|
|
642
642
|
"failedToSaveReport": "无法保存使用报告: {error}",
|
|
643
643
|
"i18nDirectoryDoesNotExist": "I18n 目录不存在: {dir}",
|
|
644
644
|
"reportSavedTo": "使用情况报告保存到: {reportPath}",
|
|
645
|
-
"sourceDirectoryDoesNotExist": "源目录不存在: {dir}"
|
|
645
|
+
"sourceDirectoryDoesNotExist": "源目录不存在: {dir}",
|
|
646
|
+
"noSourceDirectoryConfigured": "(未配置)"
|
|
646
647
|
},
|
|
647
648
|
"validate": {
|
|
648
649
|
"help_message": "国际化翻译验证器用法:node i18ntk-validate.js [options] 选项:--source-dir <dir> 要扫描的源目录(默认:./src)--i18n-dir <dir> I18n 目录(默认:./src/locales) --output-report 生成详细报告 --output-dir <dir> 报告的输出目录(默认:./reports) --help 显示此帮助示例: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",
|
|
@@ -922,7 +923,7 @@
|
|
|
922
923
|
"summaryCommand": "摘要 - 显示项目状态",
|
|
923
924
|
"debugCommand": "debug - 调试翻译问题",
|
|
924
925
|
"scannerCommand": "扫描仪 - 扫描钥匙",
|
|
925
|
-
"translateCommand": "翻译 -
|
|
926
|
+
"translateCommand": "翻译 - 自动翻译语言环境文件",
|
|
926
927
|
"menu": {
|
|
927
928
|
"pressEnterToContinue": "按 Enter 键继续...",
|
|
928
929
|
"title": "🌐I18NTK 管理菜单",
|
|
@@ -1102,7 +1103,32 @@
|
|
|
1102
1103
|
"translationFilesCreatedWarning": "翻译文件是使用占位符创建的;生产使用前进行审查。",
|
|
1103
1104
|
"warningCannotReadSourceDir": "警告:无法读取源目录 {dir}: {error}",
|
|
1104
1105
|
"warningInvalidLanguageCodes": "警告:忽略无效的语言代码: {languages}",
|
|
1105
|
-
"warningProceedingWithoutFramework": "未检测到 i18n 框架即可继续。"
|
|
1106
|
+
"warningProceedingWithoutFramework": "未检测到 i18n 框架即可继续。",
|
|
1107
|
+
"backup": {
|
|
1108
|
+
"title": "备份设置",
|
|
1109
|
+
"description": "默认情况下禁用备份,以避免备份递归和存储库污染。",
|
|
1110
|
+
"enablePrompt": "启用自动备份? (是/否):",
|
|
1111
|
+
"keepPrompt": "应自动保留多少个备份(1-3,默认1):"
|
|
1112
|
+
},
|
|
1113
|
+
"completionSummaryTitle": "完成总结",
|
|
1114
|
+
"completionSummaryBasicTitle": "完成总结(基本)",
|
|
1115
|
+
"totalChanges": "总变化: {count}",
|
|
1116
|
+
"languagesProcessed": "处理的语言: {count}",
|
|
1117
|
+
"missingKeysAdded": "添加了缺少的键: {count}",
|
|
1118
|
+
"reportPrompt": "您想要生成一份报告吗? (是/否):",
|
|
1119
|
+
"reportGenerated": "生成的报告: {reportPath}",
|
|
1120
|
+
"reportFailed": "无法生成报告: {error}",
|
|
1121
|
+
"completionError": "完成时出错: {error}",
|
|
1122
|
+
"optimize": {
|
|
1123
|
+
"title": "包大小优化",
|
|
1124
|
+
"preview": "正在运行语言包优化预览...",
|
|
1125
|
+
"reduceTip": "只选择所需语言,可以减小包大小。",
|
|
1126
|
+
"prompt": "现在运行交互式优化吗? (y/N): ",
|
|
1127
|
+
"starting": "正在启动交互式语言包优化...",
|
|
1128
|
+
"completed": "包优化已完成。",
|
|
1129
|
+
"later": "之后可以用以下命令运行语言包优化:",
|
|
1130
|
+
"unavailable": "无法提供语言包优化:{error}"
|
|
1131
|
+
}
|
|
1106
1132
|
},
|
|
1107
1133
|
"language": {
|
|
1108
1134
|
"title": "🌍 更改语言",
|
|
@@ -1147,7 +1173,7 @@
|
|
|
1147
1173
|
"sizing": "📏 分析尺码",
|
|
1148
1174
|
"fix": "🛠️ 修复占位符翻译",
|
|
1149
1175
|
"scanner": "🔍 扫描 i18n 问题",
|
|
1150
|
-
"translate": "🌐
|
|
1176
|
+
"translate": "🌐 自动翻译",
|
|
1151
1177
|
"workflow": "🔄 运行完整的工作流程",
|
|
1152
1178
|
"status": "📋 显示项目状态",
|
|
1153
1179
|
"delete": "🗑️删除所有报告",
|
|
@@ -1447,7 +1473,9 @@
|
|
|
1447
1473
|
"securitySettings": "安全设置",
|
|
1448
1474
|
"securitySettingsDesc": "管理员 PIN 码和其他安全选项",
|
|
1449
1475
|
"backupSettings": "备份设置",
|
|
1450
|
-
"backupSettingsDesc": "备份和恢复配置设置"
|
|
1476
|
+
"backupSettingsDesc": "备份和恢复配置设置",
|
|
1477
|
+
"autoTranslate": "自动翻译",
|
|
1478
|
+
"autoTranslateDesc": "调整占位符、并发、批量和报告"
|
|
1451
1479
|
},
|
|
1452
1480
|
"updatePackage": {
|
|
1453
1481
|
"title": "更新包",
|
|
@@ -1569,7 +1597,8 @@
|
|
|
1569
1597
|
"processingSettings": "处理设置",
|
|
1570
1598
|
"advancedSettings": "高级设置",
|
|
1571
1599
|
"scriptDirectorySettings": "脚本目录设置",
|
|
1572
|
-
"securitySettings": "安全设置"
|
|
1600
|
+
"securitySettings": "安全设置",
|
|
1601
|
+
"autoTranslate": "自动翻译设置"
|
|
1573
1602
|
},
|
|
1574
1603
|
"security": {
|
|
1575
1604
|
"title": "🔐安全设置",
|
|
@@ -1925,6 +1954,70 @@
|
|
|
1925
1954
|
"description": "需要确认备份操作",
|
|
1926
1955
|
"help": "确认备份操作"
|
|
1927
1956
|
}
|
|
1957
|
+
},
|
|
1958
|
+
"reports_format": {
|
|
1959
|
+
"label": "报告格式",
|
|
1960
|
+
"help": "选择 markdown 生成易读报告,json 用于自动化,text 用于纯文本日志。"
|
|
1961
|
+
},
|
|
1962
|
+
"autoTranslate_placeholderMode": {
|
|
1963
|
+
"label": "占位符处理模式",
|
|
1964
|
+
"help": "自动翻译过程中如何处理带有占位符的字符串。"
|
|
1965
|
+
},
|
|
1966
|
+
"autoTranslate_concurrency": {
|
|
1967
|
+
"label": "并发翻译请求",
|
|
1968
|
+
"help": "最大并发提供商请求数。i18ntk 中 Google 最高支持 100;DeepL 和 LibreTranslate 的上限较低。"
|
|
1969
|
+
},
|
|
1970
|
+
"autoTranslate_batchSize": {
|
|
1971
|
+
"label": "每批文本段",
|
|
1972
|
+
"help": "每批计划的文本段数。"
|
|
1973
|
+
},
|
|
1974
|
+
"autoTranslate_progressInterval": {
|
|
1975
|
+
"label": "进度更新间隔",
|
|
1976
|
+
"help": "进度更新之间已完成的文本段。"
|
|
1977
|
+
},
|
|
1978
|
+
"autoTranslate_retryCount": {
|
|
1979
|
+
"label": "重试次数",
|
|
1980
|
+
"help": "每个失败请求的最大重试次数。"
|
|
1981
|
+
},
|
|
1982
|
+
"autoTranslate_retryDelay": {
|
|
1983
|
+
"label": "重试延迟(毫秒)",
|
|
1984
|
+
"help": "基本重试延迟(以毫秒为单位)。"
|
|
1985
|
+
},
|
|
1986
|
+
"autoTranslate_timeout": {
|
|
1987
|
+
"label": "请求超时(毫秒)",
|
|
1988
|
+
"help": "翻译提供商请求超时。"
|
|
1989
|
+
},
|
|
1990
|
+
"autoTranslate_dryRunFirst": {
|
|
1991
|
+
"label": "首先进行试运行预览",
|
|
1992
|
+
"help": "在写入文件之前预览将要翻译的内容。"
|
|
1993
|
+
},
|
|
1994
|
+
"autoTranslate_onlyMissingOrEnglish": {
|
|
1995
|
+
"label": "仅缺失或英文键",
|
|
1996
|
+
"help": "保留已翻译的目标值,仅翻译缺失、标记、源文复制或可能是英文的值。"
|
|
1997
|
+
},
|
|
1998
|
+
"autoTranslate_reportStdout": {
|
|
1999
|
+
"label": "打印报告到终端",
|
|
2000
|
+
"help": "将翻译后报告打印到标准输出。"
|
|
2001
|
+
},
|
|
2002
|
+
"autoTranslate_bom": {
|
|
2003
|
+
"label": "写入 UTF-8 BOM",
|
|
2004
|
+
"help": "使用 UTF-8 BOM 编写翻译后的 JSON 文件。"
|
|
2005
|
+
},
|
|
2006
|
+
"autoTranslate_protectionEnabled": {
|
|
2007
|
+
"label": "保护品牌术语、关键、价值观",
|
|
2008
|
+
"help": "启用用户可编辑的受保护术语、键、值和模式。"
|
|
2009
|
+
},
|
|
2010
|
+
"autoTranslate_protectionFile": {
|
|
2011
|
+
"label": "保护 JSON 文件",
|
|
2012
|
+
"help": "包含自动翻译保护规则的项目 JSON 文件。"
|
|
2013
|
+
},
|
|
2014
|
+
"autoTranslate_promptProtectionSetup": {
|
|
2015
|
+
"label": "要求创建保护文件",
|
|
2016
|
+
"help": "自动翻译首次运行时要求创建保护文件。"
|
|
2017
|
+
},
|
|
2018
|
+
"autoTranslate_promptProtectionUpdate": {
|
|
2019
|
+
"label": "要求更新保护规则",
|
|
2020
|
+
"help": "在经理翻译之前询问是否更新保护规则。"
|
|
1928
2021
|
}
|
|
1929
2022
|
},
|
|
1930
2023
|
"actions": {
|
|
@@ -2143,7 +2236,7 @@
|
|
|
2143
2236
|
"completeCommand": "完整 - 完整翻译(100% 覆盖率)",
|
|
2144
2237
|
"summaryCommand": "摘要 - 显示项目状态",
|
|
2145
2238
|
"scannerCommand": "扫描仪 - 扫描 i18n 问题",
|
|
2146
|
-
"translateCommand": "翻译 -
|
|
2239
|
+
"translateCommand": "翻译 - 自动翻译语言环境文件",
|
|
2147
2240
|
"debugCommand": "debug - 调试翻译问题"
|
|
2148
2241
|
},
|
|
2149
2242
|
"test_complete_system": {
|
|
@@ -2441,5 +2534,97 @@
|
|
|
2441
2534
|
"pressEnterToContinue": "按 Enter 键继续...",
|
|
2442
2535
|
"status": {
|
|
2443
2536
|
"exitingCompleted": "工作流程完成。正在退出..."
|
|
2537
|
+
},
|
|
2538
|
+
"prompt": {
|
|
2539
|
+
"yesTokens": [
|
|
2540
|
+
"是",
|
|
2541
|
+
"好",
|
|
2542
|
+
"确认",
|
|
2543
|
+
"可以",
|
|
2544
|
+
"y",
|
|
2545
|
+
"yes"
|
|
2546
|
+
],
|
|
2547
|
+
"noTokens": [
|
|
2548
|
+
"否",
|
|
2549
|
+
"不",
|
|
2550
|
+
"不要",
|
|
2551
|
+
"n",
|
|
2552
|
+
"no"
|
|
2553
|
+
]
|
|
2554
|
+
},
|
|
2555
|
+
"translate": {
|
|
2556
|
+
"title": "自动翻译",
|
|
2557
|
+
"sourceDirectory": {
|
|
2558
|
+
"title": "源语言目录",
|
|
2559
|
+
"currentProject": "当前项目: {dir}",
|
|
2560
|
+
"accepted": "可以使用绝对路径,或相对于当前项目的路径。",
|
|
2561
|
+
"localeRootExample": "./locales (然后选择源语言: en)",
|
|
2562
|
+
"folderHint": "文件夹可以直接包含 JSON 文件,也可以包含像 ./locales/en 这样的语言文件夹。",
|
|
2563
|
+
"defaultNotFound": "未找到默认目录: {dir}",
|
|
2564
|
+
"enterExisting": "请输入包含 JSON 语言文件的现有目录。",
|
|
2565
|
+
"directoryNotFound": "未找到目录: {dir}",
|
|
2566
|
+
"enterFolderExample": "请输入现有文件夹,例如 ./locales/en。",
|
|
2567
|
+
"notDirectory": "不是目录: {dir}",
|
|
2568
|
+
"using": "正在使用源目录: {dir}",
|
|
2569
|
+
"noJsonDirect": "未在此目录直接找到 JSON 文件: {dir}",
|
|
2570
|
+
"usingLanguageFolder": "使用源语言文件夹: {dir}",
|
|
2571
|
+
"noJsonWithLanguageFolder": "未找到 JSON 文件: {dir}\n也检查了源语言文件夹: {languageDir}",
|
|
2572
|
+
"noJson": "未找到 JSON 文件: {dir}"
|
|
2573
|
+
},
|
|
2574
|
+
"targetLanguages": {
|
|
2575
|
+
"title": "目标语言",
|
|
2576
|
+
"allConfigured": "a) 所有已配置的目标语言: {languages}",
|
|
2577
|
+
"noneConfigured": "a) 所有已配置的目标语言: 无",
|
|
2578
|
+
"enterCodes": "或输入一个或多个用逗号或空格分隔的语言代码。",
|
|
2579
|
+
"sourceExcluded": "源语言 \"{lang}\" 将自动排除。",
|
|
2580
|
+
"noneSelected": "未选择有效的目标语言。已取消。",
|
|
2581
|
+
"configureHint": "在 .i18ntk-config 中配置 defaultLanguages,或手动输入目标代码。",
|
|
2582
|
+
"selected": "目标语言: {languages}"
|
|
2583
|
+
},
|
|
2584
|
+
"protection": {
|
|
2585
|
+
"title": "受保护的术语和键"
|
|
2586
|
+
},
|
|
2587
|
+
"common": {
|
|
2588
|
+
"default": "默认: {value}",
|
|
2589
|
+
"examples": "示例:",
|
|
2590
|
+
"exampleValue": "示例: {value}",
|
|
2591
|
+
"examplesInline": "示例: {examples}",
|
|
2592
|
+
"pressEnterDefault": "按 Enter 使用默认值。",
|
|
2593
|
+
"usingDefault": "使用默认值: {value}"
|
|
2594
|
+
},
|
|
2595
|
+
"sourceLanguage": {
|
|
2596
|
+
"title": "源语言代码",
|
|
2597
|
+
"hint": "这应与源 JSON 值的语言匹配。",
|
|
2598
|
+
"using": "使用源语言: {lang}",
|
|
2599
|
+
"invalid": "语言代码无效。请使用 2 个或更多字符(例如 en, de, fr)。"
|
|
2600
|
+
},
|
|
2601
|
+
"files": {
|
|
2602
|
+
"title": "要翻译哪些文件?",
|
|
2603
|
+
"all": "a) 所有 JSON 文件 ({count}: {files})",
|
|
2604
|
+
"choicePrompt": "选择 [a/all 或文件编号]: ",
|
|
2605
|
+
"invalidChoice": "选择无效。已取消。"
|
|
2606
|
+
},
|
|
2607
|
+
"dryRun": {
|
|
2608
|
+
"previewFor": "\"{lang}\" 的预览..."
|
|
2609
|
+
},
|
|
2610
|
+
"confirm": {
|
|
2611
|
+
"proceed": "是否继续执行实际翻译?",
|
|
2612
|
+
"yesNoPrompt": "[是] / [否]: ",
|
|
2613
|
+
"cancelled": "翻译已取消。"
|
|
2614
|
+
},
|
|
2615
|
+
"run": {
|
|
2616
|
+
"translatingTo": "正在翻译到 \"{lang}\"...",
|
|
2617
|
+
"failedFor": "\"{lang}\" 失败: {error}"
|
|
2618
|
+
},
|
|
2619
|
+
"summary": {
|
|
2620
|
+
"title": "摘要:",
|
|
2621
|
+
"complete": "翻译完成!"
|
|
2622
|
+
},
|
|
2623
|
+
"nonInteractive": {
|
|
2624
|
+
"useDirect": "非交互模式。请使用直接 CLI:"
|
|
2625
|
+
},
|
|
2626
|
+
"errors": {
|
|
2627
|
+
"sourceDirectoryNotFound": "未找到源语言目录: {dir}"
|
|
2628
|
+
}
|
|
2444
2629
|
}
|
|
2445
2630
|
}
|
package/utils/cli-helper.js
CHANGED
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
* @since 2025-08-08
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
const { getGlobalReadline, closeGlobalReadline, ask, askHidden } = require('./cli');
|
|
11
|
+
const { getGlobalReadline, closeGlobalReadline, ask, askHidden } = require('./cli');
|
|
12
|
+
const { parseConfirmation } = require('./localized-confirm');
|
|
12
13
|
|
|
13
14
|
class CliHelper {
|
|
14
15
|
constructor() {
|
|
@@ -86,17 +87,12 @@ class CliHelper {
|
|
|
86
87
|
* @param {boolean} defaultValue - Default value if user just presses enter
|
|
87
88
|
* @returns {Promise<boolean>} The user's confirmation
|
|
88
89
|
*/
|
|
89
|
-
async confirm(question, defaultValue = false) {
|
|
90
|
-
const promptText = `${question} (${defaultValue ? 'Y/n' : 'y/N'}): `;
|
|
91
|
-
|
|
92
|
-
const answer = await ask(promptText);
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
return defaultValue;
|
|
96
|
-
} else {
|
|
97
|
-
return normalized === 'y' || normalized === 'yes';
|
|
98
|
-
}
|
|
99
|
-
}
|
|
90
|
+
async confirm(question, defaultValue = false, language = 'en') {
|
|
91
|
+
const promptText = `${question} (${defaultValue ? 'Y/n' : 'y/N'}): `;
|
|
92
|
+
|
|
93
|
+
const answer = await ask(promptText);
|
|
94
|
+
return parseConfirmation(answer, { language, defaultValue });
|
|
95
|
+
}
|
|
100
96
|
|
|
101
97
|
/**
|
|
102
98
|
* Display a menu and get user selection
|
package/utils/config-helper.js
CHANGED
|
@@ -168,7 +168,7 @@ async function getUnifiedConfig(scriptName, cliArgs = {}) {
|
|
|
168
168
|
maxBackups: normalizedBackupMaxBackups
|
|
169
169
|
},
|
|
170
170
|
settings: {
|
|
171
|
-
defaultLanguages: cfg.defaultLanguages || ['de', 'es', 'fr', 'ru'],
|
|
171
|
+
defaultLanguages: cfg.defaultLanguages || ['en', 'de', 'es', 'fr', 'ru'],
|
|
172
172
|
processing: { ...cfg.processing },
|
|
173
173
|
security: { ...cfg.security },
|
|
174
174
|
advanced: cfg.advanced || {},
|
package/utils/config-manager.js
CHANGED
|
@@ -154,13 +154,14 @@ const DEFAULT_CONFIG = {
|
|
|
154
154
|
},
|
|
155
155
|
"autoTranslate": {
|
|
156
156
|
"placeholderMode": "preserve",
|
|
157
|
-
"concurrency":
|
|
157
|
+
"concurrency": 12,
|
|
158
158
|
"batchSize": 100,
|
|
159
159
|
"progressInterval": 25,
|
|
160
160
|
"retryCount": 3,
|
|
161
161
|
"retryDelay": 1000,
|
|
162
162
|
"timeout": 15000,
|
|
163
163
|
"dryRunFirst": true,
|
|
164
|
+
"onlyMissingOrEnglish": true,
|
|
164
165
|
"reportStdout": true,
|
|
165
166
|
"bom": false,
|
|
166
167
|
"protectionEnabled": true,
|
|
@@ -169,7 +170,7 @@ const DEFAULT_CONFIG = {
|
|
|
169
170
|
"promptProtectionUpdate": true
|
|
170
171
|
},
|
|
171
172
|
"reports": {
|
|
172
|
-
"format": "
|
|
173
|
+
"format": "markdown",
|
|
173
174
|
"includeStats": true,
|
|
174
175
|
"includeMissingKeys": true,
|
|
175
176
|
"includeUnusedKeys": true,
|
|
@@ -305,10 +306,11 @@ const DEFAULT_CONFIG = {
|
|
|
305
306
|
"debugLogPath": "./debug.log"
|
|
306
307
|
},
|
|
307
308
|
"sourceLanguage": "en",
|
|
308
|
-
"defaultLanguages": [
|
|
309
|
-
"
|
|
310
|
-
"
|
|
311
|
-
"
|
|
309
|
+
"defaultLanguages": [
|
|
310
|
+
"en",
|
|
311
|
+
"de",
|
|
312
|
+
"es",
|
|
313
|
+
"fr",
|
|
312
314
|
"ru"
|
|
313
315
|
],
|
|
314
316
|
"reportLanguage": "auto",
|