Я использую 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
.
gettext
PHP, чтобы исключить это нормально поведение. - person Gordon   schedule 09.12.2010gettext
, чтобы исключить, что это разыскиваемое поведение. Я не хотел намекать, что ZF использует расширениеgettext
. Извините, если это было непонятно. - person Gordon   schedule 13.12.2010