最近在做的软件要做多语言切换,发现一系列问题,在此记录一下:
第一、简体和繁体转换。
有必要提供繁体翻译,如果不提供的话如何用户系统设置为繁体的情况下就会显示英文,这样对用户很不友好。其实转换一下很简单。
使用这个工具 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;
}
网友评论