Плюрализация в международной локализации представляет собой механизм выбора правильной формы слова в зависимости от числового значения. В JavaScript-библиотеке Globalize этот процесс основан на стандартах CLDR (Unicode Common Locale Data Repository), где для каждого языка определены категории множественности и правила их применения.
CLDR определяет набор категорий, которые используются для выбора грамматически корректной формы:
Не все языки используют полный набор категорий. Например:
one и
otherone, few,
many, otherGlobalize не вводит собственных правил, а строго следует данным CLDR, что обеспечивает согласованность поведения между различными платформами и библиотеками.
Плюрализация в Globalize невозможна без предварительной загрузки CLDR-данных. Библиотека не содержит языковых правил по умолчанию и требует явного подключения ресурсов.
Минимальный набор данных включает:
likelySubtagspluralsnumbersca-gregorian (если используются даты вместе с
сообщениями)Пример загрузки:
Globalize.load(
require("cldr-data/supplemental/likelySubtags"),
require("cldr-data/supplemental/plurals"),
require("cldr-data/main/ru/numbers"),
require("cldr-data/main/ru/plurals")
);
Globalize.locale("ru");
Без загрузки данных о множественности любые операции, связанные с pluralization, будут невозможны.
Основной интерфейс работы с множественными формами в Globalize строится вокруг форматирования сообщений с поддержкой CLDR plural rules.
Простейший пример использования:
const globalize = new Globalize("en");
globalize.formatMessage(
"{count, plural, one {# item} other {# items}}",
{ count: 1 }
);
// "1 item"
При изменении значения:
globalize.formatMessage(
"{count, plural, one {# item} other {# items}}",
{ count: 5 }
);
// "5 items"
Символ # автоматически подставляет значение числового
параметра.
"{count, plural, one {# file} other {# files}}"
Правило простое: единица — форма one, все остальные
значения — other.
const globalize = new Globalize("ru");
globalize.formatMessage(
"{count, plural, one {# файл} few {# файла} many {# файлов} other {# файла}}",
{ count: 3 }
);
Поведение определяется морфологическими правилами:
onefewmanyGlobalize полностью делегирует выбор категории CLDR-движку, не требуя ручной логики ветвления.
В арабской локали система ещё более детализирована:
"{count, plural, zero {لا عناصر} one {عنصر واحد} two {عنصران} few {# عناصر} many {# عنصراً} other {# عنصر}}"
Здесь каждая числовая группа имеет отдельную грамматическую форму.
CLDR позволяет задавать точные числовые совпадения, которые имеют приоритет над категориями plural rules.
"{count, plural, =0 {нет файлов} one {# файл} other {# файлов}}"
Поведение:
0 → «нет файлов»1 → «1 файл»Этот механизм полезен для исключений, где стандартные категории не подходят.
Pluralization в Globalize интегрируется в систему ICU MessageFormat, что позволяет строить вложенные структуры:
"{count, plural,
one {{name} имеет # сообщение}
other {{name} имеет # сообщений}
}"
Допускается комбинирование с другими типами форматирования:
"{count, plural,
one {{count} файл был загружен}
few {{count} файла было загружено}
many {{count} файлов было загружено}
}"
Plural-выражения не выполняют вычислений внутри шаблонов. Все числовые значения должны быть заранее подготовлены и переданы в контекст форматирования.
globalize.formatMessage(
"{count, plural, one {# item processed} other {# items processed}}",
{ count: items.length }
);
Таким образом обеспечивается разделение логики и представления.
В зависимости от языка, ноль может относиться к разным категориям:
0 → other0 → manyzeroGlobalize не интерпретирует ноль самостоятельно, а использует правила CLDR, что исключает несоответствия.
При частом форматировании сообщений plural-форматы компилируются в функции форматирования. Это позволяет:
Типичный подход:
const message = globalize.messageFormatter(
"{count, plural, one {# item} other {# items}}"
);
message({ count: 10 });
Функция messageFormatter создаёт предкомпилированный
форматтер.
Pluralization часто комбинируется с:
numberFormatter)Пример:
"{count, plural,
one {{count} файл, обновлён {date}}
other {{count} файлов, обновлены {date}}
}"
Где date предварительно форматируется через
dateFormatter.
При работе с pluralization в Globalize встречаются следующие ограничения:
otherСинтаксис plural в Globalize полностью совместим с ICU MessageFormat:
{variable, plural, one {...} other {...}}
Это обеспечивает переносимость сообщений между различными системами интернационализации и серверными платформами.
Механизм pluralization в Globalize можно представить как последовательность шагов:
Такой подход обеспечивает предсказуемость и унификацию обработки множественных форм в разных языках.