运行:
> 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调用。但这似乎非常讨厌。
答案 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")
是很简单的工作方式。并不完全令人满意,但是可以正常工作...