我正在使用 PHP , Zend Framework 和Zend_Translate(gettext adapter)。要编辑翻译,我使用 POEdit ,它使用 xgettext 来获取要翻译的字符串。
POEdit(xgettext)将搜索关键字以查找要翻译的字符串。因此,如果搜索关键字translate
,当文本直接传递给translate函数时,POEdit在查找'Text to translate'
字符串时没有问题:
echo translate('Text to translate');
但是,在其他情况下,字符串将被传递给Zend函数,它将为我进行翻译,使用变量作为参数调用translate函数:
function SomeZendFunction( $array ) {
return translate( $array['string'] );
}
...
echo SomeZendFunction( array('string'=>'Another text to translate') );
// translate('Another text to translate');
这将导致POEdit(xgettext)无法找到要翻译的字符串。在上面的示例中,我希望POEdit查找的字符串是'Another text to translate'
,但由于它不会直接传递给translate
函数,因此无法找到它。
那么,如何解决这个问题呢?
我目前的解决方案是创建一个虚拟文件,其中包含POEdit找不到的所有字符串的长列表:
<?php // Dummy file, only accessed by POEdit when scanning for strings to translate
translate('Text to translate');
translate('Another text to translate');
translate('A third text to translate');
....
但这个解决方案的缺点是,在更新字符串时,我都需要更改虚拟文件并找到原始字符串。这将使维护更加困难。
我想到的另一个解决方案是在调用SomeZendFunction
后将翻译字符串添加到注释中(参见上面的示例),但是我没有让xgettext接受它,因为它忽略了注释。
那么,有谁知道如何让xgettext接受评论中的字符串?或者任何人都有其他可能更好的解决方案?
感谢您的帮助!
修改
我不知道我被投票的原因是什么。但我试图澄清这个问题。
答案 0 :(得分:2)
如果您要使用虚函数并将字符串传递给它,为什么不重构someZendFunction以接受字符串参数,然后将该函数名称“someZendFunction”添加到poedit关键字的列表中?这消除了额外的函数调用,使代码更清晰。 或者您可以将“someZendFunction”包装到t(9函数中,以便它为您完成脏工作!这也将使您免于额外打字!
示例:
function t($str){
echo someZendFunction($str);
}
然后在代码中的某处:
t('Translate this string please!');
希望这有帮助!
答案 1 :(得分:0)
正如单词所说,“变量”意味着价值会不时变化,因此不可能事先知道价值是多少。您希望翻译的方式不正确。
答案 2 :(得分:0)
我得到了它!通过创建虚拟函数
function t($string) {
return $string;
}
echo SomeZendFunction( t('Another text to translate') );
我可以将此t
函数添加到POEdit中的翻译关键字。然后我可以将Zend稍后翻译的所有字符串嵌入到这个虚拟函数中。
这样Zend将被允许翻译它,POEdit会将其识别为要翻译的字符串。
如果有人有更好的解决方案,请发布。