Библиотека Globalize активно использует механизмы обработки локализации, чисел, дат, валют и сообщений. Одним из ключевых аспектов работы становится поведение при ошибках, отсутствии данных CLDR и некорректных параметрах. Для этого применяются строгий и нестрогий режимы обработки.
Понимание различий между ними критически важно при разработке интернационализированных приложений, поскольку ошибки локализации могут приводить как к падению приложения, так и к скрытым логическим дефектам.
Строгий режим предполагает максимально жёсткую проверку входных данных, локалей и параметров форматирования. При любой ошибке библиотека генерирует исключение.
Подобное поведение особенно полезно:
const Globalize = require("globalize");
Globalize.locale("ru");
const formatter = Globalize.numberFormatter();
console.log(formatter(12345.67));
Если CLDR-данные для ru не были загружены:
Error: E_MISSING_CLDR
В строгом режиме ошибка возникает немедленно.
Библиотека требует предварительной загрузки данных Unicode CLDR.
Например:
const Globalize = require("globalize");
Globalize.locale("fr");
const dateFormatter = Globalize.dateFormatter({
datetime: "medium"
});
Без подключения:
cldr-data/main/fr/ca-gregorian.json
cldr-data/main/fr/timeZoneNames.json
будет выброшено исключение.
Такой подход предотвращает:
В строгом режиме исключения рассматриваются как механизм контроля качества.
Типичные категории ошибок:
| Код ошибки | Описание |
|---|---|
E_MISSING_CLDR |
отсутствуют CLDR-данные |
E_INVALID_PAR_TYPE |
неверный тип параметра |
E_DEFAULT_LOCALE_NOT_DEFINED |
локаль по умолчанию не установлена |
E_UNSUPPORTED |
операция не поддерживается |
Строгий режим валидирует параметры форматтера.
const formatter = Globalize.numberFormatter({
minimumFractionDigits: 2
});
const formatter = Globalize.numberFormatter({
minimumFractionDigits: "2"
});
Результат:
Error: E_INVALID_PAR_TYPE
Библиотека требует именно число, а не строку.
Строгая обработка распространяется и на входные значения.
const formatter = Globalize.currencyFormatter("USD");
formatter("100");
Ошибка:
Error: E_INVALID_PAR_TYPE
Строковое значение недопустимо.
Правильный вариант:
formatter(100);
Нестрогий режим предполагает более мягкое поведение системы. Ошибки либо игнорируются, либо обрабатываются через fallback-механизмы.
В самой библиотеке Globalize отсутствует отдельный глобальный переключатель strict/sloppy, однако разработчик может реализовать нестрогую модель самостоятельно.
Обычно используются:
try/catch;function safeNumberFormat(value) {
try {
return Globalize.numberFormatter()(value);
} catch (e) {
return String(value);
}
}
Если форматирование невозможно:
Нестрогий режим часто строится на резервных локалях.
function setLocale(locale) {
try {
Globalize.locale(locale);
} catch (e) {
Globalize.locale("en");
}
}
Если нужная локаль отсутствует:
| Особенность | Строгий режим | Нестрогий режим |
|---|---|---|
| Ошибки | вызывают исключение | могут игнорироваться |
| Надёжность | высокая | средняя |
| Удобство пользователя | ниже при ошибках | выше |
| Контроль качества | максимальный | ограниченный |
| Поведение в production | риск падения | устойчивость выше |
Модуль сообщений особенно чувствителен к отсутствующим переводам.
const messageFormatter = Globalize.messageFormatter("welcome");
Если ключ welcome отсутствует:
Error: E_MISSING_MESSAGE_BUNDLE
Часто реализуется собственный fallback.
function translate(key) {
try {
return Globalize.messageFormatter(key)();
} catch (e) {
return key;
}
}
При отсутствии перевода:
translate("menu.profile");
результатом станет:
menu.profile
Строгий режим полезен разработчикам, но может ухудшать пользовательский опыт.
Например:
Нестрогий подход обеспечивает:
На практике обычно комбинируются оба подхода.
Используется строгая модель:
Globalize.locale("de");
Ошибки не скрываются.
Используются безопасные обёртки:
function safeCurrency(value) {
try {
return Globalize.currencyFormatter("EUR")(value);
} catch {
return value + " EUR";
}
}
В крупных приложениях форматирование часто инкапсулируется.
class I18nService {
formatNumber(value) {
try {
return Globalize.numberFormatter()(value);
} catch (e) {
console.error(e);
return value;
}
}
}
Преимущества:
Строгий режим особенно полезен при инициализации.
const likelySubtags = require(
"cldr-data/supplemental/likelySubtags.json"
);
Globalize.load(likelySubtags);
Если файл повреждён:
Error: E_MISSING_CLDR
Проблема выявляется сразу после запуска приложения.
Globalize.currencyFormatter("USD")(100);
Globalize.currencyFormatter("UNKNOWN")(100);
Ошибка:
Error: E_UNSUPPORTED
В строгом режиме это предотвращает использование несуществующих валют.
Нестрогий подход часто реализуется через фабрики.
function createSafeDateFormatter(options) {
try {
return Globalize.dateFormatter(options);
} catch (e) {
return function(value) {
return String(value);
};
}
}
Пользователь может передать:
ru-RU
ru
RU
russian
Строгий режим отвергнет некорректные значения.
try {
Globalize.locale("russian");
} catch (e) {
console.error("Некорректная локаль");
}
Перед использованием локаль часто нормализуют.
function normalizeLocale(locale) {
const supported = ["en", "ru", "de"];
if (supported.includes(locale)) {
return locale;
}
return "en";
}
Это типичная реализация нестрогой обработки.
При unit-тестировании строгая модель помогает выявлять:
test("formatter should exist", () => {
expect(() => {
Globalize.numberFormatter();
}).not.toThrow();
});
Исключения библиотеки содержат диагностическую информацию.
try {
Globalize.currencyFormatter("BAD");
} catch (e) {
console.log(e.code);
console.log(e.message);
}
Результат:
E_UNSUPPORTED
Unsupported currency code
В серверном рендеринге строгий режим особенно опасен:
Поэтому в SSR часто применяется гибридный подход:
try {
html = renderPage();
} catch (e) {
html = renderFallbackPage();
}
Graceful degradation — постепенное ухудшение функциональности без полного отказа системы.
Для локализации это означает:
function safeDate(value) {
try {
return Globalize.dateFormatter({
datetime: "short"
})(value);
} catch {
return value.toISOString();
}
}
try {
return formatter(value);
} catch {}
Проблема:
return "";
Подобный подход создаёт:
Наиболее распространённая архитектура выглядит следующим образом:
| Этап | Подход |
|---|---|
| Разработка | строгий режим |
| Unit-тесты | строгий режим |
| CI/CD | строгий режим |
| Production UI | нестрогий режим |
| Логирование | строгое |
| Fallback | обязательный |
Подход подходит:
Главная цель — абсолютная корректность локализации.
Подход используется:
Главная цель — непрерывность работы интерфейса.
Хорошей практикой считается сокрытие библиотеки за abstraction layer.
class LocalizationAdapter {
constructor(strict = false) {
this.strict = strict;
}
format(value) {
try {
return Globalize.numberFormatter()(value);
} catch (e) {
if (this.strict) {
throw e;
}
return value;
}
}
}
Такой подход позволяет: