【问题标题】:`NSLocale preferredLanguages` contains "-US" since iOS 9`NSLocale preferredLanguages` 自 iOS 9 起包含“-US”
【发布时间】:2015-10-06 17:57:42
【问题描述】:

我们有如下代码来检索用户语言偏好:

NSString *language = [[NSLocale preferredLanguages] firstObject];

在 iOS 8.4 之前,language 是“zh-Hans”、“de”、“ru”、“ja”等。但从 iOS 9 开始,我注意到附加了三个字符“-US” language。例如,“zh-Hans”变成“zh-Hans-US”

我可以找到有关此更改的任何文档。我认为我可以执行以下操作来解决此问题。

NSRange range = [language rangeOfString:@"-US"];
if (range.location!=NSNotFound && language.length==range.location+3) {
    // If the last 3 chars are "-US", remove it
    language = [language substringToIndex:range.location];
}

但是,我不确定这样做是否安全。似乎“-US”是用户使用该应用程序的位置?但这没有任何意义,因为我们在加拿大。世界其他地方有没有人尝试过这个?

【问题讨论】:

    标签: ios ios9


    【解决方案1】:

    Apple 已开始在 iOS 9 的语言区域设置中添加区域。根据 Apple 的文档,如果未指定区域,它现在具有回退机制。如果您只需要支持某些语言,根据 Apple 的文档建议,这是我的解决方法:

    NSArray<NSString *> *availableLanguages = @[@"en", @"es", @"de", @"ru", @"zh-Hans", @"ja", @"pt"];
    self.currentLanguage = [[[NSBundle preferredLocalizationsFromArray:availableLanguages] firstObject] mutableCopy];
    

    这将根据用户的语言设置自动分配数组中的一种语言,而无需担心区域。

    来源:Technical Note TN2418

    【讨论】:

      【解决方案2】:

      要提取区域,我认为这是一个更好的解决方案:

      // Format is Lang - Region
      NSString *fullString = [[NSLocale preferredLanguages] firstObject];
      NSMutableArray *langAndRegion = [NSMutableArray arrayWithArray:[fullString componentsSeparatedByString:@"-"]];
      
      // Region is the last item
      NSString *region = [langAndRegion objectAtIndex:langAndRegion.count - 1];
      
      // We remove region
      [langAndRegion removeLastObject];
      
      // We recreate array with the lang
      NSString *lang = [langAndRegion componentsJoinedByString:@"-"];
      

      【讨论】:

      • 是的,谢谢~ 这也可以。但在这种情况下,对于automatic fallback 等,我更喜欢@Bill L 的方法。而且,自定义代码越少越好。我们不能保证 Apple 会在 iOS 10 中再次将格式更改为“zh-Hans, US”:P
      【解决方案3】:

      Swift 5:从首选语言中删除区域

      使用Locale.preferredLanguages.first 为您提供首选的应用程序语言(可以不同于用户的设备语言)。

      为了支持脚本代码和语言代码(但要删除区域代码),我认为最好创建一个给定首选语言的语言环境并从那里获取我们需要的信息。

      if  let pref = Locale.preferredLanguages.first {
          
          let locale = Locale(identifier: pref)
          let code = [locale.languageCode, locale.scriptCode].compactMap{$0}.joined(separator: "-")
          print(code)
      }
      

      所以首先我们获得首选的应用语言,然后从该语言创建一个区域设置。

      为了获取语言代码,我们使用locale.languageCodelocale.scriptCode(可能为nil)创建了一个数组,使用compactMap 删除所有nil 值,然后使用“-”连接这些值。

      这应该允许支持简体中文和繁体,并让 Apple 处理该区域,而不是假设它会一直存在。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-21
        • 2014-12-23
        • 2011-12-13
        • 1970-01-01
        • 1970-01-01
        • 2023-04-05
        相关资源
        最近更新 更多