應(yīng)用程序根據(jù)系統(tǒng)設(shè)置語(yǔ)言實(shí)現(xiàn)多語(yǔ)言適配
應(yīng)用程序默認(rèn)只要配置不同語(yǔ)言的文件咬像,在啟動(dòng)應(yīng)用時(shí)都會(huì)根據(jù)系統(tǒng)語(yǔ)言而加載對(duì)應(yīng)的語(yǔ)言資源文件算撮。例如支付寶,微信县昂,微博等都實(shí)現(xiàn)了中英文的適配肮柜。下面的例子我們將實(shí)現(xiàn)中文的適配。
-
創(chuàng)建相應(yīng)語(yǔ)言的文件
右鍵res文件夾File-->New-->Android resource file選擇Locale看到如下界面:
我們選擇新增的語(yǔ)言為中文倒彰,將文件名設(shè)為strings
點(diǎn)擊確定后可以看到生成如下目錄及文件(新增了values-zh文件夾和strings.xml文件):
values\strings.xml中代碼如下:
<resources>
<string name="app_name">LanguagesTest</string>
<string name="hello_world">Hello World!</string>
</resources>
- 修改values-zh\strings.xml中代碼如下:
<resources>
<string name="app_name">語(yǔ)言測(cè)試</string>
<string name="hello_world">你好审洞,世界!</string>
</resources>
-
此時(shí)運(yùn)行項(xiàng)目待讳,當(dāng)系統(tǒng)語(yǔ)言設(shè)置為中文時(shí)顯示如下:
-
系統(tǒng)語(yǔ)言設(shè)置為中文之外的其他語(yǔ)言顯示如下:
注意:當(dāng)應(yīng)用程序沒(méi)有退出芒澜,進(jìn)入系統(tǒng)修改了語(yǔ)言設(shè)置。再次進(jìn)入時(shí)應(yīng)用會(huì)重新載入创淡。類似于橫豎屏切換時(shí)的應(yīng)用生命周期痴晦。
應(yīng)用內(nèi)實(shí)現(xiàn)語(yǔ)言設(shè)置
- 實(shí)現(xiàn)效果
應(yīng)用內(nèi)有一個(gè)設(shè)置按鈕,點(diǎn)擊設(shè)置時(shí)彈出dialog提示語(yǔ)言選擇琳彩。用戶選擇完成后誊酌,重啟應(yīng)用并按用戶設(shè)置加載對(duì)應(yīng)的語(yǔ)言。
點(diǎn)擊設(shè)置按鈕出現(xiàn)如下界面:
應(yīng)用內(nèi)實(shí)現(xiàn)語(yǔ)言的設(shè)置需要開(kāi)發(fā)者在代碼中實(shí)現(xiàn)露乏,而不跟隨系統(tǒng)語(yǔ)言變化而改變碧浊。像微信在程序內(nèi)就有語(yǔ)言設(shè)置,下面代碼實(shí)現(xiàn)的效果和微信類似瘟仿。語(yǔ)言設(shè)置完成后重啟應(yīng)用辉词,重新加載不同的語(yǔ)言。同時(shí)猾骡,我們將設(shè)置的語(yǔ)言類型存儲(chǔ)起來(lái)瑞躺,下次啟動(dòng)應(yīng)用先讀取設(shè)置的語(yǔ)言,而不跟隨系統(tǒng)的設(shè)置語(yǔ)言兴想,然后再加載應(yīng)用幢哨。
- 具體實(shí)現(xiàn)代碼如下:
public class MainActivity extends AppCompatActivity {
ImageButton btn_settings;
AlertDialog dialog;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//讀取SharedPreferences數(shù)據(jù),初始化語(yǔ)言設(shè)置
setLanguage();
getSupportActionBar().hide();
setContentView(R.layout.activity_main);
btn_settings = (ImageButton) findViewById(R.id.btn_settings);
//點(diǎn)擊設(shè)置按鈕進(jìn)入語(yǔ)言設(shè)置
btn_settings.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
//創(chuàng)建單選框
final AlertDialog.Builder builder = new
AlertDialog.Builder(MainActivity.this);
builder.setSingleChoiceItems(new String[]{"Auto", "簡(jiǎn)體中文"},
getSharedPreferences("language", Context.MODE_PRIVATE).getInt("language",0),
new DialogInterface.OnClickListener() {
//點(diǎn)擊單選框某一項(xiàng)以后
public void onClick(DialogInterface dialogInterface, int i) {
//將選中項(xiàng)存入SharedPreferences嫂便,以便重啟應(yīng)用后讀取設(shè)置
SharedPreferences preferences = getSharedPreferences("language", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putInt("language",i);
editor.apply();
dialog.dismiss();
Intent intent = new Intent(MainActivity.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
/* 重新在新的任務(wù)棧開(kāi)啟新應(yīng)用
Intent intent = new Intent(MainActivity.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
android.os.Process.killProcess(android.os.Process.myPid()); */
}
});
dialog = builder.create();
dialog.show();
}
});
}
private void setLanguage() {
//讀取SharedPreferences數(shù)據(jù)捞镰,默認(rèn)選中第一項(xiàng)
SharedPreferences preferences = getSharedPreferences("language", Context.MODE_PRIVATE);
int language = preferences.getInt("language", 0);
//根據(jù)讀取到的數(shù)據(jù),進(jìn)行設(shè)置
Resources resources = getResources();
DisplayMetrics displayMetrics = resources.getDisplayMetrics();
Configuration configuration = resources.getConfiguration();
switch (language){
case 0:
configuration.setLocale(Locale.getDefault());
break;
case 1:
configuration.setLocale( Locale.CHINESE);
break;
default:
break;
}
resources.updateConfiguration(configuration,displayMetrics);
}
}