美文网首页基础MDAndroid知识
Android国际化多语言切换

Android国际化多语言切换

作者: 宝塔山上的猫 | 来源:发表于2017-04-04 14:27 被阅读2045次

最近工作中突然要求要项目进行国际化,之前没遇到过。但是也很简单呀,只需要把添加一个相应语言的的strings.xml的资源文件就好了,不是吗?这样只要切换系统语言就能切换app的文字语言了。
但是由此引发了一个稍微深入一点的问题,那就是如果要实现在app中不跟随系统切换语言,可以直接切换语言哪又要怎么做呢?这种功能是支付宝/微信都有的,功能如下图:

多语言切换.gif

于是努力的研究了一下子,发现实现这个功能也不难,主要涉及到Configuration和Locale这两个类,其中Configuration是设置app配置的,Locale则是表示地理信息等东西,更多详细内容需要大家自己去了解。

基本的大家已经了解了,那么要如何实现它呢?
首先我们要能切换不同的语言,那么必然需要不同的资源包,所以第一步是建立中文和英文两个不同的strings.xml。
然后就使用Configuration和Locale配置语言了,关键代码如下:

/**
 * 切换语言
 *
 * @param language
 */

private void switchLanguage(String language) {

    //设置应用语言类型

    Resources resources = getResources();

    Configuration config = resources.getConfiguration();

    DisplayMetrics dm = resources.getDisplayMetrics();

    if (language.equals("zh_simple")) {

        config.locale = Locale.SIMPLIFIED_CHINESE;

    } else if (language.equals("en")) {

        config.locale = Locale.ENGLISH;

    } else {

        config.locale = Locale.getDefault();

    }

    resources.updateConfiguration(config, dm);

    //更新语言后,destroy当前页面,重新绘制

    finish();

    Intent it = new Intent(MainActivity.this, MainActivity.class);

    //清空任务栈确保当前打开activit为前台任务栈栈顶

    it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

    startActivity(it);

}

通过使用这个方法,传入zh_simple或者en两个string类型,就能选择想要的语言了。
值得注意的是假如你的 App 存在某个 activity 和当前设置页 activity 不在一个 task 栈内的话(比如你从某个通知页用 FLAG_ACTIVITY_NEW_TASK 启动的一个 activity),就不会应用语言设置。因此可以直接杀掉当前 App 的进程,保证是“整个”重启了。所以最好就是清除所有任务栈和进程。

重启app之后使用之前设置好的语言

这个问题挺傻的,但是有时候就是拐不过弯来。
事实上我们只需要在设置语言的时候,把当前设置好的语言保存在sharedpreference中就可以了。然后设置一个application的类,在其中的时候读取配置信息就可以了。

图片国际化与尺寸国际化

既然语言可以国际化,那么图片或者尺寸dimens可不可以国际化呢?
其实这也是可以得,只要在相应的目录下建立不同语言的资源包便可以实现,效果如下:

GIF.gif

方法如下:

图片国际化.PNG 尺寸国际化.PNG

在这里,我设置了两种图片,中国地图和美国地图,将美国地图房子drawable-en-hdpi的目录中,然后选择语言就会出现不同的图片。

然后再values-en目录中建立了新的dimens.xml文件,如下:
<resources>
<dimen name="width">100dp</dimen>
<dimen name="height">100dp</dimen>
</resources>

而在values目录的dimens.xml则设置为300dp,这时两种语言切换后,显示的大小就不同了。

其他资源国际化

在往外延伸一点,既然图片和尺寸都能国际化,那么res资源文件夹下的其他东西是不是也可以国际化呢?答案是可以的。
尝试在res文件夹下创建raw文件夹,放置了音频,然后又创建了raw-en的目录,放置另一个音频,切换语言后,两者也是不同的。
因此可以判断,只要是res资源文件夹下的资源,都是可以进行国际化操作的。

项目demo如下:
http://download.csdn.net/detail/lzb19890920/9803265

参考博客:
http://www.cnblogs.com/popqq520/p/5498990.html

相关文章

  • iOS 国际化多语言(下)

    前言 上一片文章介绍的是根据系统语言自动切换,现在我们来说说怎么在APP中手动切换多语言。iOS 国际化多语言(上...

  • Vue3 + Element Plus + i18n 国际化

    1 前言 本篇旨在 Vue3 + Element Plus 国际化配置,支持多语言切换 2 Vue3 国际化 2....

  • Android国际化多语言切换

    最近工作中突然要求要项目进行国际化,之前没遇到过。但是也很简单呀,只需要把添加一个相应语言的的strings.xm...

  • Android国际化多语言切换

    关于App国际化,之前有讲到国际化资源、字符换、布局相关,想要了解的猛戳用力抱一下APP国际化[https://j...

  • Android App 多语言切换

    Android App 多语言切换:http://laobie.github.io/android/2016/05...

  • Android 国际化之多语言切换

    前言 android的国际化很简单,大家都知道创建对应国家编码的values文件夹就好啦。可是很多人不知道如何手动...

  • Spring Boot入门样例-170-i18n国际化多语言切换

    Spring Boot入门样例-170-i18n国际化多语言切换 当网站有多个国家用户访问时,如何让他们切换自己熟...

  • vue多语言化

    随着国际化的趋势,项目中配置多语言切换也越来越有必要,本篇文章将会介绍如何在vue项目中配置多语言化 安装:npm...

  • VUE项目国际化处理

    前言: 在大型项目开发中我们经常会遇到项目多环境,国际化(多语言切换),主题切换等常见业务场景,本篇博客分享在vu...

  • Android studio进阶之多语言/图片--国际化

    Android studio进阶之多语言编程--国际化 前段时间接到一个关于PDA的项目 , 其中需要用到国际化 ...

网友评论

  • 宛丘之上兮:这种方法不能改变一些系统组件的字体,比如Toolbar的setTitle的字体还是跟随系统的。而且繁体无法区分香港和台湾啊??
  • King4Ghost:左上角的“DUODUO”,这个app name不会被更改吗?为什么

本文标题:Android国际化多语言切换

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