Локаль в экосистеме Internationalization API основана на стандарте BCP 47. Это строка, которая кодирует набор параметров, определяющих языковую и региональную специфику обработки данных.
Типичная локаль имеет следующую структуру:
language[-script][-region][-variants][-extensions]
Каждый компонент выполняет строго определённую роль:
en, ru, zh)Latn,
Cyrl, Hans)US, GB, RU)Примеры:
ru-RU — русский язык, Россияen-US — английский, СШАzh-Hans-CN — китайский, упрощённая письменность,
КитайЛокаль не является просто строкой идентификатором. Она интерпретируется движком JavaScript как набор инструкций для выбора правил форматирования.
Языковой субтег является обязательной основой локали. Он задаёт базовые правила морфологии, числовых форматов и порядка отображения элементов.
Примеры языковых субтегов:
en — английскийfr — французскийde — немецкийru — русскийЯзыковой компонент влияет на:
Скрипт указывает систему письма. Он используется, когда язык поддерживает несколько письменностей.
Примеры:
Latn — латиницаCyrl — кириллицаHans — упрощённый китайскийHant — традиционный китайскийПримеры локалей:
az-Latn — азербайджанский на латиницеsr-Cyrl — сербский на кириллицеСкрипт влияет на визуальное представление текста, но не изменяет семантику языка.
Регион определяет географическую специфику локали. Он влияет на:
Примеры:
en-US — СШАen-GB — Великобританияfr-CA — Канадаru-RU — РоссияРазличие между регионами особенно заметно в форматировании дат:
en-US: 12/31/2025en-GB: 31/12/2025Variants применяются для уточнения исторических или диалектных особенностей языка.
Примеры:
sl-rozaj — рижский диалект словенскогоde-1901 — немецкий орфографический стандарт 1901
годаВ современных веб-приложениях variants используются редко, но остаются частью стандарта для полной совместимости.
Наиболее важная часть локали в контексте 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
Здесь:
Параметр u-ca управляет системой календаря.
Поддерживаемые варианты:
gregory — григорианский календарьislamic — исламский календарьhebrew — еврейский календарьbuddhist — буддийский календарьchinese — китайский календарьПример влияния:
Intl.DateTimeFormat('en-US-u-ca-islamic')Форматирует дату согласно исламскому календарю, сохраняя английскую локализацию текста.
Параметр u-nu определяет систему цифр.
Примеры:
latn — 0–9arab — арабские цифрыarabext — восточно-арабские цифрыthai — тайская система чиселПример:
ar-EG-u-nu-arab
Использует арабский язык Египта с восточно-арабскими цифрами.
Ключ u-hc определяет формат отображения времени:
h12 — 12-часовой форматh23 — 24-часовой форматПример:
en-GB-u-hc-h23
Принудительно задаёт 24-часовой формат даже в локали, где он может отличаться по умолчанию.
В современных реализациях JavaScript локаль может быть представлена
не только строкой, но и объектом 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"
Локали проходят процесс нормализации, при котором:
Пример:
EN-us → en-US
ru-ru → ru-RU
Нормализация важна для обеспечения корректного сопоставления локалей внутри Intl API.
Если запрошенная локаль не поддерживается, применяется механизм fallback.
Пример цепочки:
de-CH-1996 → de-CH → de → default locale
Это позволяет обеспечивать предсказуемое поведение даже при отсутствии полной поддержки локали.
Локаль используется во всех основных форматирующих объектах:
Intl.DateTimeFormatIntl.NumberFormatIntl.CollatorIntl.PluralRulesIntl.RelativeTimeFormatКаждый из этих API интерпретирует локаль как набор правил, а не просто как идентификатор языка.
Пример:
new Intl.NumberFormat("de-DE").format(1234567.89);
Результат зависит от локали:
При формировании итогового поведения учитываются несколько уровней:
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 |
Различия обусловлены не языком, а региональными правилами форматирования.
Локаль выступает базовым слоем интернационализации, определяя поведение всех форматирующих операций. Она связывает языковую модель данных с визуальным представлением информации, обеспечивая согласованность интерфейса в разных культурных контекстах.