В интернационализации JavaScript ключевую роль играют правила представления структурированных данных: чисел, дат, валют и списков. В Globalize эти правила опираются на данные CLDR и выражаются через набор механизмов форматирования, среди которых особое место занимают разделители и союзы — элементы, формирующие визуальную и смысловую связность текста в разных языковых системах.
Числовые значения в разных локалях не только отличаются символами, но и структурой группировки. В основе лежат два ключевых разделителя:
В англоязычной традиции используется точка как десятичный разделитель и запятая как групповой:
12,345.67
В ряде европейских локалей ситуация обратная или модифицированная:
12 345,67
или
12.345,67
Globalize использует CLDR-данные для определения символов:
При форматировании числа библиотека опирается на локаль и применяет шаблон, определённый в данных:
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");
При этом разделители числовой части наследуются от локали, а валюта влияет только на оформление шаблона.
Дата и время содержат собственные наборы разделителей, определяемые стандартами локали:
Примеры:
27/05/2026
27.05.2026
2026-05-27
Время:
14:35
14.35
Globalize использует CLDR date patterns, где разделители не фиксированы, а зависят от локали:
Globalize.formatDate(new Date(), { datetime: "short" });
При этом шаблоны строятся из компонентов:
Разделители между ними не являются частью логики библиотеки — они задаются шаблоном локали.
Наиболее сложный класс задач связан с объединением элементов списка. В естественных языках соединительные конструкции различаются не только символами, но и грамматической структурой.
В английском языке:
A, B, and C
В других языках:
A, B y C
A, B und C
A, B, C
В CLDR это реализовано через list patterns, где определяются три типа соединений:
Globalize использует эти данные при форматировании списков:
Globalize.formatList(["яблоко", "груша", "слива"]);
Результат зависит от локали и типа списка.
Используется для нейтральных списков объектов:
яблоко, груша и слива
Шаблон включает несколько уровней:
CLDR задаёт структуры вида:
{0}, {1}
{0}, {1}, and {2}
Союзы формируют смысловую связь между элементами списка. В разных языках используются разные стратегии:
Globalize не генерирует грамматику самостоятельно, а опирается на предопределённые шаблоны CLDR.
Различие между «и» и «или» критично для смысловой интерпретации:
Примеры:
яблоко, груша или слива
яблоко, груша и слива
Внутренне это реализуется через разные наборы шаблонов:
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 оперирует не символами, а абстрактными маркерами:
Эти маркеры заменяются конкретными значениями в зависимости от локали.
При комбинировании чисел, дат и списков возникает задача вложенного форматирования:
1,234.56, 2,345.67, and 3,456.78
или локализованный вариант:
1 234,56; 2 345,67 et 3 456,78
В таких случаях разделители списков взаимодействуют с внутренними разделителями чисел, что требует строгого разделения уровней форматирования.
Globalize решает это через последовательное форматирование:
Во многих локалях пробел выполняет функцию нейтрального разделителя. Он используется:
Неразрывный пробел часто становится важным элементом, предотвращающим разрыв смысловой единицы при переносах строки.
Ошибки в выборе разделителей приводят к нарушению читаемости и двусмысленности. Например:
1234567.89 EUR
и
1 234 567,89 €
представляют не только разные визуальные стили, но и разные культурные нормы восприятия чисел.
Globalize обеспечивает согласованность через централизованное применение CLDR-правил, где каждый тип разделителя строго определён и не пересекается с другими слоями форматирования.
Союзы в списках выполняют не только синтаксическую, но и семантическую функцию:
В отличие от простых символов-разделителей, союзы являются частью языковой модели, встроенной в локаль.
В реальных приложениях часто встречаются вложенные структуры:
A (1,234.56), B (2,345.67) and C (3,456.78)
Здесь одновременно присутствуют:
Globalize обеспечивает корректное применение локали на каждом уровне, исключая конфликт символов и правил между слоями форматирования.