如何在Swift中获取设备的详细语言

10

我在服务器上有一个数据库,包含了我在应用程序中使用的所有语言关键词,这些语言可能随时更改。

数据库的语言表中有一个列用来存储语言(id, key, value, lang)。

在Android应用程序中,我可以读取设备上的语言设置,并返回例如en-GBen-US

但是在iOS应用程序中,我无法像上面的例子那样获取语言,它总是只返回语言 (en, es, fr)。

因此,在iOS应用程序中无法查询数据库以获取指定语言的关键词。因为数据库中的语言是以 en-GB、en-US 的格式存储的。

var langId: String? = NSLocale.preferredLanguages().first as? String

我该如何获取更详细的语言信息?

6个回答

16

currentLocale()开始,询问与其相关的问题。例如:

let lang = NSLocale.currentLocale().localeIdentifier

或者,更细的粒度层面上:

let langId = NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode) as! String
let countryId = NSLocale.currentLocale().objectForKey(NSLocaleCountryCode) as! String
let language = "\(langId)-\(countryId)" // en-US on my machine

如果在法国使用英语语言的iPhone,您的代码会返回en-FR还是en-US? - Morteza Soleimani
Locale是一个系统设置。它与手机的物理位置无关。仅仅因为你越过边境,手机上没有任何神奇的变化!如果你想知道手机在哪里,使用位置服务即可。 - matt

15

Swift 3 没有 NSLocaleCountryCode,而是被 regionCode 替代了。

https://developer.apple.com/reference/foundation/nslocale.key/1417845-countrycode

Swift 5.7 中的解决方案:

let langCode = Locale.current.language.languageCode ?? ""
let regionCode = Locale.current.language.region ?? ""
let language = "\(langCode)-\(regionCode)"

另一种解决方案是使用NSLocale.current.identifier,这将返回例如en_us
您可以用-替换_。它看起来像这样:NSLocale.current.identifier.replacingOccurrences(of: "_", with: "-")

8
不需要额外的努力,只需根据您的要求使用以下内容。
Locale.current.identifier //en_US
Locale.current.collatorIdentifier //en-US

2

对于Swift 4,请使用以下内容:

NSLocale.current.identifier //Output: en-US, pt-BR

0

Swift 5

Locale.currentLanguage.rawValue

0

只需使用以下代码行即可解决:

let identifier = Locale.current.identifier


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接