В библиотеке FormatJS работа с локалями основана на стандарте BCP 47, который определяет формат языковых тегов. Локаль в этом контексте представляет собой строковый идентификатор, описывающий язык, регион, письменность и дополнительные параметры.
Языковой тег используется для выбора правил форматирования чисел, дат, времени, валют, а также для подстановки переводов сообщений и применения правил множественного числа.
Языковой тег состоит из нескольких компонентов, разделённых дефисами:
language[-script][-region][-variant]
Каждый сегмент добавляет уточнение к локали.
Базовый компонент задаёт язык:
en — английскийru — русскийde — немецкийfr — французскийzh — китайскийЭтот элемент обязателен и всегда стоит первым.
Региональный компонент уточняет географическую или культурную специфику языка:
en-US — американский английскийen-GB — британский английскийru-RU — русский (Россия)fr-CA — французский (Канада)Регион влияет на:
MM/DD/YYYY vs
DD/MM/YYYY)Письменность указывается, когда язык поддерживает несколько систем письма:
zh-Hans — упрощённый китайскийzh-Hant — традиционный китайскийsr-Cyrl — сербский кириллицейsr-Latn — сербский латиницейScript всегда пишется с заглавной буквы.
Варианты используются для тонкой настройки региональных особенностей:
de-CH-1996 — швейцарский немецкий с орфографией 1996
годаsl-rozaj — резьянский диалект словенскогоВарианты применяются редко, но важны при точной локализации.
FormatJS приводит локали к нормализованному виду перед использованием. Это важно для корректного сопоставления переводов и данных CLDR.
Примеры нормализации:
en_us → en-USEN-gb → en-GBru-ru → ru-RUНормализация включает:
FormatJS опирается на стандартный API Intl в JavaScript.
Локаль передаётся во все основные форматтеры:
Intl.DateTimeFormatIntl.NumberFormatIntl.PluralRulesIntl.RelativeTimeFormatПример:
new Intl.DateTimeFormat('ru-RU').format(new Date());
Если локаль не поддерживается, происходит fallback на ближайшую доступную.
FormatJS использует CLDR (Common Locale Data Repository) как базу правил локализации.
CLDR содержит:
Каждая локаль в FormatJS сопоставляется с набором данных CLDR.
Если точная локаль недоступна, применяется цепочка fallback:
fr-CAfren (дефолт)Это позволяет избежать отсутствия переводов или форматтеров.
В FormatJS локаль определяет выбор набора сообщений:
const messages = {
'ru-RU': {
greeting: 'Привет',
},
'en-US': {
greeting: 'Hello',
}
};
Выбор зависит от текущей локали приложения.
Правила множественного числа строго зависят от локали.
Например:
one, otherone, few, many,
otherПример через ICU-синтаксис:
{count, plural,
one {# файл}
few {# файла}
many {# файлов}
other {# файлов}
}
Разные локали используют разные правила классификации чисел.
Региональная часть локали влияет на отображение чисел:
1,000.50 (en-US)1 000,50 (ru-RU)new Intl.NumberFormat('ru-RU').format(1234567.89);
FormatJS использует эти правила без необходимости ручной настройки.
Формат дат зависит от локали:
en-US → 05/29/2026ru-RU → 29.05.2026new Intl.DateTimeFormat('ru-RU', {
day: '2-digit',
month: '2-digit',
year: 'numeric'
}).format(new Date());
Одна локаль может содержать несколько уровней совпадения:
ru-RU)ru)ru-KZ → ru-RU
fallback)FormatJS использует алгоритмы сопоставления для выбора наиболее подходящего набора данных.
Типичные проблемы:
russianru_RURU-ruТакие значения не соответствуют BCP 47.
Если не задана базовая локаль, приложение может использовать системную, что приводит к неконсистентному интерфейсу.
Локаль определяет набор сообщений, но отсутствие ключей приводит к пустым строкам или fallback-значениям.
Каждая уникальная локаль создаёт отдельные экземпляры форматтеров:
Intl.NumberFormatIntl.DateTimeFormatИзбыточное количество локалей увеличивает память и время инициализации.
Рекомендуется ограничивать список используемых локалей и загружать их динамически.
FormatJS позволяет хранить и переключать локали динамически:
Это особенно важно для мультиязычных интерфейсов с глобальной аудиторией.