目前,我在 Closure 应用程序中仅使用纯文本。我想为这些文本添加本地化。我刚刚找到了几篇关于 goog.getMsg 函数的文章,该函数用于进行这种本地化。据我所知,它是在编译时完成的。当用户单击按钮时,我们如何在运行时更改语言?使用 Closure 执行此操作的最简单方法是什么?
最佳答案
我实际上已经实现了运行时 i18n。我使用带有 {msg}
标签的 .soy 模板。当您将 .soy 编译为 .js 时,这些调用会被编译为 goog.getMsg 调用。我必须做的是:
.js
的 goog.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/