Локализация в JavaScript опирается на стандартизированный слой ICU и
объект Intl, который формирует строки, числа, даты и
правила языка на основе текущей локали окружения. При разработке
интерфейсов ключевым фактором становится не только корректное
использование Intl.NumberFormat,
Intl.DateTimeFormat, Intl.Collator,
Intl.PluralRules, Intl.DisplayNames, но и
воспроизводимость поведения в разных языковых и региональных настройках
браузера.
Поведение Intl определяется несколькими уровнями:
настройками операционной системы, параметрами браузера, HTTP-заголовками
(Accept-Language), JavaScript-значением
navigator.language, а также внутренними
fallback-механизмами выбора локали. Именно эта многослойность делает
DevTools критическим инструментом анализа локализации.
Алгоритм выбора языка в Intl основан на списке
предпочтений:
navigator.languages — массив предпочтительных языков
пользователяnavigator.language — основной язык интерфейсаAccept-Languageen-US или дефолт движкаКаждый вызов Intl сначала проходит через нормализацию
BCP 47-тегов (ru-RU, en-GB,
de-DE), затем выполняется сопоставление с доступными
локалями ICU.
Ключевая особенность: один и тот же код может возвращать разные результаты в зависимости от источника данных о локали, даже без изменения кода приложения.
В инструментах разработчика браузеров присутствуют механизмы, позволяющие частично изменять среду выполнения:
Accept-Language)Эти инструменты влияют на поведение Intl.DateTimeFormat,
Intl.RelativeTimeFormat и частично на форматирование чисел
через локаль.
Изменение Accept-Language приводит к смене
результата:
new Intl.DateTimeFormat().resolvedOptions().locale
Результат зависит от приоритета языков, переданных браузеру.
Intl.DateTimeFormat через DevToolsФорматирование даты и времени является одной из наиболее чувствительных зон локализации. Различия проявляются в:
new Intl.DateTimeFormat('ru-RU', {
dateStyle: 'full',
timeStyle: 'long'
}).format(new Date())
В DevTools критическим фактором становится часовой пояс. При изменении timezone через инструменты эмуляции наблюдаются изменения результата без изменения кода.
new Intl.DateTimeFormat('en-US', {
timeZone: 'Europe/London',
timeStyle: 'short'
}).format(new Date())
Отладка ошибок часто связана с несовпадением системного времени и ожидаемого региона.
Intl.NumberFormat зависит от локали сильнее, чем может
казаться на уровне API.
Различия включают:
1,5 vs
1.5)1 000, 1,000,
1.000)new Intl.NumberFormat('de-DE', {
style: 'currency',
currency: 'EUR'
}).format(1234567.89)
DevTools позволяют выявлять ошибки, связанные с неверной локалью окружения, когда приложение ожидает одну систему разделителей, а браузер использует другую.
Частая проблема возникает при парсинге чисел из строки,
отформатированной Intl, без учёта локали.
Intl.CollatorСортировка в JavaScript через стандартный
Array.prototype.sort() не учитывает локализацию.
Intl.Collator решает эту задачу.
const collator = new Intl.Collator('tr', { sensitivity: 'base' });
['z', 'a', 'ä'].sort(collator.compare);
В DevTools часто выявляются ошибки:
Поведение зависит от ICU-данных браузера, поэтому одинаковый код может давать разные результаты в разных версиях движка.
Intl.PluralRulesМножественные формы в языках являются одной из наиболее сложных задач
локализации. Intl.PluralRules формализует выбор формы
слова.
new Intl.PluralRules('ru-RU').select(5);
DevTools используются для проверки корректности:
Ошибки часто проявляются при ручной реализации склонений без
использования Intl.PluralRules.
Intl.DisplayNamesIntl.DisplayNames используется для отображения
локализованных названий языков, валют и регионов.
new Intl.DisplayNames('en', { type: 'language' }).of('ru');
DevTools позволяют проверить:
Локализация часто зависит от согласованности между сервером и клиентом. DevTools позволяют изменять:
Accept-LanguageНесоответствие между HTTP-локалью и navigator.language
приводит к расхождениям в Intl-выводе.
На практике DevTools помогают выявить системные проблемы:
Intl вместо использования
пользовательских настроекtimeZone в
DateTimeFormatIntl-форматированияОсобенно часто проявляется проблема «плавающего формата даты», когда разные компоненты интерфейса используют разные локали.
Работа с Intl в консоли DevTools обычно включает
проверку текущего окружения:
navigator.language
navigator.languages
Intl.DateTimeFormat().resolvedOptions()
Intl.NumberFormat().resolvedOptions()
Эти значения позволяют определить фактическую локаль, используемую движком, и сопоставить её с ожидаемой конфигурацией приложения.
Часовой пояс является отдельным уровнем влияния на
Intl.DateTimeFormat. Даже при фиксированной локали различие
timezone приводит к различным результатам:
DevTools с эмуляцией часового пояса позволяют воспроизводить сценарии пользователей из других регионов без изменения системных настроек.
Создание экземпляров Intl является относительно дорогой
операцией. В DevTools можно выявить:
Intl.NumberFormatОптимизация обычно включает хранение заранее созданных экземпляров форматтеров по локали.
Если заданная локаль не поддерживается, происходит fallback на наиболее близкую доступную. DevTools позволяют увидеть фактическую используемую локаль:
new Intl.DateTimeFormat('xx-XX').resolvedOptions().locale
Это критично для проверки корректности интернационализации в edge-case сценариях.
Локализация через Intl не существует изолированно — она
тесно связана с окружением браузера:
DevTools выступают инструментом контроля этого окружения, позволяя моделировать различные комбинации факторов без изменения кода приложения.