CLI-инструменты экосистемы FormatJS представляют собой набор утилит
для автоматизации интернационализации приложений: извлечения сообщений,
подготовки переводов, валидации ICU-строк и сборки локализационных
артефактов. Основной пакет CLI — @formatjs/cli, который
объединяет команды для работы с сообщениями в исходном коде и
JSON-файлах переводов.
CLI-инструменты построены вокруг принципа обработки ICU Message Format строк и статического анализа кода.
Ключевые задачи:
CLI работает поверх AST (Abstract Syntax Tree), анализируя JavaScript/TypeScript код и JSX.
@formatjs/cliПакет предоставляет единый бинарный интерфейс formatjs,
включающий несколько команд.
Установка:
npm install -D @formatjs/cli
После установки доступна команда:
npx formatjs
Команда extract используется для извлечения сообщений из
исходного кода.
Базовый сценарий:
npx formatjs extract "src/**/*.{js,jsx,ts,tsx}" --out-file messages.json
defineMessages,
formatMessage, <FormattedMessage>;id, defaultMessage,
description;import { defineMessages } from 'react-intl';
const messages = defineMessages({
title: {
id: 'app.title',
defaultMessage: 'Главная страница',
description: 'Заголовок главного экрана'
}
});
{
"app.title": {
"defaultMessage": "Главная страница",
"description": "Заголовок главного экрана"
}
}
CLI поддерживает glob-выражения для точного контроля над областями анализа:
npx formatjs extract "src/components/**/*.{ts,tsx}" --out-file out.json
Возможна фильтрация:
node_modulesКоманда compile преобразует JSON переводов в
оптимизированный формат, пригодный для быстрого выполнения в
runtime.
npx formatjs compile messages.json --out-file compiled.json
На этапе компиляции:
IntlMessageFormat;CLI тесно связан с ICU Message Format, который является стандартом для интернационализации.
Пример ICU строки:
У вас {count, plural, one {# сообщение} few {# сообщения} many {# сообщений}}
CLI проверяет:
CLI включает режим проверки, предотвращающий ошибки локализации до runtime.
Пример проверки:
npx formatjs compile messages.json --ast --strict
Проверяются:
Хотя CLI и Babel-плагин решают разные задачи, они часто используются совместно.
Типичный pipeline:
CLI поддерживает масштабные репозитории с несколькими пакетами.
Особенности:
messages.json;Пример структуры:
packages/
app/
ui/
shared/
Команда:
npx formatjs extract "packages/*/src/**/*.{ts,tsx}" --out-file messages.json
CLI автоматически обрабатывает:
id;defaultMessage;При необходимости используется ручная стратегия нормализации через pre/post-processing скрипты.
CLI поддерживает несколько форматов вывода:
Пример flat-структуры:
{
"home.title": "Главная",
"home.subtitle": "Добро пожаловать"
}
Пример nested:
{
"home": {
"title": "Главная",
"subtitle": "Добро пожаловать"
}
}
CLI оптимизирован для больших кодовых баз:
В проектах с десятками тысяч сообщений основная нагрузка приходится на:
CLI используется в пайплайнах автоматизации локализации.
Типовые сценарии:
Пример CI-команды:
npx formatjs extract "src/**/*.{ts,tsx}" --out-file messages.json
npx formatjs compile messages.json --out-file compiled.json
CLI возвращает структурированные ошибки:
Пример ошибки:
Error: Missing value for placeholder "count"
at message "app.items"
CLI может быть расширен через:
Расширения позволяют адаптировать инструмент под:
CLI корректно обрабатывает TypeScript:
MessageDescriptor;Пример:
const messages: Record<string, MessageDescriptor> = {
welcome: {
id: 'welcome',
defaultMessage: 'Привет'
}
};
CLI извлекает сообщения из React JSX:
<FormattedMessage
id="button.save"
defaultMessage="Сохранить"
/>
и преобразует их в единый каталог сообщений.
CLI поддерживает различные подходы:
id → string);Каждая стратегия влияет на формат output и способ компиляции.
CLI-результаты используются вместе с:
react-intl;intl-messageformat;Intl API.Компиляция снижает overhead при выполнении форматирования строк, особенно при множественных plural и select-конструкциях.
CLI-инструменты становятся центральным звеном при росте приложения: