Android中英切换

因项目的需要,需要进行语言国际化,但项目的需求是只需要进行中英切换就行了。其中,需要明确的两点是:
1. 如果用户没有进行额外配置,App的语言首先跟随系统的语言设置。
2. 提供用户手动切换语言的功能,并进行持久化,即下次再打开时如果系统语言与App持久化语言冲突,优先选择App持久化语言。

由于只是中英切换,默认values资源文件夹作为中文语言资源包就行了,需要注意的是values文件夹是一定要提供的,如果系统没有找到其他对应本地语言的资源包,就会默认使用values下的资源。所以此时只需添加英语资源文件夹就行了。

右击res,选择Locale,再选择语言和对应的国家,点ok。完成后会在res文件下多出 values-en-rUS 这个文件夹。但此时这个文件夹下没有内容,我们复制values下的strings.xml 文件过来,studio就会刷新标识。
这里写图片描述

这里写图片描述

这时,将strings.xml(en-rUS) 的中文翻译成中文就行。

接着,进行代码编写,在Activity绑定切换语言按钮并监听点击事件。

切换语言&语言持久化:


    public  void switch_language(){
        String lan = Utils.getAppLanguage(getActivity());
        if(lan.equals("zh") || !lan.equals("en") ){
            setLocale(Locale.ENGLISH);
        }else if(lan.equals("en") || !lan.equals("zh")){
            setLocale(Locale.SIMPLIFIED_CHINESE);

        }
    }


    public void setLocale(Locale myLocale){
        Resources res = getResources();
        DisplayMetrics dm = res.getDisplayMetrics();
        Configuration conf = res.getConfiguration();
        conf.locale = myLocale;
        res.updateConfiguration(conf, dm);
        Utils.saveLanguageSetting(getActivity(),myLocale);
        refreshSelf();
    }



    public  void refreshSelf(){
        getActivity().finish();
        Intent refresh = new Intent(getActivity(), HomeActivity.class);
        refresh.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        getActivity().startActivity(refresh);
    }

手动切换的语言配置持久化到本地后,下次启动App,默认使用用户设置的语言,在MyApplicaton类的onCreate()方法中添加如下编码:

public class MyApplicaton entends Application{
    @Override
    public void onCreate() {
        super.onCreate();
        /***/
        Locale locale = Utils.getAppLocale(this);
        Utils.changeAppLanguage(this,locale,true);
        //注册Activity生命周期监听回调
        registerActivityLifecycleCallbacks(callbacks);

    }

        ActivityLifecycleCallbacks callbacks = new ActivityLifecycleCallbacks() {
        @Override
        public void onActivityCreated(Activity activity, Bundle savedInstanceState) {

            if (!Utils.isSameWithSetting(activity)) {
                Utils.changeAppLanguage(activity,
                        Utils.getAppLocale(activity),true);
            }

        }

        //其他生命周期重载方法。
    };
}

Utils.java

    //更改App语言
    public static void changeAppLanguage(Context context, Locale locale, boolean persistence) {

        Resources resources = context.getResources();
        DisplayMetrics metrics = resources.getDisplayMetrics();
        Configuration configuration = resources.getConfiguration();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            configuration.setLocale(locale);
        } else {
            configuration.locale = locale;
        }
        resources.updateConfiguration(configuration, metrics);
        if (persistence) {
            saveLanguageSetting(context, locale);
        }
    }


    public static boolean isSameWithSetting(Context context) {
        String lang = context.getResources().getConfiguration().locale.getLanguage();
        return lang.equals(getAppLanguage(context));
    }


    //App 语言持久化

    public static void saveLanguageSetting(Context context,Locale locale){

            SPUtils.put(context,KEY_APP_LANGUAGE,locale.getLanguage());

    }

    public static String getAppLanguage(Context context){
        return (String)SPUtils.get(context,KEY_APP_LANGUAGE,Locale.getDefault().getLanguage());
    }



    public static Locale getAppLocale(Context context){
        String lang = (String)SPUtils.get(context,KEY_APP_LANGUAGE,Locale.getDefault().getLanguage());
        if(!lang.equals(Locale.SIMPLIFIED_CHINESE.getLanguage())&&!lang.equals(Locale.ENGLISH.getLanguage())){
            lang = Locale.SIMPLIFIED_CHINESE.getLanguage();
        }
        Locale locale = new Locale(lang);
        return locale;
    }

SPUtils.java

    public static void put(Context context, String key, Object object) {

        SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
                Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();

        if (object instanceof String) {
            editor.putString(key, (String) object);
        } else if (object instanceof Integer) {
            editor.putInt(key, (Integer) object);
        } else if (object instanceof Boolean) {
            editor.putBoolean(key, (Boolean) object);
        } else if (object instanceof Float) {
            editor.putFloat(key, (Float) object);
        } else if (object instanceof Long) {
            editor.putLong(key, (Long) object);
        } else {
            editor.putString(key, object.toString());
        }

        SharedPreferencesCompat.apply(editor);
    }



public static Object get(Context context, String key, Object defaultObject) {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
                Context.MODE_PRIVATE);

        if (defaultObject instanceof String) {
            return sp.getString(key, (String) defaultObject);
        } else if (defaultObject instanceof Integer) {
            return sp.getInt(key, (Integer) defaultObject);
        } else if (defaultObject instanceof Boolean) {
            return sp.getBoolean(key, (Boolean) defaultObject);
        } else if (defaultObject instanceof Float) {
            return sp.getFloat(key, (Float) defaultObject);
        } else if (defaultObject instanceof Long) {
            return sp.getLong(key, (Long) defaultObject);
        }

        return null;
    }

猜你喜欢

转载自blog.csdn.net/qq_23483671/article/details/79860752