Перейти к публикации

Рекомендованные сообщения

a37c03677a75333da269ea380fc7442e.png

Берем и смотрим код здесь (документ в utf8) либо качаем.

Вставляем его содержимое в самый низ файла engine/modules/functions.php вместо: ?> (если есть)

Открываем корневой index.php и находим:



echo $tpl->result['main'];

Выше вставляем:


$tpl->result['main'] = preg_replace("#\[declination=(\d+)\](.+?)\[/declination\]#ies", "word_declination('\\1', '\\2')", $tpl->result['main']);

Установка заверешена. Пример использования в шаблоне полной новости fullstory.tpl:


[declination={comments-num}]комментари|й|я|ев[/declination]



[declination={views}]просмотр|а|ов[/declination]

Таким способом любое число (либо свое, либо выводимое модулем) мы можем скормить declination и получить человеческое слово.

Еще примеры склоненяемых слов в других его вариациях задокументированы в самом коде по ссылке выше.

Have a nice day!

PS. Источник картинки :)

Изменено пользователем aL13n
Ссылка на сообщение
Поделиться на других сайтах

Если кому интересно, то код функии слишком громоздкий, это все можно было сделать одной строчкой, например:

$plural = $n%10==1&&$n%100!=11?'комментарий':($n%10>=2&&$n%10<=4&&($n%100<10||$n%100>=20)?'комментария':'комментариев');
[/CODE]

где $n это количество. Плюс одна строчка на explode, т.е. всю функцию можно при желании можно сделать в две строчки.

Ссылка на сообщение
Поделиться на других сайтах

В функции идет проверка на строку, но в нее можно передать и массив слов в целом, и тогда будет работать "как ваш вариант".

Перелести моего варианта оценили оценят все, кто работает с мультиязычностью.

Ссылка на сообщение
Поделиться на других сайтах

aL13n,

У меня не было мысли критиковать ваш код, каждый пишет как хочет, просто дал совет что его можно серьезно сократить. Например if (is_string($words)) но при этом из строки preg_replace("#[declination=(d+)](.+?)[/declination]#ies", "word_declination('1', '2')", ничего кроме строки передаться не может, эта бесполезная проверка. Далее $r = array_shift($parts); тоже бесполезна потому как переменная нужная вам доступна как $parts[0] а сокращать массив нет никакой необходимости. Но даже если и делать универсальную функцию, чтобы в качестве аргумента передавать и строку и массив, то ее все равно можно сделать ровно в три строки. один if и return.

То что я написал это не критика, я подумал что возможно вам это будет интересно.

Ссылка на сообщение
Поделиться на других сайтах

Понял, спасибо.

Код использовался в проекте, который работает на symfony, где шаблонизатор - это сам php со всеми вытекающими.

Но суть сей затеи в том, чтобы вы реализовали подобный функционал в последующих версиях DLE. И все же важно в каком виде: чтобы можно было использовать как в шаблонах, так и в пользовательских модулях. То есть, чтобы один метод выполнял данную задачу.

Изменено пользователем aL13n
Ссылка на сообщение
Поделиться на других сайтах

А если через include ?


<?PHP

if(!defined('DATALIFEENGINE'))die("Hacking attempt!");

$word = explode("|",$word);$n=intval($n);

echo $n%10==1&&$n%100!=11?$word[0].$word[1]$n%10>=2&&$n%10<=4&&($n%100<10||$n%100>=20)?$word[0].$word[2]:$word[0].$word[3]);

?>


{include file="engine/modules/word.php?n=7&word=комментари|й|я|ев"}

{include file="engine/modules/word.php?n=1&word=|год|года|лет"}[/code]

Изменено пользователем Sander1
Ссылка на сообщение
Поделиться на других сайтах

Да, супер!

Но мне хотелось бы еще (как и многим), чтобы доступ к методу был доступен из сторонних дополнений, а не только из шаблона. При этом НЕ дублировать функциональность.

Надеюсь на скорую реализацию в следующех версиях скрипта DLE.

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

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

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

×
×
  • Создать...