[英]GWT: Accessing i18n messages in server code
我有一個擴展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);
在服務器端Java上不能使用GWT特定的方法從屬性文件中創建接口並通過延遲綁定提供實現。
如果您無所畏懼並且願意花費時間,則可以執行代碼生成步驟以讀取屬性文件並為消息接口生成實現類。 這正是Google GWT編譯器在后台執行的操作。
我同意Michael ..我遇到了嘗試“本地化”服務器上生成的消息的問題....但是我決定改為在服務器上拋出Exception(因為這是一條錯誤消息,應該只在異常情況下發生),其中包含消息代碼,然后客戶端代碼可以查找並向用戶顯示正確的本地化消息。
有一個很棒的GWT國際化庫gwt-dmesg 。 它允許您在clent和服務器之間“共享” .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");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.