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