多语言切换(基于Androidx)
适配了Androidx appcomapt 导致切换多语言失效问题
在自定义的Application # onCreate()中调用MultiLanguageService # init(Context ctx)
在杀死进程,下次进入时,仍使用上次切换的语言。例如上次切换为阿拉伯语,则杀死进程,再启动时仍为阿拉伯语。如果不调用会在下次启动时为跟随系统语言
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
MultiLanguageService.INSTANCE.init(this);
}
}目前已支持16种语言,如果不满足可以调用拓展方法MultiLanguageService # setExpandLocal(),语言类型拓展可继承
该方法需要在调用 changeLanguage() 前调用!
MultiLanguageService.setExpandLocal { languageType ->
return@setExpandLocal when (languageType) {
//朝鲜
ExpandLanguage.CX -> {
Locale("chaoxian", "CX")
}
//刚果
ExpandLanguage.GG -> {
Locale("gangguo", "GG")
}
//其他语言
else -> {
Locale(LanguageType.LANGUAGE_SYSTEM)
}
}
}当前支持语言:
| 语言 | 字段名称 | 字段值 |
|---|---|---|
| 跟随系统 | LANGUAGE_SYSTEM | system |
| 英文 | LANGUAGE_EN | en |
| 简体中文 | LANGUAGE_ZH_CN | zh-Hans |
| 繁体中文 | LANGUAGE_ZH_TW | zh-Hant |
| 泰语 | LANGUAGE_TH | th |
| 日语 | LANGUAGE_JA | ja |
| 韩语 | LANGUAGE_KO | ko |
| 阿拉伯语 | LANGUAGE_AR | ar |
| 印尼语 | LANGUAGE_IN | id |
| 西班牙语 | LANGUAGE_ES | es |
| 葡萄牙语 | LANGUAGE_PT | pt |
| 越南语 | LANGUAGE_VI | vi |
| 俄语 | LANGUAGE_RU | ru |
| 土耳其语 | LANGUAGE_TR | tr |
| 德语 | LANGUAGE_DE | de |
| 法语 | LANGUAGE_FR | fr |
| 意大利语 | LANGUAGE_IT | it |
通过调用 MultiLanguageService # (context: Context, language: String) 可以切换为指定语言,入参language可以使用LanguageType类中的常量。
findViewById<Button>(R.id.btn_change_jp).setOnClickListener {
//切换语言
MultiLanguageService.changeLanguage(this, LanguageType.LANGUAGE_JA)
//重启MainActivity
startActivity(Intent(this, MainActivity::class.java).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK))
}-
对于Activity,需要在
attachBaseContext()方法中调用``MultiLanguageService # changeContextLocale(context: Context)` -
其他场景(Dialog等),需要在展示第一步调用
MultiLanguageService # changeContextLocale(context: Context) -
如果不提前调用
changeContextLocale(),可能在调用切换指定语言时出现无效问题。
//Activity
class MainActivity2 : AppCompatActivity() {
override fun attachBaseContext(newBase: Context) {
super.attachBaseContext(MultiLanguageService.changeContextLocale(newBase))
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main2)
}
}
//Dialog
findViewById<Button>(R.id.btn_jump_dialog).setOnClickListener {
MultiLanguageService.changeContextLocale(this)
Dialog(this).apply {
setContentView(R.layout.dialog_main)
show()
}
}调用MultiLanguageService # getCurrentLanguage() 可以获取当前切换的语言
findViewById<Button>(R.id.btn_show).text = "当前语言(${MultiLanguageService.getCurrentLanguage()})"