Android多语言切换

       非洲女经济学家丹比萨·莫约(Dambisa Moyo)曾说:种一棵树最好的时间是十年前,其次是现在。曾几何时,自己一度非常想通过写博客的方式来记录自己学习技术的历程,从而进行知识沉淀。然而,太多次自己都以“没有时间”搪塞了过去。看着最近的一次更新博客的时间还是大三在学校时,顿时觉得“无地自容”。希望从这篇博客起,自己能够养成习惯,坚持下去。努力不是为了超越别人,而是成为更好的自己!

        好了,废话不多说了。最近刚做完了一个“某海外APP”的项目,涉及到了多语言切换的问题,本文主要介绍一下项目中多语言切换的实现方案,如您有更好的方案,欢迎评论区交流!

切换APP的语言环境,主要涉及两方面的切换,一个是APP本地资源的语言,另一个是网络请求数据的语言。

(一)APP本地资源语言的切换

       关于本地资源语言的切换实际上就是创建支持不同语言带后缀的values文件。右键values文件夹,创建values resource file,在下方选择Locale,然后点击向右箭头,选择需要的语言即可。(注:本人AS版本3.4.1,不同版本的创建过程略有不同,但大同小异)

     创建成功之后,values文件夹中就会出现我们所创建的支持其他语言的strings文件。

    对于需要支持多语言的字符串资源,我们只需要对应添加翻译即可,这里需要注意的string的name要一致。对于高版本的AS来说,会在默认的strings文件里进行检查,如果出现其他语言的strings文件存在部分string未添加的情况,缺少的内容会标红。

    好了,接下来就是如何在应用中用代码切换多语言了。方法如下:

//获得res资源对象
Resources resources = activity.getResources();
//获得屏幕参数
DisplayMetrics metrics = resources.getDisplayMetrics();
//获得配置对象
Configuration config = resources.getConfiguration();
//在这里设置需要转换成的语言,也就是选择用哪个values目录下的strings.xml文件
config.locale = Locale.SIMPLIFIED_CHINESE;//设置简体中文
//config.locale = Locale.ENGLISH;//设置英文
resources.updateConfiguration(config, metrics);

本来到这里所有的工作都应该结束了。但是适配的时候,我发现对于Android 7.0以上的设备这种方法还是无法切换多语言,经过查询资料发现7.0以上系统增加多语言支持所导致的。也就是说,7.0之前的Android只支持设置单一系统语言,但是7.0开始,支持设置多个系统语言,按优先级排列。所以在进行语言切换的时候我们需要做一下判断。

//获得res资源对象
Resources resources = activity.getResources();
//获得屏幕参数
DisplayMetrics metrics = resources.getDisplayMetrics();
//获得配置对象
Configuration config = resources.getConfiguration();
config.locale = Locale.SIMPLIFIED_CHINESE;//设置简体中文
//config.locale = Locale.ENGLISH;//设置英文
//在这里设置需要转换成的语言,也就是选择用哪个values目录下的strings.xml文件
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
      LocaleList localeList = new LocaleList(locale);
      LocaleList.setDefault(localeList);
      config.setLocales(localeList);
      context.createConfigurationContext(config);
      Locale.setDefault(locale);
  }
resources.updateConfiguration(config, metrics);

    经过以上过程,本地资源语言的切换工作就完成了。

(二)网络请求数据的语言

    其实这一块主要与项目的业务逻辑有关,而且方案很多,见仁见智。这里我只抛砖引玉,简单提供两种实现思路。

      1. 无需增加额外的字段,后端返回数据结果以某种规则分割多语言(如; , 或json数组等),终端根据规则进行解析;

      2. 增加不同语言的标识字段,终端的请求数据时传一个语言参数,然后后端对应返回结果。

    希望文章内容能对您有所帮助!

发布了35 篇原创文章 · 获赞 37 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_34519487/article/details/103302054