Страница 1 из 1

Проблемы с translate

Добавлено: 2015.03.05, 20:31
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 что-то не так.

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

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

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

Добавлено: 2015.03.05, 21:10
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, то пойду курить доки и бить сервер.

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

Добавлено: 2015.03.05, 21:33
padlyuck
а вы какой MessageFormatter имеете в виду в том куске кода что выше? системный или юи?

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

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

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

Добавлено: 2015.03.05, 21:51
padlyuck

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

Добавлено: 2015.03.05, 21:55
padlyuck
C системным
код http://xam.vrn123.ru/pics/screenshot-20150305205410.png
результат object(MessageFormatter)[64]

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

Добавлено: 2015.03.05, 21:59
NitroGenerate
Мдя... весело. Спасибо большое.
А можно еще узнать, какие версии у вас PHP, intl и intl ICU
(в phpinfo(); )

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

Добавлено: 2015.03.05, 22:02
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

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

Добавлено: 2015.03.11, 11:50
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, за помощь.

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

Добавлено: 2015.08.31, 02:39
Йож
Может, кому пригодится установка 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 КБ) 8341 просмотр

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

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

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

В какую сторону копать?

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

Добавлено: 2015.10.21, 01:16
samdark

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

Добавлено: 2015.10.21, 01:23
samdark

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

Добавлено: 2017.11.29, 18:56
wbread
можно обновить ICU в Debian?

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

Добавлено: 2017.11.29, 20:31
urichalex
Собрать ручками. В оф репах до сих пор 57.1 версия ICU. Хотя в дев пакетах вроде было 58