Android 多语言介绍及实战

news/2025/3/22 1:51:06

基本使用

创建多语言文件夹

右键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等设计原则:

元素LTRRTL
文本句子读从左到右。句子读从右到左。
时间轴事件进展的说明顺序从左到右。事件进展的说明顺序从右到左。
图像一个箭头指向从左到右显示前进运动:→一个箭头指向右到左表示前进运动:←

是否启用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);
复制代码

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

英语设置不起作用

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

  1. 设置两种英语的设置选项,即美式英语(values-en-rUS)和英式英语(values-en-rGB);
  2. 可将res的文件夹命名为values-en,不区分国家即可;

更改系统全局语言设置

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

<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/>
复制代码

为多语言适配不同字体

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

android8.0新增了font-family,可以定义一组字体及其权重

<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:android="http://schemas.android.com/apk/res/android"><fontandroid:fontStyle="normal"android:fontWeight="400"android:font="@font/lobster_regular" /><fontandroid:fontStyle="italic"android:fontWeight="400"android:font="@font/lobster_italic" />
</font-family>
复制代码

然后再styles.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>复制代码

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

辅助工具

如果应用所要支持的语言种类很多,那么逐条分别输入文本是很繁琐的一件事情,推荐几个可以加快效率(偷懒)的工具:

Translation-Tools

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

ECTranslation

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

AndroidLocalize

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

结语

好像没啥可说的了,祝大家新年快乐,全年无BUG!


https://dhexx.cn/news/show-696676.html

相关文章

C#加密解密算法汇总(转)

方法一&#xff1a; //须添加对System.Web的引用 using System.Web.Security; ... /// <summary> /// SHA1加密字符串 /// </summary> /// <param name"source">源字符串</param> /// <returns>加密后的字符串</returns> public…

Linux/unix 命令

1 查看系统信息 查看系统信息 uname -a Linux AY14053111262883528eZ 2.6.32-358.6.2.el6.x86_64 #1 SMP Thu May 16 20:59:36 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux查看操作系统 head -n 1 /etc/issue CentOS release 6.3 (Final)查看硬盘用量 df -h2 文件操作 find / -na…

字段sql数据库、DBMS和SQL---VC++笔记

最近使用开发的过程中出现了一个小问题&#xff0c;顺便记录一下原因和方法--字段sql 数据库、DBMS和SQL 数据库是数据的集合&#xff0c;它由一个或多个表组成。每个表中都存储了对一类对象的数据描述&#xff0c;一个典型的表如表10.1所示。表的每一列描述了对象的一个属性&a…

js添加select中option

1、js代码 $("#year").append("<option value"value的值">"内容"</option>");2、jsp <select id"year"></select>转载于:https://www.cnblogs.com/pecool/p/9026392.html

Spring cron

Spring Cron Scheduled(fixedDelay 10000)//每10秒钟一次 Scheduled(cron "0 18/10 * * * ?")//18分钟开始执行&#xff0c;每10分钟执行一次。

linux umask详解

对于linux文件系统中&#xff0c;文件的最大权限应该是666&#xff0c;针对目录最大的是777 &#xff08;因为目录必须要有x才能进入&#xff09;。umask&#xff08;user的反掩码&#xff09;的值的作用是&#xff0c;设置用户环境下&#xff0c;创建文件或者目录的权限控制。…

yii 执行sql

yii 执行sql sql $sql "SELECT ".join(,, $this->search_fields_channel)." FROM {{channel}} ORDER BY order_id ASC LIMIT 31";  $cmd Yii::app()->db->createCommand($sql); $rows $cmd->queryAll(); ar find&…

等我准备好以后,我就...

前言&#xff1a;这是一篇旧文&#xff0c;最早发表在我的公众号上&#xff0c;今天再拿出来&#xff0c;算是给自己再重新设个警钟。没有执行的想法只不过是幻觉 现在的世界不是没有选择&#xff0c;而是选择太多。在众多的选择当中&#xff0c;我们就变得迷茫了。 很多人认为…

Mysql分区表局限性总结

昨天晚上asers.z问我怎么样使得数据在搜索的时候和58.com差不多&#xff0c;而且展示数据的速度要快。我一直想着用mysql的分区表解决&#xff0c;而乔楚&#xff08;乔大姐&#xff09;则认为是采用sphinx来解决。但后来我找了一个资料才发现&#xff0c;原来分区表还是有局限…

vmware 10 找不到硬盘

安装CentOS 时找不到硬盘&#xff08; no usable disks have been found&#xff09;的解决方法 安装CentOS 6.5 VMWare10网上搜来2步如下&#xff1a; 1、先进BIOS中设置SATA mode 为AHCI mode&#xff08;此模式下windows xp蓝屏&#xff09;。&#xff08;经测试不需要更改S…