实战技巧:为Android应用设置独立的多语言

原文链接 实战技巧:为Android应用设置独立的多语言

通常情况下多语言的设置都在系统设置中,应用需要做的就是提供本应用所使用的字串的多语言翻译,使用时使用R.string.app_name类似的引用,然后系统会根据用户在系统设置中的选项来选择合适的具体的语言。并且这是一个全局选项,也就是说选择一个多语言后整个手机都变了。但有些时候,应用想要自己能够设置一个独自的多语言,也就是说想要给自己的应用设置一个不同于全局的多语言。今天就来研究一下这个话题。

这样做的目的是为了提供更好的用户体验,因为一些仅支持某些特定语言的应用,可能会与系统全局选项冲突,或者只在某些固定地区发行的应用,单独的个性化的局部设置会更好一些。这个谷歌已经通过Jetpack中的appcomat库给与了比较好的支持,详细的可以参考这个文档,以及官方的Sample。我们在官方文档基础之上再叠加试验和理解,做进一步的总结。

主要分为两种方法,一是系统支持单独给应用设置多语言;二是应用中独自设置,这个也是更为通用的解法。

注意:这里的方法都是让某一个应用内部使用的多语言改变为相应的设置(一般情况下是与系统全局设置不一样的),但是需要注意仅仅局限于应用启动后的应用内部界面使用的语言。对于像桌面上应用的入口仍是系统全局设置为准,因为这个入口并不属于应用自己管辖范围内的。

系统设置中支持为应用设置单独多语言

谷歌官方的表述是从Android 13(Android T, SDK 33)开始,就支持了在系统中有一个入口,可以为每个应用单独设置多语言选项。这一部分里面描述的方法也都是支持这个系统入口的情况才能生效的。需要注意,虽然谷歌官方说从Android 13开始就支持了,但这个也要取决 于厂商的定制,目前看大部分国内厂商会把这个功能和入口给屏蔽掉,那么这里后面描述的方法也就都不会生效了。

入口在哪里

需要通过系统设置来进行,有两个入口:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • Settings(设置)> Additional Settings (更多设置) > Languages & Input (语言和输入) > (App Languages) 应用语言 > select an app(选择一个应用)
  • Settings(设置)> Apps (应用)> select an app(选择一个应用) > Language(语言)

具体的方法,又分为两种,一是自动式的,二是手动式的。

自动添加

说是自动,其实也是利用IDE(即Android Studio)和编译打包时自动根据res下面的多语言生成一份配置而已。在build.gradle或者build.gradle.kts中的android下面添加generateLocaleConfig = true:

	android {androidResources {generateLocaleConfig = true}}

然后在resl中增加一个名为resources.properties的文件,加入默认值配置:

unqualifiedResLocale=en-US

手动添加

在res/xml中增加文件locales_config.xml,加入需要支持的多语言选项,如:

<?xml version="1.0" encoding="utf-8"?>
<locale-config xmlns:android="http://schemas.android.com/apk/res/android"><locale android:name="en-US"/><locale android:name="en-GB"/><locale android:name="fr"/><locale android:name="ja"/><locale android:name="zh-Hans-MO"/><locale android:name="zh-Hant-MO"/>
</locale-config>

然后在AndroidManifest.xml中的appllication加上这一个属性:

<manifest>...<application...android:localeConfig="@xml/locales_config"></application>
</manifest>

因为还没有找到支持如此设置的手机,所以上述方法未经验证。

在应用内部设置多语言

这个是更为通用的做法,具体的UI就是可以随便弄了,弄个List或者DrowDownMenu都可以。重点是让设置生效的时候需要用到一个API,叫做setApplicationLocales()和getApplicationLocales()。并且在appcompat 1.6.0以后的版本,有比较方便的API可以直接使用。

val appLocale: LocaleListCompat = LocaleListCompat.forLanguageTags("xx-YY")
// Call this on the main thread as it may require Activity.restart()
AppCompatDelegate.setApplicationLocales(appLocale)

如果要还原使用系统设置中的全局多语言配置,可以用LocaleListCompat.getEmptyLocaleList()当作参数。

特别注意:此方法要想生效,宿主Activity必须是继承自appcompat中的AppCompatActivity,而不是其他 。

为了兼容以前的版本(Android 12,API level 32以前),还需要在AndroidManifest中添加一个额外的Service:

<application...<serviceandroid:name="androidx.appcompat.app.AppLocalesMetadataHolderService"android:enabled="false"android:exported="false"><meta-dataandroid:name="autoStoreLocales"android:value="true" /></service>...
</application>

需要注意,这个Service在appcomat库中已经定义好了,只需要在manfiest里添加一下就可以了。

另外需要注意的是,一般情况下,应用自己肯定 会保存一下当前用户所选择的语言。但如果系统也支持应用语言选择入口的话,那么通过系统入口也是可能会修改应用的多语文选项的,这时,就需要把系统的选项与应用内部的选项进行同步。可以通过AppCompatDelegate.getApplicationLocales来获取当前生效的语言选项,它是由appcompat库来维护的,肯定是最新的,所以应用自己保存的选项如果与这个API的结果不一致,就要重置为这个API的结果。

参考资料

  • Per-app language preferences
  • user-interface-samples/PerAppLanguages

原创不易,打赏点赞在看收藏分享 总要有一个吧

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

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

相关文章

python系统调用执行ping命令无法检测到超时情况(破案了:ping命令-W参数单位为s,我写了个1000)

文章目录 问题描述破案了&#xff1a;ping命令-W参数单位为s&#xff0c;我写了个1000。。。,,ԾㅂԾ,, 问题描述 我用了系统调用去执行ping&#xff0c;一开始用os.system()&#xff0c;有问题&#xff0c;后面用subprocess问题还是存在&#xff0c;后来我把这个改了&#xff…

“Python: Configure Tests“ not found解决方案

最近想尝试尝试学学软件测试。正好电脑上安装了vscode&#xff0c; 又懒得装pycharm&#xff0c;所以就用vscode了。 遇到的问题 跟着vscode运行unittest框架想运行一下测试用例文件。【前提是文件名一定要包含test&#xff0c;文件里要导入unittest的包&#xff0c;类要继承…

竞赛选题YOLOv7 目标检测网络解读

文章目录 0 前言1 yolov7的整体结构2 关键点 - backbone关键点 - head3 训练4 使用效果5 最后 0 前言 世界变化太快&#xff0c;YOLOv6还没用熟YOLOv7就来了&#xff0c;如果有同学的毕设项目想用上最新的技术&#xff0c;不妨看看学长的这篇文章&#xff0c;学长带大家简单的…

36.位运算符

一.什么是位运算符 按照二进制位来进行运算的运算符叫做位运算符&#xff0c;所以要先将操作数转换成二进制&#xff08;补码&#xff09;的形式在运算。C语言的中的位运算符有&#xff1a; 运算符作用举例结果& 按位与&#xff08;and&#xff09; 0&00; 0&10; …

Linux进程间通信——共享内存

Linux进程间通信——共享内存 1、创建/打开共享内存1.1 shmget1.2 ftok 2、关联和接触关联2.1 shmat2.2 shmdt 3、删除共享内存3.1 shmctl 3.2 相关shell命令3.3 共享内存状态4、进程间通信5、shm和mmap的区别 原文链接 共享内存不同于内存映射区&#xff0c;它不属于任何进程…

基于现代学徒制的大数据技术与应用人才培养模式探讨

学生学徒制的实施旨在解决当前新技术企业招聘技能人才难和青年就业难的结构性矛盾&#xff0c;通过生态链链主企业携手院校共同解决毕业年度学生就业问题&#xff0c;按照学生个人意愿&#xff0c;建立以就业导向的学生学徒制关系&#xff0c;签订学徒培养协议确定学生就业岗位…

【Java基础】几种拼接字符串的方法

几种拼接字符串的方法 1.使用 "" 运算符拼接字符串2.使用 StringBuilder 或 StringBuffer 类3.使用 StringJoiner 类4.使用 String 类 join 方法5.使用 StringUtils 类6.使用 String 类 concat 方法7.使用 String.format() 方法格式化字符串8.使用 Stream 实现9.总结…

Python-图片去重

直接上代码 # 修改一下第34行文件夹路径以及13行图片后缀名即可使用 import os from hashlib import md5def remove_duplicate_images(folder_path):image_files []duplicate_images set()# 遍历文件夹&#xff0c;找到所有 JPG 图片文件for root, dirs, files in os.walk(f…

智能优化算法应用:基于黑猩猩算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于黑猩猩算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于黑猩猩算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.黑猩猩算法4.实验参数设定5.算法结果6.参考文献7.…

Proteus8.16仿真软件安装图文教程(Proteus 8 Professional)

Proteus8.16 &#x1f527;软件安装包下载链接&#xff1a;&#x1f527;视频教程&#x1f527;1 安装软件解压&#x1f527;2 安装&#x1f527;3 破解&#x1f527;4 汉化 &#x1f527;软件安装包下载链接&#xff1a; Proteus8.16软件下载链接 1、本文关于Proteus8.16 SP…

双击热备方案实现(全)

双击热备是应用与服务器的一种解决方案&#xff0c;其构造思想是主机和从机通过TCP/IP网络连接&#xff0c;正常情况下主机处于工作状态&#xff0c;从机处于监视状态&#xff0c;一旦从机发现主机异常&#xff0c;从机将会在很短的时间内代替主机。完全实现主机的功能。 要想实…

golang之net/http模块学习

文章目录 开启服务开启访问静态文件获取现在时间按时间创建一个空的json文件按时间创建一个固定值的json文件 跨域请求处理输出是json 开启服务 package mainimport ("fmt""net/http" )//路由 func handler(w http.ResponseWriter, r *http.Request){fmt.…

2023年多元统计分析期末试题

一、简答题 1、试述距离判别法、Fisher判别法和贝叶斯判别法的异同。 二、 2、设 X {X} X~ N 2 {N_2} N2​(μ&#xff0c;Σ)&#xff0c;其中 X {X} X ~ ( X 1 {X_1} X1​, X 2 {X_2} X2​, X 3 {X_3} X3​)&#xff0c;μ ( μ 1 {μ_1} μ1​&#xff0c; μ 2 {μ_2} …

2024不收费的数据恢复软件EasyRecovery16

EasyRecovery2024是一款操作安全、用户可自主操作的数据恢复方案&#xff0c;它支持从各种各样的存储介质恢复删除或者丢失的文件&#xff0c;其支持的媒体介质包括&#xff1a;硬盘驱动器、光驱、闪存、硬盘、光盘、U盘/移动硬盘、数码相机、手机以及其它多媒体移动设备。能恢…

软件测试【理论基础】

软件测试的IEEE定义&#xff1a;使用人工或自动的手段来运行或测量软件系统的过程&#xff0c;目的是检验软件系统是否满足规定的需求&#xff0c;并找出与预期结果之间的差异。 软件测试的发展趋势&#xff1a; ① 测试工作将进一步前移。软件测试不仅仅是单元测试、集成测…

数据结构算法-插入排序算法

引言 玩纸牌 的时候。往往 需要将牌从乱序排列变成有序排列 这就是插入排序 插入排序算法思想 先看图 首先第一个元素 我默认已有序 那我们从第二个元素开始&#xff0c;依次插入到前面已有序的部分中。具体来说&#xff0c;我们将第二个元素与第一个元素比较&#xff0c;…

单细胞测序并不一定需要harmony去除批次效应

大家好&#xff0c;今天我们分享的是单细胞的学习教程https://www.singlecellworkshop.com/analysis-tutorial.html 教程的作者使用了四个样本&#xff0c;但是没有使用harmony或者其他方法去整合 去除批次效应。 主要内容&#xff1a; SCTransform流程代码及结果 harmony流程…

Shell脚本介绍

Shell脚本是一种使用文本编辑器编写的简单脚本语言&#xff0c;它可以自动化常见的系统任务&#xff0c;例如执行命令、处理文件和文本数据等。Shell脚本通常使用Unix或Linux系统中的shell&#xff08;例如bash&#xff09;来解释执行。 Shell脚本的基本语法包括&#xff1a; …

scrapy的建模及管道的使用

一、数据建模 通常在做项目的过程中&#xff0c;在items.py中进行数据建模 为什么建模 定义item即提前规划好哪些字段需要抓&#xff0c;防止手误&#xff0c;因为定义好之后&#xff0c;在运行过程中&#xff0c;系统会自动检查&#xff0c;配合注释一起可以清晰的知道要抓…

【面试经典150 | 二叉树】二叉树的最大深度

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;递归方法二&#xff1a;迭代 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的…