Android 7.1.1中be-BY语言的资源解析策略失效问题
首先得明确一个核心关键点:Resources.Configuration.Locale 始终反映的是系统当前设置的语言区域,不会因为应用没有对应资源就自动切换到默认的 en。你的预期和实际结果的差异,本质是混淆了「资源目录的匹配逻辑」和「系统配置的Locale值」这两个完全不同的概念。
接下来结合Android 7.1.1的资源匹配规则,拆解你的场景:
1. 系统Locale优先级与资源匹配流程
你的系统语言列表优先级是 be_BY(第一)、kk_KZ(第二),应用资源目录包含 values、values-ru、values-ru-rBY、values-ru-rKZ:
- 首先匹配第一优先级的系统Locale
be_BY:- 应用中没有
values-be(白俄罗斯语通用)或values-be-rBY(白俄罗斯语-白俄罗斯)目录,此时会触发区域 fallback——Android 7.x的规则里,当语言不匹配但区域匹配时,会优先尝试同一区域下的其他语言资源。你的values-ru-rBY是俄语-白俄罗斯区域,和系统Locale的区域BY匹配,所以会选择这个目录下的资源。 - 重点注意:这个资源匹配过程不会修改
Resources.Configuration.Locale的值,它依然保持系统设置的be_BY,因为这个字段的作用是标识当前系统的语言偏好,而非实际选中的资源对应的Locale。
- 应用中没有
2. 为什么预期的en没有出现?
默认的 values 目录对应的是「无特定Locale」的兜底资源,只有当系统Locale的所有可能fallback路径都找不到匹配的资源时,才会使用这个目录的内容。但在你的场景中,be_BY 通过区域匹配找到了 values-ru-rBY,所以根本不会走到默认的 values,更不会把Configuration的Locale改成 en——en 只有在系统Locale完全没有任何匹配资源、且应用也没有其他兼容资源可选时,才可能作为最后的兜底,但即便如此,Configuration.Locale 还是会保持系统设置的值。
3. 验证与调整建议
如果你希望应用使用默认的values资源,可以尝试移除 values-ru-rBY 目录,这样 be_BY 既没有对应语言资源,也没有同区域的其他语言资源,就会 fallback到默认 values,但 Configuration.Locale 依然会是 be_BY。如果非要让 Configuration.Locale 变成 en,只能手动修改应用的Configuration(非常不推荐,会破坏系统语言偏好的一致性)。
内容的提问来源于stack exchange,提问作者ichernob

