Именованные аргументы для INTL MessageFormatter с PHP

Я хотел бы использовать именованные аргументы в строке, переданной в MessageFormater, например

$fmt = new MessageFormatter("en_US", "My name id {my_name}");
$fmt->format(array('my_name' => 'John'));

Когда я запускаю этот код, я получаю сообщение об ошибке:

$fmt->getErrorMessage() returns

Ошибка форматирования числа: U_ILLEGAL_ARGUMENT_ERROR.

В то время как

$fmt = new MessageFormatter("en_US", "My name id {0}");
$fmt->format(array(0 => 'John'));

работает хорошо.

Веб-сайт icu-project сообщает, что именованные аргументы поддерживаются, начиная с ICU 3.8 (см. здесь), и я использую 4.2.1

Где единорог? PHP не поддерживает именованные аргументы для MessageFormatter? Может есть альтернатива?


person Tristan    schedule 22.02.2012    source источник


Ответы (2)


Это исправлено в будущей (на сегодняшний день) версии intl. См. https://bugs.php.net/bug.php?id=61871 .

person David Sklar    schedule 27.06.2012

Да вроде так. Что ты хочешь услышать?

Обновление: после того, как ОП отредактировал свой вопрос

echo vsprintf('My name id %s', array('John'));

См. sprintf().

Конечно, это не какие-то местные вещи.

person KingCrunch    schedule 22.02.2012
comment
Я знаю этот путь. Мои тексты пересылаются тоже переводчиками. Я хочу избежать %d, %s. Проще всего перевести Меня зовут {my_name}, чем Меня зовут %s. Это плохой пример, потому что легко понять смысл этого предложения, но иногда это не так. - person Tristan; 23.02.2012