Автоматизация процесса

Современная экосистема локализации в JavaScript редко ограничивается ручной работой с текстами и форматами. Библиотека FormatJS формирует подход, в котором значительная часть процессов интернационализации переводится в автоматический конвейер: извлечение сообщений, синхронизация переводов, проверка целостности ключей, генерация артефактов и интеграция в сборку приложения.

Автоматизация в контексте FormatJS строится вокруг нескольких взаимосвязанных слоёв: статический анализ кода, работа с CLI-инструментами, форматирование ICU-сообщений и интеграция с системой сборки. Каждый слой выполняет строго определённую роль и может быть встроен в CI/CD пайплайн.


Извлечение сообщений из кода

Основой автоматизации выступает процесс извлечения локализуемых строк. FormatJS использует парсер AST для анализа JavaScript и TypeScript-кода, выделяя конструкции defineMessages, intl.formatMessage и аналогичные вызовы.

Типовой сценарий основан на CLI-инструменте formatjs extract, который просматривает исходный код и формирует JSON-файл сообщений.

Пример команды:

formatjs extract "src/**/*.{ts,tsx,js}" --out-file messages.json

На этом этапе происходит:

  • анализ AST дерева
  • поиск ICU-совместимых сообщений
  • извлечение идентификаторов и defaultMessage
  • нормализация структуры сообщений

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


Нормализация структуры сообщений

После извлечения сообщений важным этапом становится их унификация. FormatJS требует строгой структуры:

{
  "app.title": {
    "defaultMessage": "Dashboard",
    "description": "Main page title"
  }
}

Автоматизация включает:

  • приведение ключей к единому стилю (dot notation или flat keys)
  • проверку наличия defaultMessage
  • удаление дубликатов
  • валидацию ICU-синтаксиса

ICU Message Format является центральной частью системы и требует строгого соблюдения синтаксиса:

Hello, {name}
You have {count, plural, one {1 message} other {# messages}}

Ошибки в синтаксисе выявляются автоматически при валидации через CLI или плагины сборщика.


Валидация переводов

После извлечения и распределения сообщений между языковыми файлами выполняется этап проверки целостности.

Автоматические проверки включают:

  • соответствие ключей между локалями
  • наличие всех ICU-параметров
  • отсутствие лишних или устаревших ключей
  • синтаксическую корректность plural rules

Пример структуры локали:

{
  "app.title": "Панель управления",
  "app.messages": "У вас {count, plural, one {# сообщение} few {# сообщения} many {# сообщений}}"
}

При автоматической валидации система сравнивает базовую локаль (обычно en) с целевыми переводами и выявляет расхождения.


Интеграция с системой сборки

Автоматизация в FormatJS тесно связана с инструментами сборки: Webpack, Vite, Rollup.

В Webpack используется babel-plugin-react-intl, который трансформирует сообщения на этапе транспиляции.

Пример конфигурации:

module.exports = {
  plugins: [
    [
      "react-intl",
      {
        messagesDir: "./build/messages"
      }
    ]
  ]
};

На этапе сборки происходит:

  • замена сообщений на идентификаторы
  • подготовка файлов локалей
  • генерация runtime-структур

В результате приложение получает оптимизированный набор переводов без избыточных данных.


Автоматическое форматирование ICU-сообщений

FormatJS поддерживает строгую типизацию сообщений через ICU Message Syntax. Автоматизация включает форматирование и проверку сложных выражений:

  • pluralization
  • select expressions
  • date/time formatting
  • number formatting

Пример автоматической нормализации:

Исходный вариант:

You have {count} messages

После автоматизации:

You have {count, plural, one {# message} other {# messages}}

Такая трансформация может выполняться через кастомные скрипты или линтеры, встроенные в CI.


Синхронизация с переводческими системами

В крупных проектах локализация редко хранится в репозитории вручную. FormatJS позволяет интегрировать автоматическую синхронизацию с внешними системами управления переводами.

Поддерживаемые сценарии:

  • экспорт сообщений в JSON
  • загрузка в платформу переводов
  • получение обновлённых переводов
  • автоматический merge изменений

Типовой pipeline:

  1. extract сообщений
  2. отправка в translation management system
  3. получение переведённых файлов
  4. compile и валидация

Автоматизация устраняет необходимость ручного обновления локалей.


Генерация runtime-ресурсов

После обработки переводов формируются runtime-файлы, используемые приложением. FormatJS поддерживает компиляцию сообщений в оптимизированный формат.

Пример результата:

export const messages = {
  "app.title": "Dashboard",
  "app.messages": [
    {
      type: "plural",
      value: {
        one: "# message",
        other: "# messages"
      }
    }
  ]
};

Автоматизация включает:

  • преобразование ICU в AST-подобную структуру
  • минимизацию данных
  • подготовку к быстрому выполнению в браузере

Проверка консистентности локалей

Отдельный слой автоматизации отвечает за семантическую целостность переводов.

Проверяются:

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

Пример ошибки, выявляемой автоматически:

en: {count, plural, one {...} other {...}}
ru: {count, plural, one {...}}

Такая несогласованность блокируется на этапе CI.


Автоматизация форматирования дат, чисел и валют

FormatJS опирается на стандарты Intl, которые позволяют унифицировать форматирование без ручной настройки.

Пример автоматического форматирования:

intl.formatDate(date, {
  year: "numeric",
  month: "long",
  day: "2-digit"
});

Автоматизация обеспечивает:

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

Для чисел и валют используется аналогичный механизм:

intl.formatNumber(1000, {
  style: "currency",
  currency: "USD"
});

Автоматизация через CI/CD

В современных проектах FormatJS интегрируется в pipeline непрерывной интеграции.

Типичный набор шагов:

  • запуск extraction
  • проверка ICU-сообщений
  • валидация локалей
  • сборка runtime-бандлов
  • публикация артефактов

Пример GitHub Actions шага:

- name: Extract messages
  run: npm run intl:extract

- name: Validate translations
  run: npm run intl:validate

Автоматизация позволяет блокировать сборку при нарушении структуры переводов.


Контроль версионности переводов

В больших системах переводческие файлы рассматриваются как часть версии приложения. FormatJS-подход допускает автоматическое отслеживание изменений сообщений.

Механизм включает:

  • хэширование сообщений
  • сравнение между коммитами
  • выявление устаревших ключей
  • автоматическое помечание deprecated-строк

Пример состояния:

{
  "app.title": {
    "defaultMessage": "Dashboard",
    "status": "changed"
  }
}

Генерация типизации для TypeScript

Автоматизация часто расширяется генерацией типов, чтобы исключить ошибки использования сообщений.

Пример генерируемого интерфейса:

export interface IntlMessages {
  "app.title": string;
  "app.messages": string;
}

Это позволяет:

  • проверять ключи на этапе компиляции
  • исключать несуществующие сообщения
  • повышать стабильность рефакторинга

Оптимизация размера локализационных данных

Автоматизация включает удаление неиспользуемых сообщений. Процесс tree-shaking локализации:

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

Результат — уменьшение размера финального бандла без изменения логики приложения.


Автоматическое управление fallback-локалями

FormatJS поддерживает fallback-цепочки локалей. Автоматизация определяет:

  • базовую локаль
  • резервные языки
  • порядок наследования

Пример:

ru-RU → ru → en

При отсутствии перевода система автоматически использует следующий уровень цепочки.


Логирование и диагностика локализационных ошибок

В процессе автоматизации добавляется слой телеметрии:

  • отсутствующие ключи
  • некорректные ICU-выражения
  • ошибки форматирования чисел и дат

Пример диагностического события:

Missing translation: "app.header.title" (locale: ru)

Такая информация может быть собрана в централизованной системе мониторинга.


Автоматизация в масштабируемых архитектурах

При микрофронтенд-архитектуре каждый модуль может иметь собственные локализации. FormatJS позволяет автоматизировать их объединение:

  • сбор сообщений из всех пакетов
  • дедупликация ключей
  • формирование единого словаря
  • распределение по namespace

Это позволяет поддерживать независимость модулей при общей системе переводов.