Инструменты разработчика

Экосистема FormatJS представляет собой набор библиотек и утилит, ориентированных на интернационализацию JavaScript-приложений с использованием ICU MessageFormat. Архитектура инструментов построена вокруг идеи разделения сообщений, их извлечения, компиляции и строгой типизации на этапе разработки.

Основная цель dev-инструментов — перенести максимум ошибок i18n из рантайма в этап сборки и обеспечить управляемое масштабирование переводов в больших приложениях.

Официальная документация и набор утилит доступны в рамках экосистемы: FormatJS


Архитектура инструментов разработки

Инструменты FormatJS делятся на несколько уровней:

  • извлечение сообщений из исходного кода
  • проверка и линтинг i18n-строк
  • компиляция ICU MessageFormat в оптимизированные структуры
  • генерация типов и метаданных
  • интеграция с сборщиками (Babel, TypeScript, Webpack)

Ключевая концепция — сообщение (message descriptor), которое имеет стабильный идентификатор и структуру:

{
  id: "user.greeting",
  defaultMessage: "Hello, {name}!",
  description: "Greeting message on dashboard"
}

Babel-плагины для интернационализации

Одним из центральных инструментов является Babel-плагин для обработки сообщений.

babel-plugin-react-intl

Используется для автоматического извлечения сообщений из кода на этапе транспиляции.

Основные функции:

  • поиск defineMessages, FormattedMessage, intl.formatMessage
  • извлечение сообщений в JSON-файлы
  • нормализация ID
  • проверка корректности ICU-синтаксиса

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

{
  "plugins": [
    ["formatjs", {
      "idInterpolationPattern": "[sha512:contenthash:base64:6]"
    }]
  ]
}

Особенность подхода — возможность детерминированной генерации идентификаторов, что снижает риск конфликтов переводов.


CLI-инструменты FormatJS

CLI является ядром автоматизации.

Основные команды

  • formatjs extract
  • formatjs compile
  • formatjs compile-folder

Extract (извлечение сообщений)

Команда анализирует исходный код и формирует набор сообщений:

formatjs extract "src/**/*.ts" --out-file messages.json

На выходе формируется структура:

[
  {
    "id": "user.greeting",
    "defaultMessage": "Hello, {name}!",
    "description": "Greeting message on dashboard"
  }
]

Compile (компиляция сообщений)

Команда преобразует ICU MessageFormat в оптимизированные данные:

formatjs compile messages.json --out-file compiled.json

Результат оптимизирован для быстрого выполнения в рантайме и минимизации парсинга ICU-строк.


ICU MessageFormat и валидация

Инструменты разработки FormatJS строго опираются на ICU синтаксис.

Пример сложного сообщения:

{
  id: "cart.summary",
  defaultMessage:
    "You have {itemCount, plural, one {# item} other {# items}} in your cart"
}

CLI и Babel-плагины выполняют:

  • синтаксический анализ ICU-строк
  • проверку корректности plural rules
  • валидацию вложенных выражений
  • предотвращение runtime-ошибок форматирования

ESLint-интеграция

Плагин eslint-plugin-formatjs обеспечивает статический анализ кода.

Основные правила

  • запрет inline-строк без formatMessage
  • проверка наличия id у сообщений
  • контроль ICU-синтаксиса
  • предотвращение дублирования идентификаторов
  • проверка наличия defaultMessage

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

{
  "plugins": ["formatjs"],
  "rules": {
    "formatjs/enforce-id": "error",
    "formatjs/enforce-description": "warn"
  }
}

Lint-слой критически важен для больших команд, где переводческие ключи могут теряться или конфликтовать.


TypeScript-инструменты и типобезопасность

FormatJS поддерживает строгую интеграцию с TypeScript.

Основные возможности:

  • генерация типов сообщений
  • проверка параметров ICU-выражений
  • контроль наличия переменных

Пример типизированного сообщения:

type Messages =
  | "user.greeting"
  | "cart.summary";

При использовании react-intl обеспечивается:

  • автодополнение ключей
  • проверка параметров {name}, {count}
  • предотвращение runtime mismatch

Псевдолокализация как инструмент тестирования

Одним из вспомогательных инструментов является псевдолокализация.

Она используется для выявления:

  • переполнения UI
  • некорректных шрифтов
  • неинтернационализированных строк

Пример трансформации:

Hello, user
→ [Ĥḗļļő, üšëř]

CLI позволяет генерировать псевдолокализованные файлы через pipeline компиляции сообщений.


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

Webpack

Используется loader для предварительной обработки сообщений:

  • извлечение во время сборки
  • кэширование перевода
  • инлайнинг ICU-данных

Babel pipeline

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

source code → babel-plugin-formatjs → extracted messages → compiled runtime format

Tree-shaking i18n

FormatJS позволяет минимизировать:

  • неиспользуемые сообщения
  • лишние локали
  • дублирующиеся ICU-структуры

Runtime-оптимизация

Инструменты разработки тесно связаны с рантаймом через react-intl.

Оптимизации включают:

  • предварительно скомпилированные ICU-деревья
  • кеширование formatter-ов
  • минимизацию парсинга строк
  • мемоизацию локалей

Генерация и управление переводами

FormatJS dev-tools обеспечивают работу с файлами переводов:

  • JSON-based message catalog
  • разделение по namespace
  • merge и diff утилиты

Типичный workflow:

  1. extraction из кода
  2. отправка в translation pipeline
  3. возврат локализованных JSON
  4. compile для runtime

Проверка консистентности переводов

Инструменты позволяют выявлять:

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

Пример проблемы:

// default
"You have {count} items"

// translation (error)
"Tu as {number} articles"

CLI обнаруживает несовпадение count vs number.


Расширенные инструменты и трансформеры

FormatJS включает дополнительные утилиты:

  • AST-трансформеры сообщений
  • миграционные скрипты между форматами
  • batch processing переводов
  • автоматическое нормализование ICU

AST-уровень позволяет переписывать сообщения без потери контекста, что важно при масштабных рефакторингах.


Монорепозитории и масштабирование

В больших проектах dev-инструменты FormatJS применяются в монорепозиториях:

  • единый message catalog
  • централизованный extraction pipeline
  • shared i18n utilities

Проблемы, решаемые инструментами:

  • конфликт ID между пакетами
  • дублирование переводов
  • несогласованность локалей
  • рассинхронизация UI и translation files

CI/CD интеграция

FormatJS инструменты часто включаются в пайплайны:

  • проверка ICU-синтаксиса перед merge
  • генерация сообщений на каждом PR
  • блокировка сборки при отсутствии переводов
  • автоматический diff сообщений

Пример CI шага:

formatjs extract src --out-file messages.json
git diff --exit-code messages.json

Производственные практики

Типичные практики использования dev-инструментов:

  • строгая генерация ID вместо ручных строк
  • обязательный lint на уровне pre-commit
  • разделение extraction и compilation стадий
  • хранение переводов отдельно от кода
  • автоматическая проверка ICU параметров

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