ios 本地化自然格式的API数据列表

8tntrjer  于 2023-06-25  发布在  iOS
关注(0)|答案(2)|浏览(106)

假设我从API下载了以下数据列表:

[
    "Anita",
    "Jean",
    "Peter"
]

我想以自然的句子格式列出这些数据。例如,在美式英语中,应该向用户显示以下字符串:

Anita, Jean, and Peter

但是,例如,如果用户是瑞典人,他们应该看到以下字符串:

Anita, Jean och Peter

请注意,牛津逗号不见了,瑞典语使用不同的单词表示“and”,这是瑞典语用户希望看到的。如何以自然语言的方式格式化这些数据,以尊重用户的位置?可以有可变的数据量,不一定只有3个项目。我的直觉是将Formatter/NSFormatter子类化,但我想构建它的方式可以很容易地扩展到支持我不会说的语言,所以我想知道是否有iOS标准或第三方格式化程序,我在搜索中找不到

dzjeubhm

dzjeubhm1#

从iOS 13开始,Foundation有一个ListFormatter类型。根据您的需要,您可以以不同的方式使用它来获得数组的文本表示。
使用ListFormatter最简单的方法是使用它的静态localizedString(byJoining:)方法。下面的Swift 5.1 / iOS 13 Playground示例代码展示了如何实现此方法,以便将数组转换为本地化的字符串表示:

import Foundation

let array = [
    "Anita",
    "Jean",
    "Peter"
]

let string = ListFormatter.localizedString(byJoining: array)
print(string) // prints: Anita, Jean, and Peter (for en_US locale)

作为localizedString(byJoining:)的替代方案,您可以创建ListFormatter的示例并使用string(from:)方法。如果您需要为文本表示指定区域设置,这可能很有用:

import Foundation

let array = [
    "Anita",
    "Jean",
    "Peter"
]

let listFormatter = ListFormatter()
listFormatter.locale = Locale(identifier: "fr_FR") // set only if necessary

let string = listFormatter.string(from: array)
print(String(describing: string)) // prints: Optional("Anita, Jean et Peter")

如果需要,您还可以使用专门的格式化程序类型设置ListFormatter示例的itemFormatter属性:

import Foundation

let array = [
    55,
    112,
    8
]

let locale = Locale(identifier: "es_ES") // set only if necessary

let numberFormatter = NumberFormatter()
numberFormatter.locale = locale
numberFormatter.numberStyle = NumberFormatter.Style.spellOut

let listFormatter = ListFormatter()
listFormatter.locale = locale
listFormatter.itemFormatter = numberFormatter

let string = listFormatter.string(from: array)
print(String(describing: string)) // prints: Optional("cincuenta y cinco, ciento doce y ocho")
vfh0ocws

vfh0ocws2#

在以前的iOS版本中,这个问题仍然没有解决,如果你有一个答案,我仍然很感激。然而,iOS 13公开了NSListFormatter,它可以用来做到这一点。例如:
斯威夫特:

ListFormatter.localizedString(byJoining: ["Anita", "Jean", "Peter"])

Objective-C:

[NSListFormatter localizedStringByJoiningStrings:@[@"Anita", @"Jean", @"Peter"]];

相关问题