Yii2 → Множественная форма числа (plural)

Задача: выводить количество чего-либо во множественном склонении, например “1 статья”, “2 статьи”, “17 статей” и т.д.

Решение #1

$n = 17;
Yii::t('app', '{n, plural, one{У нас # статья} few{У нас # статьи} many{У нас # статей} other{У нас # статьи}}!', ['n' => $n]);

Для того, что бы код заработал:

1. Убедитесь что установлено и подключено PHP расширениеintl. При необходимости установите его sudo apt-get install php5-intl.

2. Убедитесь что версия установленной библиотеки ICU(International Components for Unicode) 4.9 и выше. Если это не так, рекомендуется обновиться.

3. Обратите внимание, что функция перевода Yii::t()используется для перевода сообщений, а не для вывода оригинальных сообщений. Поэтому она не сработает еслиsourceLanguage и language отличаются, а перевод отсутствует. В коде приложения у вас все должно быть на английском, а все английские фразы должны быть переведены в файлах переводов.

Когда вы установите язык исходного кода sourceLanguage какru-RU, а язык перевода language в ru-RU — тогда перевод для оригинального сообщения не будет найден и функция Yii::t() применит правила множественной формы к исходному сообщению.

Для того что бы корректно сработала множественная формаplural может потребоваться поменять параметрsourceLanguage в конфигурации на ru-RU

Решение #2

Т.к. это не всегда верный путь, например если в остальной части шаблона содержится вывод на других языках. Тогда можно воспользоваться примером:

$n = 17;
echo \Yii::$app->i18n->messageFormatter->format(
    '{n, plural, one{У нас # статья} few{У нас # статьи} many{У нас # статей} other{У нас # статьи}}!',
    ['n' => $n],
    \Yii::$app->language
);
  • Иван

    Решение 2 спасло кучу моего времени. Спасибо!