NSDateFormatter和iOS11中的当前语言

看来NSDateFormatter默认行为已经在iOS11中改变了。 此代码用于根据iOS11之前的当前选定的iPhone / iPad语言工作并生成date格式化程序:

  _dateFormatterInstance = [[NSDateFormatter alloc] init]; _dateFormatterInstance.timeZone = [NSTimeZone systemTimeZone]; 

看起来像在iOS11中,我们必须明确指定它的语言环境属性:

  _dateFormatterInstance = [[NSDateFormatter alloc] init]; _dateFormatterInstance.timeZone = [NSTimeZone systemTimeZone]; _dateFormatterInstance.locale = [NSLocale localeWithLocaleIdentifier:[[NSLocale preferredLanguages] firstObject]]; 

有人可以证实我的发现?

这不是NSDateFormatter的问题,这是iOS 11如何支持本地化的一个变化。

在iOS 11下, [NSLocale currentLocale]只返回应用本地化支持的语言。 如果您的应用程序仅支持英语(作为基本本地化),则无论用户在设备上select什么语言, currentLocale将始终返回英语。

在iOS 10及更低版本中, currentLocale将直接表示用户select的语言和区域,而不pipe您的应用程序支持哪些本地化。

类如NSDateFormatter默认使用NSLocale currentLocale 。 因此,无论您的应用通过本地化实际支持哪种语言,类似NSDateFormatter这样的类都会以设置的语言显示文本,甚至与您的应用使用的语言不同。

iOS 11修复了这种不一致。 虽然有人可能会争辩说,这种变化打破了许多只支持一种(或less数几种)语言的应用程序,但它确实使应用程序更加一致。

为了使这一切清楚,请考虑一个例子。 您创build一个简单的testing应用程序与英文本地化本地化。 如果您使用iOS 10运行应用程序,并且设备的语言设置为英语,那么您显然会看到英文文本,而且您会看到格式为英文的date。 如果您现在将设备的语言更改为法语并重新启动应用程序,用户现在可以在应用程序中看到英文文本(因为这是其唯一的本地化),但现在date显示为法语的月份和星期几名称。

现在在iOS 11下运行相同的应用程序。与iOS 10一样,如果设备的语言是英语,则可以看到英语的所有内容。 如果您然后将设备的语言更改为法语并运行该应用程序,则iOS 11会发现您的应用程序仅支持英语,而currentLocale返回英语而非法语。 所以现在用户看到英文文本(由于应用程序本地化),date现在仍然是英文。

是的,iOS11中的默认行为与@rmaddy所描述的完全相同。

就我而言,我有一个基础开发语言设置为英语的项目,但在iOS11上,当我将设备的语言更改为其他任何语言(例如瑞典语)时,date仍将显示为例如Monday 6 November 。 这是因为我的应用程序不支持任何本地化。

解决scheme很简单:为了让应用程序显示瑞典语的date,我只需要添加一个空的Strings.strings文件,然后在项目设置中,我添加了瑞典语本地化。 尽pipestring文件是空的,但是应用程序随后变成了瑞典语的本地化语言,所以通过将设置中的语言更改为瑞典语,我们可以看到与måndag 6 november相同的date,从而实现了iOS10的预期用例。

注意:如果你做了这样的事情,这对你不起作用,当在项目设置中添加一种语言时,一定要去“其他”,并从那里select一种语言(而不是从第一级下拉菜单中select一种语言)。