Bundle.preferredLocalizations混乱
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bundle.preferredLocalizations混乱相关的知识,希望对你有一定的参考价值。
preferredLocalizations
的3个Bundle
令人困惑,我有很多问题:
- 为什么2个
preferredLocalizations
方法是类方法,但是继续讨论一些未指定的特定包,就好像它们被调用在一些单独的Bundle
实例上一样?preferredLocalizations(from:)
:a bundle object
和the bundle
究竟是什么? 返回指定列表中的一个或多个本地化,bundle对象将使用这些本地化来查找当前用户的资源。 NSString对象的数组,每个对象都指定bundle支持的本地化的语言ID。preferredLocalizations(from:forPreferences:)
:the specified bundle
和the receiver’s bundle
究竟是什么? 给定指定的bundle和用户的语言首选项,返回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"]
答案
参考文献并不是那么好; 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”之前。
以上是关于Bundle.preferredLocalizations混乱的主要内容,如果未能解决你的问题,请参考以下文章