Bundle.preferredLocalizations混乱

时间:2017-03-24 16:09:14

标签: ios localization nsbundle

preferredLocalizations的3 Bundle令人困惑,以至于我有这么多问题:

  1. 为什么2 preferredLocalizations方法是类方法,但是继续讨论某些未指定的特定包,就好像它们是在某个单独的Bundle实例上调用一样?

    • preferredLocalizations(from:)a bundle objectthe bundle究竟是什么?

      1.   

        从指定列表中返回一个或多个本地化,捆绑对象将用于查找当前用户的资源。

      2.   

        一组NSString对象,每个对象都指定捆绑支持的本地化的语言ID。

    • preferred​Localizations(from:​for​Preferences:​)the specified bundlethe receiver’s bundle究竟是什么?

      1.   

        在给定指定的包和用户的语言首选项的情况下,返回包对象更喜欢的本地化。

      2.   

        一组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"]
    

1 个答案:

答案 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”之前。