• openstack 本地化


    研究了一下 openstack中的本地化;主要使用gettext模块;
    其中本地化包括对一般字符串的本地化和log的本地化;
     
    (1)
    _localedir = os.environ.get('essential'.upper() + '_LOCALEDIR')
    _t = gettext.translation('essential', localedir=_localedir, fallback=True)
    def _(msg):
        if USE_LAZY:
            return Message(msg, domain='essential')
        else:
             if six.PY3:
                 return _t.gettext(msg)
             return _t.ugettext(msg)
    这个就是字符串本地化函数 _(),只不过openstack中有多一了一个USE_LAZY变量;是延迟翻译的意思;如果延迟翻译,返回的是Message类;
    Message 是一个继承于six.text_type的类,是一个unicode object。可以调用Message中的translate()方法他进行翻译;
     
     
    (2)
    下面是对log的本地化
    _t_log_levels = dict(
    (level, gettext.translation('essential' + '-log-' + level,
        localedir=_localedir,
        fallback=True))
    for level in ['info', 'warning', 'error', 'critical']
    )
    每一个级别的log都有自己的domain
    _log_translation(msg, level):
        """Build a single translation of a log message
        """
        if USE_LAZY:
             return Message(msg, domain='essential' + '-log-' + level)
        else:
            translator = _t_log_levels[level]
            if six.PY3:
                return translator.gettext(msg)
            return translator.ugettext(msg)
     
    为了方便使用,封装了下面的方法:
    _LI = functools.partial(_log_translation, level='info')
    _LW = functools.partial(_log_translation, level='warning')
    _LE = functools.partial(_log_translation, level='error')
    _LC = functools.partial(_log_translation, level='critical')
     
    (3)
    还有一个install()方法,
    if lazy:
     
        def _lazy_gettext(msg):
            """Create and return a Message object.
            return Message(msg, domain=domain)
     
        from six import moves
        moves.builtins.__dict__['_'] = _lazy_gettext
    else:
        localedir = '%s_LOCALEDIR' % domain.upper()
        if six.PY3:
            gettext.install(domain,
            localedir=os.environ.get(localedir))
        else:
            gettext.install(domain,
            localedir=os.environ.get(localedir),
            unicode=True)
     
    其作用是在__builtins__中加入_(),这样你的应用中的各个模块都可以使用到_()方法。不过这样影响比较大,局部的模块最好别使用install()方法,而是用类似下面的方式来做
    import gettext
    t = gettext.translation('mymodule', ...)
    _ = t.gettext
     
    (4) 
    在这个模块中还有一个translateHandler,是为log准备的。可以在打log的时候,对log进行翻译;
  • 相关阅读:
    Mongo简单查询总结
    将对象转换成Dictionary 字典
    C#调用NPOI组件导出Excel表格
    Lambda中的一些方法的总结
    LinQ总结
    简单的爬虫 一
    Python 中的注释规范
    在VM上配置一个能上网的网络设置
    Python 中新式类的内置方法
    Python 中的locals()
  • 原文地址:https://www.cnblogs.com/yuhan-TB/p/4314086.html
Copyright © 2020-2023  润新知