Android實(shí)現(xiàn)app應(yīng)用多語(yǔ)言切換功能
最近在做一個(gè)多語(yǔ)言切換的功能,類(lèi)似于微信的語(yǔ)言切換,搜了下資料基本上都是以下這種:
1. 實(shí)現(xiàn)的效果
和微信類(lèi)似,在設(shè)置界面打開(kāi)切換語(yǔ)言的界面,選擇語(yǔ)言后重啟 HomeActivity,語(yǔ)言切換完成,下次重新打開(kāi) App ,也是用戶(hù)設(shè)置的語(yǔ)言。
2. 實(shí)現(xiàn)步驟
1). 添加多語(yǔ)言文件
在不同的 value 文件夾下(例如 value 、value-en、values-zh-rTW 文件夾)添加不同語(yǔ)言的 string.xml 文件,我們的項(xiàng)目添加了英文、簡(jiǎn)體中文、繁體中文三種語(yǔ)言,如下圖所示:
其中英文需要翻譯,繁體如果沒(méi)有專(zhuān)門(mén)翻譯的話,可以找個(gè)簡(jiǎn)繁轉(zhuǎn)換網(wǎng)站,直接將簡(jiǎn)體中文轉(zhuǎn)成繁體中文,我用的這個(gè)網(wǎng)站:在線中文簡(jiǎn)體轉(zhuǎn)繁體。
2). 更新 Configuration 中的 locale 屬性
參照 Android 開(kāi)發(fā)者官網(wǎng) 上 的描述,Configuration 包含了設(shè)備的所有的配置信息,這些配置信息會(huì)影響應(yīng)用獲取的資源。例如 string 資源,就是根據(jù) Configuration 的 locale 屬性來(lái)判斷該取哪種語(yǔ)言的 string 資源,默認(rèn)是 value 文件夾下的。
主要代碼如下:
Resources resources = getContext().getResources(); DisplayMetrics dm = resources.getDisplayMetrics(); Configuration config = resources.getConfiguration(); // 應(yīng)用用戶(hù)選擇語(yǔ)言 config.locale = Locale.ENGLISH; resources.updateConfiguration(config, dm);
我們用了 Locale 中的預(yù)設(shè)值 Locale.ENGLISH、Locale.TRADITIONAL_CHINESE和 Locale.SIMPLIFIED_CHINESE,如果你需要設(shè)置的語(yǔ)言沒(méi)有預(yù)設(shè)值,你可以自己新建一個(gè) Locale 對(duì)象,具體自行 Google 吧。
注:跟隨系統(tǒng)設(shè)置是 Locale.getDefault()
3). 重啟 HomeActivity
我 們的 App 有個(gè)啟動(dòng)頁(yè) WelcomeActivity,類(lèi)似微信那個(gè)小人啟動(dòng)頁(yè),如果從歡迎頁(yè)重啟,并不是一個(gè)好的體驗(yàn),應(yīng)該和微信的語(yǔ)言設(shè)置一樣,直接回到 HomeActivity ,而不是從 WelcomeActivity 重新打開(kāi)。實(shí)現(xiàn)其實(shí)也很簡(jiǎn)單,代碼如下:
Intent intent = new Intent(this, HomeActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); getActivity().startActivity(intent);
正常來(lái)說(shuō)這段代碼應(yīng)該是沒(méi)問(wèn)題的,但是假如你的 App 存在某個(gè) activity 和當(dāng)前設(shè)置頁(yè) activity 不在一個(gè) task 棧內(nèi)的話(比如你從某個(gè)通知頁(yè)用 FLAG_ACTIVITY_NEW_TASK 啟動(dòng)的一個(gè) activity),就不會(huì)應(yīng)用語(yǔ)言設(shè)置。因此可以直接殺掉當(dāng)前 App 的進(jìn)程,保證是“整個(gè)”重啟了:
Intent intent = new Intent(this, HomeActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); // 殺掉進(jìn)程 android.os.Process.killProcess(android.os.Process.myPid()); System.exit(0);
按道理殺掉進(jìn)程的兩行代碼任意一行即可,但是查閱相關(guān)資料,還是兩個(gè)都加上吧,如果有詳細(xì)了解歡迎溝通。此段代碼其實(shí)參考自 CustomActivityOnCrash 開(kāi)源項(xiàng)目,有興趣的可以研究下這個(gè)開(kāi)源庫(kù)捕捉崩潰信息,重啟應(yīng)用部分的代碼。
個(gè)人覺(jué)得這種重啟HomeActivity的方法太粗暴了而且體驗(yàn)不好,不過(guò)貌似微信也是這么重啟了HomeActivity。一般語(yǔ)言切換的設(shè)置會(huì)藏的比較深,比如微信,如果一個(gè)用戶(hù)對(duì)手機(jī)操作不熟或者說(shuō)對(duì)這個(gè)應(yīng)用不熟,不小心切換了不知道什么語(yǔ)言然后給我跳回主頁(yè),再想設(shè)回中文就麻煩咯。所以,我認(rèn)為最好是切完語(yǔ)言立即刷新然后還是停留當(dāng)前頁(yè)比較好。具體實(shí)現(xiàn)如下:
1、還是要添加多語(yǔ)言文件,跟上面的步驟1一樣;
2、在BaseActivity中實(shí)現(xiàn)語(yǔ)言切換代碼:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); EventBus.getDefault().register(this); changeAppLanguage(); }
public void changeAppLanguage() { String sta = Store.getLanuageIsChinese() ? "zh" : "en";//這是SharedPreferences工具類(lèi),用于保存設(shè)置,代碼很簡(jiǎn)單,自己實(shí)現(xiàn)吧 // 本地語(yǔ)言設(shè)置 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、設(shè)置界面中的實(shí)現(xiàn)自然就是更新sharedPreferences 中的設(shè)置,然后發(fā)送EventBus就行啦
if () {//中文 Store.setLanuageIsChinese(true); } else if () {//英文 Store.setLanuageIsChinese(false); } EventBus.getDefault().post(Constant.EVENT_REFRESH_LANGUAGE);
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android app應(yīng)用多語(yǔ)言切換功能實(shí)現(xiàn)
- android動(dòng)態(tài)設(shè)置app當(dāng)前運(yùn)行語(yǔ)言的方法
- 詳解Android更改APP語(yǔ)言模式的實(shí)現(xiàn)過(guò)程
- android 使用kotlin 實(shí)現(xiàn)點(diǎn)擊更換全局語(yǔ)言(中日英切換)
- Android 7.0以上版本實(shí)現(xiàn)應(yīng)用內(nèi)語(yǔ)言切換的方法
- Android 系統(tǒng)語(yǔ)言切換監(jiān)聽(tīng)和設(shè)置實(shí)例代碼
- Android實(shí)現(xiàn)應(yīng)用內(nèi)置語(yǔ)言切換功能
- Android實(shí)現(xiàn)系統(tǒng)語(yǔ)言切換功能
- Android App中進(jìn)行語(yǔ)言的切換
相關(guān)文章
Android編程實(shí)現(xiàn)TextView垂直自動(dòng)滾動(dòng)功能【附demo源碼下載】
這篇文章主要介紹了Android編程實(shí)現(xiàn)TextView垂直自動(dòng)滾動(dòng)功能,詳細(xì)分析了Android TextView垂直自動(dòng)滾動(dòng)功能的實(shí)現(xiàn)步驟與布局、功能相關(guān)技巧,并附帶了demo源碼供讀者下載,需要的朋友可以參考下2017-02-02android中RecycleView添加下滑到底部的監(jiān)聽(tīng)示例
本篇文章主要介紹了android中RecycleView添加下滑到底部的監(jiān)聽(tīng)示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-03-03Android Flutter制作交錯(cuò)動(dòng)畫(huà)的示例代碼
這篇文章我們將用Flutter實(shí)現(xiàn)一個(gè)交錯(cuò)動(dòng)畫(huà)的應(yīng)用實(shí)例,我們讓輪子在草地滾動(dòng)著前進(jìn),而且還能粘上“綠色的草”,感興趣的可以動(dòng)手嘗試一下2022-06-06Android判斷11位手機(jī)號(hào)碼的方法(正則表達(dá)式)
項(xiàng)目里頭需要做一個(gè)判斷用戶(hù)輸入的號(hào)碼是否是正確的手機(jī)號(hào)碼,正確的手機(jī)號(hào)碼應(yīng)該是11位的,這里我們需要用一個(gè)正則表達(dá)式來(lái)進(jìn)行判斷,下面我把寫(xiě)法分享給大家2016-12-12Material Design系列之自定義Behavior支持所有View
這篇文章主要為大家詳細(xì)介紹了Material Design系列之自定義Behavior支持所有View,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09Android 中ContentProvider的實(shí)例詳解
這篇文章主要介紹了Android 中ContentProvider的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文大家能掌握這部分內(nèi)容,需要的朋友可以參考下2017-09-09Android實(shí)現(xiàn)時(shí)間倒計(jì)時(shí)功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)時(shí)間倒計(jì)時(shí)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10Android實(shí)現(xiàn)點(diǎn)擊切換視圖并跳轉(zhuǎn)傳值
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)點(diǎn)擊切換視圖并跳轉(zhuǎn)傳值,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01