Android 多语言切换

在系统设置修改语言

在系统设置中修改语言,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.configuration
	    config.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.configuration
        config.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? = null
    
	override fun onCreate() {
	    super.onCreate()
	    setLocale()
	}
	
	private fun setLocale() {
	    val locale = Locale("zh")
	    Locale.setDefault(locale)
	    val config = resources.configuration
	    config.setLocale(locale)
	    mNewContext = createConfigurationContext(config)
	}
    /**
     * 这里用于处理手动切换多语言,获取资源字符串问题
     * 如ToastUtils工具类中用到的context为Application的context,会导致无法获取正确的字符串
     * 因为createConfigurationContext只能创建一个上下文,无法将上下文应用到Application中,所以用Application的Context获取的资源文件永远都是默认值
     */
    override fun getResources(): Resources {
        val newContext = mNewContext
        return if (newContext != null) {
            newContext.resources
        } else {
            super.getResources()
        }
    }
}

这样在调用 getResources() 方法时就会返回新的上下文的资源,从而实现语言的切换。

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值