FormatJS опирается на унифицированную модель локализации, в которой ключевую роль играет таблица соответствия локалей. Она связывает строковые идентификаторы языков и регионов с набором правил форматирования, множественных форм, дат, чисел и валют, обеспечивая согласованное поведение приложений при переключении языка интерфейса.
Таблица соответствия локалей представляет собой слой абстракции между прикладным кодом и данными международных стандартов. Она решает несколько задач одновременно:
В экосистеме FormatJS локаль рассматривается не просто как строка, а как ключ к набору поведенческих правил, которые определяют формат вывода данных в интерфейсе.
Основой системы служат BCP 47 теги, например:
enen-USruru-RUzh-Hanszh-Hant-TWКаждый идентификатор может включать:
Таблица соответствия локалей учитывает не только точное совпадение, но и частичное, например:
en-GB → британский английскийen → общий английский (fallback)ru → русский без региональной спецификиВ основе данных лежит Unicode CLDR, содержащий:
FormatJS использует CLDR как источник истины, преобразуя его данные в
структуры, пригодные для выполнения в JavaScript через Intl
и собственные утилиты.
Таблица соответствия локалей обычно представляет собой иерархическую структуру:
localeMap = {
"en": {
parent: null,
numbers: {...},
dates: {...},
plurals: "one,other"
},
"en-GB": {
parent: "en",
numbers: {...},
dates: {...}
},
"ru": {
parent: null,
numbers: {...},
plurals: "one,few,many,other"
}
}
Ключевые элементы:
Такая структура позволяет минимизировать дублирование данных и ускорять выбор правил.
Базовое соответствие локалей строится от общего к частному:
en → базовый английскийen-US → американская локализацияen-CA → канадская локализацияru → русский языкru-KZ → региональная специфика (если задана)Если конкретная локаль отсутствует, система автоматически поднимается вверх по цепочке:
ru-KZ → ru → en (fallback)
Fallback в FormatJS — критический механизм, обеспечивающий устойчивость интерфейса. Он работает по принципу:
Пример цепочки:
fr-CA → fr → en
Fallback особенно важен при частичной локализации, когда не все переводы или правила определены.
Перед использованием локали проходят нормализацию:
en-us → en-US);_ → -);Нормализация позволяет избежать дублирования ключей в таблице соответствия и снижает вероятность ошибок при загрузке переводов.
Одним из ключевых элементов таблицы является сопоставление локали с правилами множественного числа.
Intl.PluralRules предоставляет механизм определения категорий:
onefewmanyotherВ таблице соответствия локалей хранится карта:
ru → [one, few, many, other]
en → [one, other]
ja → [other]
FormatJS использует эти данные для корректного выбора переводов в компонентах сообщений.
Числовая часть таблицы включает:
Пример различий:
en-US: 1,234.56ru-RU: 1 234,56Эти различия фиксируются в таблице соответствия и применяются через Intl API:
ECMAScript Internationalization API
Таблица локалей определяет шаблоны:
Примеры:
en-US: MM/DD/YYYYru-RU: DD.MM.YYYYТакже учитываются:
В связке с react-intl таблица соответствия локалей используется для:
IntlProvider;<FormattedMessage>,
<FormattedNumber>,
<FormattedDate>.Пример логики:
<IntlProvider locale="ru-RU" messages={messages}>
<App />
</IntlProvider>
Здесь ru-RU проходит через таблицу соответствия, где
определяется:
В реальных приложениях таблица соответствия локалей часто делится на уровни:
Содержит стандартные локали (en, ru,
de).
Добавляет региональные вариации (en-GB,
en-AU).
Переопределения под продукт:
Формируется динамически на основе загруженных переводов.
При работе с таблицей соответствия локалей возникают типичные проблемы:
en-us вместо
en-US);Особенно критична ошибка отсутствия fallback, приводящая к отображению необработанных ключей сообщений.
Если в системе присутствуют пересекающиеся определения, применяется приоритет:
ru-RU);ru);Такой порядок гарантирует предсказуемость отображения данных даже при неполной конфигурации локализационных пакетов.