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)
这是个问题吗 ?我该如何做才能避免麻烦而不打扰我的用户?
您可以使用基于类的 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))
如果目标是不打扰您的用户(而且他不是很好),我想您可以在代码中使用基于类的方法,并让用户使用全局方法。
| 归档时间: |
|
| 查看次数: |
2123 次 |
| 最近记录: |