前言
关于Android国际化,我们都知道是要values-xx来建立多个国家的系统语言,但是实际中需求往往各种各样,例如收入登录设置默认系统语言、动态修改语言环境等。
参考图如下
工具类
贴下工具类
一 获取系统语言
/**
* 获取当前的语言
* @param context
* @return lang
*/
public static String getLang(Context context){
Resources res = context.getResources();
//应用当前语言
String currLang = res.getConfiguration().locale.getLanguage();
return currLang;
}
二 设置系统语言
/**
* 设置应用语言
*
* @param lang 要设置的语言,如:zh、en,目前只支持中文和英文,其它的请自行添加
*/
public static void setLang(Context context, String lang) {
Resources res = context.getResources();
//应用当前语言
String currLang = res.getConfiguration().locale.getLanguage();
//当前语言和用户语言不一致时更改应用的当前语言
if (!currLang.equals(lang)) {
//设置应用语言类型
Configuration config = res.getConfiguration();
DisplayMetrics dm = res.getDisplayMetrics();
config.locale = new Locale(lang);
一般中英法等常用文直接用Locale类列好的 有些是还没有列出来的 如印地语 需要自己手动new
//config.locale = Locale.ENGLISH;
res.updateConfiguration(config, dm);
}
}
Locale类没有的需要自己 config.locale=new Locale(lang);
外部调用
需要重启Activity才有效。在setContentview之前调用才有效的。
Utils.setLang(mContext,"Hi"); //我这里设置印度语
Intent intent=new Intent(mContext,TvodActivty.class);
startActivity(intent);
首次进入App动态设置指定语言环境
如需首次登陆APP即切换语言我们在setContentView(layout)之前设置环境语言即可
@Override
public int getLayoutID() {
Utils.setLang(mContext,"en");
return R.layout.activity_select;
}
遇到的坑
1.Activity横竖屏切换后。操作如下:1.竖屏--->横屏 横屏返回竖屏。
设置的语言会失效。
解决办法是重新变回竖屏的时候,重新设置一次语言。如下:
/**
* 就算你在Manifest.xml设置横竖屏切换不重走生命周期。横竖屏切换还是会走这里
*/
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.d(TAG, "onfinfig livedeatil current " + tablayout_position+" lang:"+lang);
if (!"".equals(lang)) {
Utils.setLang(this, lang);
}
if (newConfig.orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
//do something
}else if(newConfig.orientation == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE){
}
}
2.ActivityA的Fragment ---->(跳转) ActivityB,ActvityB进行横竖屏切换。然后finish,返回ActivityA的Fragment。
此时动态设置的语言环境也无效。
解决办法:
@Override
protected void onRestart() {
super.onRestart();
String lang_new = Utils.getLang(mContext);
if(!"".equals(lang)&&!lang.equals(lang_new)){
Utils.setLang(mContext,lang);
}
Log.i("logfragment", "onrestart aty "+lang);
}
Locale类国家参考
*/
static public final Locale ENGLISH = createConstant("en", "");
/** Useful constant for language.
*/
static public final Locale FRENCH = createConstant("fr", "");
/** Useful constant for language.
*/
static public final Locale GERMAN = createConstant("de", "");
/** Useful constant for language.
*/
static public final Locale ITALIAN = createConstant("it", "");
/** Useful constant for language.
*/
static public final Locale JAPANESE = createConstant("ja", "");
/** Useful constant for language.
*/
static public final Locale KOREAN = createConstant("ko", "");
/** Useful constant for language.
*/
static public final Locale CHINESE = createConstant("zh", "");
/** Useful constant for language.
*/
static public final Locale SIMPLIFIED_CHINESE = createConstant("zh", "CN");
/** Useful constant for language.
*/
static public final Locale TRADITIONAL_CHINESE = createConstant("zh", "TW");
/** Useful constant for country.
*/
static public final Locale FRANCE = createConstant("fr", "FR");
/** Useful constant for country.
*/
static public final Locale GERMANY = createConstant("de", "DE");
/** Useful constant for country.
*/
static public final Locale ITALY = createConstant("it", "IT");
/** Useful constant for country.
*/
static public final Locale JAPAN = createConstant("ja", "JP");
/** Useful constant for country.
*/
static public final Locale KOREA = createConstant("ko", "KR");
/** Useful constant for country.
*/
static public final Locale CHINA = SIMPLIFIED_CHINESE;
/** Useful constant for country.
*/
static public final Locale PRC = SIMPLIFIED_CHINESE;
/** Useful constant for country.
*/
static public final Locale TAIWAN = TRADITIONAL_CHINESE;
/** Useful constant for country.
*/
static public final Locale UK = createConstant("en", "GB");
/** Useful constant for country.
*/
static public final Locale US = createConstant("en", "US");
/** Useful constant for country.
*/
static public final Locale CANADA = createConstant("en", "CA");
/** Useful constant for country.
*/
static public final Locale CANADA_FRENCH = createConstant("fr", "CA");
国家地区语言缩写代码
中文(中国):values-zh-rCN
中文(台湾):values-zh-rTW
中文(香港):values-zh-rHK
英语(美国):values-en-rUS
英语(英国):values-en-rGB
英文(澳大利亚):values-en-rAU
英文(加拿大):values-en-rCA
英文(爱尔兰):values-en-rIE
英文(印度):values-en-rIN
英文(新西兰):values-en-rNZ
英文(新加坡):values-en-rSG
英文(南非):values-en-rZA
阿拉伯文(埃及):values-ar-rEG
阿拉伯文(以色列):values-ar-rIL
保加利亚文: values-bg-rBG
加泰罗尼亚文:values-ca-rES
捷克文:values-cs-rCZ
丹麦文:values-da-rDK
德文(奥地利):values-de-rAT
德文(瑞士):values-de-rCH
德文(德国):values-de-rDE
德文(列支敦士登):values-de-rLI
希腊文:values-el-rGR
西班牙文(西班牙):values-es-rES
西班牙文(美国):values-es-rUS
芬兰文(芬兰):values-fi-rFI
法文(比利时):values-fr-rBE
法文(加拿大):values-fr-rCA
法文(瑞士):values-fr-rCH
法文(法国):values-fr-rFR
希伯来文:values-iw-rIL
印地文:values-hi-rIN
克罗里亚文:values-hr-rHR
匈牙利文:values-hu-rHU
印度尼西亚文:values-in-rID
意大利文(瑞士):values-it-rCH
意大利文(意大利):values-it-rIT
日文:values-ja-rJP
韩文:values-ko-rKR
立陶宛文:valueslt-rLT
拉脱维亚文:values-lv-rLV
挪威博克马尔文:values-nb-rNO
荷兰文(比利时):values-nl-BE
荷兰文(荷兰):values-nl-rNL
波兰文:values-pl-rPL
葡萄牙文(巴西):values-pt-rBR
葡萄牙文(葡萄牙):values-pt-rPT
罗马尼亚文:values-ro-rRO
俄文:values-ru-rRU
斯洛伐克文:values-sk-rSK
斯洛文尼亚文:values-sl-rSI
塞尔维亚文:values-sr-rRS
瑞典文:values-sv-rSE
泰文:values-th-rTH
塔加洛语:values-tl-rPH
土耳其文:values–r-rTR
乌克兰文:values-uk-rUA
越南文:values-vi-rVN
参考
demo代码下载