【问题标题】:How to do localization in Google Closure如何在 Google Closure 中进行本地化
【发布时间】:2013-09-05 20:41:33
【问题描述】:

目前我在 Closure 应用程序中只使用纯文本。我想为这些文本添加本地化。我刚刚找到了几篇关于 goog.getMsg 函数的文章,该函数用于进行这种本地化。据我了解,它是在编译时完成的。当用户单击按钮时,我们如何在运行时更改语言?使用 Closure 最简单的方法是什么?

【问题讨论】:

  • i8nl 是闭包中的编译时间。

标签: localization google-closure-compiler google-closure google-closure-library google-closure-templates


【解决方案1】:

我实际上已经实现了运行时 i18n。我使用带有{msg} 标签的.soy 模板。当您将 .soy 编译为 .js 时,这些调用将编译为 goog.getMsg 调用。我必须做的是:

  1. 查找所有包含goog.getMsg(.js 文件
  2. 添加goog.require("myApp.i18n");\n
  3. 将所有goog.getMsg( 调用替换为myApp.i18n.translate(
  4. 将所有MSG_* 属性名称替换为myprefix_MSG_*

为什么会这样:不能直接覆盖 goog.getMsg,因为它被认为是编译器原语并且不允许任何操作。同样适用于MSG_* 属性。

myApp.i18n.translate 是一个接受字符串的函数,尝试在语言环境映射中查找它(在运行时传递)并使用本地化字符串返回goog.getMsg 结果(goog.getMsg 做了一些方便的占位符替换)。

虽然这不是一个非常漂亮的解决方案,但它可以工作,并允许我在运行时更改语言,只使用一个编译文件用于所有语言。

实际代码包含一些技巧,允许我使用生成的描述并使用 JSON 文件而不是看起来很奇怪的闭包文件格式,但要点是相同的。

但是!

您真正应该做的是从您的应用中编译多个文件并为每种语言加载不同的 .js 文件。

我不得不使用这个解决方案,因为我需要支持数百种不同的配置和多种语言:编译数千个 .js 文件会很疯狂,而一次编译需要 30 多秒。

【讨论】:

  • 自动构建哟!至于您的解决方案,这很有趣,我实际上建议将其编写为编译器插件。如果您需要这方面的帮助,我很乐意提供帮助。
【解决方案2】:

虽然这不是一个单击语言切换解决方案,但我觉得它非常舒服,因为它允许在 JS 代码中为 Soy 模板和 goog.getMsg() 使用相同的本地化文本源。这是一种使用 Google 自己的 XML 翻译格式(称为 XTB)的未记录方式。

对于每种语言,您最终会得到不同的编译 .js 文件,因此要切换语言环境,您必须重新加载不同的 JS 文件。

除了标准的 Closure 工具之外,还有一个名为 XtbGenerator 的第三方工具,可以在这里找到:https://github.com/kuzmisin/xtbgenerator


现在的工作流程:

  1. 使用SoyToJsSrcCompiler.jar--shouldGenerateGoogMsgDefs --bidiGlobalDir 1 选项编译您的模板。还没有语言环境。

  2. 使用calcdeps.py创建依赖文件

  3. 运行closurebuilder.py,将--compiler_jar 设置为XtbGenerator.jar 文件并使用--compiler_flags="--xtb_output_file=origin.xtb" 参数。

    这将创建一个名为origin.xtb 的文件,然后您可以将其用作翻译的基础。它将包含来自 Soy 模板(在 {msg} 块中)和您的 JS 文件(使用 var MSG_TEST = goog.getMsg('Text'); 的地方)的所有文本。

  4. origin.xtb复制到例如translated.cs_CZ.xtb,更改文件中的lang属性并翻译那里的所有文本。

  5. 使用closurebuilder.pycompiler.jar 以标准方式为给定的语言环境编译应用程序。使用参数:

    --compiler_flags="--translations_file=translated.cs_CZ.xtb"

    --compiler_flags="--define=goog.LOCALE='cs_CZ'"

    这将为您创建单一语言环境的编译版本。

所有这些步骤的好例子都在这里:http://www.closurecheatsheet.com/skeleton

不幸的是,几乎没有官方文档。


XTB 格式

格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE translationbundle>
<translationbundle lang="cs">
    <translation id="4127240967364168948" key="MSG_6LRZ706911HM" source="..\test.soy.js" desc="description">test</translation>
</translationbundle>

id 和大豆模板还 key 属性由编译器/提取器自动生成

这很可能是某种 Google 内部格式,其中包含尚未开源的工具。


关于 XtbGenerator 的注意事项

它在内部使用 Closure Compiler 代码来检查您的 JS 代码并提取消息。然而,可下载版本是使用旧版本的 Closure Compiler 构建的,所以它给我带来了一些错误。

我通过将goog 目录从当前版本的compiler.jar 复制到XtbGenerator.jar 进行了快速而肮脏的破解。

【讨论】:

    猜你喜欢
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    • 2013-08-05
    相关资源
    最近更新 更多