我的问题是关于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 ...