zoukankan      html  css  js  c++  java
  • 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进行翻译;
  • 相关阅读:
    Linux C 字符串函数 sprintf()、snprintf() 详解
    Linux C 字符串输入函数 gets()、fgets()、scanf() 详解
    Linux C 字符串函数 strlen()、strcat()、strncat()、strcmp()、strncmp()、strcpy()、strncpy() 详解
    Linux C 字符函数 getchar()、putchar() 与 EOF 详解
    Linux C popen()函数详解
    【重装系统】线上Linux服务器(2TB)分区参考方案
    Ubuntu 开机进入命令行模式
    oracle视图总结(创建、查询、改动、删除等)
    UVa 637
    Intent 的Flag属性(Activity在栈位置的主宰者)
  • 原文地址:https://www.cnblogs.com/yuhan-TB/p/4314086.html
Copyright © 2011-2022 走看看