Проверка переводов до релиза
Работает на вашей машине, не требует ключа и ничего никуда не отправляет. Находит потерянные переменные вроде {name}, изменённые числа, отсутствующие ключи и пустые строки. При ошибках завершается с кодом 1, чтобы CI мог остановить слияние; пустая строка — только предупреждение, к коду 1 она приводит лишь с --strict.
npx kaeris check --source en.json --langs de
Python не нужен: npx запускает пакет npm на Node 18 и новее. С Python pip install kaeris даёт ту же команду kaeris check.
{
"greeting": "Hallo!",
"delete": "50 Dateien löschen",
"save": "",
"terms": "Lies unsere <b>AGB</b>"
}
✗ de: 1 placeholder mismatch(es): greeting: missing ['{name}'], added - ✗ de: 3 translation fault(s): greeting: lost placeholder {name} delete: number 50 appears in the translation but not the source delete: number 5 from the source is missing or changed in the translation ! de: 1 warning(s): save: empty translation — the source has text ✗ 1 placeholder mismatch, 3 translation faults
Исходник: {"greeting": "Hello, {name}!", "delete": "Delete 5 files", "save": "Save changes", …}
| Флаг | Значение |
|---|---|
--strict | Падать также на предупреждениях (например, на пустом переводе) и на лишних ключах, которых нет в исходнике. |
--pattern '{lang}/common.json' | Где лежат переводы. По умолчанию — там, куда их пишет translate, рядом с исходником (de.json, app_de.arb, values-de/strings.xml). |
--json | Машиночитаемый результат вместо отчета. |
--sarif kaeris.sarif | Дополнительно пишет отчёт SARIF 2.1.0 для GitHub, см. ниже. |
Исходный файл: любой из 13 форматов (JSON, YAML, .strings, .xcstrings, Markdown/MDX, .po, ARB, Android XML, CSV, XLIFF, .properties, .resx, Fluent). Коды выхода: 0 — всё чисто, 1 — найдены проблемы, 2 — неверный вызов или файл, который не удалось прочитать.
Руководства по форматам: JSON · YAML · PO · XLIFF · ARB · .strings · .xcstrings · Fluent · .properties · .resx · CSV · Markdown · Android XML
CI recipes (in English): GitHub Actions · GitLab CI · pre-commit · Make and npm scripts
Глоссарий: одно слово на термин в каждом языке
--keep оставляет слово как есть. Если термин нужно переводить, но всегда одинаково, запишите его в kaeris-glossary.json рядом с kaeris.json. translate передаёт согласованные слова модели, а check не пропускает перевод, в котором стоит другое слово.
{"terms": [
{"term": "workspace", "pos": "noun",
"note": "the shared project area, not a desk",
"translations": {"de": "Arbeitsbereich",
"fr": "espace de travail",
"ru": "рабочее пространство"}},
{"term": "KAERIS", "keep": true}
]}
→ Glossary: 1 term(s), 1 kept as is ✗ fr: 1 translation fault(s): open: glossary: "workspace" should be "espace de travail" ! ru: 1 warning(s): leave: glossary: "workspace" should be "рабочее пространство" — not found, not even as an inflected form; check this line ✗ 1 translation fault
Источник: {"open": "Open the workspace", "leave": "Leave the workspace"}. Во французском переводе стоит «bureau», в русском — «рабочей области».
Термин считается целым словом: Pro не находится в «product». Изменённая форма согласованного слова проходит. Там, где слова меняют форму или сливаются в составные (русский, польский, немецкий и другие), промах — предупреждение, а не ошибка: это ещё может быть правильная грамматика. Список слов задаёт допустимые варианты. Работает на всех тарифах, включая бесплатную демо-версию.
Находки прямо на строке в pull request
С --sarif каждая находка становится заметкой на нужной строке языкового файла, рядом с комментариями ревьюера.
- uses: kaeris-io/kaeris-action@v1
with:
mode: check
source: locales/en.json
languages: de,fr,es
sarif-file: kaeris.sarif
- uses: github/codeql-action/upload-sarif@v3
if: always()
with:
sarif_file: kaeris.sarif
"greeting": "Hallo, {name}!",
- "delete": "5 Dateien löschen",+ "delete": "50 Dateien löschen",KAERIS i18n · delete: number 5 from the source is missing or changed in the translation "save": "Änderungen speichern"
Отчёт пишется даже при чистом прогоне, потому что upload-sarif падает, если файла нет. Заметки на строках бесплатны в публичных репозиториях; в приватных нужен GitHub Advanced Security. Без него проверка всё равно работает: задача падает, а в журнале перечислены все находки.
Эту страницу перевёл KAERIS и проверил каждую строку обратным переводом. Носитель языка ещё не проверял. Оригинал на английском