不是一个确切的答案,而是我发现在我的用例中有效的解决方法。需要一些繁琐的手动设置。
在我的用例中,我假设所有字符串键都存在于应用程序的所有 strings.xml 文件中。也就是说,如果我有一个键“my_string_key”,我假设它在我与应用程序捆绑的每个语言环境的 strings.xml 中。
有了这个假设,我在每个 strings.xml 文件中创建了一个键“zzz_resolution_locale_bcp_code”。此键保存该 strings.xml 文件的语言环境作为其值。例如,在我的资源目录 values-b+es+419 中的 strings.xml 文件中,条目是
<string name="zzz_resolution_locale_bcp_code">es-419</string>
当我实例化我的本地化管理器时,我根据用户的语言偏好设置资源对象(用户有一个应用内选项来选择与他们的设备语言不同的语言):
val locale = Locale(language, marketplace)
// Create a new Configuration based on the old one, we just put in the new Locale
val overrideConf = Configuration(context.resources.configuration)
overrideConf.setLocale(localeOverride)
val localizedContext = context.createConfigurationContext(overrideConf)
return localizedContext.resources
并使用该资源对象调用 getString("zzz_resolution_locale_bcp_code")。如果应用程序支持该语言,则返回值将反映我用于设置区域设置的相同语言和市场。如果返回值是不同,我知道在获取应用程序的其余字符串时将使用语言环境的strings.xml 文件Android。
例如,假设用户的设备使用 es-CR(哥斯达黎加西班牙语)并且他们没有选择应用内语言覆盖。我们为 es-CR 设置资源对象,然后在“zzz_resolution_locale_bcp_code”上调用 getString。它返回“es-419”,因为该应用程序不支持 es-CR,并且 Android 的后备系统最终找到了我的 values-b+es+419 目录中的 strings.xml 文件。
乏味的一点是确保每个 strings.xml 文件都有“zzz_resolution_locale_bcp_code”键,并且该值不会通过您的翻译服务自动翻译。到目前为止,我想出的最好的东西;如果我发现更好的东西,我会更新这篇文章。
感谢任何找到这篇文章的人的反馈和建议(或完全不同的方法)!