2013-10-30 49 views
2

我的Android應用程序使用枚舉類型來定義某些API端點。跨多種人類語言統一enum.values()

public static enum API_ENDPOINT{ 
     MISSION, FEATURED_MEDIA 
} 

枚舉類型似乎是依賴於API調用類型的方法適當的說法,但我無法翻譯枚舉一貫的字符串(即用於映射到API端點URL)的跨設備具有不同的配置語言。

在土耳其API_ENDPOINT.values()回報:mıssıon, featured_medıa

在英語API_ENDPOINT.values()回報:mission, featured_media

一個顯而易見的解決方案是一個額外的數據結構,映射到API_ENDPOINT硬編碼字符串終點,但我很好奇是否這種enum.values()的行爲是有意和/或可避免的。

已解決:謝謝大家的見解。在邏輯上更深入的將API_ENDPOINT轉換爲我使用的URL字符串String.toLowerCase(),而不指定Locale,這導致了不良行爲。這已被替換爲String.toLowerCase(Locale.US)

+0

我從i11n專家很遠,但它是正常i11n-IZE網址?我認爲一個URL方案只是選擇一種語言,而i11n只是爲最終用戶可見的元素,比如呈現的HTML(或插入到html中的json等)。 – yshavit

+0

我希望從API_ENDPOINT.values()生成的URL字符串在爲每種語言配置的設備上都相同。我的問題是,從API_ENDPOINT.MISSION生成端點的土耳其設備不同於英文設備上生成的設備。 – dbro

+0

啊,好的。完全顛倒了我的腦袋。 :) – yshavit

回答

2

您可以硬編碼字符串作爲枚舉的一部分,沒有任何額外的數據結構:

public static enum API_ENDPOINT{ 
    MISSION("mission"), FEATURED_MEDIA("featured_media"); 
    private final String value; 
    API_ENDPOINT(String value) { this.value = value; } 
    public String value() { return value; } 
} 

但是如果只有一種方法來控制自動生成的表示,那將會很不錯。

The JLS enum section不直接說話這樣的語言差異,但強烈建議輸出將完全匹配的枚舉標識符;我很驚訝你甚至會得到帶有大寫標識符的小寫字符串。


進一步測試後,這是不可複製的,一定是別的東西在你的代碼中繼續。

這個最小的程序顯示枚舉標識符正是因爲無論區域設置類型:

public class MainActivity extends Activity { 
    public enum ENUM { 
     MISSION, FEATURED_MEDIA 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     TextView textView = (TextView) findViewById(R.id.text); 
     String enums = ""; 
     for (ENUM e : ENUM.values()) { 
      enums += e + " "; 
     } 
     textView.setText(enums); 
    } 
} 
+0

你絕對正確。事實證明,我的邏輯中有一個'toLowerCase()',沒有指定區域設置!敏銳的工作! – dbro

2

您可以定義兩個屬性文件。一個用於英語,一個用於土耳其語。然後
枚舉看起來是這樣的:

public static enum API_ENDPOINT{ 
    MISSION("path.to.property.mission"), FEATURED_MEDIA("path.to.property.featured_media"); 

    private String propertyName; 
    API_ENDPOINT(String propertyName){ 
     this.propertyName = propertyName; 
    } 

    // language could also be an enum which defines the language to be taken 
    // and should contain the path to the file. 
    public String getTranslatedText(Language language){ 
     Properties prop = new Properties(); 

     try { 
      //load a properties file from class path 
      prop.load(API_ENDPOINT.class.getClassLoader().getResourceAsStream(language.getPropertyFileName())); 

      //get the translated value and raturn it. 
      return prop.getProperty(propertyName); 

     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 
} 

的財產文件看起來像這樣(英語):

path.to.property.mission=Mission 
path.to.property.featured_media=Featured Media 

同去土耳其。 希望有所幫助。

編輯:由於您使用的是Android的,這可能是你的問題的解決方案:

+2

在android中,寧願採取int(R.string.mission)並從上下文加載getResources() – njzk2

+0

是的你是對的,沒有看到android標籤。編輯我的答案;) –