语言切换

Posted 张先森的云

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了语言切换相关的知识,希望对你有一定的参考价值。

自定义控件系列结束了,打个回马枪,补上前段时间埋下的一个坑---“应用内语言切换”。APP语言改变是一个Configuration,但是这个Configuration和android手机屏幕旋转有点不大一样。屏幕旋转的时候,会destroy当前页面,并进行重新绘制。而切换语言后不会重新绘制页面,所以这种情况的出现造成了网上的一知半解小伙伴们哀声一片,不是在咒骂api的坑爹,就是在卖力的另辟蹊径想尽办法解决问题。思路都是很好的,目的也是坚决的,可是方向是错误的,把哥哥我也给带进了坑了,爬了好久才爬出这个深坑。所以今天在此把经验分享出来,希望以后大家不要和我踩到一个坑里。

简单介绍下这个需求的缘由,前段时间因公司业务需要,做了一款即时通讯软件。在这款应用里面有个设置页面,其中有一项“语言切换”功能,就是在使用APP的过程中,动态的去切换APP的语言,具体参照微信设置页面。起先想来是很简单的事情嘛,不就是个简单的资源国际化嘛,strings.xml资源文件一整还不给OK?真正动起手来就真不是这么一回事了,国际化是没问题,但是怎样能更改所有页面的文字资源呢,这是一个问题。下面介绍下网上找的几个方案。

一、API欺骗
    烧制到手机中的android.jar包含了Android所需的各种类与方法;而供开发者使用的android.jar只是其中的一部分。API欺骗是指在应用中去模拟未公开的类和方法让应用编译通过并生成APK,然而在应用实际运行中调用的却仍是烧制到手机中真实的android.jar。

二、使用Java反射机制

    IActivityManager与ActivityManagerNative都是非公开类,使用Java反射去调用其中的方法。


但是这个弊端是显而易见的,上述两种方法都是去更改系统的语言的类型,功能和你去设置页面去设置语言类型的效果一样。发现对当前系统设置了新的Locale后,不单自己的应用语系改变了,系统所有的应用语系都改变了。这肯定是不合理的。或许你会说,在退出app的时候,大不了再把语言给改回来呗。可是在Android里面,杀死APP的原因多种多样,有内存杀,有用户强杀,有滑动侧滑杀,你又能如何判断APP是何时被Kill的呢。下面介绍下我的解决方案,实现的效果还是不错的。依旧Github代码地址在最下方,有兴趣的同学可以去下载看下。

第一步、使用Android开放的api更改Configuration,同时把语言类型保存下来

第二步、Destroy当前页面,重新绘制才能更改语言类型

如果你的页面不是首页,你调用上述代码只会更新当前页面,压在栈中的Activity依然不会更新界面。比如微信设置语言成功后,会自动跳转到首页,当然首页的内容也是更新后的,它的实现方式也很简单,与我们上面写的大同小异。就是监听设置成功后,destroy所有存在的页面,再跳转到首页。这时你的app就能满足了上面的需求了,可是别急还有第三步。

第三步、只要你的应用不彻底从Dalvik或者ART中彻底移除,上述都没问题。但是如果重新开机,或者强制杀掉应用,再次启动,就恢复到以前的语言类型了。

以上是关于语言切换的主要内容,如果未能解决你的问题,请参考以下文章

[Android]应用语言切换的三种方法

世界各国语言用英语怎么说

修改linux系统显示语言

[从头读历史] 第281节 始制文字 世界上的语系及语言

达观数据:综述中英文自然语言处理的异和同

《自然语言处理实战入门》:汉语语言学简介