NSLocale 本地区域化 - Objective-C

初衷


    有的时候在项目当中会使用到本地区域化的一些内容,还有可能需要使用别的区域的一些标识、属性、或者这个标识所对应的展示的内容(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 本地区域化 - Objective-C_第1张图片
新手机开机启动图

    在你手机还没有使用的时候,会有一个默认的本地区域化实例

[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中常用的语言代码对照表

你可能感兴趣的:(NSLocale 本地区域化 - Objective-C)