<rmcreative>

RSS

Yii::t и перевод множественных форм слова по CLDR

13 января 2011

В транк Yii попала ещё одна интересная возможность, которая облегчит жизнь всем, кто имеет дело с мультиязычными проектами, а именно поддержка перевода множественных форм слова по правилам CLDR в Yii::t.

Теперь для человеческого перевода строк вроде «10 яблок», «51 яблоко» не нужно писать страшные правила, а процесс будет выглядеть как показано ниже.

В коде делаем всё как обычно:

echo '10 '.Yii::t('app', 'apple', array(10));
echo '51 '.Yii::t('app', 'apple', array(51));

В файле перевода для Русского записываем:

return array(
    'apple' => 'яблоко|яблока|яблок',
);

Для Английского, соответственно будет:

return array(
    'apple' => 'apple|apples',
);

Полный список правил доступен на сайте CLDR.

Комментарии RSS

  1. №3720
    resurtm
    resurtm 13 янв. 2011 г., 6:58:26

    Отлично!

    Было бы вообще круто, если бы в Yii добавили возможность написания числительных текстом (прописью) с возможностью это дело локализовывать. В принципе и сейчас я себя нормально чувствую делая это руками, но тем не менее. :)

    Нечто вроде: $str=someFunction(33,'яблоко|яблока|яблок');

    $str при этом будет содержать «тридцать три яблока».

  2. №3721
    resurtm
    resurtm 13 янв. 2011 г., 6:59:59

    Подписался.

    А можно как-нибудь подписаться на оповещения о новых комментариях к посту на почту не отвечая на сам пост?

  3. №3722
    xandeadx
    xandeadx 13 янв. 2011 г., 7:06:43

    +1 к подписке на комменты :) неплоха бы rss к каждому посту приделать, как в wordpress

  4. №3723
    Ekstazi
    Ekstazi 13 янв. 2011 г., 11:24:24

    Вроде что-то похожее уже давно было(только там условие использовалось), или я путаю?

  5. №3724
    mitallast
    mitallast 13 янв. 2011 г., 12:14:11

    Вот бы еще делать принудительное приведение к массиву, чтобы писать echo '10 '.Yii::t('app', 'apple', 10); а не echo '10 '.Yii::t('app', 'apple', array(10));

    в принципе то просто делается - if(is_string($param) or is_numeric($param) /* etc */) $param = (array)$param;

  6. №3725
    White-Shadow
    White-Shadow 13 янв. 2011 г., 12:52:15
    if (!if_array($param)) $param = array($param);

    ?

  7. №3726
    White-Shadow
    White-Shadow 13 янв. 2011 г., 12:53:01

    :( if_array = is_array

  8. №3727
    Sam
    Sam 13 янв. 2011 г., 13:52:02

    resurtm, числа прописью — не такая типичная задача, чтобы её включать в ядро фреймворка.

    xandeadx, resurtm, оповещалку без комментирования сделаю, как и RSS.

    Ekstazi, было, но условие для Русского языка выходило очень монстрозное.

    mitallast, неплохая идея, посмотрю.

  9. №3728
    Sam
    Sam 13 янв. 2011 г., 14:12:50

    mitallast, посмотрел, понравилось. Войдёт в релиз.

  10. №3729
    Psih
    Psih 13 янв. 2011 г., 16:04:34

    А как насчёт такого?

    echo Yii::t('app', '{somename} apple|apples', array('{somename}' => 10)); или типа того? Просто реально бесит писать число, а потом ещё его и в перевод передавать. Двойная работа...

  11. №3730
    Psih
    Psih 13 янв. 2011 г., 16:58:39

    В общем написал репорт: http://code.google.com/p/yii/issues/detail?id=1987

  12. №3731
    Sam
    Sam 13 янв. 2011 г., 21:03:50

    Добавил вариант использования без Yii::t.

  13. №3732
    Tokolist
    Tokolist 14 янв. 2011 г., 1:11:22

    Отлично! А мне пришлось вот такое правило ваять :)

    'n==0 #No apples| n==1 #{count} apple| n>1 #{count} apples' => 'n%100>=11 && n%100<=14 #{count} яблок| n==0 #Нет яблок| n==1 || (n>20 && n%10==1) #{count} яблоко| (n>=2 && n<=4) || (n>20 && n%10>=2 && n%10<=4) #{count} яблока| true #{count} яблок',
    
  14. №9486
    Andrey
    Andrey 14 дек. 2014 г., 5:19:53

    Добрый день Александр, у меня вопрос по Вашей книге - Книга рецептов. выполнил пример на стр 24-25 , где обработчик по событию отправляет сообщение. На views/site/index.php написал такую штуку

    Yii::t("main", "яблоко");

    В config/main.php у меня стоит

    'sourceLanguage'=>'en',
        'language'=>'ru',

    В protected/message создал en/main.php как указано тут www.dbhelp.ru/multilingual-blog/page/

    Захожу mysite/ и вылазит ошибка :

    Событие "CPhpMessageSource.onmissingtranslation" привязано неверным обработчиком "array".

    Где ошибся?

  15. №9495
    Sam
    Sam 18 дек. 2014 г., 21:06:43

    Скорее всего в конфиге где задавали обработчик onMissingTranslation.

  16. №9498
    Andrey
    Andrey 20 дек. 2014 г., 5:17:15

    Спасибо, такая проблемка, все подключил как у Вас на 68 странице для Новостей и статей - внешние действие DeleteAction, но как понять что оно работает, если я удаляю в контроллерах, использующих его полностью метод actionDelete, то :

    Error 404 Системе не удалось найти запрашиваемое действие "delete".

    если удаляю содержимое методов actionDelete, то просто белый экран и ничего не происходит

    Если пишу в DeleteAction в методе run() первой строчкой

    die('Хоть что-нибудь!!!!');

    То эта смерть не срабатывает, где я мог ошибиться?

  17. №9518
    Sam
    Sam 26 дек. 2014 г., 19:11:35

    Andrey, скорее всего забыли подключить в actions. Ну и при подключении внешнего action-а не должно быть одноимённых методов.

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.