似乎使用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,这种解决方法将是令人望而却步的。还有更好的方法吗?
答案 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
变量,因此此代码在生产计算机上的开销很小。