我想在我用Swift编写的应用程序中获取设备的语言代码(en,es ...).怎么能得到这个?
我正在尝试这个:
var preferredLanguages : NSLocale!
let pre = preferredLanguages.displayNameForKey(NSLocaleIdentifier, value: preferredLanguages)
Run Code Online (Sandbox Code Playgroud)
但这会返回零.
谢谢!
Vad*_*ine 164
在Swift 3中
let langStr = Locale.current.languageCode
Run Code Online (Sandbox Code Playgroud)
rae*_*aed 68
在App语言和设备语言环境之间做出区别非常重要(下面的代码在Swift 3中)
将返回设备语言:
let locale = NSLocale.current.languageCode
Run Code Online (Sandbox Code Playgroud)
将返回App语言:
let pre = Locale.preferredLanguages[0]
Run Code Online (Sandbox Code Playgroud)
Bog*_*kiy 39
在Swift 4中:
Locale.current.languageCode
Run Code Online (Sandbox Code Playgroud)
小智 36
获取应用中使用的当前语言(不同于首选语言)
NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode)!
Run Code Online (Sandbox Code Playgroud)
Ali*_*RAL 20
Swift 3&4和4.2
Locale.current.languageCode并没有定期进行编译.因为你没有实现本地化到项目.
您有2个选择解决方案
第一
String(Locale.preferredLanguages[0].prefix(2)) 它正确地返回电话.
如果你想获得en-En类型,你可以使用Locale.preferredLanguages[0]
第二
选择Project(MyApp) - > Project(not Target) - >然后按+按钮进入Localizations,然后添加所需的语言.
Joh*_*rug 14
使用Bundle.main.preferredLocalizations[0]让您的应用的用户界面当前显示的语言。不要使用Locale.current,因为它描述了区域的格式(时间,货币,距离等),并有无关的语言。
关于如何获取应用程序 UI 所显示语言的语言(!)代码的明确答案来自 Apple 工程师 Quinn“The Eskimo”,我引用/解释了 Swift:
Locale.current返回当前区域设置,即由Settings > General > Language & Region > Region Formats 设置的值。这与您的应用程序运行所使用的语言无关。对于该领域的用户来说,将他们的区域设置和语言设置为“冲突”值是完全合理的,实际上也很常见。例如,居住在法国的以英语为母语的人会将语言设置为英语,但可能会选择将语言环境设置为法语(因此他们可以获得公制度量衡、24 时间等)。
您的应用程序运行所用的语言由语言设置决定,即Settings > General > Language & Region > Preferred Language Order。当系统运行您的应用程序时,它会获取此语言列表(首选列表)并将其与您的应用程序本地化为的语言列表(应用程序列表)进行匹配。应用程序列表中首选列表中的第一种语言是为应用程序选择的语言。这是您将在主包
preferredLocalizations数组的第一个条目中找到的内容。
要从其代码中获取语言的人类可读名称,您可以使用以下命令:
let langCode = Bundle.main.preferredLocalizations[0]
let usLocale = Locale(identifier: "en-US")
var langName = ""
if let languageName = usLocale.localizedString(forLanguageCode: langCode) {
langName = languageName
}
Run Code Online (Sandbox Code Playgroud)
这将为您提供当前 UI 语言的英文名称。
Bas*_*raf 12
迅捷3
let preferredLanguage = Locale.preferredLanguages[0] as String
print (preferredLanguage) //en-US
let arr = preferredLanguage.components(separatedBy: "-")
let deviceLanguage = arr.first
print (deviceLanguage) //en
Run Code Online (Sandbox Code Playgroud)
斯威夫特 5.4:
let languagePrefix = Locale.preferredLanguages[0]
print(languagePrefix)
Run Code Online (Sandbox Code Playgroud)
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})
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用以下代码,在swift 3上可以正常使用
var preferredLanguage : String = Bundle.main.preferredLocalizations.first!
Run Code Online (Sandbox Code Playgroud)
每当用户启动我的应用程序时,我想跟踪用户在“设置”应用程序中选择的语言-该语言尚未本地化(我的应用程序仅使用英语)。我采用了以下逻辑:
创建一个枚举以使其更易于处理数组中的语言
enum Language: String {
case none = ""
case en = "English"
case fr = "French"
case it = "Italian"
} // add as many languages you want
Run Code Online (Sandbox Code Playgroud)创建两个扩展到语言环境
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
}
}
Run Code Online (Sandbox Code Playgroud)必要时,您可以简单地使用扩展名
if let currentLanguage = Locale.currentLanguage {
print(currentLanguage.rawValue)
// Your code here.
}
Run Code Online (Sandbox Code Playgroud)小智 5
这是我在 Swift 5 Xcode 11 中使用的:
\n类变量内部:
\nlet languagePrefix = Bundle.main.preferredLocalizations.first?.prefix(2)\nRun Code Online (Sandbox Code Playgroud)\n这是一个字符串。它返回 2 个字符,即“en”、“es”、“de”...
\n由此我可以轻松确定要显示的语言:
\n if languagePrefix == "es" { self.flipCard.setTitle("\xc3\xbaltima carta", for: .normal) }\n if languagePrefix == "en" { self.flipCard.setTitle("Last Card", for: .normal) }\nRun Code Online (Sandbox Code Playgroud)\n如果您想要该语言的完整信息,请删除 ?.prefex(2)
\n| 归档时间: |
|
| 查看次数: |
89341 次 |
| 最近记录: |