1

我正在寻找一个棘手问题的解决方案。我想使用 GWT 静态字符串国际化,因此使用常量、ConstantsWithLookup 和消息,但字符串必须在运行时来自服务器,而不是编译时。

是否已经有一个项目可以做这样的事情,或者我应该编写自己的 GWT 生成器?

感谢所有会帮助我的人。

更新:字典不是一个选项,因为应用程序几乎完成了,我无法为此更改所有应用程序。

更新 2:事实上,如果 Dictionary 由类似 Costants 或类似消息的界面包装,则它是一个选项。

4

2 回答 2

1

您要求的根本不是静态 i18n。GWT 的 i18n 几乎都是静态的的一些原因:

  • 它是一个同步 API。从服务器获取资源要么需要一个异步 API 传播到整个应用程序(即,将 Future 传递给一个小部件,告诉它一旦从服务器获取该字符串后从哪里获取其内部文本),或者您基本上必须在开始下载 i18n 资源之前阻止应用程序的执行(这会给用户带来糟糕的体验)。
  • 我们可以优化生成的代码以仅包含应用程序中的消息实际需要的那些格式化程序和相关数据。如果您不包含任何复数消息,我们就不必包含该代码等。在大多数情况下,可以内联表达式、删除死代码以及完全删除类引用。
  • 我们可以在编译时使用在运行时很难或昂贵的东西。例如,简单地解析消息格式字符串需要相当多的代码,而这些都不需要包含在编译的输出中。假设您从服务器获取应用程序的字符串,您发现其中一个包含 {0,localtime,YMd} - 现在您需要 ICU4J 来本地化它 - 哎呀!就算能全部编译成JS,那也是巨大的。或许您可以通过这种方式支持 GWT 的 i18n 的一个子集,但是您必须包含可能从消息中引用的每个格式化程序,即使它们中的大多数永远不会。

如果您真的想要动态 i18n,那么按照其他答案的建议进行操作并使用 Dictionary(但是请注意,如果您的应用程序的消息有任何复杂性,您将无法正确本地化您的应用程序)。如果您需要的不仅仅是它所能提供的,那么就硬着头皮使用静态 i18n。

于 2013-02-08T15:23:34.453 回答
0

有两种选择:好和不太好。

好: 标准方式,静态字符串 i18n是所有语言排列都在使用它们的地方进行了优化和内联(即将日本公司名称放入按钮/列/标题的 HTML 模板中)。

因为完整的 i18n 套件可以在支持多元化和消息构建器、@nnoations 和自动 i18n 的情况下进行详细说明,所以它是可取的。它也是性能最快的选择。

不太好: 通常是因为您需要使用遗留系统,所以“好”还不够好。在这里,而不是所有的火箭小部件,您只需要在框中获取文本。然后使用动态字符串 i18n并将字符串放入您的页面中,并使用类似于老式 Dictionary 对象的内容。

于 2013-02-08T13:51:01.097 回答