我有一个语言代码,例如"en_US",我想从中获取一个友好的名称,比如"英语"。
这是我当前正在做的事情:
Locale.current.localizedString(forLanguageCode: code)
代码可以运行,但是对于例如中文的语言,它并不能完全满足我的需求。
zh-Hans
应该返回“简体中文”,zh-Hant
应该返回“繁体中文”。
然而它们都只返回“中文”。你该如何才能让它们返回正确的值呢?
我有一个语言代码,例如"en_US",我想从中获取一个友好的名称,比如"英语"。
这是我当前正在做的事情:
Locale.current.localizedString(forLanguageCode: code)
代码可以运行,但是对于例如中文的语言,它并不能完全满足我的需求。
zh-Hans
应该返回“简体中文”,zh-Hant
应该返回“繁体中文”。
然而它们都只返回“中文”。你该如何才能让它们返回正确的值呢?
displayName(forKey:value:)
来代替。let code = "en_US"
if let identifier = (Locale.current as NSLocale).displayName(forKey: .identifier, value: code) {
print(identifier) /// English (United States)
}
let code = "zh_Hans"
if let identifier = (Locale.current as NSLocale).displayName(forKey: .identifier, value: code) {
print(identifier) /// Chinese, Simplified
}
"en_US"
不是语言代码,它是由语言代码"en"
和地区代码"US"
组成的区域标识符。因此,调用localizedString(forLanguageCode:)
将不能正常工作。使用标识符(如您所拥有的),请使用localizedString(forIdentifier:)
:"let identifier = "en_US"
let humanReadableName =
Locale.current.localizedString(forIdentifier: identifier) ?? identifier
这也可以很好地适用于诸如 zh-Hans
的标识符,它将返回“中文,简体”。
请注意,我建议在末尾添加 ?? identifier
,因为在无效标识符的情况下,localizedString(forIdentifier:)
返回一个可选项,在这种情况下,您可以回退到标识符本身,因此您不必处理可选字符串。
Locale
的localizedString(forIdentifier:)
函数是更符合 Swift 风格的方式。 - gcharita