簡體   English   中英

GWT:在服務器代碼中訪問i18n消息

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM