Python xgettext合并了gettext和ngettext字符串,破坏了翻译查找

时间:2012-10-26 05:49:54

标签: python internationalization gettext extraction

运行:

> xgettext test.py -o out.pot

在Python片段test.py上:

def main(num):
    gettext("TEST")
    ngettext(num, "TEST", "TESTS")

生成包含以下行的pot文件(已翻译的字符串位于po文件中):

#: test.py:3 test.py:4
msgid "TEST"
msgid_plural "TESTS"
msgstr[0] "TEST-SINGLE"
msgstr[1] "TEST-PLURAL"

将其转换为po文件然后转换为mo文件。我无法获得gettest(“TEST”)电话的翻译。

> ngettext("TEST", "TESTS", 1)
> TEST-SINGLE
> gettext("TEST")
> TEST

我正在使用Python的标准gettext包。我不确定这些合并行为是否是预期的,但它似乎破坏了查找非复数字符串的翻译的能力。有办法避免这种情况吗?

我正在考虑破解gettext的后备,如果第一个失败则尝试ngettext调用。但这似乎非常讨厌。

3 个答案:

答案 0 :(得分:1)

问题似乎源于gettext包查找翻译的方式。对于gettext和ugettext调用,它只是在_catalog ['TEST']的目录中查找,而不搜索_catalog [(“TEST”,0)]。

我不相信这是正确的行为,因为xgettext决定合并两个字符串,但我在文档中找不到任何证明这种或那种方式的东西。

为了解决这个问题,我使用gettext和ugettext的两个替换方法进行猴子修补,如果简单查找失败,它将回退到(message,0)目录查找。

答案 1 :(得分:1)

两个条目完全相同,即单个条目与复数条目相同。为了证明:

msgid "Test"
msgstr "Toets"

msgid "Test"
msgid_plural "Tests"
msgstr[0] "Toets"
msgstr[1] "Toetse"

然后使用msgfmt编译它:

msgfmt test.po 
bob.po:4: duplicate message definition...
bob.po:2: ...this is the location of the first definition
msgfmt: found 1 fatal error

Gettext使用msgid作为字符串的键,因此它会看到这些单数和复数字符串是重复的。

答案 2 :(得分:1)

我在最近的一个项目中遇到了同样的问题。我认为,这可能被视为python gettext模块中的错误。自2013年以来,Python Bugtracker上已有an open issue for this,因此其他人也有同样的看法。我提出了a patch,但可能要过一段时间才能发布到发行版中。

使用ngettext("TEST", "TESTS", 1)代替ngettext("TEST")是很简单的工作方式。并不完全令人满意,但是可以正常工作...