Территориальные и региональные различия

Библиотека Globalize опирается на стандартизированную систему локалей, построенную вокруг CLDR (Common Locale Data Repository). Локаль представляет собой идентификатор, который описывает язык и регион в формате BCP 47, например:

  • en — английский язык без привязки к региону
  • en-US — английский (США)
  • en-GB — английский (Великобритания)
  • ru — русский язык
  • ru-RU — русский (Россия)
  • fr-CA — французский (Канада)

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

Globalize не «угадывает» региональные правила — он строго использует данные CLDR, что делает поведение предсказуемым и расширяемым.


Разделение языка и региона в локалях

Структура локали в Globalize имеет важное значение:

  • язык (language subtag) — определяет словари, грамматику, правила текста
  • регион (region subtag) — определяет формат представления данных

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

  • en-US: $1,234.56
  • en-GB: £1,234.56
  • de-DE: 1.234,56 €

Даже при одинаковом языке (например, английском) регион полностью меняет формат чисел и валют.


Региональные различия в форматировании чисел

Globalize использует CLDR-данные для определения:

  • разделителя тысяч
  • десятичного разделителя
  • группировки цифр
  • символов отрицательных чисел

Пример:

Globalize.load(cldrData);

const enUS = new Globalize("en-US");
const deDE = new Globalize("de-DE");

enUS.numberFormatter()(1234567.89); // "1,234,567.89"
deDE.numberFormatter()(1234567.89); // "1.234.567,89"

Важный аспект региональной специфики

Различия не ограничиваются символами:

  • в некоторых локалях группы цифр нестандартны (например, индийская система: 12,34,567)
  • в отдельных регионах допускаются разные правила округления отображения
  • отрицательные числа могут отображаться с разными знаками или скобками

Валюты и региональная привязка

Форматирование валют в Globalize полностью зависит от локали:

const us = new Globalize("en-US");
const jp = new Globalize("ja-JP");

us.currencyFormatter("USD")(1000);
// "$1,000.00"

jp.currencyFormatter("JPY")(1000);
// "¥1,000"

Регион определяет:

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

Различия в форматировании дат и времени

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

const us = new Globalize("en-US");
const fr = new Globalize("fr-FR");

us.dateFormatter({ datetime: "short" })(new Date());
// "5/27/26, 3:45 PM"

fr.dateFormatter({ datetime: "short" })(new Date());
// "27/05/2026 15:45"

Региональные отличия включают:

  • порядок компонентов даты (день/месяц/год)
  • 12-часовой или 24-часовой формат времени
  • разделители (точки, слэши, пробелы)
  • формат представления месяца (числом или названием)

Локализованные текстовые правила и plural rules

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

Globalize использует plural rules из CLDR:

const ru = new Globalize("ru-RU");

const plural = ru.pluralGenerator();

plural(1);  // "one"
plural(2);  // "few"
plural(5);  // "many"

Почему регион важен

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

  • pt-PT и pt-BR имеют различия в грамматике
  • ar-EG и ar-SA различаются в некоторых числовых формах
  • славянские языки используют более сложные системы множественного числа

Региональные особенности написания сообщений

Globalize поддерживает форматирование сообщений с учетом локали:

const en = new Globalize("en-US");

en.messageFormatter({
  one: "{count} item",
  other: "{count} items"
});

formatter({ count: 1 }); // "1 item"
formatter({ count: 5 }); // "5 items"

Влияние региона

Регион может влиять на:

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

Иерархия локалей и fallback-цепочки

Globalize использует механизм fallback:

  1. en-US
  2. en
  3. базовые CLDR данные

Если региональные данные отсутствуют, библиотека постепенно понижает уровень детализации.

Пример:

  • сначала ищется fr-CA
  • затем fr
  • затем общие правила французского языка

Это позволяет минимизировать разрыв при неполной локализации.


Особенности регионов с одинаковым языком

Даже при одинаковом языке регион может полностью менять поведение системы.

Английский:

  • en-US: MM/DD/YYYY, $1,234.56
  • en-GB: DD/MM/YYYY, £1,234.56
  • en-IN: 1,23,456.78 (индийская группировка)

Французский:

  • fr-FR: 1 234,56 €
  • fr-CA: 1 234,56 $ CA (другой символ валюты и порядок)

Пользовательские локали и расширения регионов

BCP 47 допускает расширения:

  • en-US-u-ca-gregory — календарь Григорианский
  • ar-EG-u-nu-arab — арабская система чисел
  • th-TH-u-nu-thai — тайские цифры

Globalize может учитывать такие расширения при наличии CLDR-данных.


Нормализация и сопоставление регионов

При обработке локалей важно учитывать:

  • регистр (en-us → en-US)
  • корректность кода региона (US, GB, RU)
  • отсутствие устаревших субтегов

Globalize нормализует локаль перед использованием, но корректность данных критична при загрузке CLDR.


Зависимость региональных различий от CLDR

Все региональные правила в Globalize происходят из CLDR:

  • форматы чисел
  • форматы дат
  • валютные правила
  • plural rules
  • именование месяцев и дней недели

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


Практические последствия выбора региона

Выбор локали влияет не только на внешний вид данных, но и на:

  • интерпретацию пользовательского ввода
  • корректность финансовых операций (например, округление)
  • UX интерфейса в международных приложениях
  • совместимость данных между системами

Неверный регион может привести к:

  • неправильному чтению дат
  • ошибкам в расчетах валют
  • некорректному отображению чисел в отчетах