Forums / National / Russian / Зоопарк с окончаниями

Ratibor
#7360 2009-02-09 05:05
Надо наконец-то поставить точку с этим безобразием,
добавил в functions.php эту функцию.

Окончательный вариант выглядит так:

// Функция предназначена для вывода численных результатов с учетом
// склонения слов, например: "1 ответ", "2 ответа", "13 ответов" и т.д.
//
// $digit — целое число 
// можно вместе с форматированием, например "<b>6</b>"
// 
// $expr — массив, например: array("ответ", "ответа", "ответов").
// можно указывать только первые 2 элемента, например для склонения английских слов
// (в таком случае первый элемент - единственное число, второй - множественное)
// 
// $onlyword - если true, то выводит только слово, без числа
// необязательный параметр

function declension($digit,$expr,$onlyword=false)
{
    if(is_array($expr))
    {
            if(empty($expr[2])) $expr[2]=$expr[1];
            $i=preg_replace('/[^0-9]+/s','',$digit)%100; //intval не всегда корректно работает
            if($onlyword) $digit='';
            if($i>=5 && $i<=20) $res=$digit.' '.$expr[2];
            else
            {
                    $i%=10;
                    if($i==1) $res=$digit.' '.$expr[0];
                    elseif($i>=2 && $i<=4) $res=$digit.' '.$expr[1];
                    else $res=$digit.' '.$expr[2];
            }
    }
    else
    {
    $res = $digit.' '.$expr;
    }
 
        return trim($res);
}


Использование (на примере плагина search):

Пример русского ланг файла:
$L['plu_match'] = array('совпадение','совпадения','совпадений');
Примечание: нужно вписывать 3 значения: первое равно 1, второе рабно 2, третье равно 5. (1 совпадение, 2 совпадения, 5 совпадений)

Пример английского ланг файла:
$L['plu_match'] = array('match','matches');
Примечание: нужно вписывать 2 значения: первое единственное число, второе множественное.

В самом плагине было:
$plugin_body .= "<h4>".$L['Pages']." : ".$L['plu_found']." ".$items." ".$L['plu_match']."</h4>";
заменить на:
$plugin_body .= "<h4>".$L['Pages']." : ".$L['plu_found']." ".declension($items,$L['plu_match'])."</h4>";
Не задавай глупых вопросов, не услышишь вранья.