FormatJS предоставляет набор инструментов для интернационализации
приложений, и компонент FormattedList является
специализированным решением для корректного форматирования списков в
соответствии с правилами локали. В отличие от ручной конкатенации строк,
компонент использует Intl.ListFormat, обеспечивая
грамматически и стилистически правильное отображение элементов списка в
разных языках.
Основная задача компонента — преобразование массива значений в локализованное строковое представление списка с учётом:
Компонент устраняет необходимость ручной обработки разделителей
(", ", " and ", " или "), делая
вывод адаптивным к текущей локали.
FormattedList поддерживает три ключевых режима форматирования,
соответствующих спецификации Intl.ListFormat.
Используется для перечислений, где элементы объединяются логически:
A, B, and CA, B и CПрименяется в описании наборов, групп и коллекций.
Используется для альтернатив:
A, B, or CA, B или CПрименяется в случаях выбора или взаимоисключающих вариантов.
Используется для единиц измерения и технических данных:
5 meters, 3 centimeters2 hours 30 minutesВ этом режиме учитываются особенности форматирования единиц в конкретной локали.
Компонент применяется внутри React-приложений как декларативная обёртка над списком значений.
import { FormattedList } from "react-intl";
const items = ["яблоки", "бананы", "апельсины"];
<FormattedList
value={items}
type="conjunction"
/>;
Результат зависит от локали:
яблоки, бананы и апельсиныapples, bananas, and orangesКлючевой параметр — value, представляющий массив строк
или React-узлов.
Наиболее частый вариант:
<FormattedList value={["HTML", "CSS", "JavaScript"]} type="conjunction" />
Поддерживаются компоненты, что позволяет форматировать списки с разметкой:
<FormattedList
value={[
<strong key="1">React</strong>,
<strong key="2">Vue</strong>,
<strong key="3">Angular</strong>
]}
type="disjunction"
/>
В этом случае форматирование разделителей сохраняется, а элементы остаются интерактивными.
FormattedList полностью делегирует логику форматирования движку
Intl.ListFormat, поэтому поведение определяется текущей
локалью IntlProvider.
Примеры различий:
| Локаль | conjunction | disjunction |
|---|---|---|
| en | A, B, and C | A, B, or C |
| ru | A, B и C | A, B или C |
| fr | A, B et C | A, B ou C |
Такая модель исключает необходимость ручного перевода связок.
FormattedList опирается на стандартный API:
new Intl.ListFormat(locale, {
style: "long",
type: "conjunction"
});
Далее:
Ручная реализация часто выглядит так:
items.join(", ")
Такой подход не учитывает:
FormattedList устраняет эти ограничения, делая вывод корректным для любой поддерживаемой локали.
Режим unit используется для технических данных:
<FormattedList
value={["10 kg", "250 g", "3 mg"]}
type="unit"
/>
В некоторых локалях возможны специфические правила объединения единиц, включая сокращения и перестановку элементов.
FormattedList не выполняет тяжёлой обработки на уровне
JavaScript-логики. Основная работа делегируется нативному
Intl.ListFormat, что обеспечивает:
Компонент работает в контексте провайдера:
import { IntlProvider, FormattedList } from "react-intl";
<IntlProvider locale="ru">
<FormattedList value={["один", "два", "три"]} type="conjunction" />
</IntlProvider>
Без IntlProvider используется локаль окружения
браузера.
При передаче React-элементов важно соблюдать требования React:
key;Intl.ListFormat в окружении;При отсутствии нативной поддержки используется полифилл
intl-listformat, который:
FormattedMessage — текстовые сообщения с
интерполяцией;FormattedNumber — числовое форматирование;FormattedDate — работа с датами;FormattedList — структурирование массивов в
человекочитаемые списки.Каждый компонент решает отдельный слой интернационализации, при этом FormattedList специализируется именно на связях между элементами коллекции.