使用gettext的foreach的php字符串变量

时间:2014-02-18 17:26:47

标签: php gettext

似乎使用gettext使文本回显的方法是使用以下形式:

<?php echo _("My text"); ?>

当然,当你使用变量时,你不能只添加引号,因为那时变量名将输出为文字,例如:

<?php echo _("$myText");?>

不起作用。

在相关帖子php string variables in gettext中,答案似乎表明您不能使用字符串变量,并且您需要将变量名称$ myText硬编码到poedit文件本身。当然,这不是最佳选择,但它可以发挥作用。

然而,什么是不可行的,当你有一个foreach循环,吐出一个可以定义数百次的php变量。如果你有:

<?php foreach($variables as $variable)
      {
          echo $variable;
      }
?>

和count($ variables)&gt; 100,甚至10,这种解决方法将是令人望而却步的。还有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

xgettext(或poedit)实际上是一个“静态分析器”,这意味着它不会运行您的代码,只会找到所有_()函数,并假设其中的任何内容都是要翻译的字符串。

所以,如果你这样做:_('Hello, world')
然后字符串Hello, world将以.po文件结尾。

如果你这样做:_("Hello, $planet")
然后字符串Hello, $planet将以.po文件结尾。

这通常是件好事,因为它允许我们删除翻译文件中的(某些)冗余。如果我们有3个行星,那么我们需要四个翻译字符串;一个用于hello, $planet,一个用于每个星球 如果我们想添加bye, $planet,那么我们只需要添加一个额外的翻译字符串,而不是3。

只是想确保你明白:-)现在,对你问题的主题更具体:

  

您需要将变量名称$ myText硬编码到poedit中   文件本身。当然,这不是最佳选择,但它可以发挥作用。

这不起作用,因为所有$myText变量将解析为相同的翻译字符串。我怀疑这是你想要的吗?

你的变量来自哪里?如果它们来自数据库或第三方API,您可能需要查看稍微不同的解决方案,例如扫描数据库以获取翻译字符串,或从第三方API获取所有字符串。
如果您将这些字符串放在.po文件中,使用_($var)将正常工作,因为查找本身是在运行时完成的。

另一个可能的解决方案是创建自己的函数,我们称之为v_()(v代表变量)。在运行时,此函数读取.po文件(或者可能是数据库,稍后转换为.po文件)的内容,如果该字符串尚不存在,则插入该文件。

这看起来像这样:

function v_($str) {
    global $translation_mode;

    if ($translation_mode && ! string_in_po_file($str))
        insert_string_in_po_file($str);

    return _($str);
}

因为这是在运行时执行的,所以我们知道字符串的内容 在此示例中,我们使用$translation_mode变量,因此此代码在生产计算机上的开销很小。