Zend translate()函数问题

时间:2010-12-09 11:04:26

标签: php zend-framework internationalization poedit

我正在使用Zend Framework来建立一个多语言网站。使用Zend_Translate_Adapter_Gettext完成翻译。我正在使用poedit准备.mo文件。

问题是当我设置两个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'); ?>

这不是一个令人满意的解决方案,因为我正在开发一个包含~10k文件的社区门户网站,但我无法真正检查所有这些文件是否存在冲突。

如果它有用:

  • Zend Framework版本:1.10.8
  • poedit version:1.4.6
  • 站点在Apache 2.2.11上使用PHP 5.3运行

[编辑]

感谢Gordon,我可以包含另一段数据:涉及PHP gettext的测试。我使用了相同的测试.mo文件,包括“foo” - &gt;“bar”和“bar” - &gt;“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的错。

1 个答案:

答案 0 :(得分:0)

更改订单

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

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