Разделители и союзы

В интернационализации JavaScript ключевую роль играют правила представления структурированных данных: чисел, дат, валют и списков. В Globalize эти правила опираются на данные CLDR и выражаются через набор механизмов форматирования, среди которых особое место занимают разделители и союзы — элементы, формирующие визуальную и смысловую связность текста в разных языковых системах.

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

  • десятичный разделитель;
  • разделитель групп разрядов.

В англоязычной традиции используется точка как десятичный разделитель и запятая как групповой:

12,345.67

В ряде европейских локалей ситуация обратная или модифицированная:

12 345,67

или

12.345,67

Globalize использует CLDR-данные для определения символов:

  • decimal: символ дробной части числа;
  • group: символ группировки разрядов;
  • plusSign / minusSign: знаки положительных и отрицательных чисел.

При форматировании числа библиотека опирается на локаль и применяет шаблон, определённый в данных:

Globalize.formatNumber(1234567.89);
// "1,234,567.89" или локализованный вариант

Внутренняя логика включает разбиение числа на целую и дробную части, после чего применяется правило группировки. Группировка может быть регулярной (каждые три цифры) или специализированной (например, индийская система: 1,23,45,678).

Разделители валютных форматов

В денежном представлении разделители работают совместно с валютным символом. В разных культурах позиция валютного обозначения и пробелов варьируется:

$1,234.56
1 234,56 €

Globalize применяет шаблоны CLDR currency pattern, где учитываются:

  • позиция символа валюты;
  • наличие пробела между числом и символом;
  • формат отрицательных значений;
  • округление до допустимых разрядов.

Особое значение имеет разделение визуальной структуры и семантики: символ валюты не просто добавляется, а интегрируется в шаблон:

Globalize.formatCurrency(1234.56, "EUR");

При этом разделители числовой части наследуются от локали, а валюта влияет только на оформление шаблона.

Разделители дат и времени

Дата и время содержат собственные наборы разделителей, определяемые стандартами локали:

  • разделитель даты (date separator);
  • разделитель времени (time separator);
  • символы формата (например, «/», «.» или «-»).

Примеры:

27/05/2026
27.05.2026
2026-05-27

Время:

14:35
14.35

Globalize использует CLDR date patterns, где разделители не фиксированы, а зависят от локали:

Globalize.formatDate(new Date(), { datetime: "short" });

При этом шаблоны строятся из компонентов:

  • year
  • month
  • day
  • hour
  • minute
  • second

Разделители между ними не являются частью логики библиотеки — они задаются шаблоном локали.

Списки и разделительные конструкции

Наиболее сложный класс задач связан с объединением элементов списка. В естественных языках соединительные конструкции различаются не только символами, но и грамматической структурой.

В английском языке:

A, B, and C

В других языках:

A, B y C
A, B und C
A, B, C

В CLDR это реализовано через list patterns, где определяются три типа соединений:

  • стандартное перечисление (standard);
  • перечисление с союзом «и» (conjunction);
  • перечисление с союзом «или» (disjunction).

Globalize использует эти данные при форматировании списков:

Globalize.formatList(["яблоко", "груша", "слива"]);

Результат зависит от локали и типа списка.

Стандартное перечисление

Используется для нейтральных списков объектов:

яблоко, груша и слива

Шаблон включает несколько уровней:

  • два элемента;
  • промежуточные элементы;
  • последний элемент с союзом.

CLDR задаёт структуры вида:

{0}, {1}
{0}, {1}, and {2}

Разделение через союзы

Союзы формируют смысловую связь между элементами списка. В разных языках используются разные стратегии:

  • фиксированный союз («и», «or»);
  • изменяемый союз в зависимости от падежа;
  • отсутствие союза (простое перечисление через запятую).

Globalize не генерирует грамматику самостоятельно, а опирается на предопределённые шаблоны CLDR.

Союзы в контексте логических списков

Различие между «и» и «или» критично для смысловой интерпретации:

  • conjunction → логическое объединение;
  • disjunction → альтернативность.

Примеры:

яблоко, груша или слива
яблоко, груша и слива

Внутренне это реализуется через разные наборы шаблонов:

Globalize.formatList(items, { type: "or" });
Globalize.formatList(items, { type: "and" });

Каждый тип списка использует собственную таблицу CLDR.

Разделители в единицах измерения

Единицы измерения формируют отдельный слой форматирования, где разделители могут включать:

  • пробел между числом и единицей;
  • локализованные символы;
  • изменения порядка компонентов.

Примеры:

10 km
10 км
10,0 km

В некоторых локалях пробел является обязательным элементом, выполняющим функцию визуального разделителя, предотвращающего слияние числа и единицы в единый токен.

Globalize применяет unit formatting patterns:

Globalize.formatUnit(10, "kilometer");

Контекстные различия разделителей

Разделители не являются универсальными символами; их поведение зависит от контекста:

  • в числах один тип группировки;
  • в датах другой;
  • в списках третья логика;
  • в единицах измерения возможен комбинированный подход.

CLDR разделяет эти области, и Globalize следует этим разграничениям без пересечения правил.

Множественные системы разделителей

В некоторых локалях используется несколько допустимых вариантов оформления. Например:

  • альтернативные десятичные разделители;
  • вариативные пробелы (обычный, неразрывный);
  • разные стили перечислений.

Это приводит к необходимости нормализации через шаблоны, а не через фиксированные символы.

Globalize оперирует не символами, а абстрактными маркерами:

  • decimal
  • group
  • list-separator
  • conjunction
  • disjunction

Эти маркеры заменяются конкретными значениями в зависимости от локали.

Взаимодействие разделителей с форматированием строк

При комбинировании чисел, дат и списков возникает задача вложенного форматирования:

1,234.56, 2,345.67, and 3,456.78

или локализованный вариант:

1 234,56; 2 345,67 et 3 456,78

В таких случаях разделители списков взаимодействуют с внутренними разделителями чисел, что требует строгого разделения уровней форматирования.

Globalize решает это через последовательное форматирование:

  1. форматирование чисел;
  2. применение list pattern;
  3. сборка итоговой строки.

Пробел как универсальный разделитель

Во многих локалях пробел выполняет функцию нейтрального разделителя. Он используется:

  • между числом и единицей;
  • внутри составных чисел;
  • в валютных обозначениях;
  • в датах в расширенных форматах.

Неразрывный пробел часто становится важным элементом, предотвращающим разрыв смысловой единицы при переносах строки.

Разделители и устойчивость локализации

Ошибки в выборе разделителей приводят к нарушению читаемости и двусмысленности. Например:

1234567.89 EUR

и

1 234 567,89 €

представляют не только разные визуальные стили, но и разные культурные нормы восприятия чисел.

Globalize обеспечивает согласованность через централизованное применение CLDR-правил, где каждый тип разделителя строго определён и не пересекается с другими слоями форматирования.

Семантическая роль союзов в представлении данных

Союзы в списках выполняют не только синтаксическую, но и семантическую функцию:

  • определяют тип связи между элементами;
  • влияют на интерпретацию данных;
  • изменяют структуру восприятия информации.

В отличие от простых символов-разделителей, союзы являются частью языковой модели, встроенной в локаль.

Комплексные структуры с несколькими уровнями разделителей

В реальных приложениях часто встречаются вложенные структуры:

A (1,234.56), B (2,345.67) and C (3,456.78)

Здесь одновременно присутствуют:

  • числовые разделители;
  • скобочные структуры;
  • list separators;
  • conjunctions.

Globalize обеспечивает корректное применение локали на каждом уровне, исключая конфликт символов и правил между слоями форматирования.