你如何在GWT中本地化一个类的字段名称?

时间:2012-03-21 01:24:04

标签: gwt localization internationalization software-design gwt2

我有一般设计问题。

如何在GWT中本地化类的字段名称?

想象一下,我有带虚构注释的bean,例如

class Person
{
    @LocalizedName(value = "{Person.name}")
    String name;

    @LocalizedName(value = "{Person.address}")
    String address;
}

我将拥有英语和德语的资源包,其中将指定这两个值。

在运行时的某个时刻,我会有Class<Person>的实例和一些包含字段名称的String(例如name)。

我想以某种方式自动获取名称的本地化版本。

我知道I can创建我的Messages界面并调用其getString(),但这需要为本地化的每个类字段指定复杂的方法名称,例如MyMessages.person_address()如果我在重构过程中重命名该属性,那么这不仅是不冷却的,而且往往会破坏。

今天我就是这样做的,而且非常难看。

想法?也许我可以使用Generators?别的什么?你是怎么做到的?

1 个答案:

答案 0 :(得分:0)

如果你想在GWT中使用i18n,你应该使用它们的内置机制。 Google的应用程序通常使用GWT构建为320个排列,因此这种方法显然适用于大量的i18n,并且不应该那么难实现。

您的选择是:

  • 接口文件中带有硬编码字符串的消息接口:(
  • 带有外部字符串属性文件的消息接口:|
  • 带有标签的UiBinder,由本地化的字符串文件备份:)

就个人而言,我更喜欢UiBinder案。每当你需要在一个小部件中使用一个字符串(即标题,标签等)时,你只需要像这样包装字符串:

<ui:msg description="my great title">You're Title!</ui:msg>

现在编译时,GWT会将所有字符串聚集在一起并通过MD5哈希识别它们。多次使用相同的单词/短语,它只会在您的i18n属性文件中出现一次,GWT会根据它找到的所有唯一字符串为您动态编译。现在只需翻译该文件并将其命名为 name_DE ,GWT将在德语排列中将所有英语单词换成德语。

注意:只有类可以使用消息接口。您必须使用它们来动态更新应用程序中的字符串。

有关详情,请参阅GWT i18n guide

VielGlück。