2017-06-03 87 views
0

可以說我通過字符串Top保存位置設置。 在更改應用程序語言時,該字符串變得毫無意義,因爲在新語言中,例如Arriba,以及那些字符串不相等。如何在多語言應用程序中存儲首選項?

所以我要保存的位置值1,因爲這將是相同的跨語言。

但後來偏好彙總成爲1,而不是任何方式「頂」在其他語言翻譯成。

因此,我將代碼映射到位置文本1 - >Top僅用於摘要顯示目的,並且僅保留位置代碼。

我還是要翻譯來回到處是設置顯示給用戶(如果它曾經是),與對每種語言的每個偏好和映射自身的代碼維護陣列一起。

好處是我可以通過其代碼使用設置並將其應用於應用程序,而無需事先將其從名稱映射回來,並且應用程序會在顯示首選項時將代碼翻譯爲字符串(使用「設置活動」)。

所以我想知道你是怎麼管理這個所以它不會變得難以管理或回來咬你在路上?

+1

如果只是一個設置,爲什麼您的密鑰會在語言之間發生變化。或者它是應用程序本身顯示的字符串?然後它不應該在首選項 – petul

+0

是的,它是反映當前選擇的選項的行,在按鈕下方在首選項屏幕上選擇一個新選項。 –

+0

對於你想達到的目標,我還是有點困惑。您在共享偏好設置中存儲了一個關鍵值對。由於您只使用一種語言進行編程,因此這些應該不是特定於語言的。如果要存儲當前選定的索引,請使用英文鍵並將該索引作爲值。該選定條目的文本使用strings.xml文件進行本地化。我可能會誤解你.. – petul

回答

0

由於枚舉要避免按documentation,這是我做了什麼:

定義兩個數組;一個是語言的字符串,一個用於代碼arrays.xml

<string-array name="lang"> 
    <item>Inglés</item> 
    <item>Español</item> 
</string-array> 

<string-array name="langCode"> 
    <item>EN</item> 
    <item>ES</item> 
</string-array> 

在我裝這兩個字符串數組到陣列的代碼和比較的代碼,以獲得key語言:所以現在

public void onSharedPreferenceChanged(SharedPreferences sp, String key) { 
    Preference preference = findPreference(key); 
    String arrayLang[] = getResources().getStringArray(R.array.lang); 
    String arrayCode[] = getResources().getStringArray(R.array.langCode); 
    for (int i = 0; i < arrayCode.length; i++) { 
     if (arrayCode[i].contains(key)) { 
      preference.setSummary(arrayLang[i]); 
     } 
    } 

我每個語言都保留langCode數組,只能翻譯名稱。

可能不是最好的方式,但它的工作。

0

我想你應該從反面看問題。現在你正專注於店由它的價值偏好,但讓我們從定義它代表了一個設定的所有可能值的類型,例如啓動:

enum Position 
{ 
    TOP("position_top"), 
    BOTTOM("position_bottom"), 
    LEFT("position_left") 
    ; 

    public final String identifier; 
    private Position(String identifier) { this->identifier = identifier; } 
} 

現在你已經和你相關的所有的設置可能的值一個標識符(如果您願意,可以直接使用enum toString()值)。

該標識符可以在喜好兩者既用於序列化在strings.xml指本地化的資源。

+0

不錯,不知道它存在(我剛開始使用Java)。從進一步的搜索,我看到我可以把'TOP(「頂部」,1),底部(「底部」,2)'等來回參考,對吧? –

+0

當然,如果你可以使用一個有意義的字符串,那麼使用一個數字來序列化一個鍵/值對是沒有意義的。 – Jack

相關問題