马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
以下是使用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.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中使用:
- // 设置为法语
- 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 = 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管理语言
- 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)
-
- // 重启当前Activity
- recreate()
-
- // 如果需要更新所有Activity,可以发送广播通知其他Activity重启
- sendBroadcast(Intent("LANGUAGE_CHANGED"))
- }
复制代码 留意事项
资源文件结构:
- res/
- values/ # 默认资源 (英语)
- values-fr/ # 法语资源
- values-es/ # 西班牙语资源
- values-zh/ # 中文资源
复制代码
这些方法可以让你在Android应用中独立于系统设置使用特定的语言。
- 语言代码格式:
- 使用ISO 639-1语言代码(如"en", "fr", "es")
- 对于特定地区的变体,可以使用格式如"zh-rCN"(简体中文)、"zh-rTW"(繁体中文)
- 兼容性处置惩罚:
- 对于Android 7.0及以上版本使用新的API
- 对于旧版本使用兼容方法
- Activity生命周期:
- 更改语言后通常需要重启Activity才能看到效果
- 可以使用recreate()方法重启当前Activity
- 长期化存储:
- 使用SharedPreferences存储用户的语言选择
- 每次应用启动时读取设置并应用
- 这些方法可以让你在Android应用中独立于系统设置使用特定的语言。
Android应用中设置非系统默认语言(java)-CSDN博客
Jetpack Compose 中更新应用语言-CSDN博客
|