2

我正在编写一个包含我需要翻译的文本反馈的库。

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

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

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

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

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")

这是个问题吗 ?我可以做些什么来避免麻烦而不打扰我的用户?

4

2 回答 2

2

您只能 gettext.install() 一次。一般来说,它对库工作毫无用处—— gettext.install() 只有在调用它的模块负责整个程序时才会做正确的事情,因为它只会为您提供一个可供加载的目录。库代码应该做一些类似于 Mailman 所做的事情:拥有自己的 gettext() 包装器,它为此模块传递正确的参数,然后在每个想要使用它的模块中将其导入为 '_'。

于 2008-10-29T09:43:07.527 回答
2

您可以使用基于类的 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")

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

(注意,我没有测试过上述可能,但它应该可以正常工作(tm))

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

于 2008-12-29T19:29:16.570 回答