Перевести

Проверка переводов до релиза

Работает на вашей машине, не требует ключа и ничего никуда не отправляет. Находит потерянные переменные вроде {name}, изменённые числа, отсутствующие ключи и пустые строки. При ошибках завершается с кодом 1, чтобы CI мог остановить слияние; пустая строка — только предупреждение, к коду 1 она приводит лишь с --strict.

Запуск
npx kaeris check --source en.json --langs de

Python не нужен: npx запускает пакет npm на Node 18 и новее. С Python pip install kaeris даёт ту же команду kaeris check.

de.json
{
  "greeting": "Hallo!",
  "delete": "50 Dateien löschen",
  "save": "",
  "terms": "Lies unsere <b>AGB</b>"
}
Выводкод выхода 1
✗ 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 не пропускает перевод, в котором стоит другое слово.

kaeris-glossary.json
{"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}
]}
Выводкод выхода 1
→ 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 каждая находка становится заметкой на нужной строке языкового файла, рядом с комментариями ревьюера.

.github/workflows/i18n-check.yml
- 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
locales/de.json · Files changed
  "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 и проверил каждую строку обратным переводом. Носитель языка ещё не проверял. Оригинал на английском