目前由于项目需要 我只配置了中文与英文 ,如果还想配置其它,自行配置即可,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); } }
到此,国际化实现完毕