Перевод файлов локализации i18next и JSON
JSON локали имеет вложенную структуру, а строки содержат переменные вида {{name}}. Инструмент, видящий только текст, может переименовать ключ, сгладить вложенность или перевести переменную. KAERIS возвращает файл в той же структуре, с каждой переменной на своем месте.
Эту страницу перевёл KAERIS и проверил каждую строку обратным переводом. Носитель языка ещё не проверял. Оригинал на английском
Как устроен файл локализации JSON
Один файл на язык (en.json, de.json) или один на пространство имен (locales/en/common.json). Ключи — это контракт с вашим кодом, поэтому переводятся только значения. i18next записывает формы множественного числа как отдельные ключи (inbox_one, inbox_other); next-intl, Vue I18n и FormatJS помещают их в одну строку ICU.
{
"nav": { "greeting": "Welcome back, {{name}}!" },
"inbox_one": "{{count}} new message",
"inbox_other": "{{count}} new messages"
}
На что обратить внимание при переводе JSON
Переменные в трех вариантах написания
{{name}}в i18next,{name}в библиотеках в стиле ICU,%sили${x}в других. Отсутствие одной из них приведет к пустому полю в работающем приложении, а не к ошибке.Множественное число требует больше форм в некоторых языках
В английском языке две формы. Русский, польский и арабский требуют от трех до шести. При использовании строк ICU бесплатная проверка помечает отсутствующие формы для ru, uk, pl, cs, sk, hr, sr, lt, ro, ar, lv, sl и he, а также пропущенные точные ветви, такие как
=0. При использовании ключей с суффиксами i18next ваш файл должен содержать дополнительные ключи, которые есть в языке; KAERIS переводит найденные ключи.Ссылки и разметка внутри значения
$t(nav.cart)в i18next,@:nav.shopв vue-i18n, теги<0>…</0>компонента Trans и обычный HTML должны сохраниться. Пример ниже показывает реальную потерю именно этого.Заметки для себя
Ключ, путь которого содержит сегмент, начинающийся с
_(_comment,_status), рассматривается как служебный ключ и по умолчанию не переводится в форматах JSON, YAML и ARB.
Реальный запуск: до и после
Реальный запуск: наш тестовый файл из 97 строк, немецкий, 26 октября 2026 г., сокращенный до четырех ключей. Последняя строка показывает потерю, которую обнаружила проверка в этом запуске.
{
"ph": {
"mustache": "Hi {{firstName}}, your order {{orderId}} has shipped.",
"reactTrans": "By continuing you accept our <0>Terms</0> and <1>Privacy Policy</1>.",
"nesting": "$t(nav.cart) has been updated"
},
"icu": {
"copiesLeft": "{count, plural, =0 {Sold out} one {Only # copy left} other {Only # copies left}}"
}
}
{
"ph": {
"mustache": "Hallo {{firstName}}, Ihre Bestellung {{orderId}} wurde versendet.",
"reactTrans": "Durch die fortgesetzte Nutzung stimmen Sie unseren <0>Nutzungsbedingungen</0> und <1>Datenschutzrichtlinien</1> zu.",
"nesting": "Der Warenkorb wurde aktualisiert"
},
"icu": {
"copiesLeft": "{count, plural, =0 {Ausverkauft} one {Nur noch # Exemplar} other {Nur noch # Exemplare}}"
}
}
error ph.nesting: lost placeholder $t(nav.cart)
Что KAERIS делает с этим
Тот же файл, та же структура
Ключи, вложенность и порядок остаются такими же, как в исходном файле; меняются только значения. Работает с файлами i18next, Vue I18n, next-intl и FormatJS.
Подсчёт переменных без ИИ
После перевода простая проверка подсчёта сравнивает каждую переменную и тег с оригиналом. Строка, в которой что-то потеряно, помечается и отображается сверху.
Каждая строка переводится обратно
С опцией
--verifyкаждый результат переводится обратно на ваш язык, и вторая модель оценивает, изменился ли смысл. Вы читаете, что теперь говорит каждая строка.Только новые ключи
kaeris translate --only-newпереводит новые и измененные ключи;kaeris.lockрядом с исходным файлом запоминает остальные. JSON и ARB.
Выполните в три шага
Установка CLI
Выполните
pip install kaeris. Учетная запись не требуется для бесплатных лимитов.Перевод файла
Выполните
kaeris translate en.json --langs de,ja --verify. Файлыde.jsonиja.jsonпоявятся рядом с исходным.Проверка результата
Выполните
kaeris check --source en.json --langs de,ja. Программа завершится с кодом 1, если переменная, число или ключ неверны, поэтому CI может остановить слияние.
pip install kaeris kaeris init --preset i18next kaeris translate en.json --langs de,ja --verify kaeris check --source en.json --langs de,ja
Вопросы
Какие макеты JSON работают?
Плоские и вложенные файлы ключ-значение, как используются i18next, Vue I18n, next-intl и FormatJS. Верхний уровень должен быть объектом, например {"greeting": "Hello"}. Массивы строк также переводятся.
Сохраняются ли ссылки {{count}} и $t(…)?
Переменные и ссылки сравниваются с исходным файлом после перевода. Строка, в которой что-то потеряно, помечается; пример выше показывает реальный запуск, где $t(nav.cart) был пропущен, и проверка это обнаружила.
Это бесплатно?
Да, без учетной записи: 10 000 символов на файл и до 8 языков за запуск. Бесплатный API-ключ увеличивает лимит файлов до 50 000 символов. Пожизненная лицензия стоит $79 один раз, при использовании вашего собственного ключа OpenRouter; ежемесячные планы начинаются от $19. Цены
Могу ли я запускать его из терминала или в CI?
Да. Установите pip install kaeris, затем выполните kaeris translate en.json --langs de,ja. GitHub Action выполняет тот же перевод в pull request. Документация CLI · GitHub Action
Продолжайте
Справочник по CLI · Справочник по проверке · Перевести в браузере · Бесплатная проверка · Конвертировать форматы · Псевдолокализация
Другие форматы: YAML · .po · ARB · XLIFF · .strings · .xcstrings · .properties · .resx · CSV · Markdown · Fluent · Android XML