研究了一下 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. JavaScript window

    window -- window对象是BOM中所有对象的核心 window,中文"窗口" window对象除了是BOM中所有对象的父对象外,还包含一些窗口控制函数 全局的windo ...

  2. Bootstrap标签

    Bootstrap是Twitter推出的一个用于前端开发的开源工具包.用外链加载的方式可以将Bootstrap链接进来 常用方式: <link rel="stylesheet" ...

  3. PowerDesigner使用教程|使用方法

    PowerDesigner安装方法:  http://dev.firnow.com/course/3_program/java/javajs/20090908/174375.html 安装完这2个软件 ...

  4. [Hadoop 周边] Hadoop资料收集【转】

    原文网址: http://www.iteblog.com/archives/851 最直接的学习参考网站当然是官网啦: http://hadoop.apache.org/ Hadoop http:// ...

  5. css--block formatting context

    block formatting context(块级格式化上下文) 如何产生BFC:当一个HTML元素满足下面条件的任何一点,都可以产生Block Formatting Context: float ...

  6. IDE显示无法打开源文件时解决方案

      解决方法:加上具体地址信息将 #include <qwidgetresizehandler_p.h> 改为 #include <C:\Users\INnoVation\Deskt ...

  7. Web前端开发面试题

    1. 以下的代码有问题吗?如果有你觉着应该如何修改? for(int i=0; i<list.size(); i++) {  .....  .....  if(...)  {   list.re ...

  8. JS禁止右键

    function cancelMouse(){return false;}document.oncontextmenu = cancelMouse;

  9. poi 读取 excel(.xlsx) 2007及以上版本

    1.注意的一点是sh.getLastRowNum(),比实际的行数少一行 涉及到的包:

  10. OpenStack/Gnocchi简介——时间序列数据聚合操作提前计算并存储起来,先算后取的理念

    先看下 http://www.cnblogs.com/bonelee/p/6236962.html 这里对于环形数据库的介绍,便于理解归档这个操作! 转自:http://blog.sina.com.c ...