安卓中,国际化十分简单。 其实就是文件夹的问题。一般我们分两种情况。
一是app根据系统语言调用对应的资源文件夹,
二是在app里面根据用户的需求来更改语言。
前者比较简单,只需求创建对应国家的strings.xml,然后发在对应的文件夹里面就可以了。
app会根据系统语言选择对应的文件夹资源。(图片资源的国际化也是一样的)
一、语言国际化:
1、创建文件:
2、在相应的文件中写上对应的语言
strings.xml (默认英文)
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name"> Alipay</string>
<string name="device"> device</string>
<string name="add"> add</string>
</resources>
strings.xml(en)
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Alipay</string>
<string name="device"> device</string>
<string name="add"> add</string>
</resources>
strings.xml(zh-rCN)
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name"> 支付宝</string>
<string name="device"> 设备</string>
<string name="add"> 添加</string>
</resources>
**1、自动跟随系统:字符串资源的调用 **
在 Layout XML 调用字符串资源:
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
在 Activity 获取字符串资源:
this.getString(R.string.hello)
从 Context 获取字符串资源:
context.getString(R.string.hello)
从 Application 获取字符串资源:
application.getString(R.string.hello)
二、手动切换:
/**
* 切换英文
*/
public void en(View v){
Resources resources = getResources();// 获得res资源对象
Configuration config = resources.getConfiguration();// 获得设置对象
DisplayMetrics dm = resources.getDisplayMetrics();// 获得屏幕参数:主要是分辨率,像素等。
config.locale = Locale.ENGLISH; // 英文
resources.updateConfiguration(config, dm);
finish();//如果不重启当前界面,是不会立马修改的
startActivity(new Intent(this,MainActivity.class));
}
/**
* 切换中文
*/
public void cn(View v){
Resources resources = getResources();// 获得res资源对象
Configuration config = resources.getConfiguration();// 获得设置对象
DisplayMetrics dm = resources.getDisplayMetrics();// 获得屏幕参数:主要是分辨率,像素等。
config.locale = Locale.CHINA; // 简体中文
resources.updateConfiguration(config, dm);
finish();如果不重启当前界面,是不会立马修改的
startActivity(new Intent(this,MainActivity.class));
}
额外:
Context类中:
public final String getString(int resId) {
return getResources().getString(resId);
}
java引用字符资源的方法,都是getString(),内部调用了getResources().getString(R.string.xx)的方法,为什么不是直接使用R.string.xx呢?
尝试了一下setText(R.string.xx)的方法,也能获取到正确的字符串值,但是如果是setText(R.string.xx + “个”),就会出现字符就会变成一串数字。
原因在于setText()方法有有两种不同的参数int resid和CharSequence text,而R.string.xx是一个自动生成的资源ID,setText(R.string.xx + “个”)就会先将资源ID转成字符串,从而出现一串数字的情况。
二、获取系统语言:
Locale locales1 = newConfig.getLocales().get(0);
String language1 = locales1.getLanguage() + "-" + locales1.getCountry();
Log.e(TAG, "onConfigurationChanged: language1===========" + language1);
Locale locale2;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
locale2 = getResources().getConfiguration().getLocales().get(0);
} else {
locale2 = getResources().getConfiguration().locale;
}
String language2 = locale2.getLanguage() + "-" + locale2.getCountry();
Log.e(TAG, "onConfigurationChanged: language2===========" + language2);
//返回此Java虚拟机实例的默认区域设置
Locale locale3 = Locale.getDefault();
String language3 = locale3.getLanguage() + "-" + locale3.getCountry();
Log.e(TAG, "onConfigurationChanged: language3===========" + language3);
//获取用户实际设置的语言列表
//LocaleList是Locales的一个不可变列表,通常用于保持语言环境的用户首选项的有序列表。
Locale locale4 = LocaleList.getDefault().get(0);
String language4 = locale4.getLanguage() + "-" + locale4.getCountry();
Log.e(TAG, "onConfigurationChanged: language4===========" + language4);
if (locale4.getLanguage().equals("zh")) {
//中文
} else {
//英文
}
Locale locale = getResources().getConfiguration().locale;
String country = locale.getCountry();//区域
String language = locale.getLanguage();//语种
Log.e("111", "====country===" + country);//区域
Log.e("111", "====language===" + language); //语种
//简体中文 ====country===CN ====language===zh
//繁体中文(澳门) ====country===MO ====language===zh
//繁体中文(台湾) ====country===TW ====language===zh
//繁体中文(香港) ====country===HK ====language===zh
//英文(香港) ====country===HK ====language===en
//英文(美国) ====country===US ====language===en
//英文(加拿大) ====country===CA ====language===en
//英文(英国) ====country===GB ====language===en
一般的语言包:values-语种-地区
中文(中国):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