I18N支持
| |
旧设计页面
此页面曾用于帮助设计已实现的功能。因此,此页面可能不会更新,并且可能包含过时的信息。上次更新时间为 2013-10-07 |
- Launchpad 条目: NovaSpec:i18n-support
- 创建: 2010-10-22
- 贡献者: Koji Iida, Hisaharu Ishii
http://etherpad.openstack.org/I18N-Support
总结
- 日志消息的国际化支持
- 支持日语消息
发布说明
- 待定
原理
- 目前,日志消息仅以英语书写。
- 为了OpenStack的全球使用,需要 I18N 支持。
用户故事
- 待定
前提条件
- 仅服务器端日志消息
- 使用 launchpad 功能 https://help.launchpad.net/Translations 来管理翻译。
设计
- 使用 gettext 模块替换现有的日志消息输出源代码,使其符合 I18N 风格。
- 提供日语消息目录 (.po) 文件。
实现
JayPipes 已经开始为 OpenStack-CI 项目 进行 i18n 流程。他将提供帮助,以自动化将消息目录上传到 Launchpad 翻译单元。
UI 变更
- 没有 UI 更改。
代码变更
以下是示例实现步骤。
1. 在 Python 的内置命名空间中安装函数 _()。
示例:nova/nova-scheduler
import os
import sys
+ import gettext
# If ../nova/__init__.py exists, add ../ to Python search path, so that
# it will override what happens to be installed in /usr/(local/)lib/python...
possible_topdir = os.path.normpath(os.path.join(os.path.abspath(sys.argv[0]),
os.pardir,
os.pardir))
if os.path.exists(os.path.join(possible_topdir, 'nova', '__init__.py')):
sys.path.insert(0, possible_topdir)
from nova import service
from nova import twistd
+ gettext.install('nova', './locale', unicode=1)
+
if __name__ == '__main__':
twistd.serve(__file__)
if __name__ == '__builtin__':
application = service.Service.create()
2. 通过调用 _() 函数包装用于日志记录函数的字符串,从而标记这些字符串。
示例:./nova/service.py
if not periodic_interval:
periodic_interval = FLAGS.periodic_interval
- logging.warn("Starting %s node", topic)
+ logging.warn(_("Starting %s node"), topic)
service_obj = cls(host, binary, topic, manager,
report_interval, periodic_interval)
3. 生成 .pot 文件。
$ pygettext -p locale -d nova nova/service.py
生成文件 locale/nova.pot。
4. 将 nova.pot 复制到 nova.po。
$ cp locale/nova.pot locale/ja/LC_MESSAGES/nova.po
5. 将 locale/ja/LC_MESSAGES/nova.po 翻译成您的语言。
将 locale/ja/LC_MESSAGES/nova.po 翻译成日语的示例
# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR ORGANIZATION # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # msgid "" msgstr "" "Project-Id-Version: 0.1\n" "POT-Creation-Date: 2010-10-27 17:50+JST\n" "PO-Revision-Date: 2010-10-27 18:13+JST\n" "Last-Translator: Someone <iida.koji@example.com>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" #: nova/service.py:141 msgid "Starting %s node" msgstr "%s ノードを開始します"
6. 生成 .mo 文件。
$ msgfmt -o locale/ja/LC_MESSAGES/nova.mo locale/ja/LC_MESSAGES/nova.po
生成文件 ./locale/ja/LC_MESSAGES/nova.mo。
7. 测试 nova-scheduler
$ LANGUAGE=ja_JP.UTF-8 ./bin/nova-scheduler --flagfile=./nova-manage.conf
输出消息
... DEBUG:root:network_topic : network WARNING:root:scheduler ノードを開始します 2010-10-27 18:30:41+0900 [-] Log opened. 2010-10-27 18:30:41+0900 [-] twistd 10.0.0 (/usr/bin/python 2.6.5) starting up. 2010-10-27 18:30:41+0900 [-] reactor class: twisted.internet.selectreactor.SelectReactor. INFO:root:backend <module 'nova.db.sqlalchemy.api' from '/home/iida/openstack/nova-2010.1-i18n/nova/db/sqlalchemy/api.pyc'> 2010-10-27 18:30:41+0900 [-] (root): INFO backend <module 'nova.db.sqlalchemy.api' from '/home/iida/openstack/nova-2010.1-i18n/nova/db/sqlalchemy/api.pyc'>
迁移
- 待定
测试/演示计划
- 待定
未解决的问题
- 待定
BoF 议程和讨论
- 待定