Международный API в JavaScript формализован как часть спецификации ECMA-402, которая развивается параллельно с базовой спецификацией языка ECMA-262. Такое разделение обусловлено тем, что интернационализация затрагивает не только синтаксис языка, но и взаимодействие с внешними стандартами локализации, которые определяются международными организациями и библиотеками данных.
ECMA-402 описывает поведение объектов Intl и их
компонентов, а именно форматирование дат, чисел, списков, сравнений
строк и локализованных представлений. При этом сама спецификация не
реализует алгоритмы локализации напрямую, а опирается на внешние
источники данных и индустриальные стандарты.
Ключевая особенность стандартизации Intl API заключается в том, что она находится на пересечении нескольких доменов:
Такое взаимодействие формирует многоуровневую систему, где спецификация определяет поведение, но не хранит локализационные данные.
Развитие ECMAScript, включая ECMA-402, управляется комитетом TC39 (Technical Committee 39). Этот комитет отвечает за эволюцию JavaScript как языка и рассматривает предложения по изменению стандарта.
Любое изменение проходит формализованный процесс, включающий несколько стадий зрелости предложения:
На этом этапе предложение существует как концепция. Оно может быть представлено участником комитета или внешним разработчиком. Формальной спецификации нет.
Идея получает поддержку и оформляется в виде предложения с описанием целей, возможных решений и потенциальных проблем.
Формализуется спецификация поведения. На этом этапе описываются алгоритмы и семантика API. Для Intl это может включать новые методы форматирования или расширение локалей.
Предложение считается почти готовым к стандартизации. Реализации появляются в движках JavaScript, а обратная связь от разработчиков активно учитывается.
Стандарт утверждён. Включается в финальную спецификацию ECMAScript и становится частью официального поведения языка.
Intl API исторически развивался через этот процесс, включая такие
расширения, как Intl.DateTimeFormat,
Intl.NumberFormat, Intl.Collator,
Intl.RelativeTimeFormat.
ECMA-262 определяет базовую семантику Jav * aScript: типы данных, выражения, объекты, функции. ECMA-402 расширяет язык набором встроенных объектов, которые предоставляют международные функции.
Связь между ними выражается в следующих аспектах:
Intl.Таким образом, Intl API не является внешней библиотекой, а частью языка, хотя и логически выделенной в отдельный стандарт.
Unicode Consortium играет центральную роль в стандартизации интернационализации. Основные зависимости Intl API:
CLDR содержит огромные массивы данных:
ECMA-402 не дублирует эти данные, а ссылается на них. Это позволяет поддерживать актуальность локализаций без изменения спецификации языка.
Одним из ключевых элементов стандартизации является формат идентификаторов локалей, основанный на BCP 47 (Best Current Practice).
Структура локали:
Пример:
ru-RU
en-US
zh-Hans-CN
Intl API использует эти идентификаторы как входной параметр для определения правил форматирования. Спецификация описывает механизм разрешения локали (locale resolution), включая fallback-цепочки.
ECMA-402 описывает поведение Intl через формальные алгоритмы, которые имеют строгую псевдокодовую структуру.
Например, создание форматтера чисел:
Алгоритмы стандарта не зависят от конкретной реализации движка. Это обеспечивает совместимость между различными средами: V8, SpiderMonkey, JavaScriptCore.
Практическая реализация Intl API в большинстве JavaScript-движков основана на библиотеке ICU (International Components for Unicode).
ICU предоставляет:
Связь ICU и ECMA-402 заключается в том, что спецификация часто формулируется в терминах ICU-подобных операций. Однако формально стандарт не требует использования ICU, позволяя альтернативные реализации.
ECMA-402 развивается быстрее, чем базовый ECMAScript в ранние годы. Это связано с высокой потребностью в локализации современных приложений.
Основные этапы эволюции:
Каждое расширение проходит через TC39 и синхронизируется с реализациями движков.
Одним из фундаментальных принципов стандартизации Intl является строгая обратная совместимость.
Изменения в спецификации не должны:
Если требуется изменение поведения, оно вводится как:
Это делает Intl API стабильным компонентом языка, пригодным для долгосрочного использования в продуктивных системах.
Реализация Intl в браузерах и Node.js проходит отдельный жизненный цикл внедрения:
Для проверки доступности используются механизмы feature detection:
Intl.NumberFormat,resolvedOptions().Такой подход позволяет синхронизировать развитие стандарта и внедрение в runtime без нарушения стабильности экосистемы.
Спецификация определяет строгую модель выбора локали:
Этот механизм стандартизирует поведение между различными платформами и предотвращает расхождения между браузерами и серверными реализациями.
BCP 47 позволяет расширять локали через -u- параметры,
которые влияют на поведение форматтеров.
Примеры:
Стандарт описывает, как эти расширения интерпретируются и как они влияют на выбор алгоритмов внутри Intl API. Это обеспечивает гибкость без расширения самого языка JavaScript.
Для поддержания консистентности между реализациями используются тестовые наборы:
Тестирование включает:
Разработчики движков используют эти тесты как эталон соответствия стандарту.
Intl API оказывает значительное влияние на архитектуру JavaScript-движков:
Форматтеры считаются тяжёлыми объектами, поэтому движки оптимизируют их через внутренние кеши и lazy initialization.
Intl API стандартизируется не только внутри ECMAScript, но и в контексте веб-платформы. Он используется совместно с:
Эта интеграция требует строгого согласования поведения между спецификациями ECMAScript и WHATWG, хотя Intl формально остаётся частью ECMAScript.
Intl API относится к категории стабильно расширяемых стандартов. Его развитие происходит без радикальных изменений, за счёт:
Такая модель позволяет использовать Intl в долгоживущих системах без риска деградации совместимости при обновлении движка или спецификации.