IETF (Internet Engineering Task Force) определяет набор технических стандартов, описанных в форме RFC (Request for Comments), которые лежат в основе сетевых протоколов, форматов данных и правил интероперабельности в интернете. В контексте интернационализации JavaScript API именно RFC-документы задают фундаментальные правила для представления языков, регионов, кодировок и культурных параметров.
JavaScript Internationalization API (Intl) опирается не
только на спецификацию ECMAScript, но и на внешние стандарты,
определяющие:
Ключевым элементом является то, что JavaScript не изобретает собственную модель локалей, а строго следует уже существующим RFC-стандартам, обеспечивая совместимость с браузерами, операционными системами и международными библиотеками (ICU, CLDR).
Основной стандарт, используемый в Intl, — BCP 47 (Best
Current Practice 47). Это не один документ, а связка нескольких RFC:
BCP 47 определяет формат языкового тега, который используется в Jav * aScript:
language[-script][-region][-variant]
Примеры:
en — английскийen-US — американский английскийsr-Cyrl-RS — сербский, кириллица, Сербияzh-Hans-CN — китайский упрощённый, КитайRFC 5646 задаёт строгие правила:
Важное свойство RFC 5646 — расширяемость. Если система встречает неизвестный подтип, он сохраняется, но не интерпретируется.
RFC 4647 описывает механизм matching (сопоставления) языковых тегов.
Это критически важно для Intl.DateTimeFormat,
Intl.NumberFormat и особенно для
Intl.Collator.
JavaScript использует эти механизмы при выборе локали, когда запрошенная недоступна в окружении.
Пример поведения:
fr-CAfrfrBCP 47 включает механизм расширений, особенно Unicode extension
subtags. Они используются напрямую в Intl.
Пример:
en-US-u-ca-gregory-nu-latn
Здесь:
u — Unicode extensionca-gregory — календарьnu-latn — система чисел (латинская)Эти расширения стандартизированы Unicode Consortium, но формат их включения определён именно RFC 5646.
До RFC 5646 существовал RFC 3066, который задавал более простую модель языковых тегов. Он поддерживал только базовые конструкции без расширенных подтипов.
Переход:
Эволюция отражает рост требований интернационализации, особенно в веб-среде и языковых системах операционных систем.
Intl.Locale напрямую работает с BCP 47 тегами. При
создании объекта происходит разбор строки согласно RFC-правилам:
const loc = new Intl.Locale("en-Latn-US-u-ca-gregory");
Внутри выполняется:
RFC-стандарты требуют нормализации:
en)US)Latn)JavaScript Intl приводит входные данные к каноническому
виду:
en-us → en-US
EN-latn-us → en-Latn-US
Хотя RFC 7231 напрямую относится к HTTP/1.1, он определяет заголовок:
Accept-Language
Этот заголовок использует те же BCP 47 теги, что и Intl.
Таким образом:
Пример:
Accept-Language: fr-CH, fr;q=0.9, en;q=0.8
Многие RFC используют ABNF (Augmented Backus-Naur Form), описанный в RFC 5234, для формального задания синтаксиса.
BCP 47 также опирается на ABNF для определения структуры языкового тега:
Language-Tag = langtag
langtag = language ["-" script] ["-" region] *("-" variant)
Эта формализация важна для:
Intl API в большинстве движков опирается на ICU (International Components for Unicode), который реализует RFC-совместимую модель локалей.
ICU:
Несмотря на общий стандарт RFC, реализация может различаться:
Однако синтаксис и структура строго унифицированы через RFC 5646.
RFC напрямую не определяет алгоритмы сортировки, но BCP 47 влияет на выбор правил сортировки:
new Intl.Collator("sv-SE");
Здесь локаль sv-SE определяет:
ICU использует локаль как ключ к collation tailoring, который соответствует языковым стандартам Unicode, но инициируется через RFC-идентификаторы.
RFC определяет формат идентификаторов, а CLDR (Common Locale Data Repository) определяет данные:
Связка выглядит так:
ECMAScript Internationalization API Specification не заменяет RFC, а расширяет их использование:
RFC остаются «низкоуровневым языком описания», а Intl — высокоуровневым API.
При нарушении BCP 47 синтаксиса возникает
RangeError:
new Intl.Locale("invalid_locale_123");
Причины:
RFC требует строгого соответствия, так как локали должны быть однозначно интерпретируемыми во всех системах.
RFC обеспечивает:
Без RFC 5646 и RFC 4647 интернационализация в JavaScript была бы фрагментированной и зависимой от конкретной платформы.