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

來源:互聯網
上載者:User

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

1. 實現的效果

 

和微信類似,在設定介面開啟切換語言的介面,選擇語言後重啟 HomeActivity,語言切換完成,下次重新開啟 App ,也是使用者佈建的語言。 

2. 實現步驟
 1). 添加多語言檔案 
在不同的 value 檔案夾下(例如 value 、value-en、values-zh-rTW 檔案夾)添加不同語言的 string.xml 檔案,我們的項目添加了英文、簡體中文、繁體中文三種語言,如下圖所示:

 

其中英文需要翻譯,繁體如果沒有專門翻譯的話,可以找個簡繁轉換網站,直接將簡體中文轉成繁體中文,我用的這個網站:線上中文簡體轉繁體。 

2). 更新 Configuration 中的 locale 屬性 
參照 Android 開發人員官網 上 的描述,Configuration 包含了裝置的所有的配置資訊,這些配置資訊會影響應用擷取的資源。例如 string 資源,就是根據 Configuration 的 locale 屬性來判斷該取哪種語言的 string 資源,預設是 value 檔案夾下的。 

主要代碼如下:

Resources resources = getContext().getResources();DisplayMetrics dm = resources.getDisplayMetrics();Configuration config = resources.getConfiguration(); // 應用使用者選擇語言 config.locale = Locale.ENGLISH; resources.updateConfiguration(config, dm); 

我們用了 Locale 中的預設值 Locale.ENGLISH、Locale.TRADITIONAL_CHINESE和 Locale.SIMPLIFIED_CHINESE,如果你需要設定的語言沒有預設值,你可以自己建立一個 Locale 對象,具體自行 Google 吧。 

註:跟隨系統設定是 Locale.getDefault() 

3). 重啟 HomeActivity
 我 們的 App 有個啟動頁 WelcomeActivity,類似微信那個小人啟動頁,如果從歡迎頁面重啟,並不是一個好的體驗,應該和微信的語言設定一樣,直接回到 HomeActivity ,而不是從 WelcomeActivity 重新開啟。實現其實也很簡單,代碼如下: 

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

正常來說這段代碼應該是沒問題的,但是假如你的 App 存在某個 activity 和當前設定頁 activity 不在一個 task 棧內的話(比如你從某個通知頁用 FLAG_ACTIVITY_NEW_TASK 啟動的一個 activity),就不會應用語言設定。因此可以直接殺掉當前 App 的進程,保證是“整個”重啟了: 

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

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

個人覺得這種重啟HomeActivity的方法太粗暴了而且體驗不好,不過貌似微信也是這麼重啟了HomeActivity。一般語言切換的設定會藏的比較深,比如微信,如果一個使用者對手機操作不熟或者說對這個應用不熟,不小心切換了不知道什麼語言然後給我跳回首頁,再想設回中文就麻煩咯。所以,我認為最好是切完語言立即重新整理然後還是停留當前頁比較好。具體實現如下: 
1、還是要添加多語言檔案,跟上面的步驟1一樣;
2、在BaseActivity中實現語言切換代碼: 

@Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    EventBus.getDefault().register(this);    changeAppLanguage();  } 
public void changeAppLanguage() {     String sta = Store.getLanuageIsChinese() ? "zh" : "en";//這是SharedPreferences工具類,用於儲存設定,代碼很簡單,自己實現吧     // 本地語言設定     Locale myLocale = new Locale(sta);     Resources res = getResources();     DisplayMetrics dm = res.getDisplayMetrics();     Configuration conf = res.getConfiguration();     conf.locale = myLocale;     res.updateConfiguration(conf, dm);   } 
 public void onEvent(String str) {     switch (str) {       case Constant.EVENT_REFRESH_LANGUAGE:         changeAppLanguage();         recreate();//重新整理介面         break;    }  } 
 @Override   protected void onDestroy() {    super.onDestroy();     EventBus.getDefault().unregister(this);  } 

3、設定介面中的實現自然就是更新sharedPreferences 中的設定,然後發送EventBus就行啦     

 if () {//中文       Store.setLanuageIsChinese(true);     } else if () {//英文       Store.setLanuageIsChinese(false);     }     EventBus.getDefault().post(Constant.EVENT_REFRESH_LANGUAGE);

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.