我们目前面临着使用AppCompatDelegate.setApplicationLocales()来设置我们的应用程序语言的一些问题. 例如,我们称:

AppCompatDelegate.setApplicationLocales(LocaleListCompat.forLanguageTags("fr"))

在我们的应用程序中更改语言时. 活动按照预期重新创建,我们的应用程序显示了正确的语言.

但之后我们会触发推送通知.它总是以我们默认的应用程序语言(例如"de")显示,而不是以"fr"显示. 通过使用以下代码,我能够解决通知问题:

val storedLanguageTag = AppCompatDelegate.getApplicationLocales()[0]
// In our case we set storedLanguageTag to "fr" or "it"
val newLocale = Locale(storedLanguageTag)
Locale.setDefault(newLocale)
val config = context.resources.configuration
val newConfig = Configuration(config).apply { setLocale(newLocale) }
return context.createConfigurationContext(newConfig)

使用新创建的上下文构建通知可以解决通知的语言问题. 但这感觉像是一种变通办法,而不是正确的解决方案. 我也不明白为什么会发生这种事? 我们正在跟随Per-app language preferences guide来支持Android 12及更低版本.

使用此新创建的上下文创建通知的待定意图和包含意图. 点击通知会打开一个活动,但此活动会显示一些我们默认语言的内容和一些存储语言的内容. 好坏参半.

这怎么会发生呢?

我try 了与通知上下文相同的方法,通过覆盖Activity.attachBaseContext()方法,但活动仍然使用混合语言(默认的"de"和"fr")显示.

有没有人遇到过类似的情况?

这个语言问题只出现在Android 12或更低版本上...在安卓13上运行得很好.所以我想一定有什么实现上的问题.

我们在androidManifest内部的服务如下所示:

<service
    android:name="androidx.appcompat.app.AppLocalesMetadataHolderService"
    android:enabled="false"
    android:exported="false">
    <meta-data
        android:name="autoStoreLocales"
        android:value="true" />
</service>

我们省略了android:localeConfig list 条目,以通过系统设置禁用语言设置(或者我从指南中搞错了?)

推荐答案

找出了根本原因. 在我们的ViewModel人中,我们一直在使用应用程序上下文. 我们通过使用视图模型中的活动上下文解决了这个问题. 我的猜测是AppCompatDelegate只更新AppCompatActivity的上下文,而不是应用程序上下文.

对于通知,我们必须坚持我的问题中提到的解决方法.

Android相关问答推荐

如何使用单个代码库使用不同的firebase项目创建多个应用程序ID apk

使用Kotlin的SD卡

如何go 除回调流中不可用的状态?

Android应用程序中的背景问题

Android Studio -未显示布局预览(不推荐使用安全管理器)

如何从Android 12的来电中获取电话号码?

使用Android Jetpack Compose,为子Composable定义ViewModel是不是一种糟糕的做法?

如何修复Google Play市场中有关已删除广告库的错误消息?

如何解决Gradle构建错误:java.lang.NoSuchMethodError

空数据来自改装

Camera2 将图像从 ImageReader 传递到 MediaRecorder

React-Native Manifest 合并失败并出现多个错误

在本地通知中设置自定义声音

当 Firebase Firestore 发生变化时,Kotlin ViewModel 不会更新

找不到(包名称).在以下位置搜索:

Hilt 依赖注入重复绑定错误

Android Studio 错误要求依赖它的库和应用程序针对 Android API 的 33 版或更高版本进行编译.

不能在kotlin的lazycolumn中使用列表

如何使伴奏导航 BottomSheet 完全展开?

无法再查看 Jetpack Compose 预览.无法实例化一个或多个类 (ComposeViewAdapter)