Категории CLDR

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

Категория чисел в CLDR охватывает весь спектр правил отображения числовых значений в разных локалях.

Основные элементы числовой системы

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

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

Globalize.formatNumber(12345.67);
// "12 345,67" для ru-RU

Разделители и символы

CLDR определяет набор символов, зависящих от локали:

  • десятичный разделитель
  • группировка разрядов
  • знак процента
  • символы экспоненты
  • знак бесконечности и NaN

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

Системы счисления

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

  • латинская (standard)
  • арабская-индийская
  • тайская
  • другие региональные системы

Globalize может переключать систему отображения без изменения числового значения.


Правила множественных форм (Plural Rules)

CLDR содержит правила выбора формы слова в зависимости от числа. Это одна из ключевых частей локализации.

Каждая локаль определяет категории:

  • one
  • few
  • many
  • other

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

  • ru: 1 книга, 2 книги, 5 книг
  • en: 1 book, 2 books

CLDR задаёт не слова, а правила выбора категории:

Globalize.plural(1);   // "one"
Globalize.plural(2);   // "other" (для en)

Эти правила описываются через выражения на основе диапазонов и остатков деления, а не фиксированные таблицы.


Валюты (Currencies)

Категория валют в CLDR включает:

  • символ валюты ($, €, ₽)
  • формат отображения (до/после числа)
  • правила округления
  • отображение кодов валют (USD, EUR)
  • plural forms для валют

Формат валюты

CLDR задаёт несколько шаблонов:

  • standard
  • accounting
  • short format (если применимо)

Пример:

Globalize.formatCurrency(1234.5, "RUB");
// "1 234,50 ₽"

Локальные особенности валют

Некоторые локали используют:

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

Даты и время (Date & Time)

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

Календари

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

  • gregorian
  • buddhist
  • chinese
  • islamic

Globalize опирается на CLDR для выбора календаря и форматов отображения.

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

CLDR задаёт шаблоны:

  • full
  • long
  • medium
  • short

Каждый шаблон состоит из компонентов:

  • день
  • месяц
  • год
  • часы
  • минуты
  • секунды

Пример:

Globalize.formatDate(new Date(), { datetime: "short" });

Относительное время

Категория relativeTime включает выражения:

  • “через 5 минут”
  • “2 дня назад”

CLDR хранит формы для каждого интервала и направления (future/past).


Единицы измерения (Units)

CLDR содержит правила для отображения физических величин:

  • длина (meter, kilometer)
  • масса (gram, kilogram)
  • объем (liter)
  • температура (celsius, fahrenheit)
  • скорость, время, энергия

Каждая единица имеет:

  • short form (km)
  • long form (kilometers)
  • plural rules

Пример:

Globalize.formatUnit(5, "kilometer");
// "5 kilometers"

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


Списки и пунктуация (List Patterns)

CLDR определяет правила соединения элементов списка:

  • “A, B, and C” (en)
  • “A, B и C” (ru)

Категории:

  • standard list
  • or list
  • unit list

Каждый тип списка имеет:

  • start pattern
  • middle pattern
  • end pattern

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


Имена языков, территорий и скриптов

CLDR включает локализованные названия:

  • языков (English → английский)
  • стран (Germany → Германия)
  • письменностей (Latin → латиница)

Эти данные используются для:

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

Дополнительные (supplemental) данные

Supplemental категория CLDR содержит вспомогательную информацию, которая не относится к конкретной локали напрямую.

likelySubtags

Механизм расширения неполных локалей:

  • “en” → “en-Latn-US”
  • “zh” → “zh-Hans-CN”

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

Территориальные отношения

  • группировка стран
  • экономические зоны
  • принадлежность к регионам

Мета-зоны времени

CLDR объединяет часовые пояса в логические группы:

  • Europe Central Time
  • Pacific Time
  • etc.

Это упрощает отображение временных зон пользователю.


Связь категорий CLDR и Globalize

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

Архитектура взаимодействия:

  • CLDR JSON → источник данных
  • Globalize → слой интерпретации
  • Intl (частично) → вспомогательный механизм

Категории CLDR загружаются выборочно:

  • numbers.json
  • currencies.json
  • dates.json
  • units.json
  • plurals.json

Пример загрузки:

Globalize.load(
  require("cldr-data/supplemental/likelySubtags"),
  require("cldr-data/main/ru/numbers"),
  require("cldr-data/main/ru/currencies"),
  require("cldr-data/main/ru/dates"),
  require("cldr-data/main/ru/units")
);

const ru = new Globalize("ru");

Структурная роль CLDR категорий

Каждая категория CLDR решает строго определённый класс задач:

  • числа — отображение количественных значений
  • валюты — финансовые представления
  • даты и время — временные структуры
  • units — измеримые величины
  • plurals — грамматическая согласованность
  • supplemental — нормализация и вспомогательные связи
  • lists — синтаксическое объединение данных
  • locale names — человекочитаемая локализация идентификаторов

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