В экосистеме Globalize ключевым элементом именования выступают локали, поскольку вся модель работы библиотеки строится вокруг CLDR-данных и их строгой идентификации. Локаль задаётся строкой стандарта IETF BCP 47 и обычно имеет иерархическую структуру:
en, ru, deen-US, ru-RU,
pt-BRzh-Hans-CN,
zh-Hant-TWЕдиный формат регистра Используется стандарт:
en, ru)US, RU)Hans,
Hant)Это важно, поскольку Globalize напрямую сопоставляет идентификаторы с CLDR-наборами, где отклонение от регистра приводит к отсутствию данных.
Недопустимость произвольных модификаций Не используются кастомные разделители или расширения вида:
en_us (ошибочно)EN-us (ошибочно)enUS (ошибочно)Любые отклонения нарушают загрузку CLDR и приводят к частичному или полному отсутствию локализации.
Globalize не содержит встроенных локалей и требует явной загрузки данных CLDR. При этом важно соблюдать строгую структуру путей и файлов.
CLDR-пакеты импортируются по схеме:
cldr-data/supplemental/likelySubtagscldr-data/main/{locale}/numberscldr-data/main/{locale}/ca-gregorianЗдесь {locale} всегда соответствует строго
нормализованному идентификатору.
Имена файлов и путей соответствуют типу данных:
numbers — числовые форматыcurrencies — валютыca-gregorian — календарьtimeZoneNames — часовые поясаЕдинообразие структуры критично: любые отклонения в именах модулей приводят к невозможности корректной инициализации Globalize.
Экземпляры Globalize создаются через привязку к локали:
const Globalize = require("globalize");
const cldr = require("cldr-data");
Globalize.load(cldr);
const gEn = new Globalize("en");
const gRu = new Globalize("ru");
Используется короткий префикс + локаль:
gEngRugEnUSgPtBRglobalizeENGlobalizeEnglishg_en_us (не соответствует стилю JS в экосистеме
библиотеки)Globalize предоставляет функциональные методы, которые следуют строгой глагольной структуре.
Форматирование
formatDateformatNumberformatCurrencyformatMessageПарсинг
parseDateparseNumberparseCurrencyУтилитарные операции
cldr (доступ к данным)load (загрузка CLDR)locale (работа с локалью)Глагол + объект Методы строятся по схеме:
action + target
Примеры:
format + Dateparse + NumberЕдинообразие регистра (camelCase) Все методы строго используют lowerCamelCase:
formatCurrencyFormatCurrency,
format_currencyGlobalize использует ICU MessageFormat для локализованных строк. Здесь действуют отдельные правила именования ключей.
Ключи сообщений — это идентификаторы, которые используются для обращения к текстам:
Globalize("en").formatMessage("greeting", { name: "John" });
1. camelCase как стандарт
greetingMessageuserNamecartItemCount2. отсутствие пробелов и спецсимволов
Недопустимо:
greeting messagegreeting-messagegreeting.message3. семантическая ясность
Ключи должны отражать смысл:
errorNetworkTimeoutbuttonSubmitLabelinvoiceTotalAmountВнутри ICU-шаблонов используются именованные параметры.
userName, itemCountПример:
Hello {userName}, you have {itemCount} messages.
{u}, {n} — теряют смысл{user_name} — несоответствие camelCase{UserName} — нарушение единообразия с
JS-переменнымиGlobalize опирается на CLDR plural rules. Хотя сами категории фиксированы, их использование в коде требует строгого соответствия.
Используются стандартные CLDR-ключи:
onefewmanyotherПри хранении сообщений применяются вложенные структуры:
const messages = {
itemCount: {
one: "{count} item",
other: "{count} items"
}
};
odin,
mnogo)veryMany)Globalize использует CLDR-стандарты для валют и чисел.
Используются ISO 4217:
USDEURJPYKZTНедопустимо:
usddollarus-dollarsФорматы задаются именами, а не произвольными строками:
decimalpercentscientificПример:
g.formatNumber(1234.56, { style: "decimal" });
Интеграция Globalize в кодовую базу требует унификации переменных.
globalize — базовый импортg — сокращённый алиас (в небольших модулях)i18n — слой абстракции над Globalizeconst i18n = new Globalize("ru");
const formatted = i18n.formatDate(new Date());
globalizationglobalintlGlobalize (избыточное дублирование смысла)В архитектурах, где Globalize используется как нижний уровень, вводятся дополнительные соглашения.
i18nServicelocaleServiceformatProviderService используется для сервисовProvider — для поставщиков форматовManager — избегается как слишком абстрактный и
перегруженный терминКонфигурационные объекты следуют строгой структуре.
const i18nConfig = {
defaultLocale: "en",
supportedLocales: ["en", "ru"]
};
loc (вместо locale)defaultLocale, а не
defLocdefault_languagedefLocalelocale_listПри использовании Globalize в проектной структуре важна единая система именования файлов локализации.
locales/en.jslocales/ru.jsi18n/messages.en.jsi18n/messages.ru.jsmessages.en.js)englishMessages.jsru-RU.jsMessages_RU.jsGlobalize опирается на CLDR при форматировании дат и времени.
shortmediumlongfullg.formatDate(date, { datetime: "short" });
Эти ключи не подлежат кастомизации и должны использоваться без изменений, поскольку связаны с CLDR-структурами.
При создании обёрток над Globalize часто вводятся дополнительные функции.
formatparseUtil или Helper (ограниченно)Примеры:
formatPriceformatDateLocalizedparseUserDatedoFormatmakeDateconvertNumberToString (избыточная длина без
стандартизации)Тестовые файлы и сущности должны отражать локализацию.
globalize.formatDate.spec.jsi18n.messages.test.jsformats date in en-US localeparses number correctly for ru-RUtest1.jsglobalizeTest.jslocaleTestFinal.js