В основе стратегии фолбэка в FormatJS лежит построение цепочки локалей (locale chain), по которой система пытается найти подходящее сообщение.
Типичный порядок разрешения локали:
ru-KZ)ru)en)defaultMessage (если используется
react-intl)Механизм основан на идее постепенного деградирования качества локализации без потери функциональности интерфейса.
FormatJS использует ICU MessageFormat как базовый синтаксис сообщений. Если сообщение отсутствует или некорректно определено, применяется несколько уровней восстановления.
Если ключ не найден:
defaultMessage (если задан)Пример поведения:
intl.formatMessage(
{ id: 'user.profile.title', defaultMessage: 'Profile' }
)
Если перевод отсутствует, будет использовано
defaultMessage.
defaultMessage выполняет роль встроенного фолбэка на
уровне компонента или вызова API.
Особенности:
@formatjs/cli)Пример:
formatMessage({
id: 'cart.items.count',
defaultMessage: 'Items: {count}'
}, { count: 3 })
При отсутствии перевода значение остаётся работоспособным без внешних ресурсов локализации.
В React Intl ключевая роль фолбэка задаётся через конфигурацию провайдера:
<IntlProvider locale="ru-KZ" defaultLocale="en">
Параметры:
locale — текущая локаль пользователяdefaultLocale — язык, используемый при отсутствии
переводовПри разрешении сообщений система перебирает доступные словари по приоритету локалей.
Часто встречается ситуация, когда часть ключей переведена, а часть нет. FormatJS применяет точечный фолбэк:
Это позволяет постепенно внедрять локализацию без полной готовности всех ресурсов.
ICU-конструкции могут содержать ветки other,
zero, one, few и т.д. Фолбэк
здесь встроен в сам стандарт ICU.
Пример:
{count, plural,
one {# item}
other {# items}
}
Если конкретная форма не поддерживается текущей локалью, используется
other как универсальный резервный вариант.
При ошибках форматирования (например, синтаксическая ошибка ICU):
Типичные ошибки:
{pluralFormatJS предоставляет централизованную стратегию перехвата ошибок форматирования.
const intl = createIntl({
locale: 'ru',
defaultLocale: 'en',
messages,
onError: (err) => {
console.warn(err)
}
})
Через onError реализуются стратегии:
Поведение formatMessage можно считать базовой точкой
фолбэка:
Порядок:
iddefaultMessageidВ крупных приложениях применяется агрегация сообщений:
При этом fallback работает между слоями словарей:
feature messages → base locale → default locale → defaultMessage
При использовании динамического импорта переводов возможны состояния:
Стратегии обработки:
defaultMessageFormatJS опирается на нативный Intl:
Intl.NumberFormatIntl.DateTimeFormatIntl.PluralRulesПри отсутствии поддержки локали:
Пример цепочки:
ru-KZ → ru → en-US → en
В процессе разработки применяется псевдолокализация:
Это позволяет выявлять:
При использовании runtime-режима сообщений (без предварительной компиляции):
При компиляции через CLI возможна альтернатива:
На практике применяются гибридные схемы:
locale → defaultLocale → defaultMessage → id
locale → defaultMessage → пустая строка
locale → throw error → log → id
ICU сообщения могут зависеть от параметров:
Пример:
formatMessage(
{ id: 'greeting', defaultMessage: 'Hello {name}' },
{ name: undefined }
)
Результат зависит от конфигурации — либо подстановка fallback, либо предупреждение.
При разделении переводов по чанкам:
Сценарий особенно важен для SPA с множеством языков.
Обобщённая схема приоритетов:
Эта иерархия обеспечивает непрерывность отображения интерфейса даже при частичной локализации или деградации данных.