Инспектирование загруженных данных

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

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


Основные источники данных и их роль

Globalize использует несколько типов данных CLDR:

  • числовые форматы (decimal, currency, percent)
  • правила плюрализации
  • форматы дат и времени
  • часовые пояса и локализация времени
  • языковые и региональные метаданные
  • сообщения (messages), определяемые приложением

После загрузки эти данные не хранятся как единый объект, а распределяются внутри внутреннего слоя CLDR.js, который Globalize использует как адаптер.

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

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

Проверка наличия CLDR-данных в рантайме

Globalize предоставляет доступ к внутреннему CLDR-хранилищу через интерфейс Globalize.cldr.

Globalize.locale("ru");

console.log(Globalize.cldr.attributes);

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


Инспектирование загруженных веток данных

CLDR-данные загружаются вручную через Globalize.load():

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

После загрузки можно проверить, какие части реально доступны, через обращение к внутренним структурам CLDR:

const cldr = Globalize.cldr;

console.log(cldr.main("ru"));

Если доступ к данным отсутствует, вызов приведёт к исключению. Это один из базовых способов диагностики неполной загрузки.


Диагностика ошибок через доступ к форматам

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

Проверка числовых форматов

const formatNumber = Globalize.numberFormatter();

console.log(formatNumber(123456.789));

Если отсутствуют данные numbers.json, форматирование может использовать дефолтные правила или выбросить ошибку.


Проверка валютных данных

const formatCurrency = Globalize.currencyFormatter("USD");

console.log(formatCurrency(1000));

Отсутствие currencies.json или numbers.json приводит к некорректному форматированию или fallback-поведениям.


Проверка дат и времени

const formatDate = Globalize.dateFormatter({ datetime: "medium" });

console.log(formatDate(new Date()));

Для корректной работы требуется наличие:

  • ca-gregorian
  • timeZoneNames
  • dateFields

Проверка правил множественного числа

Одним из наиболее чувствительных к данным компонентов являются plural rules.

const plural = Globalize.pluralGenerator();

console.log(plural(1));
console.log(plural(2));

Если отсутствует supplemental/plurals, функция может возвращать некорректные категории или использовать упрощённые fallback-правила (other для всех значений).


Инспекция доступных локалей

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

console.log(Globalize.locale().locale);

Смена локали:

Globalize.locale("ru");
Globalize.locale("en");

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


Проверка сообщений (messages)

Сообщения приложения подключаются отдельно:

Globalize.loadMessages({
  ru: {
    greeting: "Привет",
    farewell: "Пока"
  }
});

Инспекция доступности сообщений выполняется через их непосредственное извлечение:

const message = Globalize.messageFormatter("greeting");

console.log(message());

Если ключ отсутствует, результатом будет undefined или fallback-строка.


Глубокая проверка CLDR через API доступа

CLDR внутри Globalize можно рассматривать как дерево JSON-структур. Доступ к нему возможен через путь:

Globalize.cldr.get(["main", "ru", "numbers"]);

или через более прямые обращения:

Globalize.cldr.main("ru").numbers

Такая форма инспекции позволяет проверить:

  • наличие конкретных файлов CLDR
  • корректность структуры данных
  • полноту загрузки региональных наборов

Контроль целостности загрузки

Типичная проблема — частичная загрузка CLDR. Например, подключены числа и валюты, но отсутствуют даты. В этом случае система работает, но с ограничениями.

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

const checks = {
  number: () => Globalize.numberFormatter()(123),
  currency: () => Globalize.currencyFormatter("EUR")(123),
  date: () => Globalize.dateFormatter()(new Date()),
  plural: () => Globalize.plural(1)
};

Object.keys(checks).forEach(key => {
  try {
    console.log(key, checks[key]());
  } catch (e) {
    console.log(key, "missing data");
  }
});

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


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

Globalize не всегда явно сообщает о нехватке данных. В зависимости от типа API возможны три сценария:

  • генерация исключения при обращении к отсутствующим веткам CLDR
  • возврат fallback-значений (например, other для plural rules)
  • использование базового формата без локализации

Наиболее критичными являются отсутствующие:

  • supplemental/plurals
  • main/<locale>/numbers
  • main/<locale>/ca-gregorian

Инспекция через последовательную инициализацию

На практике загрузка данных часто разбивается на этапы, что упрощает диагностику:

Globalize.load(
  require("cldr-data/supplemental/likelySubtags")
);

Globalize.load(
  require("cldr-data/main/ru/numbers")
);

Globalize.loadMessages({
  ru: {
    hello: "Здравствуйте"
  }
});

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


Роль supplemental-данных в инспекции

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

Критические supplemental-блоки:

  • likelySubtags — определение полной локали
  • plurals — правила множественного числа
  • currencyData — метаданные валют
  • timeData — правила времени

Их отсутствие часто приводит к тому, что локаль существует формально, но не функционирует полноценно.


Косвенные признаки неполной загрузки

Инспекция часто основывается на наблюдении поведения API:

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

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


Сравнительная проверка локалей

Для диагностики можно сравнивать поведение разных локалей:

Globalize.locale("en");
const enFormatter = Globalize.numberFormatter();

Globalize.locale("ru");
const ruFormatter = Globalize.numberFormatter();

console.log(enFormatter(1000), ruFormatter(1000));

Различие в выводе подтверждает корректную загрузку локалей и их данных.

Если результаты совпадают полностью, это часто сигнализирует о fallback-режиме.


Использование инспекции в процессе разработки

Инспекция загруженных данных в Globalize фактически заменяет традиционные unit-тесты локализации. Она позволяет выявлять:

  • пропущенные CLDR-модули
  • неправильный порядок загрузки данных
  • несовместимость версий CLDR
  • отсутствие supplemental-слоёв

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