#
Pluralization
1.0.3+
#
Введение
Языки различаются правилами преобразования слов во множественное число («час», «часа», «часов» и так далее). Одни языки, вроде английского, имеют две формы, другие — только одну форму, а в некоторых есть множество форм. Данный компонент использует правила плюрализации Unicode CLDR для определения корректной формы слова в указанном числе. CLDR использует короткие мнемонические теги для этих форм:
- zero
- one (единственное число)
- two (двойственное число)
- few (паукальное число)
- many (также используется для дробей, если они имеют отдельный класс)
- other (основная форма множественного числа; также используется, если у языка имеется только одна форма или если требуемая форма не указана. Указание этой формы обязательно)
См. Language Plural Rules для форм каждого языка в CLDR.
Эти формы используются для предоставления локализованных единиц с более естественными способами выражения фраз, которые варьируются во множественном числе, например: «1 час», «2 часа» и «5 часов». Хотя они не могут выразить все сложности ествественных языков, они допускают более ествественную формулировку, чем конструкции вроде «1 час(-а/-ов)».
Плюрализация осуществляется с помощью объекта Intl.PluralRules.
#
TeslaCloud.Pluralization
#
Свойства
#
__construct
Конструктор класса.
__construct: function(language)
#
Параметры
#
pluralPhraseName
Получение названия фразы в нужной форме плюрализации.
pluralPhraseName: function(number, phrases)
#
Параметры
#
Примеры
#
Получение названия фразы из списка
/**
* В случае, если текущий язык — английский, а 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)
#
Параметры
#
Примеры
const phrase = TeslaCloud.Pluralization.current.phrasePlural(
Object.keys(items).length,
'there_are_x_items',
{'{count}': Object.keys(items).length}
);
#
getCardinal
Получение названия формы плюрализации для текущего языка.
getCardinal: function (number, availableCardinals = [])
#
Параметры
Если браузер пользователя не поддерживает плюрализацию, будет возвращена форма other
.
#
Плюрализация во фразах
Существует возможность задавать правила плюрализации непосредственно во фразах. Для этого во фразе необходимо создать подобную конструкцию:
{plural
number="{number}"
zero="…"
one="…"
two="…"
few="…"
many="…"
other="…"
123="…"
precision="0"
}
#
Параметры
#
Примеры
Создадим фразу test_plural_phrase
для русского языка:
На столе {plural
number="{count}"
1="одна книга"
one="#n книга"
few="#n книги"
other="#n книг"
}.
В тестовых целях, добавить фразу в JavaScript можно непосредственно из консоли:
XF.phrases.test_plural_phrase = `На столе {plural
number="{count}"
1="одна книга"
one="#n книга"
few="#n книги"
other="#n книг"
}.`;
Обратите внимание на 1
и one
: 1
обозначает конкретное число, а one
— категорию, в которую, в русском языке, будут входить все числа, оканчивающиеся на 1, кроме 11 и 111.
Далее отобразим фразу:
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 книга.
Если браузер пользователя не поддерживает плюрализацию, функция XF.phrase
вернет текст фразы без правил плюрализации:
На столе .
Для предотвращения подобных ситуаций в функцию XF.phrase
может быть передан аргумет fallback
, который будет использоваться вместо указанной фразы.