Nova 的 i18n 延迟翻译支持

https://blueprints.launchpad.net/nova/+spec/i18n-enablement-juno

这份蓝图/规范建议通过启用 oslo.i18n 库中的“延迟”翻译支持,并完成更新 Nova 以符合这给可翻译字符串带来的限制,从而完成 Nova 的 i18n(国际化)支持的启用。

在 OpenStack 的近几个版本中,国际化实现一直是一项持续的工作。 Oslo 支持的原始蓝图包含在 Havana 中:https://blueprints.launchpad.net/oslo/+spec/delayed-message-translation

在之前的版本中(https://blueprints.launchpad.net/nova/+spec/user-locale-api)已经批准并完成了 Nova 中对此支持的蓝图。 在 Icehouse 版本中,国际化的基础支持被合并到 Nova 中。 具体来说,是对 Oslo 的 gettextutils 的更新以及先前明确从 gettextutils 导入 ‘_’ 的工作。

在 Juno 版本中,添加了 hacking 检查以限制可翻译消息在 Nova 中的使用方式。 特别是,确保可翻译的消息不被连接,并且不使用 str() 函数对异常进行处理。 此外,Nova 迁移到使用 oslo.i18n 库。

为了在 Kilo 中完成这项工作,我们需要启用 oslo.i18n 库提供的“延迟”翻译,并修复几个 str() 函数被用于可翻译消息的情况。

启用延迟翻译将允许最终用户不仅以多种语言生成日志,还增加了 REST API 消息也能够以用户选择的语言返回的能力。 此功能对于支持国际社区使用 OpenStack 非常重要。

问题描述

目前,所有 Nova 用户都必须同意使用通用的区域设置来翻译消息。 这是因为消息在创建时被翻译。 需要不同的 Nova 用户能够同时使用不同的翻译。

用户期望能够在 REST API 请求的标头中使用 Accept-Language 来指定他们希望将响应翻译成的区域设置,并在它与服务器上使用的区域设置不匹配时进行翻译。

用例

作为一名非英语用户,我希望发出 nova-api 请求并以我的母语获得响应。

项目优先级

请注意,需要尽快启用它,以便提供尽可能多的“磨合”时间。 此外,延迟翻译目前在其他项目中。

提议的变更

本提案是使用 oslo.i18n 库支持来启用消息的“延迟”翻译。 此支持不是立即翻译消息,而是创建一个 Message 对象,该对象保存消息和替换文本,直到可以使用来自用户请求的 Accept-Language 标头关联的区域设置来翻译消息。

代码更改将作为一系列补丁完成。

第一个补丁将添加一个 enable_lazy() 辅助方法(它调用 oslo.i18n 的 enable_lazy())到 nova/i18n.py,该方法由一个临时的 Nova 配置选项 ‘i18n_enable_lazy’ 控制,该选项默认值为 False。 在 nova/cmd/__init__.py 中调用这个新的辅助函数。 此外,删除剩余两个 str() 函数被调用到可翻译消息的情况。

第二个补丁将添加一个非投票的实验性 tempest 测试,该测试将此新的配置值设置为 True 并运行测试。 请注意,作为一个实验性 tempest 测试,该测试不会针对每次提交运行。

第三个补丁将添加一个特定的功能测试,以验证 Nova 的延迟启用是否正常工作。

第四个补丁将更改配置的默认值设置为 True。 我们不会在下一个版本之前删除配置支持。

第五个也是最后一个补丁将删除第二个补丁添加的非投票实验性 tempest 测试。

备选方案

无。

数据模型影响

无。

REST API 影响

除了允许 API 在用户指定希望以何种语言返回 REST API 响应时正确响应之外,REST API 没有其他额外的更改。

安全影响

无。

通知影响

无。

其他最终用户影响

无。

性能影响

无。

其他部署者影响

合并后,此功能将立即对用户可用。

开发人员影响

开发人员的影响已经存在一段时间了。开发人员一直在使用 _() 围绕需要翻译的消息。

由于 Juno 开发人员必须遵守以下 hacking 检查,以确保启用延迟翻译不会导致故障

  • 不能对异常使用 str() 函数

  • 可翻译的字符串不能被连接

  • 不能仅使用 locals() 指定替换文本

  • 不能仅使用 self.__dict__ 指定替换文本

Kilo 中添加了一个新的 hacking 检查:* 不能对用作替换文本的异常使用 unicode() 函数 https://review.openstack.org/#/c/129473/

实现

负责人

主要负责人

<jecarey@us.ibm.com>

工作项

补丁一

  • 在 nova/i18n.py 中添加 enable_lazy() 辅助函数,并使用配置控制,默认值为 False(不使用延迟翻译)

  • 在 nova/cmd/__init__.py 中添加对辅助函数的调用

  • 删除对可翻译消息使用 str() 函数的情况

补丁二

  • 添加配置为使用延迟翻译的非投票实验性 tempest 测试用例

补丁三

  • 为 Nova 添加延迟启用功能测试

补丁四

  • 将配置控制默认值更改为 True(使用延迟翻译)

补丁五

  • 删除补丁二添加的非投票实验性 tempest 测试用例

依赖项

这取决于 oslo.vmware 库的 0.6.0 或更高版本,其中包含 https://review.openstack.org/#/c/122193/,该版本修复了延迟启用支持。 Nova 当前需要至少此版本。

为了防止在启用延迟翻译时出现不正确的翻译,本规范依赖于删除对用作替换文本的异常使用 unicode() 函数,该问题在 bug https://bugs.launchpad.net/nova/+bug/1380806 中得到修复。

测试

  • 将添加 Nova 功能测试,以确保延迟翻译正常工作。

    为了使这些测试不太脆弱,它们将创建一个临时的翻译(语言),该翻译与默认翻译(语言)相同,除了每个翻译都将添加一个 uuid 作为前缀。 这样,可以通过简单地检查返回的消息中是否包含 uuid 来确认延迟翻译。

    • 第一个功能测试将包括在启用和禁用延迟翻译的情况下运行服务器创建 API,并确保返回的消息被延迟翻译。 这将通过在请求中使用 Accept-Language 来请求返回临时语言,并检查返回的消息是否包含 uuid 来完成。 此外,请求将在不使用 Accept-Language 的情况下完成,并确认缺少 uuid。

    • 第二个功能测试也将包括运行服务器创建 API,但在这种情况下,将配置第二次翻译日志,以将日志翻译成原始语言和临时语言。 然后将比较日志,以确保,不包括调试日志,日志仅因临时语言翻译的日志中添加了 uuid 而异。

  • 上面“开发人员影响”下列出的 hacking 检查。

文档影响

需要确保 API 文档正确指示现在将使用 Accept-Language 选项。

参考资料