В интернационализации JavaScript списки представляют собой не просто соединение элементов через запятую или союз. В разных языках правила перечисления зависят от синтаксиса, пунктуации и семантики. Библиотека Globalize опирается на данные CLDR (Unicode Common Locale Data Repository), где для каждого языка определены правила построения списков с учётом локали.
Форматирование списка в Globalize выполняется через единый механизм, который учитывает:
Соединительный тип используется для перечислений, где элементы объединяются логически как группа.
Примеры значений:
В английском:
В русском:
Особенность заключается в том, что последний элемент может получать особую связку, отличную от остальных разделителей.
Globalize.formatList(["яблоко", "груша", "слива"], {
type: "conjunction"
});
Результат зависит от локали:
Разделительный тип применяется, когда элементы являются альтернативами.
Примеры значений:
В английском:
В русском:
Семантика здесь критична: элементы не объединяются, а рассматриваются как взаимоисключающие варианты.
Globalize.formatList(["HTML", "CSS", "JavaScript"], {
type: "disjunction"
});
Результат:
Unit-списки используются для физических или измеряемых величин, где элементы формируют составное значение.
Примеры:
Особенность unit-списков заключается в том, что они часто подчиняются более строгим правилам форматирования, чем обычные перечисления. В некоторых локалях может отсутствовать союз перед последним элементом или использоваться более компактная форма.
Globalize.formatList(["2 часа", "30 минут"], {
type: "unit"
});
Результат:
Помимо семантического типа, списки поддерживают стили представления.
Используется в стандартных текстах, документации и интерфейсах.
Примеры:
Данный стиль обеспечивает максимальную читаемость.
Применяется в ограниченном пространстве интерфейса.
Примеры:
В некоторых локалях стиль может совпадать с long при отсутствии специфических сокращений.
Используется в крайне ограниченных пространствах, например в мобильных интерфейсах или таблицах.
Примеры:
В ряде локалей может полностью исключать связующие элементы.
CLDR определяет правила для каждой локали отдельно, включая:
Globalize.formatList(["red", "green", "blue"], {
type: "conjunction"
});
Результаты:
В некоторых локалях перед последним элементом может присутствовать дополнительная запятая.
Пример:
Globalize не принимает решение самостоятельно — поведение определяется данными CLDR.
При одном элементе форматирование списка фактически не применяется:
Globalize.formatList(["A"], { type: "conjunction" });
Результат:
Для двух элементов часто используется упрощённая форма без промежуточного разделителя:
Пустые массивы обычно возвращают пустую строку или результат, зависящий от реализации:
Globalize.formatList([], { type: "conjunction" });
Результат:
Тип и стиль могут комбинироваться, создавая множество вариантов форматирования.
Globalize.formatList(["A", "B", "C"], {
type: "conjunction",
style: "short"
});
Возможные эффекты:
При вложенных структурах применяется последовательное форматирование:
[
["A1", "A2"],
["B1", "B2"]
]
Сначала форматируется внутренний список, затем внешний:
Такие случаи требуют осторожности, поскольку семантика может теряться при избыточной вложенности.
Работа типов списков полностью зависит от наличия корректных CLDR-данных:
Отсутствие данных приводит к fallback-логике, которая может быть упрощённой и не учитывать особенности языка.
При использовании списков в интерфейсах часто учитываются дополнительные ограничения:
Списки часто формируются на уровне представления данных, а не бизнес-логики, что снижает дублирование кода и повышает консистентность интерфейса.
Форматирование списков в Globalize связано с:
Оптимизация достигается через: