为什么gettext将空字符串转换为.po标题文本?


Why does gettext translate an empty string to the .po header text?

我已经在PHP5中设置了gettext。经过一些字符集和类似的挣扎,我已经成功地翻译了一些基本的字符串。现在我遇到了一个问题。当翻译一个空字符串时,我希望得到未翻译的(空)字符串返回(如果我错了请纠正我;))。

但是,我没有返回输入字符串,而是得到.PO文件的头文件作为翻译:

Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2011-09-22 15:03+0200 PO-Revision-Date: 2011-09-22 15:37+0200 Last-Translator: timo Language-Team: English Language: en MIME-Version: 1.0 Content-Type: text/plain; charset=ASCII Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); 

当我用文本编辑器查看.mo文件时,我看到标题似乎被放置在文件中的随机位置。我很想给你看,但是我不能把文件粘贴进去。这里有一个msgstr的列表,然后是header和msgstr的列表

我使用以下命令生成.mo文件:
msgfmt -c -v -o en/LC_MESSAGES/messages.mo messages_en.po

执行此命令后,我重新启动了我的web服务器(lighttpd)。

我做错了什么,我该怎么做?

在搜索了一些不同的查询后,我偶然发现了这个网站:http://framework.zend.com/issues/browse/zf - 2914

这里我发现空字符串到元信息的转换实际上是在gettext:

的规范中。

这还有另一个优点,因为PO文件GNU gettext中的空字符串通常被翻译成附加到该特定MO文件的一些系统信息,并且空字符串必然成为原始表和翻译表中的第一个,使得系统信息非常容易找到。

您可以尝试创建另一个函数,仅当消息不同于空白或空字符串(")时调用gettext。php中这样写:

function _tl($msg)
{
    $ret = "";
    if($msg != "")
    {
        $ret = _($msg);
    }    
    return $ret;
}

然后在目录首选项中,在keywords选项卡中设置新函数_tl的使用。这是poedit在您的代码中识别它的方式。