Android系统多语言设置

Android系统默认支持多个国家语言。实现对整个android系统的语言设置,网上很多人使用的是反射的方式,但更简单的应该是通过系统提供的LocalePicker里方法来实现。本文基于Android 9,高版本尚未验证

目录

1,权限要求
2,反射的方式实现
3,LocalePicker接口实现
4,各国语言缩写

一,权限要求

首先需要系统级的权限,在AndroidManifest.xml里申请权限:

android:sharedUserId=“android.uid.system”
<!-- 切换语言,修改配置文件 -->
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"
        tools:ignore="ProtectedPermissions" />

二,反射的方式实现

可以通过反射方式来设置语言,反射方法如下:

void setLanguage2(Locale setLocaleLauguage) {
    
    
    Log.i(TAG, "setLanguage2: "+setLocaleLauguage);
	try{
    
    
	    Class classActivityManagerNative = Class.forName("android.app.ActivityManagerNative");
    	Method getDefault = classActivityManagerNative.getDeclaredMethod("getDefault");
    	Object objIActivityManager  = getDefault.invoke(classActivityManagerNative);
    	Class classIActivityManager = Class.forName("android.app.IActivityManager");
    	Method getConfiguration = classIActivityManager.getDeclaredMethod("getConfiguration");
    	Configuration config = (Configuration) getConfiguration.invoke(objIActivityManager);
    	config.setLocale(setLocaleLauguage);

    	Class clzConfig = Class.forName("android.content.res.Configuration");
    	Field userSetLocale = clzConfig.getField("userSetLocale");
    	userSetLocale.set(config, true);
    	Class[] clzParams = new Class[]{
    
    Configuration.class};
    	Method updateConfiguration = classIActivityManager.getDeclaredMethod("updateConfiguration", clzParams);
    	updateConfiguration.invoke(objIActivityManager, config);
    	BackupManager.dataChanged("com.android.providers.settings");
	}catch (Exception var12) {
    
    

	}
	}

在上面方法的基础上实现系统语言的设置,其中需要传入语言的缩写,各国语言缩写见文章最后。

	Locale localeL = Locale.forLanguageTag("hu-HU");
	if(localeL == null) {
    
    
		localeL = new Locale("hu-HU");
	}
	setLanguage2(localeL);

三、LocalePicker接口实现

可以通过以下方法查询已经封装进Locale里的支持的语言有哪些:

 final Map<String, LocalePicker.LocaleInfo> mLocaleInfoMap = new HashMap<String, LocalePicker.LocaleInfo>();
 final List<LocalePicker.LocaleInfo> localeInfoList = LocalePicker.getAllAssetLocales(SystemActivity.this, false);

        for (final LocalePicker.LocaleInfo localeInfo : localeInfoList) {
    
    
            final String languageTag = localeInfo.getLocale().toLanguageTag();
            mLocaleInfoMap.put(languageTag, localeInfo);
            Log.d("luyao", "::::"+languageTag);
        }

可以使用Locale.forLanguageTag()获取语言对应的Locale对象,但是不是所有语言都可以获得到,如果获得到的为null,就需要重新new一个Locale对象。.实现语言设置的关键方法如下所示,最主要的是 LocalePicker.updateLocale(mNewLocale) 去设置系统的配置文件,修改系统语言。其中需要传入语言的缩写,各国语言缩写见文章最后章节。

	void setLanguage(String newlanguage) {
    
    
        Locale localeL = Locale.forLanguageTag(newlanguage);
        if(localeL == null) {
    
    
            localeL = new Locale(newlanguage);
        }
        LocalePicker.updateLocale(localeL);
    }

设置好系统语言后,可以通过adb指令getprop persist.sys.locale查看当前的系统语言是否设置成功。

mt2712_saic_ec32:/ # getprop persist.sys.locale
hr-HR
mt2712_saic_ec32:/ #

四、各国语言缩写

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 中文 (中国)

转载:https://blog.csdn.net/u012873121/article/details/129934297

猜你喜欢

转载自blog.csdn.net/gqg_guan/article/details/134134461