python-3.x - 每个 .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 调用一个函数,该函数本身继承自一个抽象类,该抽象类包含要翻译的其他字符串……所以我希望如果存在任何解决方案,它也适用于抽象类文件。
谢谢
解决方案
翻译是从.mo
文件而不是.po
文件中检索的,请参阅https://docs.python.org/3/library/gettext.html#gettext.translation。CommandOne_fr.po
很可能您必须将程序编译msgfmt
成CommandOne_fr.mo
.
还有两个提示:
您正在做的事情看起来像是过早的优化。在翻译数量变得非常大之前,您不会遇到任何性能问题。而是等待它发生。
为什么_fr
在翻译文件的名称中?语言代码fr
已经是一个路径组件。
推荐阅读
- c# - EntityFrameworkCore 不批量插入
- mysql - 从多个表中选择数据 - laravel
- java - 如何在 Spring Boot 应用程序中插入 XML Prolog 到 Rest XML 响应
- python - 硒问题 - find_elements_by_xpath 或 find_elements_by_tag
- xml - 使用 python-docx 编辑浮动文本框或编辑 document.xml?
- flutter - 将firebase添加到flutter项目并获得FAILURE:构建失败并出现异常错误
- javascript - 当 module.exports 被分配一个对象时,为什么这是一个空对象?
- javascript - 如何处理反应原生文本输入组件的输入验证?
- ruby-on-rails - Rails:基于另一个数组对数组进行排序
- android - Android 单元测试 + DecimalFormat