Заполнители Gettext

Я создаю многоязычное приложение на PHP + CodeIgniter. Я решил использовать gettext для перевода текста пользовательского интерфейса, и до сих пор он оказался эффективным и простым в работе.

Но теперь я столкнулся с чем-то действительно раздражающим: функция gettext() принимает только один параметр, в то время как я хотел бы поведение, подобное printf, которое я получаю от адаптера gettext Zend Framework, где я могу использовать %1$s, %2$s и т. Д. В качестве заполнителей, а затем указать заменяющие строки в качестве дополнительных параметров функции translate() Zend view.

Я не хочу отказываться от gettext из-за простого управления переводами с помощью файлов .po и poEdit (в конце концов, я могу обновить его одним щелчком мыши). Какие у меня варианты?

Я уже пробовал написать помощника для взаимодействия с gettext: запустить первый аргумент через gettext, а затем запустить strtr для полученной строки. Вы бы порекомендовали какие-либо другие / лучшие подходы?


person mingos    schedule 26.03.2011    source источник
comment
Я понимаю, что вы сказали, что не хотите отказываться от gettext, но вы должны знать, что вы можете использовать Zend_Translate и CI вместе без особых проблем. В руководстве говорится, что он может читать .mo файлы. Я не уверен, чем они отличаются от файлов .po, поэтому я публикую это как комментарий, а не как ответ. В руководстве действительно сказано, что POEdit работает с этим форматом.   -  person Charles    schedule 27.03.2011
comment
.mo - это то, чем становится .po после компиляции. Gettext читает .mo, но .po читается человеком, и это то, что вы редактируете :). Да, использование Zend_Translate определенно стоит рассмотреть.   -  person mingos    schedule 27.03.2011


Ответы (1)


На самом деле это довольно просто, вы определяете вариативную функцию следующим образом:

function myGettext($id)
{
    return vsprintf(gettext($id), array_slice(func_get_args(), 1));
}

Теперь выполнение myGettext('%u %s in a %s', 3, 'monkeys', 'tree') вернет ожидаемую строку с заполнителями, замененными оставшимися аргументами. Очевидно, вам также необходимо реализовать функцию с поддержкой множественного числа, которая вместо этого вызывает ngettext().

Что касается poEdit, вы должны изменить ключевые слова, которые он ищет, прошло много времени с тех пор, как я последний раз использовал его, но это было довольно просто, единственная проблема, с которой я столкнулся, заключалась в определении ключевых слов для поддержки множественного числа (см. это).

Надеюсь, поможет!

person Alix Axel    schedule 27.03.2011
comment
Это более или менее то, что делает мой помощник, но код проще (одна строка против четырех, хе-хе). poEdit действительно имеет возможность определять ключевые слова - именно так я подбираю переводимые строки в функциях translate, setLabel и setDescription Zend Framework :). Спасибо, мне нравится твой подход. - person mingos; 27.03.2011
comment
это не совсем проблема, но да, я сменил помощника на то, что вы предложили, и он не только работает как шарм, но и мне нравится количество кода, которое для этого требуется: D. Еще раз спасибо. - person mingos; 27.03.2011
comment
@mingos: Отлично. Я рад, что смог помочь. ;) - person Alix Axel; 27.03.2011