Регистрация новых типов

Globalize опирается на модель расширяемых типов данных, где форматирование и парсинг значений строятся вокруг подключаемых модулей и данных CLDR. Регистрация новых типов в контексте библиотеки означает расширение набора сущностей, с которыми работает API: числовые форматы, валюты, единицы измерения, даты, сообщения и пользовательские форматы, интегрируемые через единый механизм локализации.

В основе системы лежит разделение между:

  • CLDR-данными (Unicode Common Locale Data Repository)
  • движком форматирования Globalize
  • регистрацией данных и расширений
  • функциями-обёртками (formatter/parser)

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

Ключевой принцип: тип считается зарегистрированным, если для него загружены соответствующие CLDR-фрагменты и подключены форматирующие/разбирающие функции.


Регистрация числовых типов и расширенных форматов

Базовый числовой тип в Globalize расширяется через подключение правил форматирования:

  • десятичные числа
  • проценты
  • валюты
  • компактные формы (short/long)
  • научная нотация

Регистрация нового числового представления происходит через загрузку CLDR-веток и последующее использование фабрик форматирования.

Пример структуры загрузки:

  • numbers/decimalFormats
  • numbers/symbols-numberSystem
  • numbers/currencies

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

  • numberFormatter
  • currencyFormatter
  • percentFormatter

Расширение типов чисел сводится к добавлению новых схем форматирования поверх базового числового ядра.


Регистрация валютных типов

Валютный тип в Globalize является производным от числового, но требует дополнительного слоя метаданных:

  • код валюты (ISO 4217)
  • правила округления
  • позиционирование символа
  • локализованные названия валют

Регистрация валютного типа включает:

  1. загрузку CLDR-данных валют
  2. подключение набора currencySymbols
  3. инициализацию форматтера валют

После этого появляется возможность формировать специализированные экземпляры:

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

Внутренне валютный тип рассматривается как расширение числового типа с контекстным маркером currency.


Регистрация типов единиц измерения

Поддержка единиц измерения (unit formatting) строится поверх универсального механизма plural rules и number formatting.

Тип единицы измерения включает:

  • длину (meter, kilometer)
  • массу (gram, kilogram)
  • объём (liter)
  • скорость (kilometer-per-hour)
  • цифровые единицы (byte, megabyte)

Регистрация выполняется через загрузку CLDR раздела units.

После загрузки становится доступна фабрика:

  • unitFormatter

Каждая единица измерения регистрируется как комбинация:

  • базового числа
  • типа единицы
  • локализованного шаблона

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

  • 10 + "meter" → форматируется как локализованная строка
  • plural rules определяют форму слова

Таким образом, новый unit-тип — это связка числового значения и семантического идентификатора единицы.


Регистрация типов дат и времени

Типы даты и времени являются наиболее сложными и многоуровневыми.

Система включает:

  • календарные системы
  • форматы даты (short, medium, long, full)
  • временные зоны
  • относительное время

Регистрация нового поведения даты включает:

  1. загрузку CLDR dates
  2. загрузку timeZoneNames
  3. инициализацию календарных правил

После этого доступны фабрики:

  • dateFormatter
  • dateParser
  • relativeTimeFormatter

Расширение типов дат возможно через добавление:

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

Дата в Globalize рассматривается как структура, зависящая от локали, а не фиксированный timestamp-формат.


Регистрация типов сообщений (message format)

Тип сообщений основан на ICU MessageFormat и поддерживает:

  • множественные формы (pluralization)
  • выбор по условию (select)
  • вложенные структуры

Регистрация нового message-типа происходит через:

  • загрузку CLDR plural rules
  • подключение message runtime
  • определение шаблонов сообщений

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

  • messageFormatter
  • messageParser

Сообщение становится самостоятельным типом данных, содержащим:

  • текстовые шаблоны
  • правила выбора формы
  • локализационные зависимости

Регистрация пользовательских типов через композицию

Globalize не предоставляет жёсткого API для объявления произвольных типов как в статически типизированных системах. Вместо этого используется композиция:

  • базовый formatter
  • кастомная логика преобразования
  • привязка к локали

Пользовательский тип формируется как:

  1. исходное значение
  2. функция преобразования
  3. локализованный вывод

Пример логической структуры:

  • вход: произвольный объект
  • преобразование: функция нормализации
  • форматирование: вызов number/date/unit formatter

Таким образом, регистрация нового типа превращается в создание слоя адаптации над существующими механизмами.


Внутренний механизм регистрации типов

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

1. Загрузка CLDR-данных

Без данных тип не существует в рантайме. Загрузка определяет доступные локализационные правила.

2. Инициализация фабрик

Фабрики создают замкнутые функции форматирования, привязанные к локали:

  • numberFormatter(locale)
  • dateFormatter(locale)
  • unitFormatter(locale)

3. Кэширование локализованных экземпляров

Каждый зарегистрированный тип получает:

  • кэш форматтеров
  • кэш парсеров
  • кэш локалей

Это обеспечивает повторное использование без пересборки структуры.


Расширение системы типов через плагины

Механизм расширения допускает подключение дополнительных модулей:

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

Каждый модуль регистрирует:

  • набор данных CLDR
  • фабрики форматирования
  • правила локализации

Тип считается добавленным, когда он становится доступен через стандартные API Globalize.


Взаимодействие типов между собой

Типы в системе не изолированы:

  • числа участвуют в единицах измерения
  • числа участвуют в валюте
  • даты участвуют в relative time
  • сообщения используют числа и plural rules

Регистрация нового типа часто требует:

  • повторного использования number subsystem
  • интеграции с plural rules
  • согласования с локалью

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


Итоговая модель расширения типов

Регистрация новых типов в Globalize сводится к трем уровням:

  • данные (CLDR)
  • фабрики (formatter/parser)
  • композиционные правила (integration layer)

Любой новый тип формируется как комбинация этих слоёв, а не как самостоятельная изолированная сущность.