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

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

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

Kotlin 复制代码
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.configuration
    configuration.setLocale(locale)
    return createConfigurationContext(configuration)
}

@Suppress("DEPRECATION")
private fun Context.updateResourcesLocaleLegacy(locale: Locale): Context {
    val resources = resources
    val configuration = resources.configuration
    configuration.locale = locale
    resources.updateConfiguration(configuration, resources.displayMetrics)
    return this
}

在Activity中使用:

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

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

Kotlin 复制代码
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 = resources
        val config = resources.configuration
        val 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管理语言

Kotlin 复制代码
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"
}

切换语言的实用函数

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

注意事项

资源文件结构

Kotlin 复制代码
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博客

相关推荐
XD7429716361 分钟前
科技早报晚报|2026年5月15日:无摄像头空间感知、Android 设备实验室与视频检索代理,今天更值得跟进的 3 个技术机会
android·科技·音视频·开源项目·边缘ai·开发者工具
应用市场13 分钟前
Android Verified Boot 2.0 安全启动原理详解
android·安全
只可远观13 分钟前
Android XML命令式和Jetpack Compose声明式UI
android·xml
他是龙55127 分钟前
DVWA 靶场深度解析:文件包含 & 文件上传(Low → Impossible)
android
_李小白32 分钟前
【Android车载学习笔记】第一天:Android Automotive OS介绍
android·笔记
aqi0044 分钟前
FFmpeg开发笔记(一百零一)跨平台的开源音视频移动框架MobileFFmpeg
android·ffmpeg·音视频·直播·流媒体
2301_811130542 小时前
【保姆级教程】Android Studio完整安装步骤(2026最新版,新手零踩坑)
android·java
帅次2 小时前
Android 高级工程师面试参考答案:项目经历、自我介绍与实战案例表达
android·面试·职场和发展
小猫爱游戏2 小时前
theone陪伴ai手机版免费版下载安装教程附带最新邀请码theone陪伴ai设定教程接入下载使用教程手机版安卓版app鸿蒙版苹果版IOS电脑版安装包下载地址
android·人工智能·智能手机·theone陪伴ai·theone陪伴ai下载·免费下载安装·接入微信教程