2013-06-20 63 views
1

我在Android java中遇到了問題,我希望在不同的語言中使用不同的詞彙表。

該應用程序由德國和瑞典的軍隊和警察部隊使用。 當然,德國人需要德語的應用程序,而瑞典人需要瑞典語,這當然是通過將字符串資源放在res/values-de/strings.xml和res/values-sv/strings.xml和是通過Android設備中的不同設置選擇的(請參閱Resource handling)。

但是我的問題是,警察部隊使用不同於軍事力量的詞彙,我想以某種方式反映資源。

有沒有什麼辦法可以通過res/values-de-mil/strings.xml或其他任何簡單的方式擁有不同的詞彙資源,我可以在應用f.ex中設置。Android中的自定義資源(不同詞彙)

回答

1

我不認爲這是可能的。

一個選項是將用戶的偏好設置爲共享首選項(您可以要求在用戶第一次打開應用程序時)以及如果是警察或軍隊存儲。

然後你可以使用反射來加載你的字符串資源。

<string name="string_policeMan">Word for a policeman</string> 
<string name="string_military">Word for a military</string> 


SharedPreferences shared = getSharedPreferences(PREF_NAME, MODE_PRIVATE); 
boolean isPoliceMan = shared.getBoolean(policeMan, false); 

int resId; 
if(isPoliceMan) 
    resId = R.string.class.getField("string_policeMan").getInt(null); 
else 
    resId = R.string.class.getField("string_military").getInt(null); 

String field = context.getResources().getString(resId); 
+0

看起來像一個可行的想法,感謝您的及時答案 –

0

據我知道它不可能有RES /值-DE-MIL由於Android系統並不知道用戶是誰。你可以做到這一點有2套字符串。 對於egyou有

<string name="Name">...</string>

使其作爲

<string name="mil_Name">...</string>

<string name="cop_Name">...</string>

現在,如果你知道用戶是軍方則getResources().getString(R.string.mil_Name);

+0

也看起來像一個可行的想法,非常感謝提示答案 –

1

實際上存在一種方式來做到這一點,即(ab)使用數量字符串。只是出於學術目的,我會給你一個下面的概念證明,但作爲前面的警告:知道這種方法確實歸納爲任何區域設置。不過,對於德語和瑞典語,你應該沒問題。

對於數量字符串(或複數,因爲他們通常被稱爲Android資源)背後的理論,請有一個read here。它也解釋了爲什麼下面概述的方法沒有推廣到任何語言環境。我會假設這一切都會有意義,所以讓我們快速轉向概念驗證。

值-DE/plurals.xml

<resources> 
    <plurals name="hello_im_in_the"> 
     <item quantity="one">Hallo, ich bin in der Armee.</item> 
     <item quantity="other">Hallo, ich bin auf der Polizei.</item> 
    </plurals> 
</resources> 

值-SV /複數。XML

<resources> 
    <plurals name="hello_im_in_the"> 
     <item quantity="one">Hej, jag är på militären.</item> 
     <item quantity="other">Hej, jag är på polisen.</item> 
    </plurals> 
</resources> 

讓我們在活動中使用上面的資源有四個TextView S:兩個用於各個地區,一個爲每一個「力」(警察與軍隊即是)。

@Override protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.res_activity_layout); 

    int policeForceQuantity = 0; 
    int militaryQuantity = 1; 

    TextView militaryTextViewDe = (TextView) findViewById(R.id.military_de); 
    TextView policeForceTextViewDe = (TextView) findViewById(R.id.police_force_de); 

    Configuration config = new Configuration(getResources().getConfiguration()); 
    config.locale = Locale.GERMAN; 
    getResources().updateConfiguration(config, getResources().getDisplayMetrics()); 
    String militaryText = getResources().getQuantityString(R.plurals.hello_im_in_the, militaryQuantity); 
    String policeForceText = getResources().getQuantityString(R.plurals.hello_im_in_the, policeForceQuantity); 
    militaryTextViewDe.setText(militaryText); 
    policeForceTextViewDe.setText(policeForceText); 

    TextView militaryTextViewSv = (TextView) findViewById(R.id.military_sv); 
    TextView policeForceTextViewSv = (TextView) findViewById(R.id.police_force_sv); 

    config = new Configuration(getResources().getConfiguration()); 
    config.locale = new Locale("sv"); 
    getResources().updateConfiguration(config, getResources().getDisplayMetrics()); 
    militaryText = getResources().getQuantityString(R.plurals.hello_im_in_the, militaryQuantity); 
    policeForceText = getResources().getQuantityString(R.plurals.hello_im_in_the, policeForceQuantity); 
    militaryTextViewSv.setText(militaryText); 
    policeForceTextViewSv.setText(policeForceText); 
} 

所有以上所做的是使用的1一定量的「選擇」軍事短語,以及任何其他值(0在該示例中),用於特定於波利奇力的短語。爲了舉例,我只是在運行時更改語言環境,因此我們可以並排查看結果,而無需真正進入設備的語言環境設置。

結果:

enter image description here

換句話說,這表明我們能夠成功地採取Android的語言環境系統的優勢,並使用預定義的數量來選擇軍事短語或警察部隊短語顯示。

並不漂亮,絕對不是數量字符串的意圖,但它會在您的特定用例中完成工作。

+0

這是一個有趣的解決方案,但你說有點骯髒。問題是,應用程序可能會翻譯成其他語言,但無論如何,我可能能夠使用它。謝謝 –