如何在GWT共享包中使用本地化常量

时间:2011-09-20 07:18:59

标签: gwt

我正在尝试重写几个月前写过的GWT应用程序。应用程序视图逻辑已经过时,我还有其他理由重写它。

然而,后端保持不变并且有效。

我的问题是项目的一般组织。我有客户端,服务器和共享包。客户端包含编译为JavaScript的客户端相关类,服务器包含发布到服务器上的Java类。 我在客户端使用Constants接口,在服务器端使用属性文件。

我在共享包中有DTO和一些枚举,因为它们在客户端和服务器端都使用。虽然DTO不需要任何类型的翻译,因为它们只保存他们所填写的信息,但是枚举确实需要它们。 我的一个枚举看起来像这样:

public enum ItemFamily {
    ARMORS(0, "A", "Armor"),
    JEWELRY(1, "J", "Jewelry"),
    MATERIALS(2, "M", "Materials"),
    RECIPES(3, "R", "Recipes"),
    WEAPONS(4, "W", "Weapons");

    private final int id;
    private final String label;
    private final String name;

    ItemFamily(final int id, final String label, final String name) {
        this.id = id;
        this.label = label;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public String toString() {
        return label;
    }

    public String getName() {
        return name;
    }

    public static ItemFamily fromString(final String str) {
        for (ItemFamily e : ItemFamily.values()) {
            if (e.toString().equalsIgnoreCase(str)) {
                return e;
            }
        }
        return null;
    }

    public static ItemFamily fromId(final int id) {
        for (ItemFamily e : ItemFamily.values()) {
            if (e.id == id) {
                return e;
            }
        }
        return null;
    }
}

我想用常量替换“Armor”,“Jewelry”,“Recipes”等,这将根据客户端应用程序所需的区域设置进行调整。但是:如果我将枚举紧密地绑定到客户端 - Constants接口,那么在使用服务器端的枚举时可能会遇到麻烦,对吗?

关于翻译共享内容的适当方式的任何想法都非常受欢迎。非常感谢你阅读并帮助我!

P.s。:如果某个地方已经涵盖了这个问题,请原谅。我搜索了开发人员指南(国际化)以及stackoverflow。我找不到合适的解决方案。

1 个答案:

答案 0 :(得分:1)

问题是你想在服务器和客户端使用相同的属性文件吗?

我遇到了同样的问题。

我做了什么:

  • 我使用com.google.gwt.i18n.client.ConstantsWithLookup界面而不是com.google.gwt.i18n.client.Constants来查找动态枚举的翻译。
  • 在服务器端,您可以将ResourceBundle配置为使用相同的属性文件。

在客户端,您使用ConstantsWithLookup实现,在服务器端使用消息包。因此,您的枚举不依赖于任何翻译代码。

客户方:

    String translation = const.getString(yourEnum.name())

服务器端:

    String translation = messageSource.getMessage(yourEnum.name(), null, clientLocale)