Таблица соответствия локалей

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

Таблица соответствия локалей представляет собой слой абстракции между прикладным кодом и данными международных стандартов. Она решает несколько задач одновременно:

  • нормализация входных идентификаторов локалей;
  • выбор корректного набора правил форматирования;
  • обеспечение fallback-цепочек при отсутствии точного совпадения;
  • согласование различных представлений одной и той же локали.

В экосистеме FormatJS локаль рассматривается не просто как строка, а как ключ к набору поведенческих правил, которые определяют формат вывода данных в интерфейсе.

Формат идентификаторов локалей

Основой системы служат BCP 47 теги, например:

  • en
  • en-US
  • ru
  • ru-RU
  • zh-Hans
  • zh-Hant-TW

Каждый идентификатор может включать:

  • язык (language subtag);
  • скрипт (script subtag);
  • регион (region subtag);
  • расширения (extensions).

Таблица соответствия локалей учитывает не только точное совпадение, но и частичное, например:

  • en-GB → британский английский
  • en → общий английский (fallback)
  • ru → русский без региональной специфики

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

В основе данных лежит 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"
  }
}

Ключевые элементы:

  • parent — базовая локаль для fallback;
  • numbers — форматирование чисел;
  • dates — правила форматирования дат;
  • plurals — набор категорий множественного числа.

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

Базовые соответствия

Базовое соответствие локалей строится от общего к частному:

  • en → базовый английский
  • en-US → американская локализация
  • en-CA → канадская локализация
  • ru → русский язык
  • ru-KZ → региональная специфика (если задана)

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

ru-KZ → ru → en (fallback)

Fallback-механизм

Fallback в FormatJS — критический механизм, обеспечивающий устойчивость интерфейса. Он работает по принципу:

  1. попытка найти точное совпадение;
  2. попытка найти родительскую локаль;
  3. переход к дефолтной локали приложения;
  4. использование системной локали.

Пример цепочки:

fr-CA → fr → en

Fallback особенно важен при частичной локализации, когда не все переводы или правила определены.

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

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

  • приведение регистра (en-usen-US);
  • унификация разделителей (_-);
  • удаление лишних расширений при отсутствии поддержки;
  • проверка валидности BCP 47.

Нормализация позволяет избежать дублирования ключей в таблице соответствия и снижает вероятность ошибок при загрузке переводов.

Работа с plural rules

Одним из ключевых элементов таблицы является сопоставление локали с правилами множественного числа.

Intl.PluralRules предоставляет механизм определения категорий:

  • one
  • few
  • many
  • other

В таблице соответствия локалей хранится карта:

ru → [one, few, many, other]
en → [one, other]
ja → [other]

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

Числовые форматы

Числовая часть таблицы включает:

  • разделители тысяч;
  • десятичные разделители;
  • формат процентов;
  • формат валют.

Пример различий:

  • en-US: 1,234.56
  • ru-RU: 1 234,56

Эти различия фиксируются в таблице соответствия и применяются через Intl API:

ECMAScript Internationalization API

Форматы дат и времени

Таблица локалей определяет шаблоны:

  • короткая дата;
  • длинная дата;
  • полное время;
  • относительное время.

Примеры:

  • en-US: MM/DD/YYYY
  • ru-RU: DD.MM.YYYY

Также учитываются:

  • порядок компонентов;
  • разделители;
  • 12/24-часовой формат.

Интеграция с react-intl

В связке с react-intl таблица соответствия локалей используется для:

  • выбора IntlProvider;
  • передачи текущей локали в контекст;
  • управления форматированием через компоненты <FormattedMessage>, <FormattedNumber>, <FormattedDate>.

Пример логики:

<IntlProvider locale="ru-RU" messages={messages}>
  <App />
</IntlProvider>

Здесь ru-RU проходит через таблицу соответствия, где определяется:

  • набор правил чисел;
  • правила дат;
  • plural categories;
  • fallback локали.

Практическая организация таблиц

В реальных приложениях таблица соответствия локалей часто делится на уровни:

1. Базовый слой

Содержит стандартные локали (en, ru, de).

2. Региональный слой

Добавляет региональные вариации (en-GB, en-AU).

3. Пользовательский слой

Переопределения под продукт:

  • кастомные форматы дат;
  • локальные валюты;
  • специфические правила отображения.

4. Runtime слой

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

Частые ошибки

При работе с таблицей соответствия локалей возникают типичные проблемы:

  • несоответствие регистра (en-us вместо en-US);
  • отсутствие fallback-локали;
  • неполные данные CLDR;
  • дублирование ключей локалей;
  • неправильная интерпретация регионов;
  • смешивание форматов BCP 47 и кастомных обозначений.

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

Поведение при конфликте локалей

Если в системе присутствуют пересекающиеся определения, применяется приоритет:

  1. точное совпадение (ru-RU);
  2. региональная группа (ru);
  3. системная локаль;
  4. дефолт приложения.

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