【问题标题】:How to get current language code with Swift?如何使用 Swift 获取当前语言代码?
【发布时间】:2014-08-26 18:56:00
【问题描述】:

我想在我用 Swift 编写的应用程序中获取设备的语言代码(en、es...)。这个怎么弄?

我正在尝试这个:

var preferredLanguages : NSLocale!
let pre = preferredLanguages.displayNameForKey(NSLocaleIdentifier, value: preferredLanguages)

但这会返回 nil。

【问题讨论】:

    标签: swift nslocale


    【解决方案1】:

    在 Swift 3 中

    let langStr = Locale.current.languageCode
    

    【讨论】:

    • 应该是:Locale.current.identifier 而Locale.current.languageCode 中文,总是返回'zh',但必须区分zh-HK等
    • @User9527 因为您很可能没有在项目设置中启用该语言的本地化。
    • 无法将“String”类型的值分配给“Locale”类型?
    • 据我所知,它会返回在设置 -> 常规 -> 语言和区域 -> iPhone 语言中设置的实际语言,前提是您的项目中启用了该语言的本地化在项目 -> 本地化下。否则它是开发语言。
    • 如何仅使用命令行版本的 xcode 制作输出此值的可执行二进制文件?
    【解决方案2】:

    区分应用语言设备语言很重要(下面的代码在Swift 3中)

    将返回设备语言:

    let locale = NSLocale.current.languageCode
    

    将返回App语言:

    let pre = Locale.preferredLanguages[0]
    

    【讨论】:

    • 我不明白设备语言或应用程序语言之间的区别。你有任何关于差异的文件吗?
    • @Jeremiah locale 将包含设备语言,例如您的设备语言配置为法语。 Pre 将包含用户(或 App)首选语言,例如:您的 App 仅支持中文,因此您可以在法语设备上安装中文 App。希望我澄清了这 4 u
    • 当您说设备配置为法语时,您是什么意思?似乎如果我将设置中的语言更改为英语以外的语言,它将以首选语言而不是语言代码表示。 languageCode 是如何变化的?
    • 不是反过来吗?当我的应用程序开发语言是 EN 并且我在配置了 DE 的设备上运行时,我已经本地化了应用程序,结果是:Locale.current.languageCode: de Locale.current.identifier: de_DE Locale.preferredLanguages[0]: de 当我的应用程序开发语言是 EN 并且我在配置了 FR 的设备上运行时,我有本地化应用程序结果为:Locale.current.languageCode: en Locale.current.identifier: en_FR Locale.preferredLanguages[0]: fr
    • 这是错误的还有 1 个原因:iOS 13.1 引入了每个应用程序的语言设置,Locale.preferredLanguages[0] 没有考虑到这一点,而 Locale.current.languageCode 考虑到了。
    【解决方案3】:

    Swift 4 和 5:

    Locale.current.languageCode
    

    【讨论】:

    • 无法将“String”类型的值分配给“Locale”类型?
    • 试试Locale(identifier: Locale.current.identifier);
    • Locale.autoupdatingCurrent.languageCode 也可用
    【解决方案4】:

    Swift 3 & 4 & 4.2 & 5

    Locale.current.languageCode 不会定期编译。因为您没有为您的项目实施本地化。

    你有两种可能的解决方案

    1) String(Locale.preferredLanguages[0].prefix(2)) 它正确返回电话语言。

    如果要获取en-En的类型,可以使用Locale.preferredLanguages[0]

    2) 选择Project(MyApp)->Project (not Target)->按+键进入Localizations,然后添加你想要的语言。

    【讨论】:

    • 这真的很有趣!您在哪里阅读解决方案一?在苹果文档中找不到此信息
    • 这个解决方案是对的。我已经尝试过很多其他代码,但这是由于 2) 原因。
    【解决方案5】:

    在 Swift 3 中:

    NSLocale.current.languageCode
    

    【讨论】:

      【解决方案6】:

      获取应用中使用的当前语言(不同于首选语言)

      NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode)!
      

      【讨论】:

        【解决方案7】:

        斯威夫特 3

        let preferredLanguage = Locale.preferredLanguages[0] as String
        print (preferredLanguage) //en-US
        
        let arr = preferredLanguage.components(separatedBy: "-")
        let deviceLanguage = arr.first
        print (deviceLanguage) //en
        

        【讨论】:

        • 用“-”分隔语言代码和国家代码是错误的。您的代码会在某些情况下中断,例如“zh-Hans-US”。
        • let langStr = Locale.preferredLanguages.first!this 这就是我对这篇文章所做的评论。它正在工作,我将我的语言与langStr.lowercased().contains("es") 进行比较,例如所有西班牙语变体。
        【解决方案8】:

        TL;DR:

        使用Bundle.main.preferredLocalizations[0] 来获取您的应用程序界面当前显示的语言。不要使用Locale.current,因为它描述了区域格式(时间、货币、距离等)并且具有与语言无关。

        详细回答:

        definite answer 关于如何获取显示应用 UI 的语言的语言(!)代码来自 Apple 工程师 Quinn “The Eskimo”,我引用/解释了 Swift:

        Locale.current 返回当前区域设置,即设置>常规>语言和区域>区域格式设置的值。它与您的应用程序运行的语言无关。对于该领域的用户来说,将他们的语言环境和语言设置为“冲突”值是完全合理的,实际上也很常见。例如,居住在法国的以英语为母语的人会将语言设置为英语,但可能会选择将语言环境设置为法语(因此他们会获得度量权重和度量、24 时间等)。

        应用运行的语言由语言设置决定,即设置>通用>语言和地区>首选语言顺序。当系统运行您的应用程序时,它会获取此语言列表(首选列表)并将其与您的应用程序本地化的语言列表(应用程序列表)进行匹配。应用列表中存在的首选列表中的第一种语言是为应用选择的语言。这就是您可以在主包的 preferredLocalizations 数组的第一个条目中找到的内容。

        代码中的语言名称

        要从一种语言的代码中获取人类可读的名称,您可以使用以下命令:

        let langCode = Bundle.main.preferredLocalizations[0]
        let usLocale = Locale(identifier: "en-US")
        var langName = ""
        if let languageName = usLocale.localizedString(forLanguageCode: langCode) {
            langName = languageName
        }
                
        

        这将为您提供当前 UI 语言的英文名称。

        【讨论】:

        • 考虑使用 Locale.current 而不是 Locale(identifier: "en-US") 也是值得的,这样语言名称将在语言本身中。例如,“Français”而不是“French”
        【解决方案9】:

        您可以使用下面的代码,它可以在 swift 3 中正常工作

        var preferredLanguage : String = Bundle.main.preferredLocalizations.first!
        

        【讨论】:

        • 这实际上仍然适用于 Swift 4!谢谢!
        【解决方案10】:

        我想在用户每次启动我的应用时跟踪用户在设置应用中选择的语言 - 尚未本地化(我的应用只有英文版)。我采用了这个逻辑:

        1. 创建一个 enum 以便于处理 array

          中的语言
          enum Language: String {
          
          case none = ""
          case en = "English"
          case fr = "French"
          case it = "Italian"
          
          } // add as many languages you want
          
        2. 创建几个扩展Locale

          extension Locale {
          
              static var enLocale: Locale {
          
                  return Locale(identifier: "en-EN")
              } // to use in **currentLanguage** to get the localizedString in English
          
              static var currentLanguage: Language? {
          
                  guard let code = preferredLanguages.first?.components(separatedBy: "-").last else {
          
                      print("could not detect language code")
          
                      return nil
                  }
          
                  guard let rawValue = enLocale.localizedString(forLanguageCode: code) else {
          
                      print("could not localize language code")
          
                      return nil
                  }
          
                  guard let language = Language(rawValue: rawValue) else {
          
                      print("could not init language from raw value")
          
                      return nil
                  }
                  print("language: \(code)-\(rawValue)")
          
                  return language
              }
          }
          
        3. 当您需要时,您可以简单地使用扩展程序

          if let currentLanguage = Locale.currentLanguage {
              print(currentLanguage.rawValue)
              // Your code here.
          }
          

        【讨论】:

        • 谢谢@Syscall :)
        • 喜欢这个扩展:)。如果它无法以某种方式阅读,返回 none 会不会更有意义。因为这样一来,价值就可以用来创造一些价值。
        【解决方案11】:

        Locale.current.languageCode 返回错误代码,所以我使用这些扩展:

        extension Locale {
            static var preferredLanguageCode: String {
                let defaultLanguage = "en"
                let preferredLanguage = preferredLanguages.first ?? defaultLanguage
                return Locale(identifier: preferredLanguage).languageCode ?? defaultLanguage
            }
        
            static var preferredLanguageCodes: [String] {
                return Locale.preferredLanguages.compactMap({Locale(identifier: $0).languageCode})
            }
        }
        

        【讨论】:

        • 这是正确的解决方案!
        【解决方案12】:

        斯威夫特 5.4:

        let languagePrefix = Locale.preferredLanguages[0]
        print(languagePrefix)
        

        【讨论】:

          【解决方案13】:

          在 Swift 中,您可以使用获取语言环境。

          let locale = Locale.current.identifier
          

          【讨论】:

            【解决方案14】:

            这是我在 Swift 5 Xcode 11 中使用的:

            类变量内部:

            let languagePrefix = Bundle.main.preferredLocalizations.first?.prefix(2)
            

            这是一个字符串。它返回 2 个字符,即“en”、“es”、“de”...

            由此我可以轻松确定要显示的语言:

             if languagePrefix == "es" { self.flipCard.setTitle("última carta", for: .normal) }
             if languagePrefix == "en" { self.flipCard.setTitle("Last Card", for: .normal) }
            

            如果您想要语言的完整信息,请删除 ?.prefex(2)

            【讨论】:

              【解决方案15】:

              使用此功能从 iOS 设备获取系统当前的语言代码

                  func getSystemLanguageCode() -> String {
                  UserDefaults.standard.removeObject(forKey: "AppleLanguages")
                  let pref_Language = NSLocale.preferredLanguages[0] as String //"fr-IN"
                  let language = pref_Language.components(separatedBy: "-") //["fr","IN"]
                  let lang_Code = language.first?.lowercased() ?? "" //"fr"
                  UserDefaults.standard.set([lang_Code], forKey: "AppleLanguages")
                  
                  return lang_Code
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-03-22
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多