美文网首页iOS
NSLocale 本地区域化 - Objective-C

NSLocale 本地区域化 - Objective-C

作者: struggle3g | 来源:发表于2018-01-16 01:17 被阅读0次

初衷


    有的时候在项目当中会使用到本地区域化的一些内容,还有可能需要使用别的区域的一些标识、属性、或者这个标识所对应的展示的内容(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中常用的语言代码对照表

相关文章

  • NSLocale 本地区域化 - Objective-C

    初衷 有的时候在项目当中会使用到本地区域化的一些内容,还有可能需要使用别的区域的一些标识、属性、或者这个标识所对应...

  • iOS语音识别

    //创建本地化NSLocale *local =[[NSLocale alloc] initWithLocaleI...

  • iOS NSDate的整理

    NSDate -- 表示一个绝对的时间点 NSTimeZone -- 时区信息 NSLocale -- 本地化信息...

  • NSLocale

    国家编码语言编码货币符号货币编码 =============currentLocale==============...

  • NSLocale

    NSLocale类包括国家,语言,货币等信息 初始化: init(localeIdentifier: String...

  • NSLocale

  • NSDate、NSTimeZone、NSLocale、NSDat

    NSDate、NSTimeZone、NSLocale、NSDateComponents、NSCalendar、NS...

  • 群的没落:社交最终还是要回归本质的

    现在的群,凡是带有强关系属性的,都是本地化,区域化的,大家可以时常线下碰面。 我的小密圈「空 门」:http://...

  • iOS NSLocale

    1: 父类 2: 属性 3:方法 4: 分类(NSLocaleCreation)

  • iOS NSLocale

    1.NSLocale 若你只开发中国区的应用,需要保证用户修改当前语言环境时应用的显示不发生变化。而像NSDate...

网友评论

    本文标题:NSLocale 本地区域化 - Objective-C

    本文链接:https://www.haomeiwen.com/subject/nxvdoxtx.html