美文网首页
android 7.0以上多语言切换

android 7.0以上多语言切换

作者: readen | 来源:发表于2018-06-15 18:14 被阅读0次

    最近在做的软件要做多语言切换,发现一系列问题,在此记录一下:

    第一、简体和繁体转换。

    有必要提供繁体翻译,如果不提供的话如何用户系统设置为繁体的情况下就会显示英文,这样对用户很不友好。其实转换一下很简单。

    使用这个工具 http://www.hao123.com/haoserver/jianfanzh.htm , 直接把strings.xml内容直接复制上去点击转换就可以了。

    第二、app语言设置和切换。

    这个问题网上有很多答案,不过发现都有问题。resources.updateConfiguration(conf, dm)方法是已经过时了,在高版本系统中不生效。正确的方法是通过重写Application类和Activity类的

    attachBaseContext方法。注意是所有Activity类都要重写,最好是通过BaseActivity继承。

    
    @Override
    
    protected void attachBaseContext(Context newBase) {
    
    Context context = LangContextWrapper.wrap(newBase, AppConfig.getLocale());
    
    super.attachBaseContext(context);
    
    }
    
    

    LangContextWrapper的内容:

    public class LangContextWrapper extends ContextWrapper {
    
        public LangContextWrapper(Context base) {
            super(base);
        }
    
        public static Context wrap(Context context, Locale newLocale) {
    
            Resources res = context.getResources();
            Configuration configuration = res.getConfiguration();
    
            if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {
                configuration.setLocale(newLocale);
    
                LocaleList localeList = new LocaleList(newLocale);
                LocaleList.setDefault(localeList);
                configuration.setLocales(localeList);
    
                context = context.createConfigurationContext(configuration);
    
            } else {
                configuration.setLocale(newLocale);
                context = context.createConfigurationContext(configuration);
    
            }
            return context;
        }
    }
    

    注意网上给个答案是最后一行是return new LangContextWrapper(context) ,这样在Application中使用时,如果使用了其他三方软件的初始化方法比如说极光IM的JMessageClient.init()方法,就可能出现强制转换异常问题。

    设置所需语言,这里仅供参考:

     public static Locale getLocale() {
            if (me().followSystem) {
                if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {
                    return LocaleList.getDefault().get(0);
                } else {
                    return Locale.getDefault();
                }
            }
            return Locale.CHINA;
        }
    

    相关文章

      网友评论

          本文标题:android 7.0以上多语言切换

          本文链接:https://www.haomeiwen.com/subject/xhwmeftx.html