Android架構(gòu)篇-2 國際化多語言

摘要
實(shí)現(xiàn)功能:
1.默認(rèn)采用系統(tǒng)語言
2.語言切換后實(shí)時(shí)生效
3.支持中英文
4.我的->設(shè)置->切換語言

思路:app首次初始設(shè)置為系統(tǒng)語言,用戶在app內(nèi)切換語言時(shí)發(fā)送語言切換事件,刷新所有頁面
在AppBaseActivity、AppBaseFragment通過EventBus來增加語言變更監(jiān)聽,收到變更語言的時(shí)間時(shí)更新當(dāng)前context的語言環(huán)境,再刷新當(dāng)前界面即可

AppBaseActivity

package com.wrs.project.module.app.common.base;

import android.annotation.SuppressLint;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.view.KeyEvent;

import androidx.annotation.Nullable;

import com.wrs.project.module.app.common.R;
import com.wrs.project.module.app.common.eventbus.MessageEvent;
import com.wrs.project.module.app.common.language.LanguageService;
import com.wrs.project.module.common.base.BaseActivity;
import com.wrs.project.module.common.network.HttpMethod;
import com.wrs.project.module.common.utils.activitymgr.ActivityMgr;
import com.wrs.project.module.common.utils.utils.L;

import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;

import java.util.Map;

public class AppBaseActivity extends BaseActivity {
    private String tag = "AppBaseActivity";
    @SuppressLint("SourceLockedOrientationActivity")
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // 禁用橫屏
        ActivityMgr.getInstance().addActivity(this);//把當(dāng)前activity添加到堆棧里面
        EventBus.getDefault().register(this);
        LanguageService.updateLanguageConfig(this);
        initData();
        initUI();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        L.e(tag, "activity destroy:" + this.toString());
        ActivityMgr.getInstance().removeActivity(this);
        EventBus.getDefault().unregister(this);
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessageEvent(MessageEvent event) {
        MessageEvent.EventType type = event.getEventType();
        switch (type) {
            case SwitchLanguage:
            {
                LanguageService.updateLanguageConfig(this);
                refreshLanguageUI();
            }
            break;
        }
    }

    protected void refreshLanguageUI() {

    }

    @Override
    public void onStop() {
        super.onStop();

    }

    protected void initData() {

    }

    protected void initUI() {

    }

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        boolean flag = super.onKeyUp(keyCode, event);
//        if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
//            ActivityMgr.getInstance().removeActivity(this);
//            //不執(zhí)行父類點(diǎn)擊事件
//            return false;
//        }
        return flag;
    }

}

AppBaseFragment

package com.wrs.project.module.app.common.base;


import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.wrs.project.module.app.common.eventbus.MessageEvent;
import com.wrs.project.module.app.common.language.LanguageService;
import com.wrs.project.module.common.base.BaseFragment;

import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;

public class AppBaseFragment extends BaseFragment {
    @Override
    public void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        initData();
        View view = initView(inflater, container, savedInstanceState);
        if (null == view) {
            view = super.onCreateView(inflater, container, savedInstanceState);
        }
        EventBus.getDefault().register(this);
        return view;
    }

    protected void initData() {

    }

    protected View initView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return null;
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessageEvent(MessageEvent event) {
        MessageEvent.EventType type = event.getEventType();
        switch (type) {
            case SwitchLanguage:
            {
                LanguageService.updateLanguageConfig(this.getContext());
                refreshLanguageUI();
            }
            break;
        }
    }

    protected void refreshLanguageUI() {

    }
}

在我的->設(shè)置->切換語言可以切換app應(yīng)用內(nèi)語言,切換的語言類型保存到SharedPreferences

    public void switchLanguageBtnClick(View view) {
        AlertUtils.getAlertDialogBuilder(this, getString(R.string.mine_setting_switch_language), "", "中文", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                LanguageService.switchLanguage(Locale.CHINESE);
            }
        }, "English", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                LanguageService.switchLanguage(Locale.ENGLISH);
            }
        }).create().show();
    }

本demo只做了中英文的切換,如果還需要支持其他語言,只需要在語言的枚舉類型里添加語言類型,并增加對(duì)應(yīng)的頁面翻譯即可

public enum LanguageType {
    EN(Locale.ENGLISH),  // 英文
    CHINESE(Locale.CHINESE); // 中文

    private Locale locale;

    LanguageType(Locale locale) {
        this.locale = locale;
    }


    public Locale getLocale() {
        return locale;
    }

    public void setLocale(Locale locale) {
        this.locale = locale;
    }

    public static LanguageType getLanguageType(Locale locale) {
        if (null != locale) {
            for (LanguageType languageType : LanguageType.values()) {
                if (languageType.getLocale().equals(locale)) {
                    return languageType;
                }
            }
        }
         return null;
    }
}

源碼下載

還有 7% 的精彩內(nèi)容
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
支付 ¥8.88 繼續(xù)閱讀

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容