Browser DevTools интеграция

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

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


Инспекция активной локали и состояния Globalize

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

console.log("Current locale:", Globalize.locale());

При сложных сценариях мультиязычности полезно выводить не только локаль, но и цепочку fallback:

function debugLocaleChain() {
  const locale = Globalize.locale();

  console.group("Locale debug");
  console.log("Active locale:", locale);

  console.log("Likely fallback chain:", locale + " → root");
  console.groupEnd();
}

DevTools позволяет визуально группировать такие данные через console.group, что упрощает анализ переключений языка в интерфейсе.


Проверка форматирования чисел через консоль

Форматирование чисел — одна из наиболее частых точек ошибок при локализации. В Globalize поведение зависит от загруженных CLDR-данных и активного разделителя групп.

const formatNumber = Globalize.numberFormatter();

console.log(formatNumber(1234567.89));

Для DevTools-анализа полезно сравнение нескольких локалей в одном окне:

const en = Globalize("en").numberFormatter();
const de = Globalize("de").numberFormatter();
const ru = Globalize("ru").numberFormatter();

console.table([
  { locale: "en", value: en(1234567.89) },
  { locale: "de", value: de(1234567.89) },
  { locale: "ru", value: ru(1234567.89) }
]);

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


Отладка форматирования дат и времени

Форматирование дат зависит от календарных данных CLDR и часто вызывает несоответствия между окружениями.

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

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

Для анализа локальных различий полезно параллельное сравнение:

const locales = ["en", "fr", "ja", "ru"];

const result = locales.map(l => {
  const fmt = Globalize(l).dateFormatter({ datetime: "medium" });
  return {
    locale: l,
    formatted: fmt(new Date())
  };
});

console.table(result);

DevTools помогает выявлять случаи, когда отсутствует часть CLDR-данных для конкретной локали, что приводит к fallback-форматам или упрощённым шаблонам.


Контроль загруженности CLDR-данных через DevTools

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

Типичный подход — явная проверка наличия данных через диагностические вызовы:

function checkCLDRPresence() {
  try {
    const fmt = Globalize.numberFormatter();
    fmt(1000);
    console.log("Number formatting OK");
  } catch (e) {
    console.error("Number formatting failed:", e);
  }
}

При использовании модульной загрузки CLDR полезно выводить статус загрузки:

console.log("CLDR loaded:", {
  numbers: !!Globalize.cldr,
  locale: Globalize.locale()
});

В DevTools это часто комбинируется с вкладкой Network для проверки загрузки JSON-файлов CLDR.


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

DevTools используется как временная панель управления локалями. Это ускоряет тестирование UI без пересборки приложения.

window.setLocale = function(locale) {
  Globalize.locale(locale);
  console.log("Locale switched to:", locale);
};

После этого переключение выполняется напрямую:

setLocale("ru");
setLocale("de");

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


Отладка валютного форматирования

Форматирование валют требует точного соответствия CLDR-данным. DevTools помогает сравнивать символы валют и их позиционирование.

const usd = Globalize("en").currencyFormatter("USD");
const eur = Globalize("de").currencyFormatter("EUR");
const rub = Globalize("ru").currencyFormatter("RUB");

console.table([
  { currency: "USD", value: usd(1234.56) },
  { currency: "EUR", value: eur(1234.56) },
  { currency: "RUB", value: rub(1234.56) }
]);

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

console.log(usd(1.005)); // контроль банковского округления

Использование console.time для анализа производительности форматтеров

DevTools позволяет измерять стоимость создания и вызова форматтеров. Это критично при массовом рендеринге списков.

console.time("formatter-init");
const fmt = Globalize.numberFormatter();
console.timeEnd("formatter-init");

И отдельно вызов:

console.time("format-call");
fmt(1234567.89);
console.timeEnd("format-call");

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


Визуализация промежуточных данных форматирования

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

const fmt = Globalize.numberFormatter({
  minimumFractionDigits: 2,
  maximumFractionDigits: 4
});

const value = 12345.6789;

console.log({
  input: value,
  output: fmt(value),
  locale: Globalize.locale()
});

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


Мониторинг ошибок локализации через console.error

Ошибки CLDR или неправильной конфигурации часто проявляются в runtime. В DevTools важно централизовать их фиксацию.

function safeFormatNumber(value) {
  try {
    return Globalize.numberFormatter()(value);
  } catch (e) {
    console.error("Formatting error:", {
      value,
      error: e.message
    });
    return String(value);
  }
}

Такой слой позволяет не только предотвращать падение интерфейса, но и собирать статистику ошибок форматирования.


Связка DevTools и runtime-конфигурации Globalize

В сложных приложениях полезно экспонировать диагностический объект в глобальную область:

window.__i18n_debug__ = {
  locale: () => Globalize.locale(),
  formatNumber: (v) => Globalize.numberFormatter()(v),
  formatDate: (d) => Globalize.dateFormatter()(d)
};

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


Отладка конфликтов локали и состояния приложения

В SPA часто возникает рассинхронизация между UI и глобальной локалью. DevTools используется для выявления таких состояний:

function inspectI18nState() {
  console.group("i18n state");
  console.log("Global locale:", Globalize.locale());
  console.log("Timestamp:", Date.now());
  console.groupEnd();
}

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


Анализ массового форматирования в DevTools Performance

При работе с большими списками чисел или дат производительность форматирования становится критической. DevTools Performance panel позволяет фиксировать длительность операций, но дополнительная инструментализация через код усиливает точность измерений:

const fmt = Globalize.numberFormatter();

const data = Array.from({ length: 10000 }, (_, i) => i);

console.time("bulk-format");
const result = data.map(fmt);
console.timeEnd("bulk-format");

При визуализации в Performance tab часто видно, что узким местом становится не вычисление, а повторная инициализация форматтеров.


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

Устойчивость интернационализации проверяется через стресс-вызовы форматтеров:

const fmt = Globalize.dateFormatter({ datetime: "long" });

console.time("stress-test");

for (let i = 0; i < 5000; i++) {
  fmt(new Date(Date.now() + i * 1000));
}

console.timeEnd("stress-test");

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


Сводная модель отладки Globalize в браузере

Интеграция с DevTools строится вокруг трёх уровней наблюдаемости:

  • состояние локали и CLDR-данных
  • результат форматирования (числа, даты, валюты)
  • производительность массовых операций

Комбинация console.log, console.table, console.time и структурированных debug-объектов превращает браузер в полноценную среду диагностики интернационализации без внешних инструментов.