用于控制当前 App 显示的不同语言(我这里是适配的法语):
Resources resources = getContext().getResources();
DisplayMetrics dm = resources.getDisplayMetrics();
Configuration config = resources.getConfiguration();
String curLanguage = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
curLanguage = config.getLocales().get(0).getCountry();
} else {
curLanguage = config.locale.getCountry();
}
LvLog.i("change Language before: " + curLanguage);
if (curLanguage.equals("CN")) {
// // 应用用户选择语言
config.locale = Locale.FRENCH;
} else {
config.locale = Locale.SIMPLIFIED_CHINESE;
}
LvLog.i("change Language after: " + config.locale.getLanguage());
resources.updateConfiguration(config, dm);
Intent intent = new Intent(getActivity(), MainActivity.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);
更新
- 获取当前系统语言:
/**
* 获取系统语言
* 简体中文 - zh
* 等同于 {@link #getSystemLanguageResource()}
*/
fun getSystemLanguage(): String {
return Locale.getDefault().language ?: ""
}
/**
* Locale 中,language = zh / en (语种) , region = CN / US (地区)
**/
fun getSystemLanguageResource(): String {
val local: Locale
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
local = App.mContext.resources.configuration.locales.get(0)
} else {
local = App.mContext.resources.configuration.locale
}
return local.language
}
- 更新 App 使用语言
// 可以自己根据条件生成 Locale 对象,比如:
val locale: Locale
when (selId) {
ID_CHINESE -> {
locale = Locale("zh", "CN")
}
else -> {
locale = Locale("en")
}
}
// 然后调用下面 updateAppConfiguration , 如有需要,可本地保存 Locale 对象,在 Application 中进行获取,然后设置 App 语言
fun updateAppConfiguration(locale: Locale) {
val resources = App.mContext.resources
val configuration = resources.configuration
configuration.locale = locale
resources.updateConfiguration(configuration, resources.displayMetrics)//更新配置
}
- 重启 App
fun resetAppToUpdateConfiguration() {
val curActivity = AppManager.getAppManager().currentActivity()
val intent = Intent(curActivity, MainActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK
curActivity.startActivity(intent)
}