在PHP中使用gettext_noop函数是什么?

我的问题是关于gettext本身,我有点看不到使用gettext_noop函数。 我知道它做了什么,但有什么好处?

如果我用例如gettext_noop()标记文本,它不会被翻译,但xgettext可以识别它,并且当我输出string作为variables时,翻译发生。

这是因为内存使用,还是什么? 在PHP中使用它更好,还是只使用_()(或gettext())?

Gettext手册很好地包含了在C编程时gettext_noop可能有用的方法。

然而,在PHP中,这样做似乎没有意义:

 $options = array( gettext_noop("one string"), gettext_noop("another string") ,); echo _($options[0]); 

应该完全可以这样做:

 $options = array( _("one string") , _("another string"), ); echo $options[0]; 

由于PHP是一种动态类型的语言,因此我们需要更多的创意才能找到gettext_noop的良好用法。 最有可能的是,你将不需要它在PHP中。

这可能是gettext_noop在vanilla安装中不存在的原因,甚至不在PHP的手册中 。

gettext_noop用例

在某些情况下它可能很有用。 举个例子,假设你已经有了一个表单允许的下拉列表值:

 $allowed_values = ["red", "orange", "blue"]; 

在表单中,您希望用户查看翻译的值,但对于请求提交未翻译的值:

 <select name="color"> <?php foreach ($allowed_values as $allowed_value) : ?> <option value="<?= htmlspecialchars($allowed_value) ?>"> <?= htmlspecialchars(_($allowed_value)) ?> </option> <?php endforeach ?> </select> 

不幸的是, xgettext找不到可转换的字符串,因为它们没有被标记。 你可以像这样标记它们:

 $allowed_values = [_("red"), _("orange"), _("blue")]; 

但是现在你以后不能检索未翻译的值。

相反,你可以这样做:

 $allowed_values = [gettext_noop("red"), gettext_noop("orange"), gettext_noop("blue")]; 

现在,只要你执行这个答案的其余部分,一切都可以按预期工作。

如何实现gettext_noop

PHP实际上并不包含gettext_noop 。 要自己实现它,添加这个PHP:

 function gettext_noop($string) { return $string; } 

并且在命令行中调用xgettext时,请包含以下--keyword参数:

 xgettext --keyword=gettext_noop ...