Тему склонения я уже как то поднимал в Новости на сайте посредством twitter’a, теперь же всплыла задача когда необходимо было реализовать данное склонение в качестве плагина для Smarty. И обертка готова, кому нужно может пользоваться.
Нужно сохранить код приведенный ниже в файл function.decliner.php в каталоге с плагинами Smarty
<?php /** * Smarty {decliner} function plugin * * Type: function<br> * Name: decliner<br> * Purpose: handle word declines based on quantity number<br> * @author Dmitriy Soloduhin <darkomen86 at gmail dot com>(credits to http://mcaizer.habrahabr.ru/blog/11555/) * @param array $params * <pre> * Params: qty: number of items to choose correct declining form * word: declining forms of word. Ex: день, дня, дней. * </pre> * @param Smarty * @return string */ function smarty_function_decliner($params, &$smarty) { // be sure equation parameter is present if (empty($params['qty'])) $params['qty']=0; if (empty ($params['word'])) { $smarty->trigger_error("decliner: missing required parameter"); return; } $forms=explode(',',$params['word']); $params['qty'] = abs($params['qty']) % 100; $n1 = $params['qty'] % 10; if ( $params['qty'] > 10 && $params['qty'] < 20) return $forms[2]; else if ($n1 > 1 && $n1 < 5) return $forms[1]; else if ($n1 == 1) return $forms[0]; return $forms[2]; } /* vim: set expandtab: */ ?>
Затем в шаблонах можно использовать вот так.
{decliner qty=4 word='письма, письма, писем'}