App实现多语言(只根据语言进行判断)

原理:只是切换本地的strings.xml包而已

逼话不多说,先上效果图。

跟随系统语言的。

在这里插入图片描述

如果这是你要的,那就继续往下看吧。

第一步:创建本地的 strings.xml

因为原理便是切换本地的strings.xml,所以我们需要设置什么语言,便要创建什么语言的strings.xml。
1.在res包下创建一个新的string.xml
名字都取strings,然后选择Locale并点击箭头。
接着选择语言与国家并创建就行了

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

需要几种语言就创建几种语言在这里插入图片描述
注意:默认strings里有的,新增strings里也要有。

在这里插入图片描述在这里插入图片描述在这里插入图片描述

第二步:MyApplication。

创建完成后,我们需要一个属于自己的 MyApplication,这个在切换系统语言会用到。
在此类中,我们得以进行获取系统语言和更改系统语言等操作。
public class MyApplication extends Application {

    private static MyApplication instance = null;
    private Context mContext = null;

    @Override
    public void onCreate() {
        super.onCreate();
        if (instance == null) {
            instance = this;
        }
        mContext = getApplicationContext();
        //初始化缓存
        SharedPreferencesUtil.init(this);
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        //初始获取系统语言
        initSystemLanguage();
        //初始化语言(切换语言)
        initLanguage();
    }

    /**
     * 初始化系统语言
     */
    private void initSystemLanguage() {
        String mLocale;
        // 截取java虚拟机返回字符串的前两个字符(中文:zh   英文:en )。
        // 因为返回的内容为zh_CN,其中zh代表语言(中文),CN代表地区或国家(中国大陆)。
        // 截取前两位只对语言进行判断。
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            mLocale = String.valueOf(getResources().getConfiguration().getLocales().get(0)).substring(0, 2);
        } else {
            mLocale = String.valueOf(getResources().getConfiguration().locale).substring(0, 2);
        }

//        /**
//         * 也可以使用Locale获取
//         */
//        Locale myLocale = Locale.getDefault();
//        //语言
//        mLocale = myLocale.getLanguage();
//        //地区
//        String mCountry = myLocale.getCountry();

        /**
         * 缓存系统语言,非汉语或英语以外的语言显示英语
         */
        switch (mLocale) {
            case "zh"://中文
                SharedPreferencesUtil.instance.setSystemLanguage("zh");
                break;
            case "en"://英文
                SharedPreferencesUtil.instance.setSystemLanguage("en");
                break;
            default://其它语言使用英文
                SharedPreferencesUtil.instance.setSystemLanguage("en");
                break;
        }
    }

    /**
     * 根据缓存改变全局的语言
     */
    public void initLanguage() {
        //获取缓存的系统语言
        String mLocale = SharedPreferencesUtil.instance.getSystemLanguage();
        switch (mLocale) {
            case "zh"://中文
                changeAppLanguage(mContext, Locale.CHINA);
                break;
            case "en"://英文
                changeAppLanguage(mContext, Locale.ENGLISH);
                break;
            default://其它语言使用英文
                changeAppLanguage(mContext, Locale.ENGLISH);
                break;
        }

        /**
         * 改变全局语言时进行的一些清空或重置操作
         */
    }

    /**
     * 根据缓存改变单个界面的语言
     *
     * @param context context
     */
    public void initLanguage(Context context) {
        String mLocale = SharedPreferencesUtil.instance.getSystemLanguage();
        switch (mLocale) {
            case "zh"://中文
                changeAppLanguage(context, Locale.CHINA);
                break;
            case "en"://英文
                changeAppLanguage(context, Locale.ENGLISH);
                break;
            default://其它语言使用英文
                changeAppLanguage(context, Locale.ENGLISH);
                break;
        }
    }

    /**
     * 切换语言
     *
     * @param locale 语言
     */
    @SuppressLint("ObsoleteSdkInt")
    public void changeAppLanguage(Context context, Locale locale) {
        DisplayMetrics metrics = getResources().getDisplayMetrics();
        Configuration configuration = getResources().getConfiguration();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            configuration.setLocale(locale);
        } else {
            configuration.locale = locale;
        }
        //改变语言主要靠此语句
        context.getResources().updateConfiguration(configuration, metrics);
    }
}

在AndroidManifest.xml中使用

在这里插入图片描述

第三步:保存。

值得注意的是,我们在获取系统语言的同时,使用了缓存工具进行保存(使用缓存时因为后面我还会增加手动选择语言的功能)。
/**
 * 缓存工具类
 */
public class SharedPreferencesUtil {

    public static SharedPreferencesUtil instance;
    public static Context mContext;
    public static SharedPreferences pePreferences;

    public static void init(Application context) {
        if (instance == null) {
            instance = new SharedPreferencesUtil();
        }
        mContext = context;
        pePreferences = mContext.getSharedPreferences("SharedPreferences", Context.MODE_PRIVATE);
    }

    //系统语言
    private String systemLanguage = "en";

    public String getSystemLanguage() {
        systemLanguage = pePreferences.getString("systemLanguage", "en");
        return systemLanguage;
    }

    public void setSystemLanguage(String systemLanguage) {
        this.systemLanguage = systemLanguage;
        pePreferences.edit().putString("systemLanguage", systemLanguage).apply();
    }
}
同时,为了保证实现,布局文件或java代码中的文字需要使用strings.xml中书写的。

在这里插入图片描述

这样,简单的跟随系统实现多语言的功能就实现了,但我们在我们的日常开发中,增加语言选择功能是必备的。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值