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

我想得到的语言代码的设备(嗯,是...)在我的应用程序写与 Swift。怎么会这样?

我试试这个:

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

但结果是零。

173922 次浏览

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

NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode)!

雨燕3:

NSLocale.current.languageCode

在 Swift 3里

let langStr = Locale.current.languageCode

雨燕3

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


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

区分 应用程序语言设备本地化语言设备本地化语言非常重要(下面的代码是 Swift 3)

将返回 装置语言:

let locale = NSLocale.current.languageCode

将返回 应用程序语言:

let pre = Locale.preferredLanguages[0]

你可以使用下面的代码,它与迅捷3工作得很好

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

我想跟踪用户在设置应用程序中选择的语言每次用户启动我的应用程序-这是还没有本地化(我的应用程序是在英语只)。我采用了这种逻辑:

  1. 创建一个 枚举,使处理 < em > 数组中的语言更加容易

    enum Language: String {
    
    
    case none = ""
    case en = "English"
    case fr = "French"
    case it = "Italian"
    
    
    } // add as many languages you want
    
  2. create a couple of extension to 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. When you need, you can simply use the extension

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

迅捷4 & 5:

Locale.current.languageCode

斯威夫特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,然后添加您想要的语言。

在 Swift 中,可以使用。

let locale = Locale.current.identifier

Locale.current.languageCode返回错误的代码,所以我使用了以下扩展:

extension Locale {
static var preferredLanguageCode: String {
guard let preferredLanguage = preferredLanguages.first,
let code = Locale(identifier: preferredLanguage).languageCode else {
return "en"
}
return code
}
    

static var preferredLanguageCodes: [String] {
return Locale.preferredLanguages.compactMap({Locale(identifier: $0).languageCode})
}
}

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

雨燕5.4:

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

译者:

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

详细答案:

关于如何得到语言的 肯定的回答(!)你的应用程序用户界面显示的语言代码来自苹果工程师 Quinn“ The Eskimo”,我引用/解释一下 Swift:

Locale.current返回当前区域设置,即由 设置 > 一般资料 > 语言及地区 > 地区格式设置的值。它与应用程序所使用的语言无关。对于字段中的用户来说,将他们的区域设置和语言设置为“冲突”值是完全合理的,而且事实上也是相当常见的。例如,生活在法国的以英语为母语的人可能会将语言设置为英语,但可能会选择将地区设置为法语(因此他们会得到公制重量和度量,24次,以此类推)。

应用程序运行所使用的语言由语言设置(即 设置 > 一般资料 > 语言及地区 > 首选语言次序)决定。当系统运行你的应用程序时,它会将这个语言列表(首选列表)与你的应用程序本地化的语言列表(应用程序列表)进行匹配。首选列表中存在于应用程序列表中的第一种语言是为应用程序选择的语言。这就是您将在 main bundle 的 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 语言的英文名称。

使用此功能从 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
}

在大多数情况下,您希望获得当前应用程序用户界面的语言代码,以便通过 API 获得本地化响应

extension Bundle {
    

var currentLocalizedUILanguageCode: String {
guard let code = Bundle.main.preferredLocalizations.first?.components(separatedBy: "-").first else {
return Locale.current.languageCode ?? "en"
}
return code
}
    

}

使用

headers["X-Language"] = Bundle.main.currentLocalizedUILanguageCode