Структура библиотеки

Intl — встроенное пространство имён JavaScript, предоставляющее набор объектов для интернационализации приложений. Библиотека входит в стандарт ECMAScript Internationalization API Specification и предназначена для корректной работы с локалями, форматированием данных и языковыми правилами.

Структурно Intl состоит из независимых классов, каждый из которых отвечает за отдельную задачу:

Компонент Назначение
Intl.Collator Сравнение и сортировка строк
Intl.DateTimeFormat Форматирование даты и времени
Intl.NumberFormat Форматирование чисел
Intl.PluralRules Определение формы множественного числа
Intl.RelativeTimeFormat Относительное время
Intl.ListFormat Форматирование списков
Intl.Locale Работа с локалями
Intl.DisplayNames Локализованные названия языков, стран и валют
Intl.Segmenter Разбиение текста на сегменты
Intl.DurationFormat Форматирование длительности
Intl.supportedValuesOf() Получение поддерживаемых значений

Пространство имён Intl

Все инструменты интернационализации находятся внутри глобального объекта Intl.

console.log(Intl);

Каждый класс работает независимо, но использует общую концепцию:

  1. Локаль (locale)
  2. Набор параметров (options)
  3. Внутренние языковые данные ICU/CLDR

Общая схема работы:

const formatter = new Intl.NumberFormat("ru-RU");

formatter.format(1000);

Локали как основа структуры

Формат записи локали

Локаль определяет язык, регион и дополнительные настройки.

Стандартный формат:

язык-РЕГИОН

Примеры:

"ru-RU"
"en-US"
"de-DE"
"fr-FR"
"kk-KZ"

Расшифровка:

Часть Значение
ru русский язык
RU Россия
en английский
US США

Массив локалей

Практически все объекты Intl принимают массив локалей.

const formatter = new Intl.NumberFormat(
    ["fr-FR", "en-US"]
);

Механизм выбирает первую поддерживаемую локаль.


Определение локали среды

console.log(Intl.DateTimeFormat().resolvedOptions());

Результат:

{
  locale: "ru-RU",
  calendar: "gregory",
  numberingSystem: "latn",
  timeZone: "Europe/Moscow"
}

Intl.Collator

Назначение

Intl.Collator предназначен для:

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

Обычное сравнение строк в JavaScript не учитывает языковые особенности.


Создание объекта

const collator = new Intl.Collator("ru-RU");

Метод compare()

const collator = new Intl.Collator("ru-RU");

console.log(
    ["ёлка", "яблоко", "арбуз"].sort(collator.compare)
);

Чувствительность сравнения

Параметр sensitivity:

const collator = new Intl.Collator("ru-RU", {
    sensitivity: "base"
});

Варианты:

Значение Описание
base базовое сравнение
accent учитывать ударения
case учитывать регистр
variant полное сравнение

Числовая сортировка

const collator = new Intl.Collator("en", {
    numeric: true
});

console.log(
    ["2", "10", "1"].sort(collator.compare)
);

Результат:

["1", "2", "10"]

Intl.DateTimeFormat

Назначение

Intl.DateTimeFormat отвечает за локализованное представление:

  • даты;
  • времени;
  • временных зон;
  • календарей.

Базовое форматирование

const formatter = new Intl.DateTimeFormat("ru-RU");

console.log(
    formatter.format(new Date())
);

Форматирование с параметрами

const formatter = new Intl.DateTimeFormat("ru-RU", {
    year: "numeric",
    month: "long",
    day: "numeric"
});

Результат:

26 мая 2026 г.

Основные параметры

Параметр Значения
year numeric, 2-digit
month numeric, long, short
day numeric, 2-digit
weekday long, short
hour numeric, 2-digit
minute numeric, 2-digit
second numeric, 2-digit

Форматирование времени

const formatter = new Intl.DateTimeFormat("en-US", {
    hour: "numeric",
    minute: "numeric",
    second: "numeric"
});

Временные зоны

const formatter = new Intl.DateTimeFormat("ru-RU", {
    timeZone: "Asia/Almaty",
    timeStyle: "full"
});

Формат dateStyle/timeStyle

Современный сокращённый формат:

const formatter = new Intl.DateTimeFormat("ru-RU", {
    dateStyle: "full",
    timeStyle: "short"
});

Поддерживаемые значения:

Значение Описание
full полный формат
long длинный
medium средний
short короткий

Форматирование диапазона дат

const formatter = new Intl.DateTimeFormat("ru-RU");

formatter.formatRange(
    new Date("2026-05-01"),
    new Date("2026-05-10")
);

Intl.NumberFormat

Назначение

Intl.NumberFormat используется для:

  • локализации чисел;
  • валют;
  • процентов;
  • единиц измерения.

Форматирование числа

const formatter = new Intl.NumberFormat("ru-RU");

console.log(
    formatter.format(1234567.89)
);

Результат:

1 234 567,89

Валюты

const formatter = new Intl.NumberFormat("ru-RU", {
    style: "currency",
    currency: "RUB"
});

Проценты

const formatter = new Intl.NumberFormat("ru-RU", {
    style: "percent"
});

console.log(
    formatter.format(0.25)
);

Результат:

25 %

Единицы измерения

const formatter = new Intl.NumberFormat("ru-RU", {
    style: "unit",
    unit: "kilometer"
});

Настройка дробной части

const formatter = new Intl.NumberFormat("ru-RU", {
    minimumFractionDigits: 2,
    maximumFractionDigits: 4
});

Компактная запись

const formatter = new Intl.NumberFormat("ru-RU", {
    notation: "compact"
});

Пример результата:

1,2 млн

Intl.PluralRules

Назначение

Intl.PluralRules определяет форму множественного числа.

Особенно важно для языков со сложной грамматикой.


Создание объекта

const rules = new Intl.PluralRules("ru-RU");

Метод select()

console.log(rules.select(1));
console.log(rules.select(2));
console.log(rules.select(5));

Результат:

one
few
many

Категории

Категория Значение
zero ноль
one один
two два
few несколько
many много
other остальные

Практический пример

const rules = new Intl.PluralRules("ru-RU");

function getMessage(count) {
    const forms = {
        one: "товар",
        few: "товара",
        many: "товаров"
    };

    return `${count} ${forms[rules.select(count)]}`;
}

Intl.RelativeTimeFormat

Назначение

Используется для отображения относительного времени:

  • «5 минут назад»;
  • «через 2 дня»;
  • «вчера».

Создание formatter

const rtf = new Intl.RelativeTimeFormat("ru-RU");

Метод format()

rtf.format(-5, "minute");

Результат:

5 минут назад

Поддерживаемые единицы

Единица Значение
second секунды
minute минуты
hour часы
day дни
week недели
month месяцы
year годы

Короткий стиль

const rtf = new Intl.RelativeTimeFormat("ru-RU", {
    style: "short"
});

Intl.ListFormat

Назначение

Форматирует массивы строк в естественный текст.


Пример

const formatter = new Intl.ListFormat("ru-RU");

formatter.format([
    "JavaScript",
    "TypeScript",
    "Node.js"
]);

Результат:

JavaScript, TypeScript и Node.js

Типы списков

const formatter = new Intl.ListFormat("ru-RU", {
    type: "conjunction"
});

Варианты:

Значение Описание
conjunction союз «и»
disjunction союз «или»
unit перечисление единиц

Intl.Locale

Назначение

Intl.Locale предоставляет объектное представление локали.


Создание объекта

const locale = new Intl.Locale("ru-RU");

Свойства

console.log(locale.language);
console.log(locale.region);
console.log(locale.script);

Календарь

const locale = new Intl.Locale("ru-RU", {
    calendar: "gregory"
});

Нумерация

const locale = new Intl.Locale("ar", {
    numberingSystem: "arab"
});

Intl.DisplayNames

Назначение

Позволяет получать локализованные названия:

  • стран;
  • языков;
  • валют;
  • регионов.

Пример со странами

const regionNames = new Intl.DisplayNames(
    ["ru-RU"],
    { type: "region" }
);

console.log(
    regionNames.of("US")
);

Результат:

Соединённые Штаты

Языки

const languageNames = new Intl.DisplayNames(
    ["ru-RU"],
    { type: "language" }
);

console.log(
    languageNames.of("de")
);

Валюты

const currencyNames = new Intl.DisplayNames(
    ["ru-RU"],
    { type: "currency" }
);

Intl.Segmenter

Назначение

Intl.Segmenter разбивает текст на:

  • слова;
  • предложения;
  • символы.

Особенно полезен для языков без явных разделителей.


Создание сегментатора

const segmenter = new Intl.Segmenter("ru-RU", {
    granularity: "word"
});

Сегментация текста

const segments = segmenter.segment(
    "JavaScript очень популярен"
);

for (const item of segments) {
    console.log(item.segment);
}

Уровни сегментации

Значение Описание
grapheme символы
word слова
sentence предложения

Intl.DurationFormat

Назначение

Форматирование длительности времени.


Пример

const formatter = new Intl.DurationFormat("ru-RU", {
    style: "long"
});

formatter.format({
    hours: 5,
    minutes: 30
});

Результат:

5 часов 30 минут

Intl.supportedValuesOf()

Назначение

Метод возвращает список поддерживаемых значений.


Пример с часовыми поясами

console.log(
    Intl.supportedValuesOf("timeZone")
);

Поддерживаемые категории

Категория Описание
calendar календари
currency валюты
timeZone временные зоны
unit единицы измерения

Общая схема работы объектов Intl

Большинство объектов Intl имеют одинаковую структуру:

new Intl.ClassName(locales, options)

Где:

Аргумент Назначение
locales локаль или массив локалей
options объект настроек

Внутреннее устройство Intl

ICU

JavaScript использует ICU (International Components for Unicode).

ICU содержит:

  • языковые правила;
  • данные локалей;
  • шаблоны форматирования;
  • правила сортировки.

CLDR

ICU использует CLDR (Common Locale Data Repository).

CLDR поддерживается Unicode Consortium и включает:

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

resolvedOptions()

Практически каждый formatter имеет метод:

resolvedOptions()

Он показывает фактически применённые настройки.


Пример

const formatter = new Intl.NumberFormat("ru-RU");

console.log(
    formatter.resolvedOptions()
);

Форматы локализации

Unicode Extension Tags

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

Пример:

"ru-RU-u-ca-gregory"

Расшифровка:

Часть Значение
u Unicode extension
ca calendar
gregory григорианский календарь

Нумерационные системы

new Intl.NumberFormat(
    "ar-EG-u-nu-arab"
);

Проверка поддержки

supportedLocalesOf()

console.log(
    Intl.NumberFormat.supportedLocalesOf([
        "ru-RU",
        "fr-FR"
    ])
);

Наследование структуры API

Все formatter-объекты имеют похожую организацию:

Элемент Назначение
Конструктор создание formatter
format() форматирование
resolvedOptions() информация о настройках

Основные категории Intl API

Форматирование данных

  • NumberFormat
  • DateTimeFormat
  • DurationFormat

Лингвистика

  • PluralRules
  • Segmenter
  • Collator

Представление данных

  • DisplayNames
  • ListFormat
  • RelativeTimeFormat

Работа с локалями

  • Locale
  • supportedValuesOf()

Особенности совместимости

Некоторые возможности появились позже других:

API Поддержка
Collator высокая
NumberFormat высокая
DateTimeFormat высокая
PluralRules современная
Segmenter ограниченная
DurationFormat новая

Типичный паттерн использования

Создание formatter

const formatter = new Intl.NumberFormat(
    "ru-RU",
    {
        style: "currency",
        currency: "KZT"
    }
);

Повторное использование

formatter.format(1000);
formatter.format(2000);
formatter.format(3000);

Создание formatter — сравнительно дорогая операция, поэтому объекты обычно кешируют.


Кеширование formatter

Пример

const cache = new Map();

function getFormatter(locale) {
    if (!cache.has(locale)) {
        cache.set(
            locale,
            new Intl.NumberFormat(locale)
        );
    }

    return cache.get(locale);
}

Взаимодействие компонентов

Разные части Intl могут использоваться совместно.


Пример

const number = new Intl.NumberFormat("ru-RU");

const plural = new Intl.PluralRules("ru-RU");

const count = 5;

const word = {
    one: "файл",
    few: "файла",
    many: "файлов"
}[plural.select(count)];

console.log(
    `${number.format(count)} ${word}`
);

Роль Intl в современных приложениях

Intl используется в:

  • браузерах;
  • Node.js;
  • мобильных приложениях;
  • серверном рендеринге;
  • системах локализации;
  • финансовых сервисах;
  • аналитических панелях;
  • международных интернет-магазинах.

Преимущества структуры Intl API

Модульность

Каждый объект решает отдельную задачу.


Унификация

Похожая структура всех formatter-объектов упрощает изучение API.


Локализация без сторонних библиотек

Многие задачи решаются встроенными средствами JavaScript.


Поддержка международных стандартов

Intl соответствует:

  • Unicode;
  • CLDR;
  • ICU;
  • ECMAScript Internationalization Specification.