【问题标题】:Get fallback locale when device locale strings.xml is not present当设备区域设置 strings.xml 不存在时获取备用区域设置
【发布时间】:2021-07-02 15:33:05
【问题描述】:

根据documentation,Android 7 及更高版本将使用内置的后备逻辑来确定在与用户最匹配的语言环境中向用户呈现哪些资源。文档中给出的示例将不支持的 fr_CH 退回到支持的 fr_FR,这是相同的语言,不同的国家/地区代码。所以如果用户的设备在 fr_CH,他们会看到 fr_FR assets/strings/etc。

是否有可能获得该后备语言环境值?也就是说(使用上面的示例),假设我有一个用户的设备位于 fr_CH 并且我的应用程序支持 fr_FR,Android 是否提供了一种方法来通知我 fr_FR 是将使用的后备语言环境?

【问题讨论】:

    标签: android kotlin localization


    【解决方案1】:

    不是一个确切的答案,而是我发现在我的用例中有效的解决方法。需要一些繁琐的手动设置。

    在我的用例中,我假设所有字符串键都存在于应用程序的所有 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”键,并且该值不会通过您的翻译服务自动翻译。到目前为止,我想出的最好的东西;如果我发现更好的东西,我会更新这篇文章。

    感谢任何找到这篇文章的人的反馈和建议(或完全不同的方法)!

    【讨论】:

      猜你喜欢
      • 2014-06-14
      • 2013-01-01
      • 2017-05-17
      • 1970-01-01
      • 1970-01-01
      • 2011-02-05
      • 2021-01-03
      • 1970-01-01
      • 2011-09-26
      相关资源
      最近更新 更多