OpenStack国际化详细过程
一. Django国际化基本流程
1. 在Python代码和模板中嵌入待翻译的字符串。
1) 在Python代码中:
导入包:from django.utils.translation import ugettext as _
为ugettext取别名_可方便调用。
代码中调用函数如:name=_(“Instances & Volumes”),其中的字符串“Instances & Volumes”为待翻译文字。
2) 在模板(html文件)中:
将{% load i18n %}放在文件最开头。两种情况:
l {% trans %}模板标记翻译一个常量字符串 (括以单或双引号) 或 可变内容:
<title>{% trans "This is the title." %}</title>
<title>{% trans myvar %}</title>
l <% 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')),)
l 动态翻译:
在MIDDLEWARE_CLASSES 设置中增加 'django.middleware.locale.LocaleMiddleware'
因为 LocalMiddleware 要用到session数据,所以需要放在 SessionMiddleware 之后。如果使用了CacheMiddleware,则需要把LocaleMiddleware放在它后面。
然后在代码中添加:if request.LANGUAGE_CODE == 'de-at' 类似代码就可以实现动态翻译的效果。
l 静态翻译:设置LANGUAGE_CODE = 'zh-cn'。
二. OpenStack国际化化过程
前面介绍了django的国际化过程,接下来说明OpenStack-icehouse版汉化的过程,以下步骤为基本流程。
1. 找到locale文件,在locale目录的上层目录中,
即具有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文件夹。
在zh-cn文件夹里面生成了django.po文件。
测试起见修改界面的左侧菜单的项目下compute:
3. 在locale目录的上层目录执行命令:django-admin compilemessages。将po文件转换为mo文件。
4. 在settings.py文件中将LANGUNE_CODE指定为zh-cn。
重启httpd服务:
汉化过程中碰到的问题:
1. Openstack中菜单选项无法翻译。原因是源代码中没有曝露出需要翻译的字符串。修改源代码如下:
在所有panel.py文件中添加:
from django.utils.translation import ugettext as _
#并且修改class中name字符串输入格式,如:
将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中都存在,需要按前面提到的方法修改源码再进行翻译。