初衷
有的时候在项目当中会使用到本地区域化的一些内容,还有可能需要使用别的区域的一些标识、属性、或者这个标识所对应的展示的内容(NSString等等),大概的了解还是有必要的。
创建
- initWithLocaleIdentifier 实例方式创建
+ localeWithLocaleIdentifier: 类方式创建
获取
+ autoupdatingCurrentLocale 系统当前的本地区域化实例(随着用户改变设置改变)
+ currentLocale 当前的本地区域化实例(不会跟随用户改变设置而改变)
+ systemLocale 手机默认的本地区域化实例
创建实例
在例子当中我们用到了相关的区域化的标识,转载可以到这里面NSLocale中常用的语言代码对照表查看一些相关的标识。
例子1:创建 zh_Hans_CN NSLocale实例
NSLocale *CNLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_Hans_CN"];
NSLog(@"%@",CNLocale.localeIdentifier);
NSLog(@"%@",[CNLocale displayNameForKey:NSLocaleIdentifier value:@"zh_Hans_CN"]);
NSLog(@"%@",[CNLocale displayNameForKey:NSLocaleIdentifier value:@"en_US"]);
打印出来的内容:
2018-01-15 19:48:37.960430+0800 ZsNSLocale[21114:1956348] zh_CN
2018-01-15 19:48:37.960767+0800 ZsNSLocale[21114:1956348] 中文(简体,中国)
2018-01-15 19:48:37.960905+0800 ZsNSLocale[21114:1956348] 英文(美国)
从上述的内容来看,创建一个中国的区域化实例。只要调用这个CNLocale获取到的数据都是CN(中国 简体)下展示的数据。
例子2:创建一个en_US的NSLocale的实例
NSLocale *ENLocale = [NSLocale localeWithLocaleIdentifier:@"en_US"];
NSLog(@"%@",ENLocale.localeIdentifier);
NSLog(@"%@",[ENLocale displayNameForKey:NSLocaleIdentifier value:@"zh_Hans_CN"]);
NSLog(@"%@",[ENLocale displayNameForKey:NSLocaleIdentifier value:@"en_US"]);
打印的内容:
2018-01-15 21:59:29.814283+0800 ZsNSLocale[799:42893] en_US
2018-01-15 21:59:29.820161+0800 ZsNSLocale[799:42893] Chinese (Simplified, China)
2018-01-15 21:59:29.821923+0800 ZsNSLocale[799:42893] English (United States)
上述打印结果可以看到,在en_US实例下打印出来的都是以en_US的区域化展示结果(美国 英文)
上述结果都是以 - initWithLocaleIdentifier 的形式创建,还可以用另一种类方法去创建,结果都是一样的,就简单的创建一个实例
NSLocale *TestLocale = [NSLocale localeWithLocaleIdentifier:@"en_US"];
结论
区域化实例,其中所有的展示、显示数据都是这个实例区域中的展示数据。
获取实例
获取手机默认的本地区域化实例
当我们刚买到一个iphone的时候,会显示你好,然后让你设置你的语言、地区什么,但是为什么国行的手机是你好,而国外的手机是hello呐!
在你手机还没有使用的时候,会有一个默认的本地区域化实例
[NSLocale systemLocale];
NSLog(@"%@",[[NSLocale systemLocale]localeIdentifier]);
NSLog(@"%@",[[NSLocale systemLocale]languageCode]);
NSLog(@"%@",[[NSLocale systemLocale] displayNameForKey:NSLocaleIdentifier value:@"zh_Hans_CN"]);
打印内容:
2018-01-15 22:37:00.348944+0800 ZsNSLocale[1124:168306]
2018-01-15 22:37:00.349130+0800 ZsNSLocale[1124:168306] (null)
2018-01-15 22:37:00.349462+0800 ZsNSLocale[1124:168306] Chinese (Simplified, China)
打印结果显示的内容是,初始本地化实例的标识码为空,而languageCode的值为null,其他属性都为null,但是用这个实例去获取标识所对应的展示值时,拿到了Chinese (Simplified, China)这个内容表示当前的设备是在一个英文区域之下,经测试国行的会生成简体 中国, 而外国的会生成本国的本地区域化实例,应该都是写死的(如果错误请指正)。
结论
系统的初始状态的本地区域化实例存在,但是标识为空,其属性为null,当用这个实例,去获取标识所对应的展示值时,是跟你手机设备是哪个区域发行地有关。国行:简体中文,中国, 外国:主体语言,发行地国家。
获取当前的本地区域化实例
获取设备当前的本地区域化实例
NSLocale *CurrenLocale = [NSLocale currentLocale];
NSLocale *CurrenLocale = [NSLocale currentLocale];
NSLog(@"%@",[CurrenLocale localeIdentifier]);
NSLog(@"%@",[CurrenLocale displayNameForKey:NSLocaleIdentifier value:@"zh_Hans_CN"]);
NSLog(@"%@",[CurrenLocale displayNameForKey:NSLocaleIdentifier value:@"en_CN"]);
打印内容:
2018-01-16 00:28:31.323844+0800 ZsNSLocale[1860:937393] en_CN
2018-01-16 00:28:31.324212+0800 ZsNSLocale[1860:937393] en
2018-01-16 00:28:31.324387+0800 ZsNSLocale[1860:937393] 中文(简体,中国)
2018-01-16 00:28:31.324425+0800 ZsNSLocale[1860:937393] 英文(中国)
结论
当App中用 + currentLocale方法拿到的本地区域化实例,当用户修改手机设置的语言地区App中的实例也不会改变,如果需要改变的话需要监听NSCurrentLocaleDidChangeNotification。
应用场景:App只拿一次语言时调用+ currentLocale不会跟着改变,要想跟着改变的话需要监听NSCurrentLocaleDidChangeNotification。
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(CurrentLocaleDidChange:) name:NSCurrentLocaleDidChangeNotification object:nil];
获取系统的本地化实例
[NSLocale autoupdatingCurrentLocale];
NSLog(@"%@",[[NSLocale autoupdatingCurrentLocale] localeIdentifier])
结论
当App中用 + autoupdatingCurrentLocale 的方法获取到本地区域化实例。当用户修改系统语言地区时,App中获取到的实例也会跟着改变。
应用场景:1.App中本地区域化实例必须根据系统的变化而变化就使用 + autoupdatingCurrentLocale 方法;2.App国际化时间时会用到当前实例;3.国际化货币等等;
属性
Objective-C
availableLocaleIdentifiers iPhone中所有本地区域化的编码
ISOCountryCodes iPhone中所有的国家地区的编码
ISOLanguageCodes iPhone中所有的语言的编码
ISOCurrencyCodes iPhone中所有的货币列表
commonISOCurrencyCodes iPhone中常见的货币列表
参考:
Apple官方文档
NSLocale中常用的语言代码对照表