openstack 国际化

感谢朋友支持本博客,欢迎共同探讨交流,由于能力和时间有限,错误之处在所难免,欢迎指正!

如有转载,请保留源作者博客信息。

Better Me的博客:blog.csdn.net/tantexian

如需交流,欢迎大家博客留言。

1、下图发现在项目下面有一个compute没有被国际化。
openstack 国际化_第1张图片


2、在horizon代码中搜索:
openstack 国际化_第2张图片

openstack 国际化_第3张图片

#: dashboards/project/dashboard.py:24
msgid "Compute"
msgstr "Compute"

#: dashboards/project/dashboard.py:45
msgid "Object Store"
msgstr "对象存储"
从上述代码中可以发现Compute没有进行相应中文国际化(即翻译成中文)

修改代码:
#: dashboards/project/dashboard.py:24
msgid "Compute"
msgstr "计算资源"

在locale文件夹下面执行:
django-admin.py  compilemessage(有时候命令为: django-admin

重启服务
 service httpd restart

openstack 国际化_第4张图片

国际化demo完成。

更多详细请参考:

OpenStack国际化详细过程

一. Django国际化基本流程

1. Python代码和模板中嵌入待翻译的字符串。

1 Python代码中:

导入包:from django.utils.translation import ugettext as _

ugettext取别名_可方便调用。

代码中调用函数如:name=_(Instances & Volumes),其中的字符串Instances & Volumes为待翻译文字。

2 在模板(html文件)中:

{% load i18n %}放在文件最开头。两种情况:

{% trans %}模板标记翻译一个常量字符串 (括以单或双引号 可变内容:

<title>{% trans "This is the title." %}</title>

<title>{% trans myvar %}</title>

<% blocktrans %>标记翻译带有模版变量的内容:

{% blocktrans with book|title as book_t and author|title as author_t %}

This is {{ book_t }} by {{ author_t }}

{% endblocktrans %}

2. 把字符串翻译成需要的语言。

为一种语言创建一个信息文件。 信息文件是包含了某一语言翻译字符串和对这些字符串的翻译的一个文本文件。 信息文件以 .po 为后缀名。

在具有django框架的目录中使用:django-admin.py makemessages –l zh-cn可收集所有待翻译字符串,并在zh-cn目录下生成.po文件。该命令只默认收集.py.html文件中的字符串,若需要收集其他格式文件的,可添加参数-e,如:-e txt, xml

.po文件中英文翻译成对应的语言,如中文。

使用命令:django-admin.py compilemessage生成.mo文件。翻译主要靠此文件进行。

3. Django settings文件中激活本地中间件。

首先在settings中设置LANGUAGES的值,如:

gettext_noop = lambda s: s

LANGUAGES = (('en', gettext_noop('English')), ('zh-cn', gettext_noop('Simplified Chinese')),)

动态翻译:

MIDDLEWARE_CLASSES 设置中增加 'django.middleware.locale.LocaleMiddleware'

因为 LocalMiddleware 要用到session数据,所以需要放在 SessionMiddleware 之后。如果使用了CacheMiddleware,则需要把LocaleMiddleware放在它后面。

然后在代码中添加:if request.LANGUAGE_CODE == 'de-at' 类似代码就可以实现动态翻译的效果。

静态翻译:设置LANGUAGE_CODE = 'zh-cn'

二. OpenStack国际化化过程

前面介绍了django的国际化过程,接下来说明OpenStack-icehouse版汉化的过程,以下步骤为基本流程。

1. 找到locale文件,在locale目录的上层目录中,

openstack 国际化_第5张图片

即具有django框架的目录,运行命令

  django-admin makemessages -l zh-cn

  该命令收集该框架中需要翻译的字符串并自动生成.po文件,将其存放在zh-cn

  注意:执行可能会报错

  1) 被翻译字符串不能为空。如错误_(""),将其修改_(" ")

  2) 被翻译字符串参数一定要有名字标记顺序。

    如错误:_("%s,%s"),修改为:_("%(fir)s,%(sen)s")括号中变量名无所谓,但是一定要指定其对应的输出变量,例如:

 msg = _("The attribute %(attr)s doesn't exist on ""%(obj)s.") % {'attr': self.transform, 'obj': datum}


2. 将生成的.po文件进行翻译。翻译时msgid “” 标注原文,msgstr “” 中添入翻译字段。一定要注意引号对。

可以看到django-admin makemessages -l zh-cn命令生成的zh-cn文件夹。

openstack 国际化_第6张图片

在zh-cn文件夹里面生成了django.po文件。

vim django.po


测试起见修改界面的左侧菜单的项目下compute:

openstack 国际化_第7张图片

openstack 国际化_第8张图片


3. locale目录的上层目录执行命令:django-admin compilemessages。将po文件转换为mo文件。

4. settings.py文件中将LANGUNE_CODE指定为zh-cn

openstack 国际化_第9张图片


vim settings.py
openstack 国际化_第10张图片
找到language设置代码处:
openstack 国际化_第11张图片


重启httpd服务:

service httpd restart


汉化过程中碰到的问题:

1. Openstack中菜单选项无法翻译。原因是源代码中没有曝露出需要翻译的字符串。修改源代码如下:

在所有panel.py文件中添加:

from django.utils.translation import ugettext as _

#并且修改classname字符串输入格式,如:

name = "Flavors"改为name =_( "Flavors")

改完后再使用django-admin makemessages -l zh-cn就可以在.po文件中出现"Flavors"字段的翻译标签。

2. Django的翻译框架是增量的模式,即每次添加新的需要翻译的字符,或者删除不需要的字符后,使用django-admin.py makemessages -l zh-cn生成的.po文件中也会在原有文件的基础上增加或者删除对应的翻译标签。并且会自动匹配之前翻译过的字符,若匹配成功则自动翻译。但需要注意的是,若在msgid前一行出现#,fuzzy字样,则表示该msgid标出的字符不会被翻译,需要将#,fuzzy删除。

3. Devstack版本的OpenStack将某些字典key字符串也曝露出来,并可被.po文件收集,这些字符一般为小写单词如name,若翻译这种字符,会导致编码错误从而使相关模块崩溃。所以翻译时需要格外小心。

4. 某些需要翻译的字符源代码中并没有给出接口,这些字符在.py.html中都存在,需要按前面提到的方法修改源码再进行翻译。

 

你可能感兴趣的:(openstack 国际化)