我们目前面临着使用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 条目,以通过系统设置禁用语言设置(或者我从指南中搞错了?)