1

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

如果我用 gettext_noop() 标记文本,它不会被翻译,但 xgettext 可以识别它,并且当我将字符串作为变量输出时会发生翻译。

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

4

2 回答 2

1

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.

于 2013-04-11T14:13:03.687 回答
0

一个用例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 ...
于 2017-02-10T13:24:09.053 回答