最近公司项目也开始做国际版本,正好我来负责适配,刚开始以为就是简单的新增几套词条资源,更改一下app的语言环境,
然而测试的时候发现,问题太多了,,,,,
百度 Google搜了很多,借鉴了很多适配的方案,目前为止,总算是稳定了很多,记录一下:
1.首先是首次安装获取 手机系统语言,并且给 app 环境也保存个 语言环境,之后 app 的语言就和 手机系统的 没关系了
2.之后每次通过按钮切换语言,保存本地,并且更新页面
3.每次切换语言的时候,通知服务器,用户修改了语言环境,接下来的操作,就是新的语言了
4.我们项目中做了几处地方的修改:(这点不重要)
主动通知服务器 用户更改过后的语言环境,
修改语言之后 公共请求头携带新语言参数(首次安装是按手机系统环境走的)
设置页面 切换语言之后,重建页面,更新语言,并且页面仍保留在当前页面;
正文:
写的很混乱,凑合着理解吧,尽量写的清楚点。。
更新一下:适配8.0
8.0网搜一下 ,语言的初始化和之前的不一样,需要返回个context。
上新一下utils的最新代码;
资源文件 :简写的values 文件夹,如果写成 values-zh-rCN等,5.0 、6.0的手机 有时候会切换失败 语言混乱,debug 模式下,发现引用的资源文件是 默认文件夹下的,改成简写的 就显示正常了。
context引用:util 方法 建议就传当前activity的 context 就可以了。 一个是全局工具类对context的引用,
代码中 对string资源文件的引用,使用 context.getResources().getString()或者getResources().getString() 或者getString()
避免使用全局缓存的context,如果使用 初始化时 application 传给某个全局类的context 可能会出现语言混乱。
哦,这里推荐一篇大佬写的文章,建议看一下了解的深一点
https://mp.weixin.qq.com/s/A27dvFV3glX26Ur0WsdJ9g
测试中发现,通过 下面 getAppLocale()获取到的local,7.0以上版本 华为P20,一加 等 偶尔 出现混乱,锤子 坚果pro 从始至终就没出现过混乱,但是 7.0 以下的 努比亚 小米 三星 大概率出现切换失败,特别是 activity 嵌套 fragment 特别频繁,个别页面切换OK。
/**
* 获取系统local
* @return
*/
public static Locale getSystemLocale() {
Locale locale = Resources.getSystem().getConfiguration().locale;
Log.d(TAG ,"getLanguage : " + Locale.getDefault().getLanguage());
return locale;
}/**
* 获取locale
* @return Locale对象
*/
public static Locale getAppLocale() {
Locale locale;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
locale = LocaleList.getDefault().get(0);
} else {
locale = Locale.getDefault();
}
Log.i(TAG, locale.getLanguage());return locale;
}
/**
* 设置语言 ,网上大部分都是用的这个方法更新的