Локаль — это набор параметров, определяющих правила представления данных для конкретного языка, региона и культурной среды. В контексте JavaScript локаль используется библиотекой Intl API для корректного отображения:
Одна и та же информация в разных странах отображается по-разному.
Например, дата 2026-05-26 может быть представлена в
нескольких форматах:
| Локаль | Формат |
|---|---|
en-US |
5/26/2026 |
en-GB |
26/05/2026 |
de-DE |
26.05.2026 |
ja-JP |
2026/05/26 |
Intl API автоматически применяет культурные правила выбранной локали.
Локаль записывается в формате языкового тега BCP 47.
Базовая структура:
язык-РЕГИОН
Примеры:
"en-US"
"ru-RU"
"fr-FR"
"kk-KZ"
| Часть | Значение | Пример |
|---|---|---|
| Язык | Основной язык | ru |
| Регион | Страна или регион | RU |
| Скрипт | Система письма | Cyrl |
| Вариант | Дополнительная спецификация | fonipa |
Полный пример:
"sr-Cyrl-RS"
Расшифровка:
sr — сербский язык;Cyrl — кириллица;RS — Сербия.Важно различать язык и регион.
"en"
Означает английский язык без указания конкретной страны.
"en-US"
"en-GB"
Обе локали используют английский язык, но правила форматирования различаются.
Пример:
const date = new Date();
console.log(
new Intl.DateTimeFormat("en-US").format(date)
);
console.log(
new Intl.DateTimeFormat("en-GB").format(date)
);
Результат:
5/26/2026
26/05/2026
Intl API использует международный стандарт BCP 47 для описания локалей.
Некоторые распространённые локали:
| Локаль | Описание |
|---|---|
ru-RU |
Русский (Россия) |
uk-UA |
Украинский (Украина) |
kk-KZ |
Казахский (Казахстан) |
en-US |
Английский (США) |
en-GB |
Английский (Великобритания) |
fr-FR |
Французский (Франция) |
de-DE |
Немецкий (Германия) |
zh-CN |
Китайский (Китай) |
ja-JP |
Японский (Япония) |
Практически все классы Intl принимают локаль первым аргументом.
Пример:
new Intl.NumberFormat("ru-RU")
new Intl.DateTimeFormat("de-DE")
new Intl.Collator("fr-FR")
Если локаль не указана, JavaScript использует системную локаль среды выполнения.
const formatter = new Intl.NumberFormat();
console.log(
formatter.format(1000000)
);
Результат зависит от настроек браузера или операционной системы.
Intl API поддерживает список локалей.
const formatter = new Intl.NumberFormat([
"fr-CA",
"fr-FR",
"en-US"
]);
Механизм выбирает первую поддерживаемую локаль.
Это называется locale fallback.
Метод supportedLocalesOf() позволяет определить, какие
локали поддерживаются средой.
Пример:
console.log(
Intl.DateTimeFormat.supportedLocalesOf([
"ru-RU",
"xx-XX",
"de-DE"
])
);
Результат:
["ru-RU", "de-DE"]
Метод Intl.getCanonicalLocales() нормализует
идентификаторы локалей.
console.log(
Intl.getCanonicalLocales("EN-us")
);
Результат:
["en-US"]
Локаль может содержать дополнительные настройки через Unicode extension.
Пример:
"en-US-u-ca-buddhist"
Расшифровка:
| Часть | Значение |
|---|---|
u |
Unicode extension |
ca |
calendar |
buddhist |
буддийский календарь |
Intl API поддерживает различные календари.
Пример:
const formatter = new Intl.DateTimeFormat(
"th-TH-u-ca-buddhist"
);
console.log(
formatter.format(new Date())
);
Через локаль можно менять систему записи цифр.
Пример:
const formatter = new Intl.NumberFormat(
"ar-EG-u-nu-arab"
);
console.log(
formatter.format(123456)
);
Результат:
١٢٣٤٥٦
Разные страны используют разные разделители.
Пример:
const number = 1234567.89;
console.log(
new Intl.NumberFormat("en-US").format(number)
);
console.log(
new Intl.NumberFormat("de-DE").format(number)
);
console.log(
new Intl.NumberFormat("fr-FR").format(number)
);
Результат:
1,234,567.89
1.234.567,89
1 234 567,89
Формат валют зависит от культурных норм.
const price = 1500;
console.log(
new Intl.NumberFormat("en-US", {
style: "currency",
currency: "USD"
}).format(price)
);
console.log(
new Intl.NumberFormat("ru-RU", {
style: "currency",
currency: "RUB"
}).format(price)
);
Результат:
$1,500.00
1 500,00 ₽
Формат даты — одна из главных задач 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)
);
Формат времени также зависит от региона.
const formatterUS =
new Intl.DateTimeFormat("en-US", {
timeStyle: "short"
});
const formatterDE =
new Intl.DateTimeFormat("de-DE", {
timeStyle: "short"
});
В США широко используется 12-часовой формат, а в Европе — 24-часовой.
Разные языки имеют разные правила алфавитной сортировки.
const words = ["яблоко", "Ёж", "еж"];
words.sort(
new Intl.Collator("ru-RU").compare
);
console.log(words);
Даже операции преобразования регистра зависят от локали.
Турецкий язык — классический пример.
console.log(
"i".toLocaleUpperCase("tr-TR")
);
Результат:
İ
В обычном английском результате был бы символ I.
Правила множественного числа отличаются между языками.
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
Intl API умеет строить локализованные фразы времени.
const rtf =
new Intl.RelativeTimeFormat("ru-RU");
console.log(
rtf.format(-1, "day")
);
Результат:
1 день назад
const formatter =
new Intl.NumberFormat("ru-RU", {
style: "unit",
unit: "kilometer"
});
console.log(
formatter.format(15)
);
Результат:
15 км
Браузер предоставляет информацию о предпочтительном языке пользователя.
console.log(navigator.language);
Пример:
ru-RU
Также доступен список языков:
console.log(navigator.languages);
Intl API использует алгоритм сопоставления локалей.
Два режима:
| Режим | Описание |
|---|---|
lookup |
Простое совпадение |
best fit |
Интеллектуальный подбор |
Пример:
new Intl.NumberFormat("en-XX", {
localeMatcher: "lookup"
});
Метод resolvedOptions() показывает итоговые параметры
локали.
const formatter =
new Intl.NumberFormat("ru");
console.log(
formatter.resolvedOptions()
);
Результат:
{
locale: "ru",
numberingSystem: "latn",
style: "decimal",
...
}
Неправильно:
"RU-ru"
Правильно:
"ru-RU"
Неправильно:
"RU"
Правильно:
"ru-RU"
Плохой подход:
`${day}.${month}.${year}`
Правильный подход:
new Intl.DateTimeFormat(locale)
Intl API учитывает:
Формат:
05/06/2026
может означать:
Для хранения обычно используются:
Локаль должна применяться только на этапе отображения.
| Класс | Назначение |
|---|---|
Intl.NumberFormat |
Форматирование чисел |
Intl.DateTimeFormat |
Форматирование дат |
Intl.Collator |
Сортировка строк |
Intl.PluralRules |
Множественное число |
Intl.RelativeTimeFormat |
Относительное время |
Intl.ListFormat |
Форматирование списков |
Intl.DisplayNames |
Локализованные названия |
Intl.Segmenter |
Сегментация текста |
const locale = "ru-RU";
const numberFormatter =
new Intl.NumberFormat(locale, {
style: "currency",
currency: "RUB"
});
const dateFormatter =
new Intl.DateTimeFormat(locale, {
dateStyle: "full"
});
console.log(
numberFormatter.format(5000)
);
console.log(
dateFormatter.format(new Date())
);
Локаль влияет не только на текст, но и на восприятие интерфейса:
Приложение без локализации может быть технически работоспособным, но неудобным для пользователей разных стран.
Важно различать два понятия.
Подготовка приложения к поддержке разных языков и регионов.
Адаптация приложения под конкретную культуру и язык.
Intl API относится к инструментам интернационализации.