preferredLocalizations
的3 Bundle
令人困惑,以至于我有这么多问题:
为什么2 preferredLocalizations
方法是类方法,但是继续讨论某些未指定的特定包,就好像它们是在某个单独的Bundle
实例上调用一样?
preferredLocalizations(from:)
:a bundle object
和the bundle
究竟是什么?
从指定列表中返回一个或多个本地化,捆绑对象将用于查找当前用户的资源。
一组NSString对象,每个对象都指定捆绑支持的本地化的语言ID。
preferredLocalizations(from:forPreferences:)
:the specified bundle
和the receiver’s bundle
究竟是什么?
在给定指定的包和用户的语言首选项的情况下,返回包对象更喜欢的本地化。
一组NSString对象,每个对象都标识接收者的捆绑中的本地化。这些字符串根据指定的首选项在数组中排序,并取自localizations Array参数中的字符串。如果捆绑中没有可用的首选本地化,则此方法将返回其中一个捆绑本地化。
为什么preferredLocalizations(from: localizations)
会返回与preferredLocalizations(from: localizations, forPreferences: nil)
相同的结果?如上所述,阅读他们的文档并不能提供帮助。当然,他们看起来像这样设计,但实际上不是:
// Locale.preferredLanguages: ["es-CN", "ja-CN", "zh-Hans-CN", "en-CN", "he-IL"].
let localizations = ["de", "en", "es", "fr", "it"]
print(Bundle.preferredLocalizations(from: localizations)) // ["en"]
print(Bundle.preferredLocalizations(from: localizations, forPreferences: nil)) // ["es"]
答案 0 :(得分:0)
参考文献并不是那么好; Technical Note 2418更好地解释了它。
具体来说,它说
请注意,Bundle.preferredLocalizations(from :)会将结果限制为Bundle.mainBundle()支持的本地化,或Bundle.mainBundle()。localizations()的返回值。如果你想匹配一组不同的语言标识符,请使用Bundle.preferredLocalizations(from:forPreferences :),它不依赖于mainBundle的本地化,而只依赖于传入的两个参数。
所以,
Bundle.preferredLocalizations(from:)
,则首先根据为主要包(Bundle.main.localizations
)定义的本地化过滤您提供的本地化列表。Bundle.preferredLocalizations(from:forPreferences:)
,则可以使用您提供的列表。 在您提供的示例中,Bundle.preferredLocalizations(from: localizations)
返回["en"]
。这可能是因为您的应用没有定义任何版本的西班牙语(“es”)。如果您向项目添加西班牙语本地化,则应返回["es"]
,因为“es-CN”列在“en-CN”之前。