我们知道,建好一个android 的项目后,默认的res下面 有layout、values、drawable等目录。这些都是程序默认的资源文件目录,如果要实现多语言版本的话,我们就要添加要实现语言的对应的资源文件。步骤如下:
1)创建本地文件夹和字符串文件
为了支持更多语言,在res/中创建其他的values扩展的文件夹,并在文件夹名后加上一个横线和国家的ISO码。例如,values-es/就是包含代码为"es"的资源文件夹。Android在运行时根据设置加载合适的资源。一旦你觉得了需要支持的语言,就可以创建资源的子文件夹和字符串文件了。例如:
MyProject/
res/
values/
strings.xml
values-es/
string.xml
values-fr/
string.xml
把字符串值添加到合适的文件中,在运行时,Android根据本地用户的设置来使用合适的字符串资源。例如,下面是不同语言对应的不同的字符串:
英语(默认),/values/string.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="title">My Application</string> <string name="hello_world">Hello World!</string> </resources>
西班牙语, /values-es/strings.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="title">Mi Aplicación</string> <string name="hello_world">Hola Mundo!</string> </resources>
法语,/values-fr/strings.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="title">Mon Application</string> <string name="hello_world">Bonjour le monde !</string> </resources>
android多国语言文件夹文件汇总如下:
Arabic, Egypt (ar_EG) -----------------------------阿拉伯语,埃及
Arabic, Israel (ar_IL) -------------------------------阿拉伯语,以色列
Bulgarian, Bulgaria (bg_BG) ---------------------保加利亚语,保加利亚
Catalan, Spain (ca_ES) ---------------------------加泰隆语,西班牙
Czech, Czech Republic (cs_CZ) -----------------捷克语,捷克共和国
Danish, Denmark(da_DK) ------------------------丹麦语,丹麦
German, Austria (de_AT) -------------------------德语,奥地利
German, Switzerland (de_CH) -------------------德语,瑞士
German, Germany (de_DE) ----------------------德语,德国
German, Liechtenstein (de_LI) ------------------德语,列支敦士登的
Greek, Greece (el_GR) ----------------------------希腊语,希腊
English, Australia (en_AU) -------------------------英语,澳大利亚
English, Canada (en_CA) --------------------------英语,加拿大
English, Britain (en_GB) ----------------------------英语,英国
English, Ireland (en_IE) -----------------------------英语,爱尔兰
English, India (en_IN) --------------------------------英语,印度
English, New Zealand (en_NZ) ---------------------英语,新西兰
English, Singapore(en_SG) --------------------------英语,新加坡
English, US (en_US) -----------------------------------英语,美国
English, Zimbabwe (en_ZA) --------------------------英语,津巴布韦
Spanish (es_ES) ----------------------------------------西班牙
Spanish, US (es_US) -----------------------------------西班牙语,美国
Finnish, Finland (fi_FI) ---------------------------------芬兰语,芬兰
French, Belgium (fr_BE) -------------------------------法语,比利时
French, Canada (fr_CA) -------------------------------法语,加拿大
French, Switzerland (fr_CH) --------------------------法语,瑞士
French, France (fr_FR) --------------------------------法语,法国
Hebrew, Israel (he_IL) ---------------------------------希伯来语,以色列
Hindi, India (hi_IN) -------------------------------------印地语,印度
Croatian, Croatia (hr_HR) ----------------------------克罗地亚语,克罗地亚
Hungarian, Hungary (hu_HU) ------------------------匈牙利语,匈牙利
Indonesian, Indonesia (id_ID) ------------------------印尼语,印尼
Italian, Switzerland (it_CH) ----------------------------意大利语,瑞士
Italian, Italy (it_IT) ---------------------------------------意大利语,意大利
Japanese (ja_JP) ----------------------------------------日语
Korean (ko_KR) ------------------------------------------朝鲜语
Lithuanian, Lithuania (lt_LT) --------------------------立陶宛语,立陶宛
Latvian, Latvia (lv_LV) ---------------------------------拉托维亚语,拉托维亚
Norwegian-Bokmol, Norway(nb_NO) ---------------挪威语,挪威
Dutch, Belgium (nl_BE) --------------------------------荷兰语,比利时
Dutch, Netherlands (nl_NL) ---------------------------荷兰语,荷兰
Polish (pl_PL) -------------------------------------------波兰
Portuguese, Brazil (pt_BR) ---------------------------葡萄牙语,巴西
Portuguese, Portugal (pt_PT) ------------------------葡萄牙语,葡萄牙
Romanian, Romania (ro_RO) ------------------------罗马尼亚语,罗马尼亚
Russian (ru_RU) ----------------------------------------俄语
Slovak, Slovakia (sk_SK) ------------------------------斯洛伐克语,斯洛伐克
Slovenian, Slovenia (sl_SI) ---------------------------斯洛文尼亚语,斯洛文尼亚
Serbian (sr_RS) ----------------------------------------塞尔维亚语
Swedish, Sweden (sv_SE) ----------------------------瑞典语,瑞典
Thai, Thailand (th_TH) --------------------------------泰语,泰国
Tagalog, Philippines (tl_PH) --------------------------菲律宾语,菲律宾
Turkish, Turkey (tr_TR) -------------------------------土耳其语,土耳其
Ukrainian, Ukraine (uk_UA) --------------------------联合王国
Vietnamese, Vietnam (vi_VN) -----------------------越南语,越南
Chinese, PRC (zh_CN)--------------------------------中文,中国
Chinese, Taiwan (zh_TW)-----------------------------中文,台湾
2)使用字符串资源
使用字符资源有以下两种方法:
1、在xml文件中,采用@string/<string_name>来引用字符串属性,例如:
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
2、在源代码中,可以使用语句R.string.<string_name>来引用字符串资源,例如:
// Get a string resource from your app's Resources String hello = getResources().getString(R.string.hello_world); // Or supply a string resource to a method that requires a string TextView textView = new TextView(this); textView.setText(R.string.hello_world);
自定义语言选择列表,并实现语言切换的实例如下:
1、自定义语言列表
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="language_choice"> <item>@string/language_CN</item> <item>@string/language_EN</item> <item>@string/language_ES</item> <item>@string/language_FR</item> </string-array> </resources>
2、定义语言选择对话框,并监听点击事件
case R.id.title_setting: final String[] language = mContext.getResources().getStringArray(R.array .language_choice); final SharedPreferences sharedPreferences = mContext.getSharedPreferences ("language_choice", mContext.MODE_PRIVATE); final int id = sharedPreferences.getInt("id", 0); final AlertDialog.Builder builder = new AlertDialog.Builder(mContext); builder.setTitle(R.string.language_chioce_title); builder.setSingleChoiceItems(language, id, new DialogInterface .OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case 0: // default language_id = 0; break; case 1: language_id = 1; // english break; case 2: language_id = 2; // spanish break; case 3: // french language_id = 3; break; default: //default language_id = 0; break; } sharedPreferences.edit().putInt("id", language_id).commit(); } }); builder.setPositiveButton(R.string.language_save, new DialogInterface .OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ((Activity)mContext).finish(); Intent intent=new Intent(); intent.setClass(mContext,ClientActivity.class); mContext.startActivity(intent); setLanguage();// 必须加上,否者不会更新语言 } }); builder.show(); break;
其中,setLanguage()的代码为
private void setLanguage() { Resources resources=getResources(); final SharedPreferences sharedPreferences=getSharedPreferences("language_choice", mContext .MODE_PRIVATE); language_id = sharedPreferences.getInt("id", 0); Log.e(TAG,"id=="+language_id); // 获取应用内语言 final Configuration configuration=resources.getConfiguration(); // Locale locale=configuration.locale; DisplayMetrics displayMetrics=resources.getDisplayMetrics(); switch (language_id){ case 0: configuration.locale=Locale.getDefault(); break; case 1: configuration.locale=Locale.SIMPLIFIED_CHINESE; break; case 2: configuration.locale=Locale.ENGLISH; break; case 3: configuration.locale=new Locale("es"); break; case 4: configuration.locale=Locale.FRENCH; break; default: configuration.locale=Locale.getDefault(); break; } Log.e(TAG,"configuration=="+configuration.locale); mContext.getResources().updateConfiguration(configuration,displayMetrics); }
3、在MainActivity中实现语言切换
调用setLanguage() 即可。
注:在该部分代码中,出现一种很奇怪的问题,就是保存的数据在下次应用程序启动时,该app的语言仍然是系统默认的而不是自己上次设置的,查看代码发现在调用mContext.getResources().updateConfiguration(configuration,displayMetrics);后,系统中
updateConfiguration(Configuration config, DisplayMetrics metrics, CompatibilityInfo compat)函数的处出现“can not find the local variable 'config' ”,
这个问题困扰好久,至今仍在寻找问题所在???
出现该问题的原因是:我在重启应用时,在mainActivity中通过SharedPreferences 读取配置信息,此时应用程序已经启动,虽然调用了setLanguage()但是并未实现语言的更改。
解决办法是:创建一个应用程序myApplication,并继承Application。然后在onCreate()方法中调用setLanguage();同时需要在AndroidManifest.xml中加上android:configChanges="locale",并添加权限<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/>。具体代码如下:
(1)创建myApplication
public class myApplication extends Application { private String TAG=myApplication.class.getSimpleName(); private Context mContext; @Override public void onCreate() { super.onCreate(); mContext=this; setLanguage(); }
(2) 修改AndroidManifest.xml文件
<application android:allowBackup="true" android:name="com.snow.myApplication.myApplication" android:icon="@drawable/logo" android:label="@string/app_name" android:configChanges="locale" android:theme="@android:style/Theme.NoTitleBar"> <activity android:name="com.snow.activitys.***Activity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
(3) 添加权限
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/>
至此修改应用的语言完美实现。