当设备语言为 en_US 时,Android 7.0 Nougat 会选择默认字符串

Sub*_*nha 6 android locale localization android-resources android-7.0-nougat

根据语言和区域设置中的文档,Android 7.0(API 级别 24)对资源解析策略进行了改进,下表很容易理解: 改进的资源解析策略

根据我的要求,我希望我的应用程序的默认语言为 en_US。所以,我没有为 en_US 提供单独的资源。我还单独提供了 en_GB 资源。

现在,根据解析策略,如果我的设备的语言是 en_US,那么它查找资源的顺序是 en_US -> en -> en_GB -> default 这意味着对于 en 的所有语言环境,在我的情况下将选择 en_GB因为我没有单独的“en”资源,但是存在子“en_GB”。

但是,当我将设备语言选择为 en_US 时,它会正确选择默认语言(在我的情况下为 en_US)而不是 en_GB,这正是我在设备语言为 en_US 的情况下所需要的。When some other locale like en_IN or en_AU is selected, it picks up en_GB.

解决此问题的一种方法是我分别在 'en' 和 en_GB 中提供 en_US 字符串,这将导致我想要的行为。但是,当我选择 en_US 作为我的设备语言时,我无法理解为什么会选择默认字符串。

是否 en_US 是 android 的默认语言,每当 en_US 被选为设备的语言时,如果 en_US 未单独提供,它会选择默认字符串?

Sho*_*uri 3

我也有同样的问题。在打开关于 Android N 上的 Google In Correct Resource Resolution Strategy(默认为 en_GB 而不是默认 strings.xml )的错误报告后,他们在上面 Android N 的预期行为中提到了这一点。我在这里引用他们的回复:

从 N 开始,所有英语语言环境(除了美国和美国领土,如波多黎各和美属萨摩亚)都会回退到某种国际英语变体(如果此类语言环境可用)。

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

所以,原来我们en_UK被认为是“国际英语的代表”。字符串将回退为“International English”或其之前的代表en