Android 多語言適配
阿新 • • 發佈:2019-02-15
應用程式根據系統設定語言實現多語言適配
應用程式預設只要配置不同語言的檔案,在啟動應用時都會根據系統語言而載入對應的語言資原始檔。例如支付寶,微信,微博等都實現了中英文的適配。下面的例子我們將實現中文的適配。
建立相應語言的檔案
右鍵res資料夾File–>New–>Android resource file選擇Locale看到如下介面:
我們選擇新增的語言為中文,將檔名設為strings點選確定後可以看到生成如下目錄及檔案(新增了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">語言測試</string>
<string name="hello_world">你好,世界!</string >
</resources>
此時執行專案,當系統語言設定為中文時顯示如下:
系統語言設定為中文之外的其他語言顯示如下:
注意:當應用程式沒有退出,進入系統修改了語言設定。再次進入時應用會重新載入。類似於橫豎屏切換時的應用生命週期。
應用內實現語言設定
實現效果
應用內有一個設定按鈕,點選設定時彈出dialog提示語言選擇。使用者選擇完成後,重啟應用並按使用者設定載入對應的語言。
點選設定按鈕出現如下介面:
應用內實現語言的設定需要開發者在程式碼中實現,而不跟隨系統語言變化而改變。像微信在程式內就有語言設定,下面程式碼實現的效果和微信類似。語言設定完成後重啟應用,重新載入不同的語言。同時,我們將設定的語言型別儲存起來,下次啟動應用先讀取設定的語言,而不跟隨系統的設定語言,然後再載入應用。
- 具體實現程式碼如下:
public class MainActivity extends AppCompatActivity {
ImageButton btn_settings;
AlertDialog dialog;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//讀取SharedPreferences資料,初始化語言設定
setLanguage();
getSupportActionBar().hide();
setContentView(R.layout.activity_main);
btn_settings = (ImageButton) findViewById(R.id.btn_settings);
//點選設定按鈕進入語言設定
btn_settings.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
//建立單選框
final AlertDialog.Builder builder = new
AlertDialog.Builder(MainActivity.this);
builder.setSingleChoiceItems(new String[]{"Auto", "簡體中文"},
getSharedPreferences("language", Context.MODE_PRIVATE).getInt("language",0),
new DialogInterface.OnClickListener() {
//點選單選框某一項以後
public void onClick(DialogInterface dialogInterface, int i) {
//將選中項存入SharedPreferences,以便重啟應用後讀取設定
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);
/* 重新在新的任務棧開啟新應用
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資料,預設選中第一項
SharedPreferences preferences = getSharedPreferences("language", Context.MODE_PRIVATE);
int language = preferences.getInt("language", 0);
//根據讀取到的資料,進行設定
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);
}
}
全棧開發者微信公眾號