如何使用Swift获取当前语言代码?

时间:2014-07-05 22:45:03

标签: swift nslocale

我希望在使用Swift编写的应用程序中获取设备的语言代码(en,es ...)。怎么能得到这个?

我正在尝试这个:

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

但是这会返回nil。

谢谢!

14 个答案:

答案 0 :(得分:145)

在Swift 3中

let langStr = Locale.current.languageCode

答案 1 :(得分:59)

区分应用程序语言设备区域设置语言之间的区别非常重要(以下代码位于 Swift 3

将返回设备语言:

let locale = NSLocale.current.languageCode

将返回 App 语言:

let pre = Locale.preferredLanguages[0]

答案 2 :(得分:34)

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

NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode)!

答案 3 :(得分:34)

在Swift 3中:

NSLocale.current.languageCode

答案 4 :(得分:24)

在Swift 4中:

Locale.current.languageCode

答案 5 :(得分:13)

快速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,然后添加所需的语言。

答案 6 :(得分:12)

TL;DR:

使用 Bundle.main.preferredLocalizations[0] 获取应用 UI 当前显示的语言。不要使用 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 语言的英文名称。

答案 7 :(得分:7)

swift 3

let prefferedLanguage = Locale.preferredLanguages[0] as String
    print (prefferedLanguage) //en-US

    let arr = prefferedLanguage.components(separatedBy: "-")
    let deviceLanguage = arr.first
    print (deviceLanguage) //en

答案 8 :(得分:4)

您可以使用以下代码,它可以使用swift 3

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

答案 9 :(得分:4)

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

  1. 创建枚举,以便更轻松地处理数组中的语言

    enum Language: String {
    
    case none = ""
    case en = "English"
    case fr = "French"
    case it = "Italian"
    
    } // add as many languages you want
    
  2. 创建一些扩展程序区域设置

    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.
    }
    

答案 10 :(得分:3)

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

let locale = Locale.current.identifier

答案 11 :(得分:3)

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 :(得分:1)

这是我在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)

答案 13 :(得分:0)

Swift 5.3:

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