我正在编写一个包含我需要翻译的文本反馈的库。
我将以下几行放在一个 _config.py
模块中,我在我的应用程序中随处导入:
import gettext, os, sys
pathname = os.path.dirname(sys.argv[0])
localdir = os.path.abspath(pathname) + "/locale"
gettext.install("messages", localdir)
我在 ./locale/lang_LANG/LC_MESSAGES
中有 *.mo
文件,我将 _()
函数应用于所有需要翻译的字符串。
现在我刚刚为用户添加了一个功能,假设是程序员,能够创建他自己的消息。我不想让他关心底层的实现,所以我希望他能够像这样简单明了:
lib_object.message = "My message"
我使用属性让它变得干净,但是如果我的用户想要翻译他自己的代码(使用我的代码)并做类似的事情怎么办:
import gettext, os, sys
pathname = os.path.dirname(sys.argv[0])
localdir = os.path.abspath(pathname) + "/locale"
gettext.install("user_app", localdir)
lib_object.message = _("My message")
有问题吗?我该怎么做才能在不打扰用户的情况下避免麻烦?
最佳答案
您可以使用基于类的 gettext api 来隔离消息目录。这也是 python gettext documentation 中推荐的内容。 .
缺点是您或其他开发人员必须使用 gettext 方法或在本地范围内定义 _()
方法,绑定(bind)到特定的 gettext 类。具有自己的字符串目录的类示例:
import gettext
class MyClass(object):
def __init__(self, locale_for_instance):
self.lang = gettext.translation("appname", localedir, \
locale=locale_for_instance)
def some_method(self, arg):
return self.lang.gettext("You called some method")
def other_method(self, arg): # does the same thing
_ = self.lang.gettext
return _("You called some method")
您可以将用于添加 _()
的代码粘贴到装饰器中,因此所有需要它的方法都带有前缀,如 @with_local_gettext
(注意,我没有测试过上面的方法,但它应该可以正常工作(tm))
如果目标是不打扰您的用户(而且他不是很好),我想您可以在代码中使用基于类的方法并让用户使用全局方法。
关于python - 我可以同时调用和设置库中的 Python gettext 模块和使用它的模块吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/246137/