# Pluralization

# Введение

Языки различаются правилами преобразования слов во множественное число («час», «часа», «часов» и так далее). Одни языки, вроде английского, имеют две формы, другие — только одну форму, а в некоторых есть множество форм. Данный компонент использует правила плюрализации Unicode CLDR для определения корректной формы слова в указанном числе. CLDR использует короткие мнемонические теги для этих форм:

  • zero
  • one (единственное число)
  • two (двойственное число)
  • few (паукальное число)
  • many (также используется для дробей, если они имеют отдельный класс)
  • other (основная форма множественного числа; также используется, если у языка имеется только одна форма или если требуемая форма не указана. Указание этой формы обязательно)

См. Language Plural Rules для форм каждого языка в CLDR.

Эти формы используются для предоставления локализованных единиц с более естественными способами выражения фраз, которые варьируются во множественном числе, например: «1 час», «2 часа» и «5 часов». Хотя они не могут выразить все сложности ествественных языков, они допускают более ествественную формулировку, чем конструкции вроде «1 час(-а/-ов)».

Плюрализация осуществляется с помощью объекта Intl.PluralRules.

# TeslaCloud.Pluralization

# Свойства

Свойство Тип Описание
language string Тег текущего языка в формате BCP 47.
pluralRules object Объект Intl.PluralRules для текущего языка.
isSupported (статическое) boolean Если false, браузер пользователя не поддерживает плюрализацию.
current (статическое) object Объект TeslaCloud.Pluralization для текущего языка пользователя.

# __construct

Конструктор класса.

__construct: function(language)

# Параметры

Параметр Тип Значение по умолчанию Описание
language string Значение атрибута lang тега html. Тег текущего языка в формате BCP 47.

# pluralPhraseName

Получение названия фразы в нужной форме плюрализации.

pluralPhraseName: function(number, phrases)

# Параметры

Параметр Тип Описание
number number Число для плюрализации.
phrases object|string Объект названий фраз для разных форм плюрализации.
Если указана строка, она будет являться названием фразы в форме other, а названия для других форм будут образованы посредством добавления суффиксов _zero, _one, _two, _few и _many.
Форма other является обязательной.

# Примеры

# Получение названия фразы из списка
/**
 * В случае, если текущий язык — английский, а count($items) == 1, будет возвращено «there_is_one_item», в
 * противном случае — «there_are_x_items». Остальные формы не используются английским языком, но могут быть
 * использованы другими языками.
 */
const phraseName = TeslaCloud.Pluralization.current.pluralPhraseName(
    Object.keys(items).length,
    {
        zero: 'there_are_zero_items',
        one: 'there_is_one_item',
        few: 'there_are_few_items',
        many: 'there_are_many_items',
        other: 'there_are_x_items'
    }
);
# Получение названия фразы без указания списка форм
/**
 * В отличие от предыдущего примера, здесь указывается не список названий фраз, а название одной фразы для формы
 * «other». Остальные фразы будут получены путем добавления к ним суффикса с названием формы: «there_are_x_items_zero»,
 * «there_are_x_items_one», «there_are_x_items_two», «there_are_x_items_few», «there_are_x_items_many».
 */
const phraseName = TeslaCloud.Pluralization.current.pluralPhraseName(Object.keys(items).length, 'there_are_x_items');

# phrasePlural

Получение фразы в нужной форме плюрализации.

phrasePlural: function (number, phrases, vars, fallback)

# Параметры

Параметр Тип Описание
number number Число для плюрализации.
phrases object|string Объект названий фраз для разных форм плюрализации.
Если указана строка, она будет являться названием фразы в форме other, а названия для других форм будут образованы посредством добавления суффиксов _zero, _one, _two, _few и _many.
Форма other является обязательной.
vars object Объект параметров фразы.
fallback string Значение, которое будет возвращено в следующих случаях:
- Плюрализация не поддерживается браузером пользователя
- Полученная фраза не найдена

# Примеры

const phrase = TeslaCloud.Pluralization.current.phrasePlural(
    Object.keys(items).length,
    'there_are_x_items',
    {'{count}': Object.keys(items).length}
);

# getCardinal

Получение названия формы плюрализации для текущего языка.

getCardinal: function (number, availableCardinals = [])

# Параметры

Параметр Тип Значение по умолчанию Описание
number number Число для плюрализации.
availableCardinals array [] Массив доступных форм плюрализации.

# Плюрализация во фразах

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

{plural
  number="{number}"
  zero="…"
  one="…"
  two="…"
  few="…"
  many="…"
  other="…"
  123="…"
  precision="0"
}

# Параметры

Параметр Описание
number Число для плюрализации. Обязательный параметр.
precision Число знаков после запятой в отображаемом числе.
other Значение для формы other other. Также используется, если требуемая форма недоступна. Обязательный параметр.
Название любой формы Значение для указанной формы.
Любое число Значение для определенного числа.

# Примеры

Создадим фразу test_plural_phrase для русского языка:

На столе {plural
           number="{count}"
           1="одна книга"
           one="#n книга"
           few="#n книги"
           other="#n книг"
         }.

Далее отобразим фразу:

console.log(XF.phrase('test_plural_phrase', {'{count}': 1}));
console.log(XF.phrase('test_plural_phrase', {'{count}': 2}));
console.log(XF.phrase('test_plural_phrase', {'{count}': 5}));
console.log(XF.phrase('test_plural_phrase', {'{count}': 10}));
console.log(XF.phrase('test_plural_phrase', {'{count}': 11}));
console.log(XF.phrase('test_plural_phrase', {'{count}': 101}));

Результат:

На столе одна книга.

На столе 2 книги.

На столе 5 книг.

На столе 10 книг.

На столе 11 книг.

На столе 101 книга.