android

Android 7.0多语言适配,填坑日记

2017-08-16  本文已影响364人  tse1y

背景

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

问题1

因为刚接手项目不久,发现一些奇奇怪怪的bug总是让人头疼,最近发现了在华为荣耀7.0系统上App语言变为繁体,本来以为是荣耀7.0的bug,后来试了下其他的app没有这个问题,于是从app内部找问题,后来发现在android7.0 SDK中Locale类中多了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;
    }
}

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

上一篇 下一篇

猜你喜欢

热点阅读