Глобальные веб-приложения работают с пользователями из разных стран, регионов и языковых сред. Форматы дат, времени, чисел, валют и правил сортировки существенно отличаются в зависимости от локали. Попытка реализовать поддержку всех этих особенностей вручную приводит к усложнению кода, ошибкам и проблемам сопровождения.
Intl API предоставляет встроенный механизм
интернационализации в JavaScript и позволяет делегировать языковые и
региональные особенности платформе выполнения. Это обеспечивает
единообразное поведение, совместимость со стандартами Unicode CLDR и
значительное сокращение объёма прикладного кода.
Без Intl API разработчики часто создают собственные
функции форматирования:
function formatPrice(price) {
return "$" + price.toFixed(2);
}
console.log(formatPrice(1234.5));
Подобный подход кажется простым, но быстро становится проблемным:
Использование Intl.NumberFormat полностью устраняет
необходимость ручной обработки:
const formatter = new Intl.NumberFormat("en-US", {
style: "currency",
currency: "USD"
});
console.log(formatter.format(1234.5));
Для немецкой локали:
const formatter = new Intl.NumberFormat("de-DE", {
style: "currency",
currency: "EUR"
});
console.log(formatter.format(1234.5));
Результат:
1.234,50 €
Один и тот же код корректно адаптируется под региональные стандарты.
Intl API умеет учитывать:
Пример форматирования даты:
const date = new Date();
console.log(
new Intl.DateTimeFormat("ru-RU").format(date)
);
console.log(
new Intl.DateTimeFormat("en-US").format(date)
);
console.log(
new Intl.DateTimeFormat("ja-JP").format(date)
);
Результаты будут различаться автоматически.
Это особенно важно для:
Intl API основан на стандартах:
Это означает:
При ручной реализации форматирования поддержка стандартов практически невозможна.
Встроенные механизмы позволяют работать с десятками и сотнями языков без дополнительного кода.
Пример:
const amount = 9876543.21;
const locales = [
"en-US",
"fr-FR",
"ru-RU",
"ar-EG",
"hi-IN",
"zh-CN"
];
for (const locale of locales) {
const formatter = new Intl.NumberFormat(locale);
console.log(locale, formatter.format(amount));
}
Каждая локаль использует собственные правила:
Валюты отличаются:
Пример:
const value = 2500;
console.log(
new Intl.NumberFormat("en-US", {
style: "currency",
currency: "USD"
}).format(value)
);
console.log(
new Intl.NumberFormat("ja-JP", {
style: "currency",
currency: "JPY"
}).format(value)
);
Японская иена не использует дробную часть:
¥2,500
Intl API автоматически учитывает подобные
особенности.
Ручная работа с датами традиционно считается одной из самых сложных задач в JavaScript.
Без Intl API код часто выглядит так:
function formatDate(date) {
return `${date.getDate()}.${date.getMonth() + 1}.${date.getFullYear()}`;
}
Недостатки:
С Intl.DateTimeFormat:
const formatter = new Intl.DateTimeFormat("ru-RU", {
dateStyle: "full",
timeStyle: "short"
});
console.log(formatter.format(new Date()));
Поддерживаются:
Intl API умеет корректно работать с часовыми
поясами.
const date = new Date();
console.log(
new Intl.DateTimeFormat("en-US", {
timeZone: "America/New_York",
timeStyle: "full"
}).format(date)
);
console.log(
new Intl.DateTimeFormat("en-GB", {
timeZone: "Europe/London",
timeStyle: "full"
}).format(date)
);
Это особенно важно для:
Intl.PluralRules помогает выбирать правильные формы
слов.
Русский язык содержит сложные правила множественного числа:
const pluralRules = new Intl.PluralRules("ru-RU");
console.log(pluralRules.select(1));
console.log(pluralRules.select(2));
console.log(pluralRules.select(5));
Результаты:
one
few
many
На основе этого можно строить локализованные сообщения:
function getMessage(count) {
const rule = new Intl.PluralRules("ru-RU").select(count);
const map = {
one: "сообщение",
few: "сообщения",
many: "сообщений"
};
return `${count} ${map[rule]}`;
}
console.log(getMessage(1));
console.log(getMessage(3));
console.log(getMessage(10));
Разные языки используют разные правила сортировки.
Стандартная сортировка:
const words = ["яблоко", "Ёж", "ель"];
console.log(words.sort());
Результат может быть некорректным.
Intl.Collator учитывает языковые особенности:
const collator = new Intl.Collator("ru-RU");
console.log(words.sort(collator.compare));
Преимущества:
Код становится декларативным.
Вместо большого количества условных конструкций:
if (locale === "ru") {
// форматирование
} else if (locale === "de") {
// другое форматирование
}
используются встроенные механизмы:
new Intl.NumberFormat(locale, options);
Это:
До появления широкого распространения Intl API
разработчики активно использовали:
Современный JavaScript предоставляет большую часть необходимой функциональности из коробки.
Преимущества отказа от лишних библиотек:
Встроенные реализации обычно работают быстрее пользовательских решений, поскольку:
Особенно заметна разница при:
Intl API поддерживается:
Один и тот же код можно использовать:
API предоставляет множество параметров конфигурации.
Пример:
const formatter = new Intl.DateTimeFormat("ru-RU", {
weekday: "long",
year: "numeric",
month: "long",
day: "numeric",
hour: "2-digit",
minute: "2-digit"
});
console.log(formatter.format(new Date()));
Можно управлять:
Intl.RelativeTimeFormat позволяет формировать
естественные сообщения:
const rtf = new Intl.RelativeTimeFormat("ru", {
numeric: "auto"
});
console.log(rtf.format(-1, "day"));
console.log(rtf.format(5, "minute"));
Результат:
вчера
через 5 минут
Подобный функционал особенно полезен для:
Intl.NumberFormat поддерживает единицы измерения:
const formatter = new Intl.NumberFormat("ru-RU", {
style: "unit",
unit: "kilometer-per-hour"
});
console.log(formatter.format(120));
Результат:
120 км/ч
Поддерживаются:
Локализованный интерфейс воспринимается естественно.
Пользователь ожидает увидеть:
Ошибки интернационализации снижают доверие к приложению.
Например:
12/05/2026
Для разных регионов это может означать:
Intl API устраняет подобные неоднозначности.
При выходе приложения на новые рынки объём изменений минимален.
Часто достаточно:
Архитектура остаётся стабильной даже при росте числа поддерживаемых стран.
Intl API активно используется внутри:
Многие i18n-библиотеки являются лишь удобной обёрткой над
Intl.
Примеры:
Ручное форматирование почти всегда приводит к ошибкам:
Intl API переносит ответственность за эти задачи на
стандартизированную платформенную реализацию.
Intl API активно развивается.
Современные возможности включают:
Intl.Segmenter;Intl.DisplayNames;Intl.ListFormat;Intl.Locale;Intl.DurationFormat.Пример форматирования списков:
const formatter = new Intl.ListFormat("ru", {
style: "long",
type: "conjunction"
});
console.log(
formatter.format(["JavaScript", "TypeScript", "Node.js"])
);
Результат:
JavaScript, TypeScript и Node.js
На сервере часто требуется:
Intl API позволяет использовать одинаковую логику как в
браузере, так и в Node.js:
const formatter = new Intl.NumberFormat("fr-FR", {
style: "currency",
currency: "EUR"
});
console.log(formatter.format(9999));
Это уменьшает расхождения между сервером и клиентом.
Интернационализация влияет не только на внешний вид интерфейса, но и на восприятие продукта в целом.
Качественная локализация обеспечивает:
Intl API делает реализацию подобных возможностей
значительно проще, безопаснее и надёжнее.