Проблема с функцией Zend translate()

Я использую Zend Framework для многоязычного сайта. Перевод выполняется с помощью Zend_Translate_Adapter_Gettext. Я готовлю файлы .mo с помощью poedit.

Проблема в том, что когда я устанавливаю два msgid, один из них имеет msgstr, идентичный другому msgid:

#: application/modules/foobar/views/scripts/index.phtml:1
msgid "foo"
msgstr "bar"
#: application/modules/foobar/views/scripts/index.phtml:2
msgid "bar"
msgstr "baz"

Когда я использую этот код:

<?php echo $this->translate('foo'); ?>
<?php echo $this->translate('bar'); ?>

вывод таков:

bazbaz

Я полагаю, что если msgstr совпадает с другим msgid, он используется так, как если бы это был msgid, и поэтому переводится снова. Пожалуйста, поправьте меня, если мои рассуждения неверны.

Теперь я хотел бы знать, была ли у вас подобная проблема и как ее обойти безболезненно.

Мое текущее решение включает изменение msgids:

#: application/modules/foobar/views/scripts/index.phtml:1
msgid "KEY_FOO"
msgstr "bar"
#: application/modules/foobar/views/scripts/index.phtml:2
msgid "KEY_BAR"
msgstr "baz"

а потом:

<?php echo $this->translate('KEY_FOO'); ?>
<?php echo $this->translate('KEY_BAZ'); ?>

Это неудовлетворительное решение, поскольку я работаю на портале сообщества с файлами ~ 10 000, и я не могу проверить все это на наличие конфликтов.

Если это будет полезно:

  • Версия Zend Framework: 1.10.8
  • подправить версию: 1.4.6
  • сайт работает на Apache 2.2.11 с PHP 5.3

[РЕДАКТИРОВАТЬ]

Благодаря Гордону я могу включить еще одну часть данных: тест с участием PHP gettext. Я использовал тот же тестовый файл .mo, включая пары ключ-значение «foo» -> «bar» и «bar» -> «baz». Код PHP был таким:

<?php
    putenv('LC_ALL=pl_PL');
    setlocale(LC_ALL, 'pl_PL');
    bindtextdomain("pl", ".");
    textdomain("pl");

    echo gettext("foo");
    echo gettext("bar");
?>

И результат:

barbaz

Так что это определенно не вина gettext.


person mingos    schedule 09.12.2010    source источник
comment
можете ли вы выполнить тест с gettext PHP, чтобы исключить это нормально поведение.   -  person Gordon    schedule 09.12.2010
comment
@Gordon, спасибо за ваш комментарий, я отредактирую свой пост через минуту, чтобы включить результаты теста gettext.   -  person mingos    schedule 09.12.2010
comment
@mingos у вас включено кеширование? Это также происходит, когда вы помещаете пару bar/baz перед парой foo/bar в файле po. Кроме того, что происходит, когда вы выполняете перевод ('bar') перед переводом ('foo')?   -  person Gordon    schedule 09.12.2010
comment
@Gordon и @mingos: адаптер Zend_Translate Gettext не реализован с использованием расширения PHP gettext (источник: Zend_Translate Adapter DOC: framework.zend.com/manual/en/zend.translate.adapter.html)   -  person Tomas Narros    schedule 13.12.2010
comment
@Tomas Я попросил проверить с gettext, чтобы исключить, что это разыскиваемое поведение. Я не хотел намекать, что ZF использует расширение gettext. Извините, если это было непонятно.   -  person Gordon    schedule 13.12.2010
comment
@ Гордон: Хорошо. Я неправильно понял это.   -  person Tomas Narros    schedule 13.12.2010


Ответы (1)


изменить порядок

#: application/modules/foobar/views/scripts/index.phtml:2
msgid "bar"
msgstr "baz"   

 #: application/modules/foobar/views/scripts/index.phtml:1
msgid "foo"
msgstr "bar"
person Mr Coder    schedule 07.02.2011