围绕着NSLocale 区域化 - Objective-C 这篇来介绍一下 Swift 版本NSLocale的内容,并且会给出一些与Objective-C的一些不同之处。 Swift4.0版本
创建
public init(localeIdentifier string: String)
获取
open class var autoupdatingCurrent: Locale { get }
open class var current: Locale { get }
open class var system: Locale { get }
创建实例
在例子当中我们用到了相关的区域化的标识,转载可以到这里面NSLocale中常用的语言代码对照表查看一些相关的标识。
实例1 :创建 zh_Hans_CN NSLocale实例
let Locale:NSLocale = NSLocale.init(localeIdentifier: "zh_Hans_CN")
NSLog("%@", Locale.localeIdentifier)
NSLog("%@", Locale.displayName(forKey: NSLocale.Key.identifier, value: "zh_Hans_CN")!)
NSLog("%@", Locale.displayName(forKey: NSLocale.Key.identifier, value: "en_US")!)
打印的内容:
2018-01-17 16:28:31.627346+0800 ZsNSLocale-Swift[2537:517034] zh_CN
2018-01-17 16:28:31.627560+0800 ZsNSLocale-Swift[2537:517034] 中文(简体,中国)
2018-01-17 16:28:31.627607+0800 ZsNSLocale-Swift[2537:517034] 英文(美国)
从上述的内容来看,创建一个中国的区域化实例。只要调用这个CNLocale获取到的数据都是CN(中国 简体)下展示的数据。
例子2:创建一个en_US的NSLocale的实例
let ENLocale:NSLocale = NSLocale.init(localeIdentifier: "en_US")
NSLog("%@", ENLocale.localeIdentifier)
NSLog("%@", ENLocale.displayName(forKey: NSLocale.Key.identifier, value: "zh_Hans_CN")!)
NSLog("%@", ENLocale.displayName(forKey: NSLocale.Key.identifier, value: "en_US")!)
打印内容:
2018-01-17 16:41:13.470865+0800 ZsNSLocale-Swift[2560:524128] en_US
2018-01-17 16:41:13.471264+0800 ZsNSLocale-Swift[2560:524128] Chinese (Simplified, China)
2018-01-17 16:41:13.471586+0800 ZsNSLocale-Swift[2560:524128] English (United States)
上述打印结果可以看到,在en_US实例下打印出来的都是以en_US的区域化展示结果(美国 英文)语言地区
结论以及与Objective-C的对比
Swift版本与Objective-C创建的最大不同是少了一个类方法的创建方式+ localeWithLocaleIdentifier: 其他语法以及特性的不同都是语言的特性导致,基本上没有太大的变化
获取实例
获取系统默认的本地区域化实例
当我们刚买到一个iphone的时候,会显示你好,然后让你设置你的语言、地区什么,但是为什么国行的手机是你好,而国外的手机是hello呐!
在你手机还没有使用的时候,会有一个默认的本地区域化实例
let Locale:NSLocale = NSLocale.system as NSLocale
NSLog("%@", Locale.localeIdentifier)
NSLog("%@", Locale.languageCode)
NSLog("%@", Locale.displayName(forKey: NSLocale.Key.identifier, value: "zh_Hans_CN")!)
NSLog("%@", Locale.displayName(forKey: NSLocale.Key.identifier, value: "en_US")!)
打印内容:
2018-01-17 17:10:31.768169+0800 ZsNSLocale-Swift[2599:537939]
2018-01-17 17:10:31.768290+0800 ZsNSLocale-Swift[2599:537939]
2018-01-17 17:10:31.768468+0800 ZsNSLocale-Swift[2599:537939] 中文(简体,中国)
2018-01-17 17:10:31.768561+0800 ZsNSLocale-Swift[2599:537939] 英文(美国)
打印结果显示的内容是,初始本地化实例的标识码为空,而languageCode的值为空,其他属性都为空,但是用这个实例去获取标识所对应的展示值时,拿到了Chinese (Simplified, China)这个内容表示当前的设备是在一个英文区域之下,经测试国行的会生成简体 中国, 而外国的会生成本国的本地区域化实例,应该都是写死的(如果错误请指正)。
结论以及与Objective-C的对比
1.系统的初始状态的本地区域化实例存在,但是标识、属性为空,当用这个实例,去获取标识所对应的展示值时,是跟你手机设备是哪个区域发行地有关。国行:简体中文,中国, 外国:主体语言,发行地国家。
2.不同之处除localeIdentifier标识码外,Objective-C的其他值都是null而Swift的其他的属性值都是空。
获取当前本地区域化实例
Swift代码:
let CurrenLocale:NSLocale = NSLocale.current as NSLocale
NSLog("%@", CurrenLocale.localeIdentifier)
NSLog("%@", CurrenLocale.displayName(forKey: NSLocale.Key.identifier, value: "zh_Hans_CN")!)
打印内容:
2018-01-17 17:17:11.816759+0800 ZsNSLocale-Swift[2626:541564] zh_CN
2018-01-17 17:17:11.816993+0800 ZsNSLocale-Swift[2626:541564] 中文(简体,中国)
结论以及与Objective-C的对比
当App中用 open class var current: Locale { get } 方法拿到的本地区域化实例,当用户修改手机设置的语言地区App中的实例也不会改变,如果需要改变的话需要监听NSCurrentLocaleDidChangeNotification。
应用场景:App只拿一次语言时调用 open class var current: Locale { get } 不会跟着改变,要想跟着改变的话需要监听NSCurrentLocaleDidChangeNotification。
let NotifiCenter:NotificationCenter = NotificationCenter.default NotifiCenter.addObserver(self, selector: #selector(LocaleDidChangeNotification), name: NSLocale.currentLocaleDidChangeNotification, object: nil)
不同之处也就是语法不同。
获取系统本地区域化实例
let AutoUpdatingCurrenLocale:NSLocale = NSLocale.autoupdatingCurrent as NSLocale
NSLog("%@", AutoUpdatingCurrenLocale.localeIdentifier)
结论以及与Objective-C的对比
当App中用 open class var autoupdatingCurrent: Locale { get } 的方法获取到本地区域化实例。当用户修改系统语言地区时,App中获取到的实例也会跟着改变。
应用场景:1.App中本地区域化实例必须根据系统的变化而变化就使用 open class var autoupdatingCurrent: Locale { get } 方法;2.App国际化时间时会用到当前实例;3.国际化货币等等;
不同之处也就是语法不同。
属性
Swift
open class var availableLocaleIdentifiers: [String] {get} //iPhone所有的区域化标识列表
open class var isoLanguageCodes: [String] { get } //iPhone所有的语言编码列表
open class var isoCountryCodes: [String] { get } //iPhone所有的国家编码列表
open class var isoCurrencyCodes: [String] { get } //iPhone所有的货币编号列表
open class var commonISOCurrencyCodes: [String] { get } //iPhone常见的货币编码列表
open class var preferredLanguages: [String] { get } //用户首选语言的偏好列表