Проблемы с translate

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
NitroGenerate
Сообщения: 15
Зарегистрирован: 2013.08.19, 09:55

Проблемы с translate

Сообщение NitroGenerate »

Доброго времени суток форумчане.
Прикручиваю мультиязычность к сайту. Застрял на на одной интересной штуке, множественный перевод
В yii в языковых файлах (vendor/yiisoft/yii2/messages/ru/yii.php)
Есть такие переводы:
{delta, plural, =1{день} one{день} few{дня} many{дней} other{дня}}
Которые у меня в упор не хотят работать, не переводятся. И отображаются на экране как есть (как написал выше)
Капнул глубже. Проблема оказалась со стандартным php классом MessageFormatter, который стал доступен с php >= 5.3.0
Он в упор не хочет воспринимать =1{день}, если переписать сие конструкцию на:
{delta, plural, one{день} few{дня} many{дней} other{дня}} все нормально заведется.
Вопрос, почему во всех трансляционных файлах(ru, uk и тд), есть строчки с таким множественным переводом, если он нефига не работает ?
Может быть проблема у меня в пыхе и в доп. модулях ?

Я использую:
PHP Version 5.6.6
intl version 1.1.0
intl ICU version 4.2.1


Тут даже можно попробовать завести эту конструкцию в обход движка, для тестирования:

Код: Выделить всё

$lng = 'ru';
$pattern = '{delta, plural, =1{день} one{# день} few{# дня} many{# дней} other{# дня}}';
$MessageFormatter = new MessageFormatter($lng, $pattern);
var_dump($MessageFormatter) 
var_dump выдает null, так как ошибка в шаблоне $pattern;

Так как я на yii перешел несколько дней назад, прошу вашего мнения, может быть, мыслей каких-нибудь. По этому поводу. Забить ли мне на это? Это косяк с моим софтом? Или неужели с yii что-то не так.
padlyuck
Сообщения: 302
Зарегистрирован: 2015.02.03, 09:50

Re: Проблемы с translate

Сообщение padlyuck »

у вас версия intl ICU version не поддерживает именованные аргументы(могу ошибаться с терминологией), поэтому yii заменяет их см. /vendor/yiisoft/yii2/i18n/MessageFormatter.php метод format(). подозреваю, что после преобразования в формате появляется дублирующийся параметр(очень бросается в глаза 1{день} one{день})
NitroGenerate
Сообщения: 15
Зарегистрирован: 2013.08.19, 09:55

Re: Проблемы с translate

Сообщение NitroGenerate »

Дык, так-то

Код: Выделить всё

$lng = 'ru';
$pattern = '{delta, plural, one{# день} few{# дня} many{# дней} other{# дня}}';
$MessageFormatter = new MessageFormatter($lng, $pattern);
var_dump($MessageFormatter)
Все нормально заводится.

К тому же, requirements.php не ругается на мою версию intl
Ничего там yii не заменяет, он стартует класс MessageFormatter с таким шаблоном {delta, plural, =1{день} one{день} few{дня} many{дней} other{дня}}

Код: Выделить всё

// vendor/yiisoft/yii2/i18n/MessageFormatter.php (102)
var_dump($language); // ru
var_dump($pattern); // {delta, plural, =1{день} one{# день} few{# дня} many{# дней} other{# дня}}
$formatter = new \MessageFormatter($language, $pattern);
А не заменяет он, так как у меня изначальный код в модели такой:

Код: Выделить всё

Yii::t('app', '{delta, plural, =1{день} one{день} few{дня} many{дней} other{дня}}', ['delta' => $number])
Собственно говоря дефолтный язык, от которого идут переводы - русский.

Может кто попробует у себя завести код, который я написал в первом посте: :roll:

Код: Выделить всё

<?php
$lng = 'ru';
$pattern = '{delta, plural, =1{день} one{# день} few{# дня} many{# дней} other{# дня}}';
$MessageFormatter = new MessageFormatter($lng, $pattern);
var_dump($MessageFormatter)
Если на выходе получим объект, а не null, то пойду курить доки и бить сервер.
padlyuck
Сообщения: 302
Зарегистрирован: 2015.02.03, 09:50

Re: Проблемы с translate

Сообщение padlyuck »

а вы какой MessageFormatter имеете в виду в том куске кода что выше? системный или юи?
NitroGenerate
Сообщения: 15
Зарегистрирован: 2013.08.19, 09:55

Re: Проблемы с translate

Сообщение NitroGenerate »

Системный, так как проблема в нем кроется, вроде как.
Yii шный нормально отрабатывает (vendor/yiisoft/yii2/i18n/MessageFormatter.php), а вот когда пытается запустить системный(в районе 102 строки), ничего не получается.
И не получается из за "=1{день}", если ее убрать, то все нормально запуститься. Но проблема в том, что такая запись присутствует в каждом языковом шаблоне. И я бы конечно мог забить на это. Но хочется все таки разобраться, в чем трабл тут.
padlyuck
Сообщения: 302
Зарегистрирован: 2015.02.03, 09:50

Re: Проблемы с translate

Сообщение padlyuck »

C системным
код http://xam.vrn123.ru/pics/screenshot-20150305205410.png
результат object(MessageFormatter)[64]
NitroGenerate
Сообщения: 15
Зарегистрирован: 2013.08.19, 09:55

Re: Проблемы с translate

Сообщение NitroGenerate »

Мдя... весело. Спасибо большое.
А можно еще узнать, какие версии у вас PHP, intl и intl ICU
(в phpinfo(); )
padlyuck
Сообщения: 302
Зарегистрирован: 2015.02.03, 09:50

Re: Проблемы с translate

Сообщение padlyuck »

вот этот момент как раз мне и не понятен. по версии phpinfo версия intl ICU у меня 52.1(точку между 5 и 2 я не пропустил)
PHP Version 5.6.6-2
Internationalization support enabled
version 1.1.0
ICU version 52.1
ICU Data version 52.1
Debian 8 testing
NitroGenerate
Сообщения: 15
Зарегистрирован: 2013.08.19, 09:55

Re: Проблемы с translate

Сообщение NitroGenerate »

Проблема решена.
Мое решение:
Подробный мануал инсталла для centOS6 x64. Последняя версия ICU на офф сайте : 54, по этому ставить будем ее. (php - 5.6)

Код: Выделить всё

# cd /tmp
# wget http://download.icu-project.org/files/icu4c/54.1/icu4c-54_1-RHEL6-x64.tgz
# tar zxf icu4c-54_1-RHEL6-x64.tgz
# cp -r usr/local/* /usr/
# yes | cp -rf usr/* /usr
# yum install gcc gcc-cpp gcc-c++ -y
# yum install php56w-devel -y
# pecl channel-update pecl.php.net
# pecl install intl
# echo 'extension=intl.so' >> /etc/php.ini
Проверяем:

Код: Выделить всё

# service php-fpm restart
# php -i | grep ICU
Отдельное спасибо padlyuck, за помощь.
Аватара пользователя
Йож
Сообщения: 574
Зарегистрирован: 2015.08.26, 03:05

Re: Проблемы с translate

Сообщение Йож »

Может, кому пригодится установка ICU 55.1 из исходников на CentOS 6:

Код: Выделить всё

yum remove php-intl

yum install gcc gcc-c++ php-devel php-pear 
//если не установлено

cd /tmp
wget http://download.icu-project.org/files/icu4c/55.1/icu4c-55_1-src.tgz
tar -xvf icu4c-55_1-src.tgz
cd icu/source/
./configure --prefix=/opt/icu4c-55_1 && make && make install

pecl install intl
//Во время установки вбиваете адрес ICU: /opt/icu4c-55_1

vi /etc/php.d/intl.ini
//Сюда вставляем: extension=intl.so

service httpd restart
Снимок.JPG
Снимок.JPG (15.31 КБ) 8303 просмотра
arlamar
Сообщения: 39
Зарегистрирован: 2013.07.20, 17:38

Re: Проблемы с translate

Сообщение arlamar »

Может кто-нибудь сталкивался с тем, что обновление ICU не помогает?
У меня локально(Мак) стоит php 5.4.1, ICU 52.1 и всё правильно работает.
На сервере(CentOS) стоит php 5.4.45, ICU 55.1

Локально вижу "Прошло 2 часа", на сервере "Прошло 2 часов"

В какую сторону копать?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Проблемы с translate

Сообщение samdark »

Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Проблемы с translate

Сообщение samdark »

Аватара пользователя
wbread
Сообщения: 3
Зарегистрирован: 2013.02.08, 08:30

Re: Проблемы с translate

Сообщение wbread »

можно обновить ICU в Debian?
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: Проблемы с translate

Сообщение urichalex »

Собрать ручками. В оф репах до сих пор 57.1 версия ICU. Хотя в дев пакетах вроде было 58
Ответить