Форматы обмена: XLIFF, PO, CSV

Форматы обмена локализационными данными используются как промежуточное звено между системой управления переводами, переводчиками и приложением на JavaScript с i18next. Их задача — обеспечить переносимость строк, сохранение контекста, поддержку метаданных (комментариев, описаний, состояния перевода) и возможность автоматизированной синхронизации переводов.

В экосистеме i18next такие форматы применяются на этапах экспорта и импорта ресурсов, а не в runtime приложения. Основной формат выполнения в приложении — JSON, однако XLIFF, PO и CSV широко используются как транспортные представления данных.


В типичной i18n-пайплайне присутствуют следующие этапы:

  • извлечение ключей из исходного кода
  • формирование файла ресурсов (JSON)
  • экспорт в формат обмена для переводчиков
  • редактирование переводов вне кода
  • импорт обратно в JSON-структуру i18next

Форматы XLIFF, PO и CSV занимают промежуточный слой между JSON-ресурсами i18next и внешними инструментами локализации.

Ключевая задача этих форматов:

  • хранение исходного текста (source string)
  • хранение перевода (target string)
  • поддержка контекста и метаданных
  • стандартизация обмена между системами

XLIFF (XML Localization Interchange File Format)

XLIFF представляет собой XML-ориентированный стандарт, предназначенный для профессиональных систем локализации. Он используется в крупных проектах, где требуется строгая структура и расширенные метаданные.

Структура XLIFF

Базовая структура версии 1.2:

<xliff version="1.2">
  <file source-language="en" target-language="ru" datatype="plaintext">
    <body>
      <trans-unit id="welcome.message">
        <source>Welcome</source>
        <target>Добро пожаловать</target>
      </trans-unit>
    </body>
  </file>
</xliff>

В XLIFF 2.0 структура становится более модульной:

<xliff version="2.0">
  <file id="f1" srcLang="en" trgLang="ru">
    <unit id="welcome.message">
      <segment>
        <source>Welcome</source>
        <target>Добро пожаловать</target>
      </segment>
    </unit>
  </file>
</xliff>

Особенности применения

XLIFF поддерживает:

  • сегментацию текста
  • статусы перевода (translated, reviewed, approved)
  • комментарии разработчиков и переводчиков
  • альтернативные переводы
  • контекст (например, location в UI)

Пример с метаданными:

<trans-unit id="button.save">
  <source>Save</source>
  <target state="translated">Сохранить</target>
  <note>Кнопка сохранения формы</note>
</trans-unit>

Интеграция с i18next

В экосистеме JavaScript XLIFF чаще используется через промежуточные инструменты:

  • i18next-conv
  • локализационные платформы (Phrase, Lokalise, Crowdin)
  • кастомные конвертеры XLIFF → JSON

Типичный процесс:

  1. JSON из i18next экспортируется в XLIFF
  2. перевод выполняется в CAT-инструменте
  3. XLIFF конвертируется обратно в JSON

Преимущества

  • строгая структура данных
  • поддержка профессиональных переводческих систем
  • богатые метаданные
  • стандартизация ISO

Ограничения

  • избыточность XML
  • сложность ручного редактирования
  • необходимость конвертации для использования в i18next
  • повышенный размер файлов

PO (Portable Object, gettext)

Формат PO происходит из системы gettext и широко применяется в UNIX-подобных экосистемах. Он текстовый, компактный и ориентирован на пары ключ-значение.

Базовая структура PO

msgid "Welcome"
msgstr "Добро пожаловать"

В контексте ключей i18next:

msgid "button.save"
msgstr "Сохранить"

Заголовки файла PO

Файл содержит метаданные:

msgid ""
msgstr ""
"Project-Id-Version: app 1.0\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"

Поддержка множественных форм

PO имеет встроенную поддержку плюрализации:

msgid "item"
msgid_plural "items"
msgstr[0] "элемент"
msgstr[1] "элемента"
msgstr[2] "элементов"

Это особенно важно при интеграции с i18next, где plural rules зависят от языка и CLDR-таблиц.

Комментарии и контекст

#. Button label in form
msgid "Submit"
msgstr "Отправить"

Контекст:

msgctxt "form.button"
msgid "Submit"
msgstr "Отправить"

Использование с i18next

i18next напрямую PO не использует, однако существует ряд мостов:

  • i18next-gettext-converter
  • gettext-parser
  • кастомные loaders

Типичная схема:

PO → JSON → i18next resources

Преимущества

  • компактный и читаемый формат
  • развитая экосистема gettext
  • поддержка plural forms
  • простота редактирования

Ограничения

  • ограниченная структура метаданных
  • необходимость строгой дисциплины msgid
  • слабая типизация ключей
  • возможные конфликты контекста без msgctxt

CSV (Comma-Separated Values)

CSV представляет собой табличный формат, используемый как упрощённый способ обмена переводами. Он применяется в небольших проектах или как промежуточный экспорт для несложных систем.

Базовая структура CSV для переводов

key,en,ru
welcome.message,Welcome,Добро пожаловать
button.save,Save,Сохранить

Каждая строка соответствует ключу локализации.

Расширенный вариант с метаданными

key,source,translation,context
button.save,Save,Сохранить,Form button

Поддержка plural в CSV

CSV плохо приспособлен к сложным формам множественного числа. Обычно применяются отдельные колонки:

key,one,few,many
item,элемент,элемента,элементов

Однако такая модель не универсальна и требует адаптации под конкретную plural-логику i18next.

Интеграция с i18next

CSV используется через вспомогательные инструменты:

  • i18next-csv-backend (кастомные реализации)
  • скрипты преобразования CSV → JSON
  • сборщики локализаций

Процесс обычно включает:

  1. экспорт JSON → CSV
  2. редактирование в таблицах (Excel, Google Sheets)
  3. импорт CSV → JSON
  4. загрузка JSON в i18next

Преимущества

  • простота структуры
  • совместимость с табличными редакторами
  • удобство массового редактирования
  • низкий порог входа

Ограничения

  • отсутствие стандарта для plural rules
  • слабая поддержка контекста
  • риск нарушения структуры при редактировании
  • невозможность хранения сложных метаданных

Сравнение форматов в контексте i18next

Структурная выразительность

  • XLIFF: высокая
  • PO: средняя
  • CSV: низкая

Поддержка метаданных

  • XLIFF: полноценная
  • PO: частичная
  • CSV: минимальная

Удобство редактирования человеком

  • CSV: максимальное
  • PO: высокое
  • XLIFF: низкое

Совместимость с i18next pipeline

  • XLIFF: через конвертеры
  • PO: через gettext мосты
  • CSV: через кастомные адаптеры

Преобразование форматов в экосистеме JavaScript

В связке с i18next обычно используется слой трансформации ресурсов:

JSON → XLIFF

Используется для передачи данных в профессиональные TMS:

  • экспорт ключей
  • упаковка в trans-unit
  • сохранение namespace i18next

XLIFF → JSON

  • извлечение target
  • восстановление структуры namespaces
  • синхронизация ключей

JSON → PO

  • генерация msgid из ключей i18next
  • заполнение msgstr
  • добавление контекста

PO → JSON

  • парсинг gettext структуры
  • восстановление вложенности
  • нормализация plural форм

JSON → CSV

  • flatten структуры i18next
  • преобразование namespace.key → строка key
  • генерация колонок языков

CSV → JSON

  • парсинг таблицы
  • восстановление вложенности ключей
  • обработка конфликтов и пустых значений

Практические особенности использования с i18next

Работа с ключами

i18next использует ключевую модель:

{
  "button": {
    "save": "Save"
  }
}

В форматах обмена:

  • XLIFF: button.save → trans-unit
  • PO: msgid "button.save"
  • CSV: колонка key

Поддержка namespace

В XLIFF:

<trans-unit id="common.button.save">

В PO:

msgid "common.button.save"

В CSV:

key,common.button.save,...

Обработка plurals в i18next

i18next использует ICU-подобные правила или встроенные plural rules:

{
  "item": "{{count}} item",
  "item_plural": "{{count}} items"
}

В форматах обмена это трансформируется:

  • XLIFF: отдельные сегменты
  • PO: msgid/msgid_plural
  • CSV: отдельные колонки

Типичные проблемы при обмене форматами

Потеря контекста

CSV и частично PO не сохраняют UI-контекст, что приводит к неоднозначности переводов.

Конфликты ключей

При преобразовании JSON → PO возможны дубли msgid при неправильной нормализации namespace.

Нарушение plural logic

CSV не имеет стандарта plural rules, что требует ручной адаптации.

Кодировка и escape-символы

  • XLIFF: XML-escaping
  • PO: C-style escaping
  • CSV: кавычки и запятые

Архитектурные паттерны использования

Централизованный TMS-пайплайн

  • i18next JSON как source of truth
  • XLIFF как обмен с TMS
  • автоматическая синхронизация

Табличный workflow

  • CSV как интерфейс для переводчиков
  • JSON как runtime формат
  • регулярная синхронизация через CI

gettext-ориентированный слой

  • PO как основной формат обмена
  • JSON как runtime слой i18next
  • конвертация через gettext bridge

Роль форматов в масштабируемых i18n-системах

При росте проекта выбор формата влияет на:

  • скорость локализации
  • качество перевода
  • автоматизацию pipeline
  • интеграцию с внешними системами

XLIFF применяется в корпоративных системах, PO — в open-source и UNIX-средах, CSV — в упрощённых или административных интерфейсах.