【问题标题】:Extracting gettext translations from PHP heredoc syntax?从 PHP heredoc 语法中提取 gettext 翻译?
【发布时间】:2011-01-14 17:36:36
【问题描述】:

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

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

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

【问题讨论】:

标签: php gettext heredoc


【解决方案1】:

我是您在帖子中提到的 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 也无法从中提取“测试”消息。

【讨论】:

  • 感谢您的回答! Ups - 显然我没有足够彻底地阅读 gettext 票。因为我想要的是——有点——相反:从 Poedit 中提取的字符串中删除标记。我正朝着你建议的方向前进;在插值之前准备外部文本。但我仍然认为这是一种解决方法,从 heredoc 语法(恕我直言)中提取文本非常有用。
  • “你可以轻松解决” 呃,如果有人使用heredoc(像我一样)内容是巨大的!这是一个错误功能。它应该被修复。
  • 请注意,在 PHP 7.3 中,heredoc 在行首未对齐,因此在heredoc 块之后的_() 不会被xgettext 提取(我认为这可能是一个错误在 gettext 中)。
猜你喜欢
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多