NSDateFormatter的默认行为似乎已在iOS11中更改。此代码用于根据当前选择的iPhone/iPad语言在iOS11之前工作并生成数据格式化程序:
_dateFormatterInstance = [[NSDateFormatter alloc] init];
_dateFormatterInstance.timeZone = [NSTimeZone systemTimeZone];在iOS11中,我们必须显式地指定它的locale属性:
_dateFormatterInstance = [[NSDateFormatter alloc] init];
_dateFormatterInstance.timeZone = [NSTimeZone systemTimeZone];
_dateFormatterInstance.locale = [NSLocale localeWithLocaleIdentifier:[[NSLocale preferredLanguages] firstObject]];有人能证实我的发现吗?
发布于 2017-09-13 20:42:36
这不是NSDateFormatter的问题,它改变了iOS 11支持本地化的方式。
在iOS 11下,[NSLocale currentLocale]只返回应用程序本地化所支持的语言。如果您的应用程序只支持英语(作为基本的本地化),那么无论用户在设备上选择哪种语言,currentLocale都会返回英语。
在iOS 10和更早版本中,currentLocale将直接表示用户选择的语言和区域,而不管应用程序支持什么本地化。
类(如NSDateFormatter )默认使用NSLocale currentLocale。因此,无论您的应用程序通过本地化实际支持哪种语言,像NSDateFormatter这样的类都会以设备上的语言集显示文本,即使它与应用程序使用的语言不同。
iOS 11修复了这种不一致性。虽然人们可能会认为这种变化破坏了许多只支持一种(或几种)语言的应用程序,但它实际上使应用程序更加一致。
为了清楚地说明这一切,请考虑一个例子。您可以创建一个简单的测试应用程序,并在英语中使用基本的本地化。如果您使用iOS 10运行应用程序,并且该设备的语言设置为英语,那么您显然可以看到英文文本,并看到为英语格式化的日期。如果您现在将设备的语言改为法语并重新启动应用程序,用户现在在应用程序中看到英文文本(因为这是其唯一的本地化),但日期现在用法语、月份和工作日名称显示。
现在在iOS 11下运行相同的应用程序。与iOS 10一样,如果设备的语言是英语,您可以看到所有的英语。如果您随后将设备的语言改为法语并运行该应用程序,iOS 11将看到您的应用程序只支持英语,而currentLocale只返回英语,而不是法语。因此,现在用户看到英文文本(由于应用程序的本地化)和日期现在也仍然用英语。
发布于 2018-02-08 05:01:06
实际上,这似乎更像是一个错误,而不是iOS 11中行为的有意改变。如果您只有一种语言集,这种行为就不会出现,因为Locale.current总是返回正确的语言和区域,即使应用程序不是局限于该语言。
但是,如果您有不止一种语言--例如法语和英语--那么iOS 11在使用Locale.current时似乎总是偏爱英语或应用程序中最受支持的语言。
Locale.preferredLanguages似乎返回正确的语言区域信息,因此您可能可以使用该信息。
下面是一个示例,显示了来自Locale.current和Locale.preferredLanguages的输出,显示了不一致的地方。
这是由一个只支持英语的应用程序生成的。在该装置上,法语既是主要语言,也是区域,第一个例子将英语(澳大利亚)设为第二语言。
(不正确)带有多种语言的Locale.current --注意英语是什么语言,什么时候它应该是法语,因此应该是fr_FR
- identifier : "en_FR"
- kind : "current"(正确)使用多种语言的Locale.preferredLanguages
- 0 : "fr-FR"
- 1 : "en-AU"(正确)以法语为唯一语言的Locale.current
- 0 : "fr-FR"(正确)以法语为唯一语言的Locale.preferredLanguages
- identifier : "fr_FR"
- kind : "current"发布于 2017-11-20 20:53:13
是的,在iOS11中,默认行为与@rmaddy描述的完全相同。
在我的例子中,我有一个基本开发语言设置为English的项目,但是在iOS11上,当我将设备的语言更改为任何其他语言(比如瑞典语)时,日期仍然显示为例如Monday 6 November。这是因为我的应用程序不支持任何本地化。
解决方案很简单:为了让应用程序以瑞典语显示日期,我只需添加一个空的Strings.strings文件,然后在项目设置中添加瑞典本地化。尽管字符串文件是空的,但是应用程序随后被本地化为瑞典语,因此,通过将设置中的语言更改为瑞典语,我们可以看到与måndag 6 november相同的日期,从而实现了所需的iOS10用例。
注意:如果您这样做,但它对您不起作用,当在项目设置中添加一种语言时,请确保转到“其他”并从中选择一种语言(而不是只从第一级下拉列表中选择一种语言)。
https://stackoverflow.com/questions/46205763
复制相似问题