Android 多语言切换

news/2024/11/14 11:53:05/

文章目录

    • 在系统设置修改语言
        • 创建资源目录
        • 创建资源文件
        • 示例
        • 验证
    • 代码手动切换语言
        • 在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() 方法时就会返回新的上下文的资源,从而实现语言的切换。


http://www.ppmy.cn/news/1505454.html

相关文章

[Git] fatal: the remote end hung up unexpectedly

1 问题介绍 在使用Git进行代码管理和版本控制的过程中&#xff0c;许多开发者可能会遇到这样一个错误提示&#xff1a;fatal: the remote end hung up unexpectedly。这是一种常见的错误&#xff0c;通常出现在将本地代码推送&#xff08;push&#xff09;到远程仓库&#xff…

C语言——预处理和指针

C语言——预处理和指针 预处理宏宏定义宏的作用域带参的宏 文件包含条件编译 指针指针的概念指针的定义指针变量初始化指针一维整型数组 预处理 编程的流程分为&#xff1a;编辑、编译、运行、调试四个阶段&#xff1b; 预处理属于编译阶段&#xff0c;编译过程又可以分为&…

【Python机器学习】支持向量机——寻找最大间隔

如何求解数据集的最佳分隔直线&#xff1f;如下图中&#xff1a; 分隔超平面的形式可以写成&#xff0c;要计算点A到分隔超平面的距离&#xff0c;就必须给出点到分隔面的法线或垂线的长度&#xff0c;该值为。这里的常数b类似于Logistic回归中的截距。这里的向量w和常数b一起描…

SemanticKernel/C#:使用Ollama中的对话模型与嵌入模型用于本地离线场景

前言 上一篇文章介绍了使用SemanticKernel/C#的RAG简易实践&#xff0c;在上篇文章中我使用的是兼容OpenAI格式的在线API&#xff0c;但实际上会有很多本地离线的场景。今天跟大家介绍一下在SemanticKernel/C#中如何使用Ollama中的对话模型与嵌入模型用于本地离线场景。 开始…

设计模式17-适配模式

设计模式17-适配模式 动机定义与结构C代码推导总结应用具体应用示例 动机 在软件系统中由于应用环境的变化常常需要将一些现存的对象。放到新的环境中去应用。但是新环境要求的接口是这些现存对象所不满足的。那么这种情况下如何应对这种迁移的变化&#xff1f;如何既能利用现…

大数据系列之:CentOS7安装Python3详细步骤

大数据系列之&#xff1a;CentOS7安装Python3详细步骤 一、下载安装的Python版本二、解压缩三、设置安装路径四、安装编译需要的包五、编译六、编译安装七、设置软连接八、设置环境变量九、激活环境变量十、执行python命令十一、安装包 一、下载安装的Python版本 https://www.…

系统运维——PXE自动安装系统

摘要 PXE&#xff08;Preboot Execution Environment&#xff0c;预启动执行环境&#xff09;是一种允许计算机通过网络启动操作系统而无需本地存储设备的技术。本文详细介绍了 PXE 的定义、架构、原理、应用场景及常见命令体系。以 RedHat7 为例&#xff0c;展示如何配置和使…

【Material-UI】Autocomplete组件中的尺寸(Sizes)详解

文章目录 一、size属性简介二、尺寸选项1. medium&#xff08;默认&#xff09;2. small 三、实际应用中的尺寸选择1. 紧凑型设计2. 标准表单3. 特定交互需求 四、最佳实践五、总结 在现代Web应用开发中&#xff0c;UI组件的大小和布局至关重要。Material-UI的Autocomplete组件…