android语言列表+波斯,Android 多语言入门及实战

右键res,选择 New Resource Directory ,选择 locale ,选择自己想要适配的语言类型

b364768fb06253687caa40e271f85360.png

设置应用内多语言

Android 7.0以下

/**

* 设置多语言

*/

public void setConfiguration(LocaleList locales, Context context) {

Configuration configuration = context.getResources().getConfiguration();

configuration.setLocales(locales);

Resources resources = context.getResources();

DisplayMetrics dm = resources.getDisplayMetrics();

resources.updateConfiguration(configuration, dm);

}

复制代码

Android 7.0及以上

有单一的目标语言变成了一个语言列表,系统会根据这个列表的优先级去适配语言:

/**

* 设置多语言

*/

@RequiresApi(24)

public void setConfiguration(LocaleList locales, Context context) {

Configuration configuration = context.getResources().getConfiguration();

configuration.setLocales(locales);

Resources resources = context.getResources();

DisplayMetrics dm = resources.getDisplayMetrics();

resources.updateConfiguration(configuration, dm);

}

复制代码

7.0版本后的语言设置界面:

04e0617c329ad7e2728f4093d121c6c6.png

这样做的好处是当应用不支持最高优先级的语言,会让用户和者开发者有自己的语言显示替代策略,而不是只能选择默认资源文件下的语言。类似的转变还有 font-family ,在下文会有提及。

获取系统语言设置

1. Locale.getDefault()

2. context.getResources().getConfiguration().locale;

3. Resources.getSystem().getConfiguration().locale;

1和2返回的是当前 APP 的 Resource 对应的 Locale 设置,也就是的值就是系统的 多语言值,但是但我们在APP中更新过 Locale ,就再也获取不到系统语言设置了。

3返回的是系统全局 Resource 的 Locale,不会随APP中的更新而修改,可以当做系统 Locale 来用。

所以如果想在APP运行期间随时获得系统的多语言设置,有两种方法,在APP未更新Locale值前保存;使用第三种方法。这个在配置多语言跟随系统时很有用。

实战

目前 Android 应用对于多语言的支持度大致分为以下几个层次:

不支持多语言:无论系统设置成何种语言,APP只显示一种语言

APP支持多语言,但只能跟随系统语言,不支持应用内多语言

APP既可以选择跟随系统,也支持应用内多语言,但切换后需要重启

APP既可以选择跟随系统,也支持应用内多语言,切换后不需要重启

无疑第四种情况是对多语言支持度最全面的,微信、微博等应用均是采用这种方式管理多语言。接下来就讲解下这种方式的具体实现过程:

定义需要支持的多语言列表选项,因为需要展示给用户进行选择切换,需要在每个 values-xx 里都放置一份:

跟随系统

简体中文

繁體中文(台灣)

English

复制代码

类似微信,只需要把跟随系统翻译一遍就行了,其他的每个语言文件夹下都一样。

然后当然就要在应用中持久化保存当前多语言设置选项,用 SharedPreferences 再合适不过了。APP启动时获取这个值,再转换成对应的 Locale值,如果选择的是跟随系统,则需要获取系统的Locale值:

public Locale getSysLocale() {

Locale locale;

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//7.0有多语言设置获取顶部的语

locale = Resources.getSystem().getConfiguration().getLocales().get(0);

} else {

locale = Resources.getSystem().getConfiguration().locale;

}

return locale;

}

复制代码

然后再更新即可。当然更新后界面上的语言不会立即生效,推荐的做法和微信一样:

Intent intent = new Intent(SetLanguageActivity.this, MainActivity.class);

int flags = Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK;

intent.addFlags(flags);

startActivity(intent);

复制代码

以清空栈的方式回到主页, MainActivity 也会销毁重建,这样就完成了多语言从设置到界面更新的全过程,而不用重启APP再生效。

RTL

RTL(right to left)布局,是一种阿拉伯语、波斯语等情况下从右往左的阅读方式,和我们使用的LTR布局方向对立。当所开发的App等面向海外用户时需要做这个适配。从Android 4.2( V 17)开始支持原生的RTL模式。这种布局遵循了 Material Design 镜像view 等设计原则:

元素

LTR

RTL

文本

句子读从左到右。

句子读从右到左。

时间轴

事件进展的说明顺序从左到右。

事件进展的说明顺序从右到左。

图像

一个箭头指向从左到右显示前进运动:→

一个箭头指向右到左表示前进运动:←

是否启用RTL布局来自两个部分,一个是判断系统语言,还有一个就是需要在 AndroidManifest.xml 中声明支持RTL:

android:supportsRtl="true"

复制代码

在写布局文件的时候,就是注意把left和right相关的属性都替换成start和end对于现有项目,也可以通过 Refactor---->Add RTL support where possible 进行快速替换。不过上面只是做了基础的适配,那些有关左右方向的图标也要替换,同时也需要看控件本身是否支持RTL,这里就不再具体展开了。

###其他

string-array

在多语言文件夹下也可以放置字符串数组资源:

跟随系统

简体中文

English

复制代码

可以在 strings.xml 中,也可以新建 arrays.xml 单独管理字符串数组资源,在代码中获取和使用和string差不多

Resources res =getResources();

String[] languageTypes=res.getStringArray(R.array.language_type);

复制代码

不过我在实际使用中遇到一个问题,获取到的字符串数组的值只受到全局多语言设置的影响,应用内多语言设置无效。这个还需要再做进一步了解。

####英语设置不起作用

设置英文语言时在有些手机上不起作用 在某些手机上设置英语语言不生效,这是由于有些手机厂商的默认英语设置的是英式英语,而我们只使用了美式英语的缘故,此时处理方式为:

设置两种英语的设置选项,即美式英语( values-en-rUS )和英式英语( values-en-rGB );

可将res的文件夹命名为 values-en ,不区分国家即可;

更改系统全局语言设置

需要声明系统权限,普通应用无法使用:

复制代码

为多语言适配不同字体

多语言文件夹下不仅能存放 strings.xml ,还能配置不同风格,所以可以为不同的语言设置不同的字体,不过要注意有些字体有语言显示上的限制。

0583750997db09c62a05ffaf56e4ad49.png

@color/colorPrimary

@color/colorPrimaryDark

@color/colorAccent

@font/arial

复制代码

更多地,可以为不同语言设置其他的主题风格,如背景色、转场动画等。

辅助工具

如果应用所要支持的语言种类很多,那么逐条分别输入文本是很繁琐的一件事情,推荐几个可以

加快效率 (偷懒)的工具

多语言文本翻译导入工具,解决多语种项目翻译逐条导入问题

Android Studio上的翻译插件,支持翻译代码

批量翻译并自动生成其他国家的语言文件夹,支持 104 种语言:

a1aeb66d8b50244a623b7fedb53d941f.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499109.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c# 从地址拷贝byte_面试必备的 “零拷贝” 问题!从头给你说!

本文作者:ksfzhaohui来源:juejin.im/post/5cad6f1ef265da039f0ef5df前言I/O概念1.缓冲区2.虚拟内存3.mmapwrite方式4.sendfile方式Java零拷贝1.MappedByteBuffer2.DirectByteBuffer3.Channel-to-Channel传输Netty零拷贝其他零拷贝总结前言从字面意思理解…

lda 可以处理中文_中文分词(jieba)和语料库制作(gensim)

本文的内容为以下两个部分:文本分词(jieba)语料库制作(gensim)结巴(jieba)分词在自然语言处理领域中,分词和提取关键词都是对文本处理时通常要进行的步骤。用Python语言对英文文本进…

js时间搓化为今天明天_秋冬国产搓背神器!360°无死角,让你搓背不求人,太舒服了...

秋冬国产搓背神器!360无死角,让你搓背不求人,太舒服了!夏季悄然离去,秋季快步走来,距离冬季也不远了~天气变冷以后,下班、放学回家了最惬意不过的就是洗个澡,如果泡完澡再搓个背&…

用html制作广告图片切换效果,基于jquery实现图片广告轮换效果代码

效果图:实现代码:hotmarquee*{margin: 0;padding: 0;}body{font: 12px;padding-top: 50px;padding-right: 200px;padding-bottom: 100px;padding-left: 200px;}ul{list-style: none;}img{padding: 2px;border: 1px solid #eee;}a{outline: none;}#imgs{width: 410px;margin-rig…

matplotlib柱状图上方显示数据_Python数据分析matplotlib可视化之绘图!

Matplotlib是一个基于python的2D画图库,能够用python脚本方便的画出折线图,直方图,功率谱图,散点图等常用图表,而且语法简单。Python中通过matplotlib模块的pyplot子库来完成绘图。Matplotlib可用于创建高质量的图表和…

应付账款账龄分析模板_企业财务报表分析论文应如何着手?

首先是企业的选择,最好选取上市公司进行分析,上市公司的财务数据比较透明,完全可以从新浪财经、中国证券网等平台获得详尽的报表数据资料,一般选取近三到五个年度。有了数据就可以着手分析了,我们可以从下面几个方法入…

dbeaver导入excel文件_PyQT5练习:制作Excel文件导入MySQL窗口

本文环境配置:系统>windows10:64位工具>PyCharm:2018.3.1语言>Python:3.7.1第三方库PyQT5:5.11.3pyqt5-tools:5.11.3.1.4PyMySQL:0.9.3openpyxl:2.5.12练手:制作…

编程中的蛇形填空问题_PCB—蛇形线的作用,这次真的是把你搞懂了

经常能看到论坛里有人在问蛇形线的问题。平时我们能看到蛇形线的地方大都是一些高速高密度板,好像带有蛇形线的板子就更高级,会画蛇形线就是高手了。网上关于蛇形线的文章也有很多,总感觉有些帖子的内容会误导新手,给人们带来困扰…

html5控制gif速度,gif加速软件 教你加快GIF图片的播放速度

一位狸友在编辑GIF动态图片时碰到了一个问题,就是不知怎么把GIF动画的播放速度加快(或减慢)。如果你也正巧碰到此类疑问或想知道GIF加速的方法,可以接着往下看哦。其实先理解了GIF动画的原理,并找对合适的gif编辑软件,解决这问题并…

android studio mvvm模板生成_使用Vue快速生成shape背景图

写在前面在日常的Android开发之中,我们通常都会根据UI图去手动创建shape或者selector背景图,虽说创建起来很简单,但是未免也会感到繁琐,因此也研究了一些这方面的知识,包括自定义shapedrawable、dataBinding&#xff0…

python 句子中没有中文_人生感悟经典句子,生活中可以没有诗歌,但不能没有诗意...

也曾有过一些热忱和勇气,为了自以为的命中注定颠沛流离,本想有一段花好月圆,却未曾想过就此天各一方。不是不爱,不是不会爱,只是少了坚持走下去的勇气。想必这是很多人的心声。错过抑或过错,都是爱情里常有…

图像迁移风格保存模型_图像风格迁移也有框架了:使用Python编写,与PyTorch完美兼容,外行也能用...

原标题:图像风格迁移也有框架了:使用Python编写,与PyTorch完美兼容,外行也能用选自Medium作者:Philip Meier 机器之心编译 编辑:陈萍 易于使用的神经风格迁移框架 pystiche。 将内容图片与艺术风格图片进行…

vivo设置全屏后状态栏黑色_vivo手机用2年内存占满,是这3个功能捣乱,一键按下全部释放...

vivo手机用2年内存占满,是这3个功能"捣乱",一键按下全部释放经常使用手机如果没有清理习惯,那么应用一多,产生的文件就会变多,这样手机就会没用2年就出现卡顿的现象。今天来教大家怎样一键释放vivo手机内存。…

学计算机之路写一篇作文,我的学习之路作文(2篇)

我的学习之路作文(2篇)在我们平凡的日常里,大家对作文都再熟悉不过了吧,作文根据写作时限的不同可以分为限时作文和非限时作文。那要怎么写好作文呢?以下是小编整理的我的学习之路作文,仅供参考,欢迎大家阅读。我的学习…

js生日计算年龄_你知道用EXCEL可以从身份证中提取生日、性别、年龄、生肖吗?...

首先我们先了解下中国身份证号码的编排规则,中国公民身份证共18位,1~6位为省份地区信息码;7~14位为出生日期码;15~16位数字表示所在地的派出所的代码;第17位数字表示性别(奇数表示男性,偶数表示女性)&#…

docker 修改阿里镜像源_国内部署kubernetes集群的最佳实践(一)—官方教程+阿里镜像源

项目github地址:https://github.com/usualheart/install_k8s_official在国内环境下,借助阿里镜像源,按照官方的指导,使用脚本一步一步安装kubernetes。参考教程【官方】在ubuntu上安装dockerhttps://docs.docker.com/engine/insta…

html 指定对象为块元素,html内联(行内)元素、块级(块状)元素和行内块元素分类...

HTML可以将元素分类方式分为内联(行内)元素、块级(块状)元素和行内块元素三种。注:HTML是标签语言,那么既然是标签,就可以自己定义一些自己元素(如自定义的元素等),自定义元素浏览器默认解析为内联元素,为防止不同浏览…

defaultdict python_在python中怎样使用defaultdict-百度经验

defaultdict是collection模块下面的一个类,用于在执行字典的时候,遇到没有设置的属性的时候,可以设置默认的值,那么在python中怎样使用defaultdict呢?下面小编就带大家来看看详细的教程!工具/原料 python版…

微型计算机除具有计算机的一般特点外,10秋学期《计算机应用基础》第1次在线作业答案免费6/15...

10秋学期《计算机应用基础》第1次在线作业答案免费6/152011-02-17 00:02:57266有学员问关于10秋学期《计算机应用基础》第1次在线作业答案免费6/15的题目的参考答案和解析,具体如下:2010秋学期《计算机应用基础》第一次在线作业试卷总分:100 …

java面试换背景颜色_三年经验Java程序员记一次失败的面试分享:鹅厂三面让我体无完肤!...

欢迎关注专栏:里面定期分享Java架构技术知识点及解析,还会不断更新的BATJ面试专题,欢迎大家前来探讨交流,如有好的文章也欢迎投稿。程序员圈内那点事​zhuanlan.zhihu.com经过半年的沉淀,加上对MySQL,redis…