android 应用内切换语言
看到微信可以切换语言,切换语言也就是app国际化问题。我们也都会想到通过改变系统的语言,让app是自己跟随系统走,但是每一台手机系统设置中支持选择的语言,就比较少,比如小米2a:就只有 简体中文,繁体中文,English三种语言,肯定满足不了需求,api中提供了locale 类,实现本地化。下面我们来做个例子:对一个简单的setting界面进行语言切换,切换的语言选择有跟随系统走,中文,英文,阿拉伯文。如下图
1.先去查看下
各国语言缩写-各国语言简称,世界各国域名缩写
2.在工程res文件下添加对应语种的values文件,ar:阿拉伯语, en:英语 zh_rCN: 简体中文
截图如下:
在strings.xml和arrays.xml需要国际化的字符串进行相应得翻译
3.在功能清单文件中对要进行切换acitivity 进行配置
添加
1 |
android:configChanges="locale" |
4.对语言选择的处理
语言选择对话框如下图:
切换语言的关键代码:
//应用内配置语言 Resources resources =getResources();//获得res资源对象 Configuration config = resources.getConfiguration();//获得设置对象 DisplayMetrics dm = resources.getDisplayMetrics();//获得屏幕参数:主要是分辨率,像素等。 config.locale = Locale.SIMPLIFIED_CHINESE; //简体中文 resources.updateConfiguration(config, dm);
刚开始的时候,我在在保存后,就进行语言切换,没有效果,原因是界面资源没有重新加载,参考了微信的方法,就是干掉MainActivity,在重启MainActivity,那就这样干吧! 测试下,还真有效果!
上述代码有一定缺陷,没法对阿拉伯语(相对不常用的语种)就 行不通,Local没有提供相应的常量,问了度娘,也没答案,在网络上看到android2.3以上都支持了阿拉伯语,那就怪啦,最后竟然没有Locale.ar常量,那就new一个呗
1 |
config.locale =new Locale("ar"); |
测试了下,也行!
切换成阿拉伯语效果截图:
5.贴出语言选择对话框 单选选中,保存事件处理代码 和切换语言的代码:
( 1) 单选选中,保存事件处理代码:
String[] languages=context.getResources().getStringArray(R.array.languages); AlertDialog.Builder builder=new AlertDialog.Builder(context); builder.setTitle(R.string.language_choice); final SharedPreferences languagePre=context.getSharedPreferences("language_choice", context.MODE_PRIVATE); final int id=languagePre.getInt("id", 0); builder.setSingleChoiceItems(languages, id, new DialogInterface.OnClickListener(){
@Override public void onClick(DialogInterface arg0, int index) { switch (index) { case 0: //系统默认语言 languageId=0; break; case 1: //简体中文 languageId=1; break; case 2: //英语 languageId=2; break; case 3: //阿拉伯语 languageId=3; break; default: languageId=0; break;
} languagePre.edit().putInt("id", languageId).commit(); }}); //保存 builder.setPositiveButton(R.string.save, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ((Activity) context).finish(); Intent intent=new Intent(); intent.setClass(context, MainActivity.class); context.startActivity(intent); } });
(2)在MainActivity中的语言切换代码:
SharedPreferences languagePre=getSharedPreferences("language_choice", Context.MODE_PRIVATE); int id=languagePre.getInt("id", 0); Log.d("MainActivity", "langauge_id="+id); //应用内配置语言 Resources resources =getResources();//获得res资源对象 Configuration config = resources.getConfiguration();//获得设置对象 DisplayMetrics dm = resources.getDisplayMetrics();//获得屏幕参数:主要是分辨率,像素等。 switch (id) { case 0: config.locale=Locale.getDefault(); //系统默认语言 break; case 1: config.locale = Locale.SIMPLIFIED_CHINESE; //简体中文 break; case 2: config.locale = Locale.ENGLISH; //英文 break; case 3: //config.locale = Locale.;//阿拉伯语 config.locale =new Locale("ar"); break; default: config.locale=Locale.getDefault(); break; } resources.updateConfiguration(config, dm);
转自:http://bbs.51cto.com/thread-1075165-1.html
测试Demo

浙公网安备 33010602011771号