有没有办法使用GWT静态字符串i18n与服务器提供的属性?

时间:2013-02-08 13:44:01

标签: gwt

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

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

感谢大家帮助我。

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

UPDATE 2 :事实上,如果它被类似类似Costa或类似消息的界面包装,则Dictionary是一个选项。

2 个答案:

答案 0 :(得分:1)

你要求的不是静态的i18n。 GWT的i18n几乎全部是静态的一些原因:

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

如果你真的想要动态i18n,那就像其他答案一样建议并使用词典(但请注意,如果你的应用程序的消息有任何复杂性,你将无法正确本地化你的应用程序)。如果你需要的不仅仅是那个,那么咬紧牙关并使用静态i18n。

答案 1 :(得分:0)

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

不可: 标准方式static string i18n是所有语言排列都经过优化和内联的地方(即将日语公司名称放入按钮/列/标题的HTML模板中)。

因为完整的i18n套件可以支持多元化和消息构建器,@ nnoations和自动i18n,所以最好。它也是性能的最快选项。

不太好: 通常因为您需要使用遗留系统,所以Good不够好。在这里,而不是所有的火箭小部件,你只需要在框中获取文本。然后使用dynamic string i18n并将字符串放入页面中,类似于旧学校的Dictionary对象。