Проверка переводов с pre-commit
С помощью pre-commit коммит, затрагивающий файл локали, сначала запускает kaeris check и отклоняется, если перевод потерял плейсхолдер или ключ. Это офлайн и бесплатно: без API-ключа, без аккаунта.
Эту страницу перевёл KAERIS и проверил каждую строку обратным переводом. Носитель языка ещё не проверял. Оригинал на английском
Рецепт
Хук
Сохраните его как .pre-commit-config.yaml в корне проекта. Это локальный хук: pre-commit создает свою среду и устанавливает в нее kaeris из PyPI, поэтому ничего другого устанавливать не нужно. files ограничивает его коммитами, которые добавляют что-либо в locales/.
repos:
- repo: local
hooks:
- id: kaeris-check
name: kaeris check (translations)
entry: kaeris check --source locales/en.json --langs de,fr --ci
language: python
additional_dependencies: ["kaeris==0.2.35"]
files: ^locales/
pass_filenames: false
Что он выводит при реальных запусках
Вывод kaeris 0.2.35, захваченный 27 октября 2026 г. Последняя строка каждого блока — это код выхода, который видит задача CI.
Что выводит коммит
Слева: коммит с файлами, которые в порядке. Справа: коммит с de.json, где {nam} вместо {name} и отсутствует ключ checkout; коммит отклоняется.
$ git commit -m "add locales" kaeris check (translations)..............................................Passed [main (root-commit) 96c8a87] add locales 4 files changed, 25 insertions(+) create mode 100644 .pre-commit-config.yaml create mode 100644 locales/de.json create mode 100644 locales/en.json create mode 100644 locales/fr.json exit code: 0
$ git commit -m "break de"
kaeris check (translations)..............................................Failed
- hook id: kaeris-check
- exit code: 1
✗ 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
exit code: 1
Коммит, не затрагивающий файл локали
Хук пропускается, поэтому несвязанные коммиты выполняются быстро.
$ git commit -m "readme" # nothing under locales/ is staged kaeris check (translations)..........................(no files to check)Skipped [main e82b41d] readme 1 file changed, 1 insertion(+) create mode 100644 README.md exit code: 0
Настройте его в три шага
Добавьте хук
Сохраните конфигурацию выше как
.pre-commit-config.yamlи укажите свои--sourceи--langs. Сохраните закреплённую версию и обновляйте её при апгрейде.Установите git-хук
Выполните
pip install pre-commit, а затемpre-commit installодин раз для каждого клона.Коммитьте как обычно
Коммит, который добавляет файл в
locales/, запускает проверку и отклоняется при неудаче.pre-commit run --all-filesзапускает ту же проверку по требованию, например, в CI.
Как мы это проверили
Каждая команда на этой странице была выполнена до того, как она была здесь написана. То, что не было выполнено, также перечислено.
Что было запущено
pre-commit 4.7.0 с точно такой же конфигурацией выше в новом git-репозитории:
pre-commit install, затем реальныйgit commit. Среда хука была собрана из PyPI (kaeris 0.2.35). Корректные файлы: коммит прошел. Некорректныйde.json: хук завершился с кодом выхода 1, и git отклонил коммит. Коммит без файла локализации: пропущен.Что не было запущено
CI-задача, вызывающая
pre-commit run --all-files, не была запущена на раннере. Нет опубликованного репозитория хуков для kaeris, поэтому рецепт использует локальный хук; нет строкиrepo: https://github.com/…для добавления.
Стоящие внимания параметры
Считать устаревшие ключи ошибкой
--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), отсутствующий ключ и отсутствующий файл локали. Сравнение локальное и статическое. Что проверяется, со всеми флагами
Замедляет ли это каждый коммит?
Только коммиты, которые добавляют файл, соответствующий files. Первый запуск создает среду хука, которая требует сетевого подключения; последующие запуски используют ее повторно. Мы не замеряли время, поэтому здесь нет цифр.
Продолжайте
Другие рецепты: GitHub Actions · GitLab CI · Make и npm скрипты
Справочник по CLI · Справочник по проверке · Справочник по GitHub Action · Бесплатная проверка в браузере · Перевод в браузере