使用POEdit / xgettext转换变量

时间:2011-10-04 07:00:54

标签: php variables gettext zend-translate xgettext

我正在使用 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接受评论中的字符串?或者任何人都有其他可能更好的解决方案?

感谢您的帮助!

修改

我不知道我被投票的原因是什么。但我试图澄清这个问题。

3 个答案:

答案 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会将其识别为要翻译的字符串。

如果有人有更好的解决方案,请发布。