Свойства локали

Структура локали

Локаль в экосистеме Internationalization API основана на стандарте BCP 47. Это строка, которая кодирует набор параметров, определяющих языковую и региональную специфику обработки данных.

Типичная локаль имеет следующую структуру:

language[-script][-region][-variants][-extensions]

Каждый компонент выполняет строго определённую роль:

  • language — основной язык (например, en, ru, zh)
  • script — письменность (например, Latn, Cyrl, Hans)
  • region — регион или страна (например, US, GB, RU)
  • variants — диалектные или исторические вариации
  • extensions — расширения, задающие поведение форматирования

Примеры:

  • ru-RU — русский язык, Россия
  • en-US — английский, США
  • zh-Hans-CN — китайский, упрощённая письменность, Китай

Локаль не является просто строкой идентификатором. Она интерпретируется движком JavaScript как набор инструкций для выбора правил форматирования.


Языковой компонент

Языковой субтег является обязательной основой локали. Он задаёт базовые правила морфологии, числовых форматов и порядка отображения элементов.

Примеры языковых субтегов:

  • en — английский
  • fr — французский
  • de — немецкий
  • ru — русский

Языковой компонент влияет на:

  • порядок группировки чисел
  • правила округления
  • форматирование дат
  • выбор локализованных названий месяцев и дней недели

Скриптовый компонент

Скрипт указывает систему письма. Он используется, когда язык поддерживает несколько письменностей.

Примеры:

  • Latn — латиница
  • Cyrl — кириллица
  • Hans — упрощённый китайский
  • Hant — традиционный китайский

Примеры локалей:

  • az-Latn — азербайджанский на латинице
  • sr-Cyrl — сербский на кириллице

Скрипт влияет на визуальное представление текста, но не изменяет семантику языка.


Региональный компонент

Регион определяет географическую специфику локали. Он влияет на:

  • формат даты (день/месяц/год vs месяц/день/год)
  • формат чисел (разделители тысяч и дробей)
  • валютные обозначения
  • календарные системы

Примеры:

  • en-US — США
  • en-GB — Великобритания
  • fr-CA — Канада
  • ru-RU — Россия

Различие между регионами особенно заметно в форматировании дат:

  • en-US: 12/31/2025
  • en-GB: 31/12/2025

Варианты локалей

Variants применяются для уточнения исторических или диалектных особенностей языка.

Примеры:

  • sl-rozaj — рижский диалект словенского
  • de-1901 — немецкий орфографический стандарт 1901 года

В современных веб-приложениях variants используются редко, но остаются частью стандарта для полной совместимости.


Расширения Unicode в локали

Наиболее важная часть локали в контексте Intl API — Unicode extension subtags, начинающиеся с u-.

Они задают параметры форматирования без изменения языка.

Основные ключи расширений

  • u-ca — календарь
  • u-nu — система чисел
  • u-hc — формат времени (12/24 часа)
  • u-kf — сортировка регистра
  • u-kn — числовая сортировка

Пример:

en-US-u-ca-gregory-nu-latn-hc-h12

Здесь:

  • календарь — григорианский
  • цифры — латинские
  • формат времени — 12-часовой

Календарные системы

Параметр u-ca управляет системой календаря.

Поддерживаемые варианты:

  • gregory — григорианский календарь
  • islamic — исламский календарь
  • hebrew — еврейский календарь
  • buddhist — буддийский календарь
  • chinese — китайский календарь

Пример влияния:

  • Intl.DateTimeFormat('en-US-u-ca-islamic')

Форматирует дату согласно исламскому календарю, сохраняя английскую локализацию текста.


Числовые системы

Параметр u-nu определяет систему цифр.

Примеры:

  • latn — 0–9
  • arab — арабские цифры
  • arabext — восточно-арабские цифры
  • thai — тайская система чисел

Пример:

ar-EG-u-nu-arab

Использует арабский язык Египта с восточно-арабскими цифрами.


Формат времени

Ключ u-hc определяет формат отображения времени:

  • h12 — 12-часовой формат
  • h23 — 24-часовой формат

Пример:

en-GB-u-hc-h23

Принудительно задаёт 24-часовой формат даже в локали, где он может отличаться по умолчанию.


Intl.Locale как объект локали

В современных реализациях JavaScript локаль может быть представлена не только строкой, но и объектом Intl.Locale.

Этот объект предоставляет структурированный доступ к компонентам локали.

Основные свойства Intl.Locale

  • language — язык
  • script — письменность
  • region — регион
  • calendar — календарь
  • numberingSystem — система чисел
  • caseFirst — сортировка по регистру
  • numeric — числовая сортировка
  • hourCycle — цикл часов

Пример создания:

const loc = new Intl.Locale("en-US-u-ca-buddhist-nu-thai");

Доступ к свойствам:

loc.language; // "en"
loc.region; // "US"
loc.calendar; // "buddhist"
loc.numberingSystem; // "thai"

Нормализация локали

Локали проходят процесс нормализации, при котором:

  • приводятся к каноническому виду
  • упорядочиваются subtags
  • применяются стандарты ICU

Пример:

EN-us → en-US
ru-ru → ru-RU

Нормализация важна для обеспечения корректного сопоставления локалей внутри Intl API.


Наследование и fallback локалей

Если запрошенная локаль не поддерживается, применяется механизм fallback.

Пример цепочки:

de-CH-1996 → de-CH → de → default locale

Это позволяет обеспечивать предсказуемое поведение даже при отсутствии полной поддержки локали.


Роль локали в форматировании

Локаль используется во всех основных форматирующих объектах:

  • Intl.DateTimeFormat
  • Intl.NumberFormat
  • Intl.Collator
  • Intl.PluralRules
  • Intl.RelativeTimeFormat

Каждый из этих API интерпретирует локаль как набор правил, а не просто как идентификатор языка.

Пример:

new Intl.NumberFormat("de-DE").format(1234567.89);

Результат зависит от локали:

  • разделитель тысяч — точка
  • десятичный разделитель — запятая

Приоритет параметров локали

При формировании итогового поведения учитываются несколько уровней:

  1. Язык (language)
  2. Регион (region)
  3. Unicode extensions
  4. Настройки API (options в конструкторах)
  5. Локальные настройки окружения

Options в конструкторах Intl могут переопределять поведение локали:

new Intl.DateTimeFormat("en-US", {
  hour12: false
});

Даже при наличии en-US-u-hc-h12 параметр hour12: false изменит итоговый формат.


Сравнение локалей и их влияние

Локаль Числа Дата Время
en-US 1,234.56 12/31/2025 12-hour
en-GB 1,234.56 31/12/2025 24-hour (часто)
de-DE 1.234,56 31.12.2025 24-hour
fr-FR 1 234,56 31/12/2025 24-hour

Различия обусловлены не языком, а региональными правилами форматирования.


Значение локали в международных приложениях

Локаль выступает базовым слоем интернационализации, определяя поведение всех форматирующих операций. Она связывает языковую модель данных с визуальным представлением информации, обеспечивая согласованность интерфейса в разных культурных контекстах.