我的问题是关于 gettext 本身,我有点看不到 gettext_noop 函数的使用。我知道它的作用,但有什么好处?
如果我用 gettext_noop() 标记文本,它不会被翻译,但 xgettext 可以识别它,并且当我将字符串作为变量输出时会发生翻译。
这是因为内存使用,还是什么?在 PHP 中使用它更好,还是只使用 _()(或 gettext())?
我的问题是关于 gettext 本身,我有点看不到 gettext_noop 函数的使用。我知道它的作用,但有什么好处?
如果我用 gettext_noop() 标记文本,它不会被翻译,但 xgettext 可以识别它,并且当我将字符串作为变量输出时会发生翻译。
这是因为内存使用,还是什么?在 PHP 中使用它更好,还是只使用 _()(或 gettext())?
The Gettext manual covers nicely the way gettext_noop
may be useful when programming in C.
In PHP, however, it doesn't seem to make sense to do:
$options = array( gettext_noop("one string"),
gettext_noop("another string") ,);
echo _($options[0]);
It should be perfectly ok to do:
$options = array( _("one string") ,
_("another string"), );
echo $options[0];
Since PHP is a dynamically typed language, we'd need to be a lot more creative to find a good use for gettext_noop
. Most likely, you won't need it in PHP.
That's probably the reason gettext_noop doesn't exist in a vanilla installation and doesn't even figure in PHP's manual.
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 ...