
Openstack有一个专门的国际化团队,负责将各个项目中涉及的界面、文档、消息等进行翻译,以方便世界各地不同语言的用户使用。
它由一个负责管理翻译平台和贡献流程的核心团队,以及许多针对各种语言的翻译小组构成,团队使用在线翻译平台Zanata和与之交互的一系列脚本来进行协作和翻译管理。
社区翻译机制
翻译流程图:

社区国际化主要流程包括下面几个步骤:
Openstack项目每次有代码合入时,代码中需要翻译的语句都会被提取出来组成不同的文本文件,并上传到翻译服务器zanata server。
翻译团队成员在翻译服务器上翻译文本。
每天早上UTC时间6:00,Openstack CI都会将翻译服务器上完成度超过75%且有更新的文件打包提交到gerrit。
项目成员review后合入代码库。
和Openstack代码一样,翻译结果默认会合入项目的master分支,当项目中有其他stable分支创建出来后,翻译团队会在翻译服务器上创建相应的翻译stable分支对应此项目stable分支,从而对不同分支进行分别处理。
zanata翻译服务器界面,翻译成员可以直接在网站上对提取出来的句子进行翻译:

具体流程分析
Openstack的项目按内容大体可分为下面几种:
代码类项目:nova, cinder, neutron等。
界面类项目:horizon及各ui项目。
文档类项目:openstack-manuals, ha-guide, security-guide等。
针对不同项目类型,翻译机制在具体处理上也稍有区别:
代码类和界面类项目相似,在python代码中,将需要翻译的字句用通用的gettext语法 _("some string”) 标志出来,代码合入时将触发脚本提取出标志的部分并更新到项目 $PROJECT/locale/ 目录下的po类型文件中,再将其上传至翻译服务器进行下一步处理。
文档类项目的 $PROJECT/doc/ 目录下一般包含多个不同的子文档目录,需要在 $PROJECT/doc-tools-check-languages.conf 里配置需要翻译的子文档目录、文档格式及需要翻译成的语言等,在合入时会有脚本根据配置信息,将子文档中的所有语句加入子文档 source/locale/ 目录下对应的po文件中,并上传到翻译服务器供团队翻译。
翻译结果应用
翻译服务器上翻译完成的文本都会被自动提交回gerrit,待Openstack项目合入完成后就可以使用了。
代码类项目:使用 setuptools+Babel 来管理国际化文件,在项目路径执行命令 python setup.py compile_catalog ,就会在 $PROJECT/locale/ 下的所有子目录中生成mo资源文件,只要将这些文件一起打包,在安装时放入系统默认路径 usr/share/locale/ 下个语种的 LC_MESSAGES 目录中,如:/usr/share/locale/zh_CN/LC_MESSAGES/, 或者根据 oslo.I18N 的规则设置环境变量 $PROJECT_LOCALEDIR 到项目源码路径,如:export GLANCE_LOCALEDIR=/usr/lib/python2.7/site-packages/glance/locale/,这样当请求头里包含语种代码时,如:Accept-Language: zh-CN,就会返回对应语言的消息。
界面类项目:Django 默认开启国际化支持,settings.py:USE_I18N = True,执行 django-admin compilemessages 将在locale目录下生成mo文件,同样当请求头里包含 Accept-Language 时,将返回对应语言的消息。
文档类项目:使用 Sphinx 管理文档,只要在生成文档时指定参数 language,就可以生成对应语言的文档,如:sphinx-build -D "language='zh_CN'" doc/[docname]/source/ doc/[docname]/build/html。
国际化后的 Horizon 中文界面:

更多资料
参与社区翻译需要在Zanata Server上注册并加入一个翻译团队,详细指导请参考
https://docs.openstack.org/developer/i18n/official_translator.html,
对国际化感兴趣的同学还可以从下面网站获取更多团队运作流程和技术资料。
Translations wiki:https://wiki.openstack.org/wiki/Translations
Openstack I18N Guide:https://docs.openstack.org/developer/i18n




