1:各国语言的string values 2:在功能清单文件中对要进行切换acitivity 进行配置 android:configChanges="locale"
1 public static void initLanguage(Context context) { 2 //应用内配置语言 3 Resources resources = context.getResources();//获得res资源对象 4 Configuration config = resources.getConfiguration();//获得设置对象 5 DisplayMetrics dm = resources.getDisplayMetrics();//获得屏幕参数:主要是分辨率,像素等。 6 if (SDKConfig.getLanguage().equals("zh")) { 7 config.locale = Locale.SIMPLIFIED_CHINESE; //简体中文 8 } else { 9 config.locale = new Locale("ar"); 10 } 11 resources.updateConfiguration(config, dm); 12 }
重启 Activity
我 们的 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 的进程,保证是“整个”重启了:
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、还是要添加多语言文件,跟上面的步骤1一样;
2、在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 }
3、设置界面中的实现自然就是更新sharedPreferences 中的设置,然后发送EventBus就行啦
if () { //中文 2 Store.setLanuageIsChinese(true); 3 } else if () { //英文 4 Store.setLanuageIsChinese(false); 5 } 6 EventBus.getDefault().post(Constant.EVENT_REFRESH_LANGUAGE);
各国语言缩写-各国语言简称 en 英文 en_US 英文 (美国) ar 阿拉伯文 ar_AE 阿拉伯文 (阿拉伯联合酋长国) ar_BH 阿拉伯文 (巴林) ar_DZ 阿拉伯文 (阿尔及利亚) ar_EG 阿拉伯文 (埃及) ar_IQ 阿拉伯文 (伊拉克) ar_JO 阿拉伯文 (约旦) ar_KW 阿拉伯文 (科威特) ar_LB 阿拉伯文 (黎巴嫩) ar_LY 阿拉伯文 (利比亚) ar_MA 阿拉伯文 (摩洛哥) ar_OM 阿拉伯文 (阿曼) ar_QA 阿拉伯文 (卡塔尔) ar_SA 阿拉伯文 (沙特阿拉伯) ar_SD 阿拉伯文 (苏丹) ar_SY 阿拉伯文 (叙利亚) ar_TN 阿拉伯文 (突尼斯) ar_YE 阿拉伯文 (也门) be 白俄罗斯文 be_BY 白俄罗斯文 (白俄罗斯) bg 保加利亚文 bg_BG 保加利亚文 (保加利亚) ca 加泰罗尼亚文 ca_ES 加泰罗尼亚文 (西班牙) ca_ES_EURO 加泰罗尼亚文 (西班牙,Euro) cs 捷克文 cs_CZ 捷克文 (捷克共和国) da 丹麦文 da_DK 丹麦文 (丹麦) de 德文 de_AT 德文 (奥地利) de_AT_EURO 德文 (奥地利,Euro) de_CH 德文 (瑞士) de_DE 德文 (德国) de_DE_EURO 德文 (德国,Euro) de_LU 德文 (卢森堡) de_LU_EURO 德文 (卢森堡,Euro) el 希腊文 el_GR 希腊文 (希腊) en_AU 英文 (澳大利亚) en_CA 英文 (加拿大) en_GB 英文 (英国) en_IE 英文 (爱尔兰) en_IE_EURO 英文 (爱尔兰,Euro) en_NZ 英文 (新西兰) en_ZA 英文 (南非) es 西班牙文 es_BO 西班牙文 (玻利维亚) es_AR 西班牙文 (阿根廷) es_CL 西班牙文 (智利) es_CO 西班牙文 (哥伦比亚) es_CR 西班牙文 (哥斯达黎加) es_DO 西班牙文 (多米尼加共和国) es_EC 西班牙文 (厄瓜多尔) es_ES 西班牙文 (西班牙) es_ES_EURO 西班牙文 (西班牙,Euro) es_GT 西班牙文 (危地马拉) es_HN 西班牙文 (洪都拉斯) es_MX 西班牙文 (墨西哥) es_NI 西班牙文 (尼加拉瓜) et 爱沙尼亚文 es_PA 西班牙文 (巴拿马) es_PE 西班牙文 (秘鲁) es_PR 西班牙文 (波多黎哥) es_PY 西班牙文 (巴拉圭) es_SV 西班牙文 (萨尔瓦多) es_UY 西班牙文 (乌拉圭) es_VE 西班牙文 (委内瑞拉) et_EE 爱沙尼亚文 (爱沙尼亚) fi 芬兰文 fi_FI 芬兰文 (芬兰) fi_FI_EURO 芬兰文 (芬兰,Euro) fr 法文 fr_BE 法文 (比利时) fr_BE_EURO 法文 (比利时,Euro) fr_CA 法文 (加拿大) fr_CH 法文 (瑞士) fr_FR 法文 (法国) fr_FR_EURO 法文 (法国,Euro) fr_LU 法文 (卢森堡) fr_LU_EURO 法文 (卢森堡,Euro) hr 克罗地亚文 hr_HR 克罗地亚文 (克罗地亚) hu 匈牙利文 hu_HU 匈牙利文 (匈牙利) is 冰岛文 is_IS 冰岛文 (冰岛) it 意大利文 it_CH 意大利文 (瑞士) it_IT 意大利文 (意大利) it_IT_EURO 意大利文 (意大利,Euro) iw 希伯来文 iw_IL 希伯来文 (以色列) ja 日文 ja_JP 日文 (日本) ko 朝鲜文 ko_KR 朝鲜文 (南朝鲜) lt 立陶宛文 lt_LT 立陶宛文 (立陶宛) lv 拉托维亚文(列托) lv_LV 拉托维亚文(列托) (拉脱维亚) mk 马其顿文 mk_MK 马其顿文 (马其顿王国) nl 荷兰文 nl_BE 荷兰文 (比利时) nl_BE_EURO 荷兰文 (比利时,Euro) nl_NL 荷兰文 (荷兰) nl_NL_EURO 荷兰文 (荷兰,Euro) no 挪威文 no_NO 挪威文 (挪威) no_NO_NY 挪威文 (挪威,Nynorsk) pl 波兰文 pl_PL 波兰文 (波兰) pt 葡萄牙文 pt_BR 葡萄牙文 (巴西) pt_PT 葡萄牙文 (葡萄牙) pt_PT_EURO 葡萄牙文 (葡萄牙,Euro) ro 罗马尼亚文 ro_RO 罗马尼亚文 (罗马尼亚) ru 俄文 ru_RU 俄文 (俄罗斯) sh 塞波尼斯-克罗地亚文 sh_YU 塞波尼斯-克罗地亚文 (南斯拉夫) sk 斯洛伐克文 sk_SK 斯洛伐克文 (斯洛伐克) sl 斯洛文尼亚文 sl_SI 斯洛文尼亚文 (斯洛文尼亚) sq 阿尔巴尼亚文 sq_AL 阿尔巴尼亚文 (阿尔巴尼亚) sr 塞尔维亚文 sr_YU 塞尔维亚文 (南斯拉夫) sv 瑞典文 sv_SE 瑞典文 (瑞典) th 泰文 th_TH 泰文 (泰国) tr 土耳其文 tr_TR 土耳其文 (土耳其) uk 乌克兰文 uk_UA 乌克兰文 (乌克兰) zh 中文 zh_CN 中文 (中国) zh_HK 中文 (香港) zh_TW 中文 (台湾) Countries and Regions 国家或地区 国际域名缩写 Angola 安哥拉 AO Afghanistan 阿富汗 AF Albania 阿尔巴尼亚 AL Algeria 阿尔及利亚 DZ Andorra 安道尔共和国 AD Anguilla 安圭拉岛 AI Antigua and Barbuda 安提瓜和巴布达 AG Argentina 阿根廷 AR Armenia 亚美尼亚 AM Ascension 阿森松 Australia 澳大利亚 AU Austria 奥地利 AT Azerbaijan 阿塞拜疆 AZ Bahamas 巴哈马 BS Bahrain 巴林 BH Bangladesh 孟加拉国 BD Barbados 巴巴多斯 BB Belarus 白俄罗斯 BY Belgium 比利时 BE Belize 伯利兹 BZ Benin 贝宁 BJ Bermuda Is. 百慕大群岛 BM Bolivia 玻利维亚 BO Botswana 博茨瓦纳 BW Brazil 巴西 BR Brunei 文莱 BN Bulgaria 保加利亚 BG Burkina-faso 布基纳法索 BF Burma 缅甸 MM Burundi 布隆迪 BI Cameroon 喀麦隆 CM Canada 加拿大 CA Cayman Is. 开曼群岛 Central African Republic 中非共和国 CF Chad 乍得 TD Chile 智利 CL China 中国 CN Colombia 哥伦比亚 CO Congo 刚果 CG Cook Is. 库克群岛 CK Costa Rica 哥斯达黎加 CR Cuba 古巴 CU Cyprus 塞浦路斯 CY Czech Republic 捷克 CZ Denmark 丹麦 DK Djibouti 吉布提 DJ Dominica Rep. 多米尼加共和国 DO Ecuador 厄瓜多尔 EC Egypt 埃及 EG EI Salvador 萨尔瓦多 SV Estonia 爱沙尼亚 EE Ethiopia 埃塞俄比亚 ET Fiji 斐济 FJ Finland 芬兰 FI France 法国 FR French Guiana 法属圭亚那 GF Gabon 加蓬 GA Gambia 冈比亚 GM Georgia 格鲁吉亚 GE Germany 德国 DE Ghana 加纳 GH Gibraltar 直布罗陀 GI Greece 希腊 GR Grenada 格林纳达 GD Guam 关岛 GU Guatemala 危地马拉 GT Guinea 几内亚 GN Guyana 圭亚那 GY Haiti 海地 HT Honduras 洪都拉斯 HN Hongkong 香港 HK Hungary 匈牙利 HU Iceland 冰岛 IS India 印度 IN Indonesia 印度尼西亚 ID Iran 伊朗 IR Iraq 伊拉克 IQ Ireland 爱尔兰 IE Israel 以色列 IL Italy 意大利 IT Ivory Coast 科特迪瓦 Jamaica 牙买加 JM Japan 日本 JP Jordan 约旦 JO Kampuchea (Cambodia ) 柬埔寨 KH Kazakstan 哈萨克斯坦 KZ Kenya 肯尼亚 KE Korea 韩国 KR Kuwait 科威特 KW Kyrgyzstan 吉尔吉斯坦 KG Laos 老挝 LA Latvia 拉脱维亚 LV Lebanon 黎巴嫩 LB Lesotho 莱索托 LS Liberia 利比里亚 LR Libya 利比亚 LY Liechtenstein 列支敦士登 LI Lithuania 立陶宛 LT Luxembourg 卢森堡 LU Macao 澳门 MO Madagascar 马达加斯加 MG Malawi 马拉维 MW Malaysia 马来西亚 MY Maldives 马尔代夫 MV Mali 马里 ML Malta 马耳他 MT Mariana Is 马里亚那群岛 Martinique 马提尼克 Mauritius 毛里求斯 MU Mexico 墨西哥 MX Moldova, Republic of 摩尔多瓦 MD Monaco 摩纳哥 MC Mongolia 蒙古 MN Montserrat Is 蒙特塞拉特岛 MS Morocco 摩洛哥 MA Mozambique 莫桑比克 MZ Namibia 纳米比亚 NA Nauru 瑙鲁 NR Nepal 尼泊尔 NP Netheriands Antilles 荷属安的列斯 Netherlands 荷兰 NL New Zealand 新西兰 NZ Nicaragua 尼加拉瓜 NI Niger 尼日尔 NE Nigeria 尼日利亚 NG North Korea 朝鲜 KP Norway 挪威 NO Oman 阿曼 OM Pakistan 巴基斯坦 PK Panama 巴拿马 PA Papua New Cuinea 巴布亚新几内亚 PG Paraguay 巴拉圭 PY Peru 秘鲁 PE Philippines 菲律宾 PH Poland 波兰 PL French Polynesia 法属玻利尼西亚 PF Portugal 葡萄牙 PT Puerto Rico 波多黎各 PR Qatar 卡塔尔 QA Reunion 留尼旺 Romania 罗马尼亚 RO Russia 俄罗斯 RU Saint Lueia 圣卢西亚 LC Saint Vincent 圣文森特岛 VC Samoa Eastern 东萨摩亚(美) Samoa Western 西萨摩亚 San Marino 圣马力诺 SM Sao Tome and Principe 圣多美和普林西比 ST Saudi Arabia 沙特阿拉伯 SA Senegal 塞内加尔 SN Seychelles 塞舌尔 SC Sierra Leone 塞拉利昂 SL Singapore 新加坡 SG Slovakia 斯洛伐克 SK Slovenia 斯洛文尼亚 SI Solomon Is 所罗门群岛 SB Somali 索马里 SO South Africa 南非 ZA Spain 西班牙 ES Sri Lanka 斯里兰卡 LK St.Lucia 圣卢西亚 LC St.Vincent 圣文森特 VC Sudan 苏丹 SD Suriname 苏里南 SR Swaziland 斯威士兰 SZ Sweden 瑞典 SE Switzerland 瑞士 CH Syria 叙利亚 SY Taiwan 台湾省 TW Tajikstan 塔吉克斯坦 TJ Tanzania 坦桑尼亚 TZ Thailand 泰国 TH Togo 多哥 TG Tonga 汤加 TO Trinidad and Tobago 特立尼达和多巴哥 TT Tunisia 突尼斯 TN Turkey 土耳其 TR Turkmenistan 土库曼斯坦 TM Uganda 乌干达 UG Ukraine 乌克兰 UA United Arab Emirates 阿拉伯联合酋长国 AE United Kiongdom 英国 GB United States of America 美国 US Uruguay 乌拉圭 UY Uzbekistan 乌兹别克斯坦 UZ Venezuela 委内瑞拉 VE Vietnam 越南 VN Yemen 也门 YE Yugoslavia 南斯拉夫 YU Zimbabwe 津巴布韦 ZW Zaire 扎伊尔 ZR Zambia 赞比亚 ZM