Android 项目开发填坑记 - 获取系统语言(兼容7.0)

如果移动端访问不佳,请访问–> Github版

关键词:Android7.0系统语言顺序不一致

获取系统当前语言是一个比较常用的功能,在 Android 7.0 系统上旧函数获取到的当前系统语言并不正确,或者说从 Android 7.0 起,Android 系统语言的规则变了。

背景

下面是未适配 Android 7.0 的代码:

// 获取 Locale 的方式有二
Locale locale = getResources().getConfiguration().locale;
Locale locale = Locale.getDefault();
// 获取当前系统语言
locale.getLanguage();

由于仅仅根据 getLanguage() 无法全面的了解当前的系统语言信息,比如简体中文和繁体中文的 Language 都是 zh,所以还需要 getCountry() 方法获取地区信息,我们就能得到 zh-CNzh-HK/zh-TW

总结一下就是:

// 获取 Locale 的方式有二
Locale locale = getResources().getConfiguration().locale;
Locale locale = Locale.getDefault();
// 获取当前系统语言
String lang = locale.getLanguage() + "-" + locale.getCountry();

但是,在 Android 7.0 上:getResources().getConfiguration().locale 被标记为 deprecated 了,所以初步适配后是:

Locale locale;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    locale = getResources().getConfiguration().getLocales().get(0);
} else {
    locale = getResources().getConfiguration().locale;
}
//或者仅仅使用 locale = Locale.getDefault(); 不需要考虑接口 deprecated(弃用)问题
String lang = locale.getLanguage() + "-" + locale.getCountry();

从 Android 7.0 起使用的getResources().getConfiguration().getLocales() 返回的是一个 LocaleList 对象,它包含 >=1 个 Locale,内容项可由用户增删,顺序可由用户调整。但是,此接口返回的语言顺序和用户定义的顺序不一定一致

测试语言顺序

原文地址: h ttp://blog.csdn.net/ys743276112/article/details/71547134
测试核心代码:

Locale locale = Locale.getDefault();
MLog.e(locale.getLanguage() + "-" + locale.getCountry());

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    LocaleList localeList = getResources().getConfiguration().getLocales();
    for (int i = 0; i < localeList.size(); i++) {
        MLog.e(i + " >1> " + localeList.get(i).getLanguage() + "-" + localeList.get(i).getCountry());
    }

    LocaleList localeList2 = LocaleList.getAdjustedDefault();
    for (int i = 0; i < localeList2.size(); i++) {
        MLog.e(i + " >2> " + localeList2.get(i).getLanguage() + "-" + localeList2.get(i).getCountry());
    }

    LocaleList localeList3 = LocaleList.getDefault();
    for (int i = 0; i < localeList3.size(); i++) {
        MLog.e(i + " >3> " + localeList3.get(i).getLanguage() + "-" + localeList3.get(i).getCountry());
    }

    LocaleList localeList4 = LocaleList.getEmptyLocaleList();
    for (int i = 0; i < localeList4.size(); i++) {
        MLog.e(i + " >4> " + localeList4.get(i).getLanguage() + "-" + localeList4.get(i).getCountry());
    }
}

第一次测试

测试手机:Nubia Z9 mini,Android 7.1,Mokee Rom

手机系统语言顺序:hi-IN,zh-CN,en-US,zh-HK

App 国际化:values,values-zh (values 里的 string 为英文,values-zh 里的 string 为中文)

结果是:

zh-CN

0 >1> zh-CN
1 >1> hi-IN
2 >1> en-US
3 >1> zh-HK

0 >2> zh-CN
1 >2> hi-IN
2 >2> en-US
3 >2> zh-HK

0 >3> hi-IN
1 >3> zh-CN
2 >3> en-US
3 >3> zh-HK

并且 App 当前显示的文字是中文

第二次测试

测试手机:Nubia Z9 mini,Android 7.1,Mokee Rom

手机系统语言顺序:hi-IN,en-US,zh-CN,zh-HK

App 国际化:values,values-zh

结果是:

en-US

0 >1> en-US
1 >1> hi-IN
2 >1> zh-CN
3 >1> zh-HK

0 >2> en-US
1 >2> hi-IN
2 >2> zh-CN
3 >2> zh-HK

0 >3> hi-IN
1 >3> en-US
2 >3> zh-CN
3 >3> zh-HK

并且 App 当前显示的文字是英文

结论

从 Android 7.0 开始,系统语言支持多个,可手动排序,系统根据 App 本身支持的语言和手机出厂设置的语言等因素来调整 App 本身的默认语言。

要获取系统为 App 调整后的默认语言

Locale locale = Locale.getDefault();
//Locale.getDefault() 和 LocaleList.getAdjustedDefault().get(0) 同等效果,还不需要考虑版本问题,推荐直接使用
String language = locale.getLanguage() + "-" + locale.getCountry();

要获取系统真实首选语言

Locale locale;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    locale = LocaleList.getDefault().get(0);
} else locale = Locale.getDefault();

String language = locale.getLanguage() + "-" + locale.getCountry();

参考资料:https://developer.android.com/reference/java/util/Locale.html

PS:你可以通过下面的方式和我联系

Unlocker-esxi-6.5-6.7-7.0是一款用于解锁VMware ESXi虚拟化平台的工具,使用户可以在硬件未正式支持的情况下安装和运行ESXi操作系统。 ESXi是VMware公司提供的一种虚拟化平台,可以在服务器硬件上创建和管理多个虚拟机。然而,由于硬件支持的限制,有时无法安装和运行ESXi操作系统。这时,Unlocker-esxi-6.5-6.7-7.0就发挥了重要作用。 Unlocker-esxi-6.5-6.7-7.0可以绕过硬件支持的限制,允许用户在不支持的硬件上安装和运行ESXi 6.5、6.7和7.0版本。通过解锁限制,用户可以利用更广泛的硬件资源来构建和管理虚拟化环境,提高利用率和灵活性。 这个工具的使用方法相对简单。首先,用户需要在VMware ESXi的安装介质上运行Unlocker-esxi-6.5-6.7-7.0的脚本。这将修改ESXi操作系统的安装程序,绕过硬件支持的限制。然后,用户可以按照正常的安装步骤安装ESXi操作系统,而不再受到硬件的限制。 需要注意的是,Unlocker-esxi-6.5-6.7-7.0是一款第三方工具,并非由VMware官方提供和支持。因此,在使用该工具时,用户需要自行承担风险和责任,并理解可能存在的兼容性和稳定性问题。 总而言之,Unlocker-esxi-6.5-6.7-7.0工具可以解锁VMware ESXi虚拟化平台,使用户可以在不支持的硬件上安装和运行ESXi操作系统,提高虚拟化环境的灵活性和利用率。但在使用该工具时,用户需要自行承担风险,并对硬件和软件兼容性有所了解。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值