Коды языков и локалей

В библиотеке FormatJS работа с локалями основана на стандарте BCP 47, который определяет формат языковых тегов. Локаль в этом контексте представляет собой строковый идентификатор, описывающий язык, регион, письменность и дополнительные параметры.

Языковой тег используется для выбора правил форматирования чисел, дат, времени, валют, а также для подстановки переводов сообщений и применения правил множественного числа.


Структура языкового тега (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)
  • формат чисел (разделители)
  • валюту по умолчанию
  • локальные правила отображения времени

Коды письменности (Script)

Письменность указывается, когда язык поддерживает несколько систем письма:

  • zh-Hans — упрощённый китайский
  • zh-Hant — традиционный китайский
  • sr-Cyrl — сербский кириллицей
  • sr-Latn — сербский латиницей

Script всегда пишется с заглавной буквы.


Варианты локалей

Варианты используются для тонкой настройки региональных особенностей:

  • de-CH-1996 — швейцарский немецкий с орфографией 1996 года
  • sl-rozaj — резьянский диалект словенского

Варианты применяются редко, но важны при точной локализации.


Нормализация локалей в FormatJS

FormatJS приводит локали к нормализованному виду перед использованием. Это важно для корректного сопоставления переводов и данных CLDR.

Примеры нормализации:

  • en_usen-US
  • EN-gben-GB
  • ru-ruru-RU

Нормализация включает:

  • приведение регистра
  • исправление разделителей
  • стандартизацию порядка компонентов

Поддержка локалей через Intl API

FormatJS опирается на стандартный API Intl в JavaScript. Локаль передаётся во все основные форматтеры:

  • Intl.DateTimeFormat
  • Intl.NumberFormat
  • Intl.PluralRules
  • Intl.RelativeTimeFormat

Пример:

new Intl.DateTimeFormat('ru-RU').format(new Date());

Если локаль не поддерживается, происходит fallback на ближайшую доступную.


CLDR и источники локализационных данных

FormatJS использует CLDR (Common Locale Data Repository) как базу правил локализации.

CLDR содержит:

  • правила склонения чисел
  • форматы дат и времени
  • названия месяцев и дней недели
  • валютные символы
  • правила множественного числа

Каждая локаль в FormatJS сопоставляется с набором данных CLDR.


Механизм fallback локалей

Если точная локаль недоступна, применяется цепочка fallback:

  1. fr-CA
  2. fr
  3. en (дефолт)
  4. системная локаль окружения

Это позволяет избежать отсутствия переводов или форматтеров.


Использование локалей в переводах сообщений

В FormatJS локаль определяет выбор набора сообщений:

const messages = {
  'ru-RU': {
    greeting: 'Привет',
  },
  'en-US': {
    greeting: 'Hello',
  }
};

Выбор зависит от текущей локали приложения.


Локаль и множественные формы

Правила множественного числа строго зависят от локали.

Например:

  • английский: one, other
  • русский: one, 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-US05/29/2026
  • ru-RU29.05.2026
new Intl.DateTimeFormat('ru-RU', {
  day: '2-digit',
  month: '2-digit',
  year: 'numeric'
}).format(new Date());

Сопоставление локалей и языков

Одна локаль может содержать несколько уровней совпадения:

  • точное совпадение (ru-RU)
  • базовое совпадение (ru)
  • региональное приближение (ru-KZru-RU fallback)

FormatJS использует алгоритмы сопоставления для выбора наиболее подходящего набора данных.


Ошибки при работе с локалями

Типичные проблемы:

Неправильный формат

  • russian
  • ru_RU
  • RU-ru

Такие значения не соответствуют BCP 47.


Отсутствие fallback

Если не задана базовая локаль, приложение может использовать системную, что приводит к неконсистентному интерфейсу.


Несовпадение ключей переводов

Локаль определяет набор сообщений, но отсутствие ключей приводит к пустым строкам или fallback-значениям.


Локаль и производительность

Каждая уникальная локаль создаёт отдельные экземпляры форматтеров:

  • Intl.NumberFormat
  • Intl.DateTimeFormat

Избыточное количество локалей увеличивает память и время инициализации.

Рекомендуется ограничивать список используемых локалей и загружать их динамически.


Поддержка нескольких локалей в приложении

FormatJS позволяет хранить и переключать локали динамически:

  • хранение текущей локали в состоянии приложения
  • загрузка сообщений по локали
  • переинициализация форматтеров при смене языка

Это особенно важно для мультиязычных интерфейсов с глобальной аудиторией.