我们知道,建好一个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. ubuntu下某些文件目录

    1.#include <stdio.h> 2.#include <stdlib.h> stdio.h和stdlib.h的路径:/usr/include

  2. 矩阵乘法加速fib数列

    考虑矩阵(1,1)(1,0) #include<cstdio> #include<cstring> #include<iostream> using namespa ...

  3. mybatis 源码学习(二)sqlsession

    mybatis 中的sqlsession是一个非常重要的类.上篇我们分析了sessionfactory初始化配置文件,我们继续分析sessionfactory拿到会话进行的操作. 看这里.getMap ...

  4. 【Todo】Java学习路线(方向指导)

    在网上搜了下Java学习路线(关键词:学习,因为众所周知,实践出牛人,在平时工作不怎么深入的情况下,才强调学习的方向的重要性 ^_^) 发现下面知乎这个回答写的真好.mark如下: https://w ...

  5. inputclean插件的使用方法

    inputclean插件的使用方法 语言:javascript 是jquery插件, 目的:给文本框添加×,点击×,就可以清空文本框内容. 如图: 详细交互效果: 1,当文本框聚焦时,×永久显示,无论 ...

  6. serialVersionUID的作用以及如何用idea自动生成实体类的serialVersionUID

    转载:http://blog.csdn.net/liuzongl2012/article/details/45168585 serialVersionUID的作用: 通过判断实体类的serialVer ...

  7. ARC forbids Objective-C objects in structs or unions

    解决方法有二种: 1.在出错的地方加入__unsafe_unretained 2.关闭系统ARC.1.点击project   2.点击Build Setting    3.找到其以下的Objetive ...

  8. 翻翻git之---有用的欢迎页开源库 AppIntro

    转载请注明出处:王亟亟的大牛之路 今天没有P1.直接进入正题 今天上的是一个帅帅的app滑动介绍页 . 为什么说帅? 作者对自己的内容是这么定义的 Make a cool intro for your ...

  9. jquery的一点点认识

    概述 JQuery是继prototype之后又一个优秀的Javascript库.它是轻量级的js库 .它兼容CSS3,还兼容各种浏览器(IE 6.0+, FF 1.5+, Safari 2.0+, O ...

  10. node.js如何读取MySQL数据

    先安装mysql模块. node.js默认安装时,模块文件放在 /usr/local/lib/node_modules 这个目录下,为了便宜管理,模块还是统一安装到这里好. $ cd /usr/loc ...