首页 > 解决方案 > 每个 .py 脚本一个 .po 文件

问题描述

在我的包中,我想为它包含的每个 .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] No translation file found for domain: 'commandOne_fr'”

我怎样才能使用这样的多个文件?该软件包是一个 cli,由于帮助人员和详细模式等原因,单个文件中有许多字符串,而拥有一个包含数百个字符串的单个 .po 文件是不可接受的。

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

谢谢

标签: python-3.xgettext

解决方案


翻译是从.mo文件而不是.po文件中检索的,请参阅https://docs.python.org/3/library/gettext.html#gettext.translationCommandOne_fr.po很可能您必须将程序编译msgfmtCommandOne_fr.mo.

还有两个提示:

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

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


推荐阅读