Intl API предоставляет единообразные механизмы локализации
форматирования данных, среди которых особое место занимают стили
отображения long, short, narrow.
Эти стили используются в нескольких форматерах — прежде всего в
Intl.DateTimeFormat, Intl.RelativeTimeFormat и
Intl.ListFormat. Их задача — управлять степенью подробности
и формой представления текста в зависимости от языка и контекста.
В Intl.DateTimeFormat стили применяются через опции
dateStyle и timeStyle. Они задают готовые
шаблоны форматирования даты и времени без необходимости вручную
комбинировать поля.
long — развёрнутое представлениеshort — сокращённое, компактное
отображениеnarrow — максимально сжатая форма,
часто с символами или минимальными обозначениямиЭти стили учитывают локаль, поэтому результат существенно различается между языками и регионами.
dateStyle управляет форматом даты целиком.
const d = new Date(2026, 0, 24);
new Intl.DateTimeFormat('ru-RU', { dateStyle: 'long' }).format(d);
// "24 января 2026 г."
new Intl.DateTimeFormat('ru-RU', { dateStyle: 'short' }).format(d);
// "24.01.2026"
new Intl.DateTimeFormat('en-US', { dateStyle: 'long' }).format(d);
// "January 24, 2026"
Различия между стилями проявляются в уровне вербализации:
long использует полные названия месяцев и
структурированную формуshort ориентирован на цифровое представлениеnarrow в зависимости от локали может совпадать с
short или быть ещё более сжатымtimeStyle задаёт формат времени:
const d = new Date(2026, 0, 24, 18, 45);
new Intl.DateTimeFormat('ru-RU', { timeStyle: 'long' }).format(d);
// "18:45:00"
new Intl.DateTimeFormat('ru-RU', { timeStyle: 'short' }).format(d);
// "18:45"
В разных локалях поведение отличается:
long чаще добавляет секундыИспользование обоих параметров одновременно создаёт полный формат:
new Intl.DateTimeFormat('en-GB', {
dateStyle: 'long',
timeStyle: 'short'
}).format(new Date(2026, 0, 24, 18, 45));
// "24 January 2026 at 18:45"
Intl.RelativeTimeFormat формирует относительные
выражения времени: «2 дня назад», «через 3 часа».
Параметр style принимает:
longshortnarrowconst rtfLong = new Intl.RelativeTimeFormat('ru', { style: 'long' });
rtfLong.format(-5, 'day');
// "5 дней назад"
Наиболее читаемая форма, использующая полные слова:
new Intl.RelativeTimeFormat('ru', { style: 'long' }).format(3, 'hour');
// "через 3 часа"
Характерные особенности:
Сокращённое отображение:
new Intl.RelativeTimeFormat('en', { style: 'short' }).format(-2, 'minute');
// "2 min. ago"
Особенности:
Максимально сжатая форма:
new Intl.RelativeTimeFormat('en', { style: 'narrow' }).format(5, 'second');
// "in 5 sec."
Характеристики:
Intl.ListFormat отвечает за форматирование списков с
учётом грамматики языка.
const list = ['яблоко', 'груша', 'слива'];
new Intl.ListFormat('ru', { style: 'long', type: 'conjunction' }).format(list);
// "яблоко, груша и слива"
Полная грамматическая форма соединения элементов:
new Intl.ListFormat('en', { style: 'long', type: 'conjunction' })
.format(['bread', 'milk', 'cheese']);
// "bread, milk, and cheese"
Особенности:
Сокращённая форма, ориентированная на компактность:
new Intl.ListFormat('en', { style: 'short', type: 'conjunction' })
.format(['bread', 'milk', 'cheese']);
// "bread, milk & cheese"
Характерные черты:
& или аналоговМинимально возможное представление:
new Intl.ListFormat('en', { style: 'narrow', type: 'conjunction' })
.format(['bread', 'milk', 'cheese']);
// "bread, milk, cheese"
Особенности:
Несмотря на общую терминологию, поведение long,
short, narrow зависит от конкретного API:
DateTimeFormat стили управляют структурой даты и
времениRelativeTimeFormat — лексической полнотой
выраженийListFormat — правилами соединения элементов
спискаОбщая тенденция сохраняется:
long — максимальная языковая полнотаshort — компромисс между длиной и читаемостьюnarrow — минимизация символовРезультаты форматирования не являются фиксированными строками. Они зависят от:
ru, en, de,
fr)Одно и то же значение может быть представлено различно:
new Intl.RelativeTimeFormat('ru', { style: 'short' }).format(-1, 'day');
// "1 дн. назад"
new Intl.RelativeTimeFormat('en', { style: 'short' }).format(-1, 'day');
// "1 day ago"
Стилевые различия особенно заметны в интерфейсах с ограниченным пространством:
narrowshortlongДля DateTimeFormat:
long подходит для печатных форм и детальных
просмотровshort — для таблиц и интерфейсовnarrow — для компактных индикаторов времениДля RelativeTimeFormat:
long — текстовые блоки и ленты событийshort — UI-меткиnarrow — таймлайны и статусные индикаторыПоддержка стилей зависит от версии ECMAScript Internationalization API и ICU-библиотек:
long поддерживается максимально стабильноshort зависит от локали и версии ICUnarrow может совпадать с short или
long при отсутствии специфичных правилВ некоторых окружениях различия между short и
narrow минимальны, особенно для дат и времени, тогда как в
списках они выражены сильнее.
Если конкретная локаль не определяет отдельные правила для
narrow или short, происходит деградация:
long как базового варианта| Стиль | Назначение | Длина строки | Читаемость | Плотность |
|---|---|---|---|---|
| long | Полная форма | высокая | максимальная | низкая |
| short | Сокращённая форма | средняя | высокая | средняя |
| narrow | Минимальная форма | минимальная | ограниченная | высокая |