Проверяйте переводы в GitHub Actions
Перевод, который теряет {name} или пропускает ключ, приводит к сбою приложения во время выполнения, и проверка редко это обнаруживает. Этот рабочий процесс запускает kaeris check для каждого pull request и окрашивает задачу в красный цвет. Он работает офлайн и бесплатно: без API-ключа, без аккаунта.
Эту страницу перевёл KAERIS и проверил каждую строку обратным переводом. Носитель языка ещё не проверял. Оригинал на английском
Рецепт
Рабочий процесс
Сохраните его как .github/workflows/i18n-check.yml. Измените source на ваш файл базового языка и languages на локали, которые вы используете.
name: i18n check
on: pull_request
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: kaeris-io/kaeris-action@v1
with:
mode: check
source: locales/en.json
languages: de,fr
Без Python: npx
Пакет npm kaeris запускает ту же проверку на Node 18 и новее; npx скачивает его сам, отдельной установки нет. В пакете только check: для перевода нужен пакет Python.
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npx kaeris check --source locales/en.json --langs de,fr
То же самое без Action
Простые шаги с Python и pip. Затем в журнале отображается каждая находка построчно вместо таблицы, которую печатает Action.
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- run: pip install kaeris
- run: kaeris check --source locales/en.json --langs de,fr --ci
Находки в точной строке pull request (необязательно)
Action также может записывать отчет SARIF; его загрузка превращает каждую находку в аннотацию в diff. Загрузка для сканирования кода бесплатна для общедоступных репозиториев; для частных требуется GitHub Advanced Security.
name: i18n check
on: pull_request
permissions:
contents: read
security-events: write
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: kaeris-io/kaeris-action@v1
with:
mode: check
source: locales/en.json
languages: de,fr
sarif-file: kaeris.sarif
- uses: github/codeql-action/upload-sarif@v3
if: always()
with:
sarif_file: kaeris.sarif
Что он выводит при реальных запусках
Вывод kaeris 0.2.35, захваченный 27 октября 2026 г. Последняя строка каждого блока — это код выхода, который видит задача CI.
Что выводит задача
Action выводит сводную таблицу для каждого языка и завершается строкой ошибки, когда что-то не так. Слева: файлы, которые в порядке. Справа: de.json с {nam} вместо {name} и отсутствующим ключом checkout.
## KAERIS i18n — CI check Placeholder-loss: **0** (should be 0). | Language | Status | Missing | Placeholder issues | Translated | |---|---|---|---|---| | de | ✓ complete | 0 | 0 | – | | fr | ✓ complete | 0 | 0 | – | _Generated from `kaeris check --json` — no fabricated numbers._ step exit=0 --- GITHUB_OUTPUT (without summary body): missing=0 placeholder-issues=0 changed=false check-exit-code=0 translate-exit-code=0
## KAERIS i18n — CI check Placeholder-loss: **1** (should be 0). Missing keys remaining: **1**. | Language | Status | Missing | Placeholder issues | Translated | |---|---|---|---|---| | de | ⚠ 1 missing, 1 placeholder issue | 1 | 1 | – | | fr | ✓ complete | 0 | 0 | – | _Generated from `kaeris check --json` — no fabricated numbers._ ::error::kaeris check found incomplete/broken translations — see the job summary for the language matrix step exit=1 --- GITHUB_OUTPUT (without summary body): missing=1 placeholder-issues=1 changed=false check-exit-code=1 translate-exit-code=0
Что печатает шаг с npx
Тот же проект, проверенный через npx: kaeris 0.2.37 из npm, пустой кэш npm и CI=true, как на чистом раннере. Первая строка — npm устанавливает пакет.
$ npx kaeris check --source locales/en.json --langs de,fr npm warn exec The following package was not found and will be installed: [email protected] ✓ de: complete & placeholder-safe ✓ fr: complete & placeholder-safe ✓ all locales complete & placeholder-safe exit code: 0
$ npx kaeris check --source locales/en.json --langs de,fr npm warn exec The following package was not found and will be installed: [email protected] ✗ 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
Настройте его в три шага
Сохраните рабочий процесс
Создайте
.github/workflows/i18n-check.ymlс рабочим процессом выше, указав своиsourceиlanguages.Откройте pull request
Отправьте ветку, которая изменяет файл локали. Задача выполняется для каждого pull request и становится красной при потере плейсхолдера или отсутствии ключа.
Сделайте проверку обязательной
В настройках репозитория добавьте задачу как обязательную проверку состояния в защите ветки. Красная задача затем блокирует слияние.
Как мы это проверили
Каждая команда на этой странице была выполнена до того, как она была здесь написана. То, что не было выполнено, также перечислено.
Что выполнилось
Скрипт шага
kaeris-io/kaeris-actionверсииv1, скопированный с GitHub 27 октября 2026 г. и запущенный в bash на тестовом проекте, с установленным CLI из PyPI (kaeris 0.2.35). Чистые файлы: код выхода 0. Неправильныйde.json: код выхода 1 и показанная выше строка ошибки.npx
npx kaeris checkиз пакета npm kaeris 0.2.37 запущен 28 октября 2026 на том же тестовом проекте, с пустым кэшем npm,CI=trueи без--yes. Чистые файлы: код выхода 0. Сломанныйde.json: код выхода 1.SARIF
Флаг
--sarifбыл запущен на неправильном проекте и записал отчет с 4 результатами; на чистых файлах он записал отчет с 0. Загрузка в GitHub не была предпринята.Что не запускалось
Сам файл рабочего процесса не запускался на раннере GitHub, как и
actions/checkout,actions/setup-python,actions/setup-nodeиupload-sarif. Синтаксис рабочих процессов выше GitHub не проверял.Какой CLI устанавливает Action
Action выполняет
pip install "kaeris>=0.2.12", поэтому задача получает последнюю доступную на тот момент версию. Если вам нужна фиксированная версия, используйте вариант с простыми шагами и закрепите ее:pip install kaeris==0.2.35.
Стоящие внимания параметры
Также выдавать ошибку при устаревших ключах
Установите
strict: trueдля Action (или--strictв простом варианте).Переводы в другой папке
Установите
out: path/to/translationsдля Action; по умолчанию он использует папку исходного файла.Сохраняйте названия брендов как написано
--glossary 'KAERIS,GitHub'приведет к сбою цели, которая упустила один из терминов. Тот же список может находиться в разделеkeepвkaeris.json.Другая структура файлов
--out— это папка с переводами, а--pattern '{lang}/common.json'— их имена файлов. По умолчанию: структура, которую записываетkaeris translate.
Вопросы
Нужен ли API-ключ или учетная запись?
Нет. kaeris check описан в своей справке как статический, локальный и не требующий API, поэтому задаче не нужен секрет. Перевод — это отдельная команда, которая требует ключ.
Какие форматы файлов он читает?
Справка по kaeris check перечисляет JSON, ARB, YAML, .strings, .xcstrings, .po, Android XML, CSV, XLIFF, .properties, .resx, Fluent и Markdown как исходные форматы (kaeris 0.2.35 и новее). Руководства по форматам
Что приводит к сбою задачи?
Код выхода kaeris check: 0 — чисто, 1 — найдена проблема, 2 — неправильное использование или файл, который он не может прочитать. Проблема, которую проверка называет красной, приводит к сбою задачи; strict также приводит к сбою устаревших ключей. Справочник по GitHub Action
Продолжайте
Другие рецепты: GitLab CI · pre-commit · Make и npm скрипты
Справочник по CLI · Справочник по проверке · Справочник по GitHub Action · Бесплатная проверка в браузере · Перевод в браузере