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一种语言)。