swift Locale

一、简介

Locale封装了有关语言、文化、技术惯例和标准的信息。Locale封装的信息示例包括用于数字的小数点、分隔符和日期格式化符号等。尽管可以使用多种语言环境,但通常使用与当前用户关联的语言环境。

二、API

  1. 用户目前使用的语言环境
public static var current: Locale { get }
print(Locale.current)
//en_CN (current)
  1. 自动跟踪用户偏好的语言环境
public static var autoupdatingCurrent: Locale { get }
print(Locale.autoupdatingCurrent)
//en_CN (autoupdatingCurrent)
  1. 初始化
public init(identifier: String)

可通过availableIdentifiers变量获取可用的标识符。

public static var availableIdentifiers: [String] { get }
var l = Locale(identifier: "zh_Hans_CN")
print(l)
//zh_CN (fixed)

print(Locale.availableIdentifiers)
//["eu", "hr_BA", "en_CM", "en_BI", "en_AE", "rw_RW", "ast", "en_SZ", "he_IL", "ar", 
//"uz_Arab", "en_PN", "as", "en_NF", "ks_IN", "es_KY", "rwk_TZ", "zh_Hant_TW", 
  1. 本地化字符串
  • 本地化标识符
public func localizedString(forIdentifier identifier: String) -> String?

可通过availableIdentifiers变量获取可用的标识符。

var l = Locale(identifier: "zh_Hans_CN")
print(l.localizedString(forIdentifier: "zh_Hans_CN"))
//Optional("简体中文(中国大陆)")
print(l.localizedString(forIdentifier: "en_CN"))
//Optional("英语(中国大陆)")
  • 本地化语言代码
public func localizedString(forLanguageCode languageCode: String) -> String?

语言代码为zh_Hans_CN前面的zh,可通过isoLanguageCodes变量获取可用的语言代码。

public static var isoLanguageCodes: [String] { get }
var l = Locale(identifier: "zh_Hans_CN")
print(l.localizedString(forLanguageCode: "zh_Hans_CN"))
//Optional("中文")
print(l.localizedString(forLanguageCode: "en_CN"))
//Optional("英语")

print(Locale.isoLanguageCodes)
//["aa", "ab", "ace", "ach", "ada", "ady", "ae", "aeb", "af", "afh", "agq", "ain", "ak",
//"akk", "akz", "ale", "aln",
  • 本地化地区代码
public func localizedString(forRegionCode regionCode: String) -> String?

地区代码为zh_Hans_CN后面的CN,可通过isoRegionCodes变量获取可用的地区代码。

public static var isoRegionCodes: [String] { get }
var l = Locale(identifier: "zh_Hans_CN")
print(l.localizedString(forRegionCode: "CN"))
//Optional("中国大陆")
print(l.localizedString(forRegionCode: "TW"))
//Optional("台湾")

print(Locale.isoRegionCodes)
//["AC", "AD", "AE", "AF", "AG", "AI", "AL", "AM", "AO", "AQ", "AR", "AS", "AT", "AU", 
//"AW", "AX", "AZ", "BA", "BB", "BD",
  • 本地化脚本代码
public func localizedString(forScriptCode scriptCode: String) -> String?

脚本代码为zh_Hans_CN中间的hans。

var l = Locale(identifier: "zh_Hans_HK")
print(l.localizedString(forScriptCode: "Hans"))
//Optional("简体中文")
print(l.localizedString(forScriptCode: "Hant"))
//Optional("繁体中文")
  • 本地化变体代码
public func localizedString(forVariantCode variantCode: String) -> String?

变体代码是en_US_POSIX后面的POSIX(好像只有这一个)

var l = Locale(identifier: "zh_Hans_CN")
print(l.localizedString(forIdentifier: "en_US_POSIX"))
//Optional("英语(美国,电脑)")
print(l.localizedString(forVariantCode: "POSIX"))
//Optional("电脑")
  • 本地化日历标识符
public func localizedString(for calendarIdentifier: Calendar.Identifier) -> String?

public enum Identifier {
        case gregorian//公历
        case buddhist//佛历
        case chinese//农历
        case coptic//科普特历
        case ethiopicAmeteMihret//埃塞俄比亚历
        case ethiopicAmeteAlem//埃塞俄比亚阿米特阿莱姆日历
        case hebrew//希伯来历
        case iso8601//国际标准历法
        case indian//印度国定历
        case islamic//伊斯兰历
        case islamicCivil//伊斯兰希吉来日历
        case japanese//和历
        case persian//波斯历
        case republicOfChina//民国纪年
        case islamicTabular//伊斯兰天文历
        case islamicUmmAlQura//伊斯兰历(乌姆库拉)
}
var l = Locale(identifier: "zh_Hans_CN")
print(l.localizedString(for: .chinese))
//Optional("农历")
  • 本地化货币代码
public func localizedString(forCurrencyCode currencyCode: String) -> String?

可通过isoCurrencyCodes变量获取所有可用的货币代码。

public static var isoCurrencyCodes: [String] { get }

可通过commonISOCurrencyCodes变量获取常用货币代码。

public static var commonISOCurrencyCodes: [String] { get }
var l = Locale(identifier: "zh_Hans_CN")
print(l.localizedString(forCurrencyCode: "CNY"))
//Optional("人民币")

print(Locale.isoCurrencyCodes.count)
//303
print(Locale.commonISOCurrencyCodes.count)
//155
  • 本地化排序标识符
public func localizedString(forCollationIdentifier collationIdentifier: String) -> String?
public func localizedString(forCollatorIdentifier collatorIdentifier: String) -> String?
var l = Locale(identifier: "zh_Hans_CN")
print(l.localizedString(forCollationIdentifier: "phonebook"))
//Optional("电话簿排序")
  1. 属性值
  • 语言环境的标志符
public var identifier: String { get }
var l = Locale(identifier: "zh_Hans_CN")
print(l.identifier)
//zh_CN
  • 语言环境的语言代码
public var languageCode: String? { get }

zh_Hans_CN的语言代码为前面的zh。

  • 语言环境的地区代码
public var regionCode: String? { get }

zh_Hans_CN的地区代码为后面的CN。

  • 语言环境的脚本代码
public var scriptCode: String? { get }

zh_Hans_CN的脚本代码为中间的Hans。

  • 语言环境的变体代码
public var variantCode: String? { get }

zh_Hans_CN的变体代码为nil,好像只有en_US_POSIX有变体代码POSIX。

var l = Locale(identifier: "zh_Hans_CN")
print(l.variantCode)
//nil
l = Locale(identifier: "en_US_POSIX")
print(l.variantCode)
//Optional("POSIX")
  • 语言环境的示例集
public var exemplarCharacterSet: CharacterSet? { get }
  • 语言环境使用的日历
public var calendar: Calendar { get }

zh_Hans_CN使用的日历为公历gregorian。

var l = Locale(identifier: "zh_Hans_CN")
print(l.calendar)
//gregorian (fixed)
  • 语言环境的排序规则标识符
public var collationIdentifier: String? { get }
public var collatorIdentifier: String? { get }

zh_Hans_CN的排序规则标识符为nil。

  • 语言环境是否使用公制
public var usesMetricSystem: Bool { get }

公制是一完全创新的单位制度,又称米千克秒(MKS或mks)单位制,建立在下述三种基本单位之上:米-用来确定距离,千克-用来确定质量,和秒-用来确定时间长度。

zh_Hans_CN使用公制,因此返回true。

  • 语言环境的小数分隔符
public var decimalSeparator: String? { get }

zh_Hans_CN的小数分隔符为 . 。

  • 语言环境的分组分隔符
public var groupingSeparator: String? { get }

zh_Hans_CN的分组分隔符为 , 。

  • 语言环境的货币符号
public var currencySymbol: String? { get }

zh_Hans_CN的货币符号为 ¥ 。

  • 语言环境的货币代码
public var currencyCode: String? { get }

zh_Hans_CN的货币代码为CNY。

  • 语言环境的引号开始定界符
public var quotationBeginDelimiter: String? { get }

zh_Hans_CN的引号开始定界符为 “ 。

  • 语言环境的引号结尾定界符
public var quotationEndDelimiter: String? { get }

zh_Hans_CN的引号结尾定界符为 ” 。

  • 语言环境的备用引号开始定界符
public var alternateQuotationBeginDelimiter: String? { get }

zh_Hans_CN的备用引号开始定界符为 ‘ 。

  • 语言环境的备用引号结尾定界符
public var alternateQuotationEndDelimiter: String? { get }

zh_Hans_CN的备用引号结尾定界符为 ’ 。

  1. 获取用户的首选语言列表
public static var preferredLanguages: [String] { get }

Bundle会根据此API的结果并结合您的应用程序支持的语言来确定您的应用程序将以何种语言运行。

print(Locale.preferredLanguages)
//["zh-Hans-CN", "en-CN"]
  1. 其它
  • 将标识符转换成组件字典
public static func components(fromIdentifier string: String) -> [String : String]
let com = Locale.components(fromIdentifier: "zh_Hans_CN")
print(com)
//["kCFLocaleScriptCodeKey": "Hans", "kCFLocaleCountryCodeKey": "CN", 
//"kCFLocaleLanguageCodeKey": "zh"]
  • 将组件字典转换成标识符
public static func identifier(fromComponents components: [String : String]) -> String
let com = Locale.components(fromIdentifier: "zh_Hans_CN")
print(Locale.identifier(fromComponents: com))
//zh_Hans_CN
  • 将字符串转换成规范的标识符
public static func canonicalIdentifier(from string: String) -> String
  • 将字符串转换成规范的语言标识符
public static func canonicalLanguageIdentifier(from string: String) -> String
  • 将Windows的语言环境代码转换成标识符
public static func identifier(fromWindowsLocaleCode code: Int) -> String?
  • 将标识符转换成Windows的语言环境代码
public static func windowsLocaleCode(fromIdentifier identifier: String) -> Int?
  • 语言环境的字符方向
public static func characterDirection(forLanguage isoLangCode: String) -> 
                                                  Locale.LanguageDirection

public enum LanguageDirection : UInt {
        case unknown = 0//未知
        case leftToRight = 1//从左到右
        case rightToLeft = 2//从右到左
        case topToBottom = 3//从上到下
        case bottomToTop = 4//从下到上
}

zh_Hans_CN的字符方向是从左到右。

var l = Locale(identifier: "zh_Hans_CN")
print(Locale.characterDirection(forLanguage: l.languageCode!).rawValue)
//1
  • 语言环境的行方向
public static func lineDirection(forLanguage isoLangCode: String) -> 
                                            Locale.LanguageDirection

zh_Hans_CN的行方向是从上到下。

var l = Locale(identifier: "zh_Hans_CN")
print(Locale.lineDirection(forLanguage: l.languageCode!).rawValue)
//3
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容

  • 一、开发环境 学习一门语言,首先要搞定的就是环境的配置想要比较开心的开发php,你就需要搞定这几个 PHP Apa...
    Zach96阅读 364评论 1 1
  • Python基础知识_0001 1.0 Python是一种怎样的语言 Python是一门跨平台、开源、免费的解释型...
    爱学习的小白F1阅读 1,007评论 0 1
  • 1.认识php php是服务端嵌入到HTML中的脚本语言。php的功能包括但不限于: 收集表单数据 生成动态网页 ...
    楠哥哥_0b86阅读 784评论 3 1
  • php手册 https://www.php.net/manual/zh/index.php URL地址 格式 DN...
    WhiteStruggle阅读 67评论 0 1
  • 第三章 基本数据类型 3.1 模块 模块是一种程序的组织形式。它将彼此具有特定关系的一组Python可执行代码、函...
    e488c0eaa3b3阅读 639评论 0 0