Android动态更换应用语言

在开发应用过程中,对于一些有多国语言支撑的项目而言,就需要做到动态国际化的需求,当然Android应用基本上都是默认读取手机的当前语言环境,然后默认获取相对应的语言资源strings。

android布局国际化 安卓国际_国际化

难免项目会需要应用到以上的需求,那么我们就来满足这个需求。

首先:准备两个语言资源,两个Activity类,两个layout布局,两个语言strings资源:

android布局国际化 安卓国际_国际化_02

android布局国际化 安卓国际_配置文件_03

android布局国际化 安卓国际_国际化_04

第一个界面我放置两个按钮,一个用来动态切换语言,一个跳转打下一个界面,强调一点:

更新了语言资源之后,一定要刷新界面
语言引用用@string/xxx

接下来就是代码了::::::
button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                refreshLanguage();
            }
        });

        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, SecondActivity.class));
            }
        });
简单的两个按钮,一个更换语言,一个跳转,真正重要的就在refreshLanguage()这个方法中了。
//刷新显示配置
    public void refreshLanguage() {
        String str = getLanguage(); //得到目前点击的语言环境 "zh" "en" 等
        Resources localResources = context.getResources();  // 创建Resources对象
        //如果本地语言不等于现在的语言环境
        if (!localResources.getConfiguration().locale.getLanguage().equals(str)) {
            // 得到一个 配置Configuration对象
            Configuration localConfiguration = getUpdateLocalConfig(str);
            //得到自定义资源的对象
            DisplayMetrics localDisplayMetrics = localResources.getDisplayMetrics();
            //资源对象更新配置文件
          localResources.updateConfiguration(localConfiguration, localDisplayMetrics);
        }
    }
/**
     * 创建Configuration
     *
     * @param language
     * @return
     */
    public Configuration getUpdateLocalConfig(String language) {
        //得到本地资源配置对象
        Configuration localConfiguration = context.getResources().getConfiguration();
        //得到最新的语言环境Locale
        Locale localLocale = getLocale(language);
        //资源配置对象设置语言环境
        localConfiguration.locale = localLocale;
        return localConfiguration;
    }
//创建新的Locale并覆盖原Locale
    public Locale getLocale(String language) {
        //根据传进来的语言 生成一个语言环境Locale
        Locale localeLocale = new Locale(language);
        //将传进来的语言环境变成本地默认的,进行更换前的准备,返回这个语言环境Locale
        Locale.setDefault(localeLocale);
        return localeLocale;
    }
//得到App配置文件目前的语言
    public String getLanguage() {
        if (config) {
            //获得资源Resources对象
            Resources resources = getApplicationContext().getResources();
            //得到返回当前对象的语言"en""zh"等
            defaultLanguage = resources.getConfiguration().locale.getLanguage();
            config = false;
            return "en";
        } else {
            Resources resources = getApplicationContext().getResources();
            defaultLanguage = resources.getConfiguration().locale.getLanguage();
            config = true;
            return "zh";
        }
    }
通过上述的代码,写的注释已经真的真的真的非常详细了吧。
总结:
1.获取已经更改的语言Language字符串,例如“en”“zh”等
2.判断项目目前的语言环境和动态得到的语言环境字符串是否相等
3.不相等,则获取一个Configuration对象(Configuration对象又通过Locale对象获得,Locale对象又需要根据当前language来获取相对应的对象)
4.得到自定义资源对象DisplayMetrics
5.资源对象更新配置文件
6.完成上述行云流水般的操作,再跳转下个界面,字符资源就变成英文了。