ios 中用于 DateFormatters 的“区域”设置的目的

Posted

技术标签:

【中文标题】ios 中用于 DateFormatters 的“区域”设置的目的【英文标题】:Purpose of `region` settings in ios for DateFormatters 【发布时间】:2018-09-28 14:45:13 【问题描述】:

我知道DateFormatters 使用语言和区域来生成所需的字符串/内容。 尤其是阅读documentation,我似乎正确理解了它们应该如何工作。

区域设置代表特定用户的格式选择,而不是用户的首选语言。这些通常是相同的,但可以不同。例如,居住在德国的以英语为母语的人可能会选择英语作为语言并选择德国作为地区。文本以英语显示,但日期、时间和数字遵循德语格式规则。日期在月份之前,24 小时制表示时间,如表 4-1 所示

那为什么我把我的手机设置为

首选系统语言:[西班牙语、意大利语]

地区:美国

而我的应用仅支持德语

一个简单的(伪代码)

let df = DateFormatter()
df.string(from: date)` 

返回miércoles, 26. sept 2018 ? (它是带有德语区域格式的西班牙语)

考虑到包(以及因此从NSLocalizedString(..) 和相关资源返回的所有字符串)已正确选择语言(de,德语),为什么基础对象不使用相同的语言(而不是区域) 由捆绑包支持和标识以产生所需的输出,而不是它们坚持系统输出?

我是否缺少一些应用程序配置,或者我真的必须为我需要使用的每个 Calendar、DateFormatter、NumberFormatter、ecc 覆盖语言、区域设置和区域?特别考虑到这些类及其实例化的效率有多低。

【问题讨论】:

我找不到与上述示例结果匹配的语言环境和日期格式化程序设置。我不知道您所说的“我的应用程序仅支持德语”是什么意思。你以什么方式执行它? (或者这是问题的核心;您想强制执行吗?)当您说“覆盖语言、区域设置和区域”时,这有点令人困惑。语言和地区是语言环境的部分。我不清楚“效率低下”的评论。创建这些对象的成本很高,但无论您是否设置显式语言环境,都是一样的。您的目标是在整个应用程序中只使用特定的语言环境吗? - 创建它们的成本很高,据我所知,某些属性也会被更改,例如dateFormat,我认为其他属性可能相同。 - 我说的是语言/区域设置/区域,因为我指的是具有不同属性的不同可可对象,可能不清楚抱歉。 - 覆盖我的意思是只设置想要的属性 - 支持 DE 意味着在项目设置中只有 DE 被选为支持并且没有本地化资源(或者如果它们与首选语言不匹配) 好的,在那种情况下,我相信我的答案就是你想要的。如果要将格式化程序锁定到特定的区域设置,请将该区域设置分配给格式化程序。正如您所注意到的,格式化程序的创建成本很高,因此您可能希望缓存它们,但它们的创建成本并不,因此只有在大量创建它们时才重要。跨度> 【参考方案1】:

我在 cmets 中列出了几个问题,答案可能会改变我对问题的理解,但假设问题只是如何使用德国所说的德语使格式化程序格式化,那只是设置了一个 Locale。

let locale = Locale(identifier: "de-DE")
let df = DateFormatter()
df.dateStyle = .full
df.locale = locale
df.string(from: Date())  // "Freitag, 28. September 2018"

我当前的语言环境是 en-US 的事实并不影响这一点。

创建一个 DateFormatter 并分配它的 Locale 并不比仅仅创建一个 DateFormatter 花费更多的时间。这是一行额外的代码,但如果您愿意,可以将其封装在扩展中(此外,如果您想避免重复创建共享的不可变实例,则可能需要创建共享的不可变实例,但无论您是否设置显式 Locale 都是如此与否)。

dateStyle 这样的东西的全部意义在于它适应用户的配置。如果您不想适应用户的配置,只需将格式化程序配置为按照您希望的方式运行即可。

【讨论】:

问题可能在Calendar 类中更明显,这是一个结构体,也需要用目标语言设置,但是传递它意味着复制它,效率低下。我们大量使用格式化程序、日历、语言环境、ecc。每次都关注语言环境真的很烦人,而且有几十个格式化程序,ecc。即使把所有东西都包起来,有很多开发人员,而且不可能禁止使用可可格式化程序,很容易被滥用。这就是我们目前所做的,但我们一遍又一遍地遇到同样的愚蠢问题。 由于涉及到更多的语言,假设什么是最好的后备语言是不安全的。所以我最终从 Localizable.strings 中获取了一个“区域代码”字符串并将其用作区域设置。这是相当可怕的。我可能只是对可可的期望太高了。好吧,无论如何,谢谢,我想没什么可做的,我会接受的。

以上是关于ios 中用于 DateFormatters 的“区域”设置的目的的主要内容,如果未能解决你的问题,请参考以下文章

iOS 中用于交互元素的动态类型

是否有可能知道在 iOS 中用于共享的媒介是啥?

用于单元测试的内存存储中的 iOS 10 核心数据

如何将一个应用程序添加到 App Store,而在这个应用程序中,一个用于 ios7,一个用于其余的?

为 iOS 构建,但在为 iOS 模拟器构建的目标文件中链接,用于架构 arm64

用于从布局中膨胀视图的 iOS 模拟 (xib)