Установка локали по умолчанию

В библиотеке Globalize локаль определяет набор правил форматирования и парсинга данных: чисел, дат, валют, единиц измерения и текстовых представлений. Локаль представляет собой строку вида ru, en, fr, ru-RU, en-US, где учитываются как язык, так и региональные особенности.

Локаль по умолчанию — это глобальное состояние, которое используется всеми операциями форматирования и парсинга, если явно не указана иная локаль.


Инициализация Globalize и зависимость от CLDR

Globalize не содержит встроенных локализационных данных. Для работы требуется подключение CLDR (Unicode Common Locale Data Repository).

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

  1. Подключение Globalize
  2. Загрузка CLDR-данных
  3. Установка локали по умолчанию

Пример базовой подготовки в Node.js:

import Globalize from "globalize";

// загрузка CLDR данных (примерная структура)
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";
import caGregorian from "cldr-data/main/ru/ca-gregorian.json";
import timeZoneNames from "cldr-data/main/ru/timeZoneNames.json";

Globalize.load(
  likelySubtags,
  numbers,
  currencies,
  caGregorian,
  timeZoneNames
);

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


Установка локали по умолчанию

Механизм установки базовой локали реализуется через метод:

Globalize.locale(localeString);

Где localeString — идентификатор локали.

Установка русской локали

Globalize.locale("ru");

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


Поведение после установки локали

После задания локали по умолчанию изменяется глобальный контекст библиотеки:

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

Пример:

const numberFormatter = Globalize.numberFormatter();

numberFormatter(12345.67);

Результат при локали ru:

12 345,67

При локали en:

12,345.67

Изменение локали во время выполнения

Локаль не является фиксированной. Её можно изменять динамически:

Globalize.locale("en");

const formatter = Globalize.numberFormatter();
formatter(12345.67); // 12,345.67

Globalize.locale("ru");

formatter(12345.67); // 12 345,67

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


Явное указание локали в форматтерах

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

const ruFormatter = Globalize.numberFormatter({ locale: "ru" });
const enFormatter = Globalize.numberFormatter({ locale: "en" });

ruFormatter(1000.5);
enFormatter(1000.5);

В этом случае глобальная локаль не влияет на результат.


Приоритет локали

При работе Globalize используется следующая иерархия:

  1. Локаль, переданная в конкретный форматтер
  2. Глобальная локаль (Globalize.locale)
  3. Локаль, определённая браузером или окружением (если применимо и если Globalize может её определить через CLDR fallback)

Работа в браузере

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

Globalize.locale("fr");

Однако важно учитывать:

  • CLDR-данные должны быть предварительно загружены через сборщик (Webpack, Vite и др.)
  • динамическая загрузка локалей требует отдельной архитектуры (code splitting)

Пример:

async function setLocale(locale) {
  const cldrData = await import(`cldr-data/main/${locale}/numbers.json`);
  Globalize.load(cldrData);
  Globalize.locale(locale);
}

Многолокальная архитектура приложения

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

Проблема глобального состояния

Globalize.locale("ru");
// запрос пользователя A

Globalize.locale("en");
// запрос пользователя B

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


Изоляция локали в серверной среде

Для предотвращения конфликтов используется подход создания отдельных экземпляров:

const Globalize = require("globalize");

function createFormatter(locale) {
  Globalize.locale(locale);

  return {
    number: Globalize.numberFormatter(),
    date: Globalize.dateFormatter()
  };
}

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


Поведение при отсутствии локали

Если локаль не установлена:

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

Типичный симптом:

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

Fallback-цепочка локалей

CLDR поддерживает иерархию:

ru-RU → ru → en (fallback)

Globalize использует эту структуру автоматически при наличии данных.


Практика переключения локали в UI

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

function switchLanguage(lang) {
  Globalize.locale(lang);

  renderUI();
}

Все последующие форматирования используют новую локаль, если не зафиксированы локализованные форматтеры заранее.


Влияние на производительность

Смена глобальной локали может влиять на:

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

Оптимизация достигается через:

  • кэширование форматтеров по локалям
  • отказ от частой смены глобальной локали
  • использование явного параметра locale в критических участках

Ошибки и типичные проблемы

Несовпадение CLDR и локали

Если локаль установлена, но данные не загружены:

Globalize.locale("de"); // но нет cldr-data/main/de

возникают некорректные форматы или fallback на английский.


Глобальная утечка состояния

В приложениях с асинхронной обработкой запросов изменение Globalize.locale может приводить к непредсказуемым результатам при параллельных операциях.


Неинициализированные форматтеры

Форматтер, созданный до установки локали, может не отражать ожидаемый язык:

const formatter = Globalize.numberFormatter();

Globalize.locale("ru");

formatter(1000); // результат зависит от момента создания

Рекомендации по управлению локалью

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