Objective-C 如何本地化持续时间:“1 年”、“2 年”、“3 年”等

Objective-C How can I localize Time Duration: "1 Year", "2 Years", "3 Years", etc

我需要本地化以下所有可能性: 1年, 2 年,以及...(最多任意数量)。

1个月, 2 个月,然后...(最多任意数量)。

在各种语言中,单词:"Years" 根据其前面的数字而变化。比如法语:

22 年 = 22 回答

23 年 = 23 周年

所以我不能在 NSLocalizedString 模式中使用字符串替换,例如:[NSString stringWithFormat: @"MY_KEY_NAME_%lu_%@", amount, unitOfMeasure]; (因为计量单位取决于金额)。

我一直在查看 NSDateFormatter,但我没有看到任何可以做的占位符:“# Years”或“# Months”。

你们知道本地化这个的简单方法吗?

提前致谢, 亚历克斯

我认为 Cocoa 不支持内置的本地化时间跨度字符串。我做了一些搜索,确实找到了这个 Github 项目,它可以满足您的需求:

https://github.com/kevinlawler/NSDate-TimeAgo

看起来它支持 30 多种语言。看起来它支持带有非罗马符号的语言,如中文、日语、希伯来语、阿拉伯语等。要做好这件事很棘手,因为这些语言使用非常不同的系统、不同的布局规则等。

编辑:

我刚刚了解到 'NSDateComponentsFormatter' class。看起来这是一个系统 class,可以满足您的需求。

你可以使用 NSDateComponentsFormatter 来做到这一点,经过一些研究,显然 不是 这里的错误并且至少在几种不同的语言中做正确的事情.

你可以用类似

的东西来创建格式化程序
let formatter = NSDateComponentsFormatter()
formatter.allowedUnits = NSCalendarUnit.Year
formatter.unitsStyle = NSDateComponentsFormatterUnitsStyle.Full

然后做一个简单的测试,试试

let now = NSDate()
for yearsAhead in (1...30) {
    let newDate = lendar.currentCalendar().dateByAddingUnit(NSCalendarUnit.Year, value: yearsAhead, toDate: now, options: NSCalendarOptions.MatchNextTime)
    let duration = formatter.stringFromDate(now, toDate: newDate!)
    print("\(newDate): \(duration)")
}

将设备语言设置为法语,这对所有 >1 的值使用 "ans",这显然是正确的:

2017-02-24 17:39:53 +0000: 1 an
2018-02-24 17:39:53 +0000: 2 ans
2019-02-24 17:39:53 +0000: 3 ans
2020-02-24 17:39:53 +0000: 4 ans
2021-02-24 17:39:53 +0000: 5 ans
2022-02-24 17:39:53 +0000: 6 ans
....

如您所述,将设备语言设置为俄语后,它对不同的数字使用不同的复数形式,并使用西里尔字符:

2017-02-24 17:41:29 +0000: 1 год
2018-02-24 17:38:38 +0000: 2 года
2019-02-24 17:38:38 +0000: 3 года
2020-02-24 17:38:38 +0000: 4 года
2021-02-24 17:38:38 +0000: 5 лет
2022-02-24 17:38:38 +0000: 6 лет
....