#
Pluralization
1.0.2+
#
Введение
Языки различаются правилами преобразования слов во множественное число («час», «часа», «часов» и так далее). Одни языки, вроде английского, имеют две формы, другие — только одну форму, а в некоторых есть множествео форм. Данный компонент использует правила плюрализации Unicode CLDR для определения корректной формы слова в указанном числе. CLDR использует короткие мнемонические теги для этих форм:
- zero
- one (единственное число)
- two (двойственное число)
- few (паукальное число)
- many (также используется для дробей, если они имеют отдельный класс)
- other (основная форма множественного числа; также используется, если у языка имеется только одна форма или если требуемая форма не указана. Указание этой формы обязательно)
См. Language Plural Rules для форм каждого языка в CLDR.
Эти формы используются для предоставления локализованных единиц с более естественными способами выражения фраз, которые варьируются во множественном числе, например: «1 час», «2 часа» и «5 часов». Хотя они не могут выразить все сложности ествественных языков, они допускают более ествественную формулировку, чем конструкции вроде «1 час(-а/-ов)».
Плюрализация осуществляется с помощью библиотеки OblikStudio/php-pluralization.
#
TC\ComponentLibrary\Util\Pluralization
#
pluralPhraseName
Получение название фразы в нужной форме плюрализации.
public static function pluralPhraseName($number, $phrases, \XF\Language $language = null): string
#
Параметры
#
Примеры
#
Получение названия фразы из списка
/**
* В случае, если текущий язык — английский, а count($items) == 1, будет возвращено «there_is_one_item», в
* противном случае — «there_are_x_items». Остальные формы не используются английским языком, но могут быть
* использованы другими языками.
*/
$phraseName = \TC\ComponentLibrary\Util\Pluralization::pluralPhraseName(
count($items),
[
'zero' => 'there_are_zero_items',
'one' => 'there_is_one_item',
'two' => 'there_are_two_items',
'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».
*/
$phraseName = \TC\ComponentLibrary\Util\Pluralization::pluralPhraseName(count($items), 'there_are_x_items');
#
phrasePlural
Получение фразы в нужной форме плюрализации.
public static function phrasePlural($number, $phrases, array $params = [], bool $allowHtml = true, \XF\Language $language = null): \XF\Phrase
#
Параметры
#
Примеры
$phrase = \TC\ComponentLibrary\Util\Pluralization::pluralPhraseName(
count($items),
'there_are_x_items',
['count' => count($items)]
);
#
getCardinal
Получение названия формы плюрализации для нужного языка.
public static function getCardinal($number, \XF\Language $language = null, array $availableCardinals = []): string
#
Параметры
#
getLanguageCode
Получение кода языка для библиотеки OblikStudio/php-pluralization.
public static function getLanguageCode(\XF\Language $language): string
#
Параметры
#
getPluralization
Получение класса плюрализации из библиотеки OblikStudio/php-pluralization для нужного языка.
public static function getLanguageCode(\XF\Language $language): string
#
Параметры
#
Плюрализация в шаблонах
#
tc_phrase_plural
#
Параметры
#
Примеры
#
Получение фразы в нужной форме плюрализации из списка фраз
{{ tc_phrase_plural(
count($items),
{
'zero': 'there_are_zero_items',
'one': 'there_is_one_item',
'two': 'there_are_two_items',
'few': 'there_are_few_items',
'many': 'there_are_many_items',
'other': 'there_are_x_items'
},
{'count': count($items)}
) }}
#
Получение фразы в нужной форме плюрализации без списка фраз
{{ tc_phrase_plural(count($items), 'there_are_x_items', {'count': count($items)}) }}
#
Плюрализация во фразах
Кроме плюрализации через через PHP и функцию в шаблонах, существует возможность задавать правила плюрализации непосредственно во фразах. Для этого во фразе необходимо создать подобную конструкцию:
{plural
number="{number}"
zero="…"
one="…"
two="…"
few="…"
many="…"
other="…"
123="…"
precision="0"
}
Многострочная запись правил плюрализации доступна с версии 1.0.3.
#
Параметры
#
Примеры
Создадим фразу test_plural_phrase
для русского языка:
На столе {plural
number="{count}"
1="одна книга"
one="#n книга"
few="#n книги"
other="#n книг"
}.
Обратите внимание на 1
и one
: 1
обозначает конкретное число, а one
— категорию, в которую, в русском языке, будут входить все числа, оканчивающиеся на 1, кроме 11 и 111.
Далее отобразим фразу в шаблоне:
<p>{{ phrase_dynamic('test_plural_phrase', {'count': 1}) }}</p>
<p>{{ phrase_dynamic('test_plural_phrase', {'count': 2}) }}</p>
<p>{{ phrase_dynamic('test_plural_phrase', {'count': 5}) }}</p>
<p>{{ phrase_dynamic('test_plural_phrase', {'count': 10}) }}</p>
<p>{{ phrase_dynamic('test_plural_phrase', {'count': 11}) }}</p>
<p>{{ phrase_dynamic('test_plural_phrase', {'count': 101}) }}</p>
Так как функция phrase
шаблонизатора кэширует содержимое фразы во время компиляции шаблона, плюрализация фразы, вызванной через нее, работать не будет. Используйте вместо этого функцию phrase_dynamic
.
Результат:
На столе одна книга.
На столе 2 книги.
На столе 5 книг.
На столе 10 книг.
На столе 11 книг.
На столе 101 книга.