В библиотеке Globalize локаль определяет набор правил форматирования
и парсинга данных: чисел, дат, валют, единиц измерения и текстовых
представлений. Локаль представляет собой строку вида ru,
en, fr, ru-RU,
en-US, где учитываются как язык, так и региональные
особенности.
Локаль по умолчанию — это глобальное состояние, которое используется всеми операциями форматирования и парсинга, если явно не указана иная локаль.
Globalize не содержит встроенных локализационных данных. Для работы требуется подключение CLDR (Unicode Common Locale Data Repository).
Минимальная последовательность подготовки окружения:
Пример базовой подготовки в 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, не получающие локаль явно, начинают использовать русскую локализацию.
После задания локали по умолчанию изменяется глобальный контекст библиотеки:
, для
дробной частиПример:
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 используется следующая иерархия:
Globalize.locale)В браузерной среде установка локали по умолчанию выполняется аналогично:
Globalize.locale("fr");
Однако важно учитывать:
Пример:
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()
};
}
Более строгая изоляция достигается через создание независимых окружений или использование контейнеризации контекста запроса.
Если локаль не установлена:
en как дефолтной базыТипичный симптом:
CLDR поддерживает иерархию:
ru-RU → ru → en (fallback)
Globalize использует эту структуру автоматически при наличии данных.
При изменении языка интерфейса обычно выполняется последовательность:
function switchLanguage(lang) {
Globalize.locale(lang);
renderUI();
}
Все последующие форматирования используют новую локаль, если не зафиксированы локализованные форматтеры заранее.
Смена глобальной локали может влиять на:
Оптимизация достигается через:
locale в критических
участкахЕсли локаль установлена, но данные не загружены:
Globalize.locale("de"); // но нет cldr-data/main/de
возникают некорректные форматы или fallback на английский.
В приложениях с асинхронной обработкой запросов изменение
Globalize.locale может приводить к непредсказуемым
результатам при параллельных операциях.
Форматтер, созданный до установки локали, может не отражать ожидаемый язык:
const formatter = Globalize.numberFormatter();
Globalize.locale("ru");
formatter(1000); // результат зависит от момента создания