Константы и перечисления

Локали как базовый набор фиксированных значений

В Globalize ключевым источником констант и перечислений выступают идентификаторы локалей, соответствующие стандарту BCP 47. Они формируют строго определённые строки вида:

  • en
  • en-US
  • ru
  • ru-KZ
  • zh-Hans
  • fr-CA

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

Важная особенность: локали не интерпретируются динамически. Для каждой используемой локали должны быть загружены данные CLDR (Unicode Common Locale Data Repository), иначе форматирование невозможно.


Наборы CLDR как источник перечислений

Globalize опирается на структурированные данные CLDR, которые содержат множество заранее определённых наборов значений:

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

Эти данные не являются произвольными — они представляют собой стандартизированные перечисления, одинаковые для всех приложений, использующих CLDR.


Перечисления стилей форматирования чисел

Форматирование чисел в Globalize строится на фиксированном наборе режимов, аналогичных ICU-подходу:

  • decimal
  • percent
  • currency

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

  • decimal — обычное число с локализованными разделителями
  • percent — преобразование в проценты с масштабированием
  • currency — форматирование с валютным символом или кодом

Пример использования:

Globalize("ru").numberFormatter({ style: "decimal" })(12345.67);
Globalize("ru").numberFormatter({ style: "percent" })(0.25);
Globalize("ru").numberFormatter({ style: "currency", currency: "KZT" })(12345.67);

Значения style представляют собой строго ограниченное перечисление, расширение которого невозможно без изменения спецификации CLDR.


Валютные идентификаторы как фиксированные коды

Валюты в Globalize задаются через ISO 4217 коды. Это не произвольные строки, а стандартизированное перечисление:

  • USD
  • EUR
  • KZT
  • JPY
  • GBP

Каждый код определяет:

  • символ валюты
  • правила отображения
  • формат расположения символа
  • правила округления

Пример:

Globalize("ru").formatCurrency(1000, "KZT");

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


Категории множественного числа

Одним из наиболее строго формализованных перечислений являются категории plural rules:

  • zero
  • one
  • two
  • few
  • many
  • other

Каждая локаль содержит функцию выбора формы слова на основе числа. Например, в русской локали активно используются one, few, many, тогда как английская локаль ограничивается one и other.

Пример получения категории:

Globalize("ru").plural(5); // "many"

Эти категории являются неизменяемым перечислением, определённым Unicode CLDR.


Стили форматирования дат и времени

Globalize использует фиксированный набор стилей для дат и времени:

  • short
  • medium
  • long
  • full

Каждый стиль соответствует определённому уровню детализации:

  • short — минимальный формат (например, 28.05.26)
  • medium — средний формат с текстовыми элементами
  • long — расширенное представление с названием месяца
  • full — полное представление с днём недели

Пример:

Globalize("ru").formatDate(new Date(), { date: "full" });
Globalize("ru").formatDate(new Date(), { time: "short" });

Эти значения являются строго фиксированными и не допускают произвольного расширения.


Скелеты форматирования как декларативные перечисления

Помимо стандартных стилей, CLDR определяет skeletons — декларативные шаблоны форматирования. Они представляют собой наборы признаков:

  • y — год
  • M — месяц
  • d — день
  • H — 24-часовой формат
  • h — 12-часовой формат
  • m — минуты
  • s — секунды

Skeleton-строки выступают как формализованное перечисление компонентов даты:

Globalize("ru").dateFormatter({ skeleton: "yMd" })(new Date());
Globalize("ru").dateFormatter({ skeleton: "Hm" })(new Date());

Каждый символ в skeleton имеет фиксированное значение и не интерпретируется произвольно.


Системы нумерации как фиксированные идентификаторы

В CLDR определены различные системы записи чисел:

  • latn — латинская (0–9)
  • arab — арабская-индийская
  • thai — тайская
  • deva — деванагари

Globalize использует эти идентификаторы для переключения отображения чисел:

Globalize("ar").numberFormatter({ numberingSystem: "arab" })(12345);

Каждая система нумерации представляет собой закрытое множество символов, не подлежащее изменению на уровне приложения.


Единицы измерения и их типизированные значения

Форматирование единиц измерения основано на стандартизированных перечислениях:

  • length-meter
  • length-kilometer
  • mass-kilogram
  • duration-second
  • duration-minute

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

Globalize("ru").unitFormatter({ unit: "length-kilometer" })(5);

Дополнительно применяются стили отображения:

  • short
  • long
  • narrow

Эти значения задают формат вывода, например:

  • 5 km
  • 5 kilometers
  • 5km

Режимы округления и числовые параметры

Числовые операции используют набор фиксированных параметров, которые фактически выступают как перечисления:

  • round
  • floor
  • ceil
  • truncate

Хотя в Globalize они не всегда представлены явно как отдельные enum-значения, поведение формируется через конфигурационные поля:

Globalize("ru").numberFormatter({
  minimumFractionDigits: 2,
  maximumFractionDigits: 2
});

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


Календарные сущности как структурированные наборы значений

CLDR определяет календарные компоненты, которые в Globalize используются как фиксированные идентификаторы:

  • gregory — григорианский календарь
  • islamic — исламский календарь
  • buddhist — буддийский календарь

Каждый календарь содержит собственные правила вычисления дат и представления времени.

Globalize("ru").formatDate(new Date(), { calendar: "gregory" });

Итоговая структура перечислений в библиотеке

Все перечисления Globalize можно классифицировать по источнику и области применения:

  • локали (BCP 47)
  • стили форматирования (date, number, currency)
  • валютные коды (ISO 4217)
  • категории множественного числа (CLDR plural rules)
  • системы нумерации (CLDR numbering systems)
  • единицы измерения (CLDR units)
  • календари (CLDR calendar types)
  • skeleton-форматы (ICU patterns)

Каждая группа представляет собой строго ограниченное множество значений, определяемое внешним стандартом CLDR, а не внутренней логикой приложения.