当前位置: 首页 > ops >正文

Android应用中设置非系统默认语言(使用Kotlin)

以下是使用Kotlin在Android应用中设置非系统默认语言的几种方法:

方法1:通过扩展函数动态更改语言

fun Context.setAppLocale(languageCode: String): Context {val locale = Locale(languageCode)Locale.setDefault(locale)return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {updateResourcesLocale(locale)} else {updateResourcesLocaleLegacy(locale)}
}@RequiresApi(Build.VERSION_CODES.N)
private fun Context.updateResourcesLocale(locale: Locale): Context {val configuration = resources.configurationconfiguration.setLocale(locale)return createConfigurationContext(configuration)
}@Suppress("DEPRECATION")
private fun Context.updateResourcesLocaleLegacy(locale: Locale): Context {val resources = resourcesval configuration = resources.configurationconfiguration.locale = localeresources.updateConfiguration(configuration, resources.displayMetrics)return this
}

在Activity中使用:

// 设置为法语
val newContext = context.setAppLocale("fr")
// 需要重启Activity使更改生效
recreate()

方法2:在Application类中初始化语言

class MyApp : Application() {override fun onCreate() {super.onCreate()// 从SharedPreferences读取用户选择的语言val lang = getPreferredLanguage()setAppLocale(lang)}private fun getPreferredLanguage(): String {// 从SharedPreferences获取语言设置val prefs = PreferenceManager.getDefaultSharedPreferences(this)return prefs.getString("app_language", "en") ?: "en"}private fun setAppLocale(languageCode: String) {val resources = resourcesval config = resources.configurationval locale = Locale(languageCode)Locale.setDefault(locale)if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {config.setLocale(locale)} else {@Suppress("DEPRECATION")config.locale = locale}if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {createConfigurationContext(config)}@Suppress("DEPRECATION")resources.updateConfiguration(config, resources.displayMetrics)}
}

方法3:使用BaseActivity管理语言

open class BaseActivity : AppCompatActivity() {override fun attachBaseContext(newBase: Context) {// 从SharedPreferences获取语言设置val language = newBase.getPreferredLanguage()super.attachBaseContext(newBase.setAppLocale(language))}
}// 然后让所有Activity继承自BaseActivity
class MainActivity : BaseActivity() {// ...
}// SharedPreferences扩展函数
fun Context.getPreferredLanguage(): String {val prefs = PreferenceManager.getDefaultSharedPreferences(this)return prefs.getString("app_language", "en") ?: "en"
}

切换语言的实用函数

fun Activity.changeAppLanguage(languageCode: String) {// 保存语言设置val prefs = PreferenceManager.getDefaultSharedPreferences(this)prefs.edit().putString("app_language", languageCode).apply()// 更新应用上下文val newContext = setAppLocale(languageCode)// 重启当前Activityrecreate()// 如果需要更新所有Activity,可以发送广播通知其他Activity重启sendBroadcast(Intent("LANGUAGE_CHANGED"))
}

注意事项

资源文件结构

res/values/           # 默认资源 (英语)values-fr/        # 法语资源values-es/        # 西班牙语资源values-zh/        # 中文资源

这些方法可以让你在Android应用中独立于系统设置使用特定的语言。

  1. 语言代码格式

    • 使用ISO 639-1语言代码(如"en", "fr", "es")

    • 对于特定地区的变体,可以使用格式如"zh-rCN"(简体中文)、"zh-rTW"(繁体中文)

  2. 兼容性处理

    • 对于Android 7.0及以上版本使用新的API

    • 对于旧版本使用兼容方法

  3. Activity生命周期

    • 更改语言后通常需要重启Activity才能看到效果

    • 可以使用recreate()方法重启当前Activity

  4. 持久化存储

    • 使用SharedPreferences存储用户的语言选择

    • 每次应用启动时读取设置并应用

  5. 这些方法可以让你在Android应用中独立于系统设置使用特定的语言。

Android应用中设置非系统默认语言(java)-CSDN博客

Jetpack Compose 中更新应用语言-CSDN博客

http://www.xdnf.cn/news/8705.html

相关文章:

  • 机械师安装ubantu双系统:三、GPT分区安装Ubantu
  • 【医学影像 AI】医学影像 AI 入门:PyTorch 基础与数据加载
  • 并发编程艺术--AQS底层源码解析(一)
  • 计算机视觉---YOLOv2
  • [特殊字符] Function Calling 技术详解与 Qwen 模型实践指南
  • mqtt数据包举例
  • 博客摘录「 游戏开发笔记(九)——技能系统」2025年5月25日
  • SAP重塑云ERP应用套件
  • AI数据治理破局的战略重构
  • 【MPC控制】番外篇:MPC 与 机器学习/深度学习 —— 双雄会的相似与不同
  • 计算机网络学习(六)——UDP
  • 远程办公时代macOS访问解决方案:兼顾效率提升与安全防护的实用架构指南
  • 如何利用AI工具提升工作效率?
  • 2021年认证杯SPSSPRO杯数学建模B题(第二阶段)依巴谷星表中的毕星团求解全过程文档及程序
  • Mysql高版本(8.0及以后)Linux安装
  • 删除链表的倒数第N个结点--LeetCode
  • MySQL的存储引擎
  • 什么是 Spring MVC 的异步请求处理?
  • 如何在uniapp H5中实现路由守卫
  • JVM规范之栈帧
  • 15.1 【基础项目】使用 HTML、CSS 和 TypeScript 构建的简单计数器应用
  • LLM之Agent:Mem0的简介、安装和使用方法、案例应用之详细攻略
  • C# Windows Forms应用程序-002
  • # 使用 Hugging Face Transformers 和 PyTorch 实现信息抽取
  • 数据结构第2章 (竟成)
  • 神经网络加上注意力机制,精度反而下降,为什么会这样呢?注意力机制的本质是什么?如何正确使用注意力机制?注意力机制 | 深度学习
  • 清山垃圾的3个问题
  • 6.4.1最小生成树
  • 第二章网络io
  • 对WireShark 中的EtherCAT抓包数据进行解析