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了