You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android应用内语言切换在API32及以下设备失效问题排查

问题定位与解决

1. Locale语言标签格式错误

你在setLanguage方法中固定拼接了-RO后缀,导致切换英文时生成的标签是en-RO——这是无效的Locale组合(英文+罗马尼亚地区),旧版本Android对这类不规范标签兼容性差,无法正确识别为英文,直接导致语言切换失效。

修复方法:根据传入的语言参数生成对应正确的Locale标签:

fun setLanguage(language: String) {
    App.preferences.edit().putString(App.LANGUAGE_SELECTION, language).apply()
    // 英文不需要绑定罗马尼亚地区,仅罗马尼亚语使用-ro-RO标签
    val tag = if (language == "en") "en" else "$language-RO"
    val appLocale: LocaleListCompat = LocaleListCompat.forLanguageTags(tag)
    AppCompatDelegate.setApplicationLocales(appLocale)
}

2. 旧设备需手动触发Activity重建

Android 12及以下版本中,AppCompatDelegate.setApplicationLocales可能不会自动触发Activity的配置变更重建,导致语言资源无法即时加载。

修改按钮点击逻辑,添加手动重启:

when (item?.itemId) {
    R.id.romanian_button -> {
        LocaleHelper().setLanguage("ro")
        restartCurrentActivity()
    }
    R.id.english_button_button -> {
        LocaleHelper().setLanguage("en")
        restartCurrentActivity()
    }
}

// 新增重启Activity方法
private fun restartCurrentActivity() {
    val currentIntent = intent
    finish()
    startActivity(currentIntent)
    overridePendingTransition(0, 0) // 可选,消除重启动画
}

3. 补全启动时的Locale恢复逻辑

确保App启动时从SharedPreferences读取保存的语言并重新设置,避免重启后语言重置为默认值:
在Application的onCreate或主Activity的onCreate中添加:

val savedLang = App.preferences.getString(App.LANGUAGE_SELECTION, "en") ?: "en"
LocaleHelper().setLanguage(savedLang)

4. 验证资源目录配置

确认res目录下存在正确的语言资源文件夹:

  • 英文默认资源:values/strings.xml
  • 罗马尼亚语资源:values-ro/strings.xml
    确保两个文件夹内的字符串资源key完全一致,避免因资源缺失导致旧设备 fallback 到默认英文。

内容的提问来源于stack exchange,提问作者Ramona Morea

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 16:25:35