由于公司業(yè)務(wù)需要桃纯,需要實(shí)現(xiàn)印尼版本的國(guó)際化脚草,于是開(kāi)始了入坑和填坑之旅赫悄。
第一步:創(chuàng)建多語(yǔ)言的資源文件
我默認(rèn)的目錄印尼版本,中文簡(jiǎn)體版本放在以-zh-rCN為后綴的目錄下馏慨,下面的各目錄下對(duì)應(yīng)的中文簡(jiǎn)體目錄埂淮,其他語(yǔ)言類推。
- values -> value-zh-rCN
- drawable -> drawable-zh-rCN
- mimap -> mimap-zh-rCN
- raw -> raw-zh-rCN
第二步:把需要多語(yǔ)言的資源文件移到對(duì)應(yīng)的目錄下
如果之前就中文寫(xiě)在strings 文件中写隶,就可以省了好多工夫倔撞,所以平時(shí)養(yǎng)成好的編程習(xí)慣是有必要。
第三步:切換到我們?cè)O(shè)置的語(yǔ)言
新建一個(gè)語(yǔ)言工具類:LanguageSpUtils慕趴,實(shí)現(xiàn)下面方法
//獲取設(shè)置的語(yǔ)言
private static Locale getSetLocale() {
String locale = "in";//簡(jiǎn)單設(shè)置為印尼語(yǔ)
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);
}
/**
* 切換語(yǔ)言
*
* @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);
}
在應(yīng)用的application中oncreate()中調(diào)用設(shè)置語(yǔ)言
@Override
public void onCreate() {
super.onCreate();
//語(yǔ)言切換
LanguageSpUtils.applyChange(this);
}
到這步已經(jīng)切換到我們想要的語(yǔ)言了痪蝇,是不是很簡(jiǎn)單鄙陡,等等別走,下面兩大坑要注意躏啰。
坑1趁矾、webview引起語(yǔ)言變化。
原本是好端端的印尼文頁(yè)面给僵,打開(kāi)一個(gè)h5頁(yè)面后返回后再打開(kāi)其他頁(yè)面毫捣,都變成了中文
解決方法,在application中的LanguageSpUtils.applyChange(this);前面加 new WebView(this).destroy();即:
@Override
public void onCreate() {
super.onCreate();
//語(yǔ)言切換
new WebView(this).destroy();
LanguageSpUtils.applyChange(this);
}
坑2帝际、頁(yè)面橫豎屏發(fā)生變化時(shí)引起語(yǔ)言變化
現(xiàn)象和上面的一樣
解決方法蔓同,在application的onConfigurationChanged方法中重置語(yǔ)言,即:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
LanguageSpUtils.applyChange(this);
}
搞定收工