1. 程式人生 > >Android國際化問題以及在應用內切換不同語言設定

Android國際化問題以及在應用內切換不同語言設定

一年又一年,16年過去了,17年馬上到來。。。跑偏了,寫博文了

在專案中要做國際化適配,為了更好的切換語言,需要在應用中新增語言切換功能,就像微信那樣

基本適配

先說說國際化適配,其實很簡單,就是將專案中用到的字串資源放在strings.xml資原始檔中,在佈局檔案中通過@string/strName使用,在程式碼中通過

getResources().getString(R.string.strName)引用,將要適配的 語言在資原始檔中建立對應的strings.xml資源中就OK了,當你在Android系統中切換語言時,你的應用語言就會跟著改變,至於每個國家語言的標識和檔案件建立如下:

Arabic, Egypt (ar_EG) -----------------------------阿拉伯語,埃及
Arabic, Israel (ar_IL) -------------------------------阿拉伯語,以色列
Bulgarian, Bulgaria (bg_BG) ---------------------保加利亞語,保加利亞
Catalan, Spain (ca_ES) ---------------------------加泰隆語,西班牙
Czech, Czech Republic (cs_CZ) -----------------捷克語,捷克共和國
Danish, Denmark(da_DK) ------------------------丹麥語,丹麥
German, Austria (de_AT) -------------------------德語,奧地利
German, Switzerland (de_CH) -------------------德語,瑞士
German, Germany (de_DE) ----------------------德語,德國
German, Liechtenstein (de_LI) ------------------德語,列支敦斯登的
Greek, Greece (el_GR) ----------------------------希臘語,希臘
English, Australia (en_AU) -------------------------英語,澳大利亞
English, Canada (en_CA) --------------------------英語,加拿大
English, Britain (en_GB) ----------------------------英語,英國
English, Ireland (en_IE) -----------------------------英語,愛爾蘭
English, India (en_IN) --------------------------------英語,印度
English, New Zealand (en_NZ) ---------------------英語,紐西蘭
English, Singapore(en_SG) --------------------------英語,新加坡
English, US (en_US) -----------------------------------英語,美國
English, Zimbabwe (en_ZA) --------------------------英語,辛巴威
Spanish (es_ES) ----------------------------------------西班牙
Spanish, US (es_US) -----------------------------------西班牙語,美國
Finnish, Finland (fi_FI) ---------------------------------芬蘭語,芬蘭
French, Belgium (fr_BE) -------------------------------法語,比利時
French, Canada (fr_CA) -------------------------------法語,加拿大
French, Switzerland (fr_CH) --------------------------法語,瑞士
French, France (fr_FR) --------------------------------法語,法國
Hebrew, Israel (he_IL) ---------------------------------希伯來語,以色列
Hindi, India (hi_IN) -------------------------------------印地語,印度
Croatian, Croatia (hr_HR) ----------------------------克羅埃西亞語,克羅埃西亞
Hungarian, Hungary (hu_HU) ------------------------匈牙利語,匈牙利
Indonesian, Indonesia (id_ID) ------------------------印尼語,印尼
Italian, Switzerland (it_CH) ----------------------------義大利語,瑞士
Italian, Italy (it_IT) ---------------------------------------義大利語,義大利
Japanese (ja_JP) ----------------------------------------日語
Korean (ko_KR) ------------------------------------------朝鮮語
Lithuanian, Lithuania (lt_LT) --------------------------立陶宛語,立陶宛
Latvian, Latvia (lv_LV) ---------------------------------拉托維亞語,拉托維亞
Norwegian-Bokmol, Norway(nb_NO) ---------------挪威語,挪威
Dutch, Belgium (nl_BE) --------------------------------荷蘭語,比利時
Dutch, Netherlands (nl_NL) ---------------------------荷蘭語,荷蘭
Polish (pl_PL) -------------------------------------------波蘭
Portuguese, Brazil (pt_BR) ---------------------------葡萄牙語,巴西
Portuguese, Portugal (pt_PT) ------------------------葡萄牙語,葡萄牙
Romanian, Romania (ro_RO) ------------------------羅馬尼亞語,羅馬尼亞
Russian (ru_RU) ----------------------------------------俄語
Slovak, Slovakia (sk_SK) ------------------------------斯洛伐克語,斯洛伐克
Slovenian, Slovenia (sl_SI) ---------------------------斯洛維尼亞語,斯洛維尼亞
Serbian (sr_RS) ----------------------------------------塞爾維亞語
Swedish, Sweden (sv_SE) ----------------------------瑞典語,瑞典
Thai, Thailand (th_TH) --------------------------------泰語,泰國
Tagalog, Philippines (tl_PH) --------------------------菲律賓語,菲律賓
Turkish, Turkey (tr_TR) -------------------------------土耳其語,土耳其
Ukrainian, Ukraine (uk_UA) --------------------------聯合王國
Vietnamese, Vietnam (vi_VN) -----------------------越南語,越南
Chinese, PRC (zh_CN)--------------------------------中文,中國
Chinese, Taiwan (zh_TW)-----------------------------中文,臺灣 

建立資料夾
values-zh   ---------------中文

values        ----------------預設英文

values-fr   ----------------法語      

專案中表現如下:


在應用中設定語言切換

要想實現像微信那樣在應用實現語言切換,就不能是簡單的配置資原始檔了,下面看看如何來做

在Android 系統中有這樣一個Configuration類用來配置系統,它裡面可以配置許多資訊,有關螢幕的方向,導航型別,觸屏方式,系統字型大小及顏色,還有就是今天要說的語言配置。Configuration物件中有一個local屬性用來設定語言。但是有一個問題就是在改變系統配置之後都要通過重啟Activity才能生效。那麼就像微信一樣,當改變語言配置之後,把所有沒有Destroy的Activity全部銷燬,跳轉到MainActivity重新啟動。這樣就可以改變應用內的語言。這樣做了之後你會發現當下次進入應用後還是沒有改變,這就需要我們把設定的語言來儲存一下,當下次再進來的時候就設定語言。下面是程式碼

改變語言的方法:

protected void switchLanguage(String language) {
        //獲取資源
        Resources resources = getResources();
        //通過資源獲取系統配置物件
        Configuration config = resources.getConfiguration();
        DisplayMetrics dm = resources.getDisplayMetrics();
        if (language.equals("en")) {//英文
            config.locale = Locale.ENGLISH;
        } else {//漢語
            config.locale = Locale.SIMPLIFIED_CHINESE;
        }
        resources.updateConfiguration(config, dm);
        //儲存設定語言的型別
        sharedPreferences.edit().putString("language",language).commit();
}
在MainActivity的onCreate中呼叫此方法,將上次設定的語言傳入,以保證下次進入還是上次設定的語言
public class MainActivity extends AppCompatActivity {
    SharedPreferences sharedPreferences;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        sharedPreferences = getSharedPreferences("config", Context.MODE_PRIVATE);
        switchLanguage(sharedPreferences.getString("language", "zh"));
        setContentView(R.layout.activity_main);   
    }
} 
設定語言的方法
    int temp;
    private void setLanguage() {
        AlertDialog.Builder builder = new AlertDialog.Builder(SystemSetActivity.this);
        builder.setTitle(getResourceString(R.string.PleaseSetLanguage));
        final String[] languages = {"中文(簡體)", "English(United Kingdom)"};
        String lan = manager.getString(Constant.LANGUAGE, "zh");
        int curr = 0;
        if ("zh".equals(lan)) {
            curr = 0;
        } else {
            curr = 1;
        }
        builder.setSingleChoiceItems(languages, curr, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                switch (which) {
                    case 0:
                        temp = 0;
                        break;
                    case 1:
                        temp = 1;
                        break;
                }
            }
        });
        builder.setPositiveButton(getResourceString(R.string.Confirm), new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                switch (temp) {
                    case 0:
                        switchLanguage("zh");
                        break;
                    case 1:
                        switchLanguage("en");
                        break;
                }
                setResult(1);
                finish();
                //銷燬當前的Activity跳轉到MainActivity,重新開啟Activity
                Intent it = new Intent(SystemSetActivity.this, MainActivity.class);
                startActivity(it);
            }
        });
        builder.setNegativeButton(getResourceString(R.string.Cancel), new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

            }
        });
        builder.show();
    }
這樣就OK了