В системах интернационализации локаль перестаёт быть произвольной строкой и рассматривается как доменно-ограниченное значение. В контексте Globalize локаль базируется на стандарте BCP 47, который задаёт формальный синтаксис языковых тегов: язык, регион, письменность и дополнительные расширения.
Строгая типизация локали означает, что:
Такой подход устраняет класс ошибок, связанных с неконсистентными или
неподдерживаемыми локалями вроде en_USA,
ru-RU-1, english, которые формально не
соответствуют спецификации.
Архитектура Globalize опирается на CLDR (Unicode Common Locale Data Repository). Это структурированный набор данных, описывающий:
Строгая типизация локалей напрямую связана с загрузкой CLDR-файлов. До момента загрузки данных конкретная локаль считается невалидной в контексте выполнения операций форматирования.
Пример концептуальной модели:
["en", "en-GB", "ru", "ru-RU"];В строгой модели локаль проходит проверку на двух уровнях:
На этом уровне проверяется:
ru, en,
de);RU, US,
GB);Пример допустимых значений:
ruru-RUen-GBzh-Hans-CNПример недопустимых:
ru_RU (неправильный разделитель)english-US (невалидный язык)ru-RU-123 (некорректное расширение)Даже корректный BCP 47 тег может быть недопустим, если:
Таким образом, тип «локаль» в Globalize становится пересечением двух множеств: валидного синтаксиса и доступных данных.
В строгой типизации локаль рассматривается как параметр функций интернационализации.
Формально:
Locale = BCP47 ∩ LoadedCLDRSetВ TypeScript-подходах, которые часто используются вместе с Globalize, это может быть выражено через union-типы:
type SupportedLocale = "en" | "en-GB" | "ru" | "ru-RU";
Или через обобщённые ограничения:
function formatNumber(locale: SupportedLocale, value: number): string;
Такой подход превращает локаль в компилируемую гарантию корректности.
Одной из ключевых особенностей Globalize является необходимость явной загрузки данных перед использованием локали.
Типовой порядок инициализации:
Если локаль не была зарегистрирована, возникает ошибка, а не автоматический fallback.
Это критически важно для строгой типизации: система не допускает «неявных» локалей.
Строгая модель предполагает, что приложение заранее фиксирует список поддерживаемых локалей.
Пример архитектурного ограничения:
Такой подход позволяет:
В слабых моделях интернационализации fallback часто происходит автоматически:
ru-RU → ru → enВ строгой модели Globalize fallback рассматривается как ошибка конфигурации.
Причины запрета:
Вместо fallback используется явная проверка:
Форматирование чисел — одна из наиболее чувствительных зон для строгой типизации.
В Globalize числовые форматы зависят от локали:
При строгой типизации:
Пример логики:
ru-RU → 1 234,56en-US → 1,234.56Любая попытка использовать неподдерживаемую локаль приводит к ошибке, а не к деградированному результату.
Работа с датами усиливает требования к типизации локалей.
Globalize использует CLDR-календарные данные, которые различаются по:
Строгая модель требует:
Пример:
ru → 28.05.2026en-GB → 28/05/2026en-US → 05/28/2026Если локаль не зарегистрирована, операция форматирования считается невозможной.
В больших приложениях локаль становится частью глобального контракта между модулями:
В строгой системе:
Globalize в таких архитектурах выполняет роль runtime-валидации поверх compile-time ограничений.
Добавление новой локали в строгой системе требует формального процесса:
Это превращает локаль из динамического значения в управляемый элемент системы.
На практике строгая модель выявляет несколько классов ошибок:
Globalize в этом контексте выступает как механизм раннего обнаружения ошибок конфигурации.
В строгой типизации локаль становится частью контракта:
Такой подход особенно важен в:
Главный эффект строгой модели заключается в устранении неопределённости:
Globalize обеспечивает этот эффект через сочетание CLDR-данных, явной регистрации локалей и строгих правил использования BCP 47.