Android之多语言设置

随着毕设的一步步推进。今天给毕设加了多语言适配。虽然只设配了英语跟简体中文、繁体英文。但是道理是相同的,其它语种也是一个道理。

首先,我们附上项目地址:https://github.com/RuijiePan/FileManager.git
欢迎star、fork。

直接附上关键代码:

/**
 * Created by panruijie on 2017/3/15.
 * Email : zquprj@gmail.com
 */

public class LanguageUtil {

    private static LanguageUtil sInstacne;
    private Context mContext;

    //单例初始化
    public static void init(Context mContext) {
        if (sInstacne == null) {
            synchronized (LanguageUtil.class) {
                if (sInstacne == null) {
                    sInstacne = new LanguageUtil(mContext);
                }
            }
        }
    }

    public static LanguageUtil getInstance() {

        if (sInstacne == null) {
            throw new IllegalStateException("You must be init LanguageUtil first");
        }
        return sInstacne;
    }

    private LanguageUtil(Context context) {
        //防止内存泄漏
        this.mContext = context.getApplicationContext();
    }

    //设置语言配置
    public void setConfiguration() {
        //首先获取本地配置,因为6.0以上的设备需要特别处理,否则按下方的方法处理即可
        Locale targetLocale = getTragetLocale();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            Locale.setDefault(targetLocale);
        } else {
            Resources resources = mContext.getResources();
            Configuration config =      resources.getConfiguration();
            DisplayMetrics dm = resources.getDisplayMetrics();
            config.locale = targetLocale;
            resources.updateConfiguration(config, dm);
        }

    }

    /**
     * 如果不是英文、简体中文、繁体中文,默认返回英文
     * 自己定义的是跟随系统、英文、简体中文、繁体中文四种格式
     * @return
     */
    private Locale getTragetLocale() {
        //从SharedPreferences中取出配置,看看是哪种语言
        int userType = SharedUtil.getInt(mContext, AppConstant.LANGUAGE);

        if (userType == LanguageType.FOLLOW_SYSTEM) {
            Locale sysType = getSysLocale();
            if (sysType.equals(Locale.ENGLISH)) {
                return Locale.ENGLISH;
            } else if (sysType.equals(Locale.SIMPLIFIED_CHINESE)) {
                return Locale.SIMPLIFIED_CHINESE;
            } else if (sysType.equals(Locale.TRADITIONAL_CHINESE)) {
                return Locale.TRADITIONAL_CHINESE;
            }
            return Locale.ENGLISH;
        } else if (userType == LanguageType.ENGLISH) {
            return Locale.ENGLISH;
        } else if (userType == LanguageType.SIMPLE_CHINISE) {
            return Locale.SIMPLIFIED_CHINESE;
        } else if (userType == LanguageType.TRADITIONAL_CHINESE) {
            return Locale.TRADITIONAL_CHINESE;
        }

        return Locale.ENGLISH;
    }

    //6.0以上获取方式需要特殊处理一下
    private Locale getSysLocale() {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
            return mContext.getResources().getConfiguration().locale;
        } else {
            return mContext.getResources().getConfiguration().getLocales().get(0);
        }
    }

    //修改了语言之后,修改SharedPreferences里面的配置信息,通过rxbus进行通知页面进行重新加载。可以用eventbus或者广播,你喜欢就行。
    public void updateLanguage(int languageType) {
        if (languageType != SharedUtil.getInt(mContext, AppConstant.LANGUAGE)) {
            SharedUtil.putInt(mContext, AppConstant.LANGUAGE, languageType);
            RxBus.getDefault().post(new LanguageEvent());
        }
    }

    //这里是获取对应的配置信息代表的名字:分别是:跟随系统、英文、简体中文、繁体中文
    public String getLanguageName() {
        int languageType = SharedUtil.getInt(mContext, AppConstant.LANGUAGE);
        if (languageType == LanguageType.ENGLISH) {
            return mContext.getString(R.string.settings_language_english);
        } else if (languageType == LanguageType.SIMPLE_CHINISE) {
            return mContext.getString(R.string.settings_language_simple_chinise);
        } else if (languageType == LanguageType.TRADITIONAL_CHINESE) {
            return mContext.getString(R.string.settings_language_traditional_chinise);
        }

        return mContext.getString(R.string.settings_language_follow_system);
    }
}

下面是上述用到的语言信息lei,你有几种语言就配置几个。

/**
 * Created by panruijie on 2017/3/15.
 * Email : zquprj@gmail.com
 */

public class LanguageType {

    public static final int FOLLOW_SYSTEM = 0;
    public static final int ENGLISH = 1;
    public static final int SIMPLE_CHINISE = 2;
    public static final int TRADITIONAL_CHINESE = 3;
}

接下来,到这里,代码层面已经可以实现多语言了。那么,如何配置多种string类型,用于多语言的切换呢。

首先,我们来到项目的res/values下.右键new->values resource file,接着便会出现图2.
这里写图片描述
(图1)

到这里,我们在file name填上strings,由于原本已经有一个strings文件了。那么等下再构建的时候系统会自动帮我们构造一个strings的文件夹用于存放不同语种的strings.xml。在图2这里选择Local,接着点’》’即可。
这里写图片描述
(图2)

到这里,就是选择你所要的国家了,假如我要中国,而且不分地区,那么在specific region only那里选择any region即可。同理,其它语种一次类推。
这里写图片描述
(图3)

到这里,我们只需在我们自己的基类BaseActivity的oncretae里面添加一句LanguageUtil.getInstance().setConfiguration();即可实现语言的动态设置。

还有就是,在更换语言设置的时候,记得要reload一下界面。否则语言不会刷新。就是在接受到语言更改事件的时候进行更新。代码如下:

    public void reload() {
        Intent intent = getIntent();
        overridePendingTransition(0, 0);
        intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        finish();
        overridePendingTransition(0, 0);
        startActivity(intent);
    }

如果还有疑问,可以留言。或者star、fork我的代码看一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值