内容简介:右键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 种语言:
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Cracking the Coding Interview
Gayle Laakmann McDowell / CareerCup / 2015-7-1 / USD 39.95
Cracking the Coding Interview, 6th Edition is here to help you through this process, teaching you what you need to know and enabling you to perform at your very best. I've coached and interviewed hund......一起来看看 《Cracking the Coding Interview》 这本书的介绍吧!
XML、JSON 在线转换
在线XML、JSON转换工具
RGB HSV 转换
RGB HSV 互转工具