Не так давно захотелось мне сделать русский язык в результатах поиска, а именно, чтобы количество найденных топиков и комментариев выводилось так: 3 топика, 11 комментариев.
Сделать это проще простого, однако в силу природной лени и версии 0.2 движка у меня, публиковать хак не хочу ;) Привожу текст хака здесь, вдруг кому понадобится (а кому надо — тот разберется).
Итак, сначала нам понадобится класс, который будет выполнять морфологию. Это запросто, вот его текст:
class International
{
// Дата, дат, даты
public static function GetLanguageItem($count, $singular, $plural, $genitive)
{
$returnValue = '';
$num = sprintf("%02d", $count);
$num = substr($num, strlen($num) - 2, 2);
$last = substr($num, 1, 1);
$prevLast = substr($num, 0, 1);
switch($prevLast)
{
case 1:
{
$returnValue = $count.' '.$plural;
break;
}
default:
{
switch($last)
{
case 0:
{
$returnValue = $count.' '.$plural;
break;
}
case 1:
{
$returnValue = $count.' '.$singular;
break;
}
case 2:
case 3:
case 4:
{
$returnValue = $count.' '.$genitive;
break;
}
case 5:
case 6:
case 7:
case 8:
case 9:
{
$returnValue = $count.' '.$plural;
break;
}
}
}
}
return $returnValue;
}
}
Итак, его можно использовать с любым текстом и числами, например:
Класс International размещаем там, где нам удобнее. Я его закинул в файл /classes/actions/ActionSearch.class.php, это, конечно, не совсем правильно с точки зрения модульности, архитектуры и фэн шуя, но Вы уж сами решите ;)
Отлично, теперь покажу, что надо поправить в результатах поиска (актуально для версии со 102 редакции транка).
/classes/actions/ActionSearch.class.php (правим в самом конце)
$this->SetTemplateAction('results');
$this->Viewer_AddHtmlTitle($aReq['q']);
$this->Viewer_Assign('bIsResults', $this->bIsResults);
// Наши правки начались тут
$sTopicText = International::GetLanguageItem($aRes['aCounts']['topics'], 'топик', 'топиков', 'топика');
$sCommentText = International::GetLanguageItem($aRes['aCounts']['comments'], 'комментарий', 'комментариев', 'комментария');
$this->Viewer_Assign('sTopicText', $sTopicText);
$this->Viewer_Assign('sCommentText', $sCommentText);
// И вот тут закончились ;)
return $aRes;
Отлично, но теперь надо бы рассказать шаблону о том, какой он теперь модный ;)
У меня он находится в файле /templates/skin/habra/actions/ActionSearch/results.tpl, у обладателей редакции 0.3 — примерно там же, думаю, только надо заменить habra на new.
Заранее извиняюсь, если что-то непонятно. Думаю, хаки лучше накатывать тогда, когда есть общее понимание работы движка ;) По возможности отвечу на вопросы в комментах.
3 комментария