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

标签 python internationalization gettext

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

我将以下几行放在一个 _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/

相关文章:

python - 修改嵌套列表

django - 如何翻译 Django 中过滤器的输出

android - 安卓自动翻译工具

python - setup.py 中 Babel 的 message_extractors 配置 : Third parameter in tuple

Php gettext 不显示翻译后的文本(使用 poEdit 生成 .pot 和 .mo 文件后)

django - django为什么不考虑我的语言文件?

python - 类型错误 : create_user() got multiple values for keyword argument 'name'

Python:Selenium WebDriver find_elements_by_class_name

python:带有单文件源文件的 python egg 的简单示例?

html - 由于文本渲染,日文字符在 Chrome 中显示为方框 : optimizelegibility;