Answers:
在Swift 3中
let langStr = Locale.current.languageCode
区分App语言和设备区域设置语言是很重要的(下面的代码在Swift 3中)
将返回设备语言:
let locale = NSLocale.current.languageCode
将返回App语言:
let pre = Locale.preferredLanguages[0]
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
Swift 4和5:
Locale.current.languageCode
Locale(identifier: Locale.current.identifier)
;
Locale.autoupdatingCurrent.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
,然后添加所需的语言。
迅捷3
let preferredLanguage = Locale.preferredLanguages[0] as String
print (preferredLanguage) //en-US
let arr = preferredLanguage.components(separatedBy: "-")
let deviceLanguage = arr.first
print (deviceLanguage) //en
let langStr = Locale.preferredLanguages.first!
这就是我对这篇文章的评论。它正在运行,例如,我将langStr.lowercased().contains("es")
所有西班牙语言版本的语言与我的语言进行比较。
您可以使用以下代码,在swift 3上可以正常使用
var preferredLanguage : String = Bundle.main.preferredLocalizations.first!
每当用户启动我的应用程序时,我想跟踪用户在“设置”应用程序中选择的语言-该语言尚未本地化(我的应用程序仅使用英语)。我采用了以下逻辑:
创建一个枚举以使其更易于处理数组中
enum Language: String {
case none = ""
case en = "English"
case fr = "French"
case it = "Italian"
} // add as many languages you want
创建两个延伸到语言环境
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
}
}
必要时,您可以简单地使用扩展名
if let currentLanguage = Locale.currentLanguage {
print(currentLanguage.rawValue)
// Your code here.
}
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})
}
}
这是我在Swift 5 Xcode 11中使用的:
在类变量里面:
let languagePrefix = Bundle.main.preferredLocalizations.first?.prefix(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)