Библиотека FormatJS и её ключевые компоненты
(intl-messageformat, react-intl,
@formatjs/intl, CLI-инструменты) опираются на стандарт ICU
MessageFormat и API Intl в JavaScript. Это определяет
особый класс ошибок: они возникают как на этапе компиляции сообщений,
так и во время выполнения приложения.
Ошибки в FormatJS условно делятся на несколько категорий:
Intlreact-intl)Каждая категория требует собственного подхода к обработке, поскольку часть проблем выявляется статически, а часть — только в рантайме.
ICU MessageFormat является основой строк локализации в FormatJS. Любое сообщение имеет строгий синтаксис:
{count, plural, one {# item} other {# items}}
Нарушение структуры приводит к ошибкам парсинга.
Типичные причины:
plural, select,
number)other)Пример некорректного сообщения:
{count, plural, one {1 item} other {# items}
Результат — исключение парсера intl-messageformat при
инициализации сообщения.
Внутренне такие ошибки часто проявляются как:
SyntaxError в ICU parserFormatError при компиляции message ASTСтратегия обработки включает:
@formatjs/cli для проверки
синтаксисаОдной из наиболее распространённых ситуаций является отсутствие ключа перевода в выбранной локали.
В react-intl это проявляется при вызове:
intl.formatMessage({ id: "app.title" })
Если сообщение отсутствует, поведение зависит от конфигурации:
defaultMessagedefaultLocaleТиповые сценарии:
При отсутствии ключа:
[React Intl] Missing message: "app.title" for locale "ru"
Если defaultMessage не задан, результатом может
быть:
idВключение onError позволяет централизованно управлять
ошибками:
const intl = createIntl({
locale: "ru",
messages,
onError: (err) => {
console.error(err);
}
});
FormatJS активно использует параметры для чисел, дат и сложных сообщений. Ошибки возникают при несоответствии типов или отсутствующих значениях.
intl.formatNumber(value)
Проблемные случаи:
value = undefinedvalue = "abc"value = nullРезультат:
RangeErrorNaN в зависимости от реализации
Intl.NumberFormatintl.formatDate(date)
Ошибки:
DateDateInvalid DateПоведение:
RangeError: Invalid time valueICU plural rules зависят от локали. Ошибка возникает, если отсутствует обязательная форма.
Пример:
{count, plural, one {1 file}}
Отсутствует other, что делает сообщение невалидным для
большинства локалей.
Результат:
FormatJS опирается на нативный Intl API. В средах с
ограниченной поддержкой возникают критические сбои.
Старые Node.js версии или специфические окружения могут не содержать:
Intl.NumberFormatIntl.DateTimeFormatIntl.PluralRulesВ этом случае поведение:
@formatjs/intl-pluralrules,
@formatjs/intl-datetimeformat)Некоторые среды имеют частичную поддержку локалей:
ru-KZru или enЭто влияет на:
В React-интеграции ошибки часто проявляются на уровне компонентов.
Возникает при отсутствии IntlProvider:
[React Intl] Could not find required `intl` object
Причины:
Если injectIntl или useIntl используется
без провайдера:
intl равен undefinedИнструменты @formatjs/cli используются для извлечения и
проверки сообщений.
Типичные проблемы:
idПри компиляции JSON сообщений:
Единая точка перехвата ошибок:
const intl = createIntl({
locale: "ru",
messages,
onError: (err) => {
if (err.code === "MISSING_MESSAGE") {
return;
}
throw err;
}
});
Позволяет:
Типовые уровни fallback:
message iddefaultMessagebase localeCI-подход включает:
other в pluralid с кодовой базойИспользование TypeScript снижает количество ошибок:
Пример типизированных сообщений:
type Messages = {
"app.title": string;
"items.count": (count: number) => string;
};
Динамическая генерация ICU строк является источником трудноотлавливаемых проблем.
Проблемные паттерны:
Результат:
intl-messageformatПри SSR (например, Next.js) ошибки локализации особенно критичны.
Сценарии:
Подходы:
Intl на сервереДля устойчивых систем обработки ошибок применяются:
Типовые события:
translation_missingicu_syntax_errorintl_runtime_failureПри частичных сбоях система локализации может переходить в деградированный режим:
enТакой режим предотвращает полное падение интерфейса при ошибках локализации.