2014-09-09 6 views
2

Форматирование сообщений ICU для меня не работает. Вот пример:Заставьте это работать: ICU/php-intl Мнемонический тег «несколько» для форматирования плюрализации

$n = 22; 
$f = MessageFormatter::create('ru', '{n, plural, one{корова} few{коровы} many{коров} other{коров}}'); 
echo $n.' '.$f->format(['n' => $n])."\n"; 

я получаю на выходе 22 коров, но, очевидно, должны получить 22 коровы. Пробовал несколько серверов ubuntu.

Язык: Русский

PHP-аэроропорт версия 1.1.0

ICU версия 52,1

Любая помощь будет appriciated, потому что я застрял на нем.

ответ

3

Это одна неприятная ошибка, которую я потратил почти на час, выясняя. Ну, получается, в 52,1 (вероятно, раньше, тоже) мы имеем следующее:

set34{ 
    many{ 
     "v = 0 and i % 10 = 0 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100" 
     " = 11..14 @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, …" 
    } 
    one{ 
     "v = 0 and i % 10 = 1 and i % 100 != 11 @integer 1, 21, 31, 41, 51, 6" 
     "1, 71, 81, 101, 1001, …" 
    } 
    other{ 
     " @integer 2~4, 22~24, 32~34, 42~44, 52~54, 62, 102, 1002, … @decimal" 
     " 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" 
    } 
} 

Источник: http://source.icu-project.org/repos/icu/icu/tags/release-52-1/source/data/misc/plurals.txt

Так, случаи 2-4, 22-24 и так далее (22 коровы) подпадают под other модификатором, поэтому правильный синтаксис для вашего дела будет {n, plural, one{корова} few{коровы} many{коров} other{коровы}}. Я оставил few для совместимости с новыми версиями (которые действительно используют модификатор few для этого случая).