我可以在库和使用它的模块中同时调用和设置 Python gettext 模块吗?

e-s*_*tis 3 python gettext internationalization

我正在编写一个库,其中包括我需要翻译的文本反馈。

我将以下几行放入_config.py我的应用程序中随处导入的模块中:

import gettext, os, sys
pathname = os.path.dirname(sys.argv[0])
localdir = os.path.abspath(pathname) + "/locale"
gettext.install("messages", localdir)
Run Code Online (Sandbox Code Playgroud)

我有这些*.mo文件,./locale/lang_LANG/LC_MESSAGES并将该_()函数应用于所有需要翻译的字符串。

现在,我刚刚为用户(假设是程序员)添加了一项功能,以便能够创建自己的消息。我不希望他关心底层的实现,所以我希望他能够使其变得简单,例如:

lib_object.message = "My message"
Run Code Online (Sandbox Code Playgroud)

我使用属性来使其干净,但是如果我的用户要翻译他自己的代码(使用我的)并执行以下操作,该怎么办:

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")
Run Code Online (Sandbox Code Playgroud)

这是个问题吗 ?我该如何做才能避免麻烦而不打扰我的用户?

run*_*neh 5

您可以使用基于类的 gettext api 来隔离消息目录。这也是python gettext 文档中推荐的。

缺点是您或其他开发人员必须使用 gettext 方法或_()在本地范围内定义该方法,并绑定到特定的 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")
Run Code Online (Sandbox Code Playgroud)

您可以将用于添加的代码粘贴_()在装饰器中,因此所有需要它的方法都带有类似的前缀@with_local_gettext

(注意,我没有测试过上面的功能,但它应该工作得很好(tm))

如果目标是不打扰您的用户(而且他不是很好),我想您可以在代码中使用基于类的方法,并让用户使用全局方法。