由于公司业务需要,需要实现印尼版本的国际化,于是开始了入坑和填坑之旅。
第一步:创建多语言的资源文件
我默认的目录印尼版本,中文简体版本放在以-zh-rCN为后缀的目录下,下面的各目录下对应的中文简体目录,其他语言类推。
- values -> value-zh-rCN
- drawable -> drawable-zh-rCN
- mimap -> mimap-zh-rCN
- raw -> raw-zh-rCN
第二步:把需要多语言的资源文件移到对应的目录下
如果之前就中文写在strings 文件中,就可以省了好多工夫,所以平时养成好的编程习惯是有必要。
第三步:切换到我们设置的语言
新建一个语言工具类:LanguageSpUtils,实现下面方法
//获取设置的语言
private static Locale getSetLocale() {
String locale = "in";//简单设置为印尼语
String[] array = locale.split("_");
String language = array[0];
if (array.length > 1) {
String country = array[1];
return new Locale(language, country);
}
return new Locale(language);
}
/**
* 切换语言
*
* @param context
*/
public static void applyChange(Context context) {
Locale locale = getSetLocale();
Resources res = context.getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Configuration conf = res.getConfiguration();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
conf.setLocale(locale);
LocaleList localeList = new LocaleList(locale);
LocaleList.setDefault(localeList);
conf.setLocales(localeList);
} else {
conf.setLocale(locale);
}
res.updateConfiguration(conf, dm);
}
在应用的application中oncreate()中调用设置语言
@Override
public void onCreate() {
super.onCreate();
//语言切换
LanguageSpUtils.applyChange(this);
}
到这步已经切换到我们想要的语言了,是不是很简单,等等别走,下面两大坑要注意。
坑1、webview引起语言变化。
原本是好端端的印尼文页面,打开一个h5页面后返回后再打开其他页面,都变成了中文
解决方法,在application中的LanguageSpUtils.applyChange(this);前面加 new WebView(this).destroy();即:
@Override
public void onCreate() {
super.onCreate();
//语言切换
new WebView(this).destroy();
LanguageSpUtils.applyChange(this);
}
坑2、页面横竖屏发生变化时引起语言变化
现象和上面的一样
解决方法,在application的onConfigurationChanged方法中重置语言,即:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
LanguageSpUtils.applyChange(this);
}
搞定收工