Android 实现国际化

本文详细介绍了一种在Android应用中实现多语言支持的方法,通过自定义LanguageHelper类和利用BaseActivity与Application的attachBaseContext方法,实现了根据用户选择或系统默认语言自动切换应用语言的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目前由于项目需要  我只配置了中文与英文 ,如果还想配置其它,自行配置即可,now,我们来看看实现步骤

这里我们不得不说一个重要的方法attachBaseContext(),请自行查阅,我就不介绍了 ,重点介绍实现国际化

思路:

  一般我们做项目都会用到BaseActivity ,这里面实现如下方法

@Override
protected void attachBaseContext(Context base) {
   
}

  Application里面也有attachBaseContext方法

@Override protected void attachBaseContext(Context base) {

}

如果APP 本地没有保存设置的语言,当APP 起动后会检测手机系统默认的语言,并将其设置为APP 的当前语言

Application 与  BaseActivity都会有此实现

@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(LanguageHelper.INSTANCE.setLocal(base));
}

这里会用到LanguageHelper实现,具体如下

object LanguageHelper {

    /**
     * 保存选择的语言
     */
    fun saveSelectLanguage(context: Context, language: String) {
        PreferenceManager.getInstance(context).putSharedString(PreferenceManager.PREF_LANGUAGE, language)
    }

    fun setLocal(context: Context): Context? {
        return updateResources(context, getSetLanguageLocale(context))
    }

    /**
     * 获取选择的语言设置
     * @param context
     * @return
     */
    private fun getSetLanguageLocale(context: Context): Locale {
        if (context == null) Locale.CHINA
        var language = PreferenceManager.getInstance(context).getSharedString(PreferenceManager.PREF_LANGUAGE, "auto")
        return when (language) {
            "auto" -> getSystemLocale(context)
            "zh" -> Locale.CHINA
            "en" -> Locale.ENGLISH
            else -> Locale.ENGLISH
        }
    }

    /**
     * 获取系统的locale
     */
    private fun getSystemLocale(context: Context?): Locale {
        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            LocaleList.getDefault()[0]
        } else {
            Locale.getDefault()
        }
    }

    private fun updateResources(context: Context, locale: Locale): Context? {
        var context: Context = context
        Locale.setDefault(locale)
        val res: Resources = context.resources
        val config = Configuration(res.configuration)
        if (Build.VERSION.SDK_INT >= 17) {
            config.setLocale(locale)
            context = context.createConfigurationContext(config)
        } else {
            config.locale = locale
            res.updateConfiguration(config, res.displayMetrics)
        }
        return context
    }

    private fun isZh(context: Context): Boolean {
        val locale = context.resources.configuration.locale
        val language = locale.language
        return language.endsWith("zh")
    }

    fun isZhEnv(context: Context): Boolean {
        val language = PreferenceManager.getInstance(context).getSharedString(PreferenceManager.PREF_LANGUAGE, "auto")
        return if (TextUtils.equals(language, "auto")) {
            isZh(context)
        } else {
            TextUtils.equals(language, "zh")
        }
    }


    /**
     * 语言有变化后,全局设置语言类型
     */
    fun setApplicationLanguage(context: Context) {
        val resources = context.applicationContext.resources
        val dm = resources.displayMetrics
        val config = resources.configuration
        val locale = getSetLanguageLocale(context)
        config.locale = locale
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            val localeList = LocaleList(locale)
            LocaleList.setDefault(localeList)
            config.locales = localeList
            context.applicationContext.createConfigurationContext(config)
            Locale.setDefault(locale)
        }
        resources.updateConfiguration(config, dm)
    }
}

现在来说说在App如何用程序实现切换,在页面切换时调用

LanguageHelper.INSTANCE.saveSelectLanguage(SwitchLanguageActivity.this,"en");
EventBus.getDefault().post(new EventMessage(EVENT_SWITCH_LANGUAGE,""));
在BaseApplication里面调用
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessage(EventMessage message) {
    if (EventHelperKt.EVENT_SWITCH_LANGUAGE.equals(message.getKey())) {
        LanguageHelper.INSTANCE.setApplicationLanguage(this);
    }
}
在MainActivity里面一定要让APP 重新启动, 不然设置无效
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessage(EventMessage message) {
    if (EventHelperKt.EVENT_SWITCH_LANGUAGE.equals(message.getKey())) {
        Intent intent = new Intent(this, MainActivity.class);
        intent.putExtra(PAGE_MARKET, "");
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(intent);
    }
}

到此,国际化实现完毕

 

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值