首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSDateFormatter与iOS11中的当前语言

NSDateFormatter与iOS11中的当前语言
EN

Stack Overflow用户
提问于 2017-09-13 19:50:22
回答 5查看 6.9K关注 0票数 26

NSDateFormatter的默认行为似乎已在iOS11中更改。此代码用于根据当前选择的iPhone/iPad语言在iOS11之前工作并生成数据格式化程序:

代码语言:javascript
复制
 _dateFormatterInstance = [[NSDateFormatter alloc] init];
 _dateFormatterInstance.timeZone = [NSTimeZone systemTimeZone];

在iOS11中,我们必须显式地指定它的locale属性:

代码语言:javascript
复制
 _dateFormatterInstance = [[NSDateFormatter alloc] init];
 _dateFormatterInstance.timeZone = [NSTimeZone systemTimeZone];
 _dateFormatterInstance.locale = [NSLocale localeWithLocaleIdentifier:[[NSLocale preferredLanguages] firstObject]];

有人能证实我的发现吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 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只返回英语,而不是法语。因此,现在用户看到英文文本(由于应用程序的本地化)和日期现在也仍然用英语。

票数 68
EN

Stack Overflow用户

发布于 2018-02-08 05:01:06

实际上,这似乎更像是一个错误,而不是iOS 11中行为的有意改变。如果您只有一种语言集,这种行为就不会出现,因为Locale.current总是返回正确的语言和区域,即使应用程序不是局限于该语言

但是,如果您有不止一种语言--例如法语和英语--那么iOS 11在使用Locale.current时似乎总是偏爱英语或应用程序中最受支持的语言。

Locale.preferredLanguages似乎返回正确的语言区域信息,因此您可能可以使用该信息。

下面是一个示例,显示了来自Locale.currentLocale.preferredLanguages的输出,显示了不一致的地方。

这是由一个只支持英语的应用程序生成的。在该装置上,法语既是主要语言,也是区域,第一个例子将英语(澳大利亚)设为第二语言。

(不正确)带有多种语言的Locale.current --注意英语是什么语言,什么时候它应该是法语,因此应该是fr_FR

代码语言:javascript
复制
  - identifier : "en_FR"
  - kind : "current"

(正确)使用多种语言的Locale.preferredLanguages

代码语言:javascript
复制
  - 0 : "fr-FR"
  - 1 : "en-AU"

(正确)以法语为唯一语言的Locale.current

代码语言:javascript
复制
  - 0 : "fr-FR"

(正确)以法语为唯一语言的Locale.preferredLanguages

代码语言:javascript
复制
  - identifier : "fr_FR"
  - kind : "current"
票数 11
EN

Stack Overflow用户

发布于 2017-11-20 20:53:13

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

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

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

注意:如果您这样做,但它对您不起作用,当在项目设置中添加一种语言时,请确保转到“其他”并从中选择一种语言(而不是只从第一级下拉列表中选择一种语言)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46205763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档