如果是做国际类APP,那么肯定会涉及到多国语言切换的问题。本文简单的实现语言的切换。
前提条件
-
基础类 直接复制粘贴
LanguageUtil.kt 主要功能提供
object LanguageUtil : SPLanguageInterface {
// companion object {
fun attachBaseContext(context: Context): Context {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
updateResources(context, language)
} else {
context
}
}
fun getLocaleByLanguage(language: String): Locale {
return when (language) {
// Locale.ENGLISH.language -> Locale.ENGLISH
// Locale.JAPAN.language -> Locale.JAPAN
// else -> Locale.SIMPLIFIED_CHINESE
else -> Locale.forLanguageTag(language)
}
}
@TargetApi(Build.VERSION_CODES.N)
fun updateResources(context: Context, language: String): Context {
var resoures = context.resources
var configuration = resoures.configuration
var locale = getLocaleByLanguage(language)
configuration.setLocale(locale)
configuration.setLocales(LocaleList(locale))
return context.createConfigurationContext(configuration)
}
@SuppressWarnings("deprecation")
fun changeAppLanguage(context: Context) {
if (TextUtils.isEmpty(language)) {
return
}
var resources = context.resources
var configuration = resources.configuration
var locale = getLocaleByLanguage(language)
configuration.setLocale(locale)
context.createConfigurationContext(configuration)
}
lateinit var spLanguageInterface: SPLanguageInterface
fun init(spLanguageInterface: SPLanguageInterface) {
this.spLanguageInterface = spLanguageInterface
}
// }
override var language: String
get() = spLanguageInterface.language
set(value) {
spLanguageInterface.language = value
}
}
SPLanguageInterface.kt 需要使用SP实现的语言设置于获取方法
interface SPLanguageInterface {
/**
* 获取语言
*/
/**
* 设置语言
*/
var language: String
}
- 语言文件
语言文件.png
注意:values-en
里的en最好与SP里存储一致
代码
对于Android7.0及以上版本需要重写Activity的attachBaseContext方法。建议重写BaseActivity的attachBaseContext方法。
open class LanguageActivity : AppCompatActivity() {
override fun attachBaseContext(newBase: Context) {
super.attachBaseContext(LanguageUtil.attachBaseContext(newBase))
}
}
对于Android7.0之前的版本需要在Application里去调用
public class MyApplication extends Application implements SPLanguageInterface {
public static MyApplication application;
@Override
public void onCreate() {
super.onCreate();
application = this;
LanguageUtil.INSTANCE.init(this);//初始化LanguageUtil 需要提供SPLanguageInterface的实现类
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
LanguageUtil.INSTANCE.changeAppLanguage(this);
}
}
//使用SP实现设置语言
@Override
public void setLanguage(String language) {
SpUtil.Companion.getInstance(application).putString(SpUtil.LANGUAGE, language);
}
//使用SP实现获取语言
@Override
public String getLanguage() {
return SpUtil.Companion.getInstance(this).getString(SpUtil.LANGUAGE);
}
}
注意:SPLanguageInterface接口并不是一定要在Application里实现。
至此就基本完成了,只是简单的实现。
在Activity中去切换
class WelcomeActivity : LanguageActivity(), View.OnClickListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_welcome)
china.setOnClickListener(this)
english.setOnClickListener(this)
japanese.setOnClickListener(this)
french.setOnClickListener(this)
}
override fun onClick(v: View) {
var s = when (v.id) {
R.id.english -> {
Locale.ENGLISH.language
}
R.id.japanese -> {
Locale.JAPAN.language
}
R.id.french -> {
"fr"
}
else -> {
Locale.CHINA.language
}
}
var string = LanguageUtil.language//获取sp保存的语言
if (string != s) {//当需要切换的语言与sp保存的不一样时才会切换
LanguageUtil.language=s
//实际场景分为两种。1、应用第一次安装,在初始化界面选择语言,不需要重新启动。2、在使用过程中切换,需要重新启动程序。因为涉及到之前已经加载的页面。而且接口返回语种也需要变更。
startActivity(Intent(this, WelcomeActivity::class.java))
finish()
}
}
}
网友评论