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 по email OK
Отлично!
Было бы вообще круто, если бы в Yii добавили возможность написания числительных текстом (прописью) с возможностью это дело локализовывать. В принципе и сейчас я себя нормально чувствую делая это руками, но тем не менее. :)
Нечто вроде: $str=someFunction(33,'яблоко|яблока|яблок');
$str при этом будет содержать «тридцать три яблока».
Подписался.
А можно как-нибудь подписаться на оповещения о новых комментариях к посту на почту не отвечая на сам пост?
+1 к подписке на комменты :) неплоха бы rss к каждому посту приделать, как в wordpress
Вроде что-то похожее уже давно было(только там условие использовалось), или я путаю?
Вот бы еще делать принудительное приведение к массиву, чтобы писать 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;
?
:( if_array = is_array
resurtm, числа прописью — не такая типичная задача, чтобы её включать в ядро фреймворка.
xandeadx, resurtm, оповещалку без комментирования сделаю, как и RSS.
Ekstazi, было, но условие для Русского языка выходило очень монстрозное.
mitallast, неплохая идея, посмотрю.
mitallast, посмотрел, понравилось. Войдёт в релиз.
А как насчёт такого?
echo Yii::t('app', '{somename} apple|apples', array('{somename}' => 10)); или типа того? Просто реально бесит писать число, а потом ещё его и в перевод передавать. Двойная работа...
В общем написал репорт: http://code.google.com/p/yii/issues/detail?id=1987
Добавил вариант использования без
Yii::t
.Отлично! А мне пришлось вот такое правило ваять :)
Добрый день Александр, у меня вопрос по Вашей книге - Книга рецептов. выполнил пример на стр 24-25 , где обработчик по событию отправляет сообщение. На views/site/index.php написал такую штуку
В config/main.php у меня стоит
В protected/message создал en/main.php как указано тут www.dbhelp.ru/multilingual-blog/page/
Захожу mysite/ и вылазит ошибка :
Событие "CPhpMessageSource.onmissingtranslation" привязано неверным обработчиком "array".
Где ошибся?
Скорее всего в конфиге где задавали обработчик
onMissingTranslation
.Спасибо, такая проблемка, все подключил как у Вас на 68 странице для Новостей и статей - внешние действие DeleteAction, но как понять что оно работает, если я удаляю в контроллерах, использующих его полностью метод actionDelete, то :
Error 404 Системе не удалось найти запрашиваемое действие "delete".
если удаляю содержимое методов actionDelete, то просто белый экран и ничего не происходит
Если пишу в DeleteAction в методе run() первой строчкой
die('Хоть что-нибудь!!!!');
То эта смерть не срабатывает, где я мог ошибиться?
Andrey, скорее всего забыли подключить в
actions
. Ну и при подключении внешнего action-а не должно быть одноимённых методов.