Базовый объект Intl в JavaScript представляет собой стандартный интерфейс для локализации данных, включающий форматирование чисел, дат, времени, строк и языковых правил, зависящих от конкретной локали. Он реализуется в рамках спецификации ECMA-402 и тесно интегрирован с движком JavaScript, предоставляя единый способ работы с интернационализацией без необходимости сторонних библиотек.
Ключевая идея заключается в разделении данных и их представления. Значение остаётся неизменным, а отображение адаптируется под локаль, учитывая региональные особенности, правила языка и культурные стандарты.
Каждый механизм внутри Intl опирается на понятие локали — строки, определяющей язык и регион:
ru-RU — русский язык, Россияen-US — английский язык, СШАde-DE — немецкий язык, ГерманияЛокаль влияет на:
Объекты Intl используют единый принцип: конструктор принимает локаль и набор параметров, возвращая специализированный форматтер.
Intl.NumberFormat отвечает за локализованное представление чисел, включая валюты, проценты и единицы измерения.
const formatter = new Intl.NumberFormat('ru-RU');
formatter.format(1234567.89);
// "1 234 567,89"
Различия между локалями проявляются в:
Intl поддерживает валютные представления через параметр
style: "currency".
const usd = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD'
});
usd.format(1234.5);
// "$1,234.50"
Для европейских локалей формат изменяется:
const eur = new Intl.NumberFormat('de-DE', {
style: 'currency',
currency: 'EUR'
});
eur.format(1234.5);
// "1.234,50 €"
В некоторых реализациях ECMAScript допускается использование нестандартных валютных кодов, включая криптовалютные тикеры. Поддержка зависит от окружения, поэтому поведение может отличаться.
const btc = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'BTC',
maximumFractionDigits: 8
});
btc.format(0.01234567);
В контексте криптовалют важны особенности:
Аналогично можно использовать другие коды вроде ETH в средах, где они поддерживаются.
const percent = new Intl.NumberFormat('ru-RU', {
style: 'percent'
});
percent.format(0.256);
// "26 %"
Важно, что входное значение интерпретируется как доля единицы.
Intl.DateTimeFormat формирует локализованное отображение дат и времени.
const dt = new Intl.DateTimeFormat('ru-RU');
dt.format(new Date());
// "27.05.2026"
const detailed = new Intl.DateTimeFormat('en-GB', {
year: 'numeric',
month: 'long',
day: '2-digit',
hour: '2-digit',
minute: '2-digit'
});
detailed.format(new Date());
// "27 May 2026, 14:35"
Поддерживаются уровни:
numeric2-digitlongshortnarrowconst tz = new Intl.DateTimeFormat('en-US', {
timeZone: 'UTC',
hour: '2-digit',
minute: '2-digit'
});
Часовой пояс влияет на интерпретацию времени без изменения исходного объекта Date.
Intl.Collator используется для корректной сортировки строк в зависимости от языка.
const collator = new Intl.Collator('ru');
['яблоко', 'Ёж', 'арбуз'].sort(collator.compare);
Особенности:
Параметры:
const collator = new Intl.Collator('en', {
sensitivity: 'base'
});
sensitivity управляет тем, учитываются ли:
Позволяет формировать естественные списки в зависимости от языка.
const lf = new Intl.ListFormat('ru', {
style: 'long',
type: 'conjunction'
});
lf.format(['HTML', 'CSS', 'JavaScript']);
// "HTML, CSS и JavaScript"
Типы:
conjunction — перечисление с «и»disjunction — «или»unit — единицы измеренияИспользуется для выражений вроде «2 дня назад» или «через 5 минут».
const rtf = new Intl.RelativeTimeFormat('ru');
rtf.format(-2, 'day');
// "2 дня назад"
rtf.format(3, 'hour');
// "через 3 часа"
Поддерживаемые единицы:
Позволяет корректно определять форму слова в зависимости от числа.
const pr = new Intl.PluralRules('ru');
pr.select(1); // "one"
pr.select(2); // "few"
pr.select(5); // "many"
Используется совместно с собственными словарями склонений.
Позволяет получать локализованные названия языков, стран, валют.
const dn = new Intl.DisplayNames('ru', { type: 'region' });
dn.of('US');
// "Соединённые Штаты"
Поддерживаемые типы:
В реальных системах форматирование редко ограничивается одним объектом. Чаще используется комбинация:
Создание форматтеров — дорогостоящая операция. Поэтому важна переиспользуемость:
const formatter = new Intl.NumberFormat('ru-RU');
function format(value) {
return formatter.format(value);
}
Ключевые принципы:
Поведение Intl зависит от:
Это особенно заметно в:
const formatter = new Intl.NumberFormat(['fr-FR', 'en-US']);
Система выбирает первую поддерживаемую локаль.
В прикладной разработке Intl часто используется в связке с данными реального времени:
При работе с высокочастотными данными (например, курсами цифровых активов) важны:
Несмотря на широкие возможности, Intl имеет ограничения:
Он решает только задачу представления, оставляя бизнес-логику приложению.