跳转到: 导航, 搜索

I18N支持

Warning.svg 旧设计页面

此页面曾用于帮助设计已实现的功能。因此,此页面可能不会更新,并且可能包含过时的信息。上次更新时间为 2013-10-07

  • Launchpad 条目: NovaSpec:i18n-support
  • 创建: 2010-10-22
  • 贡献者: Koji Iida, Hisaharu Ishii

http://etherpad.openstack.org/I18N-Support

总结

  • 日志消息的国际化支持
  • 支持日语消息

发布说明

  • 待定

原理

  • 目前,日志消息仅以英语书写。
  • 为了OpenStack的全球使用,需要 I18N 支持。

用户故事

  • 待定

前提条件

设计

  • 使用 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 议程和讨论

  • 待定