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

最佳答案

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

  • 查找所有包含 .jsgoog.getMsg( 文件
  • 前置 goog.require("myApp.i18n");\n
  • goog.getMsg(
  • 替换所有 myApp.i18n.translate( 调用
  • MSG_*
  • 替换所有 myprefix_MSG_* 属性名称

    为什么会这样:不能直接覆盖 goog.getMsg,因为它被认为是编译器原语,不允许进行任何操作。这同样适用于 MSG_* 属性。
    myApp.i18n.translate 是一个函数,它接受字符串,尝试在语言环境映射(在运行时传递)中查找它并使用本地化字符串返回 goog.getMsg 结果( goog.getMsg 做了一些方便的占位符替换)。

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

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

    然而!

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

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

    关于localization - 如何在 Google Closure 中进行本地化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18645568/

    10-10 22:00