Bundle.preferredLocalizations混乱

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bundle.preferredLocalizations混乱相关的知识,希望对你有一定的参考价值。

preferredLocalizations的3个Bundle令人困惑,我有很多问题:

  1. 为什么2个preferredLocalizations方法是类方法,但是继续讨论一些未指定的特定包,就好像它们被调用在一些单独的Bundle实例上一样? preferredLocalizations(from:)a bundle objectthe bundle究竟是什么? 返回指定列表中的一个或多个本地化,bundle对象将使用这些本地化来查找当前用户的资源。 NSString对象的数组,每个对象都指定bundle支持的本地化的语言ID。 preferred​Localizations(from:​for​Preferences:​)the specified bundlethe receiver’s bundle究竟是什么? 给定指定的bundle和用户的语言首选项,返回bundle对象更喜欢的本地化。 NSString对象的数组,每个对象标识接收器包中的本地化。这些字符串根据指定的首选项在数组中排序,并取自localizations Array参数中的字符串。如果捆绑中没有可用的用户首选本地化,则此方法将返回其中一个捆绑本地化。
  2. 为什么preferredLocalizations(from: localizations)不会返回与preferred​Localizations(from: localizations, ​for​Preferences:​ 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混乱的主要内容,如果未能解决你的问题,请参考以下文章