作者:手机用户2502936007 | 来源:互联网 | 2023-01-18 16:15
似乎NSDateFormatter
iOS11 中的默认行为已更改.此代码用于根据iOS11之前当前选择的iPhone/iPad语言工作和生成日期格式化程序:
_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]];
有人可以证实我的发现吗?
1> rmaddy..:
这不是问题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
返回英语,而不是法语.所以现在用户看到英文文本(由于应用程序的本地化),日期现在仍然是英文.
谢谢!这非常有用和彻底.在我的情况下 - 我实际上更喜欢iOS10的行为,因为我们从后端为用户可见的所有UI文本提供本地化支持,但显然不适用于月份和日期等标准事物.
2> 小智..:
这实际上似乎更像是一个错误,而不是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"
在iOS 12中,如果列表中只有一种喜欢的语言(例如西班牙语),则“ Locale.current”为英语(如果这是您在应用中支持的唯一语言)。