Валидатор i18n
Проверяйте файлы перевода на отсутствующие ключи, нарушенные заполнители и несогласованные формы множественного числа. Одна команда. 9 проверок. 32 формата. Без настройки.
Проблема
Проблемы с переводами незаметны, пока с ними не столкнутся пользователи. При отсутствии ключа вместо настоящего текста отображается исходный путь вроде "settings.billing.title". Нарушенный заполнитель выводит "{price}" как обычный текст вместо «9,99 $». Неправильно сформированная форма множественного числа вызывает аварийное завершение при нулевом количестве. Эти ошибки проходят проверку кода, потому что никто не сравнивает вручную 15 файлов локалей.
Missing keys
Blank text or key paths shown to users
Broken placeholders
{price} displays as literal text instead of $9.99
Orphaned files
Outdated translations confuse the build system
Malformed files
Runtime crashes when users switch languages
Решение
i18n-validate сканирует все Ваши файлы перевода за один проход. Он автоматически определяет структуру каталогов и формат файлов, сравнивает каждый язык с эталоном и точно сообщает, что и где неверно. Без плагинов, конфигурации и специального тестового кода.
| Check | Severity | What it catches |
|---|---|---|
| missing-keys | error | Key exists in reference but is absent in a translation |
| extra-keys | error | Key exists in translation but not in the reference |
| placeholders | error | {price}, {{name}}, %s differ between languages |
| plural-structure | error | Plural forms are malformed or missing required categories |
| missing-languages | error | Expected language has no files or directory |
| orphaned-languages | error | Language files exist but are not in the expected list |
| parse-errors | error | File fails to parse (broken JSON, XML, YAML, etc.) |
| empty-values | warning | Key is present but the translation is an empty string |
| untranslated | warning | Translation is identical to the reference language |
i18n-validate v0.1.0 — validating ./locales
Reference: en (2 files: translation.json, apiTester.json)
Languages: de, ja, fr, es, zh-Hans, pt-BR, ko (7 found, 7 expected)
Layout : directory (auto-detected)
Formats : i18next JSON (auto-detected)
────────────────────────────────────────────────
ERRORS (5)
✗ missing-keys │ translation.json
Key "settings.billing.title"
missing in: ja, ko
✗ placeholders │ translation.json
Key "pricing.total" — expected: {price}, {currency}
de: found {price} only — missing {currency}
────────────────────────────────────────────────
WARNINGS (2)
⚠ empty-values │ translation.json
Key "onboarding.step3.hint"
empty in: de, fr
────────────────────────────────────────────────
5 errors, 2 warnings across 7 languages
✗ Validation failedУстановка
Установите как глобальный инструмент CLI с помощью предпочитаемого менеджера пакетов. Пакет npm включает нативный двоичный файл Rust, поэтому компиляция и зависимости среды выполнения не требуются.
npm install -g @i18n-agent/i18n-validateИспользование
Укажите инструменту каталог локалей. Он автоматически определит эталонный язык, структуру каталогов и формат файлов. Для большинства проектов конфигурация не требуется.
# Zero-config validation
i18n-validate ./locales
# JSON output for scripting
i18n-validate ./locales --format json | jq '.summary'
# CI/CD with JUnit XML
i18n-validate ./locales --format junit -o i18n-report.xmlИнтеграция CI/CD
Добавьте проверку переводов в конвейер запросов на слияние. Инструмент выводит JUnit XML, который интегрируется с отчётами о тестах GitHub Actions, артефактами GitLab CI и любой системой CI с поддержкой JUnit.
name: Validate Translations
on:
pull_request:
paths: ['locales/**', 'public/locales/**']
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Validate translations
run: npx @i18n-agent/i18n-validate ./locales --format junit -o i18n-report.xml
- uses: dorny/test-reporter@v1
if: always()
with:
name: i18n validation
path: i18n-report.xml
reporter: java-junit--strict to also fail on warnings.Поддерживаемые форматы
Благодаря i18n-convert валидатор сразу поддерживает 32 формата файлов i18n. Плагины и конфигурация для отдельных форматов не нужны: инструмент автоматически определяет формат по расширениям и содержимому файлов.
Mobile & Desktop
Android XML, Xcode String Catalog, iOS Strings, iOS Stringsdict, Flutter ARB, Qt Linguist
Web & Frameworks
Structured JSON, i18next JSON, JSON5, HJSON, YAML (Rails), YAML (Plain), JavaScript, TypeScript, PHP/Laravel, NEON
Standards & Exchange
XLIFF 1.2, XLIFF 2.0, Gettext PO, TMX, .NET RESX, Java Properties
Data & Other
CSV, Excel (.xlsx), TOML, INI, SRT Subtitles, Markdown, Plain Text
Конфигурация
Для большинства проектов конфигурация не нужна. Если требуется управление — переопределение серьёзности проверок, задание ожидаемых языков или исключение языков в работе — создайте файл .i18n-validate.toml в корне проекта.
# .i18n-validate.toml
ref = "en"
expect = ["de", "ja", "fr", "es", "zh-Hans", "pt-BR", "ko"]
[checks]
missing-keys = "error"
extra-keys = "error"
placeholders = "error"
empty-values = "warning"
untranslated = "warning"
[languages.ko]
missing-keys = "warning" # Korean is WIP
[languages.ar]
skip = true # Exclude from validationПопробовать i18n Agent
Перетащите сюда файл перевода
JSON, YAML, PO, XML, CSV, Markdown, Properties
или нажмите, чтобы выбрать
Целевые языки