Типы списков: conjunction, disjunction, unit

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

Режим 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

Режим 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"

Каждый тип формирует отдельную модель восприятия данных, определяемую не синтаксисом массива, а его семантической ролью в интерфейсе или тексте.