Конфигурационные опции

Библиотека Globalize опирается на модель конфигурации, в которой поведение форматирования и парсинга данных определяется сочетанием локали, загруженных CLDR-данных и параметров, передаваемых в фабричные методы форматтеров. Архитектура построена таким образом, что большая часть настроек не является глобальными флагами в привычном смысле, а задаётся либо через контекст локали, либо через аргументы конкретного форматтера.

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

import Globalize from "globalize";

const en = new Globalize("en");
const ru = new Globalize("ru");

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

Дополнительно локаль может быть задана глобально:

Globalize.locale("ru");

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


Загрузка CLDR-данных как обязательная часть конфигурации

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

Минимальный набор включает:

  • числа
  • даты и время
  • валюты
  • языковые метаданные
import likelySubtags from "cldr-data/supplemental/likelySubtags.json";
import numbers from "cldr-data/main/ru/numbers.json";
import currencies from "cldr-data/main/ru/currencies.json";

Globalize.load(likelySubtags);
Globalize.load(numbers);
Globalize.load(currencies);

Без предварительной загрузки CLDR библиотека не сможет корректно форматировать данные, даже если локаль указана верно.

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

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

Конфигурация числового форматирования

Числовое форматирование в Globalize настраивается через фабрику numberFormatter. Параметры передаются при создании форматтера и определяют поведение вывода.

const formatter = ru.numberFormatter({
  minimumFractionDigits: 2,
  maximumFractionDigits: 2
});

Ключевые параметры:

  • minimumFractionDigits — минимальное количество знаков после запятой
  • maximumFractionDigits — максимальное количество знаков
  • round — стратегия округления (зависит от реализации ICU)
  • useGrouping — использование разделителей тысяч

Пример влияния параметров:

formatter(12345.6); // "12 345,60" для ru

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


Конфигурация валютного форматирования

Форматирование валют основано на отдельном наборе параметров, расширяющих числовую конфигурацию.

const formatCurrency = ru.currencyFormatter("RUB", {
  minimumFractionDigits: 2,
  style: "code"
});

Основные параметры:

  • currency — код валюты ISO (USD, EUR, RUB)

  • style:

    • symbol — символ валюты
    • code — текстовый код
    • name — полное название
  • minimumFractionDigits / maximumFractionDigits

  • round

Пример поведения:

formatCurrency(1500); // "1 500,00 RUB"

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


Настройка форматирования дат и времени

Форматирование дат в Globalize зависит от пресетов и пользовательских опций.

const dateFormatter = ru.dateFormatter({
  skeleton: "yMMMMd"
});

Основные способы конфигурации:

  • skeleton — абстрактный шаблон (рекомендуемый способ)
  • date — предустановленный формат (short, medium, long, full)
  • time — формат времени
  • datetime — комбинированный формат

Пример:

const f = ru.dateFormatter({ date: "long" });
f(new Date());

Преимущество skeleton-конфигурации заключается в том, что она адаптируется под локаль автоматически, не фиксируя жёсткий формат.


Конфигурация парсинга значений

Парсинг — обратная операция форматированию — также настраивается через опции фабрик.

const numberParser = ru.numberParser({
  strict: true
});

Основные параметры:

  • strict — строгая проверка соответствия формату
  • grouping — учитывать ли разделители тысяч
  • decimal — символ десятичного разделителя

Пример:

numberParser("12 345,67"); // 12345.67

В строгом режиме ввод, не соответствующий локали, будет отклонён.


Поведение локали и fallback-конфигурация

Если для указанной локали отсутствуют данные CLDR, Globalize использует fallback-цепочку. Это поведение не всегда явно конфигурируется пользователем, но определяется структурой загруженных данных.

Пример сценария:

  • загружена ru
  • отсутствует ru-Cyrl
  • система использует базовую ru

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


Конфигурация сообщений и интерполяции

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

Globalize.loadMessages({
  ru: {
    greeting: "Привет, {name}"
  }
});

Использование:

const msg = ru.messageFormatter("greeting");
msg({ name: "Иван" });

Параметры конфигурации здесь косвенные:

  • структура ключей сообщений
  • язык сообщений
  • поддержка интерполяции

Глобальные настройки загрузки и инициализации

Инициализация Globalize требует последовательного подключения компонентов CLDR. Порядок загрузки является частью конфигурационной модели.

Типичный порядок:

  1. supplemental data (likelySubtags)
  2. base locale data
  3. дополнительные наборы (currencies, numbers, dates)
  4. сообщения

Ошибка порядка приводит к невозможности построения форматтеров.


Кэширование и повторное использование конфигурации

Каждый форматтер, созданный через фабрики, кэшируется внутри экземпляра локали. Это влияет на конфигурационную модель:

  • повторный вызов с одинаковыми параметрами не создаёт новый объект
  • параметры считаются частью сигнатуры кэша
  • производительность зависит от стабильности конфигурации
const f1 = ru.numberFormatter({ minimumFractionDigits: 2 });
const f2 = ru.numberFormatter({ minimumFractionDigits: 2 });

f1 === f2; // true (в большинстве реализаций)

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

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

  • тип календаря (Gregorian по умолчанию)
  • система счисления (latn, arab и др.)
  • формат группировки чисел
  • порядок отображения компонентов даты

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


Композиционная модель конфигурации

Конфигурация Globalize строится как комбинация трёх уровней:

  1. Локаль — определяет культурные правила
  2. CLDR-данные — источник форматов и правил
  3. Опции форматтеров — уточнение поведения на уровне вызова

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