Android 应用内切换语言 实现多语言功能

版权声明:本文为博主原创文章,未经博主允许不得转载。深圳夸克时代在线技术有限公司 官网:http://www.kksdapp.com https://blog.csdn.net/wahaha13168/article/details/82989205

1:在res资源文件夹下创建values-en文件夹 原来的values作为默认语言 默认为中文 在values-en里面创建strings.xml

2:在values values-xx下面的strings.xml实现翻译

<string name="key">value</string>
 

3:在需要的地方里面通过key来获取value进行显示
4:创建语言util



package co.nano.nanowallet.util;

        import android.content.Context;
        import android.content.res.Configuration;
        import android.content.res.Resources;
        import android.os.Build;
        import android.os.LocaleList;
        import android.util.DisplayMetrics;
        import android.util.Log;

        import java.util.Locale;

        import co.nano.nanowallet.R;

public class LocalManageUtil {

    private static final String TAG = "LocalManageUtil";

    /**
     * 获取系统的locale
     *
     * @return Locale对象
     */
    public static Locale getSystemLocale(Context context) {
        return SPUtil.getInstance(context).getSystemCurrentLocal();
    }

    public static String getSelectLanguage(Context context) {
        switch (SPUtil.getInstance(context).getSelectLanguage()) {
            case 0:
                return context.getString(R.string.language_en);
            default:
                return context.getString(R.string.language_cn);
        }
    }

    /**
     * 获取选择的语言设置
     *
     * @param context
     * @return
     */
    public static Locale getSetLanguageLocale(Context context) {

        switch (SPUtil.getInstance(context).getSelectLanguage()) {
            case 0:
                return getSystemLocale(context);
            case 1:
                return Locale.CHINA;
            case 2:
                return Locale.TAIWAN;
            case 3:
            default:
                return Locale.ENGLISH;
        }
    }

    public static void saveSelectLanguage(Context context, int select) {
        SPUtil.getInstance(context).saveLanguage(select);
        setApplicationLanguage(context);
    }

    public static Context setLocal(Context context) {
        return updateResources(context, getSetLanguageLocale(context));
    }

    private static Context updateResources(Context context, Locale locale) {
        Locale.setDefault(locale);

        Resources res = context.getResources();
        Configuration config = new Configuration(res.getConfiguration());
        if (Build.VERSION.SDK_INT >= 17) {
            config.setLocale(locale);
            context = context.createConfigurationContext(config);
        } else {
            config.locale = locale;
            res.updateConfiguration(config, res.getDisplayMetrics());
        }
        return context;
    }

    /**
     * 设置语言类型
     */
    public static void setApplicationLanguage(Context context) {
        Resources resources = context.getApplicationContext().getResources();
        DisplayMetrics dm = resources.getDisplayMetrics();
        Configuration config = resources.getConfiguration();
        Locale locale = getSetLanguageLocale(context);
        config.locale = locale;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            LocaleList localeList = new LocaleList(locale);
            LocaleList.setDefault(localeList);
            config.setLocales(localeList);
            context.getApplicationContext().createConfigurationContext(config);
            Locale.setDefault(locale);
        }
        resources.updateConfiguration(config, dm);
    }

    public static void saveSystemCurrentLanguage(Context context) {
        Locale locale;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            locale = LocaleList.getDefault().get(0);
        } else {
            locale = Locale.getDefault();
        }
        Log.d(TAG, locale.getLanguage());
        SPUtil.getInstance(context).setSystemCurrentLocal(locale);
    }

    public static void onConfigurationChanged(Context context){
        saveSystemCurrentLanguage(context);
        setLocal(context);
        setApplicationLanguage(context);
    }
}

5:在application中的oncreate方法设置首次进入app的语言

LocalManageUtil.setApplicationLanguage(this);

实现两个方法

@Override
protected void attachBaseContext(Context base) {
    LocalManageUtil.saveSystemCurrentLanguage(base);
    super.attachBaseContext(LocalManageUtil.setLocal(base));
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    //保存系统选择语言
    LocalManageUtil.onConfigurationChanged(getApplicationContext());
}

6:在baseactivity中实现

@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(LocalManageUtil.setLocal(newBase));
}

7:在设置里面增加两个按钮 点击调用

public static void selectLanguage(int select,Context context) {
    LocalManageUtil.saveSelectLanguage(context, select);
    MainActivity.reStart(context);
}

8:实现reStart应用来展示效果

public static void reStart(Context context) {
    Intent intent = new Intent(context, MainActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(intent);
}

猜你喜欢

转载自blog.csdn.net/wahaha13168/article/details/82989205