2011-09-20 59 views
2

我正在嘗試重寫幾個月前寫過的GWT應用程序。那個應用程序查看邏輯已經過時了,我還有其他的理由來重寫它。如何在GWT共享包中使用本地化常量

然而,後端保持不變並且有些作品。我的問題是項目的總體組織。我有客戶端,服務器和共享軟件包。客戶端包含編譯爲JavaScript的客戶端相關類,服務器包含發佈到服務器上的Java類。 我在客戶端使用Constants-interface,在服務器端使用屬性文件。

我在共享包中有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; 
    } 
} 

我想用常數取代「甲」,「珠寶」,「配方」等,這將取決於由需要什麼樣的區域調整客戶端應用程序。但是,如果我將枚舉過於緊密地綁定到客戶端 - 常量接口上,那麼在服務器端使用枚舉時可能遇到麻煩,對嗎?

任何關於翻譯共享內容的適當方式的想法都非常受歡迎。非常感謝您閱讀和幫助我!

P.s .:如果這個問題已經覆蓋某處,我請求原諒。我已經搜索了開發者指南(國際化)以及stackoverflow。但我沒有找到合適的解決方案。

回答

1

問題是你想在服務器和客戶端使用相同的屬性文件嗎?

我有同樣的問題。

我做了什麼:

  • 我用com.google.gwt.i18n.client.ConstantsWithLookup接口,而不是com.google.gwt.i18n.client.Constants以查找翻譯爲枚舉動態。
  • 在服務器端,您可以將ResourceBundle配置爲使用相同的屬性文件。

在客戶端,您使用ConstantsWithLookup實現,並在服務器端使用消息包。因此,你的枚舉不依賴於任何翻譯代碼。

客戶端:

服務器端:

String translation = messageSource.getMessage(yourEnum.name(), null, clientLocale) 
+0

啊!好吧..所以我必須將枚舉值映射到我的枚舉之外的適當字符串,因爲這些行根據我在客戶端還是服務器端使用枚舉而不同。 – Igor

+0

是的,這是正確的。爲什麼一個枚舉要用不同的語言來翻譯它?我是解除責任的朋友。 – Peter