背景

最近项目在适配7.0系统的时候发现一些问题,其中也有多语言适配的问题,就拿出来说说,记记笔记,填填坑。

问题1

因为刚接手项目不久,发现一些奇奇怪怪的bug总是让人头疼,最近发现了在华为荣耀7.0系统上App语言变为繁体,本来以为是荣耀7.0的bug,后来试了下其他的app没有这个问题,于是从app内部找问题,后来发现在android7.0 SDK中LocaleExtensions这个对象,在荣耀7.0系统上和7.0以下通过

Locale.getDefault().toString()

获取到的结果分别是

zh-CH#hans

zh-CH

所以当在荣耀7.0系统通过

Locale.getDefault().equals(Locale.SIMPLIFIED_CHINESE)

结果当然是false

问题2

在Android7.0及以上的系统,假设系统语言设置为简体中文(中国),繁体中文(香港),繁体中文(台湾),那么默认情况下通过LocleList.getDefault()获取到的语言列表为

[zh_CN_#Hans,zh_HK_#Hant,zh_TW_#Hant]

这时通过

getResources().getConfiguration().getLocales().get(0)

获取到的默认语言为简体中文,然后在App中设置了应用的语言为繁体中文(香港),那么获取到的语言列表将变为

[zh_HK_#Hant,zh_CN_#Hans,zh_HK_#Hant,zh_TW_#Hant]

这时再设置App的语言为跟随系统,结果获取到的语言列表仍然是

[zh_HK_#Hant,zh_CN_#Hans,zh_HK_#Hant,zh_TW_#Hant]

就是说用户手动设置了app的语言后,会在系统默认语言列表的头部增加一个语言,所以通过

getResources().getConfiguration().getLocales().get(0)

获取到的默认语言就是用户之前手动设置的那种语言,而不是系统默认的语言。

解决

问题一的解决方法是通过getLanguage(),getCountry()来判断

问题二的解决方法是先保存系统默认的LocalelList

下面直接贴上代码

/**

* Created by xieye on 2017/8/15.

*/

public class LanguageHelper {

public static final String SIMPLIFIED_CHINESE = "zh-CN";

public static final String TRADITIONAL_CHINESE = "zh-TW";

private static LanguageHelper lHelper;

private Locale mLocale;

private LocaleList mLocaleList;

private LanguageHelper() {

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {

mLocaleList = LocaleList.getDefault();

}

}

public static LanguageHelper getHelper() {

synchronized (LanguageHelper.class) {

if (lHelper == null) {

lHelper = new LanguageHelper();

}

}

return lHelper;

}

/**

* 由于7.0系统 多语言设置是由LocaleList处理

* 所以要针对7.0系统做适配

**/

public Locale getDefault() {

if (mLocale != null) {

return mLocale;

}

Locale locale;

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {

if (mLocaleList != null && mLocaleList.size() > 0) {

locale = mLocaleList.get(0);

} else {

mLocaleList = LocaleList.getDefault();

locale = GGBookApplication.getAppContext().getResources().getConfiguration().getLocales().get(0);

}

} else {

locale = GGBookApplication.getAppContext().getResources().getConfiguration().locale;

}

String language = locale.getLanguage() + "-" + locale.getCountry();

if (SIMPLIFIED_CHINESE.equals(language)) {

mLocale = Locale.SIMPLIFIED_CHINESE;

} else if (TRADITIONAL_CHINESE.equals(language)) {

mLocale = Locale.TRADITIONAL_CHINESE;

} else mLocale = Locale.getDefault();

return mLocale;

}

public void clear() {

mLocale = null;

}

}

随手丢个工具

Android Studio 翻译插件AndroidLocalize

File->Settings->Plugins->Browse Repositories,搜索AndroidLocalize,进行install安装,然后重启Android Studio

资源文件一定要是strings.xml

598e31ba4c47?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image

既然看到这了,不如给个..诶别走啊,给个赞啊

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐