- 语言的适配(local的适配)
应用中文本的适配
用到的涉及文字的图片需要替换
对整体UI进行适配修改(不同的语言Ui效果是不同的)
- 图片和UI适配没有什么难度,此处主要讨论文本字串的替换,文本字串的替换分为三个层次:
修改系统的语言设置,ap的涉及文本的页面刷新
上面基础上,添加应用内设置(控制语言的变化),此处设置可以修改系统的设置
和2相似,只是应用内设置只会修改本ap,不会修改手机设置(这样更合理)
- 针对上面3种情况逐一分析解决办法:
修改系统的语言设置,ap的涉及文本的页面刷新
ap文本随着系统的语言变化,在res文件夹下提供多个value-locale文件夹,文件夹内部string.xml提供具体locale对应语言的字串即可。
此时需要注意,页面activity是否随着locale变化重走生命周期是可以配置的,即:
4.2以前的系统:android:configChanges="locale"即可,系统locale发生改变,页面activity不在重走生命周期,而是走activity的onconfigchange()api。
4.2及其以后的系统,在上面的基础上还需要加一个配置,即:android:configChanges="locale|layoutDirection"
多数情况下不建议重走生命周期,即可以通过下面方式对页面进行刷新:
是否重走生命周期按需求决定,由于重走生命周期性能也有影响。
ap内部设置语言同时修改系统(手机)的语言设置:
系统把涉及到系统修改的api都隐藏了,即对外不提供调用,也是不让外在的应用修改系统的设置。
可以使用api欺骗和反射两种方式获取到系统设置的api,在当前应用中调用修改系统的设置,实现方式可以参考下面的文章
这个需求一般不会存在,还有就是隐藏的api具有不稳定性和系统的不兼容性所以不建议使用这两种方式
还有这两种方法有可能在一些高版本的系统出现权限异常是因为4.2系统以后不允许外在应用修改系统设置,可以尝试设置application( android:sharedUserId="android.uid.system")让外在应用成为系统级应用,不一定管用。
ap内部设置语言但是不修改系统设置:
两种实现
在不同的Locale文件夹中提供不同语言的文本
通过Configuration的Locale设置当前应用的Locale,具体的设置方法如下:
上面只是设置了当前ap的资源Locale,并没有刷新当前的页面所以针对需求还需要补充完善即:
未来加载的页面不需要处理
针对当前已加载页面,需要手动去刷新页面(按钮,文本,内容等)
通过广播,针对已加载的页面去判断是否修改Locale去过已修改去刷新
在页面的onresume周期方法中去判断是否修改Locale去过已修改去刷新
可以借助sharereference记录当前ap的locale和是否发生变化等还有就是建议提供父Activity和父Fragment去处理Locale的变化即:
第二种实现相对麻烦繁琐:
不需要再文件夹中处理Locale,在value中提供一个string.xml文件即可
在文件中提供相应的语言String后缀即:比如test的一个文本,中文版本为:name_cn=“测试”,英文版本:name_eg = "test",其他依次类推
借助sharereference记录Locale对应的语言标识符,在设置里面去进行相应的设置
提供utils类对于本地文本,图片等资源字符串进行拼接
这种方法同样存在无法刷新页面的问题,此时需要手动的去刷新即:
通过广播,针对已加载的页面去判断是否修改Locale去过已修改去刷新
在页面的onresume周期方法中去判断是否修改Locale去过已修改去刷新
-
语言环境和语言文件夹对比
中文(中国):values-zh-rCN 中文(台湾):values-zh-rTW 中文(香港):values-zh-rHK 英语(美国):values-en-rUS 英语(英国):values-en-rGB 英文(澳大利亚):values-en-rAU 英文(加拿大):values-en-rCA 英文(爱尔兰):values-en-rIE 英文(印度):values-en-rIN 英文(新西兰):values-en-rNZ 英文(新加坡):values-en-rSG 英文(南非):values-en-rZA 阿拉伯文(埃及):values-ar-rEG 阿拉伯文(以色列):values-ar-rIL 保加利亚文: values-bg-rBG 加泰罗尼亚文:values-ca-rES 捷克文:values-cs-rCZ 丹麦文:values-da-rDK 德文(奥地利):values-de-rAT 德文(瑞士):values-de-rCH 德文(德国):values-de-rDE 德文(列支敦士登):values-de-rLI 希腊文:values-el-rGR 西班牙文(西班牙):values-es-rES 西班牙文(美国):values-es-rUS 芬兰文(芬兰):values-fi-rFI 法文(比利时):values-fr-rBE 法文(加拿大):values-fr-rCA 法文(瑞士):values-fr-rCH 法文(法国):values-fr-rFR 希伯来文:values-iw-rIL 印地文:values-hi-rIN 克罗里亚文:values-hr-rHR 匈牙利文:values-hu-rHU 印度尼西亚文:values-in-rID 意大利文(瑞士):values-it-rCH 意大利文(意大利):values-it-rIT 日文:values-ja-rJP 韩文:values-ko-rKR 立陶宛文:valueslt-rLT 拉脱维亚文:values-lv-rLV 挪威博克马尔文:values-nb-rNO 荷兰文(比利时):values-nl-BE 荷兰文(荷兰):values-nl-rNL 波兰文:values-pl-rPL 葡萄牙文(巴西):values-pt-rBR 葡萄牙文(葡萄牙):values-pt-rPT 罗马尼亚文:values-ro-rRO 俄文:values-ru-rRU 斯洛伐克文:values-sk-rSK 斯洛文尼亚文:values-sl-rSI 塞尔维亚文:values-sr-rRS 瑞典文:values-sv-rSE 泰文:values-th-rTH 塔加洛语:values-tl-rPH 土耳其文:values--r-rTR 乌克兰文:values-uk-rUA 越南文:values-vi-rVN