2016-05-26 45 views
4

我想以編程方式更改語言。如何以編程方式更改語言?

所以我建立了兩個xml文件。

values-it 
-->string.xml 

values-en 
-->string.xml 

這是MainActivity代碼改變整個應用程序的語言:

//意大利

Resources res = getApplicationContext().getResources(); 
DisplayMetrics dm = res.getDisplayMetrics(); 
android.content.res.Configuration conf = res.getConfiguration(); 
conf.locale = new Locale("it"); 
res.updateConfiguration(conf, dm); 

// ENGLISH

Resources res2 = getApplicationContext().getResources(); 
DisplayMetrics dm2 = res2.getDisplayMetrics(); 
android.content.res.Configuration conf2 = res2.getConfiguration(); 
conf2.locale = new Locale("en"); 
res2.updateConfiguration(conf2, dm2); 

現在,如果我設置英語(例如)代碼執行時沒有錯誤,但標籤不會更改其文本。
如果我更改設備的方向,標籤會正確更改其文本。

現在如何修改我的代碼以自動刷新標籤?

+0

嘗試在onResume()中調用您的代碼。 – Mehta

+1

嗨,在這裏你是一個鏈接,告訴你如何重新加載更改而不關閉活動:http://stackoverflow.com/questions/2644377/changing-locale-force-activity-to-reload-resources –

+0

可能的重複[如何刷新活動後改變語言(區域設置)內應用程序](http://stackoverflow.com/questions/8049207/how-to-refresh-activity-after-changing-language-locale-inside-application) –

回答

5
AlertDialog.Builder builder = new AlertDialog.Builder(DashboardActivity.this); 
      builder.setTitle(R.string.languages); 
      // Add the buttons 
      builder.setPositiveButton(R.string.english, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        String languageToLoad = "en"; // your language 
        Locale locale = new Locale(languageToLoad); 
        Locale.setDefault(locale); 
        Configuration config = new Configuration(); 
        config.locale = locale; 
        getBaseContext().getResources().updateConfiguration(config, 
          getBaseContext().getResources().getDisplayMetrics()); 
        dialog.dismiss(); 
        rEditor.putString("language", languageToLoad); 
        rEditor.commit(); 



        Intent refresh = new Intent(DashboardActivity.this, DashboardActivity.class); 
        startActivity(refresh); 
        finish(); 

       } 
      }); 
      builder.setNegativeButton(R.string.gujarati, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        // User cancelled the dialog 

        String languageToLoad = "gu"; // your language 
        Locale locale = new Locale(languageToLoad); 
        Locale.setDefault(locale); 
        Configuration config = new Configuration(); 
        config.locale = locale; 
        getBaseContext().getResources().updateConfiguration(config, 
          getBaseContext().getResources().getDisplayMetrics()); 
        dialog.dismiss(); 
        rEditor.putString("language", languageToLoad); 
        rEditor.commit(); 


        Intent refresh = new Intent(DashboardActivity.this, DashboardActivity.class); 
        startActivity(refresh); 
        finish(); 

       } 
      }); 

      builder.create().show(); 

,你必須重新加載活動以顯示新的語言文字是指重新啓動。

+0

什麼是'rEditor'? – Choletski

+0

sharedPreference編輯器保存數據.http://developer.android.com/training/basics/data-storage/shared-preferences.html –

+0

resource.updateConfiguration已棄用。現在什麼是替代? –

3

你需要刷新你的活動來加載資源,它不會改變方向。試試這個

private void restartActivity() { 
Intent intent = getIntent(); 
finish(); 
startActivity(intent); 
} 
2

最好的辦法是把所有的TextView.setText()放在一個方法中。在您的onResume();中調用該方法以首次設置它。然後在重置語言時回想一下這種方法。 (活動進入低谷的onStart()onResume()當你改變方向等)

+0

它不只是關於字符串...有時方向也很重要,RTL或LTR –

+0

良好的調用,這似乎是一個很好的方式來處理它:http://stackoverflow.com/questions/10964488/how-to - 從右到左 – Flummox

+0

實際挖掘更多一點,找到正確的解決方案,並把它放在一個要點:https://gist.github.com/muhammad-naderi/ 0ff264e6cc07df904bc88a9f7efbe57d –

-4

如何在Android應用程序中以編程方式更改語言?

構建支持多種語言的Android應用示例。我發現它從here

1

如果你還沒有解決你的問題,你可以試試這個。它適用於我,希望它能幫助你。您可以在將來參考

mSwitch = (Switch) findViewById(R.id.language_switch); 

    mSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1) 
     @Override 
     public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { 
       if (isChecked){ 
        mSwitch.setTextColor(Color.GRAY); 
        String languageToLoad = "es"; 
        Locale locale = new Locale(languageToLoad); 
        Locale.setDefault(locale); 
        Configuration configuration = new Configuration(); 
        configuration.setLocale(locale); 
        Toast.makeText(getApplicationContext(), "spanish is set", Toast.LENGTH_SHORT).show(); 
        getBaseContext().getResources().updateConfiguration(configuration, getBaseContext().getResources().getDisplayMetrics()); 
       } else { 
        String languageToLoad = "en"; 
        Locale locale = new Locale(languageToLoad); 
        Locale.setDefault(locale); 
        Configuration configuration = new Configuration(); 
        configuration.setLocale(locale); 
        Toast.makeText(getApplicationContext(), "english is set", Toast.LENGTH_SHORT).show(); 
        getBaseContext().getResources().updateConfiguration(configuration, getBaseContext().getResources().getDisplayMetrics()); 
       } 
     } 
    }); 
相關問題