内容简介:右键res,选择有单一的目标语言变成了一个语言列表,系统会根据这个列表的优先级去适配语言:7.0版本后的语言设置界面:
右键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
里都放置一份:
<string name="language_auto">跟随系统</string> <string name="language_zh_rCN">简体中文</string> <string name="language_zh_rTW">繁體中文(台灣)</string> <string name="language_english">English</string> 复制代码
类似微信,只需要把跟随系统翻译一遍就行了,其他的每个语言文件夹下都一样。
然后当然就要在应用中持久化保存当前多语言设置选项,用 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
在多语言文件夹下也可以放置字符串数组资源:
<string-array name="language_type"> <item>跟随系统</item> <item>简体中文</item> <item>English</item> </string-array> 复制代码
可以在 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 ,不区分国家即可;
更改系统全局语言设置
需要声明系统权限,普通应用无法使用:
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/> 复制代码
为多语言适配不同字体
多语言文件夹下不仅能存放 strings.xml
,还能配置不同风格,所以可以为不同的语言设置不同的字体,不过要注意有些字体有语言显示上的限制。
<resources> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <item name="android:fontFamily">@font/arial</item> </style> </resources> 复制代码
更多地,可以为不同语言设置其他的主题风格,如背景色、转场动画等。
辅助工具
如果应用所要支持的语言种类很多,那么逐条分别输入文本是很繁琐的一件事情,推荐几个可以
加快效率
(偷懒)的工具
多语言文本翻译导入工具,解决多语种项目翻译逐条导入问题
Android Studio上的翻译插件,支持翻译代码
批量翻译并自动生成其他国家的语言文件夹,支持 104 种语言:
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
小团队构建大网站:中小研发团队架构实践
张辉清 等 / 电子工业出版社 / 2019-1 / 69
《小团队构建大网站:中小研发团队架构实践》结合作者近几年的工作经验,总结了一套可直接落地、基于开源、成本低、可快速搭建的中小研发团队架构实践方法。《小团队构建大网站:中小研发团队架构实践》共5篇22章,开篇是本书的导读;架构篇是设计思想的提升,包括企业总体架构、应用架构设计、统一应用分层等;框架篇主讲中间件和工具的使用,包括消息队列、缓存、Job、集中式日志、应用监控和微服务等;公共应用篇是技术与......一起来看看 《小团队构建大网站:中小研发团队架构实践》 这本书的介绍吧!