GWT:在服务器代码中访问i18n消息

时间:2011-10-14 15:10:02

标签: java gwt

我有一个扩展com.google.gwt.i18n.client.Messages类的接口,我用它来检索GWT应用程序中的i18n消息。它看起来像这样:

public interface MyMessages extends com.google.gwt.i18n.client.Messages {
  @DefaultMessage("Hello world")
  @Key("message1")
  String message1();

  @DefaultMessage("Hello again")
  @Key("message2")
  String message2();

  //...
}

通常,我使用GWT.create()创建它的实例,如下所示:

private MyMessages messages = GWT.create(MyMessages.class);

但是,这不适用于服务器端代码,只能用于客户端代码(它会抛出错误,说GWT.create()仅在客户端代码中可用)。

similar question的答案指向您可以下载的单独库,它可以让您访问服务器上的i18n消息,但我不想下载任何额外的库(这看起来很简单问题,必须有一个简单的解决方案)。

总结:如何在服务器端代码中访问我的i18n消息?谢谢。

5 个答案:

答案 0 :(得分:8)

在服务器端,您可以使用标准的Java本地化工具,例如ResourceBundle。 查看here以获取如何使用它的教程。

// Create a ResourceBundle out of your property files
ResourceBundle labels =
  ResourceBundle.getBundle("LabelsBundle", currentLocale);

// Get localized value
String value = labels.getString(key);

从属性文件创建接口并通过延迟绑定提供实现的GWT特定方法不能在服务器端Java上使用。

如果您无所畏惧并愿意花时间,您可以实现代码生成步骤来读取属性文件并为您的消息接口生成实现类。这正是Google GWT编译器在幕后所做的事情。

答案 1 :(得分:4)

我同意迈克尔..我遇到了尝试“本地化”服务器上生成的消息的问题....但我决定只在服务器上抛出一个异常(因为它是一个错误消息,应该只发生异常),其中包含消息代码,然后客户端代码可以查找并向用户显示正确的本地化消息。

答案 2 :(得分:1)

GWT国际化有一个很棒的图书馆gwt-dmesg。它允许您在clent和server之间“共享”.properties文件。但是,项目似乎被作者遗弃,您必须手动重新编译它以与GWT versio> = 2.1.0一起使用。

答案 3 :(得分:0)

GWT.create()只能在客户端代码中使用。

要做的好事是你提供自己的I18NProvider类/接口,然后你可以扩展到服务器端I18N工厂和客户端I18N工厂读取相同的资源包。

之后,您只需在整个系统中使用它,统一您的代码即可。 希望有所帮助。

答案 4 :(得分:0)

按照vanje的回答,并考虑用于属性文件的编码(这可能很麻烦,因为ResourceBundle默认使用“ISO-8859-1”,这是我提出的解决方案:

import java.io.UnsupportedEncodingException;
import java.util.Locale;
import java.util.ResourceBundle;

public class MyResourceBundle {

    // feature variables
    private ResourceBundle bundle;
    private String fileEncoding;

    public MyResourceBundle(Locale locale, String fileEncoding){
        this.bundle = ResourceBundle.getBundle("com.app.Bundle", locale);
        this.fileEncoding = fileEncoding;
    }

    public MyResourceBundle(Locale locale){
        this(locale, "UTF-8");
    }

    public String getString(String key){
        String value = bundle.getString(key); 
        try {
            return new String(value.getBytes("ISO-8859-1"), fileEncoding);
        } catch (UnsupportedEncodingException e) {
            return value;
        }
    }
}

使用它的方法与常规的ResourceBundle用法非常相似:

private MyResourceBundle labels = new MyResourceBundle("es", "UTF-8");
String label = labels.getString(key)

或者您可以使用默认情况下使用UTF-8的备用构造函数:

private MyResourceBundle labels = new MyResourceBundle("es");