Библиотека Globalize построена как модульная система, зависящая от данных CLDR (Unicode Common Locale Data Repository). В отличие от многих облегчённых решений, она не содержит локализационных данных внутри себя, а требует их явной загрузки. Это делает инициализацию более сложной, но обеспечивает высокую точность интернационализации.
Основная идея заключается в том, что сначала подключается сама библиотека, затем загружаются данные CLDR, после чего выполняется инициализация локали и создаются форматтеры.
В современных проектах библиотека устанавливается через npm:
npm install globalize
Дополнительно почти всегда требуется установка набора данных CLDR:
npm install cldr-data
Пакет cldr-data содержит локализованные наборы чисел,
дат, валют, правил плюрализации и других региональных особенностей.
Globalize поддерживает модульный импорт. В зависимости от среды используется CommonJS или ES Modules.
import Globalize from "globalize";
import cldrData from "cldr-data";
const Globalize = require("globalize");
const cldrData = require("cldr-data");
Важно учитывать, что сам пакет Globalize не содержит данных
локализации, поэтому подключение cldr-data является
обязательным этапом.
CLDR — это база данных локализации, предоставляющая:
Globalize использует эти данные как основу. Без загрузки CLDR большинство функций библиотеки работать не будут.
Перед использованием форматирования необходимо загрузить минимально необходимый набор данных.
import likelySubtags from "cldr-data/supplemental/likelySubtags.json";
import currencyData from "cldr-data/supplemental/currencyData.json";
import numberingSystems from "cldr-data/supplemental/numberingSystems.json";
Пример для английской и русской локалей:
import enNumbers from "cldr-data/main/en/numbers.json";
import enCurrencies from "cldr-data/main/en/currencies.json";
import enCaGregorian from "cldr-data/main/en/ca-gregorian.json";
import ruNumbers from "cldr-data/main/ru/numbers.json";
import ruCurrencies from "cldr-data/main/ru/currencies.json";
import ruCaGregorian from "cldr-data/main/ru/ca-gregorian.json";
После загрузки данных они передаются в Globalize через специальный API:
Globalize.load(
likelySubtags,
currencyData,
numberingSystems,
enNumbers,
enCurrencies,
enCaGregorian,
ruNumbers,
ruCurrencies,
ruCaGregorian
);
Метод Globalize.load принимает любое количество
JSON-объектов CLDR и объединяет их в внутреннем хранилище
библиотеки.
После загрузки данных необходимо указать локаль, с которой будет работать экземпляр Globalize.
const globalizeEn = new Globalize("en");
const globalizeRu = new Globalize("ru");
Каждый экземпляр привязан к конкретной локали и использует соответствующие правила форматирования.
Базовым способом проверки корректности загрузки является форматирование числа:
const formatted = globalizeEn.numberFormatter()(1234567.89);
console.log(formatted);
Если CLDR загружен корректно, результат будет отформатирован согласно правилам локали.
В браузерных приложениях данные CLDR часто загружаются асинхронно.
async function loadCldrData() {
const [likelySubtags, numberingSystems, currencyData] = await Promise.all([
fetch("/cldr/supplemental/likelySubtags.json").then(r => r.json()),
fetch("/cldr/supplemental/numberingSystems.json").then(r => r.json()),
fetch("/cldr/supplemental/currencyData.json").then(r => r.json())
]);
Globalize.load(likelySubtags, numberingSystems, currencyData);
}
После загрузки базовых данных добавляются локальные ресурсы:
async function loadLocaleData(locale) {
const [numbers, currencies, calendar] = await Promise.all([
fetch(`/cldr/main/${locale}/numbers.json`).then(r => r.json()),
fetch(`/cldr/main/${locale}/currencies.json`).then(r => r.json()),
fetch(`/cldr/main/${locale}/ca-gregorian.json`).then(r => r.json())
]);
Globalize.load(numbers, currencies, calendar);
}
После загрузки данных создаётся экземпляр:
const globalize = new Globalize("ru");
const dateFormatter = globalize.dateFormatter({
datetime: "medium"
});
console.log(dateFormatter(new Date()));
Порядок инициализации критичен:
Globalize.loadНарушение этого порядка приводит к ошибкам форматирования или отсутствию локализационных правил.
При работе с Webpack или Vite данные CLDR могут быть импортированы напрямую:
import Globalize from "globalize";
import "cldr-data/supplemental/likelySubtags.json";
import "cldr-data/supplemental/numberingSystems.json";
import "cldr-data/supplemental/currencyData.json";
Далее выполняется единая загрузка:
Globalize.load(require("cldr-data").entireSupplemental());
Globalize.load(require("cldr-data").entireMainFor("ru"));
Такой подход увеличивает размер бандла, но упрощает инициализацию.
Без likelySubtags и numberingSystems многие
операции не могут определить корректную локаль и форматирование.
Если загружены только числа, но отсутствуют календарные данные, форматирование дат будет некорректным.
Создание new Globalize("ru") без загрузки
ru-данных приводит к падению форматтеров или возврату сырых
значений.
Внутренне Globalize работает по следующей схеме:
Это означает, что загрузка CLDR выполняется один раз, а все локали используют единый источник данных.
Для полноценной работы с числами, валютами и датами требуется следующий минимум:
likelySubtags.jsonnumberingSystems.jsoncurrencyData.jsonnumbers.json (для нужной локали)currencies.json (для нужной локали)ca-gregorian.json (для нужной локали)