美文网首页Android收藏集
Android-国际化(多语言)切换详解及实例

Android-国际化(多语言)切换详解及实例

作者: 锐心凌志 | 来源:发表于2018-05-07 21:39 被阅读32次

internationalization(国际化)简称 i18n,因为在i和n之间还有18个字符,localization(本地化),简称L10n。

一.原理:

Android中实现国际化相对来说还是简单的,因为Android有很独特的资源管理方式。代码可以不和资源发生关系,我们通常通过 R 文件提供的索引来间接的引用某一个资源。

把显示的字符串都转换成文件资源,再用代码代码提取,也就是把字符串存储在对应的values目录下。


二.实现步骤:

国际化切换可以手动国际化,也可以一键国际化。

1.手动国际化 为支持多国语言,在res/中创建一个额外的values目录以连字符和ISO国家代码结尾命名,比如values-es/是为语言代码为"es"的区域设置的简单的资源文件的目录。Android会在运行时根据设备的区域设置,加载相应的资源。 以中英文切换为例: 如果默认是中文就不用建立相应的values文件了,因为系统找不到对应的资源直接会走默认的。 (1).首先建立一个values资源文件values-en/放进对应的strings.xml。

image

添加不同区域语言的字符串值到相应的文件就可以了。

(2).UI显示字符串用代码提取: 生成对应的string文件不用每个都改,这样很麻烦,教大家一个简单方法如下:

image

这样直接就生成了string.xml,直接去改相应的字符串就好了。

2.一键国际化 如果需要很多语言的时候,手动的切换很麻烦。这时需要用到Android Studio插件:AndroidLocalizationer,它可以实现一键国际化。 使用方法: (1).下载AndroidLocalizationer插件 下载地址: https://github.com/westlinkin/AndroidLocalizationer (2).集成到Android studio中。

image

集成成功之后重启。 (3).使用

image image 根据你的需要来选择对应的语言 结果如下: image

附加:这个插件还是有些不稳定的地方,有的Android Studio版本是不支持此插件的。


二.国际化实现实例

image

1.配置资源文件,这个在前面已经讲过了。 2.封装一个ContextWrapper类 ContextWrapper构造函数中必须包含一个真正的Context引用,同时ContextWrapper中提供了attachBaseContext()用于给ContextWrapper对象中指定真正的Context对象,调用ContextWrapper的方法都会被转向其所包含的真正的Context对象。


1.  `public  class  MyContextWrapper  extends  ContextWrapper  {

3.  `public  MyContextWrapper(Context  base)  {
4.  `super(base);
5.  `}

7.  `@SuppressWarnings("deprecation")
8.  `public  static  ContextWrapper wrap(Context context,  String language)  {
9.  `Configuration config = context.getResources().getConfiguration();
10.  `Locale sysLocale =  null;
11.  `if  (Build.VERSION.SDK_INT >=  Build.VERSION_CODES.N)  {
12.  `sysLocale = getSystemLocale(config);`
13.  `}  else  {
14.  `sysLocale = getSystemLocaleLegacy(config);
15.  `}
16.  `if  (!language.equals("")  &&  !sysLocale.getLanguage().equals(language))  {
17.  `Locale locale =  new  Locale(language);
18.  `Locale.setDefault(locale);
19.  `if  (Build.VERSION.SDK_INT >=  Build.VERSION_CODES.N)  {
20.  `setSystemLocale(config, locale);
21.  `}  else  {
22.  `setSystemLocaleLegacy(config, locale);
23.  `}
24.  `if  (Build.VERSION.SDK_INT >=  Build.VERSION_CODES.JELLY_BEAN_MR1)  {
25.  `context = context.createConfigurationContext(config);
26.  `}  else  {
27.  `context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
28.  `}
29.  `}
30.  `return  new  MyContextWrapper(context);
31.  `}

33.  @SuppressWarnings("deprecation")
34.  public  static  Locale getSystemLocaleLegacy(Configuration config){
35.  return config.locale;
36.  }

38.  @TargetApi(Build.VERSION_CODES.N)
39.  public  static  Locale getSystemLocale(Configuration config){
40.  return config.getLocales().get(0);
41.  }

43.  @SuppressWarnings("deprecation")
44.  public  static  void setSystemLocaleLegacy(Configuration config,  Locale locale){
45.  config.locale = locale;
46.  }

48.  @TargetApi(Build.VERSION_CODES.N)
49.  public  static  void setSystemLocale(Configuration config,  Locale locale){
50.  config.setLocale(locale);
51.  }
52.  }

3.attachBaseContext实现

1.  @Override
2.  protected  void attachBaseContext(Context newBase)  {
3.  //Public.Language 为 对应的资源格式后缀,比如"zh"      "
4.  super.attachBaseContext(MyContextWrapper.wrap(newBase,  Public.Language));
5.  }

如果想要整个APP都实现国际化,直接把attachBaseContext写在封装好的BaseActivity里。 4.调用


1.  //动态改变后缀名,可以存在本地数据中,方法比较多就不细说了。Public.Language="zh";`
2.  recreate();`

其中recreate();是Android3.0以后引入的。

相关文章

网友评论

    本文标题:Android-国际化(多语言)切换详解及实例

    本文链接:https://www.haomeiwen.com/subject/bikbrftx.html