我正在开发一个具有英国本地化字符串的应用程序,在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
回退到字符串。因此,我有两个问题:
如何配置我的应用,以便具有加拿大语言环境的设备在en-rCA
中搜索字符串,然后,如果找不到,则默认为默认{{1}中的字符串}文件夹而不是而不是values
?
如何确保语言设置为en-rGB
的设备默认为French (Canada)
,而不是默认en-rCA
?
如果有帮助,我很乐意提供一个例子。谢谢!
答案 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_DE
,es_ES
,fr_FR
,it_IT
。对于Android 7.0之前的较旧API,Android尝试查找完全匹配,如果未找到完全匹配,则默认为values/strings.xml
,即en
。因此,对于en_CA
情况,如果在res/values-en-rCA/strings.xml
中找不到字符串,我们可以预期它会默认为en
。
Android 7.0之后
然而,现在在Android 7.0及更高版本中,对于fr_CH
的情况,它将回退到最近的父方言,即fr_FR
。
将相同的逻辑应用于应用中出现的en_CA
和en_GB
的情况,我认为Android认为en_GB
是最接近的方言到en_CA
并首先回到默认en
而不是默认tests_require
。我在我的应用程序中遇到了这个问题,这是我能提出的唯一合理的解释,为什么这个问题只发生在较新的API版本而不是Android N之前的版本。
答案 1 :(得分:0)
应该自动发生,不做任何事情。如果您有values/strings.xml
,values-en-rGB/strings.xml
和values-en-rCA/strings.xml
,其中GB和CA版本仅包含与基线(values/strings.xml
)不同的字符串,并且用户的区域设置为en-CA,系统将从values-en-rCA/strings.xml
加载字符串,如果没有找到,它将回退到values/strings.xml
,GB版本不会出现在图片中。
为此,您必须在本地更改您的应用区域设置。基本上你得到当前的语言环境,如果它是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());
更新
正如Shobhit提到的,启动Android N,您现在可以在设置中选择一个区域设置列表,您可以决定它们的优先级:
在上述情况下,系统会尝试查找en-rCA/strings
,如果没有找到,它会调查en-rGB/strings
而不是基线,这是在N之前发生的事情。