Intl.ListFormat предоставляет механизм локализованного
форматирования списков, где выбор соединительных элементов и пунктуации
определяется языком и типом связи между элементами. Важной частью API
выступает параметр type, который определяет семантику
списка и влияет на способ его рендеринга. Поддерживаются три режима:
conjunction, disjunction,
unit.
Режим conjunction предназначен для перечислений, где
элементы объединяются логической связкой «и». Форматирование зависит от
локали: в английском используется and, в русском — «и», при
этом синтаксис может изменяться в зависимости от количества
элементов.
const formatter = new Intl.ListFormat('ru', {
style: 'long',
type: 'conjunction'
});
formatter.format(['яблоко', 'банан', 'груша']);
// "яблоко, банан и груша"
Для английской локали поведение отличается:
const formatter = new Intl.ListFormat('en', {
style: 'long',
type: 'conjunction'
});
formatter.format(['apple', 'banana', 'pear']);
// "apple, banana, and pear"
Логика построения строки включает не только выбор союза, но и правила постановки запятых, которые зависят от орфографических норм конкретного языка. В некоторых локалях последовательность элементов может изменять расположение союзов или знаков препинания.
Варианты style (short, narrow,
long) дополнительно регулируют плотность представления,
однако семантика conjunction сохраняется неизменной:
элементы интерпретируются как совместное множество.
Режим disjunction используется для альтернативных
вариантов, где между элементами подразумевается логическое «или». В
английской локали используется or, в русской — «или».
const formatter = new Intl.ListFormat('ru', {
style: 'long',
type: 'disjunction'
});
formatter.format(['Москва', 'Санкт-Петербург', 'Казань']);
// "Москва, Санкт-Петербург или Казань"
В английской локали:
const formatter = new Intl.ListFormat('en', {
style: 'long',
type: 'disjunction'
});
formatter.format(['red', 'green', 'blue']);
// "red, green, or blue"
Семантика режима предполагает взаимоисключающие элементы. При
формировании строки учитываются те же принципы локализации, что и в
conjunction, включая правила запятых и позиционирования
союза.
Особенность disjunction проявляется в языках, где
конструкция «или» может изменять падеж или форму слова в зависимости от
структуры предложения. Intl.ListFormat инкапсулирует эти
правила без необходимости ручной обработки.
Режим unit предназначен для списков единиц измерения или
кратких технических наборов значений, где отсутствует семантика
логического соединения. Элементы формируются с минимальной
синтаксической связностью, ориентированной на компактное
представление.
const formatter = new Intl.ListFormat('ru', {
style: 'long',
type: 'unit'
});
formatter.format(['10 кг', '20 кг', '30 кг']);
// "10 кг, 20 кг, 30 кг"
В английской локали:
const formatter = new Intl.ListFormat('en', {
style: 'long',
type: 'unit'
});
formatter.format(['10 kg', '20 kg', '30 kg']);
// "10 kg, 20 kg, 30 kg"
В отличие от conjunction и disjunction,
здесь отсутствует добавление союзов. Поведение оптимизировано для
плотного представления числовых и измерительных данных.
Применение unit охватывает:
Некоторые локали могут вводить специфические правила разделителей, но в большинстве случаев используется стандартная последовательность с запятой.
Все три типа (conjunction, disjunction,
unit) наследуют общий механизм локализации списка.
Внутренние правила зависят от языковых данных CLDR, на основе которых
формируются:
Пример влияния style:
const ru = new Intl.ListFormat('ru', { type: 'conjunction', style: 'short' });
ru.format(['A', 'B', 'C']);
// возможный результат: "A, B и C"
const ruNarrow = new Intl.ListFormat('ru', { type: 'conjunction', style: 'narrow' });
ruNarrow.format(['A', 'B', 'C']);
// возможный результат: "A, B, C"
В narrow стиле союз может быть опущен, что увеличивает
компактность вывода, особенно в интерфейсах с ограниченным
пространством.
Различие типов определяется не синтаксисом, а семантической моделью списка:
conjunction — объединение элементов в единое
множествоdisjunction — выбор одного или нескольких
альтернативных вариантовunit — перечисление без логического связующего
значенияЭти различия влияют на выбор локализованных союзов и структуру итоговой строки, но не изменяют саму последовательность элементов массива.
Для списков длиной 0 или 1 форматирование упрощается:
formatter.format([]);
// ""
formatter.format(['A']);
// "A"
При двух элементах локаль часто применяет специализированные правила без использования разделительных запятых:
formatter.format(['A', 'B']);
// "A и B" (ru, conjunction)
Такая оптимизация определяется языковыми данными и направлена на сокращение избыточной пунктуации.
Intl.ListFormat не ограничен строками. При передаче
чисел или смешанных типов значения приводятся к строковому
представлению:
const formatter = new Intl.ListFormat('ru', { type: 'unit' });
formatter.format([1, 2, 3]);
// "1, 2, 3"
Однако семантическая корректность зависит от предварительной
подготовки данных, особенно в случае unit, где обычно
требуется явное указание единиц измерения.
Разные языки демонстрируют значительные различия в реализации типов:
Intl.ListFormat скрывает эти различия за единым
интерфейсом, опираясь на стандартизированные данные локалей.
Использование conjunction характерно для
пользовательских интерфейсов с перечислением объектов:
const users = ['Анна', 'Иван', 'Мария'];
new Intl.ListFormat('ru', { type: 'conjunction' }).format(users);
// "Анна, Иван и Мария"
disjunction применяется для интерфейсов выбора:
const options = ['низкий', 'средний', 'высокий'];
new Intl.ListFormat('ru', { type: 'disjunction' }).format(options);
// "низкий, средний или высокий"
unit используется для технических панелей:
const sizes = ['12px', '14px', '16px'];
new Intl.ListFormat('ru', { type: 'unit' }).format(sizes);
// "12px, 14px, 16px"
Каждый тип формирует отдельную модель восприятия данных, определяемую не синтаксисом массива, а его семантической ролью в интерфейсе или тексте.