Android国际化方案实践总结

背景:项目已经基于模块化的方式上线,原项目由于之前赶进度等原因,部分代码中直接插入中文,现需要国际化。

国际化所需要做的事情:

  • 用户系统(国内外手机号的注册)
  • 语言切换

用户系统

这个客户端需要实现的就是注册的支持,

  1. 从服务端拉取‘国家’与‘区号码’,经用户选择,获取验证码,提交服务端处理,问题不大。
  2. 测试验证的话,有开源平台支持国外验证码的获取,可Google。

字符串翻译

重点说下语言切换的思路以及需要注意的点:

  1. 将代码中的中文转移到String文件中,AS快捷键option + enter自动将代码中的字符串转成String资源。

2.创建一个String_module的library模块,将所有strings.xml文件中的资源copy到String_module中,经脚本去重后,进行翻译。

  1. 所有需要翻译字符串的所在模块均添加对String_module的依赖。

  2. 对于Activity/Fragment直接引用String_module的string.xml文件的资源。

  3. 在接口内,我们在实现中传递给接口一个context即可。

  4. class或常量中,我们在String_module中定义一个基于applicationContext的弱引用的context全部变量,添加getString()方法。

internal var globalSharedResourceContext: WeakReference<Context>? = null

fun initGlobalShareResourceContext(context: Application){
    globalSharedResourceContext = WeakReference(context.applicationContext)
}

至此,所有翻译的工作已全部完成。

语言切换

语言切换首先需要明确是否跟随系统。其次本地需要维护App的系统语言的环境变量,可以用SP存储,服务端肯定也要保存一份。

Android系统的语言切换是通过去更新resourcesconfiguration来实现的(对于Activity最终是会触发onConfigurationChanged方法),那么我们肯定需要去获取resources对象,然后生成一个新的configuration去更新就好了。代码如下:

fun updateResourceLocale(context:Context, locale:Locale){
    val newConfig = context.resources.configuration
    if (locale != newConfig.locale){
        newConfig.locale = locale
        context.resources.updateConfiguration(newConfig, resources.displayMetrics)
    }
}

我们知道,获取resource一般通过context去获取,而一个App的context数量是:activity数量 + service数量 + 1(applicationContext),一个context对应获取一个Resource对象(实际是以弱引用的方式管理resource的对象),要修改我们只需要对每个有context对象的Activity/Service/Application去重新修改一些configration就可以。

我们可以将实现封装在BaseActivity中。在基础模块中维护一个模块的全局变量,记录当前App的语言,然后维护该变量修改App的语言以达到我们想要的需求。

Android详细系统语言切换过程分析可参考1 2 3

最后,有一个AS自动化插件AndroidLocalizationer,有兴趣可以了解一下。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,647评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,188评论 19 139
  • 宋冬野出了新歌,《空港曲》。 " 你我登船 送命或寻欢 " 虽犯了那样不可饶恕的错误,出现人生最大的污点。我还是愿...
    E7ernity阅读 2,761评论 0 0
  • 在森林的最深处 不太高明的人儿 奏了一曲现实 我循声觅你 坐守一座空城 你是我夜夜祷读的经诵 我想读懂你 却不尽得...
    wu枫阅读 1,427评论 0 0
  • 我抬头望着天,面前是我称之为家的地方,不知为何,我竟没有一丝归属感;或许是酒精的作用,我觉得自己走路有点东倒西歪,...
    灵琬阅读 2,241评论 0 0

友情链接更多精彩内容