Локаль в JavaScript-экосистеме Globalize представляется строкой,
описывающей язык и региональные особенности форматирования: даты, чисел,
валют, единиц измерения. Типичный формат включает язык, регион, а иногда
и расширенные теги: ru, ru-RU,
en-US, zh-Hans-CN. Корректность локали не
сводится к синтаксической проверке строки — важна её согласованность с
загруженными данными CLDR (Common Locale Data Repository), на которых
основан Globalize.
Строка локали состоит из нескольких компонентов:
ru, en,
de)RU, US,
DE)Hans,
Hant, LatnКомбинации формируют иерархию:
en — общий английскийen-GB — британский вариантen-US — американский вариантzh-Hans-CN — упрощённый китайский для КитаяGlobalize не ограничивается проверкой формата строки. Локаль считается валидной только в контексте доступных CLDR-данных и механизма разрешения локалей.
Globalize полностью опирается на CLDR, и без загруженных данных любая операция с локалями становится неполноценной.
Для корректной работы обычно загружаются:
cldr/supplemental/likelySubtagscldr/supplemental/numberingSystemscldr/main/<locale>/numberscldr/main/<locale>/ca-gregoriancldr/supplemental/timeDataОтсутствие даже части этих данных приводит к тому, что локаль может быть технически установлена, но не сможет корректно форматировать данные.
При установке локали Globalize выполняет нормализацию:
Например:
ru может быть расширено до ru-Latn-RU или
ru-RU в зависимости от CLDR likely subtagsen может стать en-Latn-USЭтот процесс делает «валидацию» не бинарной (да/нет), а контекстной: валидность определяется тем, можно ли локаль однозначно разрешить.
Основной механизм работы с локалью — функция установки текущего контекста:
Globalize.locale("ru-RU");
При этом библиотека:
Если данные для локали отсутствуют, Globalize не всегда выбрасывает ошибку — вместо этого может произойти fallback на более общий язык или ранее установленную локаль. Это делает явную «валидацию» локали задачей разработчика, а не встроенного механизма.
Так как Globalize не предоставляет строгой функции вида
isValidLocale, проверка корректности строится косвенно:
Локаль считается поддерживаемой, если загружены соответствующие данные:
cldr/main/<locale>Если данные отсутствуют, любые операции форматирования будут некорректны.
Практический способ проверки — установка локали и тестирование результата форматирования:
В приложениях часто ведётся реестр загруженных локалей:
["en", "en-GB", "ru", "de"]Валидация сводится к проверке принадлежности строки к этому списку.
При сравнении локалей важно учитывать, что одинаковый смысл может иметь разные записи:
en-US и en-us (регистр не имеет
значения)zh-CN и zh-Hans-CN (разные уровни
детализации)Globalize приводит идентификаторы к каноническому виду, но разработческая логика часто требует дополнительной нормализации:
Одной из ключевых особенностей является автоматический fallback:
fr-CA → fres-MX → esЭто означает, что «невалидная» локаль с точки зрения данных может не прерывать выполнение, а просто деградировать до более общего варианта.
Поэтому валидация должна учитывать не только факт существования локали, но и уровень точности:
В реальных приложениях проверка локали в контексте Globalize обычно строится по следующей схеме:
Globalize.localeТакой подход позволяет избежать ситуации, когда формально корректная строка приводит к некорректному отображению данных.
Сложные локали с script и variant требуют особого внимания:
sr-Cyrl-RS (сербский, кириллица, Сербия)az-Latn-AZ (азербайджанский, латиница)Если отсутствует поддержка script-уровня, Globalize может:
Это напрямую влияет на то, считается ли локаль «валидной» в прикладном смысле.
Валидация локалей в Globalize не является централизованной функцией, потому что:
Поэтому одна и та же локаль может считаться валидной в одном окружении и невалидной в другом.
likelySubtags — ключевой механизм, который расширяет неполные локали до максимально конкретных:
en → en-Latn-USru → ru-Cyrl-RUЭто делает возможным обработку неполных идентификаторов, но одновременно усложняет строгую проверку: отсутствие явного региона не означает невалидность, а лишь необходимость уточнения.
В контексте Globalize локаль нельзя рассматривать как просто строку, соответствующую шаблону. Это динамическая ссылка на набор CLDR-данных, которая:
Валидация локалей становится не отдельной функцией, а результатом взаимодействия структуры строки, доступных данных и механизмов разрешения CLDR.