За последние 24 часа нас посетил 41051 программист и 1283 робота. Сейчас ищут 1276 программистов ...

Вывод правильных окончаний слов

Тема в разделе "PHP для новичков", создана пользователем Fllayres, 15 фев 2016.

  1. Fllayres

    Fllayres Новичок

    С нами с:
    15 фев 2016
    Сообщения:
    2
    Симпатии:
    0
    Добрый день!

    В шаблоне который использую на сайте есть графа количество комнат, шаблон был на английском и после перевода нашлась проблем в том что в английском языке у них два варианта: bed - комната в ед. числе и beds - комнаты во мн. числе. У нас же получается три варианта: 1 комната, 2 комнаты и 5 комнат. К сожалению поддержки вывода правильных окончаний русских слов у шаблона нет.

    Вот как я пытался решить эту проблему.
    Код (PHP):
    1. function endingWord($n = 0, $w = '') 
    2. {
    3.     $n = abs(intval($n));
    4.     $w = explode('|', $w);    
    5.     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]);
    6. }
    7.  
    8. $n = 7;
    9. echo("".$n." ".endingWord($n, 'Комна|та|ты|т'));
    10.  
    Как видите в этом коде подставляется нужное окончание слова в зависимости от значения $n, в примере значение просто написано цифрой, в самом шаблоне количество комнат выводится так: beds()

    Тогда я прописал beds() в $n и получился такой код
    Код (PHP):
    1. $n = beds();
    2. echo("".$n." ".endingWord($n, 'Комна|та|ты|т'));
    3.  
    Это версия не работает, выводится цифра количества комнат и подставляется только слово Комнат, и без разницы сколько там комнат одна или много. В чем ошибка не могу разобраться, буду признателен за помощь.
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    В intl есть отличные решения. Попробуйте вот эту красоту: http://php.ru/manual/messageformatter.create.html, если версия php и наличие расширения intl позволяет. Лучше не напишите сами. А так - ну отладьте по шагам... Код тернарника страшненький, может со скобками что напутано

    Добавлено спустя 8 минут 53 секунды:
    Код (PHP):
    1. <?php
    2. $fmt = new MessageFormatter("ru_RU", "Здесь {0,plural,=0{котов нет} =1{есть один кот} one{# кот} few{# кота} many{# котов} other{# кота}}!");
    3.  
    4. for ($i = 0; $i < 20; $i++) {
    5.     echo $fmt->format([$i]) . "<br>";
    6. }
    Вывод:
    Код (PHP):
    1. Здесь котов нет!
    2. Здесь есть один кот!
    3. Здесь 2 кота!
    4. Здесь 3 кота!
    5. Здесь 4 кота!
    6. Здесь 5 котов!
    7. Здесь 6 котов!
    8. Здесь 7 котов!
    9. Здесь 8 котов!
    10. Здесь 9 котов!
    11. Здесь 10 котов!
    12. Здесь 11 котов!
    13. Здесь 12 котов!
    14. Здесь 13 котов!
    15. Здесь 14 котов!
    16. Здесь 15 котов!
    17. Здесь 16 котов!
    18. Здесь 17 котов!
    19. Здесь 18 котов!
    20. Здесь 19 котов!
    21.  
     
  3. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    mkramer прикольно... +1!
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    p@R@dox 55RU, ага, мне очень нравится. Хотя есть одна проблема - с разными версиями intl. В Yii2 куча кода есть для того, чтобы привести шаблон к синтаксису, используемому в установленной версии.
     
  5. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    ну и в мусор его )))
    Есть же такой способ - возьму на заметку, а то в некоторых проектах, тоже что-то подобное приходилось костылять-..лять ((:)
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Не, как раз таки Yii позволяет не думать о версии intl, поскольку переданный шаблон преобразуется к виду, понятному установленной на сервере intl (это внешняя либа на языке C, на самом деле. http://site.icu-project.org/). А при использовании через php без посредников надо следить, какая версия стоит на сервере. Но всё равно, оно того стоит
     
  7. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    Код (PHP):
    1. <?php
    2. /*
    3.  * Smarty plugin
    4.  * -------------------------------------------------------------
    5.  * File:     modifier.declension.php
    6.  * Type:     modifier
    7.  * Name:     declension
    8.  * -------------------------------------------------------------
    9.  */
    10. function smarty_modifier_declension($number, $titles = ["{DECLENSION}","{DECLENSION}","{DECLENSION}"]){
    11.     $cases = array (2, 0, 1, 1, 1, 2);
    12.     if(empty($titles)) $titles = array_fill(0,3,"{DECLENSION}");
    13.     if(count($titles) < 3){
    14.         $titles += array_fill(3-count($titles), 3-count($titles), $titles[0]);
    15.     }
    16.     if(!$number)
    17.         return $titles[2];
    18.     return $titles[ ($number%100 > 4 && $number %100 < 20) ? 2 : $cases[min($number%10, 5)] ];
    19. }
    20. ?>
     
  8. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    :D
    еще есть кто им пользуется ?? это же прошлый век...
     
  9. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Как они делают такие большие аватары ?
     
  10. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    [​IMG]
     
  11. Fllayres

    Fllayres Новичок

    С нами с:
    15 фев 2016
    Сообщения:
    2
    Симпатии:
    0
    Огромное спасибо за ответы! Воспользовался вариантом mkramer отлично все работает, еще раз спасибо!