2

跑步:

> 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 调用。不过,这似乎很hacky。

4

3 回答 3

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 作为字符串的键,因此它会看到这些单数和复数字符串是重复的。

于 2012-10-30T22:38:48.423 回答
1

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

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

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

于 2012-10-26T18:06:03.880 回答
1

我在最近的一个项目中遇到了同样的问题。在我看来,这可能被认为是 python gettext 模块中的一个错误。其他人也持有这种观点,因为自 2013 年以来 Python bugtracker 上存在一个未解决的问题……我提出了一个补丁,但可能需要一段时间才能将其包含在发布中。

当然,使用ngettext("TEST", "TESTS", 1)代替ngettext("TEST")是一个非常简单的解决方法。不完全令人满意,但它的工作...

于 2020-07-04T08:55:16.193 回答