Понятие локали

Локаль — это набор параметров, определяющих правила представления данных для конкретного языка, региона и культурной среды. В контексте 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

Стандарт BCP 47

Intl API использует международный стандарт BCP 47 для описания локалей.

Некоторые распространённые локали:

Локаль Описание
ru-RU Русский (Россия)
uk-UA Украинский (Украина)
kk-KZ Казахский (Казахстан)
en-US Английский (США)
en-GB Английский (Великобритания)
fr-FR Французский (Франция)
de-DE Немецкий (Германия)
zh-CN Китайский (Китай)
ja-JP Японский (Япония)

Использование локали в Intl API

Практически все классы 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-расширения локали

Локаль может содержать дополнительные настройки через 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);

Locale matching

Intl API использует алгоритм сопоставления локалей.

Два режима:

Режим Описание
lookup Простое совпадение
best fit Интеллектуальный подбор

Пример:

new Intl.NumberFormat("en-XX", {
    localeMatcher: "lookup"
});

resolvedOptions()

Метод 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 для отображения данных

Intl API учитывает:

  • культуру;
  • регион;
  • язык;
  • календарь;
  • правила записи чисел.

Не предполагать формат даты

Формат:

05/06/2026

может означать:

  • 5 июня;
  • 6 мая.

Хранить данные в нейтральном формате

Для хранения обычно используются:

  • ISO 8601;
  • UTC;
  • числовые значения.

Локаль должна применяться только на этапе отображения.


Основные классы Intl API, использующие локали

Класс Назначение
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())
);

Влияние локали на пользовательский интерфейс

Локаль влияет не только на текст, но и на восприятие интерфейса:

  • порядок элементов даты;
  • направление письма;
  • формат чисел;
  • разделители;
  • названия месяцев;
  • отображение валют;
  • правила сортировки;
  • единицы измерения.

Приложение без локализации может быть технически работоспособным, но неудобным для пользователей разных стран.


Интернационализация и локализация

Важно различать два понятия.

Интернационализация (i18n)

Подготовка приложения к поддержке разных языков и регионов.

Локализация (l10n)

Адаптация приложения под конкретную культуру и язык.

Intl API относится к инструментам интернационализации.