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 лет
....
我需要本地化以下所有可能性: 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 лет
....