【问题标题】:How to use localized constants in GWT shared package如何在 GWT 共享包中使用本地化常量
【发布时间】:2011-09-20 07:18:59
【问题描述】:

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

但是后端保持不变并且可以正常工作。

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

我在共享包中有 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”等,这将根据客户端应用程序所需的语言环境进行调整。但是:如果我将枚举与客户端常量接口绑定得太紧,那么在服务器端使用枚举时可能会遇到麻烦,对吧?

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

P.s.:如果这个问题在某处被提及,请原谅。我搜索了开发人员指南(国际化)以及 stackoverflow。不过我没有找到合适的解决方案。

【问题讨论】:

    标签: gwt


    【解决方案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)
    

    【讨论】:

    • 啊!好吧..所以我必须在我的枚举之外使用枚举值将枚举值映射到适当的字符串,因为这些行是不同的,具体取决于我是在客户端还是服务器端使用枚举。
    • 是的,没错。为什么枚举应该知道它在不同语言中的翻译?我是解耦责任的朋友。
    猜你喜欢
    • 1970-01-01
    • 2017-01-13
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 2016-06-24
    • 2012-04-02
    • 1970-01-01
    相关资源
    最近更新 更多