sha*_*sha 24 locale nsdateformatter ios ios11
似乎NSDateFormatter
iOS11 中的默认行为已更改.此代码用于根据iOS11之前当前选择的iPhone/iPad语言工作和生成日期格式化程序:
_dateFormatterInstance = [[NSDateFormatter alloc] init];
_dateFormatterInstance.timeZone = [NSTimeZone systemTimeZone];
Run Code Online (Sandbox Code Playgroud)
看起来在iOS11中我们必须为它明确指定locale属性:
_dateFormatterInstance = [[NSDateFormatter alloc] init];
_dateFormatterInstance.timeZone = [NSTimeZone systemTimeZone];
_dateFormatterInstance.locale = [NSLocale localeWithLocaleIdentifier:[[NSLocale preferredLanguages] firstObject]];
Run Code Online (Sandbox Code Playgroud)
有人可以证实我的发现吗?
rma*_*ddy 63
这不是问题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
返回英语,而不是法语.所以现在用户看到英文文本(由于应用程序的本地化),日期现在仍然是英文.
小智 10
这实际上似乎更像是一个错误,而不是iOS 11中的行为故意改变.如果您只有一种语言集,则此行为不会出现,因为即使您的应用未本地化,也Locale.current
始终返回正确的语言和区域那种语言.
但是,如果您使用多种语言(例如法语和英语),则iOS 11在使用时似乎总是倾向于使用英语或您应用中最接近的支持语言Locale.current
.
Locale.preferredLanguages
似乎返回正确的语言区域信息,因此您可以使用它.
下面是示出从输出的示例Locale.current
和Locale.preferredLanguages
,显示了不一致性.
这是从仅支持英语的应用程序生成的.在设备上,法语被设置为主要语言和区域,在第一个示例中将英语(澳大利亚)设置为第二语言.
(不正确)Locale.current
使用多种语言 - 请注意英语是何种语言,何时应该是法语,因此应该是fr_FR
- identifier : "en_FR"
- kind : "current"
Run Code Online (Sandbox Code Playgroud)
(正确)Locale.preferredLanguages
多种语言
- 0 : "fr-FR"
- 1 : "en-AU"
Run Code Online (Sandbox Code Playgroud)
(正确)Locale.current
用法语作为唯一的语言
- 0 : "fr-FR"
Run Code Online (Sandbox Code Playgroud)
(正确)Locale.preferredLanguages
用法语作为唯一的语言
- identifier : "fr_FR"
- kind : "current"
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4671 次 |
最近记录: |