Добрый день! В шаблоне который использую на сайте есть графа количество комнат, шаблон был на английском и после перевода нашлась проблем в том что в английском языке у них два варианта: bed - комната в ед. числе и beds - комнаты во мн. числе. У нас же получается три варианта: 1 комната, 2 комнаты и 5 комнат. К сожалению поддержки вывода правильных окончаний русских слов у шаблона нет. Вот как я пытался решить эту проблему. Код (PHP): function endingWord($n = 0, $w = '') { $n = abs(intval($n)); $w = explode('|', $w); return $n%10==1&&$n%100!=11?$w[0].$w[1]:($n%10>=2&&$n%10<=4&&($n%100<10||$n%100>=20)?$w[0].$w[2]:$w[0].$w[3]); } $n = 7; echo("".$n." ".endingWord($n, 'Комна|та|ты|т')); Как видите в этом коде подставляется нужное окончание слова в зависимости от значения $n, в примере значение просто написано цифрой, в самом шаблоне количество комнат выводится так: beds() Тогда я прописал beds() в $n и получился такой код Код (PHP): $n = beds(); echo("".$n." ".endingWord($n, 'Комна|та|ты|т')); Это версия не работает, выводится цифра количества комнат и подставляется только слово Комнат, и без разницы сколько там комнат одна или много. В чем ошибка не могу разобраться, буду признателен за помощь.
В intl есть отличные решения. Попробуйте вот эту красоту: http://php.ru/manual/messageformatter.create.html, если версия php и наличие расширения intl позволяет. Лучше не напишите сами. А так - ну отладьте по шагам... Код тернарника страшненький, может со скобками что напутано Добавлено спустя 8 минут 53 секунды: Код (PHP): <?php $fmt = new MessageFormatter("ru_RU", "Здесь {0,plural,=0{котов нет} =1{есть один кот} one{# кот} few{# кота} many{# котов} other{# кота}}!"); for ($i = 0; $i < 20; $i++) { echo $fmt->format([$i]) . "<br>"; } Вывод: Код (PHP): Здесь котов нет! Здесь есть один кот! Здесь 2 кота! Здесь 3 кота! Здесь 4 кота! Здесь 5 котов! Здесь 6 котов! Здесь 7 котов! Здесь 8 котов! Здесь 9 котов! Здесь 10 котов! Здесь 11 котов! Здесь 12 котов! Здесь 13 котов! Здесь 14 котов! Здесь 15 котов! Здесь 16 котов! Здесь 17 котов! Здесь 18 котов! Здесь 19 котов!
p@R@dox 55RU, ага, мне очень нравится. Хотя есть одна проблема - с разными версиями intl. В Yii2 куча кода есть для того, чтобы привести шаблон к синтаксису, используемому в установленной версии.
ну и в мусор его ))) Есть же такой способ - возьму на заметку, а то в некоторых проектах, тоже что-то подобное приходилось костылять-..лять ((
Не, как раз таки Yii позволяет не думать о версии intl, поскольку переданный шаблон преобразуется к виду, понятному установленной на сервере intl (это внешняя либа на языке C, на самом деле. http://site.icu-project.org/). А при использовании через php без посредников надо следить, какая версия стоит на сервере. Но всё равно, оно того стоит
Код (PHP): <?php /* * Smarty plugin * ------------------------------------------------------------- * File: modifier.declension.php * Type: modifier * Name: declension * ------------------------------------------------------------- */ function smarty_modifier_declension($number, $titles = ["{DECLENSION}","{DECLENSION}","{DECLENSION}"]){ $cases = array (2, 0, 1, 1, 1, 2); if(empty($titles)) $titles = array_fill(0,3,"{DECLENSION}"); if(count($titles) < 3){ $titles += array_fill(3-count($titles), 3-count($titles), $titles[0]); } if(!$number) return $titles[2]; return $titles[ ($number%100 > 4 && $number %100 < 20) ? 2 : $cases[min($number%10, 5)] ]; } ?>