我们知道,建好一个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

1 <?xml version="1.0" encoding="utf-8"?>
2 <resources>
3 <string name="title">My Application</string>
4 <string name="hello_world">Hello World!</string>
5 </resources>

西班牙语, /values-es/strings.xml

1 <?xml version="1.0" encoding="utf-8"?>
2 <resources>
3 <string name="title">Mi Aplicación</string>
4 <string name="hello_world">Hola Mundo!</string>
5 </resources>

法语,/values-fr/strings.xml


1 <?xml version="1.0" encoding="utf-8"?>
2 <resources>
3 <string name="title">Mon Application</string>
4 <string name="hello_world">Bonjour le monde !</string>
5 </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>来引用字符串属性,例如:

1 <TextView
2 android:layout_width="wrap_content"
3 android:layout_height="wrap_content"
4 android:text="@string/hello_world" />

2、在源代码中,可以使用语句R.string.<string_name>来引用字符串资源,例如:


1 //  Get a string resource from your app's Resources
2 String hello = getResources().getString(R.string.hello_world);
3
4 // Or supply a string resource to a method that requires a string
5 TextView textView = new TextView(this);
6 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)函数的int density = config.densityDpi;处出现“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"/>  

至此修改应用的语言完美实现。

 
 
 
 

android——实现多语言支持的更多相关文章

  1. Android多语言支持以及各国语言Values文件夹命名规则

    创建好的项目工程由于需求 需要做多国语言的支持  下面介绍怎么快捷的创建文件夹 建好一个android 的项目后,默认的res下面 有layout.values.drawable等目录 这些都是程序默 ...

  2. Android 2.3 不支持印度文

    Android 2.3 不支持印度文(hindi),即使你指定了相关的字符串也不行,它们一律显示为方格. 实际上,你在系统的语言设置界面也可以看到,印度文一行也是被显示为方格(既然是方格,如何知道它是 ...

  3. AIDL —— Android接口定义语言

    AIDL:Android Interface Definition Language,即Android接口定义语言,是Android进程间通信比较常用的一种方式.翻译一下,就是为了让某个Service ...

  4. 分享两种实现Winform程序的多语言支持的解决方案

    因公司业务需要,需要将原有的ERP系统加上支持繁体语言,但不能改变原有的编码方式,即:普通程序员感受不到编码有什么不同.经过我与几个同事的多番沟通,确定了以下两种方案: 方案一:在窗体基类中每次加载并 ...

  5. EnumHelper.cs枚举助手(枚举描述信息多语言支持)C#

    C#里面经常会用到枚举类型,枚举是值类型对象,如果你想用枚举类型的多属性特性,或者你想在MVC页面上通过简单的值类型转换,将某字段值所代表的含义转换为文字显示,这时候必须要将枚举扩展,是它支持文本描述 ...

  6. Android:让WebView支持<input type=”file”…>元素

    最近在做一个活动页面:用户上传一张图片进行缩放.旋转后点击下一步填写内容后生成图片! 做好后经过各种测试是没有问题的,基本没有什么明显BUG,流程都能走通,但是嵌入到APP后,问题就来了! 在IOS上 ...

  7. ios调用系统相册、相机 显示中文标题、本地化多语言支持

    因为调用系统相册.相机需要显示中文,所以搞了半天才知道是在Project->info->Custom ios Target Properties 添加 Localizations 并加入C ...

  8. (视频)《快速创建网站》 3.3 国际化高大上 - WordPress多语言支持

    本文是<快速创建网站>系列的第7篇,如果你还没有看过之前的内容,建议你点击以下目录中的章节先阅读其他内容再回到本文. 访问本系列目录,请点击:http://devopshub.cn/tag ...

  9. android多国语言文件夹文件汇总

    android多国语言文件夹文件汇总如下: 中文(中国):values-zh-rCN 中文(台湾):values-zh-rTW 中文(香港):values-zh-rHK 英语(美国):values-e ...

随机推荐

  1. [Machine Learning with Python] Data Visualization by Matplotlib Library

    Before you can plot anything, you need to specify which backend Matplotlib should use. The simplest ...

  2. FZU 2224 An exciting GCD problem(GCD种类预处理+树状数组维护)同hdu5869

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=2224 同hdu5869 //#pragma comment(linker, "/STACK:1024 ...

  3. QBXT T15214 Day2上午遭遇

    题目描述 你是能看到第一题的 friends呢. -- hja ?座楼房,立于城中 . 第?座楼,高度 ℎ?. 你需要一开始选择座楼,跳. 在第 ?座楼准备跳需要 ??的花费. 每次可以跳到任何一个还 ...

  4. BZOJ 2085 [POI2010] Hamsters

    题面 Description Tz养了一群仓鼠,他们都有英文小写的名字,现在Tz想用一个字母序列来表示他们的名字,只要他们的名字是字母序列中的一个子串就算,出现多次可以重复计算.现在Tz想好了要出现多 ...

  5. Maven转换成Eclipse/Idea/MyEclipse工程,以及配置Web工程

    Eclipse/MyEclipse: //Jar mvn eclipse:eclipse mvn eclipse:myeclipse //Web mvn eclipse:eclipse -Dwtpve ...

  6. 【sublime text3】破解 最近破解码 /激活成功,但是过一会就提示激活码失效的 Build3143

    —– BEGIN LICENSE —– TwitterInc User License EA7E- 1D77F72E 390CDD93 4DCBA022 FAF60790 61AA12C0 A3708 ...

  7. Android 你应该注意的开发规范

    本文由Blankj投稿. Blankjd的博客地址: http://www.jianshu.com/u/46702d5c6978 为了利于项目维护以及规范开发,促进成员之间Code Review的效率 ...

  8. 【转】Windows2008上传大文件的解决方法(iis7解决上传大容量文件)

    2008上传大文件的解决方法:http://wenku.it168.com/d_000091739.shtml 2003上传大文件的解决方法:http://tech.v01.cn/windowsxit ...

  9. Codeforces Round #267 (Div. 2) B. Fedor and New Game

    After you had helped George and Alex to move in the dorm, they went to help their friend Fedor play ...

  10. 用python模拟TCP3次握手连接及发送数据

    源码如下: from scapy.all import * import logging logging.getLogger('scapy.runtime').setLevel(logging.ERR ...