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

12345NächsteLetzte

Ratibor
#1 22. August 2008, 14:27
Предлагаю прекратить зоопарк с окончаниями.
Пример:
Найдено 1 совпадений

Добавить в function.php(или еще куда):

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

function declension($digit,$expr,$onlyword=false)
{
        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];
        }
        return trim($res);
}

Пример использования:
echo 'Мне уже '.declension('<b>17</b>',array('год','года','лет')).'!';
// выведет «Мне уже <b>17</b> лет!»
Код не мой, нашел в закромах инета.
Не задавай глупых вопросов, не услышишь вранья.
Dayver
#2 22. August 2008, 21:17
Оооо эт то что доктор прописал.....давно муляет глаза. Я тоже за такую поправку
Pavlo Tkachenko aka Dayver
NovoKain
#3 24. August 2008, 07:45
Чую что не всё тут так просто... :)
Trustmaster
#4 24. August 2008, 11:54
В определенных местах использовать можно было бы, но проблема в том что это далеко не всем языкам нужно. А научить Сед склонять все и везде - это надо полностью языковую систему переделывать.
May the Source be with you!
Ratibor
#5 24. August 2008, 16:01
Trustmaster : В определенных местах использовать можно было бы, но проблема в том что это далеко не всем языкам нужно.
Да никакой там проблеммы нет, все вписывается в яыковые(lng) файлы, если какому то языку не надо склонять, то там так и остается одно значение, а если надо склонять, то вписать нужные склонения. Все прикручивается за минуту.
Не задавай глупых вопросов, не услышишь вранья.
Trustmaster
#6 24. August 2008, 18:30
Ну тогда это в языковом файле и надо реализовывать, не трогая остальную систему.
May the Source be with you!
Ratibor
#7 24. August 2008, 18:39
#637 Trustmaster : Ну тогда это в языковом файле и надо реализовывать, не трогая остальную систему.
Не передергивай.
Функцию все равно вносить надо.
Не задавай глупых вопросов, не услышишь вранья.
Ratibor
#8 4. September 2008, 05:00
Решил прикрутить к поиску нормальные окончания.
Внес функцию в functions.php

Изменил в search.ru.lang.php строку 36:
$L['plu_match'] = "совпадений";

заменил на:
$L['plu_match'] = "'совпадение','совпадения','совпадений'";

в файле search.phpстроку 537:
$plugin_body .= "<h4>".$L['Pages']." : ".$L['plu_found']." ".$items." ".$L['plu_match']."</h4>";

заменил на:
$plugin_body .= "<h4>".$L['Pages']." : ".$L['plu_found']." ".declension($items,array($L['plu_match']))."</h4>";

В итоге количество найденных страниц пишет, а вот одно из этих ('совпадение','совпадения','совпадений')слов нет. Вместо слова пустота.

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

Все стало работать как надо, но так не пойдет, т.к. теряется мультиязычность.

Почему не работает
declension($items,array($L['plu_match']))
а
declension($items,array('совпадение','совпадения','совпадений'))
работает нормально ?
Не задавай глупых вопросов, не услышишь вранья.
Ratibor
#9 4. September 2008, 16:38
Спасибо Boss за подсказку.

В общем заработало.

Итак вносим функцию в functions.php

далее в search.ru.lang.php строку 36:
$L['plu_match'] = "совпадений";

меняем на:
$L['plu_match'] = array('совпадение','совпадения','совпадений');

далее в файле search.php строку 537:
$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>";

Вуаля :)

Вернее в search.php несколько таких строк надо изменить:

поиском ищем:
".$items." ".$L['plu_match']."
и меняем все найденные строки на:
".declension($items,$L['plu_match'])."

в английском варианте в ланг файл вписать

$L['plu_match'] = array('match','matches');

для языков где нет склонения придетя вписать типа:
$L['plu_match'] = array('match','match');


Trustmaster : А научить Сед склонять все и везде - это надо полностью языковую систему переделывать.
Trustmaster я думаю можно вности эту функцию, т.к. ничего не страдает.
Изменения минимальные и не нужны какие то глобальные языковые переделки.
Не задавай глупых вопросов, не услышишь вранья.

Dieser Beitrag wurde von Ratibor (am 4. September 2008, 16:52, vor 15 Jahre) bearbeitet
Boss
#10 4. September 2008, 16:51
Для других языков сложновато. Если учесть, что им это не ачем, то думаю, будут недовольства. :) Надо просто доработать функцию. Чтобы брался и массив и переменная с единственным значением.
Ratibor
#11 4. September 2008, 17:03
# Boss : Для других языков сложновато. Если учесть, что им это не ачем, то думаю, будут недовольства.
Я думаю не обломаются несколько слов дважды вписать.
В данный момент страдают намного больше людей от таких окончаний.
Сейчас это просто надругательство над русским языком, да и как минимум английским тоже.
Ланг файлы все равно делают не "блондинки".
Да и не так много мест где нужно делать склонения.

P.S. Я конечно не против доработать, но за столько дней существования темы не было НИ ОДНОГО дельного предложения.
Не задавай глупых вопросов, не услышишь вранья.
Boss
#12 4. September 2008, 17:07
Что-нибудь типа:
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);
}
Ratibor
#13 4. September 2008, 17:14
Boss теперь нормально работает.
В общем кому надо склонения, вставляют array,
а кому не надо, оставляют lang файлы как есть.

Trustmaster
Если не хочешь глобально вносить функцию,
то ее можно внести в search.php.
Но вносить ее в каждый плагин отдельно - имхо изврат.
Не задавай глупых вопросов, не услышишь вранья.

Dieser Beitrag wurde von Ratibor (am 4. September 2008, 17:34, vor 15 Jahre) bearbeitet
esclkm
#14 13. Dezember 2008, 20:48
Идея супер! интересно она вкючена в реализацию. блин хочу скачать... посмотреть и ощутить седитию-н
littledev.ru - мой маленький зарождающийся блог о котонти.
снижение стоимости программирования и снижение стоимости производства разные вещи. Первое можно скорее сравнить с раздачей работникам дешевых инструментов, чем со снижением зарплаты
Trustmaster
#15 13. Dezember 2008, 21:04
Этой штуковины там еще нет. Подожди немного, ключики дам.
May the Source be with you!

12345NächsteLetzte