Android鬼点子 支持多语言,这一篇就够了

2,133 阅读3分钟

本文主要是分享一下Android多语言方面的开发经验。使用的环境是Android studio 2.3.3,目前很多App为了针对海外市场,都会增加对当地语言的适配。通常的方式是在App增加对语言的切换功能。切换之后刷新界面,完成切换。还有在App启动的时候可以根据当前的系统语言,来自动切换显示的语言。

微信截图

把所有显示用的字符串,提取到xml文件中创建项目的时候,会自动创建一个string.xml文件。这里是系统默认的显示语言。

截图

当你需要适配其他语言的时候,你需要创建对应那个语言的文件夹。一般的教程的话,接下来就会列一大堆文件夹的名字,如果是常用的语言,例如英语还比较容易的查到是en,中文是zh。要是其他的怎么办?

放心,Android Studio已经帮我们想到了解决方法。首先你需要右键string.xml文件,然后Open translate Editor。

截图

打开之后点这里,按照国旗选择你要添加的语言即可。旁边的加号可以用来添加字段。

![截图]7.png](http://upload-images.jianshu.io/upload_images/4934621-e477c60e8997546b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

如果我选择添加了英文,界面就是这样的。并且AS会自动帮我们创建values-en文件夹。

截图

通过上图,可以发现这是一个表格,所以可以把整张表复制出来,放到Excel中进行编辑,然后再粘贴回来就可以了。简直不要太方便!

文字弄好了,图片怎么办?有些语言文字很长,布局需要修改怎么办?只要创建对应的语言的资源文件夹就可以啦!右键res文件夹,new ->Android Resource directory.

截图

然后就可以选择要创建的文件类型,下面是给这个文件添加适配规则,比如语言(local),分辨率等等。而多种规则可以组合哦。比如可以针对英语的小屏幕手机单独适配。

截图

截图

截图

截图

下面是一些小Tips:

  • 某些在string.xml中不需要适配多语言的字段,在默认的string.xml中有这个字段,在其他语言中没有。需要在默认的string.xml中添加
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
  • 来自服务器的消息,如果需要翻译,最好约定好code,而不是直接显示。
  • Toast最好放在一个工具类里面显示(不是放在activity的方法中,是一个工具类),这样,就改Toast的内容的时候也会更方便。
  • 在Android Studio中你可能会用到Ctrl+H进行全局搜索。
  • 用代码切换语言
public void changeAppLanguage() {

        if (sta.startsWith("zh")) {
            sta = "en";
        } else {
            sta = "zh";
        }
     
        Locale myLocale = new Locale(sta);
        Resources res = getResources();
        DisplayMetrics dm = res.getDisplayMetrics();
        Configuration conf = res.getConfiguration();
        conf.locale = myLocale;
        res.updateConfiguration(conf, dm);
        recreate();
    }
  • 获取当前的系统语言
sta = getResources().getConfiguration().locale.toString();
  • 当前是显示中文,我想在不切换显示的前提下,获取英文模式的资源文件怎么办?
        Locale myLocale = new Locale(sta);
        Resources res = getResources();
        DisplayMetrics dm = res.getDisplayMetrics();
        Configuration conf = res.getConfiguration();
        conf.locale = myLocale;
        res.updateConfiguration(conf, dm);

先用上面的代码切换的英文,然后获取资源。然后……再用上面的代码切回中文。(只要不调用recreate()重绘界面就可以啦)

  • 按钮的selector,我一般放在drawable文件夹中。适配多于语言的时候,因为图片是放在对应的语言的文件夹下的,我以为selector就不用放在对应语言的drawable文件夹下了。可是事实是不行,要放到对应语言的drawable文件夹下。