Android 中设置指定语言

背景

有一个项目,需要提供英文版 app 给到海外客户使用,正常来说切换系统语言为英文即可(因为原来就有做多语言适配,支持英文语言)。

但是为了方便海外客户,就提了个变态需求给到开发:不管系统语言设置是啥,都使用英文语言展示。


实现

关于 app 多语言适配的方案这里就不再提了,网上有很多解决方案供同学们自己参考学习。

工具类代码如下:

package com.example.multilangfitdemo.util;

import android.content.Context;
import android.content.res.Configuration;
import android.os.Build;
import android.text.TextUtils;
import android.util.DisplayMetrics;

import java.util.Locale;

public class LanguageUtil {

    private volatile static LanguageUtil languageUtil;

    private LanguageUtil(){}

    // instance
    public static LanguageUtil instance(){
        if (languageUtil == null){
            synchronized (LanguageUtil.class){
                if (languageUtil == null){
                    languageUtil = new LanguageUtil();
                }
            }
        }
        return languageUtil;
    }

    /**
     *
     * @param context
     * @param language
     */
    public static void setDefaultLanguage(Context context, String language){
        if (TextUtils.isEmpty(language)){
            return;
        }

        Locale locale = new Locale(language);
        Locale.setDefault(locale);

        Configuration configuration = context.getResources().getConfiguration();
        DisplayMetrics metrics = context.getResources().getDisplayMetrics();

        // 不为 en 的值,默认为使用中文。(有需要同学可自行修改逻辑)
        Locale loc = Locale.CHINA;
        if (language.equals("en")){
            loc = Locale.ENGLISH;
        }

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
            configuration.setLocale(loc);
        }else {
            configuration.locale = loc;
        }

        context.getResources().updateConfiguration(configuration, metrics);
    }

}

Activity 基类的 onCreate() 生命周期方法中调用:

public class BaseActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LanguageUtil.setDefaultLanguage(this, "en");
    }
}

验证

在这里插入图片描述
在这里插入图片描述
运行后如上图示,系统语言为中文,不过 app 展示的也是英文语言版本。


总结

另外不要在自定义的 Application 类中获取 getResources() ,亲自测试后发现设置指定语言功能并没有生效,后面发现是 getResources 这个方法导致。

想深入了解的同学参考如下:

Android Appication及Activity的 Resource 生成代码分析

千万不要在application里面重写getResources


技术永不眠!我们下期见!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值