在手机应用的实现中经常会遇到需要语言切换用于满足用户环境的多样性。可以根据所处地理位置信息进行经纬度及国家/城市/地区的获取,可以根据此内容进行多语言情况的推荐及切换。
完成上述的想法需要进行几个功能的开发:
- 需要通过手机进行地理位置信息获取
- 需要根据地理位置信息进行多语言内容的推荐(涉及地理位置监听)
- 需要将应用内的多语言进行切换
多语言切换Android分为两个部分:
第一点是本地静态文案或服务器进行多语言设置
建立对应语言国际编码string文件夹,以编码结尾。详情可以查看Android开发者中的多语言设置内容。静态语言文案用于Android工程内部不需要和外部进行交互的文案内容。
在其中踩到了一个坑,文案在引用时有时会变成数字的形式,原因在于使用“R.string.for_you”的形式引用时如果后面再加上string类型的内容时此时会将该文字转换为数字。此时引用resources.getString(R.string.for_you)进行代替,便可以正确引用文字。
第二点进行应用语言的设置
进行应用语言设置,可以调用如下方法。输入语言类型,获取应用使用语言,进行语言替换,最后进行应用重启,从而使应用可以全方位适用新语言。
private fun changeLanguage(language: String) {
if (TextUtils.isEmpty(language)) {
//如果语言和地区都是空,那么跟随系统
saveString(ConstantGlobal.LOCALE_LANGUAGE, "")
saveString(ConstantGlobal.LOCALE_COUNTRY, "")
} else {
//不为空,那么修改app语言,并true是把语言信息保存到sp中,false是不保存到sp中
val newLocale = Locale(language)
MultiLanguageUtils.changeAppLanguage(this, newLocale, true)
App().getContext()?.let {
MultiLanguageUtils.changeAppLanguage(it, newLocale, true) }
}
//重启app,这一步一定要加上,如果不重启app,可能打开新的页面显示的语言会不正确
val intent = Intent(this, MainActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
this.startActivity(intent)
}
object SpUtil {
private const val name = "sp_config.cfg"
private var sp: SharedPreferences? = null
fun saveInt(key: String?, value: Int) {
if (sp == null) {
sp = App().getContext()?.getSharedPreferences(name, Context.MODE_PRIVATE)
}
sp!!.edit().putInt(key, value).commit()
}
fun saveInt(ctx: Context, key: String?, value: Int) {
if (sp == null) {
sp = ctx.getSharedPreferences(name, Context.MODE_PRIVATE)
}
sp!!.edit().putInt(key, value).commit()
}
fun getInt(key: String?): Int {
if (sp == null) {
sp = App().getContext()?.getSharedPreferences(name, Context.MODE_PRIVATE)
}
return sp!!.getInt(key, -1)
}
fun getInt(ctx: Context, key: String?): Int {
if (sp == null) {
sp = ctx.getSharedPreferences(name, Context.MODE_PRIVATE)
}
return sp!!.getInt(key, -1)
}
fun getInt(ctx: Context, key: String?, defValue: Int): Int {
if (sp == null) {
sp = ctx.getSharedPreferences(name, Context.MODE_PRIVATE)
}
return sp!!.getInt(key, defValue)
}
fun saveBoolean(key: String?, value: Boolean) {
if (sp == null) {
sp = App().getContext()?.getSharedPreferences(name, Context.MODE_PRIVATE)
}
sp!!.edit().putBoolean(key, value).commit()
}
fun saveBoolean(ctx: Context, key: String?, value: Boolean) {