Преобразователь i18n
Преобразуйте данные между более чем 32 форматами i18n: Android XML, iOS Strings, XLIFF, PO, JSON, YAML и другими. По возможности без потерь, а в остальных случаях — с понятными предупреждениями о потере данных.
Проблема
Каждая платформа использует свой формат перевода. Android — strings.xml. iOS — .strings и .stringsdict. Веб-приложения — JSON или YAML. Переводчикам и платформам TMS нужны XLIFF или PO. Чтобы использовать строки на нескольких платформах, приходится копировать их между форматами, писать одноразовые сценарии или вручную перестраивать файлы. Это утомительно, чревато ошибками и снова нарушается с появлением каждого нового формата.
Решение
i18n-convert — единый инструмент CLI для преобразования данных между более чем 32 форматами i18n. Он автоматически определяет входной формат, сохраняет как можно больше структуры и предупреждает, если преобразование приведёт к потере данных, например форм множественного числа в CSV.
# Auto-detect input format, convert to Android XML
i18n-convert en.json --to android-xml -o strings.xml
# iOS Strings to Gettext PO
i18n-convert Localizable.strings --to po -o messages.po
# XLIFF to Rails YAML
i18n-convert translations.xliff --to yaml-rails -o en.yml
# Pipe to stdout
i18n-convert messages.po --to jsonАвтоматическое определение
Входной формат определяется автоматически по расширению и содержимому файла. Флаги не требуются.
По возможности без потерь
Метаданные, комментарии и формы множественного числа сохраняются, если целевой формат их поддерживает.
Предупреждения о потере данных
Если при преобразовании будет потеряна информация, Вы получите явные предупреждения до записи любого файла.
Установка
Для самой простой настройки установите через npm, на macOS — через Homebrew либо соберите из исходного кода с помощью Cargo.
npm install -g @i18n-agent/i18n-convertРаспространённые преобразования
Большинству команд регулярно нужны несколько преобразований: JSON в Android XML для мобильных приложений, PO в JSON для веб-приложений, двустороннее преобразование XLIFF для передачи переводчикам. Вот несколько распространённых шаблонов.
# Convert all PO files to JSON
for f in locales/*.po; do
i18n-convert "$f" --to json -o "${f%.po}.json"
done
# Convert entire directory
i18n-convert locales/ --to json --out-dir locales-json/Поддерживаемые форматы
i18n-convert поддерживает более 32 форматов для мобильных и веб-приложений, стандартов локализации и обмена данными.
Мобильные приложения
| Format | Extension | Flag |
|---|---|---|
| Android XML | .xml | --to android-xml |
| iOS Strings | .strings | --to ios-strings |
| iOS Stringsdict | .stringsdict | --to ios-stringsdict |
| Flutter ARB | .arb | --to arb |
Веб
| Format | Extension | Flag |
|---|---|---|
| JSON (flat) | .json | --to json |
| JSON (nested) | .json | --to json-nested |
| YAML | .yml | --to yaml |
| YAML (Rails) | .yml | --to yaml-rails |
| Properties | .properties | --to properties |
Стандарты локализации
| Format | Extension | Flag |
|---|---|---|
| XLIFF 1.2 | .xlf | --to xliff |
| XLIFF 2.0 | .xlf | --to xliff-2 |
| Gettext PO | .po | --to po |
| Gettext POT | .pot | --to pot |
| TMX | .tmx | --to tmx |
| TBX | .tbx | --to tbx |
Обмен данными
| Format | Extension | Flag |
|---|---|---|
| CSV | .csv | --to csv |
| TSV | .tsv | --to tsv |
| Excel | .xlsx | --to xlsx |
Предупреждения о потере данных
Не все форматы равноценны. XLIFF поддерживает примечания, контекст и формы множественного числа, а CSV не поддерживает ничего из этого. При преобразовании богатого формата в более простой i18n-convert точно сообщает, что будет потеряно.
$ i18n-convert plurals.po --to csv
Data loss warnings:
[ERROR] 3 entries use plurals (not supported by CSV)
Proceed? [y/N]
# Skip prompts
i18n-convert plurals.po --to csv --force
# Preview warnings without writing
i18n-convert plurals.po --to csv --dry-runИнтеграция с CI
Автоматизируйте синхронизацию форматов в конвейере CI/CD. При изменении исходного файла перевода автоматически создавайте заново все производные форматы, чтобы файлы мобильных и веб-приложений и переводчиков оставались синхронизированными.
# .github/workflows/format-sync.yml
name: Sync Translation Formats
on:
push:
branches: [main]
paths: ['locales/en.json']
jobs:
sync-formats:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install i18n-convert
run: npm install -g @i18n-agent/i18n-convert
- name: Convert JSON to Android XML
run: i18n-convert locales/en.json --to android-xml -o android/res/values/strings.xml
- name: Convert JSON to iOS Strings
run: i18n-convert locales/en.json --to ios-strings -o ios/en.lproj/Localizable.strings
- name: Commit synced formats
run: |
git config user.name "github-actions"
git config user.email "[email protected]"
git add android/ ios/
git diff --cached --quiet || git commit -m "chore: sync translation formats"
git pushМожно также перевести:
Попробовать i18n Agent
Перетащите сюда файл перевода
JSON, YAML, PO, XML, CSV, Markdown, Properties
или нажмите, чтобы выбрать
Целевые языки