【发布时间】:2014-08-26 18:56:00
【问题描述】:
我想在我用 Swift 编写的应用程序中获取设备的语言代码(en、es...)。这个怎么弄?
我正在尝试这个:
var preferredLanguages : NSLocale!
let pre = preferredLanguages.displayNameForKey(NSLocaleIdentifier, value: preferredLanguages)
但这会返回 nil。
【问题讨论】:
我想在我用 Swift 编写的应用程序中获取设备的语言代码(en、es...)。这个怎么弄?
我正在尝试这个:
var preferredLanguages : NSLocale!
let pre = preferredLanguages.displayNameForKey(NSLocaleIdentifier, value: preferredLanguages)
但这会返回 nil。
【问题讨论】:
在 Swift 3 中
let langStr = Locale.current.languageCode
【讨论】:
区分应用语言和设备语言很重要(下面的代码在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
Locale.preferredLanguages[0] 没有考虑到这一点,而 Locale.current.languageCode 考虑到了。
Swift 4 和 5:
Locale.current.languageCode
【讨论】:
Locale(identifier: Locale.current.identifier);
Locale.autoupdatingCurrent.languageCode 也可用
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,然后添加你想要的语言。
【讨论】:
在 Swift 3 中:
NSLocale.current.languageCode
【讨论】:
获取应用中使用的当前语言(不同于首选语言)
NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode)!
【讨论】:
斯威夫特 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!this 这就是我对这篇文章所做的评论。它正在工作,我将我的语言与langStr.lowercased().contains("es") 进行比较,例如所有西班牙语变体。
使用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 语言的英文名称。
【讨论】:
您可以使用下面的代码,它可以在 swift 3 中正常工作
var preferredLanguage : String = Bundle.main.preferredLocalizations.first!
【讨论】:
我想在用户每次启动我的应用时跟踪用户在设置应用中选择的语言 - 尚未本地化(我的应用只有英文版)。我采用了这个逻辑:
创建一个 enum 以便于处理 array
中的语言enum Language: String {
case none = ""
case en = "English"
case fr = "French"
case it = "Italian"
} // add as many languages you want
创建几个扩展到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
}
}
当您需要时,您可以简单地使用扩展程序
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})
}
}
【讨论】:
斯威夫特 5.4:
let languagePrefix = Locale.preferredLanguages[0]
print(languagePrefix)
【讨论】:
在 Swift 中,您可以使用获取语言环境。
let locale = Locale.current.identifier
【讨论】:
这是我在 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)
【讨论】:
使用此功能从 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
}
【讨论】: