文章目录
- 在系统设置修改语言
- 创建资源目录
- 创建资源文件
- 示例
- 验证
- 代码手动切换语言
- 在Application中设置新的语言环境
- 在MainActivity / BaseActivity中设置新的语言环境
- 验证
- 问题
- 1. makeText()方法context传入是Application的context,无法获取正确的资源字符串
- 原因
- 解决方案
在系统设置修改语言
在系统设置中修改语言,app只需要通过资源文件适配即可
创建资源目录
步骤:右键res - New - Android Resource Directory
Resource type 选择 values
Available qualifiers 选择 Locale
根据自己的需求创建目录
创建资源文件
右键刚创建的资源目录 - New - Values Resource File - 输入strings
示例
values > strings.xml
<string name="module_splash_privacy_statement">隐私声明</string>
values-en > strings.xml
<string name="module_splash_privacy_statement">Privacy statement</string>
values-ru > strings.xml
<string name="module_splash_privacy_statement">Политика о конфиденциальности</string>
验证
进入手机设置页面修改语言,用代码弹出toast即可验证
MainActivity.kt
Toast.makeText(this, R.string.module_splash_privacy_statement, Toast.LENGTH_SHORT).show()
代码手动切换语言
在Application中设置新的语言环境
class ULEDApplication : Application() {override fun onCreate() {super.onCreate()setLocale()}private fun setLocale() {val locale = Locale("zh")Locale.setDefault(locale)val config = resources.configurationconfig.setLocale(locale)createConfigurationContext(config)}
}
在MainActivity / BaseActivity中设置新的语言环境
abstract class BaseActivity : AppCompatActivity() {override fun attachBaseContext(newBase: Context?) {if (newBase != null) {super.attachBaseContext(updateBaseContextLocale(newBase))}}private fun updateBaseContextLocale(context: Context): Context {val locale = Locale.getDefault()val config = context.resources.configurationconfig.setLocale(locale)return context.createConfigurationContext(config)}
}
验证
进入手机设置页面修改语言,用代码弹出toast即可验证
MainActivity.kt
Toast.makeText(this, R.string.module_splash_privacy_statement, Toast.LENGTH_SHORT).show()
问题
1. makeText()方法context传入是Application的context,无法获取正确的资源字符串
原因
createConfigurationContext() 并不会影响到Application的全局配置,如名字,他只是创建一个Context。
解决方案
class ULEDApplication : Application() {/*** 修改语言后的Context*/private var mNewContext: Context? = nulloverride fun onCreate() {super.onCreate()setLocale()}private fun setLocale() {val locale = Locale("zh")Locale.setDefault(locale)val config = resources.configurationconfig.setLocale(locale)mNewContext = createConfigurationContext(config)}/*** 这里用于处理手动切换多语言,获取资源字符串问题* 如ToastUtils工具类中用到的context为Application的context,会导致无法获取正确的字符串* 因为createConfigurationContext只能创建一个上下文,无法将上下文应用到Application中,所以用Application的Context获取的资源文件永远都是默认值*/override fun getResources(): Resources {val newContext = mNewContextreturn if (newContext != null) {newContext.resources} else {super.getResources()}}
}
这样在调用 getResources() 方法时就会返回新的上下文的资源,从而实现语言的切换。