Internationalize time ago since string

Switches to using standard date component formatting abbreviations and
enables it to be localized to non-English locales

Closes: #194
Changelog-Changed: Internationalize relative dates
This commit is contained in:
2022-12-30 23:32:33 -05:00
committed by William Casarin
parent 58b4d57f32
commit 0b27a49e32
3 changed files with 57 additions and 10 deletions

View File

@@ -11,36 +11,45 @@ public func time_ago_since(_ date: Date) -> String {
let calendar = Calendar.current
let now = Date()
let unitFlags: NSCalendar.Unit = [.second, .minute, .hour, .day, .weekOfYear, .month, .year]
let unitFlags: NSCalendar.Unit = [.second, .minute, .hour, .day, .weekOfMonth, .month, .year]
let components = (calendar as NSCalendar).components(unitFlags, from: date, to: now, options: [])
let formatter = DateComponentsFormatter()
formatter.unitsStyle = .abbreviated
formatter.maximumUnitCount = 1
formatter.allowedUnits = unitFlags
// Manually format date component from only the most significant time unit because
// DateComponentsFormatter rounds up by default.
if let year = components.year, year >= 1 {
return "\(year)yr"
return formatter.string(from: DateComponents(calendar: calendar, year: year))!
}
if let month = components.month, month >= 1 {
return "\(month)mth"
return formatter.string(from: DateComponents(calendar: calendar, month: month))!
}
if let week = components.weekOfYear, week >= 1 {
return "\(week)wk"
if let week = components.weekOfMonth, week >= 1 {
return formatter.string(from: DateComponents(calendar: calendar, weekOfMonth: week))!
}
if let day = components.day, day >= 1 {
return "\(day)d"
return formatter.string(from: DateComponents(calendar: calendar, day: day))!
}
if let hour = components.hour, hour >= 1 {
return "\(hour)h"
return formatter.string(from: DateComponents(calendar: calendar, hour: hour))!
}
if let minute = components.minute, minute >= 1 {
return "\(minute)m"
return formatter.string(from: DateComponents(calendar: calendar, minute: minute))!
}
if let second = components.second, second >= 3 {
return "\(second)s"
return formatter.string(from: DateComponents(calendar: calendar, second: second))!
}
return "now"
return NSLocalizedString("now", comment: "String indicating that a given timestamp just occurred")
}