每个 .py 脚本一个 .po 文件

时间:2021-03-24 15:05:09

标签: python-3.x gettext

在我的包中,我想为它包含的每个 .py 脚本使用一个 .po 文件。 这是我的文件树:

foo
   mainscript.py
   commands/
      commandOne.py
   locales/fr/LC_MESSAGES/
      mainscript_fr.po
      commandOne_fr.po

在 mainscript.py 中,我得到以下行将 gettext 应用于字符串:

if "fr" in os.environ['LANG']:
    traduction = gettext.translation('mainscript_fr', localedir='./locales', languages=['fr'])
    traduction.install()
else:
    gettext.install('')

到目前为止,它按预期工作。但现在我想添加另一个 .po 文件来翻译 commandOne.py 中的字符串。 我尝试了以下代码:

if "fr" in os.environ['LANG']:
    traduction = gettext.translation('commandOne_fr', localedir='../locales', languages=['fr'])
    traduction.install()
else:
    gettext.install('')

但我收到“FileNotFoundError: [Errno 2] 找不到域的翻译文件:'commandOne_fr'”

如何使用多个文件?包是一个 cli,由于 help man 和详细模式等原因,单个文件中有很多字符串,这对于具有数百个字符串的单个 .po 文件是不可接受的。

注意:mainscript.py 从 commandOne.py 调用一个函数,它本身继承自一个抽象类,该抽象类包含要翻译的其他字符串......所以我希望如果存在任何解决方案,它也适用于抽象类文件。

谢谢

1 个答案:

答案 0 :(得分:0)

翻译是从 .mo 文件而不是 .po 文件中检索的,请参阅 https://docs.python.org/3/library/gettext.html#gettext.translation。很可能您必须使用程序 CommandOne_fr.pomsgfmt 编译为 CommandOne_fr.mo

另外两个提示:

您正在做的事情看起来像是过早的优化。在翻译数量变得非常大之前,您不会遇到任何性能问题。而是等待它发生。

为什么翻译文件的名称中有 _fr?语言代码 fr 已经是一个路径组件。