1. 程式人生 > >Android 多語言適配

Android 多語言適配

應用程式根據系統設定語言實現多語言適配

應用程式預設只要配置不同語言的檔案,在啟動應用時都會根據系統語言而載入對應的語言資原始檔。例如支付寶,微信,微博等都實現了中英文的適配。下面的例子我們將實現中文的適配。

  • 建立相應語言的檔案
    右鍵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);

    }

}


全棧開發者微信公眾號