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

设置应用内多语言

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版本后的语言设置界面:

这样做的好处是当应用不支持最高优先级的语言,会让用户和者开发者有自己的语言显示替代策略,而不是只能选择默认资源文件下的语言。类似的转变还有 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 ,还能配置不同风格,所以可以为不同的语言设置不同的字体,不过要注意有些字体有语言显示上的限制。

@color/colorPrimary

@color/colorPrimaryDark

@color/colorAccent

@font/arial

复制代码

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

辅助工具

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

加快效率 (偷懒)的工具

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

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

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

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

  1. android语言列表+波斯,android怎么添加一种新语言

    下面讲讲新增加一种语言的步骤: 1. 在sdkDemo.mk 中添加语言和国家的国际化的缩写代码,如伊朗:IR表示,波斯语用fa表示,这是国际化的标准,不可以随便写的.如果不知道国家与地区的缩写,可以 ...

  2. android优美列表页面,android listview 列表 点击列表进入详细页面

    [实例简介] android listview 列表 点击列表进入详细页面 [实例截图] [核心代码] ListviewSingleChoice └── ListviewSingleChoice ├─ ...

  3. android xml 列表展示,Android中ListView实现展示列表数据

    1.在activity_main.xml中添加一个ListView xmlns:tools="http://schemas.android.com/tools" android:l ...

  4. android 平台 列表布局,Android 设计指南 - 风格

    构建在任何设备上都引人注目的应用. Android 驱动了数百万计的手机.平板和其他设备,囊括了各种不同的屏幕尺寸和比例.利用 Android 灵活的布局系统,你可以创造出在各种设备上看起来都很优雅的 ...

  5. android+委托列表,在Android适配器中使用委托者模式

    [这是一个线索]适配器君从不甘当线索,同样是设计模式,适配器模式不是今天的主题,今天的主题是在适配器中如何使用委托者模式以明确设计中的各元素的分工. 一个具有适配器View的界面,Activity作为 ...

  6. android 新闻列表json,Android中通过ListView的实现简单新闻列表

    请注明出处:http://blog.csdn.net/qq_23179075/article/details/78648703 Android中实现简单的新闻列表 "本文主要针对Androi ...

  7. android recyclerview item自适应高度_web前端入门到实战:css让一个盒子的高度自适应屏幕剩余的部分...

    项目中,移动端要自适应,由于有时候数据不够,所以导致了有的区域空白 要求:没有数据的时候能够充满屏幕,数据超出屏幕就出现滚动条 做法 1-让容器高度充满这个屏幕 在容器内容很少的情况下,要想让这个容器 ...

  8. web无序列表去掉点_web前端入门到实战:css如何玩转有序无序列表项list样式

    在无序列表ul>li中,无线列表的标志是出现在各列表前面的圆点.在有序列表ol>li中,前面默认带有数字,如何修改列表前面的项目符号,只需要通过list-style调整就好,常见的符号有( ...

  9. Android系统语言列表

    一般情况 Android系统语言的配置项文件一般在./device/xxx/xxx.mk文件中进行配置 具体的语句是类似下面这行 PRODUCT_LOCALES := en_US 如果有多种语言,可以 ...

最新文章

  1. Redis 高级特性(3)—— 持久化及数据恢复
  2. .net core 中的[FromBody]
  3. python 立方体切割块数_blender python通过三角函数调整立方体Location排成圆
  4. 第一台计算机豹电器元件,电气基础和安全知识.ppt
  5. LocalBroadcastManager 的使用
  6. 2016 7 25 链表
  7. vim 显示行号_Vim给文件加行号,这通惊为天人的操作没sei了!文末天书慎点
  8. Bootstrap创建进度条
  9. Django讲课笔记10:使用QuerySet删除和查询数据表
  10. python读取json并列_python解析含有重复key的json方法
  11. 如何部署林根域、子域和域树
  12. citrix服务器共享文件夹,如何使用citrix XenApp 发布远程共享文件夹,及其故障解决...
  13. excel按模板导出
  14. 科普:什么是CPU?CPU和芯片关系?CPU怎么做的?CPU有什么用?不同CPU有什么区别?我们怎么选CPU?(待补充完整)
  15. 算法(字符串)——重复的子字符串
  16. MATLAB--数字图像处理 图像直方图均衡化
  17. IPC、Binder及AIDL原理机制
  18. 手机ufs2.1测试软件,内置UFS2.1:小米9手机闪存速度测试
  19. double转百分数
  20. android 分享给好友,手机将安卓软件分享给好友的方法

热门文章

  1. 斯坦福大学CS520知识图谱系列课程学习笔记:第二讲如何构建知识图谱
  2. 【bzoj 3601】一个人的数论 (莫比乌斯反演+伯努利数)
  3. JavaScript之event事件
  4. 在windows 2008 R2上安装sharepoint 2013时遇到提示必须安装 .netframeword4.5的处理办法...
  5. 160826、浏览器渲染页面过程描述,DOM编程技巧以及重排和重绘
  6. postgresql数据类型转换
  7. sql获取受影响行数、插入标识值
  8. php: eclipse 编辑 php
  9. b站的服务器在哪个位置,b站用的是哪个云服务器
  10. 甘特图制作_如何用Excel快速制作甘特图?(超详细!)