关于APP内多语言切换的解决方案

首先项目中集成

https://github.com/getActivity/MultiLanguages

初始化框架

// 在 Application 中初始化
LanguagesManager.init(this);

重写 Application 的 attachBaseContext 方法

@Override
protected void attachBaseContext(Context base) {
    // 国际化适配(绑定语种)
    super.attachBaseContext(LanguagesManager.attach(base));
}

重写基类 BaseActivity 的 attachBaseContext 方法

@Override
protected void attachBaseContext(Context newBase) {
    // 国际化适配(绑定语种)
    super.attachBaseContext(LanguagesManager.attach(newBase));
}

只要是 Context 的子类都需要重写,Service 也雷同,这里不再赘述

语种设置

// 设置当前的语种(返回 true 需要重启 App)
LanguagesManager.setAppLanguage(Context context, Locale locale);

// 获取当前的语种
LanguagesManager.getAppLanguage(Context context);

使用案例

@Override
public void onClick(View v) {
    // 是否需要重启
    boolean restart;
    switch (v.getId()) {
        // 跟随系统
        case R.id.btn_language_auto:
            restart = LanguagesManager.setSystemLanguage(this);
            break;
        // 简体中文
        case R.id.btn_language_cn:
            restart = LanguagesManager.setAppLanguage(this, Locale.CHINA);
            break;
        // 繁体中文
        case R.id.btn_language_tw:
            restart = LanguagesManager.setAppLanguage(this, Locale.TAIWAN);
            break;
        // 英语
        case R.id.btn_language_en:
            restart = LanguagesManager.setAppLanguage(this, Locale.ENGLISH);
            break;
        default:
            restart = false;
            break;
    }

    if (restart) {
        // 我们可以充分运用 Activity 跳转动画,在跳转的时候设置一个渐变的效果
        startActivity(new Intent(this, LanguageActivity.class));
        overridePendingTransition(R.anim.activity_alpha_in, R.anim.activity_alpha_out);
        finish();
    }
}

其他 API

// 将 App 语种设置为系统语种(返回 true 需要重启 App)
LanguagesManager.setSystemLanguage(Context context);
// 获取系统的语种
LanguagesManager.getSystemLanguage();

// 对比两个语言是否是同一个语种(比如:中文的简体和繁体,英语的美式和英式)
LanguagesManager.equalsLanguage(Locale locale1, Locale locale2);
// 对比两个语言是否是同一个地方的(比如:中国大陆用的中文简体,中国台湾用的中文繁体)
LanguagesManager.equalsCountry(Locale locale1, Locale locale2);

// 获取某个语种下的 String
LanguagesManager.getLanguageString(Context context, Locale locale, int stringId);
// 获取某个语种下的 Resources 对象
LanguagesManager.getLanguageResources(Context context, Locale locale);

混淆规则

-keep class com.hjq.language.** {*;}

以上内容都来自GitHub上的引用。

以下是我自己的项目使用:

准备工作:项目中使用了EventBus用于通知切换语言;建立了3个国家的语言的资源文件夹

,中文,英文,日文(这里的英文资源文件夹用的en-rUS,Local对应的是US,不是English.设置错了就直接找默认的values的资源文件夹了)。具体的哪个国家的资源文件夹对应的名字是什么需要自己百度下;所有使用的Activity都继承自BaseActivity。

1.在Appliction中onCreate方法完整代码:

@Override
public void onCreate() {
    super.onCreate();
    LanguagesManager.init(this);
    Locale local = LanguagesManager.getAppLanguage(this);
    if(local == null){
        local = Locale.CHINA;
    }
    LanguagesManager.setAppLanguage(this,local);
}

初始化多语言框架,并读已经缓存的的语言。然后判断是否为null,如果为空设置一个默认的语言。

然后设置APP的语言。

2.在BaseActivity中的一些逻辑:

重写 Application 的 attachBaseContext 方法:

    @Override
    protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(LanguagesManager.attach(newBase));
    }

添加对切换语言通知的处理逻辑

   通过广播或者EventBus接收的处理。本文是用EventBus接收通知,具体通过什么方式大家仁者见仁智者见智。这里只贴出收到切换语言的逻辑  


   {
        //获取当前Activity的完整名(包括项目名,包名,Activity名)
        String currentActivityName = this.getClass().getCanonicalName();
        //获取指定切换完语言要跳转的Activity的完整名。本文跳转到MainActivity
        String mainActivityName = MainActivity.class.getCanonicalName();
        //如果当前Activity不是指定的就finish自己
        if(!mainActivityName.equals(currentActivityName)) {
            L.e("CHANGE_LANGUAGE","CHANGE_LANGUAGE------------->" + currentActivityName);
            finish();
        }
    }


3.切换语言的地方:

通过操作我们能获取到一个希望要切换的语言的Local的对象

 

 

 

然后再触发切换语言的方法中:

// mTargetLocal是通过操作获得要切换的目标语言的Local对象。
private Locale mTargetLocal;

// 比如通过点击方法切换: 
 @Override
    public void onClick(View v) {
        switch(v.getId()){
            case R.id.fl_chinese:
                mTargetLocal = Locale.CHINA;
                break;
            case R.id.fl_english:
                mTargetLocal = Locale.US;
                break;
            case R.id.fl_japanese:
                mTargetLocal = Locale.JAPAN;
                break;
            default:
                break;
        }
        changeLanguage();
 }


void changeLanguage(){
    
    // 调用切换语言方法,返回是否需要重新刷新页面,如果目标语言和当前语言一致,        
    // 则返回false,反之返回true
    boolean restart = LanguagesManager.
        setAppLanguage(SettingLanguageActivity.this,mTargetLocal);

    if(restart){

        // 如果需要刷新,则遍历全局变量中存放BaseActivity列表的list
        for(BaseActivity activity : MyApplication.getInstance().getActivities()){ 
        
        // 判断是否是要跳转的Activity,本项目要跳转MainActivity,如果有则需要提前将其关闭。重要                                    
        if(activity.getClass().getSimpleName()
        .equals(MainActivity.class.getSimpleName())) {
           activity.finish();
        }
        //  重新打刚才关闭的MainActivity,应为只有重新打开Activity,
        //  才会触发BaseActivity中的attachBaseContext方法,
        //  才能重新刷新设置的多语言   
        MainActivity.goTo(SettingLanguageActivity.this);

        //  通过EventBus发送切换语言的通知,让所有的非MianActivity的Activity都关闭自己。 
        EventBus.post(EventKey.CHANGE_LANGUAGE,null);
    }
   
                
}

到此应该就可以完成多语言的切换了。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值