Выявление проблем

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

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

Globalize("ru").numberFormatter()(1234.56);

Если отсутствуют CLDR-ноды numbers, currencies или dates, выполнение прерывается с ошибками наподобие:

  • Missing locale data for...
  • Invariant Violation
  • некорректный fallback на английскую локаль

Критические зоны загрузки данных:

  • cldr/numbers
  • cldr/ca-gregorian
  • cldr/currencies
  • cldr/timeZoneNames

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


Несоответствие локали и структуры данных

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

Globalize("pt-BR").formatDate(new Date());

Если загружен только pt, но отсутствует pt-BR, библиотека не всегда выполняет корректный fallback. Это приводит к:

  • отсутствию правил форматирования дат
  • дефолтным английским шаблонам
  • сбоям в plural rules

Ключевая проблема — отсутствие каскадной загрузки локалей по цепочке language → region → script.


Ошибки формата чисел и валют

Неверная конфигурация числовых символов или пропущенные currency-symbols приводят к некорректному отображению финансовых значений.

const formatCurrency = Globalize("de").currencyFormatter("EUR");
formatCurrency(1234.5);

Типовые сбои:

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

Источник проблемы почти всегда связан с отсутствием numbers/currencyData в CLDR.


Некорректная работа с датами и календарями

Механизм форматирования дат зависит от полной структуры календарных данных.

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

Если не загружены:

  • ca-gregorian
  • timeZoneNames

возникают следующие эффекты:

  • fallback к ISO-строке даты
  • игнорирование локализованных названий месяцев
  • потеря информации о временной зоне

Особенно часто проявляется при использовании нестандартных форматов (long, full, relative).


Проблемы с plural rules

Pluralization в Globalize зависит от CLDR-правил plurals. Их отсутствие приводит к некорректной интерпретации числовых форм.

const plural = Globalize("ru").plural(5);

При отсутствии данных:

  • возвращается other вне зависимости от числа
  • ломаются строки интерфейса
  • наблюдается несоответствие грамматических форм

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


Ошибки порядка инициализации модулей

Globalize требует строгого порядка загрузки:

  1. CLDR JSON
  2. загрузка необходимых пакетов
  3. инициализация локали
  4. создание форматтеров

Нарушение последовательности приводит к нестабильному поведению:

Globalize.load(cldrData);
Globalize("en").numberFormatter();

Если форматтер создаётся до завершения загрузки, результатом становятся:

  • невалидные кешированные функции
  • частично инициализированные объекты
  • скрытые runtime-ошибки без явных исключений

Конфликты версий CLDR и библиотеки

Несоответствие версии CLDR и версии Globalize вызывает структурные ошибки доступа к данным.

Типичные последствия:

  • отсутствующие ключи в JSON-структурах
  • изменённые пути к локализационным данным
  • несовместимость plural rules
  • сбои в currency metadata

Особенно критично при переходе между major-версиями CLDR, где меняется структура numbers и units.


Проблемы с загрузкой в браузере и Node.js

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

В браузере:

  • требуется явная загрузка JSON-файлов
  • часто используется bundler (Webpack, Vite)

В Node.js:

  • возможна загрузка через require
  • иногда возникают проблемы с ESM/CJS совместимостью
import Globalize from "globalize";
import likelySubtags from "cldr-core/supplemental/likelySubtags.json";

Ошибки проявляются как:

  • Unexpected token при импорте JSON
  • отсутствие данных из-за tree-shaking
  • частичная сборка CLDR

Проблемы с tree-shaking и сборкой

При использовании сборщиков модулей часть CLDR может быть исключена как «неиспользуемая».

Симптомы:

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

Причина — статический анализ не учитывает динамическую загрузку локалей.


Ошибки кеширования форматтеров

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

const g = Globalize("en");
const f1 = g.numberFormatter();

g.locale("fr");
const f2 = g.numberFormatter();

Возможные проблемы:

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

Несовместимость пользовательских данных и CLDR

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

Типичные ситуации:

  • ручное переопределение валютных символов
  • кастомные форматы дат, противоречащие CLDR
  • локализация UI без синхронизации с Globalize

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