Проверка переводов в GitLab CI
Задача устанавливает пакет kaeris и запускает kaeris check для запросов на слияние, которые затрагивают ваши файлы локали. Потерянный плейсхолдер или отсутствующий ключ приводит к сбою конвейера. Это офлайн и бесплатно: без API-ключа, без учетной записи.
Эту страницу перевёл KAERIS и проверил каждую строку обратным переводом. Носитель языка ещё не проверял. Оригинал на английском
Рецепт
Задача
Добавьте его в .gitlab-ci.yml. Измените --source на файл вашего базового языка и --langs на локали, которые вы поставляете. Блок rules запускает задачу только для запросов на слияние, которые изменяют что-либо в locales/; удалите строки changes, чтобы запускать ее для каждого запроса на слияние.
i18n-check:
stage: test
image: python:3.12-slim
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
changes:
- locales/**/*
script:
- pip install kaeris
- kaeris check --source locales/en.json --langs de,fr --ci
Что он выводит при реальных запусках
Вывод kaeris 0.2.35, захваченный 27 октября 2026 г. Последняя строка каждого блока — это код выхода, который видит задача CI.
Что выводит задача
Две строки script, выполненные по порядку. Слева: файлы, которые в порядке. Справа: de.json с {nam} вместо {name} и отсутствующим ключом checkout; задача останавливается с кодом выхода 1.
$ pip install kaeris Collecting kaeris Using cached kaeris-0.2.35-py3-none-any.whl.metadata (26 kB) Using cached kaeris-0.2.35-py3-none-any.whl (131 kB) Installing collected packages: kaeris Successfully installed kaeris-0.2.35 $ kaeris check --source locales/en.json --langs de,fr --ci ✓ de: complete & placeholder-safe ✓ fr: complete & placeholder-safe ✓ all locales complete & placeholder-safe Job succeeded exit code: 0
$ pip install kaeris
Requirement already satisfied: kaeris in C:\Users\Inzagi\AppData\Local\Temp\claude\C--Users-Inzagi-projects-kaeris\bfeebe69-3cfd-4f28-bbe7-e5600be082b9\scratchpad\venv-gl2\Lib\site-packages (0.2.35)
$ kaeris check --source locales/en.json --langs de,fr --ci
✗ de: 1 missing key(s): checkout
✗ de: 1 placeholder mismatch(es):
greeting: missing ['{name}'], added ['{nam}']
✗ de: 2 translation fault(s):
greeting: lost placeholder {name}
greeting: invented placeholder {nam} (not in source)
✓ fr: complete & placeholder-safe
✗ 1 missing key, 1 placeholder mismatch, 2 translation faults
ERROR: Job failed: exit code 1
exit code: 1
Настройте его в три шага
Добавьте задание
Вставьте задание в
.gitlab-ci.ymlи укажите свои--sourceи--langs.Откройте merge request
Измените файл локали в ветке и откройте merge request. Задание выполнится и покажет все найденные проблемы в своем журнале.
Требуйте прохождения пайплайна
В настройках проекта в разделе merge requests включите требование успешного прохождения пайплайнов. Красное задание тогда заблокирует слияние.
Как мы это проверили
Каждая команда на этой странице была выполнена до того, как она была здесь написана. То, что не было выполнено, также перечислено.
Что выполнилось
Обе строки
script, взятые из разобранного YAML, выполнялись одна за другой в чистом виртуальном окружении Python, останавливаясь на первой неудачной строке, как это делает задание GitLab.pip install kaerisзагрузил kaeris 0.2.35 из PyPI. Чистые файлы: код выхода 0. Поврежденныйde.json: код выхода 1.Что не выполнилось
Не использовался ни GitLab runner, ни Docker-образ (журнал выше получен с ПК с Windows и Python 3.14, а не из
python:3.12-slim). Блокrulesиchangesбыл только разобран как YAML; GitLab его не вычислял. Пакет требует Python 3.8 или новее.
Стоящие внимания параметры
Считать устаревшие ключи ошибкой
--strictтакже выдает ошибку, когда в переводе есть ключи, которых больше нет в исходном файле.Сохраняйте названия брендов как написано
--glossary 'KAERIS,GitHub'приведет к сбою цели, которая упустила один из терминов. Тот же список может находиться в разделеkeepвkaeris.json.Другая структура файлов
--out— это папка с переводами, а--pattern '{lang}/common.json'— их имена файлов. По умолчанию: структура, которую записываетkaeris translate.Без флагов вообще
При наличии файла
kaeris.jsonв проекте (kaeris initзаписывает его),kaeris checkберет исходный файл, языки и папку из него.
Вопросы
Нужен ли API-ключ или учетная запись?
Нет. kaeris check описан в своей справке как статический, локальный и не требующий API, поэтому задаче не нужен секрет. Перевод — это отдельная команда, которая требует ключ.
Что обнаруживает проверка?
Потерянный или выдуманный плейсхолдер ({name}, %s, {{x}}, ICU plurals), отсутствующий ключ и отсутствующий файл локали. Сравнение локальное и статическое. Что проверяется, со всеми флагами
Можно ли сохранить результат в файл?
Да: --json выводит результат в формате JSON, а --sarif PATH записывает отчет SARIF. Добавьте файл в раздел artifacts, если хотите его сохранить. Оба флага есть в справке kaeris check; мы не запускали загрузку артефактов в GitLab.
Продолжайте
Другие рецепты: GitHub Actions · pre-commit · Make и npm скрипты
Справочник по CLI · Справочник по проверке · Справочник по GitHub Action · Бесплатная проверка в браузере · Перевод в браузере