【问题标题】:iOS: How to Get the Device Current Language Setting?iOS:如何获取设备当前语言设置?
【发布时间】:2011-10-13 08:29:53
【问题描述】:

我的应用程序中有一些功能应该基于运行它的设备的语言设置。

我想获取实际语言,而不是某些国家/地区设置。例如,如果语言是英语,我不在乎是美国、英国、澳大利亚等......

我熟悉 NSLocale 对象,但它似乎与 Region Format 设置有关,而不是与 语言 设置有关(见下面的屏幕截图)所以当我尝试检索使用[locale displayNameForKey:NSLocaleIdentifier value:[locale localeIdentifier] 的语言我得到类似English (United States) 而不是English 的东西;另外,我认为我需要的是 Language 数据,而不是 Region Format(对吗?)。

谁能指导我如何检索语言设置?

【问题讨论】:

    标签: ios locale local setting


    【解决方案1】:

    存储的用户首选语言可以作为数组从语言环境中检索,当前语言标识符是该数组中的第一个对象:

    NSString *currentLanguage = [[NSLocale preferredLanguages] objectAtIndex:0];
    

    如果您希望语言更易读,请使用 NSLocale 的displayNameForKey:value: 方法:

    NSString *langID = [[NSLocale preferredLanguages] objectAtIndex:0];
    NSString *lang = [[NSLocale currentLocale] displayNameForKey:NSLocaleLanguageCode value:langID];
    

    【讨论】:

    • 最后的's'参数是什么?应该是 langID 吗?
    • @Flink,确实是 langID。感谢您的评论,我将编辑答案。奇怪的是,错误这么久都没有被发现:)
    • 警告:在 iOS 9 中,NSLocale preferredLanguages 的返回值发生了变化。如果之前你只得到“en”,在 iOS 9 中你会得到“en-US”或“en-JP”等。参考:happyteamlabs.com/blog/…
    【解决方案2】:

    试试这个:

    NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
    NSArray* arrayLanguages = [userDefaults objectForKey:@"AppleLanguages"];
    NSString* currentLanguage = [arrayLanguages objectAtIndex:0];
    

    【讨论】:

      【解决方案3】:

      获取Swift中的语言和地区:

          LF.log("language", NSLocale.preferredLanguages())
          LF.log("locale", NSBundle.mainBundle().preferredLocalizations)
      

      在我的情况下,我得到:

      language: '(
          "zh-Hans"
      )'
      locale: '(
          en
      )'
      

      【讨论】:

      • NSBundle.mainBundle().preferredLocalizations 没有给出当前的设备语言。如果 CFBundleAllowMixedLocalizations 在 info.plist 中为真,则给出您在 info.plist 的 CFBundleDevelopmentRegion 中给出的语言,那么 info.plist 中 CFBundleLocalizations 的第一项是返回
      【解决方案4】:

      Swift 4 中:

      let currentLanguage = Locale.current.languageCode
      

      它只会给你语言代码,没有国家代码。

      【讨论】:

        【解决方案5】:

        斯威夫特:

        let language = NSBundle.mainBundle().preferredLocalizations[0] as NSString
        

        【讨论】:

        • 不幸的是,这是一个错误的答案。如果您将系统语言设置为法语并且您的“语言和地区”设置为美国,您将得到“en”而不是“fr”,而问题是询问语言。
        • NSBundle.mainBundle().preferredLocalizations 没有给出当前设备语言。如果 CFBundleAllowMixedLocalizations 在 info.plist 中为真,那么给出您在 info.plist 的 CFBundleDevelopmentRegion 中给出的语言,那么 info.plist 中 CFBundleLocalizations 的第一项是返回
        【解决方案6】:

        工作解决方案:

            let language = NSLocale.preferredLanguages()[0]
            let languageDic = NSLocale.componentsFromLocaleIdentifier(language) as NSDictionary
            //let countryCode = languageDic.objectForKey("kCFLocaleCountryCodeKey")
            let languageCode = languageDic.objectForKey("kCFLocaleLanguageCodeKey") as! String
            print(languageCode)
        

        【讨论】:

          【解决方案7】:
          NSString * language = [[NSLocale preferredLanguages] objectAtIndex:0]; 
          

          【讨论】:

            【解决方案8】:

            在 XCode 的帮助文档中找到解决方案,它写道:

            获取当前语言

            要从主应用程序包中获取应用程序使用的语言,请使用 NSBundle 类中的 preferredLocalizations 方法:

            NSString *languageID = [[NSBundle mainBundle] preferredLocalizations].firstObject;

            【讨论】:

              【解决方案9】:

              使用下面的代码来获取本地化语言,而不会遇到 en-india、en-us 等问题。

               NSString *Ph = [[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0];
              

              在ios9及之后这段代码需要考虑

              【讨论】:

              • 这不给出当前设备语言。如果 CFBundleAllowMixedLocalizations 在 info.plist 中为真,则给出您在 info.plist 的 CFBundleDevelopmentRegion 中给出的语言,则返回 info.plist 中 CFBundleLocalizations 的第一项
              【解决方案10】:

              要了解在您的本地化中选择的当前语言,请使用

              [[NSBundle mainBundle] preferredLocalizations]
              

              例子:

              NSString *language = [[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0];
              

              得到两个字母的单词

              NSString *language = [[[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0] substringToIndex:2];
              

              斯威夫特:

              let language = NSBundle.mainBundle().preferredLocalizations.first as NSString
              

              【讨论】:

              • 这不给出当前设备语言。如果 CFBundleAllowMixedLocalizations 在 info.plist 中为真,则给出您在 info.plist 的 CFBundleDevelopmentRegion 中给出的语言,则返回 info.plist 中 CFBundleLocalizations 的第一项
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-03-15
              • 1970-01-01
              • 1970-01-01
              • 2023-04-06
              • 1970-01-01
              • 2014-10-05
              相关资源
              最近更新 更多