Вся система интернационализации в JavaScript строится вокруг понятий локали и языкового тега. Локаль в контексте Intl — это строка в формате BCP 47, которая кодирует язык, письменность, регион и дополнительные параметры форматирования.
Примеры:
en — английский язык без уточненийen-US — английский (США)en-GB — английский (Великобритания)zh-Hans-CN — китайский, упрощённая письменность,
Китайsr-Cyrl-RS — сербский, кириллица, СербияРедкие языки и диалекты становятся проблемной зоной именно на уровне таких идентификаторов: чем менее распространён язык, тем выше вероятность отсутствия полной поддержки в браузере или runtime.
BCP 47 разбивает локаль на несколько компонентов:
se,
moh, hsb)Latn,
Cyrl, Hans, Hant)NO,
SE, CA)Редкие языки часто представлены только языковым кодом без дополнительных метаданных:
se — северносаамскийsmn — инари-саамскийsma — южносаамскийmoh — могавкОтсутствие script/region в таких случаях приводит к важному поведению Intl: система начинает искать ближайший доступный вариант.
Intl API не требует точного совпадения локали с поддерживаемыми данными. Вместо этого используется цепочка fallback:
se-FI)se)en-US или системная)Это означает, что даже при отсутствии прямой поддержки редкого языка система попытается использовать ближайший аналог.
Пример поведения:
Запрос: Intl.NumberFormat('smn-FI')
Если данных нет:
smnfi или системный языкТакой механизм опирается на ICU (International Components for Unicode), откуда браузеры берут локализационные данные.
Для работы с редкими языками критично проверять поддержку заранее:
Intl.DateTimeFormat.supportedLocalesOf(['moh', 'se', 'xx-YY']);
Результат показывает, какие локали реально поддерживаются движком.
Особенности:
Intl API не оперирует понятием «диалект» как отдельной сущностью. Диалекты моделируются через:
pt-BR vs pt-PT)zh-Hans vs zh-Hant)sl-rozaj, исторические формы словенского)Примеры диалектных различий:
ar-EG — египетский арабскийar-MA — марокканский арабскийes-AR — аргентинский испанскийfr-CA — канадский французскийДля редких языков диалектная гранулярность часто отсутствует, и система работает на уровне базового языка.
Редкие языки сталкиваются с несколькими типичными проблемами:
Отсутствие локализованных числовых форматов
Неполные данные календарей
Ограниченный набор символов
Fallback на английский
Это напрямую связано с источниками данных ICU/CLDR: если сообщество не поддерживает язык, данные могут отсутствовать или быть минимальными.
Intl.Locale позволяет разбирать и анализировать локаль
как структуру:
const loc = new Intl.Locale('se-FI-x-test');
Доступные свойства:
languagescriptregionbaseNameДля редких языков это особенно важно, так как позволяет отделить:
se)FI)x-test)Пример:
loc.language; // "se"
loc.region; // "FI"
Редкие языки часто используются с Unicode extension keys:
u-nu — числовая системаu-ca — календарьu-hc — формат времениПример:
se-FI-u-nu-latn
Если язык слабо поддержан, эти расширения могут игнорироваться или заменяться дефолтными значениями.
Intl.DisplayNames позволяет получать локализованные
названия языков, регионов и письменностей.
new Intl.DisplayNames(['en'], { type: 'language' }).of('moh');
Поведение при редких языках:
"moh")Это зависит от наличия записей в CLDR.
Intl.NumberFormat использует локализованные правила:
new Intl.NumberFormat('se').format(1234567.89);
При отсутствии данных:
Особенно критично для языков с альтернативными системами чисел, которые часто не поддерживаются полностью.
Intl.DateTimeFormat зависит от календарных данных
ICU:
new Intl.DateTimeFormat('moh', { dateStyle: 'full' });
Если календарь не определён:
Intl.Collator отвечает за сортировку:
new Intl.Collator('se').compare('á', 'a');
В редких языках проблема заключается в:
Это приводит к различиям между ожиданием и реальным результатом сортировки.
Даже при наличии базового языка диалекты часто не различаются:
zh-HK и zh-TW могут частично совпадать в
данныхarВ результате система интернационализации работает не на уровне лингвистической точности, а на уровне приближений.
Разные JS-движки используют разные версии ICU:
Это приводит к ситуации, когда один и тот же код:
Intl.DateTimeFormat('moh').format(new Date())
может возвращать разные результаты в разных средах.
При проектировании приложений с Intl API обычно учитываются:
supportedLocalesOfIntl.Locale для анализа теговРедкие языки в Intl API всегда находятся в зоне вероятностной поддержки, а не гарантированной локализации.