友好名称的语言代码

Language codes to friendly names

我有一个语言代码,例如“en_US”,我正试图从中获取一个友好的名称,例如“English”。

这是我现在正在做的事情:

Locale.current.localizedString(forLanguageCode: code)

它可以,但是对于中文等语言,它并不完全符合我的要求。

zh-Hans应该return“简体中文”,zh-Hant应该return“繁体中文”。

然而,他们都只是return“中国人”。您如何让它们达到 return 正确的值?

您可以改用 NSLocale 的 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 这样的标识符,它将 return “简体中文”。

请注意,我建议在末尾附加 ?? identifier,因为 localizedString(forIdentifier:) return 是可选的,以防标识符无效,您可以在其中回退到标识符本身所以你不必处理可选字符串。