【问题标题】:php string variables with foreach using gettextphp字符串变量与foreach使用gettext
【发布时间】:2014-02-18 17:26:47
【问题描述】:

似乎使用 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) > 100,甚至 10,这种解决方法将令人望而却步。有没有更好的办法??

【问题讨论】:

  • "$var" 在 PHP 中只是 $var 的同义词,只要 $var 是可以转换为字符串的东西。换句话说,_("$var") 将 var 的 CONTENTS 发送到函数中,而不是变量的名称。

标签: php gettext


【解决方案1】:

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

所以,如果你这样做:_('Hello, world')
然后字符串Hello, world 会出现在你的.po 文件中。

如果你这样做:_("Hello, $planet")
然后字符串Hello, $planet 将最终出现在您的 .po 文件中。

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

只是想确保您理解 :-) 现在,更具体地说明您的问题:

您需要将变量名称 $myText 硬编码到 poedit 文件本身。当然,这不是最优的,但它可以工作。

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

你的变量来自哪里?如果它们来自数据库或第 3 方 API,您可能需要考虑稍微不同的解决方案,例如扫描数据库中的翻译字符串,或从第 3 方 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 变量,因此此代码在生产机器上的开销很小。

【讨论】:

    猜你喜欢
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 2014-07-20
    • 2020-10-25
    • 2011-12-06
    • 2016-11-11
    相关资源
    最近更新 更多