Здравствуйте.
Думаю, многие из вас сталкивались с проблемой склонения существительных в зависимости от какого-либо числа. Например, “15 дней”. А если будет 21, выводить “21 дней”? Для решения этой проблемы написано множество функций, но я не встречал реализации в виде помощника Zend_View. Итак, встречайте: App_View_Helper_Plural.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Helper_View_Plural extends Zend_View_Helper_Abstract
{
    public function plural($n, $form1, $form2, $form3) {
        $plural = ($n % 10 == 1 && $n % 100 != 11 ? 0 : ($n % 10 >= 2 && $n % 10 <= 4 && ($n % 100 < 10 or $n % 100 >= 20) ? 1 : 2));
        switch($plural) {
            case 0:
            default:
                return $form1;
            case 1:
                return $form2;
            case 2:
                return $form3;
        }
    }
}

Использование (в шаблоне):

1
2
3
echo '1 ' . $this->plural(1, 'день', 'дня', 'дней') . '<br>';
echo '4 ' . $this->plural(4, 'день', 'дня', 'дней') . '<br>';
echo '25 ' . $this->plural(25, 'день', 'дня', 'дней');

Вывод:

1 день
4 дня
25 дней

Надеюсь, этого поможет вам сделать ваши проекты более удобными для пользователей.
Всего доброго.

6 Comments

  1. dkrnl says:

    было бы универсальнее сделать это на основе:
    \Zend\Locale\Data\plurals.xml

  2. Oleg Lobach says:

    А Zend_Translate не пробовал? Там тоже есть сколонение.

  3. Сергей Митрошин says:

    dkrnl что-то не вижу такого файла.

    Дело в том, что в проекте, для которого это писалось, многоязычности нет, Zend_Translate там используется исключительно для локализации сообщений валидаторов. Но вообще да, получилось дублирование функционала.

  4. Игорь Дозморов says:

    class Helper_View_Plural extends Zend_View_Helper_Abstract

    или

    class App_View_Helper_Plural extends Zend_View_Helper_Abstract

    ?

  5. Сергей Митрошин says:

    Игорь, это субъективно. Я предпочитаю складывать хэлперы в специальный каталог с путями helper/view и helper/action. Кому как нравится.

  6. storkvist says:

    Я в своих проектах использую похожий хэлпер, но в параметрах передаю шаблоны строк. Типа, $this->plural($n, array(‘продана %u конфетка’, ‘проданы %u конфетки’, ‘продано %u конфеток’));.

    Так, имхо, лучше, потому что позволяет обрабатывать более сложные языковые конструкции (как в примере).

Leave a Reply