从PHP heredoc语法中提取gettext转换?

时间:2010-02-09 09:11:11

标签: php gettext heredoc

我正在使用PHP的gettext函数进行本地化。我正在使用Poedit进行实际翻译,并且通过其“从源代码更新”功能,可以很容易地提取所有需要翻译的字符串 - 除了内部heredoc语法。

Poedit正在使用xgettext程序从PHP源文件生成.po文件。当PHP代码如下所示,它可以很好地工作:

echo "<h1>". _("test") ."</h1>";

但是未提取以下内容(注意需要使用伪t对象):

echo <<<EOD
<h1>{$->_('test')}
EOD;

在PHP代码中,您可以通过以下方式解决问题:

<?php
$t = _('test');
echo <<<EOD
<h1>$t</h1>
EOD
?>

但我真的希望xgettext程序可以从heredoc块中提取字符串。

PHP文档注释中的workaround for that has been suggested。解决方法是告诉xgettext程序将PHP源文件视为Python代码。但是在Poedit中使用这种方法会给我带来很多来自xgettext解析器的语法错误。

有没有人知道让xgettext从PHP heredoc语法中提取翻译的解决方法?

在gettext项目的故障单系统上打开了一个有点相关的故障单:http://savannah.gnu.org/bugs/?27740这表明可以改进对heredoc语法的支持吗?

1 个答案:

答案 0 :(得分:4)

我是您在帖子中引用的gettext票证的记者。 当我提交票证时,我脑子里有一些完全不同的东西,更多的是这些:

<?php
  $msg = _(<<<TXT
  He said: "Hello world!".
  TXT
);
?>

Gettext无法从这样的heredoc / nowdoc字符串中提取文本,但在翻译大块文本时这可能非常有用。

就我而言,我在CLI PHP脚本中使用gettext来翻译包含XML标记的文本块。该标记是原始文本的一部分,也必须进行翻译。必须手动转义标记中的每个引号或撇号,这使得消息很难在POedit或任何其他编辑器中读取。

在你的情况下,你似乎想要提取(heredoc / nowdoc)字符串中的插值代码。您可以通过在实际使用插值之前准备文本来轻松解决此问题:

<?php
$t = _('test');
echo <<<EOD
<h1>$t</h1>
EOD
?>

我不认为这应该被视为一个错误,因为与使用heredoc语法发布的代码完全等效的是:

<?php
echo "<h1>{$t->_('test')}</h1>";
?>

gettext无法从中提取“测试”消息。