Android app應用多語言切換功能實現

最近在作一個多語言切換的功能,相似於微信的語言切換,搜了下資料基本上都是如下這種:html

 

1. 實現的效果

和微信相似,在設置界面打開切換語言的界面,選擇語言後重啓 HomeActivity,語言切換完成,下次從新打開 App ,也是用戶設置的語言。android

2. 實現步驟

1. 添加多語言文件

在不一樣的 value 文件夾下(例如 value 、value-en、values-zh-rTW 文件夾)添加不一樣語言的 string.xml 文件,咱們的項目添加了英文、簡體中文、繁體中文三種語言,以下圖所示:git

其中英文須要翻譯,繁體若是沒有專門翻譯的話,能夠找個簡繁轉換網站,直接將簡體中文轉成繁體中文,我用的這個網站:在線中文簡體轉繁體github

2. 更新 Configuration 中的 locale 屬性

參照 Android 開發者官網 上 的描述,Configuration 包含了設備的全部的配置信息,這些配置信息會影響應用獲取的資源。例如 string 資源,就是根據 Configuration 的 locale 屬性來判斷該取哪一種語言的 string 資源,默認是 value 文件夾下的。微信

主要代碼以下:ide

 

1 Resources resources = getContext().getResources();
2 DisplayMetrics dm = resources.getDisplayMetrics();
3 Configuration config = resources.getConfiguration();
4 // 應用用戶選擇語言
5 config.locale = Locale.ENGLISH;
6 resources.updateConfiguration(config, dm);

 

咱們用了 Locale 中的預設值 Locale.ENGLISHLocale.TRADITIONAL_CHINESE和 Locale.SIMPLIFIED_CHINESE,若是你須要設置的語言沒有預設值,你能夠本身新建一個 Locale 對象,具體自行 Google 吧。工具

注:跟隨系統設置是 Locale.getDefault()post

3. 重啓 HomeActivity

我 們的 App 有個啓動頁 WelcomeActivity,相似微信那個小人啓動頁,若是從歡迎頁重啓,並非一個好的體驗,應該和微信的語言設置同樣,直接回到 HomeActivity ,而不是從 WelcomeActivity 從新打開。實現其實也很簡單,代碼以下:網站

 
 
 
 
1 Intent intent = new Intent(this, HomeActivity.class);
2 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
3 getActivity().startActivity(intent);

 

 

正常來講這段代碼應該是沒問題的,可是假如你的 App 存在某個 activity 和當前設置頁 activity 不在一個 task 棧內的話(好比你從某個通知頁用 FLAG_ACTIVITY_NEW_TASK 啓動的一個 activity),就不會應用語言設置。所以能夠直接殺掉當前 App 的進程,保證是「整個」重啓了:this

 
 
1 Intent intent = new Intent(this, HomeActivity.class);
2 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
3 startActivity(intent);
4 // 殺掉進程
5 android.os.Process.killProcess(android.os.Process.myPid());
6 System.exit(0);
 
 
 

按道理殺掉進程的兩行代碼任意一行便可,可是查閱相關資料,仍是兩個都加上吧,若是有詳細瞭解歡迎溝通。此段代碼其實參考自 CustomActivityOnCrash 開源項目,有興趣的能夠研究下這個開源庫捕捉崩潰信息,重啓應用部分的代碼。

 

 

我的以爲這種重啓HomeActivity的方法太粗暴了並且體驗很差,不過貌似微信也是這麼重啓了HomeActivity。通常語言切換的設置會藏的比較深,好比微信,若是一個用戶對手機操做不熟或者說對這個應用不熟,不當心切換了不知道什麼語言而後給我跳回主頁,再想設回中文就麻煩咯。因此,我認爲最好是切完語言當即刷新而後仍是停留當前頁比較好。具體實現以下:

 

一、仍是要添加多語言文件,跟上面的步驟1同樣;

 

二、在BaseActivity中實現語言切換代碼:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EventBus.getDefault().register(this);
        changeAppLanguage();
    }
 1 public void changeAppLanguage() {
 2         String sta = Store.getLanuageIsChinese() ? "zh" : "en";//這是SharedPreferences工具類,用於保存設置,代碼很簡單,本身實現吧
 3         // 本地語言設置
 4         Locale myLocale = new Locale(sta);
 5         Resources res = getResources();
 6         DisplayMetrics dm = res.getDisplayMetrics();
 7         Configuration conf = res.getConfiguration();
 8         conf.locale = myLocale;
 9         res.updateConfiguration(conf, dm);
10     }
1 public void onEvent(String str) {
2         switch (str) {
3             case Constant.EVENT_REFRESH_LANGUAGE:
4                 changeAppLanguage();
5                 recreate();//刷新界面
6                 break;
7         }
8     }
1 @Override
2     protected void onDestroy() {
3         super.onDestroy();
4         EventBus.getDefault().unregister(this);
5     }

 

三、設置界面中的實現天然就是更新sharedPreferences 中的設置,而後發送EventBus就行啦

1        if () {//中文
2             Store.setLanuageIsChinese(true);
3         } else if () {//英文
4             Store.setLanuageIsChinese(false);
5         }
6         EventBus.getDefault().post(Constant.EVENT_REFRESH_LANGUAGE);

基本思路就是這樣,若是還有什麼更好的方法,敬請給俺留言,讓我膜拜一下。

 

--------------------------------優雅的分割線------------------------------------------------------------------

因爲功能比較簡單因此當初並無放源碼,可是比較多的人給我留言要源碼,因此特呈上源碼:https://github.com/popqq520/Language_Demo

相關文章
相關標籤/搜索