Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Android 项目开发填坑记 - 获取系统语言(兼容7.0)

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

作者头像
他叫自己MR.张
发布于 2019-07-01 09:24:05
发布于 2019-07-01 09:24:05
5K00
代码可运行
举报
文章被收录于专栏:Android必知必会Android必知必会
运行总次数:0
代码可运行

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

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

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

背景

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 获取 Locale 的方式有二
Locale locale = getResources().getConfiguration().locale;
Locale locale = Locale.getDefault();
// 获取当前系统语言
locale.getLanguage();

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

总结一下就是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 获取 Locale 的方式有二
Locale locale = getResources().getConfiguration().locale;
Locale locale = Locale.getDefault();
// 获取当前系统语言
String lang = locale.getLanguage() + "-" + locale.getCountry();

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 测试核心代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 为中文)

结果是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

结果是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 调整后的默认语言

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Locale locale = Locale.getDefault();
//Locale.getDefault() 和 LocaleList.getAdjustedDefault().get(0) 同等效果,还不需要考虑版本问题,推荐直接使用
String language = locale.getLanguage() + "-" + locale.getCountry();

要获取系统真实首选语言

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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:你可以通过下面的方式和我联系

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年05月10日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android 国际化之多语言适配小记
甲方要求实现 App 国际化多语言,正好抽个时间弄了下,害,被自己蠢到死,特意记录下.
贺biubiu
2021/03/11
4.2K0
Android 国际化之多语言适配小记
国际化语种名称的标识
国内因为版号的问题,导致很多游戏厂商选择出海。在国际化的市场要想取得好的成绩,就必须要做好深度的本地化,其中最基础的一块就是语言。
meteoric
2018/11/20
2.5K0
Android 国际化(多语言)兼容8.0
Android中实现国际化相对来说还是简单的,因为Android有很独特的资源管理方式,我们可以很轻松的创建资源支持不同语言.
用户1269200
2018/12/24
2.1K0
Android笔记: 获取手机的品牌、型号、Android系统版本号、IMEI、当前系统语言等工具类
最近在开发中,需要用到一些系统信息,这里我把这些方法写成一个工具类方便以后复用,该工具类有以下6个功能:
程思扬
2022/01/10
2.4K0
Android通过代码实现多语言切换
最近接手一个Android项目,需要实现对维吾尔族语的支持。虽然做了这么久的android开发,只做过多语言支持,但做应用内部多语言支持还是第一次,而且还是对维吾尔语的支持。所以,又是一次面向搜索引擎编程。
JarvanMo
2018/09/06
3.7K0
SpringBoot 多语言 – 国际化 – i18n
快速小结:LocaleResolver接口的实现类获得Locale对象,Locale对象告诉MessageSource从哪个配置文件获得消息!
收心
2024/06/15
1K0
SpringBoot 多语言 – 国际化 – i18n
Android面试系列之应用内多语言切换
昨天组里的同事遇到一些切换多语言的细节问题,发现在Android N版本上配置应用内多语言没有生效,正好拿出来做为一个面试题讲解一下。 面试题:如何实现应用内多语言切换? 我们知道Android的多语言实现很简单,可以在不同的语言环境下使用不同的资源。在不同的res/value-xx下放置不同语言的strings.xml实现字符的本地化,而这个value-xx目录的选择是根据Resource中的Configuration.Locale这项的值来决定的。如zh中文,就会选择value-zh目录,如果没有匹配到
非著名程序员
2018/02/02
1.8K0
Spring Boot 两行代码轻松实现国际化
在开发中,国际化(Internationalization),也叫本地化,指的是一个网站(或应用)可以支持多种不同的语言,即可以根据用户所在的语言类型和国家/地区,显示不同的文字。能够让不同国家,不同语种的用户方便使用,提高用户体验性。
Java旅途
2021/05/07
2.9K0
Android 多语言应用(步骤+源码)
  什么样的应用需要多语言呢?应用国际化,比如你的应用同时要在国内和国外使用,因此你需要对你的应用增加不同的语言。
晨曦_LLW
2020/12/09
1.1K0
Android 多语言应用(步骤+源码)
从零玩转后端接口数据交互国际化
当我们的项目涉及到多语言支持时,身为后端开发的我们,接口数据国际化便是我们必须攻克的问题。
Blue_007
2023/11/06
4.4K7
从零玩转后端接口数据交互国际化
WAF攻防-菜刀&冰蝎&哥斯拉&流量通讯&特征绕过&检测反制&感知
使用Proxifier进行流量转发至Burp抓包分析(使用Wireshake也可以)
没事就要多学习
2024/07/18
1690
WAF攻防-菜刀&冰蝎&哥斯拉&流量通讯&特征绕过&检测反制&感知
这篇文章让你搞懂 SpringMVC 国际化!
松哥原创的 Spring Boot 视频教程已经杀青,感兴趣的小伙伴戳这里-->Spring Boot+Vue+微人事视频教程
江南一点雨
2021/04/22
1.2K0
这篇文章让你搞懂 SpringMVC 国际化!
Tomcat中的ResourceBundle国际化解析「建议收藏」
资源束(ResourceBundle)是一个本地化对象。它封装了适用于本地环境的资源; 这个类主要用来解决国际化和本地化问题。国际化和本地化可不是两个概念,两者都是一起出现的。可以说,国际化的目的就是为了实现本地化。
全栈程序员站长
2022/09/14
4760
Android获取设备各项信息(设备id、ip地址、设备名称、运行商、品牌、型号、分辨率、处理器、国家码、系统语言、网络类型、oaid、android版本、操作系统版本、mac地址、应用程序签名..)
Android获取设备各项信息(设备id、ip地址、设备名称、运行商、品牌、型号、分辨率、处理器、国家码、系统语言、网络类型、oaid、android版本、操作系统版本、mac地址、应用程序签名......) 获取设备id 获取ip地址 获取设备名称 获取设备型号 获取设备处理器 获取设备品牌 获取设备制造商 获取设备oaid 获取设备识别码 获取mac地址 获取应用包名 获取应用签名 获取app版本 获取版本号 获取分辨率 获取国家码 获取系统语言 获取设备网络代码 获取设备网络类型 获取android版
是阿超
2021/12/30
5.5K0
Blazor学习之旅(10)多语言+本地化
在Web应用开发中,我们可能会有一些需要多语言+本地化的场景,特别在一些国际化的外资企业当中特别常见。例如,Edison所在的IT开发团队,就需要英语,中文和德语三种语言的支持,用户可以通过“切换页面语言”这个功能来切换到适合他的语言来浏览页面的内容。因此,为Web应用提供多语言,页面内容可以本地化,会扩展我们的IT系统受众范围,提升一点用户体验。
Edison Zhou
2023/08/09
4900
Blazor学习之旅(10)多语言+本地化
Scan Media Files in Android
I once tried to use MediaScanner to resolve problems; however it turned out to be a failure. Now I make it.This post is to write down why I failed and how I work it out now. I think it could be deeper that other posts.
技术小黑屋
2018/09/04
1.6K0
前端实现多语言切换_等红灯时频繁D到N档切换
https://stackoverflow.com/questions/40398528/android-webview-language-changes-abruptly-on-android-n
全栈程序员站长
2022/10/02
5280
前端实现多语言切换_等红灯时频繁D到N档切换
相关推荐
Android 国际化之多语言适配小记
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档