研究了一下 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进行翻译;

openstack 本地化的更多相关文章

  1. 理解 OpenStack 高可用(HA)(5):RabbitMQ HA

    本系列会分析OpenStack 的高可用性(HA)概念和解决方案: (1)OpenStack 高可用方案概述 (2)Neutron L3 Agent HA - VRRP (虚拟路由冗余协议) (3)N ...

  2. Openstack的nova-network的vlan模式扩展2

    接上一篇,上一篇我们使用的是nova-manage命令来创建的网络,这里就有一些知识需要了解 遇到的问题 控制节点的前面的BUG已经按官方解决BUG方式解决了,但是在开发dashboard,使用nov ...

  3. (转)如何阅读OpenStack源码

    1 关于该项目 本项目使用在线绘图工具web sequencediagrams完成,目标是图形化OpenStack的所有操作流程,通过操作序列图能快速学习Openstack的工作原理,理清各个组件的关 ...

  4. 零基础学习openstack【完整中级篇】及openstack资源汇总

    1.你是如何学习openstack的?2.你对openstack的组件了解多少?3.你认为openstack该如何学习? 一直想写关于openstack的方面的内容,今天终于整理完成.算是完成一桩心事 ...

  5. OpenStack Queens版本Horizon定制化开发

    工具环境 1.VMware workstation 12+: 2.Ubuntu系统+Linux Pycharm: 3.OpenStack Queens版本Horizon代码: 问题及解决 1.项目代码 ...

  6. OpenStack 2014.1(Icehouse) 更新说明

    OpenStack 2014.1(Icehouse) 更新说明 1.综合升级说明 Ÿ   Windows安装包应使用PBR 0.8版本,以避免发生bug1294246 Ÿ   log-config选项 ...

  7. ABP文档 - 本地化

    文档目录 本节内容: 简介 应用语言 本地化源 XML文件 注册XML本地化源 JSOn文件 注册JSON本地化源 资源文件 自定义源 获取一个本地文本 在服务端 在MVc控制器里 在MVC视图里 在 ...

  8. 视频 - 在 VirtualBox 中部署 OpenStack

    大家新年好,CloudMan 今天给大家带来一件新年礼物. 一直以来大家都反馈 OpenStack 学习有两大障碍:1. 实验环境难搭2. 体系复杂,难道大今天我就先帮大家解决环境问题.前两天我抽空在 ...

  9. 启用 Open vSwitch - 每天5分钟玩转 OpenStack(127)

    Linux Bridge 和 Open vSwitch 是目前 OpenStack 中使用最广泛的两种虚机交换机技术. 前面各章节我们已经学习了如何用 Linux Bridge 作为 ML2 mech ...

随机推荐

  1. Spring3.1新特性

    一.Spring2.5之前,我们都是通过实现Controller接口或其实现来定义我们的处理器类.   二.Spring2.5引入注解式处理器支持,通过@Controller 和 @RequestMa ...

  2. examine self thrice a day2016

    ----------------------------2016-----------------------  12.31.2016 2016年,感恩一路帮助过我的所有人!       每个人来到世 ...

  3. 图像处理JPEGCodec类错误问题 毕业设计遇到的问题

     图像处理JPEGCodec类已经从Jdk1.7移除 2014-06-16 20:01:26 分类: 架构设计与优化 著名测试工具jira在使用图像处理JPEGCodec类会报告以下信息: 我是这样用 ...

  4. 3D动画

    先上一道菜 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  5. $('#checkbox').attr('checked'); 返回的是checked或者是undefined解决办法

    $('#checkbox').attr('checked'); 返回的是checked或者是undefined解决办法 <input type='checkbox' id='cb'/>  ...

  6. hdu---(4515)小Q系列故事——世界上最遥远的距离(模拟题)

    小Q系列故事——世界上最遥远的距离 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)T ...

  7. 学编程,学单词.....在学习中积累自己的单词(不断更新__ing)

    可以去肆意大话天下,可以去小民一般的言语,但是一定要清楚,知识的积累,至于心中,即便你说这粗俗的话,你的个性,气质依旧在那,比如北大的那啥教师(心中的典范),也只有这样,你才能低至市井,上至高阁... ...

  8. 421. Maximum XOR of Two Numbers in an Array——本质:利用trie数据结构查找

    Given a non-empty array of numbers, a0, a1, a2, - , an-1, where 0 ≤ ai < 231. Find the maximum re ...

  9. Internet Explorer已限制此网页运行可以访问计算机的脚本或ActiveX控件

    在制作网页的时候,大家不免要用到script,也即是脚本,主要是VBScript以及JavaScript.那么时常遇到这样的情况: 在本地双击打开html文件时,如果是IE的话,会出现提示框(如下图) ...

  10. Genymotion常见问题整合与解决方案

    常见问题1:Genymotion在开启模拟器时卡在了starting virtual device(注意只有tarting virtual device窗口,没有模拟器的黑屏窗口)    原因:Vir ...