GWT:在服务器代码中访问i18n消息
我有一个扩展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()仅在客户端代码中可用)。
类似问题的答案指向一个可以下载的单独库,它可以让你访问服务器上的i18n消息,但我不想下载任何额外的库(这似乎是一个简单的问题,必须有一个简单解决方案)。
总结: 如何在服务器端代码中访问我的i18n消息? 谢谢。
在服务器端,您可以使用标准的Java本地化工具,如ResourceBundle 。 在这里查看如何使用它的教程。
// 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编译器在幕后所做的事情。
我同意迈克尔..我遇到了尝试“本地化”服务器上生成的消息的问题….但我决定只在服务器上抛出一个exception(因为它是一个错误消息,应该只发生exception)包含消息代码,然后客户端代码可以查找并向用户显示正确的本地化消息。
GWT国际化gwt-dmesg有一个很棒的图书馆。 它允许您在clent和server之间“共享”.properties文件。 但是,项目看起来被作者遗弃,您必须手动重新编译它以与GWT versio> = 2.1.0一起使用。
GWT.create()只能在客户端代码中使用。
要做的好事是,您提供自己的I18NProvider类/接口,然后您可以从中扩展到服务器端I18N工厂和客户端I18N工厂读取相同的资源包。
之后,您只需在整个系统中使用它,统一代码即可。 希望有所帮助。
按照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");