
正文
android多语言,android多语言切换
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
android 多语言--后台返回数据处理
这篇文章只针对后台返回的数据, 本地数据除外
我们发送网络请求的时候, 带一个语言类型参数, 例如 map.put("language", "ZH"), 我们需要什么语言就传什么语言类型, 正常接收返回值就可以了.
这样做的好处:
①. 对于android端, 新增、修改、删除语言 时也只需改变一个字段的值即可, 这个字段可以使用接口来控制值, App完全可以不用任何修改, 灵活性较高.
②. 对于整个项目而言: 前端("android", "IOS", "小程序", "公众号") 等多个端, 完全无需做任何判断, 只需后台处理好即可, 总体可以节约不少时间.
后台把所有的语言数据一起返回 , 可能出现如下格式:
同行的人看到了肯定会说: 叫后台改成第一种方式啊.
如果是项目刚刚开始开发, 可能比较好改.
我碰到的情况是: 一开始项目没有做android端, 后台和web端已经上线了不知道多少个版本了, 反正就是后台架构已经确定了, 这个时候改成本会比较大. 只能自己处理了.
这个时候处理方式:
① 如果按照原来的方式: GsonFormat.如下图:
这样是可以解析出来的, 看起来项目也能正常运行, 但是每个接口都这么做的话, 维护起来难度太大了, 项目越大越难维护 , 例如:新增一种语言, 竟然要全局大改. 有100个接口就要改100个实体类, 等等.
②. 特殊处理
思考: 有什么办法可以和第一种方式一样, 修改一个参数就可以全局改变语言?
观察: 共同点: 多语言的实体类里面都会有 变量名为"ZH" "EN" 的对象 , 对象不确定类型, 这个时候想到用泛型. 于是有下面的写法:
我们的实体类都有这个特性, 所以直接继承即可.
解析
解析数据类型2
特殊处理步骤:
①. 封装好多语言基类LanguageBeanT
②. 多语言实体类继承LanguageBeanT
③. 获取多语言实体数据时, 要用bean.get()获取对象.
好处
①. 增删改语言, 只需在基类LanguageBeanT修改即可, 其它地方完全不需要修改.
②. 切换语言时: 只需赋值给languageType即可.
③.可切换回方式1 (网络请求的时候, 带一个语言类型参数) , 只需languageType = "" 即可.
封装好以后, 即使后台要重构, 使用方式1处理多语言, 我们也只需修改一个字段即可.
相关问答
Q1: Android国际化多语言切换
关于App国际化,之前有讲到国际化资源、字符换、布局相关,想要了解的猛戳 用力抱一下APP国际化 。借着本次重构多语言想跟大家聊一下多语言切换,多语言切换对于一款国际化App来讲是重中之重,并非难事,但是若要做好也是一件不容易的事情。
当我们做了系统的配置更改,比如说切换了系统导航或者说更改了深色模式,那么我们一般的处理是也是要对Application作出处理。
如果项目中有用到ApplicationContext去getString(@StringRes int id)实现加载的提示语,那么如果只是单纯的重启界面则无法让当前的提示语跟随当前切换的语言,所以我们要么重启整个应用,要么对ApplicationContext中的Local也作出相应的更新方可,这里有一点问题,虽然Android N之后updateConfiguration是过时方法,官方给出使用createConfigurationContext代替,但是更新ApplicationContext的Local发现无效使用老版本updateConfiguration正常。
如果你发现你的应用广播通知栏适配无效,那就是context中的Local在切换语言是并未及时更新Local,这里调试一下便知,如果是Applicaiton注册的广播,那么多半情况下是没有更新ApplicationContext的Local所导致的。
多语言适配基本步骤大概就是如此了,下面看一下适配的细节问题。
[图片上传失败...(image-b42d06-1640685147639)]
还有一点Android N之后,手机系统的语言配置选项已经不是单选了,改为一个列表了,具体可以参考手机设置中的语言和输入法,所以 setLocal(@Nullable Locale loc) 方法建议不要再使用了,我相信很多人还在用,正确的用法应该是 setLocals(@Nullable LocaleList locales) ,需要传递一个集合。
当你的应用使用的是androidx.appcompat:appcompat:1.2.0及以上时,BaseActivity中需要实现下面方法。
这套方案目前不在推荐,直接去替换attatchBaseContext()中的context则可,经过测试是完全正常的。
以下则是多语言操作的工具类,现在提供出来,需要的朋友可以自行进行改造。
Q2: Android 多语言适配
关于多语言适配
在日常的开发过程中我们经常会遇到多语言适配的需求。为了避免很久没做遗忘了,然后每次都去网上百度。
所以在这里我先做个记录。
1:首先我们右键 res目录》new》Android Resource Directory
2:我们在弹出来的对话框中最左侧选择Locale,然后单击对话框中间》箭头。
3:在language对话框中选择你要适配的语言
4:在Specific Region Only 对话框中选中你要适配的语言,然后点击OK
5:你就会发现此时res目录下已经多了一个 values-你选择的语言的资源目录
Q3: Android国际化之多语言(配置及应用内设置)✈️
Android系统通过判断当前系统的Local配置,来使用对应的strings.xml文件
values--strings.xml 默认语言(简体中文)
values-zh-rHK--strings.xml 繁体中文
values-en--strings.xml 英语
在Android系统中,系统的配置大都通过 Configuration 来管理,包括strings等等。
onCreate() 中注册
onDestroy() 中取消注册
setLanguage() 方法
通过上面的设置,可以实现不重启APP修改语言的效果
以上只是对Android多语言设置的一些小小的总结,可能有理解不周的情况,欢迎给我留言指出?
Q4: Android 内多语言切换实现
网上有很多安卓内多语言切换的文章,我也看了一些,很多都千篇一律,而且还是有问题,我就自己重新改了一下。整好分享给各位同学,废话不多说,我们正式开始
我们在点击切换语言的按钮时候弹窗dialog 然后用户可以选择 简体中文 英文 繁体中文 跟随系统 四种选项 ,这是我们基本的需求
首先我们要在资源文件res目录下面创建多语言的目录文件夹 values values-en values-zh-rTW values-TW 如图所示:
我们适配多语言的只需要在 values values-en values-zh-rTW 这个三个目录下面的string.xml文件里面写入对应的引用的文本即可
我们只需要这样配置就然后在布局的xml文件里面引用可以达到适配多语言的效果 :
具体引用:
切换的dialog实现这个我用原生的AlertDialog 你们自己可以自定义继承系统的Dialog来实现
这里的语言种类获取到的sta是重SharedPreferences 缓存里面获取到的因为需要
SharedPreferences 工具类:
我们在dialog点击事件里发送一个广播通知 用来触发刷新
然我们在baseActivity里面接收广播重启activity 来刷新多语言切换
关于Locale
实现多语言切换用到了Locale。Locale里很多常见国家和地区以及语言,如果我们做常见的语言,可以直接调用系统的,比如Locale.CHINESE。但是这次做的繁体中文的适配,略我坑一下。
繁体中文我们直接在Locale 属性里面传入 zh-rTW 但是切换没有生效 我翻了下源码只有TW的属性配置我就要修改了
问题是,我最开始直接这样写的:
到此我们说明下开头提到到为什么多出了 values-TW目录 是因为我发现在多语言切换更新 Configuration 中的 locale 属性 的时候翻开源码看到繁体中文(泛指港澳台并没有看到zh-rTW的属性配置)
所以目前的解决方案就是用values-TW来替代:
我这边目前是这样处理来兼容繁体中文切换不生效的做法 ,如果你有更好的方案 麻烦留言大家一起探讨。
Android 内多语言的切换网上的文章也挺多的,基本都千篇一律 很多有纰漏 ,这边也是翻了一下源码勉强能够兼容繁体中文, 项目地址
Q5: Android:应用多语言切换,国际化实现
生成多种语言的string.xml,里面放置对应的语言,修改配置(Configuration),重启之后就会加载对应语言的string.xml。
1:在res目录下,生成对应的语言包,比如英语:
在res目录下生成了可看到生成了:
string name="hello"你好/string
英语:
string name="hello"hello/string
之后就可以使用getResource.getString(R.string.hello),这个字符串会加载相对应的配置的语言。
3:修改语言配置
修改语言配置后,需要重新启动进程,并且杀死进程。
1:有些手机是可以在设置里直接切换语言的,这个也就是Configuration改变。用户重新设置系统语言导致应用的语言也会重新设置。Configuration改变,如果在Manifest中不设置android:configChanges忽略掉配置改变,Activity会重新创建,那么我们就可以在Activity的onCreate中,重新修改语言配置。
2:切换语言后,退出应用,重新进来,你会发现又是系统设置的语言。所以需要在Application开启时,需要再次切换语言配置。







