Pluralization

Status
Not open for further replies.

NikitOS

Administrator
Данная версия устарела. Новая версия на docs.teslacloud.net.

Введение
Языки различаются правилами преобразования слов во множественное число («час», «часа», «часов» и так далее). Одни языки, вроде английского, имеют две формы, другие — только одну форму, а в некоторых есть множество форм. Данный компонент использует правила плюрализации Unicode CLDR для определения корректной формы слова в указанном числе. CLDR использует короткие мнемонические теги для этих форм:
  • zero
  • one (единственное число)
  • two (двойственное число)
  • few (паукальное число)
  • many (также используется для дробей, если они имеют отдельный класс)
  • other (основная форма множественного числа; также используется, если у языка имеется только одна форма или если требуемая форма не указана. Указание этой формы обязательно)
См. Language Plural Rules для форм каждого языка в CLDR.

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



Плюрализация осуществляется с помощью библиотеки OblikStudio/php-pluralization.
 

NikitOS

Administrator
TC\ComponentLibrary\Util\Pluralization
pluralPhraseName
Получение название фразы в нужной форме плюрализации.
public static function pluralPhraseName($number, $phrases, \XF\Language $language = null): string

Параметры
ПараметрТипЗначение по умолчаниюОписание
numberint|floatЧисло для плюрализации.
phrasesstring[]|stringНазвания фраз для разных форм плюрализации.
Если указана строка, она будет являться названием фразы в форме other, а названия для других форм будут образованы посредством добавления суффиксов _zero, _one, _two, _few и _many.
Форма other является обязательной.
languageXF\LanguageXF::language()Объект языка, для которого осуществляется плюрализация.

Примеры
Получение названия фразы из списка.
PHP:
/**
 * В случае, если текущий язык — английский, а 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'
    ]
);

Получение названия фразы без указания списка фраз.
PHP:
/**
 * В отличе от предыдущего примера, здесь указывается не список названий фраз, а название одной фразы для формы «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

Параметры
ПараметрТипЗначение по умолчаниюОписание
numberint|floatЧисло для плюрализации.
phrasesstring[]|stringНазвания фраз для разных форм плюрализации.
Если указана строка, она будет являться названием фразы в форме other, а названия для других форм будут образованы посредством добавления суффиксов _zero, _one, _two, _few и _many.
Форма other является обязательной.
paramsarray[]Массив параметров фразы.
allowHtmlbooltrueВключение/отключение экранирования HTML во фразе.
languageXF\LanguageXF::language()Объект языка, для которого осуществляется плюрализация.

Примеры
PHP:
$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

Параметры
ПараметрТипЗначение по умолчаниюОписание
numberint|floatЧисло для плюрализации.
languageXF\LanguageXF::language()Объект языка, для которого осуществляется плюрализация.
availableCardinalsstring[][]Список доступных форм плюрализации. В случае, если нужная форма плюрализации недоступна, будет возвращено other.

getLanguageCode
Получение кода языка для библиотеки OblikStudio/php-pluralization.
public static function getLanguageCode(\XF\Language $language): string

Параметры
ПараметрТипОписание
languageXF\LanguageОбъект языка, для которого нужно получить код.

getPluralization
Получение класса плюрализации из библиотеки OblikStudio/php-pluralization для нужного языка.
public static function getLanguageCode(\XF\Language $language): string

Параметры
ПараметрТипОписание
languageXF\LanguageОбъект языка, для которого нужно получить класс плюрализация.
 

NikitOS

Administrator
Плюрализация в шаблонах
tc_phrase_plural
Параметры
ПараметрТипЗначение по умолчаниюОписание
numberint|floatЧисло для плюрализации.
phrasesstring[]|stringНазвания фраз для разных форм плюрализации.
Если указана строка, она будет являться названием фразы в форме other, а названия для других форм будут образованы посредством добавления суффиксов _zero, _one, _two, _few и _many.
Форма other является обязательной.
paramsarray[]Массив параметров фразы.

Примеры
Получение фразы в нужной форме плюрализации из списка фраз.
Code:
{{ 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)}) }}
 

NikitOS

Administrator
Плюрализация во фразах
Кроме плюрализации через через PHP и функцию внутри шаблона, существует возможность задавать правила плюрализации непосредственно во фразах. Для этого во фразе необходимо создать подобную конструкцию:
{plural number="{number}" zero="…" one="…" two="…" few="…" many="…" other="…" 123="…"}

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

Примеры
Создадим фразу plural_phrase_test для русского языка:
На столе {plural number="{count}" 1="одна книга" one="#n книга" few="#n книги" other="#n книг"}.
Обратите внимание на 1 и one: 1 обозначает конкретное число, а one — категорию, в которую, в русском языке, будут входить все числа, оканчивающиеся на 1, кроме 11.

Далее отобразим фразу в шаблоне:
HTML:
<p>{{ phrase_dynamic('plural_phrase_test', {'count': 1}) }}</p>
<p>{{ phrase_dynamic('plural_phrase_test', {'count': 2}) }}</p>
<p>{{ phrase_dynamic('plural_phrase_test', {'count': 5}) }}</p>
<p>{{ phrase_dynamic('plural_phrase_test', {'count': 10}) }}</p>
<p>{{ phrase_dynamic('plural_phrase_test', {'count': 11}) }}</p>
<p>{{ phrase_dynamic('plural_phrase_test', {'count': 101}) }}</p>
Так как функция phrase шаблонизатора кэширует содержимое фразы во время компиляции шаблона, плюрализация фразы, вызванной через нее, работать не будет. Используйте вместо этого функцию phrase_dynamic.

Результат:
На столе одна книга.
На столе 2 книги.
На столе 5 книг.
На столе 10 книг.
На столе 11 книг.
На столе 101 книга.
 
Status
Not open for further replies.
Back
Top Bottom