为啥 NSBundle 只返回与用户的语言偏好匹配的包中存在的第一个本地化而不是所有匹配?

Posted

技术标签:

【中文标题】为啥 NSBundle 只返回与用户的语言偏好匹配的包中存在的第一个本地化而不是所有匹配?【英文标题】:Why does NSBundle only return the first localization present in a bundle that matches the user's language preferences instead of all matches?为什么 NSBundle 只返回与用户的语言偏好匹配的包中存在的第一个本地化而不是所有匹配? 【发布时间】:2011-06-09 04:41:39 【问题描述】:

鉴于 -[NSBundle 本地化] 返回的本地化目录

(en, es, it, nl)

以及 -[NSLocale preferredLanguages] 返回的用户设置的语言首选项

(en, es, nl, ja, fr, de, it, pt-PT, sv, nb, fi, zh-Hans, zh-Hant, ko)

我希望 -[NSBundle preferredLocalizationsFromArray:](或 -preferredLocalizations 或 -preferredLocalizationsFromArray:forPreferences:) 以首选语言顺序返回所有四种可用的本地化。

相反,-preferredLocalizationsFromArray: 仅返回“en”作为本地化资源的可行来源。

为什么?

【问题讨论】:

您有没有找到原因或解决方案?我正在查看 ios 7,这似乎仍然是这种情况...... 【参考方案1】:

preferredLocalizationsFromArray: 的文档说

从指定列表中返回 一个 或多个本地化,bundle 对象将使用这些本地化来为当前用户定位资源。

我猜是一个,而不是或更多

您可能应该file a bug 关于它。

【讨论】:

我希望我们都忽略了一些明显的,甚至不明显的东西,它就像盒子上说的那样工作。但是,您可能有正确的答案,我需要为 NSBundle 的本地化和资源加载 API 编写合适的替换代码。 “但是,希望所有本地化按优先顺序排列的客户可以重复调用,每次都从传入的本地化列表中取出排名靠前的本地化。”根据最新的 NSBundle 类参考。【参考方案2】:

此行为在 iOS 10 中仍然相同。看起来返回的数组将包含多个条目,前提是这些条目被认为是兼容的。

例如,如果您的包支持“pt”和“pt-BR”,并且用户选择了“pt-BR”作为他们的首选语言,那么[[NSBundle mainBundle] preferredLocalizations] 将返回("pt-BR","pt"),因为它是可以接受的如果缺少“pt-BR”内容,则返回“pt”内容。

【讨论】:

以上是关于为啥 NSBundle 只返回与用户的语言偏好匹配的包中存在的第一个本地化而不是所有匹配?的主要内容,如果未能解决你的问题,请参考以下文章

从 firebase 检索数据并设置 VC 以匹配用户偏好

重新安装应用程序后 NSBundle 文件引用丢失

在部分模拟的对象上调用 + [NSBundle bundleForClass:] 返回的结果与未模拟的对象不同?

为啥注册用户后 Firebase 实时数据库用户 ID 与 Firebase 身份验证 UID 不匹配?

MySQL 表设计结构用户偏好

iOS开发之0行代码加载NSBundle中的@2x与@3x图片