通过 pyBabel 分别处理位于不同位置的相同 msgid

Treat the same msgid localized in different location separately via pyBabel

提问人:gryznar 提问时间:9/29/2023 更新时间:10/11/2023 访问量:16

问:

我正在尝试使用pyBabel翻译我的应用程序。问题出在提取消息 ID 时。pyBabel 正在合并文件中的相同 msgid。这仅适用于英语翻译(默认)。.pot

#: file.py:1
#: file.py:2
msgid "foo"
msgstr ""

其他本地化需要不同的翻译,例如:

  • file.py 第 1 行中的“foo”被翻译成“bar”
  • file.py 第 2 行中的“foo”被翻译成“baz”

是否可以根据本地化强制拆分相同的 msgid 以自动实现:

#: file.py:1
msgid "foo"
msgstr ""

#: file.py:2
msgid "foo"
msgstr ""

我知道,我可以在第 1 行和第 2 行中使用不同的,但这种方法将强制使用相同的msg_str准备自定义:msgid.po

区域设置\en\LC_MESSAGES\file.po

#: file.py:1
msgid "foo_1"
msgstr "foo"

#: file.py:2
msgid "foo_2"
msgstr "foo"
python gettext

评论


答:

0赞 Guido Flohr 10/11/2023 #1

这就是消息上下文的用途。而不是 or 你必须使用:_(MSGID)gettext(MSGID)pgettext(CONTEXT, MSGID)

import gettext

print(gettext.pgettext('bar context', 'foo'))
print(gettext.pgettext('baz context', 'baz'))

这是英语的输出

$ python file.py
foo
foo

从中提取可翻译的字符串应生成如下所示的文件:file.py.po

#: file.py:1
msgctxt "bar context"
msgid "foo"
msgstr ""

#: file.py:2
msgctxt "baz context"
msgid "foo"
msgstr ""

翻译器现在可以为字符串“foo”提供两种不同的翻译,因为可以通过消息上下文来区分这些匹配项。