加拿大的本地化默认为英国;应默认为美国

时间:2017-08-04 16:40:51

标签: android string localization

我正在开发一个具有英国本地化字符串的应用程序,在res/values-en-rGB/strings.xml中指定。对于美国,我的默认字符串实现位于res/values/strings.xml

现在,我正在res/values-en-rCA/strings.xml为加拿大添加其他本地化版本。我会喜欢该应用程序的行为如下:如果用户的设备已本地化为加拿大(或其语言设置为English(Canada)French(Canada)),请检查我们是否有en-rCA中的字符串,如果没有,则回退到我的默认strings.xml文件中的字符串。 但是,当设备设置为加拿大语言环境并且en-rGB中找不到该字符串时,我的应用程序当前从en-rCA回退到字符串。因此,我有两个问题:

  1. 如何配置我的应用,以便具有加拿大语言环境的设备在en-rCA中搜索字符串,然后,如果找不到,则默认为默认{{1}中的字符串}文件夹而不是而不是values

  2. 如何确保语言设置为en-rGB的设备默认为French (Canada),而不是默认en-rCA

    < / LI>

    如果有帮助,我很乐意提供一个例子。谢谢!

2 个答案:

答案 0 :(得分:2)

结局更新:

在Google Incorrect resource resolution strategy above Android N, defaulting to en_GB and not default strings.xml上打开错误报告后,他们提到了上述Android N的预期行为。 en_UK被视为“国际英语的代表”。在转到默认en字符串之前,字符串将回退到“国际英语”字符串或其代表。我在这里引用他们的回复:

  

从N开始,所有英语语言环境(波多黎各和美属萨摩亚等美国和美国地区除外)如果有这样的语言环境,则会回归到某些国际英语版本。

     

因此对于en-CA,我们会首先尝试这些语言环境,然后再回到en-GB(如果没有更好的国际英语语言环境,它被认为是国际英语的代表):en-rCA(加拿大英语), b + en + 001(国际英语),en(英语)。   如果您不希望为en-CA选择en-GB字符串,则应将资源放在这三个目录中的一个中,因为它们被认为是en-CA的更好匹配。

更新1:

似乎这不仅限于en_CA。其他英语语言环境还有另一个类似的问题:Android 7.0 Nougat picks up default strings when device language is en_US。在这个阶段看起来像一个平台错误。

原始答案:

不确定是否是错误或功能。从API级别24(Android 7.0)开始,他们更新了Android解析字符串的方式Improvements to Resource-Resolution Strategy 。以下文档为例:

在Android 7.0之前:

假设用户的设置为fr_CH,以下是应用中可用的资源,即de_DEes_ESfr_FRit_IT。对于Android 7.0之前的较旧API,Android尝试查找完全匹配,如果未找到完全匹配,则默认为values/strings.xml,即en。因此,对于en_CA情况,如果在res/values-en-rCA/strings.xml中找不到字符串,我们可以预期它会默认为enTable 1. Resource resolution without an exact locale match.

Android 7.0之后

然而,现在在Android 7.0及更高版本中,对于fr_CH的情况,它将回退到最近的父方言,即fr_FRTable 2. An improved resolution strategy for when there is no exact locale match.

将相同的逻辑应用于应用中出现的en_CAen_GB的情况,我认为Android认为en_GB最接近的方言en_CA并首先回到默认en而不是默认tests_require。我在我的应用程序中遇到了这个问题,这是我能提出的唯一合理的解释,为什么这个问题只发生在较新的API版本而不是Android N之前的版本。

答案 1 :(得分:0)

  1. 应该自动发生,不做任何事情。如果您有values/strings.xmlvalues-en-rGB/strings.xmlvalues-en-rCA/strings.xml,其中GB和CA版本仅包含与基线(values/strings.xml)不同的字符串,并且用户的区域设置为en-CA,系统将从values-en-rCA/strings.xml加载字符串,如果没有找到,它将回退到values/strings.xml,GB版本不会出现在图片中。

  2. 为此,您必须在本地更改您的应用区域设置。基本上你得到当前的语言环境,如果它是fr-CA,你手动将语言环境设置为en-CA

    Locale enCALocale = new Locale("en", "CA"); 
    Locale.setDefault(enCALocale);
    Configuration config = new Configuration();
    config.locale = enCALocale;
    getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
    
  3. 更新

    正如Shobhit提到的,启动Android N,您现在可以在设置中选择一个区域设置列表,您可以决定它们的优先级:

    enter image description here

    在上述情况下,系统会尝试查找en-rCA/strings,如果没有找到,它会调查en-rGB/strings而不是基线,这是在N之前发生的事情。