diff --git a/Sources/App/Controllers/StatsController.swift b/Sources/App/Controllers/StatsController.swift index 26c735b..5f4ad00 100644 --- a/Sources/App/Controllers/StatsController.swift +++ b/Sources/App/Controllers/StatsController.swift @@ -6,74 +6,246 @@ import Vapor struct StatsController: RouteCollection { - func boot(routes: RoutesBuilder) throws { - let statsRoute = routes.grouped("cod-tracker","api", "stats") - - statsRoute.get("allMatches", use: index) - statsRoute.get("totalWins", use: totalWins) - statsRoute.get("totalLosses", use: totalLosses) - statsRoute.get("overall", use: overall) - - //beaconsRoute.get("overallStats", use: index) - //beaconsRoute.post("", use: create) - // beaconsRoute.delete(":beaconID", use: delete) - + func boot(routes: RoutesBuilder) throws { + let statsRoute = routes.grouped("cod-tracker","api", "stats") + + statsRoute.get("allMatches", use: index) + statsRoute.get("totalWins", use: totalWins) + statsRoute.get("totalLosses", use: totalLosses) + statsRoute.get("overall", use: overall) + statsRoute.get("march", use: getMarchStats) + statsRoute.get("all", use: all) + + //beaconsRoute.get("overallStats", use: index) + //beaconsRoute.post("", use: create) + // beaconsRoute.delete(":beaconID", use: delete) + } func index(req: Request) throws -> EventLoopFuture<[Match]> { return Match.query(on: req.db).all() } - + func totalWins(req: Request) throws -> EventLoopFuture { return Match.query(on: req.db) - .filter(\.$win == true) - .count() + .filter(\.$win == true) + .count() } - + func totalLosses(req: Request) throws -> EventLoopFuture { - return Match.query(on: req.db) - .filter(\.$win == false) - .count() - } + return Match.query(on: req.db) + .filter(\.$win == false) + .count() + } + func getMarchStats(req:Request) throws -> EventLoopFuture { + return getStatsByMonth(year: 2020, month: 03, req: req) + } - func overall(req: Request) throws -> EventLoopFuture { - let lossCount = Match.query(on: req.db) - .filter(\.$win == false) - .count() - - - let winCount = Match.query(on: req.db) - .filter(\.$win == true ) - .count() - + func getStatsByMonth(year:Int, month:Int, req: Request) -> EventLoopFuture{ + + let winCount = Match.query(on: req.db) + .filter(\.$date >= getStartOfMonth(month: month, year: year)) + .filter(\.$date <= getEndOfMonth(month: month, year: year)) + .filter(\.$win == true ) + .count() + + + let lossCount = Match.query(on: req.db) + .filter(\.$date >= getStartOfMonth(month: month, year: year)) + .filter(\.$date <= getEndOfMonth(month: month, year: year)) + .filter(\.$win == false ) + .count() - let combined = winCount.and(lossCount) return combined.map { (winCount, lossCount) -> (Stats) in - let ratio:Double = (Double(winCount) / Double(lossCount)).truncate(places: 2) + return Stats.init(winLoss: String(ratio), totalWins: winCount, totalLosses: lossCount) + } + } + + func statsForRecent(numberGames:Int, req:Request) -> EventLoopFuture { + + let winCount = Match.query(on: req.db) + .sort(\.$date) + .range(lower: 0, upper: numberGames) + .filter(\.$win == true ) + .count() + + + let lossCount = Match.query(on: req.db) + .sort(\.$date) + .range(lower: 0, upper: numberGames) + .filter(\.$win == false ) + .count() + + let combined = winCount.and(lossCount) + + return combined.map { (winCount, lossCount) -> (Stats) in + let ratio:Double = (Double(winCount) / Double(lossCount)).truncate(places: 2) + return Stats.init(winLoss: String(ratio), totalWins: winCount, totalLosses: lossCount) + } + } + + + + + private func getStartOfMonth(month:Int, year:Int) -> Date { + return Date(year: year, month: month, day: 0, hour: 0, minute: 0, second: 0, nanosecond: 0, region: .current) + } + + private func getEndOfMonth(month:Int, year:Int) -> Date { + return Date(year: year, month: month + 1, day: -1, hour: 0, minute: 0, second: 0, nanosecond: 0, region: .ISO) + } + + + + // private func getAccumualtiveWLByDay(req:Request) { + // + // let winLossRatio:[String:Double] = [:] + // + // let matches = Match.query(on:req.db) + // .sort(\.$date) + // .all() + // + // var ratio = 0.0 + // var cumulativeWLRatio = req.eventLoop.future(ratio) + // + // matches.map { (matches) -> [String:Double] in + // + // let winLossRatio2:[String:Double] = [:] + // + // matches.reduce(Dictionary()) { (partialRatio, match) -> [String:Double] in + // + // } + // } + // + // } + // + // } + + + + + func all(req: Request) throws -> EventLoopFuture { + + + struct MonthYear { + let month:Int + let year:Int + } + + var date = Date(year: 2020, month: 03, day: 01, hour: 0, minute: 0) + var previousMonths:[MonthYear] = [] + + repeat { + //let stats = getStatsByMonth(year: date.year, month: date.month, req: req) //returns eventloopfuture + previousMonths.append(MonthYear(month: date.month, year: date.year)) + date = Calendar.current.date(byAdding: .month, value: 1, to: date)!.date + } while (date.month != (Date().month + 1) || date.year != Date().year) + + + + func getMonthStats (_ remaining: ArraySlice, allMonthlyStats: inout [MonthStats], eventLoop: EventLoop) -> EventLoopFuture<[MonthStats]> { + var remaining = remaining + if let first = remaining.popLast() { + + - return Stats.init(winLoss: String(ratio), totalWins: winCount, totalLosses: lossCount) + return getStatsByMonth(year: first.year, month: first.month, req: req).flatMap { [remaining, allMonthlyStats] (stats) -> EventLoopFuture<[MonthStats]> in + print ("remaining \(remaining)") + var allMonthlyStats = allMonthlyStats + allMonthlyStats.append(MonthStats(month: first.month, year: first.year, stats:stats )) + return getMonthStats(remaining, allMonthlyStats:&allMonthlyStats, eventLoop: eventLoop) + } + + } else { + print ("rett") + return req.eventLoop.makeSucceededFuture(allMonthlyStats) + } + } + + + var stats:[MonthStats] = [] + let monthstats = getMonthStats(previousMonths[0.. AllStats in + return AllStats.init(overall: overall, byMonth: monthlyStats) + } + // return getMonthStats(previousMonths, eventLoop: req.eventLoop) + + + // var date = Date(year: 2020, month: 03, day: 01, hour: 0, minute: 0) + // var monthlyStats = [String:Stats]() + // repeat { + // let stats = getStatsByMonth(year: date.year, month: date.month, req: req) //returns eventloopfuture + // monthlyStats["\(date.month) \(date.year)"] = stats.map({ (newStats) -> (Stats) in + // return Stats(winLoss: newStats.winLossRatio, totalWins: newStats.totalWins, totalLosses: newStats.totalLosses) + // }) + // date = Calendar.current.date(byAdding: .month, value: 1, to: date)!.date + // } while (date.month != Date().month || date.year != Date().year) + //// + // + // + // + // + // + // let combined = try overall(req: req).and(req.eventLoop.future(monthlyStats)) + // return combined.map { (stats, dict) -> (AllStats) in + // return AllStats(overall: stats, byMonth: monthlyStats ) + // + // } + + // let combined = try overall(req: req).and( + // + // + // + // + // + // ) + } + + + + func overall(req: Request) throws -> EventLoopFuture { + + let lossCount = Match.query(on: req.db) + .filter(\.$win == false) + .count() + + + let winCount = Match.query(on: req.db) + .filter(\.$win == true ) + .count() + + + + let combined = winCount.and(lossCount) + + + return combined.map { (winCount, lossCount) -> (Stats) in + let ratio:Double = (Double(winCount) / Double(lossCount)).truncate(places: 2) + + return Stats.init(winLoss: String(ratio), totalWins: winCount, totalLosses: lossCount) } } -// + // -// func create(req: Request) throws -> EventLoopFuture { -// let newBeacon = try req.content.decode(Beacon.Create.self) -// let beacon = Beacon(id: UUID(), ownerId: nil) -// return beacon.save(on: req.db).map { beacon } -// } -// -// func delete(req: Request) throws -> EventLoopFuture { -// return Beacon.find(req.parameters.get("beaconID"), on: req.db) -// .unwrap(or: Abort(.notFound)) -// .flatMap { $0.delete(on: req.db) } -// .transform(to: .ok) -// } + // func create(req: Request) throws -> EventLoopFuture { + // let newBeacon = try req.content.decode(Beacon.Create.self) + // let beacon = Beacon(id: UUID(), ownerId: nil) + // return beacon.save(on: req.db).map { beacon } + // } + // + // func delete(req: Request) throws -> EventLoopFuture { + // return Beacon.find(req.parameters.get("beaconID"), on: req.db) + // .unwrap(or: Abort(.notFound)) + // .flatMap { $0.delete(on: req.db) } + // .transform(to: .ok) + // } } diff --git a/Sources/App/Libraries/SwiftDate/Date/Date+Compare.swift b/Sources/App/Libraries/SwiftDate/Date/Date+Compare.swift new file mode 100644 index 0000000..9faa59d --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Date/Date+Compare.swift @@ -0,0 +1,190 @@ +// +// SwiftDate +// Parse, validate, manipulate, and display dates, time and timezones in Swift +// +// Created by Daniele Margutti +// - Web: https://www.danielemargutti.com +// - Twitter: https://twitter.com/danielemargutti +// - Mail: hello@danielemargutti.com +// +// Copyright © 2019 Daniele Margutti. Licensed under MIT License. +// + +import Foundation + +public extension Date { + + // MARK: - Comparing Close + + /// Decides whether a Date is "close by" another one passed in parameter, + /// where "Being close" is measured using a precision argument + /// which is initialized a 300 seconds, or 5 minutes. + /// + /// - Parameters: + /// - refDate: reference date compare against to. + /// - precision: The precision of the comparison (default is 5 minutes, or 300 seconds). + /// - Returns: A boolean; true if close by, false otherwise. + func compareCloseTo(_ refDate: Date, precision: TimeInterval = 300) -> Bool { + return (abs(timeIntervalSince(refDate)) < precision) + } + + // MARK: - Extendend Compare + + /// Compare the date with the rule specified in the `compareType` parameter. + /// + /// - Parameter compareType: comparison type. + /// - Returns: `true` if comparison succeded, `false` otherwise + func compare(_ compareType: DateComparisonType) -> Bool { + return inDefaultRegion().compare(compareType) + } + + /// Returns a ComparisonResult value that indicates the ordering of two given dates based on + /// their components down to a given unit granularity. + /// + /// - parameter date: date to compare. + /// - parameter granularity: The smallest unit that must, along with all larger units be less for the given dates + /// - returns: `ComparisonResult` + func compare(toDate refDate: Date, granularity: Calendar.Component) -> ComparisonResult { + return inDefaultRegion().compare(toDate: refDate.inDefaultRegion(), granularity: granularity) + } + + /// Compares whether the receiver is before/before equal `date` based on their components down to a given unit granularity. + /// + /// - Parameters: + /// - refDate: reference date + /// - orEqual: `true` to also check for equality + /// - granularity: smallest unit that must, along with all larger units, be less for the given dates + /// - Returns: Boolean + func isBeforeDate(_ refDate: Date, orEqual: Bool = false, granularity: Calendar.Component) -> Bool { + return inDefaultRegion().isBeforeDate(refDate.inDefaultRegion(), orEqual: orEqual, granularity: granularity) + } + + /// Compares whether the receiver is after `date` based on their components down to a given unit granularity. + /// + /// - Parameters: + /// - refDate: reference date + /// - orEqual: `true` to also check for equality + /// - granularity: Smallest unit that must, along with all larger units, be greater for the given dates. + /// - Returns: Boolean + func isAfterDate(_ refDate: Date, orEqual: Bool = false, granularity: Calendar.Component) -> Bool { + return inDefaultRegion().isAfterDate(refDate.inDefaultRegion(), orEqual: orEqual, granularity: granularity) + } + + /// Return true if receiver date is contained in the range specified by two dates. + /// + /// - Parameters: + /// - startDate: range upper bound date + /// - endDate: range lower bound date + /// - orEqual: `true` to also check for equality on date and date2 + /// - granularity: smallest unit that must, along with all larger units, be greater for the given dates. + /// - Returns: Boolean + func isInRange(date startDate: Date, and endDate: Date, orEqual: Bool = false, granularity: Calendar.Component = .nanosecond) -> Bool { + return self.inDefaultRegion().isInRange(date: startDate.inDefaultRegion(), and: endDate.inDefaultRegion(), orEqual: orEqual, granularity: granularity) + } + + /// Compares equality of two given dates based on their components down to a given unit + /// granularity. + /// + /// - parameter date: date to compare + /// - parameter granularity: The smallest unit that must, along with all larger units, be equal for the given + /// dates to be considered the same. + /// + /// - returns: `true` if the dates are the same down to the given granularity, otherwise `false` + func isInside(date: Date, granularity: Calendar.Component) -> Bool { + return (compare(toDate: date, granularity: granularity) == .orderedSame) + } + + // MARK: - Date Earlier/Later + + /// Return the earlier of two dates, between self and a given date. + /// + /// - Parameter date: The date to compare to self + /// - Returns: The date that is earlier + func earlierDate(_ date: Date) -> Date { + return timeIntervalSince(date) <= 0 ? self : date + } + + /// Return the later of two dates, between self and a given date. + /// + /// - Parameter date: The date to compare to self + /// - Returns: The date that is later + func laterDate(_ date: Date) -> Date { + return timeIntervalSince(date) >= 0 ? self : date + } + +} + +extension Date { + + /// Returns the difference in the calendar component given (like day, month or year) + /// with respect to the other date as a positive integer + public func difference(in component: Calendar.Component, from other: Date) -> Int? { + let (max, min) = orderDate(with: other) + let result = calendar.dateComponents([component], from: min, to: max) + return getValue(of: component, from: result) + } + + /// Returns the differences in the calendar components given (like day, month and year) + /// with respect to the other date as dictionary with the calendar component as the key + /// and the diffrence as a positive integer as the value + public func differences(in components: Set, from other: Date) -> [Calendar.Component: Int] { + let (max, min) = orderDate(with: other) + let differenceInDates = calendar.dateComponents(components, from: min, to: max) + var result = [Calendar.Component: Int]() + for component in components { + if let value = getValue(of: component, from: differenceInDates) { + result[component] = value + } + } + return result + } + + private func getValue(of component: Calendar.Component, from dateComponents: DateComponents) -> Int? { + switch component { + case .era: + return dateComponents.era + case .year: + return dateComponents.year + case .month: + return dateComponents.month + case .day: + return dateComponents.day + case .hour: + return dateComponents.hour + case .minute: + return dateComponents.minute + case .second: + return dateComponents.second + case .weekday: + return dateComponents.weekday + case .weekdayOrdinal: + return dateComponents.weekdayOrdinal + case .quarter: + return dateComponents.quarter + case .weekOfMonth: + return dateComponents.weekOfMonth + case .weekOfYear: + return dateComponents.weekOfYear + case .yearForWeekOfYear: + return dateComponents.yearForWeekOfYear + case .nanosecond: + return dateComponents.nanosecond + case .calendar, .timeZone: + return nil + @unknown default: + assert(false, "unknown date component") + } + return nil + } + + private func orderDate(with other: Date) -> (Date, Date) { + let first = self.timeIntervalSince1970 + let second = other.timeIntervalSince1970 + + if first >= second { + return (self, other) + } + + return (other, self) + } +} diff --git a/Sources/App/Libraries/SwiftDate/Date/Date+Components.swift b/Sources/App/Libraries/SwiftDate/Date/Date+Components.swift new file mode 100644 index 0000000..137a4c8 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Date/Date+Components.swift @@ -0,0 +1,49 @@ +// +// SwiftDate +// Parse, validate, manipulate, and display dates, time and timezones in Swift +// +// Created by Daniele Margutti +// - Web: https://www.danielemargutti.com +// - Twitter: https://twitter.com/danielemargutti +// - Mail: hello@danielemargutti.com +// +// Copyright © 2019 Daniele Margutti. Licensed under MIT License. +// + +import Foundation + +public extension Date { + + /// Indicates whether the month is a leap month. + var isLeapMonth: Bool { + return inDefaultRegion().isLeapMonth + } + + /// Indicates whether the year is a leap year. + var isLeapYear: Bool { + return inDefaultRegion().isLeapYear + } + + /// Julian day is the continuous count of days since the beginning of + /// the Julian Period used primarily by astronomers. + var julianDay: Double { + return inDefaultRegion().julianDay + } + + /// The Modified Julian Date (MJD) was introduced by the Smithsonian Astrophysical Observatory + /// in 1957 to record the orbit of Sputnik via an IBM 704 (36-bit machine) + /// and using only 18 bits until August 7, 2576. + var modifiedJulianDay: Double { + return inDefaultRegion().modifiedJulianDay + } + + /// Return elapsed time expressed in given components since the current receiver and a reference date. + /// + /// - Parameters: + /// - refDate: reference date (`nil` to use current date in the same region of the receiver) + /// - component: time unit to extract. + /// - Returns: value + func getInterval(toDate: Date?, component: Calendar.Component) -> Int64 { + return inDefaultRegion().getInterval(toDate: toDate?.inDefaultRegion(), component: component) + } +} diff --git a/Sources/App/Libraries/SwiftDate/Date/Date+Create.swift b/Sources/App/Libraries/SwiftDate/Date/Date+Create.swift new file mode 100644 index 0000000..965f5c3 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Date/Date+Create.swift @@ -0,0 +1,250 @@ +// +// SwiftDate +// Parse, validate, manipulate, and display dates, time and timezones in Swift +// +// Created by Daniele Margutti +// - Web: https://www.danielemargutti.com +// - Twitter: https://twitter.com/danielemargutti +// - Mail: hello@danielemargutti.com +// +// Copyright © 2019 Daniele Margutti. Licensed under MIT License. +// + +import Foundation + +public extension Date { + + /// Return the oldest date in given list. + /// + /// - Parameter list: list of dates + /// - Returns: a tuple with the index of the oldest date and its instance. + static func oldestIn(list: [Date]) -> Date? { + guard list.count > 0 else { return nil } + guard list.count > 1 else { return list.first! } + return list.min(by: { + return $0 < $1 + }) + } + + /// Return the newest date in given list. + /// + /// - Parameter list: list of dates + /// - Returns: a tuple with the index of the oldest date and its instance. + static func newestIn(list: [Date]) -> Date? { + guard list.count > 0 else { return nil } + guard list.count > 1 else { return list.first! } + return list.max(by: { + return $0 < $1 + }) + } + + /// Enumerate dates between two intervals by adding specified time components defined by a function and return an array of dates. + /// `startDate` interval will be the first item of the resulting array. + /// The last item of the array is evaluated automatically and maybe not equal to `endDate`. + /// + /// - Parameters: + /// - start: starting date + /// - endDate: ending date + /// - increment: increment function. It get the last generated date and require a valida `DateComponents` instance which define the increment + /// - Returns: array of dates + static func enumerateDates(from startDate: Date, to endDate: Date, increment: ((Date) -> (DateComponents))) -> [Date] { + var dates: [Date] = [] + var currentDate = startDate + + while currentDate <= endDate { + dates.append(currentDate) + currentDate = (currentDate + increment(currentDate)) + } + return dates + } + + /// Enumerate dates between two intervals by adding specified time components and return an array of dates. + /// `startDate` interval will be the first item of the resulting array. + /// The last item of the array is evaluated automatically and maybe not equal to `endDate`. + /// + /// - Parameters: + /// - start: starting date + /// - endDate: ending date + /// - increment: components to add + /// - Returns: array of dates + static func enumerateDates(from startDate: Date, to endDate: Date, increment: DateComponents) -> [Date] { + return Date.enumerateDates(from: startDate, to: endDate, increment: { _ in + return increment + }) + } + + /// Round a given date time to the passed style (off|up|down). + /// + /// - Parameter style: rounding mode. + /// - Returns: rounded date + func dateRoundedAt(at style: RoundDateMode) -> Date { + return inDefaultRegion().dateRoundedAt(style).date + } + + /// Returns a new DateInRegion that is initialized at the start of a specified unit of time. + /// + /// - Parameter unit: time unit value. + /// - Returns: instance at the beginning of the time unit; `self` if fails. + func dateAtStartOf(_ unit: Calendar.Component) -> Date { + return inDefaultRegion().dateAtStartOf(unit).date + } + + /// Return a new DateInRegion that is initialized at the start of the specified components + /// executed in order. + /// + /// - Parameter units: sequence of transformations as time unit components + /// - Returns: new date at the beginning of the passed components, intermediate results if fails. + func dateAtStartOf(_ units: [Calendar.Component]) -> Date { + return units.reduce(self) { (currentDate, currentUnit) -> Date in + return currentDate.dateAtStartOf(currentUnit) + } + } + + /// Returns a new Moment that is initialized at the end of a specified unit of time. + /// + /// - parameter unit: A TimeUnit value. + /// + /// - returns: A new Moment instance. + func dateAtEndOf(_ unit: Calendar.Component) -> Date { + return inDefaultRegion().dateAtEndOf(unit).date + } + + /// Return a new DateInRegion that is initialized at the end of the specified components + /// executed in order. + /// + /// - Parameter units: sequence of transformations as time unit components + /// - Returns: new date at the end of the passed components, intermediate results if fails. + func dateAtEndOf(_ units: [Calendar.Component]) -> Date { + return units.reduce(self) { (currentDate, currentUnit) -> Date in + return currentDate.dateAtEndOf(currentUnit) + } + } + + /// Create a new date by altering specified components of the receiver. + /// + /// - Parameter components: components to alter with their new values. + /// - Returns: new altered `DateInRegion` instance + func dateBySet(_ components: [Calendar.Component: Int]) -> Date? { + return DateInRegion(self, region: SwiftDate.defaultRegion).dateBySet(components)?.date + } + + /// Create a new date by altering specified time components. + /// + /// - Parameters: + /// - hour: hour to set (`nil` to leave it unaltered) + /// - min: min to set (`nil` to leave it unaltered) + /// - secs: sec to set (`nil` to leave it unaltered) + /// - ms: milliseconds to set (`nil` to leave it unaltered) + /// - options: options for calculation + /// - Returns: new altered `DateInRegion` instance + func dateBySet(hour: Int?, min: Int?, secs: Int?, ms: Int? = nil, options: TimeCalculationOptions = TimeCalculationOptions()) -> Date? { + let srcDate = DateInRegion(self, region: SwiftDate.defaultRegion) + return srcDate.dateBySet(hour: hour, min: min, secs: secs, ms: ms, options: options)?.date + } + + /// Creates a new instance by truncating the components + /// + /// - Parameter components: components to truncate. + /// - Returns: new date with truncated components. + func dateTruncated(_ components: [Calendar.Component]) -> Date? { + return DateInRegion(self, region: SwiftDate.defaultRegion).dateTruncated(at: components)?.date + } + + /// Creates a new instance by truncating the components starting from given components down the granurality. + /// + /// - Parameter component: The component to be truncated from. + /// - Returns: new date with truncated components. + func dateTruncated(from component: Calendar.Component) -> Date? { + return DateInRegion(self, region: SwiftDate.defaultRegion).dateTruncated(from: component)?.date + } + + /// Offset a date by n calendar components. + /// Note: This operation can be functionally chained. + /// + /// - Parameters: + /// - count: value of the offset. + /// - component: component to offset. + /// - Returns: new altered date. + func dateByAdding(_ count: Int, _ component: Calendar.Component) -> DateInRegion { + return DateInRegion(self, region: SwiftDate.defaultRegion).dateByAdding(count, component) + } + + /// Return related date starting from the receiver attributes. + /// + /// - Parameter type: related date to obtain. + /// - Returns: instance of the related date. + func dateAt(_ type: DateRelatedType) -> Date { + return inDefaultRegion().dateAt(type).date + } + + /// Create a new date at now and extract the related date using passed rule type. + /// + /// - Parameter type: related date to obtain. + /// - Returns: instance of the related date. + static func nowAt(_ type: DateRelatedType) -> Date { + return Date().dateAt(type) + } + + /// Return the dates for a specific weekday inside given month of specified year. + /// Ie. get me all the saturdays of Feb 2018. + /// NOTE: Values are returned in order. + /// + /// - Parameters: + /// - weekday: weekday target. + /// - month: month target. + /// - year: year target. + /// - region: region target, omit to use `SwiftDate.defaultRegion` + /// - Returns: Ordered list of the dates for given weekday into given month. + static func datesForWeekday(_ weekday: WeekDay, inMonth month: Int, ofYear year: Int, + region: Region = SwiftDate.defaultRegion) -> [Date] { + let fromDate = DateInRegion(Date(year: year, month: month, day: 1, hour: 0, minute: 0), region: region) + let toDate = fromDate.dateAt(.endOfMonth) + return DateInRegion.datesForWeekday(weekday, from: fromDate, to: toDate, region: region).map { $0.date } + } + + /// Return the dates for a specific weekday inside a specified date range. + /// NOTE: Values are returned in order. + /// + /// - Parameters: + /// - weekday: weekday target. + /// - startDate: from date of the range. + /// - endDate: to date of the range. + /// - region: region target, omit to use `SwiftDate.defaultRegion` + /// - Returns: Ordered list of the dates for given weekday in passed range. + static func datesForWeekday(_ weekday: WeekDay, from startDate: Date, to endDate: Date, + region: Region = SwiftDate.defaultRegion) -> [Date] { + let fromDate = DateInRegion(startDate, region: region) + let toDate = DateInRegion(endDate, region: region) + return DateInRegion.datesForWeekday(weekday, from: fromDate, to: toDate, region: region).map { $0.date } + } + + /// Returns the date at the given week number and week day preserving smaller components (hour, minute, seconds) + /// + /// For example: to get the third friday of next month + /// let today = DateInRegion() + /// let result = today.dateAt(weekdayOrdinal: 3, weekday: .friday, monthNumber: today.month + 1) + /// + /// - Parameters: + /// - weekdayOrdinal: the week number (by set position in a recurrence rule) + /// - weekday: WeekDay + /// - monthNumber: a number from 1 to 12 representing the month, optional parameter + /// - yearNumber: a number representing the year, optional parameter + /// - Returns: new date created with the given parameters + func dateAt(weekdayOrdinal: Int, weekday: WeekDay, monthNumber: Int? = nil, + yearNumber: Int? = nil) -> Date { + let date = DateInRegion(self, region: region) + return date.dateAt(weekdayOrdinal: weekdayOrdinal, weekday: weekday, monthNumber: monthNumber, yearNumber: yearNumber).date + } + + /// Returns the next weekday preserving smaller components (hour, minute, seconds) + /// + /// - Parameters: + /// - weekday: weekday to get. + /// - region: region target, omit to use `SwiftDate.defaultRegion` + /// - Returns: `Date` + func nextWeekday(_ weekday: WeekDay, region: Region = SwiftDate.defaultRegion) -> Date { + let date = DateInRegion(self, region: region) + return date.nextWeekday(weekday).date + } + +} diff --git a/Sources/App/Libraries/SwiftDate/Date/Date+Math.swift b/Sources/App/Libraries/SwiftDate/Date/Date+Math.swift new file mode 100644 index 0000000..5383c9b --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Date/Date+Math.swift @@ -0,0 +1,40 @@ +// +// SwiftDate +// Parse, validate, manipulate, and display dates, time and timezones in Swift +// +// Created by Daniele Margutti +// - Web: https://www.danielemargutti.com +// - Twitter: https://twitter.com/danielemargutti +// - Mail: hello@danielemargutti.com +// +// Copyright © 2019 Daniele Margutti. Licensed under MIT License. +// + +import Foundation + +/// Subtracts two dates and returns the relative components from `lhs` to `rhs`. +/// Follows this mathematical pattern: +/// let difference = lhs - rhs +/// rhs + difference = lhs +public func - (lhs: Date, rhs: Date) -> DateComponents { + return SwiftDate.defaultRegion.calendar.dateComponents(DateComponents.allComponentsSet, from: rhs, to: lhs) +} + +/// Adds date components to a date and returns a new date. +public func + (lhs: Date, rhs: DateComponents) -> Date { + return rhs.from(lhs)! +} + +/// Adds date components to a date and returns a new date. +public func + (lhs: DateComponents, rhs: Date) -> Date { + return (rhs + lhs) +} + +/// Subtracts date components from a date and returns a new date. +public func - (lhs: Date, rhs: DateComponents) -> Date { + return (lhs + (-rhs)) +} + +public func + (lhs: Date, rhs: TimeInterval) -> Date { + return lhs.addingTimeInterval(rhs) +} diff --git a/Sources/App/Libraries/SwiftDate/Date/Date.swift b/Sources/App/Libraries/SwiftDate/Date/Date.swift new file mode 100644 index 0000000..41eb6d4 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Date/Date.swift @@ -0,0 +1,162 @@ +// +// SwiftDate +// Parse, validate, manipulate, and display dates, time and timezones in Swift +// +// Created by Daniele Margutti +// - Web: https://www.danielemargutti.com +// - Twitter: https://twitter.com/danielemargutti +// - Mail: hello@danielemargutti.com +// +// Copyright © 2019 Daniele Margutti. Licensed under MIT License. +// + +import Foundation + +#if os(Linux) + +#else +internal enum AssociatedKeys: String { + case customDateFormatter = "SwiftDate.CustomDateFormatter" +} +#endif + +extension Date: DateRepresentable { + + /// Just return itself to be compliant with `DateRepresentable` protocol. + public var date: Date { return self } + + /// For absolute Date object the default region is obtained from the global `defaultRegion` variable. + public var region: Region { + return SwiftDate.defaultRegion + } + + #if os(Linux) + public var customFormatter: DateFormatter? { + get { + debugPrint("Not supported on Linux") + return nil + } + set { debugPrint("Not supported on Linux") } + } + #else + /// Assign a custom formatter if you need a special behaviour during formatting of the object. + /// Usually you will not need to do it, SwiftDate uses the local thread date formatter in order to + /// optimize the formatting process. By default is `nil`. + public var customFormatter: DateFormatter? { + get { + let fomatter: DateFormatter? = getAssociatedValue(key: AssociatedKeys.customDateFormatter.rawValue, object: self as AnyObject) + return fomatter + } + set { + set(associatedValue: newValue, key: AssociatedKeys.customDateFormatter.rawValue, object: self as AnyObject) + } + } + #endif + + /// Extract the date components. + public var dateComponents: DateComponents { + return region.calendar.dateComponents(DateComponents.allComponentsSet, from: self) + } + + /// Initialize a new date object from string expressed in given region. + /// + /// - Parameters: + /// - string: date expressed as string. + /// - format: format of the date (`nil` uses provided list of auto formats patterns. + /// Pass it if you can in order to optimize the parse task). + /// - region: region in which the date is expressed. `nil` uses the `SwiftDate.defaultRegion`. + public init?(_ string: String, format: String? = nil, region: Region = SwiftDate.defaultRegion) { + guard let dateInRegion = DateInRegion(string, format: format, region: region) else { return nil } + self = dateInRegion.date + } + + /// Initialize a new date from the number of seconds passed since Unix Epoch. + /// + /// - Parameter interval: seconds + + /// Initialize a new date from the number of seconds passed since Unix Epoch. + /// + /// - Parameters: + /// - interval: seconds from Unix epoch time. + /// - region: region in which the date, `nil` uses the default region at UTC timezone + public init(seconds interval: TimeInterval, region: Region = Region.UTC) { + self = DateInRegion(seconds: interval, region: region).date + } + + /// Initialize a new date corresponding to the number of milliseconds since the Unix Epoch. + /// + /// - Parameters: + /// - interval: seconds since the Unix Epoch timestamp. + /// - region: region in which the date must be expressed, `nil` uses the default region at UTC timezone + public init(milliseconds interval: Int, region: Region = Region.UTC) { + self = DateInRegion(milliseconds: interval, region: region).date + } + + /// Initialize a new date with the opportunity to configure single date components via builder pattern. + /// Date is therfore expressed in passed region (`DateComponents`'s `timezone`,`calendar` and `locale` are ignored + /// and overwritten by the region if not `nil`). + /// + /// - Parameters: + /// - configuration: configuration callback + /// - region: region in which the date is expressed. Ignore to use `SwiftDate.defaultRegion`, `nil` to use `DateComponents` data. + public init?(components configuration: ((inout DateComponents) -> Void), region: Region? = SwiftDate.defaultRegion) { + guard let date = DateInRegion(components: configuration, region: region)?.date else { return nil } + self = date + } + + /// Initialize a new date with given components. + /// + /// - Parameters: + /// - components: components of the date. + /// - region: region in which the date is expressed. + /// Ignore to use `SwiftDate.defaultRegion`, `nil` to use `DateComponents` data. + public init?(components: DateComponents, region: Region?) { + guard let date = DateInRegion(components: components, region: region)?.date else { return nil } + self = date + } + + /// Initialize a new date with given components. + public init(year: Int, month: Int, day: Int, hour: Int, minute: Int, second: Int = 0, nanosecond: Int = 0, region: Region = SwiftDate.defaultRegion) { + var components = DateComponents() + components.year = year + components.month = month + components.day = day + components.hour = hour + components.minute = minute + components.second = second + components.nanosecond = nanosecond + components.timeZone = region.timeZone + components.calendar = region.calendar + self = region.calendar.date(from: components)! + } + + /// Express given absolute date in the context of the default region. + /// + /// - Returns: `DateInRegion` + public func inDefaultRegion() -> DateInRegion { + return DateInRegion(self, region: SwiftDate.defaultRegion) + } + + /// Express given absolute date in the context of passed region. + /// + /// - Parameter region: destination region. + /// - Returns: `DateInRegion` + public func `in`(region: Region) -> DateInRegion { + return DateInRegion(self, region: region) + } + + /// Return a date in the distant past. + /// + /// - Returns: Date instance. + public static func past() -> Date { + return Date.distantPast + } + + /// Return a date in the distant future. + /// + /// - Returns: Date instance. + public static func future() -> Date { + return Date.distantFuture + } + +} diff --git a/Sources/App/Libraries/SwiftDate/DateInRegion/DateInRegion+Compare.swift b/Sources/App/Libraries/SwiftDate/DateInRegion/DateInRegion+Compare.swift new file mode 100644 index 0000000..775d86f --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/DateInRegion/DateInRegion+Compare.swift @@ -0,0 +1,326 @@ +// +// SwiftDate +// Parse, validate, manipulate, and display dates, time and timezones in Swift +// +// Created by Daniele Margutti +// - Web: https://www.danielemargutti.com +// - Twitter: https://twitter.com/danielemargutti +// - Mail: hello@danielemargutti.com +// +// Copyright © 2019 Daniele Margutti. Licensed under MIT License. +// + +import Foundation + +// MARK: - Comparing DateInRegion + +public func == (lhs: DateInRegion, rhs: DateInRegion) -> Bool { + return (lhs.date.timeIntervalSince1970 == rhs.date.timeIntervalSince1970) +} + +public func <= (lhs: DateInRegion, rhs: DateInRegion) -> Bool { + let result = lhs.date.compare(rhs.date) + return (result == .orderedAscending || result == .orderedSame) +} + +public func >= (lhs: DateInRegion, rhs: DateInRegion) -> Bool { + let result = lhs.date.compare(rhs.date) + return (result == .orderedDescending || result == .orderedSame) +} + +public func < (lhs: DateInRegion, rhs: DateInRegion) -> Bool { + return lhs.date.compare(rhs.date) == .orderedAscending +} + +public func > (lhs: DateInRegion, rhs: DateInRegion) -> Bool { + return lhs.date.compare(rhs.date) == .orderedDescending +} + +// The type of comparison to do against today's date or with the suplied date. +/// +/// - isToday: hecks if date today. +/// - isTomorrow: Checks if date is tomorrow. +/// - isYesterday: Checks if date is yesterday. +/// - isSameDay: Compares date days +/// - isThisWeek: Checks if date is in this week. +/// - isNextWeek: Checks if date is in next week. +/// - isLastWeek: Checks if date is in last week. +/// - isSameWeek: Compares date weeks +/// - isThisMonth: Checks if date is in this month. +/// - isNextMonth: Checks if date is in next month. +/// - isLastMonth: Checks if date is in last month. +/// - isSameMonth: Compares date months +/// - isThisYear: Checks if date is in this year. +/// - isNextYear: Checks if date is in next year. +/// - isLastYear: Checks if date is in last year. +/// - isSameYear: Compare date years +/// - isInTheFuture: Checks if it's a future date +/// - isInThePast: Checks if the date has passed +/// - isEarlier: Checks if earlier than date +/// - isLater: Checks if later than date +/// - isWeekday: Checks if it's a weekday +/// - isWeekend: Checks if it's a weekend +/// - isInDST: Indicates whether the represented date uses daylight saving time. +/// - isMorning: Return true if date is in the morning (>=5 - <12) +/// - isAfternoon: Return true if date is in the afternoon (>=12 - <17) +/// - isEvening: Return true if date is in the morning (>=17 - <21) +/// - isNight: Return true if date is in the morning (>=21 - <5) +public enum DateComparisonType { + + // Days + case isToday + case isTomorrow + case isYesterday + case isSameDay(_ : DateRepresentable) + + // Weeks + case isThisWeek + case isNextWeek + case isLastWeek + case isSameWeek(_: DateRepresentable) + + // Months + case isThisMonth + case isNextMonth + case isLastMonth + case isSameMonth(_: DateRepresentable) + + // Years + case isThisYear + case isNextYear + case isLastYear + case isSameYear(_: DateRepresentable) + + // Relative Time + case isInTheFuture + case isInThePast + case isEarlier(than: DateRepresentable) + case isLater(than: DateRepresentable) + case isWeekday + case isWeekend + + // Day time + case isMorning + case isAfternoon + case isEvening + case isNight + + // TZ + case isInDST +} + +public extension DateInRegion { + + /// Decides whether a DATE is "close by" another one passed in parameter, + /// where "Being close" is measured using a precision argument + /// which is initialized a 300 seconds, or 5 minutes. + /// + /// - Parameters: + /// - refDate: reference date compare against to. + /// - precision: The precision of the comparison (default is 5 minutes, or 300 seconds). + /// - Returns: A boolean; true if close by, false otherwise. + func compareCloseTo(_ refDate: DateInRegion, precision: TimeInterval = 300) -> Bool { + return (abs(date.timeIntervalSince(refDate.date)) <= precision) + } + + /// Compare the date with the rule specified in the `compareType` parameter. + /// + /// - Parameter compareType: comparison type. + /// - Returns: `true` if comparison succeded, `false` otherwise + func compare(_ compareType: DateComparisonType) -> Bool { + switch compareType { + case .isToday: + return compare(.isSameDay(region.nowInThisRegion())) + + case .isTomorrow: + let tomorrow = DateInRegion(region: region).dateByAdding(1, .day) + return compare(.isSameDay(tomorrow)) + + case .isYesterday: + let yesterday = DateInRegion(region: region).dateByAdding(-1, .day) + return compare(.isSameDay(yesterday)) + + case .isSameDay(let refDate): + return calendar.isDate(date, inSameDayAs: refDate.date) + + case .isThisWeek: + return compare(.isSameWeek(region.nowInThisRegion())) + + case .isNextWeek: + let nextWeek = region.nowInThisRegion().dateByAdding(1, .weekOfYear) + return compare(.isSameWeek(nextWeek)) + + case .isLastWeek: + let lastWeek = region.nowInThisRegion().dateByAdding(-1, .weekOfYear) + return compare(.isSameWeek(lastWeek)) + + case .isSameWeek(let refDate): + guard weekOfYear == refDate.weekOfYear else { + return false + } + // Ensure time interval is under 1 week + return (abs(date.timeIntervalSince(refDate.date)) < 1.weeks.timeInterval) + + case .isThisMonth: + return compare(.isSameMonth(region.nowInThisRegion())) + + case .isNextMonth: + let nextMonth = region.nowInThisRegion().dateByAdding(1, .month) + return compare(.isSameMonth(nextMonth)) + + case .isLastMonth: + let lastMonth = region.nowInThisRegion().dateByAdding(-1, .month) + return compare(.isSameMonth(lastMonth)) + + case .isSameMonth(let refDate): + return (date.year == refDate.date.year) && (date.month == refDate.date.month) + + case .isThisYear: + return compare(.isSameYear(region.nowInThisRegion())) + + case .isNextYear: + let nextYear = region.nowInThisRegion().dateByAdding(1, .year) + return compare(.isSameYear(nextYear)) + + case .isLastYear: + let lastYear = region.nowInThisRegion().dateByAdding(-1, .year) + return compare(.isSameYear(lastYear)) + + case .isSameYear(let refDate): + return (date.year == refDate.date.year) + + case .isInTheFuture: + return compare(.isLater(than: region.nowInThisRegion())) + + case .isInThePast: + return compare(.isEarlier(than: region.nowInThisRegion())) + + case .isEarlier(let refDate): + return ((date as NSDate).earlierDate(refDate.date) == date) + + case .isLater(let refDate): + return ((date as NSDate).laterDate(refDate.date) == date) + + case .isWeekday: + return !compare(.isWeekend) + + case .isWeekend: + let range = calendar.maximumRange(of: Calendar.Component.weekday)! + return (weekday == range.lowerBound || weekday == range.upperBound - range.lowerBound) + + case .isInDST: + return region.timeZone.isDaylightSavingTime(for: date) + + case .isMorning: + return (hour >= 5 && hour < 12) + + case .isAfternoon: + return (hour >= 12 && hour < 17) + + case .isEvening: + return (hour >= 17 && hour < 21) + + case .isNight: + return (hour >= 21 || hour < 5) + + } + } + + /// Returns a ComparisonResult value that indicates the ordering of two given dates based on + /// their components down to a given unit granularity. + /// + /// - parameter date: date to compare. + /// - parameter granularity: The smallest unit that must, along with all larger units + /// - returns: `ComparisonResult` + func compare(toDate refDate: DateInRegion, granularity: Calendar.Component) -> ComparisonResult { + switch granularity { + case .nanosecond: + // There is a possible rounding error using Calendar to compare two dates below the minute granularity + // So we've added this trick and use standard Date compare which return correct results in this case + // https://github.com/malcommac/SwiftDate/issues/346 + return date.compare(refDate.date) + default: + return region.calendar.compare(date, to: refDate.date, toGranularity: granularity) + } + } + + /// Compares whether the receiver is before/before equal `date` based on their components down to a given unit granularity. + /// + /// - Parameters: + /// - refDate: reference date + /// - orEqual: `true` to also check for equality + /// - granularity: smallest unit that must, along with all larger units, be less for the given dates + /// - Returns: Boolean + func isBeforeDate(_ date: DateInRegion, orEqual: Bool = false, granularity: Calendar.Component) -> Bool { + let result = compare(toDate: date, granularity: granularity) + return (orEqual ? (result == .orderedSame || result == .orderedAscending) : result == .orderedAscending) + } + + /// Compares whether the receiver is after `date` based on their components down to a given unit granularity. + /// + /// - Parameters: + /// - refDate: reference date + /// - orEqual: `true` to also check for equality + /// - granularity: Smallest unit that must, along with all larger units, be greater for the given dates. + /// - Returns: Boolean + func isAfterDate(_ refDate: DateInRegion, orEqual: Bool = false, granularity: Calendar.Component) -> Bool { + let result = compare(toDate: refDate, granularity: granularity) + return (orEqual ? (result == .orderedSame || result == .orderedDescending) : result == .orderedDescending) + } + + /// Compares equality of two given dates based on their components down to a given unit + /// granularity. + /// + /// - parameter date: date to compare + /// - parameter granularity: The smallest unit that must, along with all larger units, be equal for the given + /// dates to be considered the same. + /// + /// - returns: `true` if the dates are the same down to the given granularity, otherwise `false` + func isInside(date: DateInRegion, granularity: Calendar.Component) -> Bool { + return (compare(toDate: date, granularity: granularity) == .orderedSame) + } + + /// Return `true` if receiver data is contained in the range specified by two dates. + /// + /// - Parameters: + /// - startDate: range upper bound date + /// - endDate: range lower bound date + /// - orEqual: `true` to also check for equality on date and date2, default is `true` + /// - granularity: smallest unit that must, along with all larger units, be greater + /// - Returns: Boolean + func isInRange(date startDate: DateInRegion, and endDate: DateInRegion, orEqual: Bool = true, granularity: Calendar.Component = .nanosecond) -> Bool { + return isAfterDate(startDate, orEqual: orEqual, granularity: granularity) && isBeforeDate(endDate, orEqual: orEqual, granularity: granularity) + } + + // MARK: - Date Earlier/Later + + /// Return the earlier of two dates, between self and a given date. + /// + /// - Parameter date: The date to compare to self + /// - Returns: The date that is earlier + func earlierDate(_ date: DateInRegion) -> DateInRegion { + return self.date.timeIntervalSince(date.date) <= 0 ? self : date + } + + /// Return the later of two dates, between self and a given date. + /// + /// - Parameter date: The date to compare to self + /// - Returns: The date that is later + func laterDate(_ date: DateInRegion) -> DateInRegion { + return self.date.timeIntervalSince(date.date) >= 0 ? self : date + } + + /// Returns the difference in the calendar component given (like day, month or year) + /// with respect to the other date as a positive integer + func difference(in component: Calendar.Component, from other: DateInRegion) -> Int? { + return self.date.difference(in: component, from: other.date) + } + + /// Returns the differences in the calendar components given (like day, month and year) + /// with respect to the other date as dictionary with the calendar component as the key + /// and the diffrence as a positive integer as the value + func differences(in components: Set, from other: DateInRegion) -> [Calendar.Component: Int] { + return self.date.differences(in: components, from: other.date) + } + +} diff --git a/Sources/App/Libraries/SwiftDate/DateInRegion/DateInRegion+Components.swift b/Sources/App/Libraries/SwiftDate/DateInRegion/DateInRegion+Components.swift new file mode 100644 index 0000000..55e7ffc --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/DateInRegion/DateInRegion+Components.swift @@ -0,0 +1,164 @@ +// +// SwiftDate +// Parse, validate, manipulate, and display dates, time and timezones in Swift +// +// Created by Daniele Margutti +// - Web: https://www.danielemargutti.com +// - Twitter: https://twitter.com/danielemargutti +// - Mail: hello@danielemargutti.com +// +// Copyright © 2019 Daniele Margutti. Licensed under MIT License. +// + +import Foundation + +public extension DateInRegion { + + /// Indicates whether the month is a leap month. + var isLeapMonth: Bool { + let calendar = region.calendar + // Library function for leap contains a bug for Gregorian calendars, implemented workaround + if calendar.identifier == Calendar.Identifier.gregorian && year > 1582 { + guard let range: Range = calendar.range(of: .day, in: .month, for: date) else { + return false + } + return ((range.upperBound - range.lowerBound) == 29) + } + // For other calendars: + return calendar.dateComponents([.day, .month, .year], from: date).isLeapMonth! + } + + /// Indicates whether the year is a leap year. + var isLeapYear: Bool { + let calendar = region.calendar + // Library function for leap contains a bug for Gregorian calendars, implemented workaround + if calendar.identifier == Calendar.Identifier.gregorian { + var newComponents = dateComponents + newComponents.month = 2 + newComponents.day = 10 + let testDate = DateInRegion(components: newComponents, region: region) + return testDate!.isLeapMonth + } else if calendar.identifier == Calendar.Identifier.chinese { + /// There are 12 or 13 months in each year and 29 or 30 days in each month. + /// A 13-month year is a leap year, which meaning more than 376 days is a leap year. + return ( dateAtStartOf(.year).toUnit(.day, to: dateAtEndOf(.year)) > 375 ) + } + // For other calendars: + return calendar.dateComponents([.day, .month, .year], from: date).isLeapMonth! + } + + /// Julian day is the continuous count of days since the beginning of + /// the Julian Period used primarily by astronomers. + var julianDay: Double { + let destRegion = Region(calendar: Calendars.gregorian, zone: Zones.gmt, locale: Locales.english) + let utc = convertTo(region: destRegion) + + let year = Double(utc.year) + let month = Double(utc.month) + let day = Double(utc.day) + let hour = Double(utc.hour) + Double(utc.minute) / 60.0 + (Double(utc.second) + Double(utc.nanosecond) / 1e9) / 3600.0 + + var jd = 367.0 * year - floor( 7.0 * ( year + floor((month + 9.0) / 12.0)) / 4.0 ) + jd -= floor( 3.0 * (floor( (year + (month - 9.0) / 7.0) / 100.0 ) + 1.0) / 4.0 ) + jd += floor(275.0 * month / 9.0) + day + 1_721_028.5 + hour / 24.0 + + return jd + } + + /// The Modified Julian Date (MJD) was introduced by the Smithsonian Astrophysical Observatory + /// in 1957 to record the orbit of Sputnik via an IBM 704 (36-bit machine) + /// and using only 18 bits until August 7, 2576. + var modifiedJulianDay: Double { + return julianDay - 2_400_000.5 + } + + /// Return elapsed time expressed in given components since the current receiver and a reference date. + /// Time is evaluated with the fixed measumerent of each unity. + /// + /// - Parameters: + /// - refDate: reference date (`nil` to use current date in the same region of the receiver) + /// - component: time unit to extract. + /// - Returns: value + func getInterval(toDate: DateInRegion?, component: Calendar.Component) -> Int64 { + let refDate = (toDate ?? region.nowInThisRegion()) + switch component { + case .year: + let end = calendar.ordinality(of: .year, in: .era, for: refDate.date) + let start = calendar.ordinality(of: .year, in: .era, for: date) + return Int64(end! - start!) + + case .month: + let end = calendar.ordinality(of: .month, in: .era, for: refDate.date) + let start = calendar.ordinality(of: .month, in: .era, for: date) + return Int64(end! - start!) + + case .day: + let end = calendar.ordinality(of: .day, in: .era, for: refDate.date) + let start = calendar.ordinality(of: .day, in: .era, for: date) + return Int64(end! - start!) + + case .hour: + let interval = refDate.date.timeIntervalSince(date) + return Int64(interval / 1.hours.timeInterval) + + case .minute: + let interval = refDate.date.timeIntervalSince(date) + return Int64(interval / 1.minutes.timeInterval) + + case .second: + return Int64(refDate.date.timeIntervalSince(date)) + + case .weekday: + let end = calendar.ordinality(of: .weekday, in: .era, for: refDate.date) + let start = calendar.ordinality(of: .weekday, in: .era, for: date) + return Int64(end! - start!) + + case .weekdayOrdinal: + let end = calendar.ordinality(of: .weekdayOrdinal, in: .era, for: refDate.date) + let start = calendar.ordinality(of: .weekdayOrdinal, in: .era, for: date) + return Int64(end! - start!) + + case .weekOfYear: + let end = calendar.ordinality(of: .weekOfYear, in: .era, for: refDate.date) + let start = calendar.ordinality(of: .weekOfYear, in: .era, for: date) + return Int64(end! - start!) + + default: + debugPrint("Passed component cannot be used to extract values using interval() function between two dates. Returning 0.") + return 0 + } + } + + /// The interval between the receiver and the another parameter. + /// If the receiver is earlier than anotherDate, the return value is negative. + /// If anotherDate is nil, the results are undefined. + /// + /// - Parameter date: The date with which to compare the receiver. + /// - Returns: time interval between two dates + func timeIntervalSince(_ date: DateInRegion) -> TimeInterval { + return self.date.timeIntervalSince(date.date) + } + + /// Extract DateComponents from the difference between two dates. + /// + /// - Parameter rhs: date to compare + /// - Returns: components + func componentsTo(_ rhs: DateInRegion) -> DateComponents { + return calendar.dateComponents(DateComponents.allComponentsSet, from: rhs.date, to: date) + } + + /// Returns the difference between two dates (`date - self`) expressed as date components. + /// + /// - Parameters: + /// - date: reference date as initial date (left operand) + /// - components: components to extract, `nil` to use default `DateComponents.allComponentsSet` + /// - Returns: extracted date components + func componentsSince(_ date: DateInRegion, components: [Calendar.Component]? = nil) -> DateComponents { + if date.calendar != calendar { + debugPrint("Date has different calendar, results maybe wrong") + } + let cmps = (components != nil ? Calendar.Component.toSet(components!) : DateComponents.allComponentsSet) + return date.calendar.dateComponents(cmps, from: date.date, to: self.date) + } + +} diff --git a/Sources/App/Libraries/SwiftDate/DateInRegion/DateInRegion+Create.swift b/Sources/App/Libraries/SwiftDate/DateInRegion/DateInRegion+Create.swift new file mode 100644 index 0000000..6951f5e --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/DateInRegion/DateInRegion+Create.swift @@ -0,0 +1,650 @@ +// +// SwiftDate +// Parse, validate, manipulate, and display dates, time and timezones in Swift +// +// Created by Daniele Margutti +// - Web: https://www.danielemargutti.com +// - Twitter: https://twitter.com/danielemargutti +// - Mail: hello@danielemargutti.com +// +// Copyright © 2019 Daniele Margutti. Licensed under MIT License. +// + +import Foundation + +public extension DateInRegion { + + // MARK: - Random Date Generator + + /// Generate a sequence of dates between a range. + /// + /// - Parameters: + /// - count: number of dates to generate. + /// - initial: lower date bound. + /// - final: upper date bound. + /// - region: region of the dates. + /// - Returns: array of dates + static func randomDates(count: Int, between initial: DateInRegion, and final: DateInRegion, + region: Region = SwiftDate.defaultRegion) -> [DateInRegion] { + var list: [DateInRegion] = [] + for _ in 0.. DateInRegion { + let today = DateInRegion(region: region) + let earliest = DateInRegion(today.date.addingTimeInterval(TimeInterval(-days * 24 * 60 * 60)), region: region) + return DateInRegion.randomDate(between: earliest, and: today) + } + + /// Generate a random date in given region. + /// + /// - Parameter region: destination region, `nil` to use the default region + /// - Returns: random date + static func randomDate(region: Region = SwiftDate.defaultRegion) -> DateInRegion { + let randomTime = TimeInterval(UInt32.random(in: UInt32.min.. DateInRegion { + let interval = final.timeIntervalSince(initial) + let randomInterval = TimeInterval(UInt32.random(in: UInt32.min.. DateInRegion? { + guard list.count > 0 else { return nil } + guard list.count > 1 else { return list.first! } + return list.min(by: { + return $0 < $1 + }) + } + + /// Sort date by oldest, with the oldest date on top. + /// + /// - Parameter list: list to sort + /// - Returns: sorted array + static func sortedByOldest(list: [DateInRegion]) -> [DateInRegion] { + return list.sorted(by: { $0.date.compare($1.date) == .orderedAscending }) + } + + /// Sort date by newest, with the newest date on top. + /// + /// - Parameter list: list to sort + /// - Returns: sorted array + static func sortedByNewest(list: [DateInRegion]) -> [DateInRegion] { + return list.sorted(by: { $0.date.compare($1.date) == .orderedDescending }) + } + + /// Return the newest date in given list (timezone is ignored, comparison uses absolute date). + /// + /// - Parameter list: list of dates + /// - Returns: a tuple with the index of the newest date and its instance. + static func newestIn(list: [DateInRegion]) -> DateInRegion? { + guard list.count > 0 else { return nil } + guard list.count > 1 else { return list.first! } + return list.max(by: { + return $0 < $1 + }) + } + + /// Enumerate dates between two intervals by adding specified time components and return an array of dates. + /// `startDate` interval will be the first item of the resulting array. + /// The last item of the array is evaluated automatically and maybe not equal to `endDate`. + /// + /// - Parameters: + /// - start: starting date + /// - endDate: ending date + /// - increment: components to add + /// - Returns: array of dates + static func enumerateDates(from startDate: DateInRegion, to endDate: DateInRegion, increment: DateComponents) -> [DateInRegion] { + return DateInRegion.enumerateDates(from: startDate, to: endDate, increment: { _ in + return increment + }) + } + + /// Enumerate dates between two intervals by adding specified time components defined in a closure and return an array of dates. + /// `startDate` interval will be the first item of the resulting array. + /// The last item of the array is evaluated automatically and maybe not equal to `endDate`. + /// + /// - Parameters: + /// - start: starting date + /// - endDate: ending date + /// - increment: increment function. It get the last generated date and require a valida `DateComponents` instance which define the increment + /// - Returns: array of dates + static func enumerateDates(from startDate: DateInRegion, to endDate: DateInRegion, increment: ((DateInRegion) -> (DateComponents))) -> [DateInRegion] { + guard startDate.calendar == endDate.calendar else { + debugPrint("Cannot enumerate dates between two different region's calendars. Return empty array.") + return [] + } + + var dates: [DateInRegion] = [] + var currentDate = startDate + while currentDate <= endDate { + dates.append(currentDate) + currentDate = (currentDate + increment(currentDate)) + } + return dates + } + + /// Returns a new DateInRegion that is initialized at the start of a specified unit of time. + /// + /// - Parameter unit: time unit value. + /// - Returns: instance at the beginning of the time unit; `self` if fails. + func dateAtStartOf(_ unit: Calendar.Component) -> DateInRegion { + #if os(Linux) + guard let result = (region.calendar as NSCalendar).range(of: unit.nsCalendarUnit, for: date) else { + return self + } + return DateInRegion(result.start, region: region) + #else + var start: NSDate? + var interval: TimeInterval = 0 + guard (region.calendar as NSCalendar).range(of: unit.nsCalendarUnit, start: &start, interval: &interval, for: date), + let startDate = start else { + return self + } + return DateInRegion(startDate as Date, region: region) + #endif + } + + /// Return a new DateInRegion that is initialized at the start of the specified components + /// executed in order. + /// + /// - Parameter units: sequence of transformations as time unit components + /// - Returns: new date at the beginning of the passed components, intermediate results if fails. + func dateAtStartOf(_ units: [Calendar.Component]) -> DateInRegion { + return units.reduce(self) { (currentDate, currentUnit) -> DateInRegion in + return currentDate.dateAtStartOf(currentUnit) + } + } + + /// Returns a new Moment that is initialized at the end of a specified unit of time. + /// + /// - parameter unit: time unit value. + /// + /// - returns: A new Moment instance. + func dateAtEndOf(_ unit: Calendar.Component) -> DateInRegion { + // RangeOfUnit returns the start of the next unit; we will subtract one thousandth of a second + #if os(Linux) + guard let result = (region.calendar as NSCalendar).range(of: unit.nsCalendarUnit, for: date) else { + return self + } + let startOfNextUnit = result.start.addingTimeInterval(result.duration) + let endOfThisUnit = Date(timeInterval: -0.001, since: startOfNextUnit) + return DateInRegion(endOfThisUnit, region: region) + #else + var start: NSDate? + var interval: TimeInterval = 0 + guard (self.region.calendar as NSCalendar).range(of: unit.nsCalendarUnit, start: &start, interval: &interval, for: date), + let startDate = start else { + return self + } + let startOfNextUnit = startDate.addingTimeInterval(interval) + let endOfThisUnit = Date(timeInterval: -0.001, since: startOfNextUnit as Date) + return DateInRegion(endOfThisUnit, region: region) + #endif + } + + /// Return a new DateInRegion that is initialized at the end of the specified components + /// executed in order. + /// + /// - Parameter units: sequence of transformations as time unit components + /// - Returns: new date at the end of the passed components, intermediate results if fails. + func dateAtEndOf(_ units: [Calendar.Component]) -> DateInRegion { + return units.reduce(self) { (currentDate, currentUnit) -> DateInRegion in + return currentDate.dateAtEndOf(currentUnit) + } + } + + /// Create a new date by altering specified components of the receiver. + /// Note: `calendar` and `timezone` are ignored. + /// Note: some components may alter the date cyclically (like setting both `.year` and `.yearForWeekOfYear`) and + /// may results in a wrong evaluated date. + /// + /// - Parameter components: components to alter with their new values. + /// - Returns: new altered `DateInRegion` instance + func dateBySet(_ components: [Calendar.Component: Int?]) -> DateInRegion? { + var dateComponents = DateComponents() + dateComponents.year = (components[.year] ?? year) + dateComponents.month = (components[.month] ?? month) + dateComponents.day = (components[.day] ?? day) + dateComponents.hour = (components[.hour] ?? hour) + dateComponents.minute = (components[.minute] ?? minute) + dateComponents.second = (components[.second] ?? second) + dateComponents.nanosecond = (components[.nanosecond] ?? nanosecond) + + // Some components may interfer with others, so we'll set it them only if explicitly set. + if let weekday = components[.weekday] { + dateComponents.weekday = weekday + } + if let weekOfYear = components[.weekOfYear] { + dateComponents.weekOfYear = weekOfYear + } + if let weekdayOrdinal = components[.weekdayOrdinal] { + dateComponents.weekdayOrdinal = weekdayOrdinal + } + if let yearForWeekOfYear = components[.yearForWeekOfYear] { + dateComponents.yearForWeekOfYear = yearForWeekOfYear + } + + guard let newDate = calendar.date(from: dateComponents) else { return nil } + return DateInRegion(newDate, region: region) + } + + /// Create a new date by altering specified time components. + /// + /// - Parameters: + /// - hour: hour to set (`nil` to leave it unaltered) + /// - min: min to set (`nil` to leave it unaltered) + /// - secs: sec to set (`nil` to leave it unaltered) + /// - ms: milliseconds to set (`nil` to leave it unaltered) + /// - options: options for calculation + /// - Returns: new altered `DateInRegion` instance + func dateBySet(hour: Int?, min: Int?, secs: Int?, ms: Int? = nil, options: TimeCalculationOptions = TimeCalculationOptions()) -> DateInRegion? { + guard let date = calendar.date(bySettingHour: (hour ?? self.hour), + minute: (min ?? self.minute), + second: (secs ?? self.second), + of: self.date, + matchingPolicy: options.matchingPolicy, + repeatedTimePolicy: options.repeatedTimePolicy, + direction: options.direction) else { return nil } + guard let ms = ms else { + return DateInRegion(date, region: region) + } + var timestamp = date.timeIntervalSince1970.rounded(.down) + timestamp += Double(ms) / 1000.0 + return DateInRegion(Date(timeIntervalSince1970: timestamp), region: region) + } + + /// Creates a new instance by truncating the components + /// + /// - Parameter components: components to truncate. + /// - Returns: new date with truncated components. + func dateTruncated(at components: [Calendar.Component]) -> DateInRegion? { + var dateComponents = self.dateComponents + + for component in components { + switch component { + case .month: dateComponents.month = 1 + case .day: dateComponents.day = 1 + case .hour: dateComponents.hour = 0 + case .minute: dateComponents.minute = 0 + case .second: dateComponents.second = 0 + case .nanosecond: dateComponents.nanosecond = 0 + default: continue + } + } + + guard let newDate = calendar.date(from: dateComponents) else { return nil } + return DateInRegion(newDate, region: region) + } + + /// Creates a new instance by truncating the components starting from given components down the granurality. + /// + /// - Parameter component: The component to be truncated from. + /// - Returns: new date with truncated components. + func dateTruncated(from component: Calendar.Component) -> DateInRegion? { + switch component { + case .month: return dateTruncated(at: [.month, .day, .hour, .minute, .second, .nanosecond]) + case .day: return dateTruncated(at: [.day, .hour, .minute, .second, .nanosecond]) + case .hour: return dateTruncated(at: [.hour, .minute, .second, .nanosecond]) + case .minute: return dateTruncated(at: [.minute, .second, .nanosecond]) + case .second: return dateTruncated(at: [.second, .nanosecond]) + case .nanosecond: return dateTruncated(at: [.nanosecond]) + default: return self + } + } + + /// Round a given date time to the passed style (off|up|down). + /// + /// - Parameter style: rounding mode. + /// - Returns: rounded date + func dateRoundedAt(_ style: RoundDateMode) -> DateInRegion { + switch style { + case .to5Mins: return dateRoundedAt(.toMins(5)) + case .to10Mins: return dateRoundedAt(.toMins(10)) + case .to30Mins: return dateRoundedAt(.toMins(30)) + case .toCeil5Mins: return dateRoundedAt(.toCeilMins(5)) + case .toCeil10Mins: return dateRoundedAt(.toCeilMins(10)) + case .toCeil30Mins: return dateRoundedAt(.toCeilMins(30)) + case .toFloor5Mins: return dateRoundedAt(.toFloorMins(5)) + case .toFloor10Mins: return dateRoundedAt(.toFloorMins(10)) + case .toFloor30Mins: return dateRoundedAt(.toFloorMins(30)) + + case .toMins(let minuteInterval): + let onesDigit: Int = (minute % 10) + if onesDigit < 5 { + return dateRoundedAt(.toFloorMins(minuteInterval)) + } else { + return dateRoundedAt(.toCeilMins(minuteInterval)) + } + + case .toCeilMins(let minuteInterval): + let remain: Int = (minute % minuteInterval) + let value = (( Int(1.minutes.timeInterval) * (minuteInterval - remain)) - second) + return dateByAdding(value, .second) + + case .toFloorMins(let minuteInterval): + let remain: Int = (minute % minuteInterval) + let value = -((Int(1.minutes.timeInterval) * remain) + second) + return dateByAdding(value, .second) + + } + } + + /// Offset a date by n calendar components. + /// Note: This operation can be functionally chained. + /// + /// - Parameters: + /// - count: value of the offset (maybe negative). + /// - component: component to offset. + /// - Returns: new altered date. + func dateByAdding(_ count: Int, _ component: Calendar.Component) -> DateInRegion { + var newComponent = DateComponents(second: 0) + switch component { + case .era: newComponent = DateComponents(era: count) + case .year: newComponent = DateComponents(year: count) + case .month: newComponent = DateComponents(month: count) + case .day: newComponent = DateComponents(day: count) + case .hour: newComponent = DateComponents(hour: count) + case .minute: newComponent = DateComponents(minute: count) + case .second: newComponent = DateComponents(second: count) + case .weekday: newComponent = DateComponents(weekday: count) + case .weekdayOrdinal: newComponent = DateComponents(weekdayOrdinal: count) + case .quarter: newComponent = DateComponents(quarter: count) + case .weekOfMonth: newComponent = DateComponents(weekOfMonth: count) + case .weekOfYear: newComponent = DateComponents(weekOfYear: count) + case .yearForWeekOfYear: newComponent = DateComponents(yearForWeekOfYear: count) + case .nanosecond: newComponent = DateComponents(nanosecond: count) + default: break // .calendar and .timezone does nothing in this context + } + + guard let newDate = region.calendar.date(byAdding: newComponent, to: date) else { + return self // failed to add component, return unmodified date + } + return DateInRegion(newDate, region: region) + } + + /// Return related date starting from the receiver attributes. + /// + /// - Parameter type: related date to obtain. + /// - Returns: instance of the related date; if fails the same unmodified date is returned + func dateAt(_ type: DateRelatedType) -> DateInRegion { + switch type { + case .startOfDay: + return calendar.startOfDay(for: date).in(region: region) + case .endOfDay: + return dateByAdding(1, .day).dateAt(.startOfDay).dateByAdding(-1, .second) + case .startOfWeek: + let components = calendar.dateComponents([.yearForWeekOfYear, .weekOfYear], from: date) + return calendar.date(from: components)!.in(region: region) + case .endOfWeek: + return dateAt(.startOfWeek).dateByAdding(7, .day).dateByAdding(-1, .second) + case .startOfMonth: + return dateBySet([.day: 1, .hour: 1, .minute: 1, .second: 1, .nanosecond: 1])! + case .endOfMonth: + return dateByAdding((monthDays - day), .day).dateAtEndOf(.day) + case .tomorrow: + return dateByAdding(1, .day) + case .tomorrowAtStart: + return dateByAdding(1, .day).dateAtStartOf(.day) + case .yesterday: + return dateByAdding(-1, .day) + case .yesterdayAtStart: + return dateByAdding(-1, .day).dateAtStartOf(.day) + case .nearestMinute(let nearest): + let minutes = (minute + nearest / 2) / nearest * nearest + return dateBySet([.minute: minutes])! + case .nearestHour(let nearest): + let hours = (hour + nearest / 2) / nearest * nearest + return dateBySet([.hour: hours, .minute: 0])! + case .nextWeekday(let weekday): + var cal = Calendar(identifier: calendar.identifier) + cal.firstWeekday = 2 // Sunday = 1, Saturday = 7 + var components = DateComponents() + components.weekday = weekday.rawValue + guard let next = cal.nextDate(after: date, matching: components, matchingPolicy: .nextTimePreservingSmallerComponents) else { + return self + } + return DateInRegion(next, region: region) + case .nextDSTDate: + guard let nextDate = region.timeZone.nextDaylightSavingTimeTransition(after: date) else { + return self + } + return DateInRegion(nextDate, region: region) + case .prevMonth: + return dateByAdding(-1, .month).dateAtStartOf(.month).dateAtStartOf(.day) + case .nextMonth: + return dateByAdding(1, .month).dateAtStartOf(.month).dateAtStartOf(.day) + case .prevWeek: + return dateByAdding(-1, .weekOfYear).dateAtStartOf(.weekOfYear).dateAtStartOf(.day) + case .nextWeek: + return dateByAdding(1, .weekOfYear).dateAtStartOf(.weekOfYear).dateAtStartOf(.day) + case .nextYear: + return dateByAdding(1, .year).dateAtStartOf(.year) + case .prevYear: + return dateByAdding(-1, .year).dateAtStartOf(.year) + case .nextDSTTransition: + guard let transitionDate = region.timeZone.nextDaylightSavingTimeTransition(after: date) else { + return self + } + return DateInRegion(transitionDate, region: region) + } + } + + /// Create a new instance of the date in the same region with time shifted by given time interval. + /// + /// - Parameter interval: time interval to shift; maybe negative. + /// - Returns: new instance of the `DateInRegion` + func addingTimeInterval(_ interval: TimeInterval) -> DateInRegion { + return DateInRegion(date.addingTimeInterval(interval), region: region) + } + + // MARK: - Conversion + + /// Convert a date to a new calendar/timezone/locale. + /// Only non `nil` values are used, other values are inherithed by the receiver's region. + /// + /// - Parameters: + /// - calendar: non `nil` value to change the calendar + /// - timezone: non `nil` value to change the timezone + /// - locale: non `nil` value to change the locale + /// - Returns: converted date + func convertTo(calendar: CalendarConvertible? = nil, timezone: ZoneConvertible? = nil, locale: LocaleConvertible? = nil) -> DateInRegion { + let newRegion = Region(calendar: (calendar ?? region.calendar), + zone: (timezone ?? region.timeZone), + locale: (locale ?? region.locale)) + return convertTo(region: newRegion) + } + + /// Return the dates for a specific weekday inside given month of specified year. + /// Ie. get me all the saturdays of Feb 2018. + /// NOTE: Values are returned in order. + /// + /// - Parameters: + /// - weekday: weekday target. + /// - month: month target. + /// - year: year target. + /// - region: region target, omit to use `SwiftDate.defaultRegion` + /// - Returns: Ordered list of the dates for given weekday into given month. + static func datesForWeekday(_ weekday: WeekDay, inMonth month: Int, ofYear year: Int, + region: Region = SwiftDate.defaultRegion) -> [DateInRegion] { + let fromDate = DateInRegion(year: year, month: month, day: 1, hour: 0, minute: 0, second: 0, nanosecond: 0, region: region) + let toDate = fromDate.dateAt(.endOfMonth) + return DateInRegion.datesForWeekday(weekday, from: fromDate, to: toDate, region: region) + } + + /// Return the dates for a specific weekday inside a specified date range. + /// NOTE: Values are returned in order. + /// + /// - Parameters: + /// - weekday: weekday target. + /// - startDate: from date of the range. + /// - endDate: to date of the range. + /// - region: region target, omit to use `SwiftDate.defaultRegion` + /// - Returns: Ordered list of the dates for given weekday in passed range. + static func datesForWeekday(_ weekday: WeekDay, from startDate: DateInRegion, to endDate: DateInRegion, + region: Region = SwiftDate.defaultRegion) -> [DateInRegion] { + + let calendarObj = region.calendar + let startDateWeekDay = Int(calendarObj.component(.weekday, from: startDate.date)) + let desiredDay = weekday.rawValue + + let offset = (desiredDay - startDateWeekDay + 7) % 7 + let firstOccurrence = calendarObj.startOfDay(for: calendarObj.date(byAdding: DateComponents(day: offset), to: startDate.date)!) + guard firstOccurrence.timeIntervalSince1970 < endDate.timeIntervalSince1970 else { + return [] + } + var dateOccurrences = [DateInRegion(firstOccurrence, region: region)] + while true { + let nextDate = DateInRegion(calendarObj.date(byAdding: DateComponents(day: 7), to: dateOccurrences.last!.date)!, + region: region) + guard nextDate < endDate else { + break + } + dateOccurrences.append(nextDate) + } + return dateOccurrences + } + +} + +public extension DateInRegion { + + /// Returns the date at the given week number and week day preserving smaller components (hour, minute, seconds) + /// + /// For example: to get the third friday of next month + /// let today = DateInRegion() + /// let result = today.dateAt(weekdayOrdinal: 3, weekday: .friday, monthNumber: today.month + 1) + /// + /// - Parameters: + /// - weekdayOrdinal: the week number (by set position in a recurrence rule) + /// - weekday: WeekDay + /// - monthNumber: a number from 1 to 12 representing the month, optional parameter + /// - yearNumber: a number representing the year, optional parameter + /// - Returns: new date created with the given parameters + func dateAt(weekdayOrdinal: Int, weekday: WeekDay, monthNumber: Int? = nil, + yearNumber: Int? = nil) -> DateInRegion { + let monthNum = monthNumber ?? month + let yearNum = yearNumber ?? year + + var requiredWeekNum = weekdayOrdinal + var result = DateInRegion(year: yearNum, month: monthNum, day: 1, hour: hour, + minute: minute, second: second, nanosecond: nanosecond, region: region) + + if result.weekday == weekday.rawValue { + requiredWeekNum -= 1 + } + + while requiredWeekNum > 0 { + result = result.nextWeekday(weekday) + requiredWeekNum -= 1 + } + + return result + } + + /// Returns the date on the given day of month preserving smaller components + func dateAt(dayOfMonth: Int, monthNumber: Int? = nil, + yearNumber: Int? = nil) -> DateInRegion { + let monthNum = monthNumber ?? month + let yearNum = yearNumber ?? year + + let result = DateInRegion(year: yearNum, month: monthNum, day: dayOfMonth, + hour: hour, minute: minute, second: second, + nanosecond: nanosecond, region: region) + + return result + } + + /// Returns the date after given number of weeks on the given day of week + func dateAfter(weeks count: Int, on weekday: WeekDay) -> DateInRegion { + var result = self.dateByAdding(count, .weekOfMonth) + if result.weekday == weekday.rawValue { + return result + } else if result.weekday > weekday.rawValue { + result = result.dateByAdding(-1, .weekOfMonth) + } + return result.nextWeekday(weekday) + } + + /// Returns the next weekday preserving smaller components + /// + /// - Parameters: + /// - weekday: weekday to get. + /// - region: region target, omit to use `SwiftDate.defaultRegion` + /// - Returns: `DateInRegion` + func nextWeekday(_ weekday: WeekDay) -> DateInRegion { + var components = DateComponents() + components.weekday = weekday.rawValue + components.hour = hour + components.second = second + components.minute = minute + + guard let next = region.calendar.nextDate(after: date, matching: components, + matchingPolicy: .nextTimePreservingSmallerComponents) else { + return self + } + + return DateInRegion(next, region: region) + } + + /// Returns next date with the given weekday and the given week number + func next(_ weekday: WeekDay, withWeekOfMonth weekNumber: Int, + andMonthNumber monthNumber: Int? = nil) -> DateInRegion { + var result = self.dateAt(weekdayOrdinal: weekNumber, weekday: weekday, monthNumber: monthNumber) + + if result <= self { + + if let monthNum = monthNumber { + result = self.dateAt(weekdayOrdinal: weekNumber, weekday: weekday, + monthNumber: monthNum, yearNumber: self.year + 1) + } else { + result = self.dateAt(weekdayOrdinal: weekNumber, weekday: weekday, monthNumber: self.month + 1) + } + + } + + return result + } + + /// Returns the next day of month preserving smaller components (hour, minute, seconds) + func next(dayOfMonth: Int, monthOfYear: Int? = nil) -> DateInRegion { + var components = DateComponents() + components.day = dayOfMonth + components.month = monthOfYear + components.hour = hour + components.second = second + components.minute = minute + + guard let next = region.calendar.nextDate(after: date, matching: components, + matchingPolicy: .nextTimePreservingSmallerComponents) else { + return self + } + + return DateInRegion(next, region: region) + } +} diff --git a/Sources/App/Libraries/SwiftDate/DateInRegion/DateInRegion+Math.swift b/Sources/App/Libraries/SwiftDate/DateInRegion/DateInRegion+Math.swift new file mode 100644 index 0000000..a9e6ff5 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/DateInRegion/DateInRegion+Math.swift @@ -0,0 +1,82 @@ +// +// SwiftDate +// Parse, validate, manipulate, and display dates, time and timezones in Swift +// +// Created by Daniele Margutti +// - Web: https://www.danielemargutti.com +// - Twitter: https://twitter.com/danielemargutti +// - Mail: hello@danielemargutti.com +// +// Copyright © 2019 Daniele Margutti. Licensed under MIT License. +// + +import Foundation + +// MARK: - Math Operation DateInRegion - DateInRegion + +public func - (lhs: DateInRegion, rhs: DateInRegion) -> TimeInterval { + return lhs.timeIntervalSince(rhs) +} + +// MARK: - Math Operation DateInRegion - Date Components + +public func + (lhs: DateInRegion, rhs: DateComponents) -> DateInRegion { + let nextDate = lhs.calendar.date(byAdding: rhs, to: lhs.date) + return DateInRegion(nextDate!, region: lhs.region) +} + +public func - (lhs: DateInRegion, rhs: DateComponents) -> DateInRegion { + return lhs + (-rhs) +} + +// MARK: - Math Operation DateInRegion - Calendar.Component + +public func + (lhs: DateInRegion, rhs: [Calendar.Component: Int]) -> DateInRegion { + let cmps = DateInRegion.componentsFrom(values: rhs) + return lhs + cmps +} + +public func - (lhs: DateInRegion, rhs: [Calendar.Component: Int]) -> DateInRegion { + var invertedCmps: [Calendar.Component: Int] = [:] + rhs.forEach { invertedCmps[$0.key] = -$0.value } + return lhs + invertedCmps +} + +// MARK: - Internal DateInRegion Extension + +extension DateInRegion { + + /// Return a `DateComponent` object from a given set of `Calendar.Component` object with associated values and a specific region + /// + /// - parameter values: calendar components to set (with their values) + /// - parameter multipler: optional multipler (by default is nil; to make an inverse component value it should be multipled by -1) + /// - parameter region: optional region to set + /// + /// - returns: a `DateComponents` object + internal static func componentsFrom(values: [Calendar.Component: Int], multipler: Int? = nil, setRegion region: Region? = nil) -> DateComponents { + var cmps = DateComponents() + if region != nil { + cmps.calendar = region!.calendar + cmps.calendar!.locale = region!.locale + cmps.timeZone = region!.timeZone + } + values.forEach { pair in + if pair.key != .timeZone && pair.key != .calendar { + cmps.setValue( (multipler == nil ? pair.value : pair.value * multipler!), for: pair.key) + } + } + return cmps + } + + /// Adds a time interval to this date. + /// WARNING: + /// This only adjusts an absolute value. If you wish to add calendrical concepts like hours, + /// days, months then you must use a Calendar. + /// That will take into account complexities like daylight saving time, + /// months with different numbers of days, and more. + /// + /// - Parameter timeInterval: The value to add, in seconds. + public mutating func addTimeInterval(_ timeInterval: TimeInterval) { + date.addTimeInterval(timeInterval) + } +} diff --git a/Sources/App/Libraries/SwiftDate/DateInRegion/DateInRegion.swift b/Sources/App/Libraries/SwiftDate/DateInRegion/DateInRegion.swift new file mode 100644 index 0000000..98133f7 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/DateInRegion/DateInRegion.swift @@ -0,0 +1,185 @@ +// +// SwiftDate +// Parse, validate, manipulate, and display dates, time and timezones in Swift +// +// Created by Daniele Margutti +// - Web: https://www.danielemargutti.com +// - Twitter: https://twitter.com/danielemargutti +// - Mail: hello@danielemargutti.com +// +// Copyright © 2019 Daniele Margutti. Licensed under MIT License. +// + +import Foundation + +public struct DateInRegion: DateRepresentable, Decodable, Encodable, CustomStringConvertible, Comparable, Hashable { + + /// Absolute date represented. This date is not associated with any timezone or calendar + /// but represent the absolute number of seconds since Jan 1, 2001 at 00:00:00 UTC. + public internal(set) var date: Date + + /// Associated region which define where the date is represented into the world. + public let region: Region + + /// Formatter used to transform this object in a string. By default is `nil` because SwiftDate + /// uses the thread shared formatter in order to avoid expensive init of the `DateFormatter` object. + /// However, if you need of a custom behaviour you can set a valid value. + public var customFormatter: DateFormatter? + + /// Extract date components by taking care of the region in which the date is expressed. + public var dateComponents: DateComponents { + return region.calendar.dateComponents(DateComponents.allComponentsSet, from: date) + } + + /// Description of the date + public var description: String { + let absISODate = DateFormatter.sharedFormatter(forRegion: Region.UTC).string(from: date) + let representedDate = formatter(format: DateFormats.iso8601).string(from: date) + return "{abs_date='\(absISODate)', rep_date='\(representedDate)', region=\(region.description)" + } + + /// The interval between the date value and 00:00:00 UTC on 1 January 1970. + public var timeIntervalSince1970: TimeInterval { + return date.timeIntervalSince1970 + } + + /// Initialize with an absolute date and represent it into given geographic region. + /// + /// - Parameters: + /// - date: absolute date to represent. + /// - region: region in which the date is represented. If ignored `defaultRegion` is used instead. + public init(_ date: Date = Date(), region: Region = SwiftDate.defaultRegion) { + self.date = date + self.region = region + } + + /// Initialize a new `DateInRegion` by parsing given string. + /// If you know the format of the string you should pass it in order to speed up the parsing process. + /// If you don't know the format leave it `nil` and parse is done between all formats in `DateFormats.builtInAutoFormats` + /// and the ordered list you can provide in `SwiftDate.autoParseFormats` (with attempt priority set on your list). + /// + /// - Parameters: + /// - string: string with the date. + /// - format: format of the date. + /// - region: region in which the date is expressed. + public init?(_ string: String, format: String? = nil, region: Region = SwiftDate.defaultRegion) { + guard let date = DateFormats.parse(string: string, + format: format, + region: region) else { + return nil // failed to parse date + } + self.date = date + self.region = region + } + + /// Initialize a new `DateInRegion` by parsing given string with the ordered list of passed formats. + /// If you know the format of the string you should pass it in order to speed up the parsing process. + /// If you don't know the format leave it `nil` and parse is done between all formats in `DateFormats.builtInAutoFormats` + /// and the ordered list you can provide in `SwiftDate.autoParseFormats` (with attempt priority set on your list). + /// + /// - Parameters: + /// - string: string with the date. + /// - formats: ordered list of formats to use. + /// - region: region in which the date is expressed. + public init?(_ string: String, formats: [String]?, region: Region = SwiftDate.defaultRegion) { + guard let date = DateFormats.parse(string: string, + formats: (formats ?? SwiftDate.autoFormats), + region: region) else { + return nil // failed to parse date + } + self.date = date + self.region = region + } + + /// Initialize a new date from the number of seconds passed since Unix Epoch. + /// + /// - Parameters: + /// - interval: seconds since Unix Epoch. + /// - region: the region in which the date must be expressed, `nil` uses the default region at UTC timezone + public init(seconds interval: TimeInterval, region: Region = Region.UTC) { + self.date = Date(timeIntervalSince1970: interval) + self.region = region + } + + /// Initialize a new date corresponding to the number of milliseconds since the Unix Epoch. + /// + /// - Parameters: + /// - interval: seconds since the Unix Epoch timestamp. + /// - region: region in which the date must be expressed, `nil` uses the default region at UTC timezone + public init(milliseconds interval: Int, region: Region = Region.UTC) { + self.date = Date(timeIntervalSince1970: TimeInterval(interval) / 1000) + self.region = region + } + + /// Initialize a new date with the opportunity to configure single date components via builder pattern. + /// Date is therfore expressed in passed region (`DateComponents`'s `timezone`,`calendar` and `locale` are ignored + /// and overwritten by the region if not `nil`). + /// + /// - Parameters: + /// - configuration: configuration callback + /// - region: region in which the date is expressed. + /// Ignore to use `SwiftDate.defaultRegion`, `nil` to use `DateComponents` data. + public init?(components configuration: ((inout DateComponents) -> Void), region: Region? = SwiftDate.defaultRegion) { + var components = DateComponents() + configuration(&components) + let r = (region ?? Region(fromDateComponents: components)) + guard let date = r.calendar.date(from: components) else { + return nil + } + self.date = date + self.region = r + } + + /// Initialize a new date with given components. + /// + /// - Parameters: + /// - components: components of the date. + /// - region: region in which the date is expressed. + /// Ignore to use `SwiftDate.defaultRegion`, `nil` to use `DateComponents` data. + public init?(components: DateComponents, region: Region?) { + let r = (region ?? Region(fromDateComponents: components)) + guard let date = r.calendar.date(from: components) else { + return nil + } + self.date = date + self.region = r + } + + /// Initialize a new date with given components. + public init(year: Int, month: Int, day: Int, hour: Int = 0, minute: Int = 0, second: Int = 0, nanosecond: Int = 0, region: Region = SwiftDate.defaultRegion) { + var components = DateComponents() + components.year = year + components.month = month + components.day = day + components.hour = hour + components.minute = minute + components.second = second + components.nanosecond = nanosecond + components.timeZone = region.timeZone + components.calendar = region.calendar + self.date = region.calendar.date(from: components)! + self.region = region + } + + /// Return a date in the distant past. + /// + /// - Returns: Date instance. + public static func past() -> DateInRegion { + return DateInRegion(Date.distantPast, region: SwiftDate.defaultRegion) + } + + /// Return a date in the distant future. + /// + /// - Returns: Date instance. + public static func future() -> DateInRegion { + return DateInRegion(Date.distantFuture, region: SwiftDate.defaultRegion) + } + + // MARK: - Codable Support + + enum CodingKeys: String, CodingKey { + case date + case region + } + +} diff --git a/Sources/App/Libraries/SwiftDate/DateInRegion/Region.swift b/Sources/App/Libraries/SwiftDate/DateInRegion/Region.swift new file mode 100644 index 0000000..8818a95 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/DateInRegion/Region.swift @@ -0,0 +1,155 @@ +// +// SwiftDate +// Parse, validate, manipulate, and display dates, time and timezones in Swift +// +// Created by Daniele Margutti +// - Web: https://www.danielemargutti.com +// - Twitter: https://twitter.com/danielemargutti +// - Mail: hello@danielemargutti.com +// +// Copyright © 2019 Daniele Margutti. Licensed under MIT License. +// + +import Foundation + +/// Region define a context both for `Date` and `DateInRegion`. +/// Each `Date` is assigned to the currently set `SwiftDate.default +public struct Region: Decodable, Encodable, Equatable, Hashable, CustomStringConvertible { + + // MARK: - Properties + + /// Calendar associated with region + public let calendar: Calendar + + /// Locale associated with region + public var locale: Locale { return calendar.locale! } + + /// Timezone associated with region + public var timeZone: TimeZone { return calendar.timeZone } + + /// Description of the object + public var description: String { + return "{calendar='\(calendar.identifier)', timezone='\(timeZone.identifier)', locale='\(locale.identifier)'}" + } + + public func hash(into hasher: inout Hasher) { + hasher.combine(calendar) + } + + // MARK: Initialization + + /// Initialize a new region with given parameters. + /// + /// - Parameters: + /// - calendar: calendar for region, if not specified `defaultRegions`'s calendar is used instead. + /// - timezone: timezone for region, if not specified `defaultRegions`'s timezone is used instead. + /// - locale: locale for region, if not specified `defaultRegions`'s locale is used instead. + public init(calendar: CalendarConvertible = SwiftDate.defaultRegion.calendar, + zone: ZoneConvertible = SwiftDate.defaultRegion.timeZone, + locale: LocaleConvertible = SwiftDate.defaultRegion.locale) { + self.calendar = Calendar.newCalendar(calendar, configure: { + $0.timeZone = zone.toTimezone() + $0.locale = locale.toLocale() + }) + } + + /// Initialize a new Region by reading the `timeZone`,`calendar` and `locale` + /// parameters from the passed `DateComponents` instance. + /// For any `nil` parameter the correspondent `SwiftDate.defaultRegion` is used instead. + /// + /// - Parameter fromDateComponents: date components + public init(fromDateComponents components: DateComponents) { + let tz = (components.timeZone ?? Zones.current.toTimezone()) + let cal = (components.calendar ?? Calendars.gregorian.toCalendar()) + let loc = (cal.locale ?? Locales.current.toLocale()) + self.init(calendar: cal, zone: tz, locale: loc) + } + + public static var UTC: Region { + return Region(calendar: Calendar.autoupdatingCurrent, + zone: Zones.gmt.toTimezone(), + locale: Locale.autoupdatingCurrent) + } + + /// Return the current local device's region where all attributes are set to the device's values. + /// + /// - Returns: Region + public static var local: Region { + return Region(calendar: Calendar.autoupdatingCurrent, + zone: TimeZone.autoupdatingCurrent, + locale: Locale.autoupdatingCurrent) + } + + /// ISO Region is defined by the gregorian calendar, gmt timezone and english posix locale + public static var ISO: Region { + return Region(calendar: Calendars.gregorian.toCalendar(), + zone: Zones.gmt.toTimezone(), + locale: Locales.englishUnitedStatesComputer) + } + + /// Return an auto updating region where all settings are obtained from the current's device settings. + /// + /// - Returns: Region + public static var current: Region { + return Region(calendar: Calendar.autoupdatingCurrent, + zone: TimeZone.autoupdatingCurrent, + locale: Locale.autoupdatingCurrent) + } + + /// Return a new region in current's device timezone with optional adjust of the calendar and locale. + /// + /// - Parameters: + /// - locale: locale to set + /// - calendar: calendar to set + /// - Returns: region + public static func currentIn(locale: LocaleConvertible? = nil, calendar: CalendarConvertible? = nil) -> Region { + return Region(calendar: (calendar ?? SwiftDate.defaultRegion.calendar), + zone: SwiftDate.defaultRegion.timeZone, + locale: (locale ?? SwiftDate.defaultRegion.locale)) + } + + /// Return the current date expressed into the receiver region. + /// + /// - Returns: `DateInRegion` instance + public func nowInThisRegion() -> DateInRegion { + return DateInRegion(Date(), region: self) + } + + // MARK: - Codable Support + + enum CodingKeys: String, CodingKey { + case calendar + case locale + case timezone + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(calendar.timeZone.identifier, forKey: .timezone) + try container.encode(calendar.locale!.identifier, forKey: .locale) + try container.encode(calendar.identifier.description, forKey: .calendar) + } + + public init(from decoder: Decoder) throws { + let values = try decoder.container(keyedBy: CodingKeys.self) + let calId = Calendar.Identifier( try values.decode(String.self, forKey: .calendar)) + let tz = (TimeZone(identifier: try values.decode(String.self, forKey: .timezone)) ?? SwiftDate.defaultRegion.timeZone) + let lc = Locale(identifier: try values.decode(String.self, forKey: .locale)) + calendar = Calendar.newCalendar(calId, configure: { + $0.timeZone = tz + $0.locale = lc + }) + } + + // MARK: - Comparable + + public static func == (lhs: Region, rhs: Region) -> Bool { + // Note: equality does not consider other parameters than the identifier of the major + // attributes (calendar, timezone and locale). Deeper comparisor must be made directly + // between Calendar (it may fail when you encode/decode autoUpdating calendars). + return + (lhs.calendar.identifier == rhs.calendar.identifier) && + (lhs.timeZone.identifier == rhs.timeZone.identifier) && + (lhs.locale.identifier == rhs.locale.identifier) + } +} diff --git a/Sources/App/Libraries/SwiftDate/DateRepresentable.swift b/Sources/App/Libraries/SwiftDate/DateRepresentable.swift new file mode 100644 index 0000000..717fd21 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/DateRepresentable.swift @@ -0,0 +1,570 @@ +// +// SwiftDate +// Parse, validate, manipulate, and display dates, time and timezones in Swift +// +// Created by Daniele Margutti +// - Web: https://www.danielemargutti.com +// - Twitter: https://twitter.com/danielemargutti +// - Mail: hello@danielemargutti.com +// +// Copyright © 2019 Daniele Margutti. Licensed under MIT License. +// + +import Foundation + +public protocol DateRepresentable { + + // MARK: - Date Components + var year: Int { get } + + /// Represented month + var month: Int { get } + + /// Represented month name with given style. + /// + /// - Parameter style: style in which the name must be formatted. + /// - Returns: name of the month + func monthName(_ style: SymbolFormatStyle) -> String + + /// Number of the days in the receiver. + var monthDays: Int { get } + + /// Day unit of the receiver. + var day: Int { get } + + /// Day of year unit of the receiver + var dayOfYear: Int { get } + + /// The number of day in ordinal style format for the receiver in current locale. + /// For example, in the en_US locale, the number 3 is represented as 3rd; + /// in the fr_FR locale, the number 3 is represented as 3e. + @available(iOS 9.0, macOS 10.11, *) + var ordinalDay: String { get } + + /// Hour unit of the receiver. + var hour: Int { get } + + /// Nearest rounded hour from the date + var nearestHour: Int { get } + + /// Minute unit of the receiver. + var minute: Int { get } + + /// Second unit of the receiver. + var second: Int { get } + + /// Nanosecond unit of the receiver. + var nanosecond: Int { get } + + /// Milliseconds in day of the receiver + /// This field behaves exactly like a composite of all time-related fields, not including the zone fields. + /// As such, it also reflects discontinuities of those fields on DST transition days. + /// On a day of DST onset, it will jump forward. On a day of DST cessation, it will jump backward. + /// This reflects the fact that is must be combined with the offset field to obtain a unique local time value. + var msInDay: Int { get } + + /// Weekday unit of the receiver. + /// The weekday units are the numbers 1-N (where for the Gregorian calendar N=7 and 1 is Sunday). + var weekday: Int { get } + + /// Name of the weekday expressed in given format style. + /// + /// - Parameter style: style to express the value. + /// - Parameter locale: locale to use; ignore it to use default's region locale. + /// - Returns: weekday name + func weekdayName(_ style: SymbolFormatStyle, locale: LocaleConvertible?) -> String + + /// Week of a year of the receiver. + var weekOfYear: Int { get } + + /// Week of a month of the receiver. + var weekOfMonth: Int { get } + + /// Ordinal position within the month unit of the corresponding weekday unit. + /// For example, in the Gregorian calendar a weekday ordinal unit of 2 for a + /// weekday unit 3 indicates "the second Tuesday in the month". + var weekdayOrdinal: Int { get } + + /// Return the first day number of the week where the receiver date is located. + var firstDayOfWeek: Int { get } + + /// Return the last day number of the week where the receiver date is located. + var lastDayOfWeek: Int { get } + + /// Relative year for a week within a year calendar unit. + var yearForWeekOfYear: Int { get } + + /// Quarter value of the receiver. + var quarter: Int { get } + + /// Quarter name expressed in given format style. + /// + /// - Parameter style: style to express the value. + /// - Parameter locale: locale to use; ignore it to use default's region locale. + /// - Returns: quarter name + func quarterName(_ style: SymbolFormatStyle, locale: LocaleConvertible?) -> String + + /// Era value of the receiver. + var era: Int { get } + + /// Name of the era expressed in given format style. + /// + /// - Parameter style: style to express the value. + /// - Parameter locale: locale to use; ignore it to use default's region locale. + /// - Returns: era + func eraName(_ style: SymbolFormatStyle, locale: LocaleConvertible?) -> String + + /// The current daylight saving time offset of the represented date. + var DSTOffset: TimeInterval { get } + + // MARK: - Common Properties + + /// Absolute representation of the date + var date: Date { get } + + /// Associated region + var region: Region { get } + + /// Associated calendar + var calendar: Calendar { get } + + /// Extract the date components from the date + var dateComponents: DateComponents { get } + + /// Returns whether the given date is in today as boolean. + var isToday: Bool { get } + + /// Returns whether the given date is in yesterday. + var isYesterday: Bool { get } + + /// Returns whether the given date is in tomorrow. + var isTomorrow: Bool { get } + + /// Returns whether the given date is in the weekend. + var isInWeekend: Bool { get } + + /// Return true if given date represent a passed date + var isInPast: Bool { get } + + /// Return true if given date represent a future date + var isInFuture: Bool { get } + + /// Use this object to format the date object. + /// By default this object return the `customFormatter` instance (if set) or the + /// local thread shared formatter (via `sharedFormatter()` func; this is the most typical scenario). + /// + /// - Parameters: + /// - format: format string to set. + /// - configuration: optional callback used to configure the object inline. + /// - Returns: formatter instance + func formatter(format: String?, configuration: ((DateFormatter) -> Void)?) -> DateFormatter + + /// User this object to get an DateFormatter already configured to format the data object with the associated region. + /// By default this object return the `customFormatter` instance (if set) configured for region or the + /// local thread shared formatter even configured for region (via `sharedFormatter()` func; this is the most typical scenario). + /// + /// - format: format string to set. + /// - configuration: optional callback used to configure the object inline. + /// - Returns: formatter instance + func formatterForRegion(format: String?, configuration: ((inout DateFormatter) -> Void)?) -> DateFormatter + + /// Set a custom formatter for this object. + /// Typically you should not need to set a value for this property. + /// With a `nil` value SwiftDate will uses the threa shared formatter returned by `sharedFormatter()` function. + /// In case you need to a custom formatter instance you can override the default behaviour by setting a value here. + var customFormatter: DateFormatter? { get set } + + /// Return a formatter instance created as singleton into the current caller's thread. + /// This object is used for formatting when no `dateFormatter` is set for the object + /// (this is the common scenario where you want to avoid multiple formatter instances to + /// parse dates; instances of DateFormatter are very expensive to create and you should + /// use a single instance in each thread to perform this kind of tasks). + /// + /// - Returns: formatter instance + var sharedFormatter: DateFormatter { get } + + // MARK: - Init + + /// Initialize a new date by parsing a string. + /// + /// - Parameters: + /// - string: string with the date. + /// - format: format used to parse date. Pass `nil` to use built-in formats + /// (if you know you should pass it to optimize the parsing process) + /// - region: region in which the date in `string` is expressed. + init?(_ string: String, format: String?, region: Region) + + /// Initialize a new date from a number of seconds since the Unix Epoch. + /// + /// - Parameters: + /// - interval: seconds since the Unix Epoch timestamp. + /// - region: region in which the date must be expressed. + init(seconds interval: TimeInterval, region: Region) + + /// Initialize a new date corresponding to the number of milliseconds since the Unix Epoch. + /// + /// - Parameters: + /// - interval: seconds since the Unix Epoch timestamp. + /// - region: region in which the date must be expressed. + init(milliseconds interval: Int, region: Region) + + /// Initialize a new date with the opportunity to configure single date components via builder pattern. + /// Date is therfore expressed in passed region (`DateComponents`'s `timezone`,`calendar` and `locale` are ignored + /// and overwritten by the region if not `nil`). + /// + /// - Parameters: + /// - configuration: configuration callback + /// - region: region in which the date is expressed. Ignore to use `SwiftDate.defaultRegion`, + /// `nil` to use `DateComponents` data. + init?(components configuration: ((inout DateComponents) -> Void), region: Region?) + + /// Initialize a new date with time components passed. + /// + /// - Parameters: + /// - components: date components + /// - region: region in which the date is expressed. Ignore to use `SwiftDate.defaultRegion`, + /// `nil` to use `DateComponents` data. + init?(components: DateComponents, region: Region?) + + /// Initialize a new date with given components. + init(year: Int, month: Int, day: Int, hour: Int, minute: Int, second: Int, nanosecond: Int, region: Region) + + // MARK: - Conversion + + /// Convert a date to another region. + /// + /// - Parameter region: destination region in which the date must be represented. + /// - Returns: converted date + func convertTo(region: Region) -> DateInRegion + + // MARK: - To String Formatting + + /// Convert date to a string using passed pre-defined style. + /// + /// - Parameter style: formatter style, `nil` to use `standard` style + /// - Returns: string representation of the date + func toString(_ style: DateToStringStyles?) -> String + + /// Convert date to a string using custom date format. + /// + /// - Parameters: + /// - format: format of the string representation + /// - locale: locale to fix a custom locale, `nil` to use associated region's locale + /// - Returns: string representation of the date + func toFormat(_ format: String, locale: LocaleConvertible?) -> String + + /// Convert a date to a string representation relative to another reference date (or current + /// if not passed). + /// + /// - Parameters: + /// - since: reference date, if `nil` current is used. + /// - style: style to use to format relative date. + /// - locale: force locale print, `nil` to use the date own region's locale + /// - Returns: string representation of the date. + func toRelative(since: DateInRegion?, style: RelativeFormatter.Style?, locale: LocaleConvertible?) -> String + + /// Return ISO8601 representation of the date + /// + /// - Parameter options: optional options, if nil extended iso format is used + func toISO(_ options: ISOFormatter.Options?) -> String + + /// Return DOTNET compatible representation of the date. + /// + /// - Returns: string representation of the date + func toDotNET() -> String + + /// Return SQL compatible representation of the date. + /// + /// - Returns: string represenation of the date + func toSQL() -> String + + /// Return RSS compatible representation of the date + /// + /// - Parameter alt: `true` to return altRSS version, `false` to return the standard RSS representation + /// - Returns: string representation of the date + func toRSS(alt: Bool) -> String + + // MARK: - Extract Components + + /// Extract time components for elapsed interval between the receiver date + /// and a reference date. + /// + /// - Parameters: + /// - units: units to extract. + /// - refDate: reference date + /// - Returns: extracted time units + func toUnits(_ units: Set, to refDate: DateRepresentable) -> [Calendar.Component: Int] + + /// Extract time unit component from given date. + /// + /// - Parameters: + /// - unit: time component to extract + /// - refDate: reference date + /// - Returns: extracted time unit value + func toUnit(_ unit: Calendar.Component, to refDate: DateRepresentable) -> Int + +} + +public extension DateRepresentable { + + // MARK: - Common Properties + + var calendar: Calendar { + return region.calendar + } + + // MARK: - Date Components Properties + + var year: Int { + return dateComponents.year! + } + + var month: Int { + return dateComponents.month! + } + + var monthDays: Int { + return calendar.range(of: .day, in: .month, for: date)!.count + } + + func monthName(_ style: SymbolFormatStyle) -> String { + let formatter = self.formatter(format: nil) + let idx = (month - 1) + switch style { + case .default: return formatter.monthSymbols[idx] + case .defaultStandalone: return formatter.standaloneMonthSymbols[idx] + case .short: return formatter.shortMonthSymbols[idx] + case .standaloneShort: return formatter.shortStandaloneMonthSymbols[idx] + case .veryShort: return formatter.veryShortMonthSymbols[idx] + case .standaloneVeryShort: return formatter.veryShortStandaloneMonthSymbols[idx] + } + } + + var day: Int { + return dateComponents.day! + } + + var dayOfYear: Int { + return calendar.ordinality(of: .day, in: .year, for: date)! + } + + @available(iOS 9.0, macOS 10.11, *) + var ordinalDay: String { + let day = self.day + return DateFormatter.sharedOrdinalNumberFormatter(locale: region.locale).string(from: day as NSNumber) ?? "\(day)" + } + + var hour: Int { + return dateComponents.hour! + } + + var nearestHour: Int { + let newDate = (date + (date.minute >= 30 ? 60 - date.minute : -date.minute).minutes) + return newDate.in(region: region).hour + } + + var minute: Int { + return dateComponents.minute! + } + + var second: Int { + return dateComponents.second! + } + + var nanosecond: Int { + return dateComponents.nanosecond! + } + + var msInDay: Int { + return (calendar.ordinality(of: .second, in: .day, for: date)! * 1000) + } + + var weekday: Int { + return dateComponents.weekday! + } + + func weekdayName(_ style: SymbolFormatStyle, locale: LocaleConvertible? = nil) -> String { + let formatter = self.formatter(format: nil) { + $0.locale = (locale ?? self.region.locale).toLocale() + } + let idx = (weekday - 1) + switch style { + case .default: return formatter.weekdaySymbols[idx] + case .defaultStandalone: return formatter.standaloneWeekdaySymbols[idx] + case .short: return formatter.shortWeekdaySymbols[idx] + case .standaloneShort: return formatter.shortStandaloneWeekdaySymbols[idx] + case .veryShort: return formatter.veryShortWeekdaySymbols[idx] + case .standaloneVeryShort: return formatter.veryShortStandaloneWeekdaySymbols[idx] + } + } + + var weekOfYear: Int { + return dateComponents.weekOfYear! + } + + var weekOfMonth: Int { + return dateComponents.weekOfMonth! + } + + var weekdayOrdinal: Int { + return dateComponents.weekdayOrdinal! + } + + var yearForWeekOfYear: Int { + return dateComponents.yearForWeekOfYear! + } + + var firstDayOfWeek: Int { + return date.dateAt(.startOfWeek).day + } + + var lastDayOfWeek: Int { + return date.dateAt(.endOfWeek).day + } + + var quarter: Int { + let monthsInQuarter = Double(Calendar.current.monthSymbols.count) / 4.0 + return Int(ceil( Double(month) / monthsInQuarter)) + } + + var isToday: Bool { + return calendar.isDateInToday(date) + } + + var isYesterday: Bool { + return calendar.isDateInYesterday(date) + } + + var isTomorrow: Bool { + return calendar.isDateInTomorrow(date) + } + + var isInWeekend: Bool { + return calendar.isDateInWeekend(date) + } + + var isInPast: Bool { + return date < Date() + } + + var isInFuture: Bool { + return date > Date() + } + + func quarterName(_ style: SymbolFormatStyle, locale: LocaleConvertible? = nil) -> String { + let formatter = self.formatter(format: nil) { + $0.locale = (locale ?? self.region.locale).toLocale() + } + let idx = (quarter - 1) + switch style { + case .default: return formatter.quarterSymbols[idx] + case .defaultStandalone: return formatter.standaloneQuarterSymbols[idx] + case .short, .veryShort: return formatter.shortQuarterSymbols[idx] + case .standaloneShort, .standaloneVeryShort: return formatter.shortStandaloneQuarterSymbols[idx] + } + } + + var era: Int { + return dateComponents.era! + } + + func eraName(_ style: SymbolFormatStyle, locale: LocaleConvertible? = nil) -> String { + let formatter = self.formatter(format: nil) { + $0.locale = (locale ?? self.region.locale).toLocale() + } + let idx = (era - 1) + switch style { + case .default, .defaultStandalone: return formatter.longEraSymbols[idx] + case .short, .standaloneShort, .veryShort, .standaloneVeryShort: return formatter.eraSymbols[idx] + } + } + + var DSTOffset: TimeInterval { + return region.timeZone.daylightSavingTimeOffset(for: date) + } + + // MARK: - Date Formatters + + func formatter(format: String? = nil, configuration: ((DateFormatter) -> Void)? = nil) -> DateFormatter { + let formatter = (customFormatter ?? sharedFormatter) + if let dFormat = format { + formatter.dateFormat = dFormat + } + configuration?(formatter) + return formatter + } + + func formatterForRegion(format: String? = nil, configuration: ((inout DateFormatter) -> Void)? = nil) -> DateFormatter { + var formatter = self.formatter(format: format, configuration: { + $0.timeZone = self.region.timeZone + $0.calendar = self.calendar + $0.locale = self.region.locale + }) + configuration?(&formatter) + return formatter + } + + var sharedFormatter: DateFormatter { + return DateFormatter.sharedFormatter(forRegion: region) + } + + func toString(_ style: DateToStringStyles? = nil) -> String { + guard let style = style else { + return DateToStringStyles.standard.toString(self) + } + return style.toString(self) + } + + func toFormat(_ format: String, locale: LocaleConvertible? = nil) -> String { + guard let fixedLocale = locale else { + return DateToStringStyles.custom(format).toString(self) + } + let fixedRegion = Region(calendar: region.calendar, zone: region.timeZone, locale: fixedLocale) + let fixedDate = DateInRegion(date.date, region: fixedRegion) + return DateToStringStyles.custom(format).toString(fixedDate) + } + + func toRelative(since: DateInRegion? = nil, style: RelativeFormatter.Style? = nil, locale: LocaleConvertible? = nil) -> String { + return RelativeFormatter.format(date: self, to: since, style: style, locale: locale?.toLocale()) + } + + func toISO(_ options: ISOFormatter.Options? = nil) -> String { + return DateToStringStyles.iso( (options ?? ISOFormatter.Options([.withInternetDateTime])) ).toString(self) + } + + func toDotNET() -> String { + return DOTNETFormatter.format(self, options: nil) + } + + func toRSS(alt: Bool) -> String { + switch alt { + case true: return DateToStringStyles.altRSS.toString(self) + case false: return DateToStringStyles.rss.toString(self) + } + } + + func toSQL() -> String { + return DateToStringStyles.sql.toString(self) + } + + // MARK: - Conversion + + func convertTo(region: Region) -> DateInRegion { + return DateInRegion(date, region: region) + } + + // MARK: - Extract Time Components + + func toUnits(_ units: Set, to refDate: DateRepresentable) -> [Calendar.Component: Int] { + let cal = region.calendar + let components = cal.dateComponents(units, from: date, to: refDate.date) + return components.toDict() + } + + func toUnit(_ unit: Calendar.Component, to refDate: DateRepresentable) -> Int { + let cal = region.calendar + let components = cal.dateComponents([unit], from: date, to: refDate.date) + return components.value(for: unit)! + } + +} diff --git a/Sources/App/Libraries/SwiftDate/Formatters/DotNetParserFormatter.swift b/Sources/App/Libraries/SwiftDate/Formatters/DotNetParserFormatter.swift new file mode 100644 index 0000000..f52e789 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/DotNetParserFormatter.swift @@ -0,0 +1,69 @@ +// +// SwiftDate +// Parse, validate, manipulate, and display dates, time and timezones in Swift +// +// Created by Daniele Margutti +// - Web: https://www.danielemargutti.com +// - Twitter: https://twitter.com/danielemargutti +// - Mail: hello@danielemargutti.com +// +// Copyright © 2019 Daniele Margutti. Licensed under MIT License. +// + +import Foundation + +public class DOTNETParser: StringToDateTransformable { + + internal static let pattern = "\\/Date\\((-?\\d+)((?:[\\+\\-]\\d+)?)\\)\\/" + + public static func parse(_ string: String) -> (seconds: TimeInterval, tz: TimeZone)? { + do { + let parser = try NSRegularExpression(pattern: DOTNETParser.pattern, options: .caseInsensitive) + guard let match = parser.firstMatch(in: string, options: .reportCompletion, range: NSRange(location: 0, length: string.count)) else { + return nil + } + + guard let milliseconds = TimeInterval((string as NSString).substring(with: match.range(at: 1))) else { return nil } + + // Parse timezone + let raw_tz = ((string as NSString).substring(with: match.range(at: 2)) as NSString) + guard raw_tz.length > 1 else { + return nil + } + let tz_sign: String = raw_tz.substring(to: 1) + if tz_sign != "+" && tz_sign != "-" { + return nil + } + + let tz_hours: String = raw_tz.substring(with: NSRange(location: 1, length: 2)) + let tz_minutes: String = raw_tz.substring(with: NSRange(location: 3, length: 2)) + + let tz_offset = (Int(tz_hours)! * 60 * 60) + ( Int(tz_minutes)! * 60 ) + guard let tz_obj = TimeZone(secondsFromGMT: tz_offset) else { + return nil + } + return ( (milliseconds / 1000), tz_obj ) + } catch { + return nil + } + } + + public static func parse(_ string: String, region: Region?, options: Any?) -> DateInRegion? { + guard let result = DOTNETParser.parse(string) else { return nil } + let regionSet = region ?? Region.ISO + let adaptedRegion = Region(calendar: regionSet.calendar, zone: regionSet.timeZone, locale: regionSet.locale) + return DateInRegion(seconds: result.seconds, region: adaptedRegion) + } + +} + +public class DOTNETFormatter: DateToStringTrasformable { + + public static func format(_ date: DateRepresentable, options: Any?) -> String { + let milliseconds = (date.date.timeIntervalSince1970 * 1000.0) + let tzOffsets = (date.region.timeZone.secondsFromGMT(for: date.date) / 3600) + let formattedStr = String(format: "/Date(%.0f%+03d00)/", milliseconds, tzOffsets) + return formattedStr + } + +} diff --git a/Sources/App/Libraries/SwiftDate/Formatters/Formatter+Protocols.swift b/Sources/App/Libraries/SwiftDate/Formatters/Formatter+Protocols.swift new file mode 100644 index 0000000..d0580ff --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/Formatter+Protocols.swift @@ -0,0 +1,129 @@ +// +// SwiftDate +// Parse, validate, manipulate, and display dates, time and timezones in Swift +// +// Created by Daniele Margutti +// - Web: https://www.danielemargutti.com +// - Twitter: https://twitter.com/danielemargutti +// - Mail: hello@danielemargutti.com +// +// Copyright © 2019 Daniele Margutti. Licensed under MIT License. +// + +import Foundation + +public protocol DateToStringTrasformable { + static func format(_ date: DateRepresentable, options: Any?) -> String +} + +public protocol StringToDateTransformable { + static func parse(_ string: String, region: Region?, options: Any?) -> DateInRegion? +} + +// MARK: - Formatters + +/// Format to represent a date to string +/// +/// - iso: standard iso format. The ISO8601 formatted date, time and millisec "yyyy-MM-dd'T'HH:mm:ssZZZZZ" +/// - extended: Extended format. "eee dd-MMM-yyyy GG HH:mm:ss.SSS zzz" +/// - rss: The RSS formatted date "EEE, d MMM yyyy HH:mm:ss ZZZ" i.e. "Fri, 09 Sep 2011 15:26:08 +0200" +/// - altRSS: The Alternative RSS formatted date "d MMM yyyy HH:mm:ss ZZZ" i.e. "09 Sep 2011 15:26:08 +0200" +/// - dotNet: The dotNet formatted date "/Date(%d%d)/" i.e. "/Date(1268123281843)/" +/// - httpHeader: The http header formatted date "EEE, dd MMM yyyy HH:mm:ss zzz" i.e. "Tue, 15 Nov 1994 12:45:26 GMT" +/// - custom: custom string format +/// - standard: A generic standard format date i.e. "EEE MMM dd HH:mm:ss Z yyyy" +/// - date: Date only format (short = "2/27/17", medium = "Feb 27, 2017", long = "February 27, 2017", full = "Monday, February 27, 2017" +/// - time: Time only format (short = "2:22 PM", medium = "2:22:06 PM", long = "2:22:06 PM EST", full = "2:22:06 PM Eastern Standard Time" +/// - dateTime: Date/Time format (short = "2/27/17, 2:22 PM", medium = "Feb 27, 2017, 2:22:06 PM", long = "February 27, 2017 at 2:22:06 PM EST", full = "Monday, February 27, 2017 at 2:22:06 PM Eastern Standard Time" +public enum DateToStringStyles { + case iso(_: ISOFormatter.Options) + case extended + case rss + case altRSS + case dotNet + case httpHeader + case sql + case date(_: DateFormatter.Style) + case time(_: DateFormatter.Style) + case dateTime(_: DateFormatter.Style) + case custom(_: String) + case standard + case relative(style: RelativeFormatter.Style?) + + public func toString(_ date: DateRepresentable) -> String { + switch self { + case .iso(let opts): return ISOFormatter.format(date, options: opts) + case .extended: return date.formatterForRegion(format: DateFormats.extended).string(from: date.date) + case .rss: return date.formatterForRegion(format: DateFormats.rss).string(from: date.date) + case .altRSS: return date.formatterForRegion(format: DateFormats.altRSS).string(from: date.date) + case .sql: return date.formatterForRegion(format: DateFormats.sql).string(from: date.date) + case .dotNet: return DOTNETFormatter.format(date, options: nil) + case .httpHeader: return date.formatterForRegion(format: DateFormats.httpHeader).string(from: date.date) + case .custom(let format): return date.formatterForRegion(format: format).string(from: date.date) + case .standard: return date.formatterForRegion(format: DateFormats.standard).string(from: date.date) + case .date(let style): + return date.formatterForRegion(format: nil, configuration: { + $0.dateStyle = style + $0.timeStyle = .none + }).string(from: date.date) + case .time(let style): + return date.formatterForRegion(format: nil, configuration: { + $0.dateStyle = .none + $0.timeStyle = style + }).string(from: date.date) + case .dateTime(let style): + return date.formatterForRegion(format: nil, configuration: { + $0.dateStyle = style + $0.timeStyle = style + }).string(from: date.date) + case .relative(let style): + return RelativeFormatter.format(date, options: style) + } + } + +} + +// MARK: - Parsers + +/// String to date transform +/// +/// - iso: standard automatic iso parser (evaluate the date components automatically) +/// - extended: Extended format. "eee dd-MMM-yyyy GG HH:mm:ss.SSS zzz" +/// - rss: The RSS formatted date "EEE, d MMM yyyy HH:mm:ss ZZZ" i.e. "Fri, 09 Sep 2011 15:26:08 +0200" +/// - altRSS: The Alternative RSS formatted date "d MMM yyyy HH:mm:ss ZZZ" i.e. "09 Sep 2011 15:26:08 +0200" +/// - dotNet: The dotNet formatted date "/Date(%d%d)/" i.e. "/Date(1268123281843)/" +/// - httpHeader: The http header formatted date "EEE, dd MMM yyyy HH:mm:ss zzz" i.e. "Tue, 15 Nov 1994 12:45:26 GMT" +/// - strict: custom string format with lenient options active +/// - custom: custom string format +/// - standard: A generic standard format date i.e. "EEE MMM dd HH:mm:ss Z yyyy" +public enum StringToDateStyles { + case iso(_: ISOParser.Options) + case extended + case rss + case altRSS + case dotNet + case sql + case httpHeader + case strict(_: String) + case custom(_: String) + case standard + + public func toDate(_ string: String, region: Region) -> DateInRegion? { + switch self { + case .iso(let options): return ISOParser.parse(string, region: region, options: options) + case .custom(let format): return DateInRegion(string, format: format, region: region) + case .extended: return DateInRegion(string, format: DateFormats.extended, region: region) + case .sql: return DateInRegion(string, format: DateFormats.sql, region: region) + case .rss: return DateInRegion(string, format: DateFormats.rss, region: Region.ISO)?.convertTo(locale: region.locale) + case .altRSS: return DateInRegion(string, format: DateFormats.altRSS, region: Region.ISO)?.convertTo(locale: region.locale) + case .dotNet: return DOTNETParser.parse(string, region: region, options: nil) + case .httpHeader: return DateInRegion(string, format: DateFormats.httpHeader, region: region) + case .standard: return DateInRegion(string, format: DateFormats.standard, region: region) + case .strict(let format): + let formatter = DateFormatter.sharedFormatter(forRegion: region, format: format) + formatter.isLenient = false + guard let absDate = formatter.date(from: string) else { return nil } + return DateInRegion(absDate, region: region) + } + } +} diff --git a/Sources/App/Libraries/SwiftDate/Formatters/ISOFormatter.swift b/Sources/App/Libraries/SwiftDate/Formatters/ISOFormatter.swift new file mode 100644 index 0000000..8812a6c --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/ISOFormatter.swift @@ -0,0 +1,179 @@ +// +// SwiftDate +// Parse, validate, manipulate, and display dates, time and timezones in Swift +// +// Created by Daniele Margutti +// - Web: https://www.danielemargutti.com +// - Twitter: https://twitter.com/danielemargutti +// - Mail: hello@danielemargutti.com +// +// Copyright © 2019 Daniele Margutti. Licensed under MIT License. +// + +import Foundation + +public class ISOFormatter: DateToStringTrasformable { + + public struct Options: OptionSet { + public let rawValue: Int + + public init(rawValue: Int) { + self.rawValue = rawValue + } + + /// The date representation includes the year. The format for year is inferred based on the other specified options. + /// - If withWeekOfYear is specified, YYYY is used. + /// - Otherwise, yyyy is used. + public static let withYear = ISOFormatter.Options(rawValue: 1 << 0) + + /// The date representation includes the month. The format for month is MM. + public static let withMonth = ISOFormatter.Options(rawValue: 1 << 1) + + /// The date representation includes the week of the year. + /// The format for week of year is ww, including the W prefix. + public static let withWeekOfYear = ISOFormatter.Options(rawValue: 1 << 2) + + /// The date representation includes the day. The format for day is inferred based on provided options: + /// - If withMonth is specified, dd is used. + /// - If withWeekOfYear is specified, ee is used. + /// - Otherwise, DDD is used. + public static let withDay = ISOFormatter.Options(rawValue: 1 << 3) + + /// The date representation includes the time. The format for time is HH:mm:ss. + public static let withTime = ISOFormatter.Options(rawValue: 1 << 4) + + /// The date representation includes the timezone. The format for timezone is ZZZZZ. + public static let withTimeZone = ISOFormatter.Options(rawValue: 1 << 5) + + /// The date representation uses a space ( ) instead of T between the date and time. + public static let withSpaceBetweenDateAndTime = ISOFormatter.Options(rawValue: 1 << 6) + + /// The date representation uses the dash separator (-) in the date. + public static let withDashSeparatorInDate = ISOFormatter.Options(rawValue: 1 << 7) + + /// The date representation uses the colon separator (:) in the time. + public static let withFullDate = ISOFormatter.Options(rawValue: 1 << 8) + + /// The date representation includes the hour, minute, and second. + public static let withFullTime = ISOFormatter.Options(rawValue: 1 << 9) + + /// The format used for internet date times, according to the RFC 3339 standard. + /// Equivalent to specifying withFullDate, withFullTime, withDashSeparatorInDate, + /// withColonSeparatorInTime, and withColonSeparatorInTimeZone. + public static let withInternetDateTime = ISOFormatter.Options(rawValue: 1 << 10) + + // The format used for internet date times; it's similar to .withInternetDateTime + // but include milliseconds ('yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ'). + public static let withInternetDateTimeExtended = ISOFormatter.Options(rawValue: 1 << 11) + + /// Print the timezone in format `ZZZ` instead of `ZZZZZ` + /// An example outout maybe be `+0200` instead of `+02:00`. + public static let withoutTZSeparators = ISOFormatter.Options(rawValue: 1 << 12) + + /// Evaluate formatting string + public var dateFormat: String { + if contains(.withInternetDateTimeExtended) || contains(.withoutTZSeparators) { + if contains(.withoutTZSeparators) { + return "yyyy-MM-dd'T'HH:mm:ss.SSSZZZ" + } + return "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ" + } + + if contains(.withInternetDateTime) { + if contains(.withoutTZSeparators) { + return "yyyy-MM-dd'T'HH:mm:ss.SSSZZZ" + } + return "yyyy-MM-dd'T'HH:mm:ssZZZZZ" + } + + var format: String = "" + if contains(.withFullDate) { + format += "yyyy-MM-dd" + } else { + if contains(.withYear) { + if contains(.withWeekOfYear) { + format += "YYYY" + } else if contains(.withMonth) || contains(.withDay) { + format += "yyyy" + } else { + // not valid + } + } + if contains(.withMonth) { + if contains(.withYear) || contains(.withDay) || contains(.withWeekOfYear) { + format += "MM" + } else { + // not valid + } + } + if contains(.withWeekOfYear) { + if contains(.withDay) { + format += "'W'ww" + } else { + if contains(.withYear) || contains(.withMonth) { + if contains(.withDashSeparatorInDate) { + format += "-'W'ww" + } else { + format += "'W'ww" + } + } else { + // not valid + } + } + } + + if contains(.withDay) { + if contains(.withWeekOfYear) { + format += "FF" + } else if contains(.withMonth) { + format += "dd" + } else if contains(.withYear) { + if contains(.withDashSeparatorInDate) { + format += "-DDD" + } else { + format += "DDD" + } + } else { + // not valid + } + } + } + + let hasDate = (contains(.withFullDate) || contains(.withMonth) || contains(.withDay) || contains(.withWeekOfYear) || contains(.withYear)) + if hasDate && (contains(.withFullTime) || contains(.withTimeZone) || contains(.withTime)) { + if contains(.withSpaceBetweenDateAndTime) { + format += " " + } else { + format += "'T'" + } + } + + if contains(.withFullTime) { + format += "HH:mm:ssZZZZZ" + } else { + if contains(.withTime) { + format += "HH:mm:ss" + } + if contains(.withTimeZone) { + if contains(.withoutTZSeparators) { + return "yyyy-MM-dd'T'HH:mm:ss.SSSZZZ" + } + format += "ZZZZZ" + } + } + + return format + } + } + + public static func format(_ date: DateRepresentable, options: Any?) -> String { + let formatOptions = ((options as? ISOFormatter.Options) ?? ISOFormatter.Options([.withInternetDateTime])) + let formatter = date.formatter(format: formatOptions.dateFormat) { + $0.locale = Locales.englishUnitedStatesComputer.toLocale() // fix for 12/24h + $0.timeZone = date.region.timeZone + $0.calendar = Calendars.gregorian.toCalendar() + } + return formatter.string(from: date.date) + } + +} diff --git a/Sources/App/Libraries/SwiftDate/Formatters/ISOParser.swift b/Sources/App/Libraries/SwiftDate/Formatters/ISOParser.swift new file mode 100644 index 0000000..70da3ba --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/ISOParser.swift @@ -0,0 +1,932 @@ +// +// SwiftDate +// Parse, validate, manipulate, and display dates, time and timezones in Swift +// +// Created by Daniele Margutti +// - Web: https://www.danielemargutti.com +// - Twitter: https://twitter.com/danielemargutti +// - Mail: hello@danielemargutti.com +// +// Copyright © 2019 Daniele Margutti. Licensed under MIT License. +// + +// swiftlint:disable file_length + +import Foundation + +/// This defines all possible errors you can encounter parsing ISO8601 string +/// +/// - eof: end of file +/// - notDigit: expected digit, value cannot be parsed as int +/// - notDouble: expected double digit, value cannot be parsed as double +/// - invalid: invalid state reached. Something in the format is not correct +public enum ISO8601ParserError: Error { + case eof + case notDigit + case notDouble + case invalid +} + +fileprivate extension Int { + + /// Return `true` if current year is a leap year, `false` otherwise + var isLeapYear: Bool { + return ((self % 4) == 0) && (((self % 100) != 0) || ((self % 400) == 0)) + } + +} + +// MARK: - Internal Extension for UnicodeScalar type + +internal extension UnicodeScalar { + + /// return `true` if current character is a digit (arabic), `false` otherwise + var isDigit: Bool { + return "0"..."9" ~= self + } + + /// return `true` if current character is a space + var isSpace: Bool { + return CharacterSet.whitespaces.contains(self) + } + +} + +/// This is the ISO8601 Parser class: it evaluates automatically the format of the ISO8601 date +/// and attempt to parse it in a valid `Date` object. +/// Resulting date also includes Time Zone settings and a property which allows you to inspect +/// single date components. +/// +/// This work is inspired to the original ISO8601DateFormatter class written in ObjC by +/// Peter Hosey (available here https://bitbucket.org/boredzo/iso-8601-parser-unparser). +/// I've made a Swift porting and fixed some issues when parsing several ISO8601 date variants. + +// swiftlint:disable type_body_length +public class ISOParser: StringToDateTransformable { + + /// Internal structure + internal enum Weekday: Int { + case monday = 0 + case tuesday = 1 + case wednesday = 2 + case thursday = 3 + } + + public struct Options { + + /// Time separator character. By default is `:`. + var time_separator: ISOParser.ISOChar = ":" + + /// Strict parsing. By default is `false`. + var strict: Bool = false + + public init(strict: Bool = false) { + self.strict = strict + } + } + + /// Some typealias to make the code cleaner + public typealias ISOString = String.UnicodeScalarView + public typealias ISOIndex = String.UnicodeScalarView.Index + public typealias ISOChar = UnicodeScalar + public typealias ISOParsedDate = (date: Date?, timezone: TimeZone?) + + /// This represent the internal parser status representation + public struct ParsedDate { + + /// Type of date parsed + /// + /// - monthAndDate: month and date style + /// - week: date with week number + /// - dateOnly: date only + // swiftlint:disable nesting + public enum DateStyle { + case monthAndDate + case week + case dateOnly + } + + /// Parsed year value + var year: Int = 0 + + /// Parsed month or week number + var month_or_week: Int = 0 + + /// Parsed day value + var day: Int = 0 + + /// Parsed hour value + var hour: Int = 0 + + /// Parsed minutes value + var minute: TimeInterval = 0.0 + + /// Parsed seconds value + var seconds: TimeInterval = 0.0 + + /// Parsed nanoseconds value + var nanoseconds: TimeInterval = 0.0 + + /// Parsed weekday number (1=monday, 7=sunday) + /// If `nil` source string has not specs about weekday. + var weekday: Int? + + /// Timezone parsed hour value + var tz_hour: Int = 0 + + /// Timezone parsed minute value + var tz_minute: Int = 0 + + /// Type of parsed date + var type: DateStyle = .monthAndDate + + /// Parsed timezone object + var timezone: TimeZone? + } + + /// Source generation calendar. + private var srcCalendar = Calendars.gregorian.toCalendar() + + /// Source raw parsed values + private var date = ParsedDate() + + /// Source string represented as unicode scalars + private var string: ISOString + + /// Current position of the parser in source string. + /// Initially is equal to `string.startIndex` + private var cIdx: ISOIndex + + /// Just a shortcut to the last index in source string + private var eIdx: ISOIndex + + /// Lenght of the string + private var length: Int + + /// Number of hyphens characters found before any value + /// Consequential "-" are used to define implicit values in dates. + private var hyphens: Int = 0 + + /// Private date components used for default values + private var now_cmps: DateComponents + + /// Configuration used for parser + private var options: ISOParser.Options + + /// Date components parsed + private(set) var date_components: DateComponents? + + /// Parsed date + private(set) var parsedDate: Date? + + /// Parsed timezone + private(set) var parsedTimeZone: TimeZone? + + /// Date adjusted at parsed timezone + private var dateInTimezone: Date? { + get { + srcCalendar.timeZone = date.timezone ?? TimeZone(identifier: "UTC")! + return srcCalendar.date(from: date_components!) + } + } + + /// Initialize a new parser with a source ISO8601 string to parse + /// Parsing is done during initialization; any exception is reported + /// before allocating. + /// + /// - Parameters: + /// - src: source ISO8601 string + /// - config: configuration used for parsing + /// - Throws: throw an `ISO8601Error` if parsing operation fails + + public init?(_ src: String, options: ISOParser.Options? = nil) { + let src_trimmed = src.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) + guard src_trimmed.count > 0 else { + return nil + } + string = src_trimmed.unicodeScalars + length = src_trimmed.count + cIdx = string.startIndex + eIdx = string.endIndex + self.options = (options ?? ISOParser.Options()) + self.now_cmps = srcCalendar.dateComponents([.year, .month, .day], from: Date()) + + var idx = cIdx + while idx < eIdx { + if string[idx] == "-" { hyphens += 1 } else { break } + idx = string.index(after: idx) + } + + do { + try parse() + } catch { + return nil + } + } + + // MARK: - Internal Parser + + /// Private parsing function + /// + /// - Throws: throw an `ISO8601Error` if parsing operation fails + @discardableResult + private func parse() throws -> ISOParsedDate { + + // PARSE DATE + + if current() == "T" { + // There is no date here, only a time. + // Set the date to now; then we'll parse the time. + next() + guard current()?.isDigit ?? false else { + throw ISO8601ParserError.invalid + } + + date.year = now_cmps.year! + date.month_or_week = now_cmps.month! + date.day = now_cmps.day! + } else { + moveUntil(is: "-") + let is_time_only = (string.contains("T") == false && string.contains(":") && !string.contains("-")) + + if is_time_only == false { + var (num_digits, segment) = try read_int() + switch num_digits { + case 0: try parse_digits_0(num_digits, &segment) + case 8: try parse_digits_8(num_digits, &segment) + case 6: try parse_digits_6(num_digits, &segment) + case 4: try parse_digits_4(num_digits, &segment) + case 5: try parse_digits_5(num_digits, &segment) + case 1: try parse_digits_1(num_digits, &segment) + case 2: try parse_digits_2(num_digits, &segment) + case 7: try parse_digits_7(num_digits, &segment) //YYYY DDD (ordinal date) + case 3: try parse_digits_3(num_digits, &segment) //--DDD (ordinal date, implicit year) + default: throw ISO8601ParserError.invalid + } + } else { + date.year = now_cmps.year! + date.month_or_week = now_cmps.month! + date.day = now_cmps.day! + } + } + + var hasTime = false + if current()?.isSpace ?? false || current() == "T" { + hasTime = true + next() + } + + // PARSE TIME + + if current()?.isDigit ?? false == true { + let time_sep = options.time_separator + let hasTimeSeparator = string.contains(time_sep) + + date.hour = try read_int(2).value + + if hasTimeSeparator == false && hasTime { + date.minute = TimeInterval(try read_int(2).value) + } else if current() == time_sep { + next() + + if time_sep == "," || time_sep == "." { + //We can't do fractional minutes when '.' is the segment separator. + //Only allow whole minutes and whole seconds. + date.minute = TimeInterval(try read_int(2).value) + if current() == time_sep { + next() + date.seconds = TimeInterval(try read_int(2).value) + } + } else { + //Allow a fractional minute. + //If we don't get a fraction, look for a seconds segment. + //Otherwise, the fraction of a minute is the seconds. + date.minute = try read_double().value + + if current() != ":" { + var int_part: Double = 0.0 + var frac_part: Double = 0.0 + frac_part = modf(date.minute, &int_part) + date.minute = int_part + date.seconds = frac_part + if date.seconds > Double.ulpOfOne { + // Convert fraction (e.g. .5) into seconds (e.g. 30). + date.seconds *= 60 + } else if current() == time_sep { + next() + // date.seconds = try read_double().value + let value = try modf(read_double().value) + date.nanoseconds = TimeInterval(round(value.1 * 1000) * 1_000_000) + date.seconds = TimeInterval(value.0) + } + } else { + // fractional minutes + next() + let value = try modf(read_double().value) + date.nanoseconds = TimeInterval(round(value.1 * 1000) * 1_000_000) + date.seconds = TimeInterval(value.0) + } + } + } + + if options.strict == false { + if cIdx != eIdx && current()?.isSpace ?? false == true { + next() + } + } + + if cIdx != eIdx { + switch current() { + case "Z": + date.timezone = TimeZone(abbreviation: "UTC") + + case "+", "-": + let is_negative = current() == "-" + next() + if current()?.isDigit ?? false == true { + //Read hour offset. + date.tz_hour = try read_int(2).value + if is_negative == true { date.tz_hour = -date.tz_hour } + + // Optional separator + if current() == time_sep { + next() + } + + if current()?.isDigit ?? false { + // Read minute offset + date.tz_minute = try read_int(2).value + if is_negative == true { date.tz_minute = -date.tz_minute } + } + + let timezone_offset = (date.tz_hour * 3600) + (date.tz_minute * 60) + date.timezone = TimeZone(secondsFromGMT: timezone_offset) + } + default: + break + } + } + } + + date_components = DateComponents() + date_components!.year = date.year + date_components!.day = date.day + date_components!.hour = date.hour + date_components!.minute = Int(date.minute) + date_components!.second = Int(date.seconds) + date_components!.nanosecond = Int(date.nanoseconds) + + switch date.type { + case .monthAndDate: + date_components!.month = date.month_or_week + case .week: + //Adapted from . + //This works by converting the week date into an ordinal date, then letting the next case handle it. + let prevYear = date.year - 1 + let YY = prevYear % 100 + let prevC = prevYear - YY + let prevG = YY + YY / 4 + let isLeapYear = (((prevC / 100) % 4) * 5) + let jan1Weekday = ((isLeapYear + prevG) % 7) + + var day = ((8 - jan1Weekday) + (7 * (jan1Weekday > Weekday.thursday.rawValue ? 1 : 0))) + day += (date.day - 1) + (7 * (date.month_or_week - 2)) + + if let weekday = date.weekday { + //date_components!.weekday = weekday + date_components!.day = day + weekday + } else { + date_components!.day = day + } + case .dateOnly: //An "ordinal date". + break + + } + + //cfg.calendar.timeZone = date.timezone ?? TimeZone(identifier: "UTC")! + //parsedDate = cfg.calendar.date(from: date_components!) + + let tz = date.timezone ?? TimeZone(identifier: "UTC")! + parsedTimeZone = tz + srcCalendar.timeZone = tz + parsedDate = srcCalendar.date(from: date_components!) + + return (parsedDate, parsedTimeZone) + } + + private func parse_digits_3(_ num_digits: Int, _ segment: inout Int) throws { + //Technically, the standard only allows one hyphen. But it says that two hyphens is the logical implementation, and one was dropped for brevity. So I have chosen to allow the missing hyphen. + if hyphens < 1 || (hyphens > 2 && options.strict == false) { + throw ISO8601ParserError.invalid + } + + date.day = segment + date.year = now_cmps.year! + date.type = .dateOnly + if options.strict == true && (date.day > (365 + (date.year.isLeapYear ? 1 : 0))) { + throw ISO8601ParserError.invalid + } + } + + private func parse_digits_7(_ num_digits: Int, _ segment: inout Int) throws { + guard hyphens == 0 else { throw ISO8601ParserError.invalid } + + date.day = segment % 1000 + date.year = segment / 1000 + date.type = .dateOnly + if options.strict == true && (date.day > (365 + (date.year.isLeapYear ? 1 : 0))) { + throw ISO8601ParserError.invalid + } + } + + private func parse_digits_2(_ num_digits: Int, _ segment: inout Int) throws { + + func parse_hyphens_3(_ num_digits: Int, _ segment: inout Int) throws { + date.year = now_cmps.year! + date.month_or_week = now_cmps.month! + date.day = segment + } + + func parse_hyphens_2(_ num_digits: Int, _ segment: inout Int) throws { + date.year = now_cmps.year! + date.month_or_week = segment + if current() == "-" { + next() + date.day = try read_int(2).value + } else { + date.day = 1 + } + } + + func parse_hyphens_1(_ num_digits: Int, _ segment: inout Int) throws { + let current_year = now_cmps.year! + let current_century = (current_year % 100) + date.year = segment + (current_year - current_century) + if num_digits == 1 { // implied decade + date.year += current_century - (current_year % 10) + } + + if current() == "-" { + next() + if current() == "W" { + next() + date.type = .week + } + date.month_or_week = try read_int(2).value + + if current() == "-" { + next() + if date.type == .week { + // weekday number + let weekday = try read_int().value + if weekday > 7 { + throw ISO8601ParserError.invalid + } + date.weekday = weekday + } else { + date.day = try read_int().value + if date.day == 0 { + date.day = 1 + } + if date.month_or_week == 0 { + date.month_or_week = 1 + } + } + } else { + date.day = 1 + } + } else { + date.month_or_week = 1 + date.day = 1 + } + } + + func parse_hyphens_0(_ num_digits: Int, _ segment: inout Int) throws { + if current() == "-" { + // Implicit century + date.year = now_cmps.year! + date.year -= (date.year % 100) + date.year += segment + + next() + if current() == "W" { + try parseWeekAndDay() + } else if current()?.isDigit ?? false == false { + try centuryOnly(&segment) + } else { + // Get month and/or date. + let (v_count, v_seg) = try read_int() + switch v_count { + case 4: // YY-MMDD + date.day = v_seg % 100 + date.month_or_week = v_seg / 100 + case 1: // YY-M; YY-M-DD (extension) + if options.strict == true { + throw ISO8601ParserError.invalid + } + case 2: // YY-MM; YY-MM-DD + date.month_or_week = v_seg + if current() == "-" { + next() + if current()?.isDigit ?? false == true { + date.day = try read_int(2).value + } else { + date.day = 1 + } + } else { + date.day = 1 + } + case 3: // Ordinal date + date.day = v_seg + date.type = .dateOnly + default: + break + } + } + } else if current() == "W" { + date.year = now_cmps.year! + date.year -= (date.year % 100) + date.year += segment + + try parseWeekAndDay() + } else { + try centuryOnly(&segment) + } + } + + switch hyphens { + case 0: try parse_hyphens_0(num_digits, &segment) + case 1: try parse_hyphens_1(num_digits, &segment) //-YY; -YY-MM (implicit century) + case 2: try parse_hyphens_2(num_digits, &segment) //--MM; --MM-DD + case 3: try parse_hyphens_3(num_digits, &segment) //---DD + default: throw ISO8601ParserError.invalid + } + } + + private func parse_digits_1(_ num_digits: Int, _ segment: inout Int) throws { + if options.strict == true { + // Two digits only - never just one. + guard hyphens == 1 else { throw ISO8601ParserError.invalid } + if current() == "-" { + next() + } + next() + guard current() == "W" else { throw ISO8601ParserError.invalid } + + date.year = now_cmps.year! + date.year -= (date.year % 10) + date.year += segment + } else { + try parse_digits_2(num_digits, &segment) + } + } + + private func parse_digits_5(_ num_digits: Int, _ segment: inout Int) throws { + guard hyphens == 0 else { throw ISO8601ParserError.invalid } + // YYDDD + date.year = now_cmps.year! + date.year -= (date.year % 100) + date.year += segment / 1000 + + date.day = segment % 1000 + date.type = .dateOnly + } + + private func parse_digits_4(_ num_digits: Int, _ segment: inout Int) throws { + + func parse_hyphens_0(_ num_digits: Int, _ segment: inout Int) throws { + date.year = segment + if current() == "-" { + next() + } + + if current()?.isDigit ?? false == false { + if current() == "W" { + try parseWeekAndDay() + } else { + date.month_or_week = 1 + date.day = 1 + } + } else { + let (v_num, v_seg) = try read_int() + switch v_num { + case 4: // MMDD + date.day = v_seg % 100 + date.month_or_week = v_seg / 100 + case 2: // MM + date.month_or_week = v_seg + + if current() == "-" { + next() + } + if current()?.isDigit ?? false == false { + date.day = 1 + } else { + date.day = try read_int().value + } + case 3: // DDD + date.day = v_seg % 1000 + date.type = .dateOnly + if options.strict == true && (date.day > 365 + (date.year.isLeapYear ? 1 : 0)) { + throw ISO8601ParserError.invalid + } + default: + throw ISO8601ParserError.invalid + } + } + } + + func parse_hyphens_1(_ num_digits: Int, _ segment: inout Int) throws { + date.month_or_week = segment % 100 + date.year = segment / 100 + + if current() == "-" { + next() + } + if current()?.isDigit ?? false == false { + date.day = 1 + } else { + date.day = try read_int().value + } + } + + func parse_hyphens_2(_ num_digits: Int, _ segment: inout Int) throws { + date.day = segment % 100 + date.month_or_week = segment / 100 + date.year = now_cmps.year! + } + + switch hyphens { + case 0: try parse_hyphens_0(num_digits, &segment) // YYYY + case 1: try parse_hyphens_1(num_digits, &segment) // YYMM + case 2: try parse_hyphens_2(num_digits, &segment) // MMDD + default: throw ISO8601ParserError.invalid + } + + } + + private func parse_digits_6(_ num_digits: Int, _ segment: inout Int) throws { + // YYMMDD (implicit century) + guard hyphens == 0 else { + throw ISO8601ParserError.invalid + } + + date.day = segment % 100 + segment /= 100 + date.month_or_week = segment % 100 + date.year = now_cmps.year! + date.year -= (date.year % 100) + date.year += (segment / 100) + } + + private func parse_digits_8(_ num_digits: Int, _ segment: inout Int) throws { + // YYYY MM DD + guard hyphens == 0 else { + throw ISO8601ParserError.invalid + } + + date.day = segment % 100 + segment /= 100 + date.month_or_week = segment % 100 + date.year = segment / 100 + } + + private func parse_digits_0(_ num_digits: Int, _ segment: inout Int) throws { + guard current() == "W" else { + throw ISO8601ParserError.invalid + } + + if seek(1) == "-" && isDigit(seek(2)) && + ((hyphens == 1 || hyphens == 2) && options.strict == false) { + + date.year = now_cmps.year! + date.month_or_week = 1 + next(2) + try parseDayAfterWeek() + } else if hyphens == 1 { + date.year = now_cmps.year! + if current() == "W" { + next() + date.month_or_week = try read_int(2).value + date.type = .week + try parseWeekday() + } else { + try parseDayAfterWeek() + } + } else { + throw ISO8601ParserError.invalid + } + } + + private func parseWeekday() throws { + if current() == "-" { + next() + } + let weekday = try read_int().value + if weekday > 7 { + throw ISO8601ParserError.invalid + } + date.type = .week + date.weekday = weekday + } + + private func parseWeekAndDay() throws { + next() + if current()?.isDigit ?? false == false { + //Not really a week-based date; just a year followed by '-W'. + guard options.strict == false else { + throw ISO8601ParserError.invalid + } + date.month_or_week = 1 + date.day = 1 + } else { + date.month_or_week = try read_int(2).value + try parseWeekday() + } + } + + private func parseDayAfterWeek() throws { + date.day = current()?.isDigit ?? false == true ? try read_int(2).value : 1 + date.type = .week + } + + private func centuryOnly(_ segment: inout Int) throws { + date.year = segment * 100 + now_cmps.year! % 100 + date.month_or_week = 1 + date.day = 1 + } + + /// Return `true` if given character is a char + /// + /// - Parameter char: char to evaluate + /// - Returns: `true` if char is a digit, `false` otherwise + private func isDigit(_ char: UnicodeScalar?) -> Bool { + guard let char = char else { return false } + return char.isDigit + } + + /// MARK: - Scanner internal functions + + /// Get the value at specified offset from current scanner position without + /// moving the current scanner's index. + /// + /// - Parameter offset: offset to move + /// - Returns: char at given position, `nil` if not found + @discardableResult + public func seek(_ offset: Int = 1) -> ISOChar? { + let move_idx = string.index(cIdx, offsetBy: offset) + guard move_idx < eIdx else { + return nil + } + return string[move_idx] + } + + /// Return the char at the current position of the scanner + /// + /// - Parameter next: if `true` return the current char and move to the next position + /// - Returns: the char sat the current position of the scanner + @discardableResult + public func current(_ next: Bool = false) -> ISOChar? { + guard cIdx != eIdx else { return nil } + let current = string[cIdx] + if next == true { cIdx = string.index(after: cIdx) } + return current + } + + /// Move by `offset` characters the index of the scanner and return the char at the current + /// position. If EOF is reached `nil` is returned. + /// + /// - Parameter offset: offset value (use negative number to move backwards) + /// - Returns: character at the current position. + @discardableResult + private func next(_ offset: Int = 1) -> ISOChar? { + let next = string.index(cIdx, offsetBy: offset) + guard next < eIdx else { + return nil + } + cIdx = next + return string[cIdx] + } + + /// Read from the current scanner index and parse the value as Int. + /// + /// - Parameter max_count: number of characters to move. If nil scanners continues until a non + /// digit value is encountered. + /// - Returns: parsed value + /// - Throws: throw an exception if parser fails + @discardableResult + private func read_int(_ max_count: Int? = nil) throws -> (count: Int, value: Int) { + var move_idx = cIdx + var count = 0 + while move_idx < eIdx { + if let max = max_count, count >= max { break } + if string[move_idx].isDigit == false { break } + count += 1 + move_idx = string.index(after: move_idx) + } + + let raw_value = String(string[cIdx.. (count: Int, value: Double) { + var move_idx = cIdx + var count = 0 + var fractional_start = false + while move_idx < eIdx { + let char = string[move_idx] + if char == "." || char == "," { + if fractional_start == true { throw ISO8601ParserError.notDouble } else { fractional_start = true } + } else { + if char.isDigit == false { break } + } + count += 1 + move_idx = string.index(after: move_idx) + } + + let raw_value = String(string[cIdx.. Int { + var move_idx = cIdx + var count = 0 + while move_idx < eIdx { + guard string[move_idx] == char else { break } + move_idx = string.index(after: move_idx) + count += 1 + } + cIdx = move_idx + return count + } + + /// Move the current scanner index to the next position until passed `char` value is + /// encountered or `eof` is reached. + /// + /// - Parameter char: char + /// - Returns: the number of characters passed + @discardableResult + private func moveUntil(isNot char: UnicodeScalar) -> Int { + var move_idx = cIdx + var count = 0 + while move_idx < eIdx { + guard string[move_idx] != char else { break } + move_idx = string.index(after: move_idx) + count += 1 + } + cIdx = move_idx + return count + } + + /// Return a date parsed from a valid ISO8601 string + /// + /// - Parameter string: source string + /// - Returns: a valid `Date` object or `nil` if date cannot be parsed + public static func date(from string: String) -> ISOParsedDate? { + guard let parser = ISOParser(string) else { + return nil + } + return (parser.parsedDate, parser.parsedTimeZone) + } + + public static func parse(_ string: String, region: Region?, options: Any?) -> DateInRegion? { + let formatOptions = options as? ISOParser.Options + guard let parser = ISOParser(string, options: formatOptions), + let date = parser.parsedDate else { + return nil + } + let parsedRegion = Region(calendar: region?.calendar ?? Region.ISO.calendar, + zone: (region?.timeZone ?? parser.parsedTimeZone ?? Region.ISO.timeZone), + locale: region?.locale ?? Region.ISO.locale) + return DateInRegion(date, region: parsedRegion) + } + +} diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/RelativeFormatter+Style.swift b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/RelativeFormatter+Style.swift new file mode 100644 index 0000000..976a245 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/RelativeFormatter+Style.swift @@ -0,0 +1,335 @@ +// +// SwiftDate +// Parse, validate, manipulate, and display dates, time and timezones in Swift +// +// Created by Daniele Margutti +// - Web: https://www.danielemargutti.com +// - Twitter: https://twitter.com/danielemargutti +// - Mail: hello@danielemargutti.com +// +// Copyright © 2019 Daniele Margutti. Licensed under MIT License. +// + +import Foundation + +#if os(Linux) +import Glibc +#else +import Darwin +#endif + +// MARK: - Style + +public extension RelativeFormatter { + + enum PluralForm: String { + case zero, one, two, few, many, other + } + + /// Style for formatter + struct Style { + + /// Flavours supported by the style, specified in order. + /// The first available flavour for specified locale is used. + /// If no flavour is available `.long` is used instead (this flavour + /// MUST be part of every lang structure). + public var flavours: [Flavour] + + /// Gradation specify how the unit are evaluated in order to get the + /// best one to represent a given amount of time interval. + /// By default `convenient()` is used. + public var gradation: Gradation = .convenient() + + /// Allowed time units the style can use. Some styles may not include + /// some time units (ie. `.quarter`) because they are not useful for + /// a given representation. + /// If not specified all the following units are set: + /// `.now, .minute, .hour, .day, .week, .month, .year` + public var allowedUnits: [Unit]? + + /// Create a new style. + /// + /// - Parameters: + /// - flavours: flavours of the style. + /// - gradation: gradation rules. + /// - units: allowed units. + public init(flavours: [Flavour], gradation: Gradation, allowedUnits units: [Unit]? = nil) { + self.flavours = flavours + self.gradation = gradation + allowedUnits = (units ?? [.now, .minute, .hour, .day, .week, .month, .year]) + } + } + + /// Return the default style for relative formatter. + /// + /// - Returns: style instance. + static func defaultStyle() -> Style { + return Style(flavours: [.longConvenient, .long], gradation: .convenient()) + } + + /// Return the time-only style for relative formatter. + /// + /// - Returns: style instance. + static func timeStyle() -> Style { + return Style(flavours: [.longTime], gradation: .convenient()) + } + /// Return the twitter style for relative formatter. + /// + /// - Returns: style instance. + static func twitterStyle() -> Style { + return Style(flavours: [.tiny, .shortTime, .narrow, .shortTime], gradation: .twitter()) + } + +} + +// MARK: - Flavour + +public extension RelativeFormatter { + + /// Supported flavours + enum Flavour: String { + case long = "long" + case longTime = "long_time" + case longConvenient = "long_convenient" + case short = "short" + case shortTime = "short_time" + case shortConvenient = "short_convenient" + case narrow = "narrow" + case tiny = "tiny" + case quantify = "quantify" + } + +} + +// MARK: - Gradation + +public extension RelativeFormatter { + + /// Gradation is used to define a set of rules used to get the best + /// representation of a given elapsed time interval (ie. the best + /// representation for 300 seconds is in minutes, 5 minutes specifically). + /// Rules are executed in order by the parser and the best one (< elapsed interval) + /// is returned to be used by the formatter. + struct Gradation { + + /// A single Gradation rule specification + // swiftlint:disable nesting + public struct Rule { + + public enum ThresholdType { + case value(_: Double?) + case function(_: ((TimeInterval) -> (Double?))) + + func evaluateForTimeInterval(_ elapsed: TimeInterval) -> Double? { + switch self { + case .value(let value): return value + case .function(let function): return function(elapsed) + } + } + + } + + public enum RoundingStrategy { + + case regularRound + case ceiling + case flooring + case custom((Double) -> Double) + + func roundValue(_ value: Double) -> Double { + + switch self { + case .regularRound: return round(value) + case .ceiling: return ceil(value) + case .flooring: return floor(value) + case .custom(let roundingFunction): return roundingFunction(value) + } + } + } + + /// The time unit to which the rule refers. + /// It's used to evaluate the factor. + public var unit: Unit + + /// Threhsold value of the unit. When a difference between two dates + /// is less than the threshold the unit before this is the best + /// candidate to represent the time interval. + public var threshold: ThresholdType? + + /// Granuality threshold of the unit + public var granularity: Double? + + /// The rounding strategy that should be used prior to generating the relative time + public var roundingStrategy: RoundingStrategy + + /// Relation with a previous threshold + public var thresholdPrevious: [Unit: Double]? + + /// You can specify a custom formatter for a rule which return the + /// string representation of a data with your own pattern. + // swiftlint:disable nesting + public typealias CustomFormatter = ((DateRepresentable) -> (String)) + public var customFormatter: CustomFormatter? + + /// Create a new rule. + /// + /// - Parameters: + /// - unit: target time unit. + /// - threshold: threshold value. + /// - granularity: granularity value. + /// - prev: relation with a previous rule in gradation lsit. + /// - formatter: custom formatter. + public init(_ unit: Unit, + threshold: ThresholdType?, + granularity: Double? = nil, + roundingStrategy: RoundingStrategy = .regularRound, + prev: [Unit: Double]? = nil, + formatter: CustomFormatter? = nil ) { + self.unit = unit + self.threshold = threshold + self.granularity = granularity + self.roundingStrategy = roundingStrategy + self.thresholdPrevious = prev + self.customFormatter = formatter + } + + } + + /// Gradation rules + var rules: [Rule] + + /// Number of gradation rules + var count: Int { return rules.count } + + /// Subscript by unit. + /// Return the first rule for given unit. + /// + /// - Parameter unit: unit to get. + public subscript(_ unit: Unit) -> Rule? { + return rules.first(where: { $0.unit == unit }) + } + + /// Subscript by index. + /// Return the rule at given index, `nil` if index is invalid. + /// + /// - Parameter index: index + public subscript(_ index: Int) -> Rule? { + guard index < rules.count, index >= 0 else { return nil } + return rules[index] + } + + /// Create a new gradition with a given set of ordered rules. + /// + /// - Parameter rules: ordered rules. + public init(_ rules: [Rule]) { + self.rules = rules + } + + /// Create a new gradation by removing the units from receiver which are not part of the given array. + /// + /// - Parameter units: units to keep. + /// - Returns: a new filtered `Gradation` instance. + public func filtered(byUnits units: [Unit]) -> Gradation { + return Gradation(rules.filter { units.contains($0.unit) }) + } + + /// Canonical gradation rules + public static func canonical() -> Gradation { + return Gradation([ + Rule(.now, threshold: .value(0)), + Rule(.second, threshold: .value(0.5)), + Rule(.minute, threshold: .value(59.5)), + Rule(.hour, threshold: .value(59.5 * 60.0)), + Rule(.day, threshold: .value(23.5 * 60 * 60)), + Rule(.week, threshold: .value(6.5 * Unit.day.factor)), + Rule(.month, threshold: .value(3.5 * 7 * Unit.day.factor)), + Rule(.year, threshold: .value(1.5 * Unit.month.factor)) + ]) + } + + /// Convenient gradation rules + public static func convenient() -> Gradation { + let list = Gradation([ + Rule(.now, threshold: .value(0)), + Rule(.second, threshold: .value(1), prev: [.now: 1]), + Rule(.minute, threshold: .value(45)), + Rule(.minute, threshold: .value(2.5 * 60), granularity: 5), + Rule(.halfHour, threshold: .value(22.5 * 60), granularity: 5), + Rule(.hour, threshold: .value(42.5 * 60), prev: [.minute: 52.5 * 60]), + Rule(.day, threshold: .value((20.5 / 24) * Unit.day.factor)), + Rule(.week, threshold: .value(5.5 * Unit.day.factor)), + Rule(.month, threshold: .value(3.5 * 7 * Unit.day.factor)), + Rule(.year, threshold: .value(10.5 * Unit.month.factor)) + ]) + return list + } + + /// Twitter gradation rules + public static func twitter() -> Gradation { + return Gradation([ + Rule(.now, threshold: .value(0)), + Rule(.second, threshold: .value(1), prev: [.now: 1]), + Rule(.minute, threshold: .value(45)), + Rule(.hour, threshold: .value(59.5 * 60.0)), + Rule(.hour, threshold: .value((1.days.timeInterval - 0.5 * 1.hours.timeInterval))), + Rule(.day, threshold: .value((20.5 / 24) * Unit.day.factor)), + Rule(.other, threshold: .function({ now in + // Jan 1st of the next year. + let nextYear = (Date(timeIntervalSince1970: now) + 1.years).dateAtStartOf(.year) + return (nextYear.timeIntervalSince1970 - now) + }), formatter: { date in // "Apr 11, 2017" + return date.toFormat("MMM dd, yyyy") + }) + ]) + } + + } + +} + +// MARK: - Unit + +public extension RelativeFormatter { + + /// Units for relative formatter + enum Unit: String { + case now = "now" + case second = "second" + case minute = "minute" + case hour = "hour" + case halfHour = "half_hour" + case day = "day" + case week = "week" + case month = "month" + case year = "year" + case quarter = "quarter" + case other = "" + + /// Factor of conversion of the unit to seconds + public var factor: Double { + switch self { + case .now, .second: return 1 + case .minute: return 1.minutes.timeInterval + case .hour: return 1.hours.timeInterval + case .halfHour: return (1.hours.timeInterval * 0.5) + case .day: return 1.days.timeInterval + case .week: return 1.weeks.timeInterval + case .month: return 1.months.timeInterval + case .year: return 1.years.timeInterval + case .quarter: return (91.days.timeInterval + 6.hours.timeInterval) + case .other: return 0 + } + } + + } + +} + +internal extension Double { + + /// Return -1 if number is negative, 1 if positive + var sign: Int { + return (self < 0 ? -1 : 1) + } + +} diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/RelativeFormatter.swift b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/RelativeFormatter.swift new file mode 100644 index 0000000..af5596d --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/RelativeFormatter.swift @@ -0,0 +1,278 @@ +// +// SwiftDate +// Parse, validate, manipulate, and display dates, time and timezones in Swift +// +// Created by Daniele Margutti +// - Web: https://www.danielemargutti.com +// - Twitter: https://twitter.com/danielemargutti +// - Mail: hello@danielemargutti.com +// +// Copyright © 2019 Daniele Margutti. Licensed under MIT License. +// + +import Foundation + +public class RelativeFormatter: DateToStringTrasformable { + + /// Private singleton for relative formatter + private static let shared = RelativeFormatter() + + /// Return all languages supported by the library for relative date formatting + public static var allLanguages: [RelativeFormatterLanguage] { + return RelativeFormatterLanguage.allCases + } + + private init() {} + + /// Return the language table for a specified locale. + /// If not loaded yet a new instance of the table is loaded and cached. + /// + /// - Parameter locale: locale to load + /// - Returns: language table + private func tableForLocale(_ locale: Locale) -> RelativeFormatterLanguage { + let localeId = (locale.collatorIdentifier ?? Locales.english.toLocale().collatorIdentifier!) + + if let lang = RelativeFormatterLanguage(rawValue: localeId) { + return lang + } + + guard let fallbackFlavours = RelativeFormatterLanguage(rawValue: localeId.components(separatedBy: "_").first!) ?? + RelativeFormatterLanguage(rawValue: localeId.components(separatedBy: "-").first!) else { + return tableForLocale(Locales.english.toLocale()) // fallback not found, return english + } + return fallbackFlavours // return fallback + } + + /// Implementation of the protocol for DateToStringTransformable. + public static func format(_ date: DateRepresentable, options: Any?) -> String { + let dateToFormat = (date as? DateInRegion ?? DateInRegion(date.date, region: SwiftDate.defaultRegion)) + return RelativeFormatter.format(date: dateToFormat, style: (options as? Style), locale: date.region.locale) + } + + /// Return relative formatted string result of comparison of two passed dates. + /// + /// - Parameters: + /// - date: date to compare + /// - toDate: date to compare against for (if `nil` current date in the same region of `date` is used) + /// - style: style of the relative formatter. + /// - locale: locale to use; if not passed the `date`'s region locale is used. + /// - Returns: formatted string, empty string if formatting fails + public static func format(date: DateRepresentable, to toDate: DateRepresentable? = nil, + style: Style?, locale fixedLocale: Locale? = nil) -> String { + + let refDate = (toDate ?? date.region.nowInThisRegion()) // a now() date is created if no reference is passed + let options = (style ?? RelativeFormatter.defaultStyle()) // default style if not used + let locale = (fixedLocale ?? date.region.locale) // date's locale is used if no value is forced + + // how much time elapsed (in seconds) + let elapsed = (refDate.date.timeIntervalSince1970 - date.date.timeIntervalSince1970) + + // get first suitable flavour for a given locale + let (flavour, localeData) = suitableFlavour(inList: options.flavours, forLocale: locale) + // get all units which can be represented by the locale data for required style + let allUnits = suitableUnits(inLocaleData: localeData, requiredUnits: options.allowedUnits) + guard allUnits.count > 0 else { + debugPrint("Required units in style were not found in locale spec. Returning empty string") + return "" + } + + guard let suitableRule = ruleToRepresent(timeInterval: abs(elapsed), + referenceInterval: refDate.date.timeIntervalSince1970, + units: allUnits, + gradation: options.gradation) else { + // If no time unit is suitable, just output an empty string. + // E.g. when "now" unit is not available + // and "second" has a threshold of `0.5` + // (e.g. the "canonical" grading scale). + return "" + } + + if let customFormat = suitableRule.customFormatter { + return customFormat(date) + } + + var amount = (abs(elapsed) / suitableRule.unit.factor) + + // Apply granularity to the time amount + // (and fallback to the previous step + // if the first level of granularity + // isn't met by this amount) + if let granularity = suitableRule.granularity { + // Recalculate the elapsed time amount based on granularity + amount = round(amount / granularity) * granularity + } + + let value: Double = -1.0 * Double(elapsed.sign) * suitableRule.roundingStrategy.roundValue(amount) + let formatString = relativeFormat(locale: locale, flavour: flavour, value: value, unit: suitableRule.unit) + return formatString.replacingOccurrences(of: "{0}", with: String(Int(abs(value)))) + } + + private static func relativeFormat(locale: Locale, flavour: Flavour, value: Double, unit: Unit) -> String { + let table = RelativeFormatter.shared.tableForLocale(locale) + guard let styleTable = table.flavours[flavour.rawValue] as? [String: Any] else { + return "" + } + + if let fixedValue = styleTable[unit.rawValue] as? String { + return fixedValue + } + + guard let unitRules = styleTable[unit.rawValue] as? [String: Any] else { + return "" + } + + // Choose either "previous", "past", "current", "next" or "future" based on time `value` sign. + // If "next" is not present, we fallback on "future" + // If "previous" is not present, we fallback on "past" + // If "current" is not present, we fallback on "past" + // If "past" is same as "future" then they're stored as "other". + // If there's only "other" then it's being collapsed. + let quantifierKey: String + + switch value { + case -1 where unitRules["previous"] != nil: // If it is previous value -1, and previous unitRule exist + quantifierKey = "previous" + case 0 where unitRules["current"] != nil: // If it is current value 0, and current unitRule exist + quantifierKey = "current" + case ...0: // If value is up to 0 included, also fallback when current or previous isn't found + quantifierKey = "past" + case 1 where unitRules["next"] != nil: // If it is next value 1, and next unitRule exist + quantifierKey = "next" + case 1...: // If it is future value >0, and fallback if next isn't found + quantifierKey = "future" + default: // Should never happen + fatalError() + } + + if let fixedValue = unitRules[quantifierKey] as? String { + return fixedValue + } else if let quantifierRules = unitRules[quantifierKey] as? [String: Any] { + // plurar/translations forms + // "other" rule is supposed to always be present. + // If only "other" rule is present then "rules" is not an object and is a string. + let quantifier = (table.quantifyKey(forValue: abs(value)) ?? .other).rawValue + if let relativeFormat = quantifierRules[quantifier] as? String { + return relativeFormat + } else { + return quantifierRules[RelativeFormatter.PluralForm.other.rawValue] as? String ?? "" + } + } else { + return "" + } + } + + /// Return the first suitable flavour into the list which is available for a given locale. + /// + /// - Parameters: + /// - flavours: ordered flavours. + /// - locale: locale to use. + /// - Returns: a pair of found flavor and locale table + private static func suitableFlavour(inList flavours: [Flavour], forLocale locale: Locale) -> (flavour: Flavour, locale: [String: Any]) { + let localeData = RelativeFormatter.shared.tableForLocale(locale) // get the locale table + for flavour in flavours { + if let flavourData = localeData.flavours[flavour.rawValue] as? [String: Any] { + return (flavour, flavourData) // found our required flavor in passed locale + } + } + // long must be always present + // swiftlint:disable force_cast + return (.long, localeData.flavours[Flavour.long.rawValue] as! [String: Any]) + } + + /// Return a list of available time units in locale filtered by required units of style. + /// If resulting array if empty there is not any time unit which can be rapresented with given locale + /// so formatting fails. + /// + /// - Parameters: + /// - localeData: local table. + /// - styleUnits: required time units. + /// - Returns: available units. + private static func suitableUnits(inLocaleData localeData: [String: Any], requiredUnits styleUnits: [Unit]?) -> [Unit] { + let localeUnits: [Unit] = localeData.keys.compactMap { Unit(rawValue: $0) } + guard let restrictedStyleUnits = styleUnits else { return localeUnits } // no restrictions + return localeUnits.filter({ restrictedStyleUnits.contains($0) }) + } + + /// Return the best rule in gradation to represent given time interval. + /// + /// - Parameters: + /// - elapsed: elapsed interval to represent + /// - referenceInterval: reference interval + /// - units: units + /// - gradation: gradation + /// - Returns: best rule to represent + private static func ruleToRepresent(timeInterval elapsed: TimeInterval, referenceInterval: TimeInterval, units: [Unit], gradation: Gradation) -> Gradation.Rule? { + // Leave only allowed time measurement units. + // E.g. omit "quarter" unit. + let filteredGradation = gradation.filtered(byUnits: units) + // If no steps of gradation fit the conditions + // then return nothing. + guard gradation.count > 0 else { + return nil + } + + // Find the most appropriate gradation step + let i = findGradationStep(elapsed: elapsed, now: referenceInterval, gradation: filteredGradation) + guard i >= 0 else { + return nil + } + let step = filteredGradation[i]! + + // Apply granularity to the time amount + // (and fall back to the previous step + // if the first level of granularity + // isn't met by this amount) + if let granurality = step.granularity { + // Recalculate the elapsed time amount based on granularity + let amount = round( (elapsed / step.unit.factor) / granurality) * granurality + + // If the granularity for this step + // is too high, then fallback + // to the previous step of gradation. + // (if there is any previous step of gradation) + if amount == 0 && i > 0 { + return filteredGradation[i - 1] + } + } + return step + } + + private static func findGradationStep(elapsed: TimeInterval, now: TimeInterval, gradation: Gradation, step: Int = 0) -> Int { + // If the threshold for moving from previous step + // to this step is too high then return the previous step. + let fromGradation = gradation[step - 1] + let currentGradation = gradation[step]! + let thresholdValue = threshold(from: fromGradation, to: currentGradation, now: now) + + if let t = thresholdValue, elapsed < t { + return step - 1 + } + + // If it's the last step of gradation then return it. + if step == (gradation.count - 1) { + return step + } + // Move to the next step. + return findGradationStep(elapsed: elapsed, now: now, gradation: gradation, step: step + 1) + } + + /// Evaluate threshold. + private static func threshold(from fromRule: Gradation.Rule?, to toRule: Gradation.Rule, now: TimeInterval) -> Double? { + var threshold: Double? + + // Allows custom thresholds when moving + // from a specific step to a specific step. + if let fromStepUnit = fromRule?.unit { + threshold = toRule.thresholdPrevious?[fromStepUnit] + } + + // If no custom threshold is set for this transition + // then use the usual threshold for the next step. + if threshold == nil { + threshold = toRule.threshold?.evaluateForTimeInterval(now) + } + + return threshold + } + +} diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/RelativeFormatterLanguage.swift b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/RelativeFormatterLanguage.swift new file mode 100644 index 0000000..ffc36f7 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/RelativeFormatterLanguage.swift @@ -0,0 +1,421 @@ +// +// SwiftDate +// Parse, validate, manipulate, and display dates, time and timezones in Swift +// +// Created by Daniele Margutti +// - Web: https://www.danielemargutti.com +// - Twitter: https://twitter.com/danielemargutti +// - Mail: hello@danielemargutti.com +// +// Copyright © 2019 Daniele Margutti. Licensed under MIT License. +// + +import Foundation + +internal class RelativeFormatterLanguagesCache { + + static let shared = RelativeFormatterLanguagesCache() + + private(set) var cachedValues = [String: [String: Any]]() + + func flavoursForLocaleID(_ langID: String) -> [String: Any]? { + do { + guard let fullURL = Bundle(for: RelativeFormatter.self).resourceURL?.appendingPathComponent("langs/\(langID).json") else { + return nil + } + let data = try Data(contentsOf: fullURL) + let json = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) + + if let value = json as? [String: Any] { + cachedValues[langID] = value + return value + } else { + return nil + } + + } catch { + debugPrint("Failed to read data for language id: \(langID)") + return nil + } + } +} + +public enum RelativeFormatterLanguage: String, CaseIterable { + case af = "af" // Locales.afrikaans + case am = "am" // Locales.amharic + case ar_AE = "ar_AE" // Locales.arabicUnitedArabEmirates + case ar = "ar" // Locales.arabic + case `as` = "as" // Locales.assamese + case az = "az" // Locales.assamese + case be = "be" // Locales.belarusian + case bg = "bg" // Locales.bulgarian + case bn = "bn" // Locales.bengali + case br = "br" // Locales.breton + case bs = "bs" // Locales.bosnian + case bs_Cyrl = "bs-Cyrl" // Locales.belarusian + case ca = "ca" // Locales.catalan + case cz = "cz" // Locales.czech + case cy = "cy" // Locales.welsh + case cs = "cs" // Locales.czech + case da = "da" // Locales.danish + case de = "de" // Locales.dutch + case dsb = "dsb" // Locales.lowerSorbian + case dz = "dz" // Locales.dzongkha + case ee = "ee" // Locales.ewe + case el = "el" // Locales.greek + case en = "en" // Locales.english + case es_AR = "es_AR" // Locales.spanishArgentina + case es_PY = "es_PY" // Locales.spanishParaguay + case es_MX = "es_MX" // Locales.spanishMexico + case es_US = "es_US" // Locales.spanishUnitedStates + case es = "es" // Locales.spanish + case et = "et" // Locales.estonian + case eu = "eu" // Locales.basque + case fa = "fa" // Locales.persian + case fi = "fi" // Locales.finnish + case fil = "fil" // Locales.filipino + case fo = "fo" // Locales.faroese + case fr_CA = "fr_CA" // French (Canada) + case fr = "fr" // French + case fur = "fur" // Friulian + case fy = "fy" // Western Frisian + case ga = "ga" // Irish + case gd = "gd" // Scottish Gaelic + case gl = "gl" // Galician + case gu = "gu" // Gujarati + case he = "he" // Hebrew + case hi = "hi" // Hindi + case hr = "hr" // Croatian + case hsb = "hsb" // Upper Sorbian + case hu = "hu" // Hungarian + case hy = "hy" // Armenian + case id = "id" // Indonesian + case `is` = "is" // Icelandic + case it = "it" // Locales.italian + case ja = "ja" // Japanese + case jgo = "jgo" // Ngomba + case ka = "ka" // Georgian + case kea = "kea" // Kabuverdianu + case kk = "kk" // Kazakh + case kl = "kl" // Kalaallisut + case km = "km" // Khmer + case kn = "kn" // Kannada + case ko = "ko" // Korean + case kok = "kok" // Konkani + case ksh = "ksh" // Colognian + case ky = "ky" // Kyrgyz + case lb = "lb" // Luxembourgish + case lkt = "lkt" // Lakota + case lo = "lo" // Lao + case lt = "lt" // Lithuanian + case lv = "lv" // Latvian + case mk = "mk" // Macedonian + case ml = "ml" // Malayalam + case mn = "mn" // Mongolian + case mr = "mr" // Marathi + case ms = "ms" // Malay + case mt = "mt" // Maltese + case my = "my" // Burmese + case mzn = "mzn" // Mazanderani + case nb = "nb" // Norwegian Bokmål + case ne = "ne" // Nepali + case nl = "nl" // Netherland + case nn = "nn" // Norwegian Nynorsk + case or = "or" // Odia + case pa = "pa" // Punjabi + case pl = "pl" // Polish + case ps = "ps" // Pashto + case pt = "pt" // Portuguese + case ro = "ro" // Romanian + case ru = "ru" // Russian + case sah = "sah" // Sakha + case sd = "sd" // Sindhi + case se_FI = "se_FI" // Northern Sami (Finland) + case se = "se" // Northern Sami + case si = "si" // Sinhala + case sk = "sk" // Slovak + case sl = "sl" // Slovenian + case sq = "sq" // Albanian + case sr_Latn = "sr_Latn" // Serbian (Latin) + case sr = "sr" // Serbian + case sv = "sv" // Swedish + case sw = "sw" // Swedish + case ta = "ta" // Tamil + case te = "te" // Telugu + case th = "th" // Thai + case ti = "ti" // Tigrinya + case tk = "tk" // Turkmen + case to = "to" // Tongan + case tr = "tr" // Turkish + case ug = "ug" // Uyghur + case uk = "uk" // Ukrainian + case ur_IN = "ur_IN" // Urdu (India) + case ur = "ur" // Urdu + case uz_Cyrl = "uz_Cyrl" // Uzbek (Cyrillic) + case uz = "uz" // Uzbek (Cyrillic) + case vi = "vi" // Vietnamese + case wae = "wae" // Walser + case yue_Hans = "yue_Hans" // Cantonese (Simplified) + case yue_Hant = "yue_Hant" // Cantonese (Traditional) + case zh_Hans_HK = "zh_Hans_HK" // Chinese (Simplified, Hong Kong [China]) + case zh_Hans_MO = "zh_Hans_MO" // Chinese (Simplified, Macau [China]) + case zh_Hans_SG = "zh_Hans_SG" // Chinese (Simplified, Singapore) + case zh_Hant_HK = "zh_Hant_HK" // Chinese (Traditional, Hong Kong [China]) + case zh_Hant_MO = "zh_Hant_MO" // Chinese (Traditional, Macau [China]) + case zh_Hans = "zh_Hans" // Chinese (Simplified) + case zh_Hant = "zh_Hant" // Chinese (Traditional) + case zh = "zh" // Chinese + case zu = "zu" // Zulu + + /// Table with the data of the language. + /// Data is structured in: + /// { flavour: { unit : { data } } } + public var flavours: [String: Any] { + return RelativeFormatterLanguagesCache.shared.flavoursForLocaleID(self.rawValue) ?? [:] + } + + public var identifier: String { + return self.rawValue + } + + public func quantifyKey(forValue value: Double) -> RelativeFormatter.PluralForm? { + switch self { + + case .sr_Latn, .sr, .uk: + let mod10 = Int(value) % 10 + let mod100 = Int(value) % 100 + + switch mod10 { + case 1: + switch mod100 { + case 11: + break + default: + return .one + } + case 2, 3, 4: + switch mod100 { + case 12, 13, 14: + break + default: + return .few + } + default: + break + } + + return .many + + case .ru, .sk, .sl: + let mod10 = Int(value) % 10 + let mod100 = Int(value) % 100 + + switch mod100 { + case 11...14: + break + + default: + switch mod10 { + case 1: + return .one + case 2...4: + return .few + default: + break + } + + } + return .many + + case .ro: + let mod100 = Int(value) % 100 + + switch value { + case 0: + return .few + case 1: + return .one + default: + if mod100 > 1 && mod100 <= 19 { + return .few + } + } + + return .other + + case .pa: + switch value { + case 0, 1: + return .one + default: + return .other + } + + case .mt: + switch value { + case 1: return .one + case 0: return .few + case 2...10: return .few + case 11...19: return .many + default: return .other + } + + case .lt, .lv: + let mod10 = Int(value) % 10 + let mod100 = Int(value) % 100 + + if value == 0 { + return .zero + } + + if value == 1 { + return .one + } + + switch mod10 { + case 1: + if mod100 != 11 { + return .one + } + return .many + default: + return .many + } + + case .ksh, .se: + switch value { + case 0: return .zero + case 1: return .one + default: return .other + } + + case .`is`: + let mod10 = Int(value) % 10 + let mod100 = Int(value) % 100 + + if value == 0 { + return .zero + } + + if value == 1 { + return .one + } + + switch mod10 { + case 1: + if mod100 != 11 { + return .one + } + default: + break + } + + return .many + + case .id, .ja, .ms, .my, .mzn, .sah, .se_FI, .si, .th, .yue_Hans, .yue_Hant, + .zh_Hans_HK, .zh_Hans_MO, .zh_Hans_SG, .zh_Hant_HK, .zh_Hant_MO, .zh: + + return .other + + case .hy: + return (value >= 0 && value < 2 ? .one : .other) + + case .ga, .gd: + switch Int(value) { + case 1: return .one + case 2: return .two + case 3...6: return .few + case 7...10: return .many + default: return .other + } + + case .fr_CA, .fr: + return (value >= 0 && value < 2 ? .one : .other) + + case .dz, .kea, .ko, .kok, .lkt, .lo: + return nil + + case .cs: // Locales.czech + switch value { + case 1: + return .one + case 2, 3, 4: + return .few + default: + return .other + } + + case .cy: + switch value { + case 0: return .zero + case 1: return .one + case 2: return .two + case 3: return .few + case 6: return .many + default: return .other + } + + case .cz, .dsb: + switch value { + case 1: + return .one + case 2, 3, 4: + return .few + default: + return .other + } + + case .br: + let n = Int(value) + return n % 10 == 1 && n % 100 != 11 && n % 100 != 71 && n % 100 != 91 ? .zero : n % 10 == 2 && n % 100 != 12 && n % 100 != 72 && n % 100 != 92 ? .one : (n % 10 == 3 || n % 10 == 4 || n % 10 == 9) && n % 100 != 13 && n % 100 != 14 && n % 100 != 19 && n % 100 != 73 && n % 100 != 74 && n % 100 != 79 && n % 100 != 93 && n % 100 != 94 && n % 100 != 99 ? .two : n % 1_000_000 == 0 && n != 0 ? .many : .other + + case .be, .bs, .bs_Cyrl, .hr, .hsb, .pl: + let mod10 = Int(value) % 10 + let mod100 = Int(value) % 100 + + switch mod10 { + case 1: + switch mod100 { + case 11: + break + default: + return .one + } + case 2, 3, 4: + switch mod100 { + case 12, 13, 14: + break + default: + return .few + } + default: + break + } + return .many + + case .ar, .ar_AE, .he: + switch value { + case 0: return .zero + case 1: return .one + case 2: return .two + default: + let mod100 = Int(value) % 100 + if mod100 >= 3 && mod100 <= 10 { + return .few + } else if mod100 >= 11 { + return .many + } else { + return .other + } + } + + case .am, .bn, .fa, .gu, .kn, .mr, .zu: + return (value >= 0 && value <= 1 ? .one : .other) + + default: + return (value == 1 ? .one : .other) + + } + } + +} diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/af.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/af.json new file mode 100644 index 0000000..bbb28b2 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/af.json @@ -0,0 +1,209 @@ +{ + "narrow" : { + "quarter" : { + "previous" : "vorige kwartaal", + "current" : "hierdie kwartaal", + "next" : "volgende kwartaal", + "past" : "{0} kwartale gelede", + "future" : "oor {0} kwartale" + }, + "month" : { + "past" : "{0} md. gelede", + "next" : "volgende maand", + "future" : "oor {0} md.", + "previous" : "verlede maand", + "current" : "vandeesmaand" + }, + "now" : "nou", + "hour" : { + "future" : "oor {0} uur", + "past" : "{0} uur gelede", + "current" : "hierdie uur" + }, + "minute" : { + "past" : "{0} min. gelede", + "current" : "hierdie minuut", + "future" : "oor {0} min." + }, + "day" : { + "previous" : "gister", + "future" : { + "one" : "oor {0} dag", + "other" : "oor {0} dae" + }, + "past" : { + "one" : "{0} dag gelede", + "other" : "{0} dae gelede" + }, + "current" : "vandag", + "next" : "môre" + }, + "year" : { + "next" : "volgende jaar", + "past" : "{0} jaar gelede", + "future" : "oor {0} jaar", + "previous" : "verlede jaar", + "current" : "hierdie jaar" + }, + "week" : { + "next" : "volgende week", + "previous" : "verlede week", + "past" : "{0} w. gelede", + "future" : "oor {0} w.", + "current" : "vandeesweek" + }, + "second" : { + "future" : "oor {0} sek.", + "current" : "nou", + "past" : "{0} sek. gelede" + } + }, + "short" : { + "minute" : { + "future" : "oor {0} min.", + "current" : "hierdie minuut", + "past" : "{0} min. gelede" + }, + "month" : { + "current" : "vandeesmaand", + "past" : "{0} md. gelede", + "future" : "oor {0} md.", + "next" : "volgende maand", + "previous" : "verlede maand" + }, + "week" : { + "current" : "vandeesweek", + "past" : "{0} w. gelede", + "future" : "oor {0} w.", + "next" : "volgende week", + "previous" : "verlede week" + }, + "hour" : { + "future" : "oor {0} uur", + "current" : "hierdie uur", + "past" : "{0} uur gelede" + }, + "day" : { + "next" : "môre", + "current" : "vandag", + "previous" : "gister", + "past" : { + "one" : "{0} dag gelede", + "other" : "{0} dae gelede" + }, + "future" : { + "one" : "oor {0} dag", + "other" : "oor {0} dae" + } + }, + "second" : { + "future" : "oor {0} sek.", + "current" : "nou", + "past" : "{0} sek. gelede" + }, + "now" : "nou", + "year" : { + "current" : "hierdie jaar", + "future" : "oor {0} jaar", + "past" : "{0} jaar gelede", + "next" : "volgende jaar", + "previous" : "verlede jaar" + }, + "quarter" : { + "current" : "hierdie kwartaal", + "future" : { + "one" : "oor {0} kwartaal", + "other" : "oor {0} kwartale" + }, + "previous" : "vorige kwartaal", + "next" : "volgende kwartaal", + "past" : { + "other" : "{0} kwartale gelede", + "one" : "{0} kwartaal gelede" + } + } + }, + "long" : { + "day" : { + "previous" : "gister", + "past" : { + "one" : "{0} dag gelede", + "other" : "{0} dae gelede" + }, + "future" : { + "other" : "oor {0} dae", + "one" : "oor {0} dag" + }, + "next" : "môre", + "current" : "vandag" + }, + "hour" : { + "current" : "hierdie uur", + "future" : "oor {0} uur", + "past" : "{0} uur gelede" + }, + "month" : { + "next" : "volgende maand", + "current" : "vandeesmaand", + "past" : { + "one" : "{0} maand gelede", + "other" : "{0} maande gelede" + }, + "previous" : "verlede maand", + "future" : "oor {0} minuut" + }, + "quarter" : { + "next" : "volgende kwartaal", + "past" : { + "one" : "{0} kwartaal gelede", + "other" : "{0} kwartale gelede" + }, + "previous" : "vorige kwartaal", + "current" : "hierdie kwartaal", + "future" : { + "one" : "oor {0} kwartaal", + "other" : "oor {0} kwartale" + } + }, + "year" : { + "previous" : "verlede jaar", + "current" : "hierdie jaar", + "next" : "volgende jaar", + "past" : "{0} jaar gelede", + "future" : "oor {0} jaar" + }, + "minute" : { + "past" : { + "other" : "{0} minute gelede", + "one" : "{0} minuut gelede" + }, + "future" : "oor {0} minuut", + "current" : "hierdie minuut" + }, + "second" : { + "current" : "nou", + "future" : { + "one" : "oor {0} sekonde", + "other" : "oor {0} sekondes" + }, + "past" : { + "other" : "{0} sekondes gelede", + "one" : "{0} sekonde gelede" + } + }, + "week" : { + "future" : { + "other" : "oor {0} weke", + "one" : "oor {0} week" + }, + "previous" : "verlede week", + "current" : "vandeesweek", + "next" : "volgende week", + "past" : { + "one" : "{0} week gelede", + "other" : "{0} weke gelede" + } + }, + "now" : "nou" + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/am.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/am.json new file mode 100644 index 0000000..3bc65b9 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/am.json @@ -0,0 +1,248 @@ +{ + "short" : { + "month" : { + "previous" : "ያለፈው ወር", + "current" : "በዚህ ወር", + "next" : "የሚቀጥለው ወር", + "past" : "ከ{0} ወራት በፊት", + "future" : "በ{0} ወራት ውስጥ" + }, + "now" : "አሁን", + "day" : { + "next" : "ነገ", + "current" : "ዛሬ", + "previous" : "ትላንትና", + "past" : { + "other" : "ከ{0} ቀኖች በፊት", + "one" : "ከ {0} ቀን በፊት" + }, + "future" : { + "other" : "በ{0} ቀኖች ውስጥ", + "one" : "በ{0} ቀን ውስጥ" + } + }, + "year" : { + "current" : "በዚህ ዓመት", + "future" : "በ{0} ዓመታት ውስጥ", + "previous" : "ያለፈው ዓመት", + "next" : "የሚቀጥለው ዓመት", + "past" : "ከ{0} ዓመታት በፊት" + }, + "hour" : { + "past" : { + "one" : "ከ{0} ሰዓት በፊት", + "other" : "ከ{0} ሰዓቶች በፊት" + }, + "future" : { + "one" : "በ{0} ሰዓት ውስጥ", + "other" : "በ{0} ሰዓቶች ውስጥ" + }, + "current" : "ይህ ሰዓት" + }, + "minute" : { + "current" : "ይህ ደቂቃ", + "future" : { + "other" : "በ{0} ደቂቃዎች ውስጥ", + "one" : "በ{0} ደቂቃ ውስጥ" + }, + "past" : { + "other" : "ከ{0} ደቂቃዎች በፊት", + "one" : "ከ{0} ደቂቃ በፊት" + } + }, + "second" : { + "current" : "አሁን", + "future" : { + "other" : "በ{0} ሰከንዶች ውስጥ", + "one" : "በ{0} ሰከንድ ውስጥ" + }, + "past" : { + "one" : "ከ{0} ሰከንድ በፊት", + "other" : "ከ{0} ሰከንዶች በፊት" + } + }, + "quarter" : { + "future" : "+{0} ሩብ", + "previous" : "የመጨረሻው ሩብ", + "next" : "የሚቀጥለው ሩብ", + "past" : "{0} ሩብ በፊት", + "current" : "ይህ ሩብ" + }, + "week" : { + "next" : "የሚቀጥለው ሳምንት", + "past" : "ከ{0} ሳምንታት በፊት", + "current" : "በዚህ ሣምንት", + "previous" : "ባለፈው ሳምንት", + "future" : "በ{0} ሳምንታት ውስጥ" + } + }, + "narrow" : { + "now" : "አሁን", + "year" : { + "current" : "በዚህ ዓመት", + "next" : "የሚቀጥለው ዓመት", + "past" : "ከ{0} ዓመታት በፊት", + "future" : "በ{0} ዓመታት ውስጥ", + "previous" : "ያለፈው ዓመት" + }, + "day" : { + "past" : { + "other" : "ከ{0} ቀኖች በፊት", + "one" : "ከ {0} ቀን በፊት" + }, + "future" : { + "one" : "በ{0} ቀን ውስጥ", + "other" : "በ{0} ቀኖች ውስጥ" + }, + "next" : "ነገ", + "current" : "ዛሬ", + "previous" : "ትላንትና" + }, + "month" : { + "current" : "በዚህ ወር", + "future" : "በ{0} ወራት ውስጥ", + "next" : "የሚቀጥለው ወር", + "past" : "ከ{0} ወራት በፊት", + "previous" : "ያለፈው ወር" + }, + "second" : { + "future" : { + "one" : "በ{0} ሰከንድ ውስጥ", + "other" : "በ{0} ሰከንዶች ውስጥ" + }, + "current" : "አሁን", + "past" : { + "one" : "ከ{0} ሰከንድ በፊት", + "other" : "ከ{0} ሰከንዶች በፊት" + } + }, + "minute" : { + "future" : { + "one" : "በ{0} ደቂቃ ውስጥ", + "other" : "በ{0} ደቂቃዎች ውስጥ" + }, + "current" : "ይህ ደቂቃ", + "past" : { + "one" : "ከ{0} ደቂቃ በፊት", + "other" : "ከ{0} ደቂቃዎች በፊት" + } + }, + "week" : { + "future" : "በ{0} ሳምንታት ውስጥ", + "next" : "የሚቀጥለው ሳምንት", + "previous" : "ባለፈው ሳምንት", + "past" : "ከ{0} ሳምንታት በፊት", + "current" : "በዚህ ሣምንት" + }, + "quarter" : { + "future" : "+{0} ሩብ", + "current" : "ይህ ሩብ", + "past" : "{0} ሩብ በፊት", + "previous" : "የመጨረሻው ሩብ", + "next" : "የሚቀጥለው ሩብ" + }, + "hour" : { + "current" : "ይህ ሰዓት", + "past" : { + "one" : "ከ{0} ሰዓት በፊት", + "other" : "ከ{0} ሰዓቶች በፊት" + }, + "future" : { + "other" : "በ{0} ሰዓቶች ውስጥ", + "one" : "በ{0} ሰዓት ውስጥ" + } + } + }, + "long" : { + "now" : "አሁን", + "minute" : { + "current" : "ይህ ደቂቃ", + "future" : { + "one" : "በ{0} ደቂቃ ውስጥ", + "other" : "በ{0} ደቂቃዎች ውስጥ" + }, + "past" : { + "one" : "ከ{0} ደቂቃ በፊት", + "other" : "ከ{0} ደቂቃዎች በፊት" + } + }, + "year" : { + "past" : { + "other" : "ከ{0} ዓመታት በፊት", + "one" : "ከ{0} ዓመት በፊት" + }, + "previous" : "ያለፈው ዓመት", + "current" : "በዚህ ዓመት", + "next" : "የሚቀጥለው ዓመት", + "future" : "በ{0} ዓመታት ውስጥ" + }, + "hour" : { + "current" : "ይህ ሰዓት", + "future" : { + "one" : "በ{0} ሰዓት ውስጥ", + "other" : "በ{0} ሰዓቶች ውስጥ" + }, + "past" : { + "one" : "ከ{0} ሰዓት በፊት", + "other" : "ከ{0} ሰዓቶች በፊት" + } + }, + "second" : { + "current" : "አሁን", + "past" : { + "one" : "ከ{0} ሰከንድ በፊት", + "other" : "ከ{0} ሰከንዶች በፊት" + }, + "future" : { + "other" : "በ{0} ሰከንዶች ውስጥ", + "one" : "በ{0} ሰከንድ ውስጥ" + } + }, + "day" : { + "previous" : "ትናንት", + "current" : "ዛሬ", + "future" : { + "other" : "በ{0} ቀናት ውስጥ", + "one" : "በ{0} ቀን ውስጥ" + }, + "past" : { + "one" : "ከ{0} ቀን በፊት", + "other" : "ከ{0} ቀናት በፊት" + }, + "next" : "ነገ" + }, + "month" : { + "previous" : "ያለፈው ወር", + "current" : "በዚህ ወር", + "next" : "የሚቀጥለው ወር", + "future" : { + "one" : "በ{0} ወር ውስጥ", + "other" : "በ{0} ወራት ውስጥ" + }, + "past" : { + "other" : "ከ{0} ወራት በፊት", + "one" : "ከ{0} ወር በፊት" + } + }, + "quarter" : { + "next" : "የሚቀጥለው ሩብ", + "current" : "ይህ ሩብ", + "past" : "{0} ሩብ በፊት", + "future" : "+{0} ሩብ", + "previous" : "የመጨረሻው ሩብ" + }, + "week" : { + "future" : { + "one" : "በ{0} ሳምንት ውስጥ", + "other" : "በ{0} ሳምንታት ውስጥ" + }, + "current" : "በዚህ ሳምንት", + "next" : "የሚቀጥለው ሳምንት", + "previous" : "ያለፈው ሳምንት", + "past" : { + "other" : "ከ{0} ሳምንታት በፊት", + "one" : "ከ{0} ሳምንት በፊት" + } + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ar.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ar.json new file mode 100644 index 0000000..db62c90 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ar.json @@ -0,0 +1,419 @@ +{ + "narrow" : { + "second" : { + "past" : { + "other" : "قبل {0} ثانية", + "one" : "قبل ثانية واحدة", + "two" : "قبل ثانيتين", + "few" : "قبل {0} ثوانٍ" + }, + "current" : "الآن", + "future" : { + "two" : "خلال ثانيتين", + "one" : "خلال ثانية واحدة", + "other" : "خلال {0} ثانية", + "few" : "خلال {0} ثوانٍ" + } + }, + "week" : { + "past" : { + "one" : "قبل أسبوع واحد", + "few" : "قبل {0} أسابيع", + "two" : "قبل أسبوعين", + "many" : "قبل {0} أسبوعًا", + "other" : "قبل {0} أسبوع" + }, + "previous" : "الأسبوع الماضي", + "future" : { + "one" : "خلال أسبوع واحد", + "many" : "خلال {0} أسبوعًا", + "other" : "خلال {0} أسبوع", + "two" : "خلال أسبوعين", + "few" : "خلال {0} أسابيع" + }, + "current" : "هذا الأسبوع", + "next" : "الأسبوع القادم" + }, + "day" : { + "current" : "اليوم", + "next" : "غدًا", + "past" : { + "one" : "قبل يوم واحد", + "many" : "قبل {0} يومًا", + "other" : "قبل {0} يوم", + "few" : "قبل {0} أيام", + "two" : "قبل يومين" + }, + "previous" : "أمس", + "future" : { + "two" : "خلال يومين", + "few" : "خلال {0} أيام", + "other" : "خلال {0} يوم", + "one" : "خلال يوم واحد", + "many" : "خلال {0} يومًا" + } + }, + "hour" : { + "past" : { + "two" : "قبل ساعتين", + "other" : "قبل {0} ساعة", + "few" : "قبل {0} ساعات", + "one" : "قبل ساعة واحدة" + }, + "current" : "الساعة الحالية", + "future" : { + "few" : "خلال {0} ساعات", + "other" : "خلال {0} ساعة", + "one" : "خلال ساعة واحدة", + "two" : "خلال ساعتين" + } + }, + "year" : { + "past" : { + "two" : "قبل سنتين", + "other" : "قبل {0} سنة", + "few" : "قبل {0} سنوات", + "one" : "قبل سنة واحدة" + }, + "previous" : "السنة الماضية", + "next" : "السنة القادمة", + "future" : { + "one" : "خلال سنة واحدة", + "two" : "خلال سنتين", + "other" : "خلال {0} سنة", + "few" : "خلال {0} سنوات" + }, + "current" : "السنة الحالية" + }, + "quarter" : { + "next" : "الربع القادم", + "future" : { + "other" : "خلال {0} ربع سنة", + "one" : "خلال ربع سنة واحد", + "few" : "خلال {0} أرباع سنة", + "two" : "خلال ربعي سنة" + }, + "previous" : "الربع الأخير", + "current" : "هذا الربع", + "past" : { + "one" : "قبل ربع سنة واحد", + "other" : "قبل {0} ربع سنة", + "two" : "قبل ربعي سنة", + "few" : "قبل {0} أرباع سنة" + } + }, + "month" : { + "past" : { + "few" : "قبل {0} أشهر", + "many" : "قبل {0} شهرًا", + "other" : "قبل {0} شهر", + "one" : "قبل شهر واحد", + "two" : "قبل شهرين" + }, + "next" : "الشهر القادم", + "current" : "هذا الشهر", + "previous" : "الشهر الماضي", + "future" : { + "many" : "خلال {0} شهرًا", + "two" : "خلال شهرين", + "other" : "خلال {0} شهر", + "one" : "خلال شهر واحد", + "few" : "خلال {0} أشهر" + } + }, + "now" : "الآن", + "minute" : { + "future" : { + "two" : "خلال دقيقتين", + "few" : "خلال {0} دقائق", + "other" : "خلال {0} دقيقة", + "one" : "خلال دقيقة واحدة" + }, + "past" : { + "one" : "قبل دقيقة واحدة", + "few" : "قبل {0} دقائق", + "other" : "قبل {0} دقيقة", + "two" : "قبل دقيقتين" + }, + "current" : "هذه الدقيقة" + } + }, + "long" : { + "now" : "الآن", + "day" : { + "current" : "اليوم", + "previous" : "أمس", + "next" : "غدًا", + "past" : { + "one" : "قبل يوم واحد", + "two" : "قبل يومين", + "many" : "قبل {0} يومًا", + "few" : "قبل {0} أيام", + "other" : "قبل {0} يوم" + }, + "future" : { + "two" : "خلال يومين", + "many" : "خلال {0} يومًا", + "few" : "خلال {0} أيام", + "one" : "خلال يوم واحد", + "other" : "خلال {0} يوم" + } + }, + "month" : { + "future" : { + "few" : "خلال {0} أشهر", + "many" : "خلال {0} شهرًا", + "other" : "خلال {0} شهر", + "one" : "خلال شهر واحد", + "two" : "خلال شهرين" + }, + "past" : { + "two" : "قبل شهرين", + "few" : "قبل {0} أشهر", + "one" : "قبل شهر واحد", + "many" : "قبل {0} شهرًا", + "other" : "قبل {0} شهر" + }, + "current" : "هذا الشهر", + "previous" : "الشهر الماضي", + "next" : "الشهر القادم" + }, + "minute" : { + "future" : { + "two" : "خلال دقيقتين", + "few" : "خلال {0} دقائق", + "other" : "خلال {0} دقيقة", + "one" : "خلال دقيقة واحدة" + }, + "past" : { + "two" : "قبل دقيقتين", + "other" : "قبل {0} دقيقة", + "few" : "قبل {0} دقائق", + "one" : "قبل دقيقة واحدة" + }, + "current" : "هذه الدقيقة" + }, + "second" : { + "future" : { + "two" : "خلال ثانيتين", + "other" : "خلال {0} ثانية", + "one" : "خلال ثانية واحدة", + "few" : "خلال {0} ثوانٍ" + }, + "current" : "الآن", + "past" : { + "two" : "قبل ثانيتين", + "one" : "قبل ثانية واحدة", + "other" : "قبل {0} ثانية", + "few" : "قبل {0} ثوانِ" + } + }, + "hour" : { + "current" : "الساعة الحالية", + "past" : { + "few" : "قبل {0} ساعات", + "other" : "قبل {0} ساعة", + "one" : "قبل ساعة واحدة", + "two" : "قبل ساعتين" + }, + "future" : { + "other" : "خلال {0} ساعة", + "one" : "خلال ساعة واحدة", + "two" : "خلال ساعتين", + "few" : "خلال {0} ساعات" + } + }, + "year" : { + "previous" : "السنة الماضية", + "future" : { + "one" : "خلال سنة واحدة", + "two" : "خلال سنتين", + "few" : "خلال {0} سنوات", + "other" : "خلال {0} سنة" + }, + "current" : "السنة الحالية", + "next" : "السنة القادمة", + "past" : { + "one" : "قبل سنة واحدة", + "other" : "قبل {0} سنة", + "two" : "قبل سنتين", + "few" : "قبل {0} سنوات" + } + }, + "quarter" : { + "current" : "هذا الربع", + "past" : { + "other" : "قبل {0} ربع سنة", + "two" : "قبل ربعي سنة", + "few" : "قبل {0} أرباع سنة", + "one" : "قبل ربع سنة واحد" + }, + "future" : { + "two" : "خلال ربعي سنة", + "few" : "خلال {0} أرباع سنة", + "other" : "خلال {0} ربع سنة", + "one" : "خلال ربع سنة واحد" + }, + "next" : "الربع القادم", + "previous" : "الربع الأخير" + }, + "week" : { + "next" : "الأسبوع القادم", + "current" : "هذا الأسبوع", + "past" : { + "one" : "قبل أسبوع واحد", + "many" : "قبل {0} أسبوعًا", + "two" : "قبل أسبوعين", + "other" : "قبل {0} أسبوع", + "few" : "قبل {0} أسابيع" + }, + "future" : { + "other" : "خلال {0} أسبوع", + "two" : "خلال أسبوعين", + "few" : "خلال {0} أسابيع", + "one" : "خلال أسبوع واحد", + "many" : "خلال {0} أسبوعًا" + }, + "previous" : "الأسبوع الماضي" + } + }, + "short" : { + "now" : "الآن", + "year" : { + "current" : "السنة الحالية", + "past" : { + "few" : "قبل {0} سنوات", + "two" : "قبل سنتين", + "other" : "قبل {0} سنة", + "one" : "قبل سنة واحدة" + }, + "previous" : "السنة الماضية", + "next" : "السنة القادمة", + "future" : { + "few" : "خلال {0} سنوات", + "one" : "خلال سنة واحدة", + "two" : "خلال سنتين", + "other" : "خلال {0} سنة" + } + }, + "quarter" : { + "past" : { + "two" : "قبل ربعي سنة", + "few" : "قبل {0} أرباع سنة", + "other" : "قبل {0} ربع سنة", + "one" : "قبل ربع سنة واحد" + }, + "next" : "الربع القادم", + "previous" : "الربع الأخير", + "current" : "هذا الربع", + "future" : { + "few" : "خلال {0} أرباع سنة", + "one" : "خلال ربع سنة واحد", + "other" : "خلال {0} ربع سنة", + "two" : "خلال ربعي سنة" + } + }, + "second" : { + "past" : { + "few" : "قبل {0} ثوانٍ", + "other" : "قبل {0} ثانية", + "one" : "قبل ثانية واحدة", + "two" : "قبل ثانيتين" + }, + "future" : { + "one" : "خلال ثانية واحدة", + "two" : "خلال ثانيتين", + "few" : "خلال {0} ثوانٍ", + "other" : "خلال {0} ثانية" + }, + "current" : "الآن" + }, + "hour" : { + "current" : "الساعة الحالية", + "past" : { + "other" : "قبل {0} ساعة", + "two" : "قبل ساعتين", + "one" : "قبل ساعة واحدة", + "few" : "قبل {0} ساعات" + }, + "future" : { + "two" : "خلال ساعتين", + "one" : "خلال ساعة واحدة", + "other" : "خلال {0} ساعة", + "few" : "خلال {0} ساعات" + } + }, + "day" : { + "future" : { + "other" : "خلال {0} يوم", + "one" : "خلال يوم واحد", + "few" : "خلال {0} أيام", + "two" : "خلال يومين", + "many" : "خلال {0} يومًا" + }, + "previous" : "أمس", + "current" : "اليوم", + "past" : { + "many" : "قبل {0} يومًا", + "other" : "قبل {0} يوم", + "two" : "قبل يومين", + "few" : "قبل {0} أيام", + "one" : "قبل يوم واحد" + }, + "next" : "غدًا" + }, + "month" : { + "next" : "الشهر القادم", + "past" : { + "two" : "قبل شهرين", + "other" : "قبل {0} شهر", + "few" : "خلال {0} أشهر", + "many" : "قبل {0} شهرًا", + "one" : "قبل شهر واحد" + }, + "future" : { + "one" : "خلال شهر واحد", + "two" : "خلال شهرين", + "other" : "خلال {0} شهر", + "many" : "خلال {0} شهرًا", + "few" : "خلال {0} أشهر" + }, + "previous" : "الشهر الماضي", + "current" : "هذا الشهر" + }, + "week" : { + "future" : { + "one" : "خلال أسبوع واحد", + "two" : "خلال {0} أسبوعين", + "few" : "خلال {0} أسابيع", + "many" : "خلال {0} أسبوعًا", + "other" : "خلال {0} أسبوع" + }, + "next" : "الأسبوع القادم", + "previous" : "الأسبوع الماضي", + "past" : { + "many" : "قبل {0} أسبوعًا", + "other" : "قبل {0} أسبوع", + "two" : "قبل أسبوعين", + "one" : "قبل أسبوع واحد", + "few" : "قبل {0} أسابيع" + }, + "current" : "هذا الأسبوع" + }, + "minute" : { + "current" : "هذه الدقيقة", + "past" : { + "few" : "قبل {0} دقائق", + "two" : "قبل دقيقتين", + "one" : "قبل دقيقة واحدة", + "other" : "قبل {0} دقيقة" + }, + "future" : { + "few" : "خلال {0} دقائق", + "other" : "خلال {0} دقيقة", + "one" : "خلال دقيقة واحدة", + "two" : "خلال دقيقتين" + } + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ar_AE.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ar_AE.json new file mode 100644 index 0000000..1003a64 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ar_AE.json @@ -0,0 +1,419 @@ +{ + "short" : { + "month" : { + "future" : { + "other" : "خلال {0} شهر", + "one" : "خلال شهر واحد", + "two" : "خلال شهرين", + "few" : "خلال {0} أشهر", + "many" : "خلال {0} شهرًا" + }, + "previous" : "الشهر الماضي", + "next" : "الشهر القادم", + "past" : { + "one" : "قبل شهر واحد", + "two" : "قبل شهرين", + "few" : "خلال {0} أشهر", + "other" : "قبل {0} شهر", + "many" : "قبل {0} شهرًا" + }, + "current" : "هذا الشهر" + }, + "day" : { + "future" : { + "two" : "خلال يومين", + "one" : "خلال يوم واحد", + "few" : "خلال {0} أيام", + "other" : "خلال {0} يوم", + "many" : "خلال {0} يومًا" + }, + "previous" : "أمس", + "next" : "غدًا", + "past" : { + "two" : "قبل يومين", + "many" : "قبل {0} يومًا", + "other" : "قبل {0} يوم", + "one" : "قبل يوم واحد", + "few" : "قبل {0} أيام" + }, + "current" : "اليوم" + }, + "second" : { + "future" : { + "one" : "خلال ثانية واحدة", + "few" : "خلال {0} ثوانٍ", + "two" : "خلال ثانيتين", + "other" : "خلال {0} ثانية" + }, + "current" : "الآن", + "past" : { + "two" : "قبل ثانيتين", + "other" : "قبل {0} ثانية", + "few" : "قبل {0} ثوانٍ", + "one" : "قبل ثانية واحدة" + } + }, + "quarter" : { + "past" : { + "other" : "قبل {0} ربع سنة", + "two" : "قبل ربعي سنة", + "one" : "قبل ربع سنة واحد", + "few" : "قبل {0} أرباع سنة" + }, + "next" : "الربع القادم", + "future" : { + "other" : "خلال {0} ربع سنة", + "few" : "خلال {0} أرباع سنة", + "two" : "خلال ربعي سنة", + "one" : "خلال ربع سنة واحد" + }, + "previous" : "الربع الأخير", + "current" : "هذا الربع" + }, + "year" : { + "future" : { + "few" : "خلال {0} سنوات", + "other" : "خلال {0} سنة", + "one" : "خلال سنة واحدة", + "two" : "خلال سنتين" + }, + "current" : "هذه السنة", + "previous" : "السنة الماضية", + "past" : { + "few" : "قبل {0} سنوات", + "other" : "قبل {0} سنة", + "two" : "قبل سنتين", + "one" : "قبل سنة واحدة" + }, + "next" : "السنة التالية" + }, + "hour" : { + "past" : { + "few" : "قبل {0} ساعات", + "other" : "قبل {0} ساعة", + "two" : "قبل ساعتين", + "one" : "قبل ساعة واحدة" + }, + "future" : { + "two" : "خلال ساعتين", + "one" : "خلال ساعة واحدة", + "other" : "خلال {0} ساعة", + "few" : "خلال {0} ساعات" + }, + "current" : "الساعة الحالية" + }, + "week" : { + "current" : "هذا الأسبوع", + "previous" : "الأسبوع الماضي", + "past" : { + "two" : "قبل أسبوعين", + "other" : "قبل {0} أسبوع", + "few" : "قبل {0} أسابيع", + "one" : "قبل أسبوع واحد", + "many" : "قبل {0} أسبوعًا" + }, + "next" : "الأسبوع القادم", + "future" : { + "two" : "خلال {0} أسبوعين", + "few" : "خلال {0} أسابيع", + "other" : "خلال {0} أسبوع", + "one" : "خلال أسبوع واحد", + "many" : "خلال {0} أسبوعًا" + } + }, + "minute" : { + "future" : { + "other" : "خلال {0} دقيقة", + "one" : "خلال دقيقة واحدة", + "few" : "خلال {0} دقائق", + "two" : "خلال دقيقتين" + }, + "past" : { + "other" : "قبل {0} دقيقة", + "two" : "قبل دقيقتين", + "one" : "قبل دقيقة واحدة", + "few" : "قبل {0} دقائق" + }, + "current" : "هذه الدقيقة" + }, + "now" : "الآن" + }, + "narrow" : { + "second" : { + "future" : { + "few" : "خلال {0} ثوانٍ", + "two" : "خلال ثانيتين", + "other" : "خلال {0} ثانية", + "one" : "خلال ثانية واحدة" + }, + "current" : "الآن", + "past" : { + "one" : "قبل ثانية واحدة", + "few" : "قبل {0} ثوانٍ", + "two" : "قبل ثانيتين", + "other" : "قبل {0} ثانية" + } + }, + "now" : "الآن", + "day" : { + "future" : { + "other" : "خلال {0} يوم", + "one" : "خلال يوم واحد", + "two" : "خلال يومين", + "few" : "خلال {0} أيام", + "many" : "خلال {0} يومًا" + }, + "current" : "اليوم", + "past" : { + "one" : "قبل يوم واحد", + "many" : "قبل {0} يومًا", + "two" : "قبل يومين", + "other" : "قبل {0} يوم", + "few" : "قبل {0} أيام" + }, + "next" : "غدًا", + "previous" : "أمس" + }, + "hour" : { + "past" : { + "few" : "قبل {0} ساعات", + "two" : "قبل ساعتين", + "other" : "قبل {0} ساعة", + "one" : "قبل ساعة واحدة" + }, + "future" : { + "two" : "خلال ساعتين", + "one" : "خلال ساعة واحدة", + "few" : "خلال {0} ساعات", + "other" : "خلال {0} ساعة" + }, + "current" : "الساعة الحالية" + }, + "quarter" : { + "past" : { + "one" : "قبل ربع سنة واحد", + "few" : "قبل {0} أرباع سنة", + "other" : "قبل {0} ربع سنة", + "two" : "قبل ربعي سنة" + }, + "current" : "هذا الربع", + "future" : { + "one" : "خلال ربع سنة واحد", + "two" : "خلال ربعي سنة", + "few" : "خلال {0} أرباع سنة", + "other" : "خلال {0} ربع سنة" + }, + "next" : "الربع القادم", + "previous" : "الربع الأخير" + }, + "year" : { + "future" : { + "other" : "خلال {0} سنة", + "one" : "خلال سنة واحدة", + "few" : "خلال {0} سنوات", + "two" : "خلال سنتين" + }, + "next" : "السنة التالية", + "previous" : "السنة الماضية", + "current" : "هذه السنة", + "past" : { + "two" : "قبل سنتين", + "few" : "قبل {0} سنوات", + "other" : "قبل {0} سنة", + "one" : "قبل سنة واحدة" + } + }, + "month" : { + "next" : "الشهر القادم", + "previous" : "الشهر الماضي", + "future" : { + "other" : "خلال {0} شهر", + "few" : "خلال {0} أشهر", + "one" : "خلال شهر واحد", + "many" : "خلال {0} شهرًا", + "two" : "خلال شهرين" + }, + "current" : "هذا الشهر", + "past" : { + "many" : "قبل {0} شهرًا", + "other" : "قبل {0} شهر", + "one" : "قبل شهر واحد", + "two" : "قبل شهرين", + "few" : "قبل {0} أشهر" + } + }, + "week" : { + "previous" : "الأسبوع الماضي", + "next" : "الأسبوع القادم", + "past" : { + "many" : "قبل {0} أسبوعًا", + "few" : "قبل {0} أسابيع", + "other" : "قبل {0} أسبوع", + "two" : "قبل أسبوعين", + "one" : "قبل أسبوع واحد" + }, + "future" : { + "one" : "خلال أسبوع واحد", + "many" : "خلال {0} أسبوعًا", + "few" : "خلال {0} أسابيع", + "two" : "خلال أسبوعين", + "other" : "خلال {0} أسبوع" + }, + "current" : "هذا الأسبوع" + }, + "minute" : { + "past" : { + "two" : "قبل دقيقتين", + "other" : "قبل {0} دقيقة", + "one" : "قبل دقيقة واحدة", + "few" : "قبل {0} دقائق" + }, + "future" : { + "other" : "خلال {0} دقيقة", + "few" : "خلال {0} دقائق", + "two" : "خلال دقيقتين", + "one" : "خلال دقيقة واحدة" + }, + "current" : "هذه الدقيقة" + } + }, + "long" : { + "now" : "الآن", + "second" : { + "past" : { + "two" : "قبل ثانيتين", + "one" : "قبل ثانية واحدة", + "other" : "قبل {0} ثانية", + "few" : "قبل {0} ثوانِ" + }, + "future" : { + "one" : "خلال ثانية واحدة", + "two" : "خلال ثانيتين", + "few" : "خلال {0} ثوانٍ", + "other" : "خلال {0} ثانية" + }, + "current" : "الآن" + }, + "minute" : { + "current" : "هذه الدقيقة", + "past" : { + "one" : "قبل دقيقة واحدة", + "few" : "قبل {0} دقائق", + "two" : "قبل دقيقتين", + "other" : "قبل {0} دقيقة" + }, + "future" : { + "one" : "خلال دقيقة واحدة", + "few" : "خلال {0} دقائق", + "two" : "خلال دقيقتين", + "other" : "خلال {0} دقيقة" + } + }, + "week" : { + "previous" : "الأسبوع الماضي", + "current" : "هذا الأسبوع", + "past" : { + "one" : "قبل أسبوع واحد", + "two" : "قبل أسبوعين", + "few" : "قبل {0} أسابيع", + "other" : "قبل {0} أسبوع", + "many" : "قبل {0} أسبوعًا" + }, + "next" : "الأسبوع القادم", + "future" : { + "one" : "خلال أسبوع واحد", + "many" : "خلال {0} أسبوعًا", + "other" : "خلال {0} أسبوع", + "two" : "خلال أسبوعين", + "few" : "خلال {0} أسابيع" + } + }, + "day" : { + "future" : { + "one" : "خلال يوم واحد", + "few" : "خلال {0} أيام", + "two" : "خلال يومين", + "many" : "خلال {0} يومًا", + "other" : "خلال {0} يوم" + }, + "next" : "غدًا", + "previous" : "أمس", + "current" : "اليوم", + "past" : { + "many" : "قبل {0} يومًا", + "two" : "قبل يومين", + "one" : "قبل يوم واحد", + "few" : "قبل {0} أيام", + "other" : "قبل {0} يوم" + } + }, + "month" : { + "current" : "هذا الشهر", + "next" : "الشهر القادم", + "future" : { + "many" : "خلال {0} شهرًا", + "few" : "خلال {0} أشهر", + "other" : "خلال {0} شهر", + "one" : "خلال شهر واحد", + "two" : "خلال شهرين" + }, + "previous" : "الشهر الماضي", + "past" : { + "other" : "قبل {0} شهر", + "two" : "قبل شهرين", + "many" : "قبل {0} شهرًا", + "one" : "قبل شهر واحد", + "few" : "قبل {0} أشهر" + } + }, + "year" : { + "future" : { + "one" : "خلال سنة واحدة", + "few" : "خلال {0} سنوات", + "two" : "خلال سنتين", + "other" : "خلال {0} سنة" + }, + "previous" : "السنة الماضية", + "next" : "السنة التالية", + "current" : "هذه السنة", + "past" : { + "two" : "قبل سنتين", + "other" : "قبل {0} سنة", + "one" : "قبل سنة واحدة", + "few" : "قبل {0} سنوات" + } + }, + "hour" : { + "future" : { + "other" : "خلال {0} ساعة", + "one" : "خلال ساعة واحدة", + "two" : "خلال ساعتين", + "few" : "خلال {0} ساعات" + }, + "past" : { + "two" : "قبل ساعتين", + "few" : "قبل {0} ساعات", + "one" : "قبل ساعة واحدة", + "other" : "قبل {0} ساعة" + }, + "current" : "الساعة الحالية" + }, + "quarter" : { + "past" : { + "one" : "قبل ربع سنة واحد", + "two" : "قبل ربعي سنة", + "other" : "قبل {0} ربع سنة", + "few" : "قبل {0} أرباع سنة" + }, + "future" : { + "few" : "خلال {0} أرباع سنة", + "one" : "خلال ربع سنة واحد", + "other" : "خلال {0} ربع سنة", + "two" : "خلال ربعي سنة" + }, + "previous" : "الربع الأخير", + "current" : "هذا الربع", + "next" : "الربع القادم" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/as.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/as.json new file mode 100644 index 0000000..bb8596e --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/as.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "quarter" : { + "past" : "{0} তিনি মাহ পূৰ্বে", + "future" : "{0} তিনি মাহত", + "current" : "এই তিনি মাহ", + "previous" : "যোৱা তিনি মাহ", + "next" : "অহা তিনি মাহ" + }, + "year" : { + "previous" : "যোৱা বছৰ", + "next" : "অহা বছৰ", + "future" : "{0} বছৰত", + "current" : "এই বছৰ", + "past" : "{0} বছৰৰ পূৰ্বে" + }, + "week" : { + "future" : "{0} সপ্তাহত", + "previous" : "যোৱা সপ্তাহ", + "next" : "অহা সপ্তাহ", + "past" : "{0} সপ্তাহ পূৰ্বে", + "current" : "এই সপ্তাহ" + }, + "day" : { + "current" : "আজি", + "past" : "{0} দিন পূৰ্বে", + "next" : "কাইলৈ", + "future" : "{0} দিনত", + "previous" : "কালি" + }, + "hour" : { + "current" : "এইটো ঘণ্টাত", + "past" : "{0} ঘণ্টা পূৰ্বে", + "future" : "{0} ঘণ্টাত" + }, + "minute" : { + "future" : "{0} মিনিটত", + "current" : "এইটো মিনিটত", + "past" : "{0} মিনিট পূৰ্বে" + }, + "month" : { + "next" : "অহা মাহ", + "current" : "এই মাহ", + "past" : "{0} মাহ পূৰ্বে", + "future" : "{0} মাহত", + "previous" : "যোৱা মাহ" + }, + "now" : "এতিয়া", + "second" : { + "future" : "{0} ছেকেণ্ডত", + "current" : "এতিয়া", + "past" : "{0} ছেকেণ্ড পূৰ্বে" + } + }, + "short" : { + "minute" : { + "past" : "{0} মিনিট পূৰ্বে", + "future" : "{0} মিনিটত", + "current" : "এইটো মিনিটত" + }, + "week" : { + "current" : "এই সপ্তাহ", + "past" : "{0} সপ্তাহ পূৰ্বে", + "future" : "{0} সপ্তাহত", + "next" : "অহা সপ্তাহ", + "previous" : "যোৱা সপ্তাহ" + }, + "year" : { + "future" : "{0} বছৰত", + "previous" : "যোৱা বছৰ", + "next" : "অহা বছৰ", + "current" : "এই বছৰ", + "past" : "{0} বছৰৰ পূৰ্বে" + }, + "day" : { + "next" : "কাইলৈ", + "current" : "আজি", + "previous" : "কালি", + "past" : "{0} দিন পূৰ্বে", + "future" : "{0} দিনত" + }, + "hour" : { + "future" : "{0} ঘণ্টাত", + "current" : "এইটো ঘণ্টাত", + "past" : "{0} ঘণ্টা পূৰ্বে" + }, + "quarter" : { + "current" : "এই তিনি মাহ", + "future" : "{0} তিনি মাহত", + "previous" : "যোৱা তিনি মাহ", + "next" : "অহা তিনি মাহ", + "past" : "{0} তিনি মাহ পূৰ্বে" + }, + "second" : { + "past" : "{0} ছেকেণ্ড পূৰ্বে", + "current" : "এতিয়া", + "future" : "{0} ছেকেণ্ডত" + }, + "month" : { + "current" : "এই মাহ", + "past" : "{0} মাহ পূৰ্বে", + "future" : "{0} মাহত", + "next" : "অহা মাহ", + "previous" : "যোৱা মাহ" + }, + "now" : "এতিয়া" + }, + "long" : { + "hour" : { + "future" : "{0} ঘণ্টাত", + "current" : "এইটো ঘণ্টাত", + "past" : "{0} ঘণ্টা পূৰ্বে" + }, + "day" : { + "next" : "কাইলৈ", + "past" : "{0} দিন পূৰ্বে", + "previous" : "কালি", + "future" : "{0} দিনত", + "current" : "আজি" + }, + "second" : { + "past" : "{0} ছেকেণ্ড পূৰ্বে", + "current" : "এতিয়া", + "future" : "{0} ছেকেণ্ডত" + }, + "week" : { + "future" : "{0} সপ্তাহত", + "past" : "{0} সপ্তাহ পূৰ্বে", + "current" : "এই সপ্তাহ", + "next" : "অহা সপ্তাহ", + "previous" : "যোৱা সপ্তাহ" + }, + "minute" : { + "future" : "{0} মিনিটত", + "past" : "{0} মিনিট পূৰ্বে", + "current" : "এইটো মিনিটত" + }, + "month" : { + "future" : "{0} মাহত", + "past" : "{0} মাহ পূৰ্বে", + "current" : "এই মাহ", + "previous" : "যোৱা মাহ", + "next" : "অহা মাহ" + }, + "now" : "এতিয়া", + "year" : { + "current" : "এই বছৰ", + "next" : "অহা বছৰ", + "previous" : "যোৱা বছৰ", + "future" : "{0} বছৰত", + "past" : "{0} বছৰৰ পূৰ্বে" + }, + "quarter" : { + "future" : "{0} তিনি মাহত", + "previous" : "যোৱা তিনি মাহ", + "past" : "{0} তিনি মাহ পূৰ্বে", + "next" : "অহা তিনি মাহ", + "current" : "এই তিনি মাহ" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/be.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/be.json new file mode 100644 index 0000000..e1add67 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/be.json @@ -0,0 +1,255 @@ +{ + "long" : { + "quarter" : { + "previous" : "у мінулым квартале", + "next" : "у наступным квартале", + "past" : { + "one" : "{0} квартал таму", + "few" : "{0} кварталы таму", + "many" : "{0} кварталаў таму", + "other" : "{0} квартала таму" + }, + "future" : { + "many" : "праз {0} кварталаў", + "one" : "праз {0} квартал", + "other" : "праз {0} квартала", + "few" : "праз {0} кварталы" + }, + "current" : "у гэтым квартале" + }, + "year" : { + "future" : { + "one" : "праз {0} год", + "many" : "праз {0} гадоў", + "few" : "праз {0} гады", + "other" : "праз {0} года" + }, + "current" : "у гэтым годзе", + "next" : "у наступным годзе", + "past" : { + "one" : "{0} год таму", + "other" : "{0} года таму", + "many" : "{0} гадоў таму", + "few" : "{0} гады таму" + }, + "previous" : "у мінулым годзе" + }, + "month" : { + "current" : "у гэтым месяцы", + "past" : { + "one" : "{0} месяц таму", + "few" : "{0} месяцы таму", + "many" : "{0} месяцаў таму", + "other" : "{0} месяца таму" + }, + "previous" : "у мінулым месяцы", + "next" : "у наступным месяцы", + "future" : { + "many" : "праз {0} месяцаў", + "other" : "праз {0} месяца", + "few" : "праз {0} месяцы", + "one" : "праз {0} месяц" + } + }, + "hour" : { + "current" : "у гэту гадзіну", + "future" : { + "one" : "праз {0} гадзіну", + "other" : "праз {0} гадзіны", + "many" : "праз {0} гадзін" + }, + "past" : { + "one" : "{0} гадзіну таму", + "other" : "{0} гадзіны таму", + "many" : "{0} гадзін таму" + } + }, + "week" : { + "future" : { + "other" : "праз {0} тыдня", + "few" : "праз {0} тыдні", + "one" : "праз {0} тыдзень", + "many" : "праз {0} тыдняў" + }, + "next" : "на наступным тыдні", + "previous" : "на мінулым тыдні", + "past" : { + "many" : "{0} тыдняў таму", + "one" : "{0} тыдзень таму", + "few" : "{0} тыдні таму", + "other" : "{0} тыдня таму" + }, + "current" : "на гэтым тыдні" + }, + "minute" : { + "future" : { + "one" : "праз {0} хвіліну", + "other" : "праз {0} хвіліны", + "many" : "праз {0} хвілін" + }, + "current" : "у гэту хвіліну", + "past" : { + "one" : "{0} хвіліну таму", + "many" : "{0} хвілін таму", + "other" : "{0} хвіліны таму" + } + }, + "now" : "цяпер", + "second" : { + "past" : { + "many" : "{0} секунд таму", + "other" : "{0} секунды таму", + "one" : "{0} секунду таму" + }, + "future" : { + "many" : "праз {0} секунд", + "one" : "праз {0} секунду", + "other" : "праз {0} секунды" + }, + "current" : "цяпер" + }, + "day" : { + "current" : "сёння", + "next" : "заўтра", + "past" : { + "one" : "{0} дзень таму", + "many" : "{0} дзён таму", + "few" : "{0} дні таму", + "other" : "{0} дня таму" + }, + "future" : { + "other" : "праз {0} дня", + "one" : "праз {0} дзень", + "many" : "праз {0} дзён", + "few" : "праз {0} дні" + }, + "previous" : "учора" + } + }, + "narrow" : { + "now" : "цяпер", + "quarter" : { + "current" : "у гэтым квартале", + "next" : "у наступным квартале", + "past" : "{0} кв. таму", + "previous" : "у мінулым квартале", + "future" : "праз {0} кв." + }, + "day" : { + "past" : { + "one" : "{0} дзень таму", + "few" : "{0} дні таму", + "many" : "{0} дзён таму", + "other" : "{0} дня таму" + }, + "previous" : "учора", + "current" : "сёння", + "next" : "заўтра", + "future" : { + "few" : "праз {0} дні", + "many" : "праз {0} дзён", + "other" : "праз {0} дня", + "one" : "праз {0} дзень" + } + }, + "week" : { + "current" : "на гэтым тыдні", + "next" : "на наступным тыдні", + "future" : "праз {0} тыд", + "previous" : "на мінулым тыдні", + "past" : "{0} тыд таму" + }, + "year" : { + "current" : "у гэтым годзе", + "previous" : "у мінулым годзе", + "past" : "{0} г. таму", + "next" : "у наступным годзе", + "future" : "праз {0} г." + }, + "month" : { + "past" : "{0} мес. таму", + "current" : "у гэтым месяцы", + "future" : "праз {0} мес.", + "previous" : "у мінулым месяцы", + "next" : "у наступным месяцы" + }, + "second" : { + "current" : "цяпер", + "past" : "{0} с таму", + "future" : "праз {0} с" + }, + "minute" : { + "current" : "у гэту хвіліну", + "future" : "праз {0} хв", + "past" : "{0} хв таму" + }, + "hour" : { + "future" : "праз {0} гадз", + "past" : "{0} гадз таму", + "current" : "у гэту гадзіну" + } + }, + "short" : { + "month" : { + "current" : "у гэтым месяцы", + "next" : "у наступным месяцы", + "past" : "{0} мес. таму", + "future" : "праз {0} мес.", + "previous" : "у мінулым месяцы" + }, + "now" : "цяпер", + "week" : { + "next" : "на наступным тыдні", + "past" : "{0} тыд таму", + "current" : "на гэтым тыдні", + "previous" : "на мінулым тыдні", + "future" : "праз {0} тыд" + }, + "day" : { + "future" : { + "other" : "праз {0} дня", + "few" : "праз {0} дні", + "one" : "праз {0} дзень", + "many" : "праз {0} дзён" + }, + "previous" : "учора", + "current" : "сёння", + "next" : "заўтра", + "past" : { + "one" : "{0} дзень таму", + "few" : "{0} дні таму", + "other" : "{0} дня таму", + "many" : "{0} дзён таму" + } + }, + "year" : { + "current" : "у гэтым годзе", + "future" : "праз {0} г.", + "previous" : "у мінулым годзе", + "next" : "у наступным годзе", + "past" : "{0} г. таму" + }, + "hour" : { + "past" : "{0} гадз таму", + "current" : "у гэту гадзіну", + "future" : "праз {0} гадз" + }, + "minute" : { + "past" : "{0} хв таму", + "future" : "праз {0} хв", + "current" : "у гэту хвіліну" + }, + "second" : { + "future" : "праз {0} с", + "current" : "цяпер", + "past" : "{0} с таму" + }, + "quarter" : { + "future" : "праз {0} кв.", + "previous" : "у мінулым квартале", + "next" : "у наступным квартале", + "past" : "{0} кв. таму", + "current" : "у гэтым квартале" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/bg.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/bg.json new file mode 100644 index 0000000..b9ab231 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/bg.json @@ -0,0 +1,215 @@ +{ + "narrow" : { + "week" : { + "next" : "сл. седм.", + "past" : "пр. {0} седм.", + "future" : "сл. {0} седм.", + "previous" : "мин. седм.", + "current" : "тази седм." + }, + "quarter" : { + "next" : "следв. трим.", + "past" : "пр. {0} трим.", + "previous" : "мин. трим.", + "current" : "това трим.", + "future" : "сл. {0} трим." + }, + "minute" : { + "current" : "в тази минута", + "past" : "пр. {0} мин", + "future" : "сл. {0} мин" + }, + "day" : { + "previous" : "вчера", + "next" : "утре", + "current" : "днес", + "future" : "сл. {0} д", + "past" : "пр. {0} д" + }, + "year" : { + "current" : "т. г.", + "previous" : "мин. г.", + "next" : "сл. г.", + "past" : "пр. {0} г.", + "future" : "сл. {0} г." + }, + "second" : { + "past" : "пр. {0} сек", + "future" : "сл. {0} сек", + "current" : "сега" + }, + "month" : { + "past" : "пр. {0} м.", + "future" : "сл. {0} м.", + "next" : "сл. м.", + "current" : "т. м.", + "previous" : "мин. м." + }, + "now" : "сега", + "hour" : { + "past" : "пр. {0} ч", + "current" : "в този час", + "future" : "сл. {0} ч" + } + }, + "short" : { + "year" : { + "next" : "следв. г.", + "future" : "след {0} г.", + "current" : "т. г.", + "past" : "преди {0} г.", + "previous" : "мин. г." + }, + "quarter" : { + "future" : "след {0} трим.", + "next" : "следв. трим.", + "previous" : "мин. трим.", + "current" : "това трим.", + "past" : "преди {0} трим." + }, + "second" : { + "future" : "след {0} сек", + "current" : "сега", + "past" : "преди {0} сек" + }, + "minute" : { + "current" : "в тази минута", + "past" : "преди {0} мин", + "future" : "след {0} мин" + }, + "day" : { + "past" : { + "one" : "преди {0} ден", + "other" : "преди {0} дни" + }, + "next" : "утре", + "future" : { + "one" : "след {0} ден", + "other" : "след {0} дни" + }, + "previous" : "вчера", + "current" : "днес" + }, + "month" : { + "previous" : "мин. мес.", + "next" : "следв. мес.", + "past" : "преди {0} м.", + "current" : "този мес.", + "future" : "след {0} м." + }, + "hour" : { + "current" : "в този час", + "past" : "преди {0} ч", + "future" : "след {0} ч" + }, + "now" : "сега", + "week" : { + "previous" : "миналата седмица", + "current" : "тази седм.", + "next" : "следв. седм.", + "past" : "преди {0} седм.", + "future" : "след {0} седм." + } + }, + "long" : { + "month" : { + "previous" : "предходен месец", + "past" : { + "one" : "преди {0} месец", + "other" : "преди {0} месеца" + }, + "current" : "този месец", + "future" : { + "one" : "след {0} месец", + "other" : "след {0} месеца" + }, + "next" : "следващ месец" + }, + "week" : { + "previous" : "предходната седмица", + "current" : "тази седмица", + "next" : "следващата седмица", + "past" : { + "other" : "преди {0} седмици", + "one" : "преди {0} седмица" + }, + "future" : { + "one" : "след {0} седмица", + "other" : "след {0} седмици" + } + }, + "quarter" : { + "future" : { + "one" : "след {0} тримесечие", + "other" : "след {0} тримесечия" + }, + "next" : "следващо тримесечие", + "previous" : "предходно тримесечие", + "current" : "това тримесечие", + "past" : { + "other" : "преди {0} тримесечия", + "one" : "преди {0} тримесечие" + } + }, + "hour" : { + "future" : { + "one" : "след {0} час", + "other" : "след {0} часа" + }, + "current" : "в този час", + "past" : { + "one" : "преди {0} час", + "other" : "преди {0} часа" + } + }, + "second" : { + "future" : { + "one" : "след {0} секунда", + "other" : "след {0} секунди" + }, + "current" : "сега", + "past" : { + "one" : "преди {0} секунда", + "other" : "преди {0} секунди" + } + }, + "now" : "сега", + "minute" : { + "future" : { + "one" : "след {0} минута", + "other" : "след {0} минути" + }, + "past" : { + "one" : "преди {0} минута", + "other" : "преди {0} минути" + }, + "current" : "в тази минута" + }, + "year" : { + "current" : "тази година", + "next" : "следващата година", + "future" : { + "other" : "след {0} години", + "one" : "след {0} година" + }, + "past" : { + "one" : "преди {0} година", + "other" : "преди {0} години" + }, + "previous" : "миналата година" + }, + "day" : { + "current" : "днес", + "previous" : "вчера", + "future" : { + "other" : "след {0} дни", + "one" : "след {0} ден" + }, + "past" : { + "one" : "преди {0} ден", + "other" : "преди {0} дни" + }, + "next" : "утре" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/bn.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/bn.json new file mode 100644 index 0000000..eff9597 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/bn.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "quarter" : { + "past" : "[0] ত্রৈমাসিক আগে", + "future" : "[0] ত্রৈমাসিকে", + "current" : "এই ত্রৈমাসিক", + "previous" : "গত ত্রৈমাসিক", + "next" : "পরের ত্রৈমাসিক" + }, + "year" : { + "previous" : "গত বছর", + "next" : "পরের বছর", + "future" : "[0] বছরে", + "current" : "এই বছর", + "past" : "[0] বছর পূর্বে" + }, + "week" : { + "future" : "[0] সপ্তাহে", + "previous" : "গত সপ্তাহ", + "next" : "পরের সপ্তাহ", + "past" : "[0] সপ্তাহ আগে", + "current" : "এই সপ্তাহ" + }, + "day" : { + "current" : "আজ", + "past" : "[0] দিন আগে", + "next" : "আগামীকাল", + "future" : "[0] দিনের মধ্যে", + "previous" : "গতকাল" + }, + "hour" : { + "current" : "এই ঘণ্টায়", + "past" : "[0] ঘন্টা আগে", + "future" : "[0] ঘন্টায়" + }, + "minute" : { + "future" : "[0] মিনিটে", + "current" : "এই মিনিট", + "past" : "[0] মিনিট আগে" + }, + "month" : { + "next" : "পরের মাস", + "current" : "এই মাস", + "past" : "[0] মাস আগে", + "future" : "[0] মাসে", + "previous" : "গত মাস" + }, + "now" : "এখন", + "second" : { + "future" : "[0] সেকেন্ডে", + "current" : "এখন", + "past" : "[0] সেকেন্ড আগে" + } + }, + "short" : { + "minute" : { + "past" : "[0] মিনিট আগে", + "future" : "[0] মিনিটে", + "current" : "এই মিনিট" + }, + "week" : { + "current" : "এই সপ্তাহ", + "past" : "[0] সপ্তাহ আগে", + "future" : "[0] সপ্তাহে", + "next" : "পরের সপ্তাহ", + "previous" : "গত সপ্তাহ" + }, + "year" : { + "current" : "এই বছর", + "future" : "[0] বছরে", + "past" : "[0] বছর পূর্বে", + "next" : "পরের বছর", + "previous" : "গত বছর" + }, + "day" : { + "next" : "আগামীকাল", + "current" : "আজ", + "previous" : "গতকাল", + "past" : "[0] দিন আগে", + "future" : "[0] দিনের মধ্যে" + }, + "hour" : { + "future" : "[0] ঘন্টায়", + "current" : "এই ঘণ্টায়", + "past" : "[0] ঘন্টা আগে" + }, + "quarter" : { + "current" : "এই ত্রৈমাসিক", + "future" : "[0] ত্রৈমাসিকে", + "previous" : "গত ত্রৈমাসিক", + "next" : "পরের ত্রৈমাসিক", + "past" : "[0] ত্রৈমাসিক আগে" + }, + "second" : { + "past" : "[0] সেকেন্ড পূর্বে", + "current" : "এখন", + "future" : "[0] সেকেন্ডে" + }, + "month" : { + "current" : "এই মাস", + "past" : "[0] মাস আগে", + "future" : "[0] মাসে", + "next" : "পরের মাস", + "previous" : "গত মাস" + }, + "now" : "এখন" + }, + "long" : { + "hour" : { + "future" : "[0] ঘন্টায়", + "current" : "এই ঘণ্টায়", + "past" : "[0] ঘন্টা আগে" + }, + "day" : { + "next" : "আগামীকাল", + "past" : "[0] দিন আগে", + "previous" : "গতকাল", + "future" : "[0] দিনের মধ্যে", + "current" : "আজ" + }, + "second" : { + "past" : "[0] সেকেন্ড পূর্বে", + "current" : "এখন", + "future" : "[0] সেকেন্ডে" + }, + "week" : { + "future" : "[0] সপ্তাহে", + "past" : "[0] সপ্তাহ আগে", + "current" : "এই সপ্তাহ", + "next" : "পরের সপ্তাহ", + "previous" : "গত সপ্তাহ" + }, + "minute" : { + "future" : "[0] মিনিটে", + "past" : "[0] মিনিট আগে", + "current" : "এই মিনিট" + }, + "month" : { + "future" : "[0] মাসে", + "past" : "[0] মাস আগে", + "current" : "এই মাস", + "previous" : "গত মাস", + "next" : "পরের মাস" + }, + "now" : "এখন", + "year" : { + "current" : "এই বছর", + "next" : "পরের বছর", + "previous" : "গত বছর", + "future" : "[0] বছরে", + "past" : "[0] বছর পূর্বে" + }, + "quarter" : { + "future" : "[0] ত্রৈমাসিকে", + "previous" : "গত ত্রৈমাসিক", + "past" : "[0] ত্রৈমাসিক আগে", + "next" : "পরের ত্রৈমাসিক", + "current" : "এই ত্রৈমাসিক" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/br.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/br.json new file mode 100644 index 0000000..d7e7154 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/br.json @@ -0,0 +1,240 @@ +{ + "narrow" : { + "quarter" : { + "previous" : "last quarter", + "current" : "this quarter", + "next" : "next quarter", + "past" : "-{0} trim.", + "future" : "+{0} trim." + }, + "month" : { + "past" : "-{0} miz", + "next" : "ar miz a zeu", + "future" : "+{0} miz", + "previous" : "ar miz diaraok", + "current" : "ar miz-mañ" + }, + "now" : "brem.", + "hour" : { + "future" : "+{0} h", + "past" : "-{0} h", + "current" : "this hour" + }, + "minute" : { + "past" : "-{0} min", + "current" : "this minute", + "future" : "+{0} min" + }, + "day" : { + "current" : "hiziv", + "future" : "+{0} d", + "next" : "warcʼhoazh", + "previous" : "decʼh", + "past" : "-{0} d" + }, + "year" : { + "next" : "ar bl. a zeu", + "past" : "-{0} bl.", + "future" : "+{0} bl.", + "previous" : "warlene", + "current" : "hevlene" + }, + "week" : { + "next" : "ar sizhun a zeu", + "previous" : "ar sizhun diaraok", + "past" : { + "many" : "{0} a sizhunioù zo", + "other" : "{0} sizhun zo" + }, + "future" : { + "many" : "a-benn {0} a sizhunioù", + "other" : "a-benn {0} sizhun" + }, + "current" : "ar sizhun-mañ" + }, + "second" : { + "future" : "+{0} s", + "current" : "brem.", + "past" : "-{0} s" + } + }, + "short" : { + "minute" : { + "future" : "a-benn {0} min", + "current" : "this minute", + "past" : "{0} min zo" + }, + "month" : { + "current" : "ar miz-mañ", + "past" : { + "two" : "{0} viz zo", + "many" : "{0} a vizioù zo", + "other" : "{0} miz zo" + }, + "future" : { + "two" : "a-benn {0} viz", + "many" : "a-benn {0} a vizioù", + "other" : "a-benn {0} miz" + }, + "next" : "ar miz a zeu", + "previous" : "ar miz diaraok" + }, + "week" : { + "next" : "ar sizhun a zeu", + "current" : "ar sizhun-mañ", + "previous" : "ar sizhun diaraok", + "past" : { + "many" : "{0} a sizhunioù zo", + "other" : "{0} sizhun zo" + }, + "future" : { + "other" : "a-benn {0} sizhun", + "many" : "a-benn {0} a sizhunioù" + } + }, + "hour" : { + "future" : "a-benn {0} e", + "current" : "this hour", + "past" : "{0} e zo" + }, + "day" : { + "future" : "a-benn {0} d", + "previous" : "decʼh", + "current" : "hiziv", + "next" : "warcʼhoazh", + "past" : "{0} d zo" + }, + "second" : { + "future" : "a-benn {0} s", + "current" : "brem.", + "past" : "{0} s zo" + }, + "now" : "brem.", + "year" : { + "current" : "hevlene", + "future" : "a-benn {0} bl.", + "past" : "{0} bl. zo", + "next" : "ar bl. a zeu", + "previous" : "warlene" + }, + "quarter" : { + "current" : "this quarter", + "future" : "a-benn {0} trim.", + "previous" : "last quarter", + "next" : "next quarter", + "past" : "{0} trim. zo" + } + }, + "long" : { + "minute" : { + "past" : { + "other" : "{0} munut zo", + "two" : "{0} vunut zo", + "many" : "{0} a vunutoù zo" + }, + "future" : { + "two" : "a-benn {0} vunut", + "many" : "a-benn {0} a vunutoù", + "other" : "a-benn {0} munut" + }, + "current" : "this minute" + }, + "week" : { + "past" : { + "many" : "{0} a sizhunioù zo", + "other" : "{0} sizhun zo" + }, + "future" : { + "many" : "a-benn {0} a sizhunioù", + "other" : "a-benn {0} sizhun" + }, + "next" : "ar sizhun a zeu", + "previous" : "ar sizhun diaraok", + "current" : "ar sizhun-mañ" + }, + "now" : "bremañ", + "hour" : { + "current" : "this hour", + "future" : { + "other" : "a-benn {0} eur", + "many" : "a-benn {0} a eurioù" + }, + "past" : { + "other" : "{0} eur zo", + "many" : "{0} a eurioù zo" + } + }, + "second" : { + "future" : { + "other" : "a-benn {0} eilenn", + "many" : "a-benn {0} a eilennoù" + }, + "current" : "bremañ", + "past" : "{0} eilenn zo" + }, + "day" : { + "next" : "warcʼhoazh", + "previous" : "decʼh", + "future" : { + "many" : "a-benn {0} a zeizioù", + "two" : "a-benn {0} zeiz", + "other" : "a-benn {0} deiz" + }, + "current" : "hiziv", + "past" : { + "other" : "{0} deiz zo", + "many" : "{0} a zeizioù zo", + "two" : "{0} zeiz zo" + } + }, + "year" : { + "next" : "ar bloaz a zeu", + "past" : { + "many" : "{0} a vloazioù zo", + "other" : "{0} vloaz zo", + "one" : "{0} bloaz zo", + "few" : "{0} bloaz zo" + }, + "future" : { + "other" : "a-benn {0} vloaz", + "one" : "a-benn {0} bloaz", + "many" : "a-benn {0} a vloazioù", + "few" : "a-benn {0} bloaz" + }, + "previous" : "warlene", + "current" : "hevlene" + }, + "quarter" : { + "past" : { + "few" : "{0} zrimiziad zo", + "other" : "{0} trimiziad zo", + "many" : "{0} a zrimiziadoù zo", + "two" : "{0} drimiziad zo" + }, + "current" : "this quarter", + "next" : "next quarter", + "future" : { + "many" : "a-benn {0} a drimiziadoù", + "few" : "a-benn {0} zrimiziad", + "two" : "a-benn {0} drimiziad", + "other" : "a-benn {0} trimiziad" + }, + "previous" : "last quarter" + }, + "month" : { + "previous" : "ar miz diaraok", + "next" : "ar miz a zeu", + "future" : { + "two" : "a-benn {0} viz", + "many" : "a-benn {0} a vizioù", + "other" : "a-benn {0} miz" + }, + "current" : "ar miz-mañ", + "past" : { + "two" : "{0} viz zo", + "other" : "{0} miz zo", + "many" : "{0} a vizioù zo" + } + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/bs-Cyrl.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/bs-Cyrl.json new file mode 100644 index 0000000..2f3ba61 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/bs-Cyrl.json @@ -0,0 +1,317 @@ +{ + "narrow" : { + "hour" : { + "future" : { + "other" : "за {0} сати", + "few" : "за {0} сата", + "one" : "за {0} сат" + }, + "past" : { + "few" : "пре {0} сата", + "other" : "пре {0} сати", + "one" : "пре {0} сат" + }, + "current" : "this hour" + }, + "quarter" : { + "next" : "next quarter", + "current" : "this quarter", + "past" : "-{0} Q", + "future" : "+{0} Q", + "previous" : "last quarter" + }, + "week" : { + "previous" : "Прошле недеље", + "current" : "Ове недеље", + "future" : { + "other" : "за {0} недеља", + "few" : "за {0} недеље", + "one" : "за {0} недељу" + }, + "past" : { + "one" : "пре {0} недељу", + "other" : "пре {0} недеља", + "few" : "пре {0} недеље" + }, + "next" : "Следеће недеље" + }, + "day" : { + "next" : "сутра", + "past" : { + "one" : "пре {0} дан", + "other" : "пре {0} дана" + }, + "future" : { + "one" : "за {0} дан", + "other" : "за {0} дана" + }, + "current" : "данас", + "previous" : "јуче" + }, + "second" : { + "past" : { + "few" : "пре {0} секунде", + "other" : "пре {0} секунди", + "one" : "пре {0} секунд" + }, + "current" : "now", + "future" : { + "one" : "за {0} секунд", + "few" : "за {0} секунде", + "other" : "за {0} секунди" + } + }, + "year" : { + "past" : { + "one" : "пре {0} годину", + "few" : "пре {0} године", + "other" : "пре {0} година" + }, + "future" : { + "one" : "за {0} годину", + "few" : "за {0} године", + "other" : "за {0} година" + }, + "previous" : "Прошле године", + "current" : "Ове године", + "next" : "Следеће године" + }, + "month" : { + "previous" : "Прошлог месеца", + "current" : "Овог месеца", + "past" : { + "other" : "пре {0} месеци", + "one" : "пре {0} месец", + "few" : "пре {0} месеца" + }, + "next" : "Следећег месеца", + "future" : { + "one" : "за {0} месец", + "few" : "за {0} месеца", + "other" : "за {0} месеци" + } + }, + "now" : "now", + "minute" : { + "past" : { + "other" : "пре {0} минута", + "one" : "пре {0} минут" + }, + "future" : { + "other" : "за {0} минута", + "one" : "за {0} минут" + }, + "current" : "this minute" + } + }, + "long" : { + "month" : { + "next" : "Следећег месеца", + "future" : { + "one" : "за {0} месец", + "other" : "за {0} месеци", + "few" : "за {0} месеца" + }, + "previous" : "Прошлог месеца", + "current" : "Овог месеца", + "past" : { + "few" : "пре {0} месеца", + "one" : "пре {0} месец", + "other" : "пре {0} месеци" + } + }, + "minute" : { + "current" : "this minute", + "past" : { + "one" : "пре {0} минут", + "other" : "пре {0} минута" + }, + "future" : { + "other" : "за {0} минута", + "one" : "за {0} минут" + } + }, + "week" : { + "next" : "Следеће недеље", + "future" : { + "few" : "за {0} недеље", + "other" : "за {0} недеља", + "one" : "за {0} недељу" + }, + "previous" : "Прошле недеље", + "past" : { + "few" : "пре {0} недеље", + "other" : "пре {0} недеља", + "one" : "пре {0} недељу" + }, + "current" : "Ове недеље" + }, + "second" : { + "past" : { + "other" : "пре {0} секунди", + "one" : "пре {0} секунд", + "few" : "пре {0} секунде" + }, + "future" : { + "other" : "за {0} секунди", + "few" : "за {0} секунде", + "one" : "за {0} секунд" + }, + "current" : "now" + }, + "hour" : { + "future" : { + "other" : "за {0} сати", + "few" : "за {0} сата", + "one" : "за {0} сат" + }, + "past" : { + "one" : "пре {0} сат", + "other" : "пре {0} сати", + "few" : "пре {0} сата" + }, + "current" : "this hour" + }, + "now" : "now", + "quarter" : { + "next" : "next quarter", + "past" : "-{0} Q", + "previous" : "last quarter", + "future" : "+{0} Q", + "current" : "this quarter" + }, + "year" : { + "next" : "Следеће године", + "past" : { + "one" : "пре {0} годину", + "few" : "пре {0} године", + "other" : "пре {0} година" + }, + "current" : "Ове године", + "future" : { + "few" : "за {0} године", + "other" : "за {0} година", + "one" : "за {0} годину" + }, + "previous" : "Прошле године" + }, + "day" : { + "past" : { + "one" : "пре {0} дан", + "other" : "пре {0} дана" + }, + "future" : { + "one" : "за {0} дан", + "other" : "за {0} дана" + }, + "current" : "данас", + "previous" : "јуче", + "next" : "сутра" + } + }, + "short" : { + "quarter" : { + "future" : "+{0} Q", + "previous" : "last quarter", + "current" : "this quarter", + "next" : "next quarter", + "past" : "-{0} Q" + }, + "month" : { + "future" : { + "other" : "за {0} месеци", + "few" : "за {0} месеца", + "one" : "за {0} месец" + }, + "previous" : "Прошлог месеца", + "current" : "Овог месеца", + "next" : "Следећег месеца", + "past" : { + "other" : "пре {0} месеци", + "one" : "пре {0} месец", + "few" : "пре {0} месеца" + } + }, + "year" : { + "previous" : "Прошле године", + "next" : "Следеће године", + "current" : "Ове године", + "future" : { + "few" : "за {0} године", + "other" : "за {0} година", + "one" : "за {0} годину" + }, + "past" : { + "one" : "пре {0} годину", + "few" : "пре {0} године", + "other" : "пре {0} година" + } + }, + "week" : { + "past" : { + "other" : "пре {0} недеља", + "one" : "пре {0} недељу", + "few" : "пре {0} недеље" + }, + "future" : { + "one" : "за {0} недељу", + "other" : "за {0} недеља", + "few" : "за {0} недеље" + }, + "next" : "Следеће недеље", + "current" : "Ове недеље", + "previous" : "Прошле недеље" + }, + "day" : { + "past" : { + "other" : "пре {0} дана", + "one" : "пре {0} дан" + }, + "next" : "сутра", + "previous" : "јуче", + "current" : "данас", + "future" : { + "one" : "за {0} дан", + "other" : "за {0} дана" + } + }, + "hour" : { + "current" : "this hour", + "past" : { + "one" : "пре {0} сат", + "few" : "пре {0} сата", + "other" : "пре {0} сати" + }, + "future" : { + "few" : "за {0} сата", + "other" : "за {0} сати", + "one" : "за {0} сат" + } + }, + "minute" : { + "past" : { + "one" : "пре {0} минут", + "other" : "пре {0} минута" + }, + "future" : { + "one" : "за {0} минут", + "other" : "за {0} минута" + }, + "current" : "this minute" + }, + "now" : "now", + "second" : { + "current" : "now", + "past" : { + "one" : "пре {0} секунд", + "few" : "пре {0} секунде", + "other" : "пре {0} секунди" + }, + "future" : { + "other" : "за {0} секунди", + "few" : "за {0} секунде", + "one" : "за {0} секунд" + } + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/bs.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/bs.json new file mode 100644 index 0000000..b8f8ebf --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/bs.json @@ -0,0 +1,237 @@ +{ + "narrow" : { + "second" : { + "past" : "prije {0} sek.", + "future" : "za {0} sek.", + "current" : "sada" + }, + "week" : { + "current" : "ove sedmice", + "next" : "sljedeće sedmice", + "past" : "prije {0} sed.", + "previous" : "prošle sedmice", + "future" : "za {0} sed." + }, + "year" : { + "next" : "sljedeće godine", + "previous" : "prošle godine", + "current" : "ove godine", + "past" : "prije {0} g.", + "future" : "za {0} g." + }, + "minute" : { + "current" : "ova minuta", + "past" : "prije {0} min.", + "future" : "za {0} min." + }, + "quarter" : { + "previous" : "posljednji kvartal", + "future" : "za {0} kv.", + "next" : "sljedeći kvartal", + "current" : "ovaj kvartal", + "past" : "prije {0} kv." + }, + "hour" : { + "future" : { + "other" : "za {0} sati", + "one" : "za {0} sat", + "few" : "za {0} sata" + }, + "past" : { + "other" : "prije {0} sati", + "one" : "prije {0} sat", + "few" : "prije {0} sata" + }, + "current" : "ovaj sat" + }, + "day" : { + "previous" : "jučer", + "current" : "danas", + "next" : "sutra", + "past" : "prije {0} d.", + "future" : "za {0} d." + }, + "now" : "sada", + "month" : { + "future" : "za {0} mj.", + "previous" : "prošli mjesec", + "next" : "sljedeći mjesec", + "current" : "ovaj mjesec", + "past" : "prije {0} mj." + } + }, + "long" : { + "week" : { + "previous" : "prošle sedmice", + "future" : { + "other" : "za {0} sedmica", + "one" : "za {0} sedmicu", + "few" : "za {0} sedmice" + }, + "past" : { + "few" : "prije {0} sedmice", + "one" : "prije {0} sedmicu", + "other" : "prije {0} sedmica" + }, + "current" : "ove sedmice", + "next" : "sljedeće sedmice" + }, + "second" : { + "future" : { + "few" : "za {0} sekunde", + "one" : "za {0} sekundu", + "other" : "za {0} sekundi" + }, + "current" : "sada", + "past" : { + "one" : "prije {0} sekundu", + "other" : "prije {0} sekundi", + "few" : "prije {0} sekunde" + } + }, + "minute" : { + "future" : { + "one" : "za {0} minutu", + "few" : "za {0} minute", + "other" : "za {0} minuta" + }, + "current" : "ova minuta", + "past" : { + "one" : "prije {0} minutu", + "other" : "prije {0} minuta", + "few" : "prije {0} minute" + } + }, + "quarter" : { + "future" : { + "one" : "za {0} kvartal", + "other" : "za {0} kvartala" + }, + "current" : "ovaj kvartal", + "next" : "sljedeći kvartal", + "past" : { + "other" : "prije {0} kvartala", + "one" : "prije {0} kvartal" + }, + "previous" : "posljednji kvartal" + }, + "day" : { + "previous" : "jučer", + "current" : "danas", + "next" : "sutra", + "past" : { + "one" : "prije {0} dan", + "other" : "prije {0} dana" + }, + "future" : { + "other" : "za {0} dana", + "one" : "za {0} dan" + } + }, + "now" : "sada", + "month" : { + "next" : "sljedeći mjesec", + "current" : "ovaj mjesec", + "future" : { + "one" : "za {0} mjesec", + "other" : "za {0} mjeseci", + "few" : "za {0} mjeseca" + }, + "previous" : "prošli mjesec", + "past" : { + "few" : "prije {0} mjeseca", + "one" : "prije {0} mjesec", + "other" : "prije {0} mjeseci" + } + }, + "hour" : { + "past" : { + "few" : "prije {0} sata", + "other" : "prije {0} sati", + "one" : "prije {0} sat" + }, + "current" : "ovaj sat", + "future" : { + "few" : "za {0} sata", + "other" : "za {0} sati", + "one" : "za {0} sat" + } + }, + "year" : { + "current" : "ove godine", + "past" : { + "one" : "prije {0} godinu", + "few" : "prije {0} godine", + "other" : "prije {0} godina" + }, + "previous" : "prošle godine", + "future" : { + "one" : "za {0} godinu", + "other" : "za {0} godina", + "few" : "za {0} godine" + }, + "next" : "sljedeće godine" + } + }, + "short" : { + "week" : { + "previous" : "prošle sedmice", + "current" : "ove sedmice", + "next" : "sljedeće sedmice", + "past" : "prije {0} sed.", + "future" : "za {0} sed." + }, + "day" : { + "next" : "sutra", + "past" : "prije {0} d.", + "future" : "za {0} d.", + "previous" : "jučer", + "current" : "danas" + }, + "second" : { + "future" : "za {0} sek.", + "current" : "sada", + "past" : "prije {0} sek." + }, + "month" : { + "previous" : "prošli mjesec", + "next" : "sljedeći mjesec", + "past" : "prije {0} mj.", + "current" : "ovaj mjesec", + "future" : "za {0} mj." + }, + "hour" : { + "future" : { + "few" : "za {0} sata", + "other" : "za {0} sati", + "one" : "za {0} sat" + }, + "current" : "ovaj sat", + "past" : { + "other" : "prije {0} sati", + "one" : "prije {0} sat", + "few" : "prije {0} sata" + } + }, + "now" : "sada", + "quarter" : { + "future" : "za {0} kv.", + "next" : "sljedeći kvartal", + "previous" : "posljednji kvartal", + "current" : "ovaj kvartal", + "past" : "prije {0} kv." + }, + "minute" : { + "current" : "ova minuta", + "past" : "prije {0} min.", + "future" : "za {0} min." + }, + "year" : { + "next" : "sljedeće godine", + "future" : "za {0} god.", + "current" : "ove godine", + "past" : "prije {0} god.", + "previous" : "prošle godine" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ca.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ca.json new file mode 100644 index 0000000..341e87b --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ca.json @@ -0,0 +1,245 @@ +{ + "long" : { + "minute" : { + "current" : "aquest minut", + "past" : { + "one" : "fa {0} minut", + "other" : "fa {0} minuts" + }, + "future" : { + "other" : "d’aquí a {0} minuts", + "one" : "d’aquí a {0} minut" + } + }, + "hour" : { + "past" : { + "other" : "fa {0} hores", + "one" : "fa {0} hora" + }, + "future" : { + "one" : "d’aquí a {0} hora", + "other" : "d’aquí a {0} hores" + }, + "current" : "aquesta hora" + }, + "quarter" : { + "current" : "aquest trimestre", + "next" : "el trimestre que ve", + "previous" : "el trimestre passat", + "past" : { + "other" : "fa {0} trimestres", + "one" : "fa {0} trimestre" + }, + "future" : { + "one" : "d’aquí a {0} trimestre", + "other" : "d’aquí a {0} trimestres" + } + }, + "now" : "ara", + "year" : { + "next" : "l’any que ve", + "future" : { + "one" : "d’aquí a {0} any", + "other" : "d’aquí a {0} anys" + }, + "past" : { + "one" : "fa {0} any", + "other" : "fa {0} anys" + }, + "current" : "enguany", + "previous" : "l’any passat" + }, + "month" : { + "future" : { + "other" : "d’aquí a {0} mesos", + "one" : "d’aquí a {0} mes" + }, + "previous" : "el mes passat", + "next" : "el mes que ve", + "past" : { + "other" : "fa {0} mesos", + "one" : "fa {0} mes" + }, + "current" : "aquest mes" + }, + "second" : { + "future" : { + "one" : "d’aquí a {0} segon", + "other" : "d’aquí a {0} segons" + }, + "current" : "ara", + "past" : { + "other" : "fa {0} segons", + "one" : "fa {0} segon" + } + }, + "day" : { + "previous" : "ahir", + "current" : "avui", + "next" : "demà", + "future" : { + "other" : "d’aquí a {0} dies", + "one" : "d’aquí a {0} dia" + }, + "past" : { + "one" : "fa {0} dia", + "other" : "fa {0} dies" + } + }, + "week" : { + "current" : "aquesta setmana", + "previous" : "la setmana passada", + "past" : { + "other" : "fa {0} setmanes", + "one" : "fa {0} setmana" + }, + "future" : { + "one" : "d’aquí a {0} setmana", + "other" : "d’aquí a {0} setmanes" + }, + "next" : "la setmana que ve" + } + }, + "narrow" : { + "year" : { + "previous" : "l’any passat", + "current" : "enguany", + "next" : "l’any que ve", + "past" : { + "one" : "fa {0} any", + "other" : "fa {0} anys" + }, + "future" : { + "other" : "d’aquí a {0} anys", + "one" : "d’aquí a {0} any" + } + }, + "second" : { + "current" : "ara", + "future" : "d’aquí a {0} s", + "past" : "fa {0} s" + }, + "hour" : { + "past" : "fa {0} h", + "current" : "aquesta hora", + "future" : "d‘aquí a {0} h" + }, + "week" : { + "current" : "aquesta setm.", + "previous" : "setm. passada", + "past" : "fa {0} setm.", + "next" : "setm. vinent", + "future" : "d’aquí a {0} setm." + }, + "day" : { + "current" : "avui", + "next" : "demà", + "past" : { + "other" : "fa {0} dies", + "one" : "fa {0} dia" + }, + "previous" : "ahir", + "future" : { + "one" : "d’aquí a {0} dia", + "other" : "d’aquí a {0} dies" + } + }, + "month" : { + "current" : "aquest mes", + "next" : "mes vinent", + "past" : { + "one" : "fa {0} mes", + "other" : "fa {0} mesos" + }, + "previous" : "mes passat", + "future" : { + "one" : "d’aquí a {0} mes", + "other" : "d’aquí a {0} mesos" + } + }, + "now" : "ara", + "minute" : { + "current" : "aquest minut", + "past" : "fa {0} min", + "future" : "d’aquí a {0} min" + }, + "quarter" : { + "previous" : "trim. passat", + "current" : "aquest trim.", + "past" : "fa {0} trim.", + "future" : "d’aquí a {0} trim.", + "next" : "trim. vinent" + } + }, + "short" : { + "month" : { + "next" : "el mes que ve", + "past" : { + "other" : "fa {0} mesos", + "one" : "fa {0} mes" + }, + "current" : "aquest mes", + "previous" : "el mes passat", + "future" : { + "other" : "d’aquí a {0} mesos", + "one" : "d’aquí a {0} mes" + } + }, + "now" : "ara", + "day" : { + "next" : "demà", + "current" : "avui", + "previous" : "ahir", + "past" : { + "one" : "fa {0} dia", + "other" : "fa {0} dies" + }, + "future" : { + "one" : "d’aquí a {0} dia", + "other" : "d’aquí a {0} dies" + } + }, + "year" : { + "current" : "enguany", + "next" : "l’any que ve", + "past" : { + "other" : "fa {0} anys", + "one" : "fa {0} any" + }, + "future" : { + "one" : "d’aquí a {0} any", + "other" : "d’aquí a {0} anys" + }, + "previous" : "l’any passat" + }, + "hour" : { + "current" : "aquesta hora", + "past" : "fa {0} h", + "future" : "d’aquí a {0} h" + }, + "minute" : { + "past" : "fa {0} min", + "future" : "d’aquí a {0} min", + "current" : "aquest minut" + }, + "second" : { + "future" : "d’aquí a {0} s", + "past" : "fa {0} s", + "current" : "ara" + }, + "quarter" : { + "current" : "aquest trim.", + "future" : "d’aquí a {0} trim.", + "previous" : "el trim. passat", + "next" : "el trim. que ve", + "past" : "fa {0} trim." + }, + "week" : { + "future" : "d’aquí a {0} setm.", + "previous" : "la setm. passada", + "next" : "la setm. que ve", + "past" : "fa {0} setm.", + "current" : "aquesta setm." + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/cs.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/cs.json new file mode 100644 index 0000000..6363147 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/cs.json @@ -0,0 +1,266 @@ +{ + "long" : { + "month" : { + "past" : { + "many" : "před {0} měsíce", + "other" : "před {0} měsíci", + "one" : "před {0} měsícem" + }, + "previous" : "minulý měsíc", + "current" : "tento měsíc", + "future" : { + "one" : "za {0} měsíc", + "many" : "za {0} měsíce", + "few" : "za {0} měsíce", + "other" : "za {0} měsíců" + }, + "next" : "příští měsíc" + }, + "year" : { + "future" : { + "other" : "za {0} let", + "many" : "za {0} roku", + "one" : "za {0} rok", + "few" : "za {0} roky" + }, + "past" : { + "one" : "před {0} rokem", + "many" : "před {0} roku", + "other" : "před {0} lety" + }, + "current" : "tento rok", + "next" : "příští rok", + "previous" : "minulý rok" + }, + "second" : { + "current" : "nyní", + "past" : { + "one" : "před {0} sekundou", + "other" : "před {0} sekundami", + "many" : "před {0} sekundy" + }, + "future" : { + "many" : "za {0} sekundy", + "other" : "za {0} sekund", + "one" : "za {0} sekundu", + "few" : "za {0} sekundy" + } + }, + "quarter" : { + "future" : "za {0} čtvrtletí", + "previous" : "minulé čtvrtletí", + "current" : "toto čtvrtletí", + "past" : { + "one" : "před {0} čtvrtletím", + "many" : "před {0} čtvrtletí", + "other" : "před {0} čtvrtletími" + }, + "next" : "příští čtvrtletí" + }, + "week" : { + "past" : { + "many" : "před {0} týdne", + "one" : "před {0} týdnem", + "other" : "před {0} týdny" + }, + "current" : "tento týden", + "future" : { + "other" : "za {0} týdnů", + "one" : "za {0} týden", + "few" : "za {0} týdny", + "many" : "za {0} týdne" + }, + "previous" : "minulý týden", + "next" : "příští týden" + }, + "minute" : { + "current" : "tuto minutu", + "past" : { + "one" : "před {0} minutou", + "other" : "před {0} minutami", + "many" : "před {0} minuty" + }, + "future" : { + "few" : "za {0} minuty", + "one" : "za {0} minutu", + "many" : "za {0} minuty", + "other" : "za {0} minut" + } + }, + "day" : { + "past" : { + "other" : "před {0} dny", + "one" : "před {0} dnem", + "many" : "před {0} dne" + }, + "previous" : "včera", + "current" : "dnes", + "next" : "zítra", + "future" : { + "few" : "za {0} dny", + "many" : "za {0} dne", + "other" : "za {0} dní", + "one" : "za {0} den" + } + }, + "hour" : { + "future" : { + "many" : "za {0} hodiny", + "other" : "za {0} hodin", + "one" : "za {0} hodinu", + "few" : "za {0} hodiny" + }, + "current" : "tuto hodinu", + "past" : { + "many" : "před {0} hodiny", + "one" : "před {0} hodinou", + "other" : "před {0} hodinami" + } + }, + "now" : "nyní" + }, + "narrow" : { + "hour" : { + "future" : "za {0} h", + "current" : "tuto hodinu", + "past" : "před {0} h" + }, + "minute" : { + "past" : "před {0} min", + "future" : "za {0} min", + "current" : "tuto minutu" + }, + "second" : { + "past" : "před {0} s", + "current" : "nyní", + "future" : "za {0} s" + }, + "now" : "nyní", + "quarter" : { + "past" : "-{0} Q", + "previous" : "minulé čtvrtletí", + "next" : "příští čtvrtletí", + "future" : "+{0} Q", + "current" : "toto čtvrtletí" + }, + "week" : { + "previous" : "minulý týd.", + "past" : "před {0} týd.", + "next" : "příští týd.", + "current" : "tento týd.", + "future" : "za {0} týd." + }, + "year" : { + "past" : { + "other" : "před {0} l.", + "many" : "před {0} r.", + "one" : "před {0} r.", + "few" : "před {0} r." + }, + "previous" : "minulý rok", + "current" : "tento rok", + "next" : "příští rok", + "future" : { + "few" : "za {0} r.", + "many" : "za {0} r.", + "one" : "za {0} r.", + "other" : "za {0} l." + } + }, + "day" : { + "past" : { + "one" : "před {0} dnem", + "other" : "před {0} dny", + "many" : "před {0} dne" + }, + "previous" : "včera", + "future" : { + "one" : "za {0} den", + "few" : "za {0} dny", + "many" : "za {0} dne", + "other" : "za {0} dní" + }, + "next" : "zítra", + "current" : "dnes" + }, + "month" : { + "current" : "tento měs.", + "next" : "příští měs.", + "future" : "za {0} měs.", + "past" : "před {0} měs.", + "previous" : "minuý měs." + } + }, + "short" : { + "year" : { + "current" : "tento rok", + "previous" : "minulý rok", + "next" : "příští rok", + "past" : { + "few" : "před {0} r.", + "one" : "před {0} r.", + "many" : "před {0} r.", + "other" : "před {0} l." + }, + "future" : { + "few" : "za {0} r.", + "many" : "za {0} r.", + "other" : "za {0} l.", + "one" : "za {0} r." + } + }, + "quarter" : { + "next" : "příští čtvrtletí", + "future" : "+{0} Q", + "current" : "toto čtvrtletí", + "past" : "-{0} Q", + "previous" : "minulé čtvrtletí" + }, + "second" : { + "past" : "před {0} s", + "future" : "za {0} s", + "current" : "nyní" + }, + "minute" : { + "future" : "za {0} min", + "current" : "tuto minutu", + "past" : "před {0} min" + }, + "day" : { + "past" : { + "many" : "před {0} dne", + "other" : "před {0} dny", + "one" : "před {0} dnem" + }, + "next" : "zítra", + "future" : { + "one" : "za {0} den", + "many" : "za {0} dne", + "other" : "za {0} dní", + "few" : "za {0} dny" + }, + "previous" : "včera", + "current" : "dnes" + }, + "month" : { + "future" : "za {0} měs.", + "next" : "příští měs.", + "previous" : "minulý měs.", + "current" : "tento měs.", + "past" : "před {0} měs." + }, + "hour" : { + "future" : "za {0} h", + "current" : "tuto hodinu", + "past" : "před {0} h" + }, + "now" : "nyní", + "week" : { + "previous" : "minulý týd.", + "next" : "příští týd.", + "past" : "před {0} týd.", + "current" : "tento týd.", + "future" : "za {0} týd." + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/cy.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/cy.json new file mode 100644 index 0000000..aee3d9a --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/cy.json @@ -0,0 +1,283 @@ +{ + "narrow" : { + "now" : "nawr", + "minute" : { + "past" : "{0} mun. yn ôl", + "current" : "y funud hon", + "future" : "ymhen {0} mun." + }, + "day" : { + "current" : "heddiw", + "future" : "ymhen {0} diwrnod", + "next" : "yfory", + "past" : { + "two" : "{0} ddiwrnod yn ôl", + "other" : "{0} diwrnod yn ôl" + }, + "previous" : "ddoe" + }, + "month" : { + "next" : "mis nesaf", + "past" : { + "two" : "{0} fis yn ôl", + "other" : "{0} mis yn ôl" + }, + "future" : { + "one" : "ymhen mis", + "two" : "ymhen deufis", + "other" : "ymhen {0} mis" + }, + "previous" : "mis diwethaf", + "current" : "y mis hwn" + }, + "week" : { + "future" : "ymhen {0} wythnos", + "previous" : "wythnos ddiwethaf", + "current" : "yr wythnos hon", + "next" : "wythnos nesaf", + "past" : { + "two" : "pythefnos yn ôl", + "other" : "{0} wythnos yn ôl" + } + }, + "quarter" : { + "previous" : "chwarter olaf", + "future" : "ymhen {0} chwarter", + "next" : "chwarter nesaf", + "current" : "chwarter hwn", + "past" : { + "one" : "{0} chwarter yn ôl", + "few" : "{0} chwarter yn ôl", + "many" : "{0} chwarter yn ôl", + "other" : "{0} o chwarteri yn ôl", + "two" : "{0} chwarter yn ôl" + } + }, + "year" : { + "future" : { + "few" : "ymhen {0} blynedd", + "one" : "ymhen blwyddyn", + "many" : "ymhen {0} blynedd", + "other" : "ymhen {0} mlynedd", + "two" : "ymhen {0} flynedd" + }, + "next" : "blwyddyn nesaf", + "past" : { + "other" : "{0} o flynyddoedd yn ôl", + "two" : "{0} flynedd yn ôl", + "few" : "{0} blynedd yn ôl", + "many" : "{0} blynedd yn ôl", + "one" : "blwyddyn yn ôl" + }, + "previous" : "llynedd", + "current" : "eleni" + }, + "hour" : { + "current" : "yr awr hon", + "past" : "{0} awr yn ôl", + "future" : "ymhen {0} awr" + }, + "second" : { + "past" : "{0} eiliad yn ôl", + "current" : "nawr", + "future" : "ymhen {0} eiliad" + } + }, + "long" : { + "now" : "nawr", + "year" : { + "past" : { + "one" : "blwyddyn yn ôl", + "two" : "{0} flynedd yn ôl", + "few" : "{0} blynedd yn ôl", + "many" : "{0} blynedd yn ôl", + "other" : "{0} o flynyddoedd yn ôl" + }, + "previous" : "llynedd", + "current" : "eleni", + "next" : "blwyddyn nesaf", + "future" : { + "many" : "ymhen {0} blynedd", + "few" : "ymhen {0} blynedd", + "one" : "ymhen blwyddyn", + "other" : "ymhen {0} mlynedd", + "two" : "ymhen {0} flynedd" + } + }, + "month" : { + "next" : "mis nesaf", + "current" : "y mis hwn", + "past" : { + "two" : "{0} fis yn ôl", + "other" : "{0} mis yn ôl" + }, + "previous" : "mis diwethaf", + "future" : { + "two" : "ymhen deufis", + "other" : "ymhen {0} mis", + "one" : "ymhen mis" + } + }, + "week" : { + "next" : "wythnos nesaf", + "future" : { + "other" : "ymhen {0} wythnos", + "one" : "ymhen wythnos", + "two" : "ymhen pythefnos" + }, + "current" : "yr wythnos hon", + "past" : "{0} wythnos yn ôl", + "previous" : "wythnos ddiwethaf" + }, + "hour" : { + "future" : { + "one" : "ymhen awr", + "other" : "ymhen {0} awr" + }, + "current" : "yr awr hon", + "past" : "{0} awr yn ôl" + }, + "minute" : { + "current" : "y funud hon", + "past" : "{0} munud yn ôl", + "future" : "ymhen {0} munud" + }, + "second" : { + "future" : "ymhen {0} eiliad", + "past" : "{0} eiliad yn ôl", + "current" : "nawr" + }, + "quarter" : { + "future" : "ymhen {0} chwarter", + "current" : "chwarter hwn", + "previous" : "chwarter olaf", + "next" : "chwarter nesaf", + "past" : { + "many" : "{0} chwarter yn ôl", + "other" : "{0} o chwarteri yn ôl", + "one" : "{0} chwarter yn ôl", + "few" : "{0} chwarter yn ôl", + "two" : "{0} chwarter yn ôl" + } + }, + "day" : { + "future" : { + "one" : "ymhen diwrnod", + "two" : "ymhen deuddydd", + "other" : "ymhen {0} diwrnod" + }, + "previous" : "ddoe", + "current" : "heddiw", + "next" : "yfory", + "past" : { + "two" : "{0} ddiwrnod yn ôl", + "other" : "{0} diwrnod yn ôl" + } + } + }, + "short" : { + "year" : { + "current" : "eleni", + "past" : { + "other" : "{0} o flynyddoedd yn ôl", + "many" : "{0} blynedd yn ôl", + "one" : "blwyddyn yn ôl", + "two" : "{0} flynedd yn ôl", + "few" : "{0} blynedd yn ôl" + }, + "future" : { + "few" : "ymhen {0} blynedd", + "one" : "ymhen blwyddyn", + "two" : "ymhen {0} flynedd", + "many" : "ymhen {0} blynedd", + "other" : "ymhen {0} mlynedd" + }, + "next" : "blwyddyn nesaf", + "previous" : "llynedd" + }, + "minute" : { + "future" : { + "one" : "ymhen {0} mun.", + "other" : "ymhen {0} munud", + "two" : "ymhen {0} fun." + }, + "past" : { + "two" : "{0} fun. yn ôl", + "other" : "{0} munud yn ôl" + }, + "current" : "y funud hon" + }, + "day" : { + "previous" : "ddoe", + "current" : "heddiw", + "next" : "yfory", + "past" : { + "two" : "{0} ddiwrnod yn ôl", + "other" : "{0} diwrnod yn ôl" + }, + "future" : { + "two" : "ymhen deuddydd", + "one" : "ymhen diwrnod", + "other" : "ymhen {0} diwrnod" + } + }, + "second" : { + "past" : "{0} eiliad yn ôl", + "current" : "nawr", + "future" : "ymhen {0} eiliad" + }, + "now" : "nawr", + "month" : { + "future" : { + "one" : "ymhen mis", + "two" : "ymhen deufis", + "other" : "ymhen {0} mis" + }, + "current" : "y mis hwn", + "next" : "mis nesaf", + "previous" : "mis diwethaf", + "past" : { + "two" : "deufis yn ôl", + "other" : "{0} mis yn ôl" + } + }, + "week" : { + "past" : { + "two" : "pythefnos yn ôl", + "other" : "{0} wythnos yn ôl" + }, + "previous" : "wythnos ddiwethaf", + "future" : { + "one" : "ymhen wythnos", + "other" : "ymhen {0} wythnos", + "two" : "ymhen pythefnos" + }, + "next" : "wythnos nesaf", + "current" : "yr wythnos hon" + }, + "quarter" : { + "next" : "chwarter nesaf", + "current" : "chwarter hwn", + "previous" : "chwarter olaf", + "past" : { + "many" : "{0} chwarter yn ôl", + "one" : "{0} chwarter yn ôl", + "few" : "{0} chwarter yn ôl", + "other" : "{0} o chwarteri yn ôl", + "two" : "{0} chwarter yn ôl" + }, + "future" : "ymhen {0} chwarter" + }, + "hour" : { + "current" : "yr awr hon", + "future" : { + "one" : "ymhen awr", + "other" : "ymhen {0} awr" + }, + "past" : { + "other" : "{0} awr yn ôl", + "one" : "awr yn ôl" + } + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/da.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/da.json new file mode 100644 index 0000000..11f16e3 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/da.json @@ -0,0 +1,251 @@ +{ + "narrow" : { + "hour" : { + "current" : "i den kommende time", + "future" : { + "one" : "om {0} time", + "other" : "om {0} timer" + }, + "past" : { + "other" : "for {0} timer siden", + "one" : "for {0} time siden" + } + }, + "week" : { + "previous" : "sidste uge", + "current" : "denne uge", + "next" : "næste uge", + "past" : { + "one" : "for {0} uge siden", + "other" : "for {0} uger siden" + }, + "future" : { + "one" : "om {0} uge", + "other" : "om {0} uger" + } + }, + "second" : { + "current" : "nu", + "future" : "om {0} sek.", + "past" : "for {0} sek. siden" + }, + "month" : { + "previous" : "sidste md.", + "next" : "næste md.", + "future" : { + "other" : "om {0} mdr.", + "one" : "om {0} md." + }, + "current" : "denne md.", + "past" : { + "other" : "for {0} mdr. siden", + "one" : "for {0} md. siden" + } + }, + "minute" : { + "past" : "for {0} min. siden", + "future" : "om {0} min.", + "current" : "i det kommende minut" + }, + "now" : "nu", + "year" : { + "future" : "om {0} år", + "previous" : "sidste år", + "current" : "i år", + "next" : "næste år", + "past" : "for {0} år siden" + }, + "quarter" : { + "next" : "næste kvt.", + "future" : "om {0} kvt.", + "previous" : "sidste kvt.", + "current" : "dette kvt.", + "past" : "for {0} kvt. siden" + }, + "day" : { + "previous" : "i går", + "current" : "i dag", + "next" : "i morgen", + "past" : { + "one" : "for {0} dag siden", + "other" : "for {0} dage siden" + }, + "future" : { + "one" : "om {0} dag", + "other" : "om {0} dage" + } + } + }, + "long" : { + "day" : { + "previous" : "i går", + "next" : "i morgen", + "future" : { + "other" : "om {0} dage", + "one" : "om {0} dag" + }, + "current" : "i dag", + "past" : { + "one" : "for {0} dag siden", + "other" : "for {0} dage siden" + } + }, + "second" : { + "past" : { + "other" : "for {0} sekunder siden", + "one" : "for {0} sekund siden" + }, + "current" : "nu", + "future" : { + "one" : "om {0} sekund", + "other" : "om {0} sekunder" + } + }, + "minute" : { + "past" : { + "one" : "for {0} minut siden", + "other" : "for {0} minutter siden" + }, + "current" : "i det kommende minut", + "future" : { + "one" : "om {0} minut", + "other" : "om {0} minutter" + } + }, + "week" : { + "current" : "denne uge", + "past" : { + "one" : "for {0} uge siden", + "other" : "for {0} uger siden" + }, + "future" : { + "other" : "om {0} uger", + "one" : "om {0} uge" + }, + "previous" : "sidste uge", + "next" : "næste uge" + }, + "now" : "nu", + "year" : { + "current" : "i år", + "next" : "næste år", + "past" : "for {0} år siden", + "previous" : "sidste år", + "future" : "om {0} år" + }, + "month" : { + "previous" : "sidste måned", + "past" : { + "one" : "for {0} måned siden", + "other" : "for {0} måneder siden" + }, + "future" : { + "one" : "om {0} måned", + "other" : "om {0} måneder" + }, + "current" : "denne måned", + "next" : "næste måned" + }, + "hour" : { + "future" : { + "one" : "om {0} time", + "other" : "om {0} timer" + }, + "past" : { + "other" : "for {0} timer siden", + "one" : "for {0} time siden" + }, + "current" : "i den kommende time" + }, + "quarter" : { + "current" : "dette kvartal", + "future" : { + "other" : "om {0} kvartaler", + "one" : "om {0} kvartal" + }, + "next" : "næste kvartal", + "previous" : "sidste kvartal", + "past" : { + "other" : "for {0} kvartaler siden", + "one" : "for {0} kvartal siden" + } + } + }, + "short" : { + "hour" : { + "future" : { + "one" : "om {0} time", + "other" : "om {0} timer" + }, + "past" : { + "other" : "for {0} timer siden", + "one" : "for {0} time siden" + }, + "current" : "i den kommende time" + }, + "now" : "nu", + "quarter" : { + "current" : "dette kvt.", + "future" : "om {0} kvt.", + "past" : "for {0} kvt. siden", + "next" : "næste kvt.", + "previous" : "sidste kvt." + }, + "day" : { + "current" : "i dag", + "past" : { + "one" : "for {0} dag siden", + "other" : "for {0} dage siden" + }, + "future" : { + "one" : "om {0} dag", + "other" : "om {0} dage" + }, + "next" : "i morgen", + "previous" : "i går" + }, + "week" : { + "current" : "denne uge", + "future" : { + "one" : "om {0} uge", + "other" : "om {0} uger" + }, + "previous" : "sidste uge", + "next" : "næste uge", + "past" : { + "one" : "for {0} uge siden", + "other" : "for {0} uger siden" + } + }, + "minute" : { + "past" : "for {0} min. siden", + "current" : "i det kommende minut", + "future" : "om {0} min." + }, + "second" : { + "future" : "om {0} sek.", + "past" : "for {0} sek. siden", + "current" : "nu" + }, + "month" : { + "future" : { + "one" : "om {0} md.", + "other" : "om {0} mdr." + }, + "previous" : "sidste md.", + "next" : "næste md.", + "current" : "denne md.", + "past" : { + "other" : "for {0} mdr. siden", + "one" : "for {0} md. siden" + } + }, + "year" : { + "next" : "næste år", + "previous" : "sidste år", + "current" : "i år", + "future" : "om {0} år", + "past" : "for {0} år siden" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/de.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/de.json new file mode 100644 index 0000000..f83816a --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/de.json @@ -0,0 +1,251 @@ +{ + "narrow" : { + "year" : { + "past" : { + "other" : "vor {0} Jahren", + "one" : "vor {0} Jahr" + }, + "current" : "dieses Jahr", + "future" : { + "one" : "in {0} Jahr", + "other" : "in {0} Jahren" + }, + "previous" : "letztes Jahr", + "next" : "nächstes Jahr" + }, + "minute" : { + "future" : "in {0} m", + "current" : "in dieser Minute", + "past" : "vor {0} m" + }, + "day" : { + "current" : "heute", + "past" : { + "one" : "vor {0} Tag", + "other" : "vor {0} Tagen" + }, + "previous" : "gestern", + "next" : "morgen", + "future" : { + "one" : "in {0} Tag", + "other" : "in {0} Tagen" + } + }, + "now" : "jetzt", + "week" : { + "current" : "diese Woche", + "future" : "in {0} Wo.", + "next" : "nächste Woche", + "past" : "vor {0} Wo.", + "previous" : "letzte Woche" + }, + "second" : { + "current" : "jetzt", + "past" : "vor {0} s", + "future" : "in {0} s" + }, + "hour" : { + "current" : "in dieser Stunde", + "future" : "in {0} Std.", + "past" : "vor {0} Std." + }, + "quarter" : { + "current" : "dieses Quartal", + "previous" : "letztes Quartal", + "next" : "nächstes Quartal", + "future" : "in {0} Q", + "past" : "vor {0} Q" + }, + "month" : { + "current" : "diesen Monat", + "future" : { + "one" : "in {0} Monat", + "other" : "in {0} Monaten" + }, + "previous" : "letzten Monat", + "past" : { + "other" : "vor {0} Monaten", + "one" : "vor {0} Monat" + }, + "next" : "nächsten Monat" + } + }, + "long" : { + "month" : { + "previous" : "letzten Monat", + "next" : "nächsten Monat", + "past" : { + "other" : "vor {0} Monaten", + "one" : "vor {0} Monat" + }, + "current" : "diesen Monat", + "future" : { + "one" : "in {0} Monat", + "other" : "in {0} Monaten" + } + }, + "second" : { + "past" : { + "one" : "vor {0} Sekunde", + "other" : "vor {0} Sekunden" + }, + "future" : { + "other" : "in {0} Sekunden", + "one" : "in {0} Sekunde" + }, + "current" : "jetzt" + }, + "hour" : { + "past" : { + "other" : "vor {0} Stunden", + "one" : "vor {0} Stunde" + }, + "current" : "in dieser Stunde", + "future" : { + "one" : "in {0} Stunde", + "other" : "in {0} Stunden" + } + }, + "quarter" : { + "previous" : "letztes Quartal", + "future" : { + "one" : "in {0} Quartal", + "other" : "in {0} Quartalen" + }, + "next" : "nächstes Quartal", + "current" : "dieses Quartal", + "past" : { + "one" : "vor {0} Quartal", + "other" : "vor {0} Quartalen" + } + }, + "now" : "jetzt", + "minute" : { + "current" : "in dieser Minute", + "future" : { + "other" : "in {0} Minuten", + "one" : "in {0} Minute" + }, + "past" : { + "other" : "vor {0} Minuten", + "one" : "vor {0} Minute" + } + }, + "day" : { + "past" : { + "one" : "vor {0} Tag", + "other" : "vor {0} Tagen" + }, + "previous" : "gestern", + "current" : "heute", + "future" : { + "one" : "in {0} Tag", + "other" : "in {0} Tagen" + }, + "next" : "morgen" + }, + "year" : { + "past" : { + "other" : "vor {0} Jahren", + "one" : "vor {0} Jahr" + }, + "next" : "nächstes Jahr", + "current" : "dieses Jahr", + "previous" : "letztes Jahr", + "future" : { + "one" : "in {0} Jahr", + "other" : "in {0} Jahren" + } + }, + "week" : { + "current" : "diese Woche", + "past" : { + "other" : "vor {0} Wochen", + "one" : "vor {0} Woche" + }, + "previous" : "letzte Woche", + "future" : { + "one" : "in {0} Woche", + "other" : "in {0} Wochen" + }, + "next" : "nächste Woche" + } + }, + "short" : { + "minute" : { + "past" : "vor {0} Min.", + "future" : "in {0} Min.", + "current" : "in dieser Minute" + }, + "week" : { + "past" : { + "one" : "vor {0} Woche", + "other" : "vor {0} Wochen" + }, + "future" : { + "one" : "in {0} Woche", + "other" : "in {0} Wochen" + }, + "next" : "nächste Woche", + "current" : "diese Woche", + "previous" : "letzte Woche" + }, + "day" : { + "future" : { + "one" : "in {0} Tag", + "other" : "in {0} Tagen" + }, + "current" : "heute", + "previous" : "gestern", + "next" : "morgen", + "past" : { + "one" : "vor {0} Tag", + "other" : "vor {0} Tagen" + } + }, + "second" : { + "past" : "vor {0} Sek.", + "future" : "in {0} Sek.", + "current" : "jetzt" + }, + "now" : "jetzt", + "year" : { + "past" : { + "other" : "vor {0} Jahren", + "one" : "vor {0} Jahr" + }, + "future" : { + "one" : "in {0} Jahr", + "other" : "in {0} Jahren" + }, + "previous" : "letztes Jahr", + "current" : "dieses Jahr", + "next" : "nächstes Jahr" + }, + "month" : { + "past" : { + "other" : "vor {0} Monaten", + "one" : "vor {0} Monat" + }, + "future" : { + "other" : "in {0} Monaten", + "one" : "in {0} Monat" + }, + "next" : "nächsten Monat", + "previous" : "letzten Monat", + "current" : "diesen Monat" + }, + "quarter" : { + "previous" : "letztes Quartal", + "future" : "in {0} Quart.", + "next" : "nächstes Quartal", + "past" : "vor {0} Quart.", + "current" : "dieses Quartal" + }, + "hour" : { + "current" : "in dieser Stunde", + "past" : "vor {0} Std.", + "future" : "in {0} Std." + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/dsb.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/dsb.json new file mode 100644 index 0000000..83e5e56 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/dsb.json @@ -0,0 +1,237 @@ +{ + "narrow" : { + "second" : { + "future" : "za {0} s", + "current" : "now", + "past" : "pśed {0} s" + }, + "year" : { + "next" : "znowa", + "past" : "pśed {0} l.", + "future" : "za {0} l.", + "previous" : "łoni", + "current" : "lětosa" + }, + "month" : { + "past" : "pśed {0} mjas.", + "next" : "pśiducy mjasec", + "future" : "za {0} mjas.", + "previous" : "slědny mjasec", + "current" : "ten mjasec" + }, + "minute" : { + "future" : "za {0} m", + "current" : "this minute", + "past" : "pśed {0} m" + }, + "quarter" : { + "previous" : "last quarter", + "current" : "this quarter", + "next" : "next quarter", + "past" : "pśed {0} kw.", + "future" : "za {0} kw." + }, + "hour" : { + "future" : "za {0} g", + "current" : "this hour", + "past" : "pśed {0} g" + }, + "now" : "now", + "week" : { + "next" : "pśiducy tyźeń", + "previous" : "slědny tyźeń", + "past" : "pśed {0} tyź.", + "future" : "za {0} tyź.", + "current" : "ten tyźeń" + }, + "day" : { + "previous" : "cora", + "future" : "za {0} ź", + "past" : "pśed {0} d", + "current" : "źinsa", + "next" : "witśe" + } + }, + "long" : { + "week" : { + "past" : { + "two" : "pśed {0} tyźenjoma", + "other" : "pśed {0} tyźenjami", + "one" : "pśed {0} tyźenjom" + }, + "future" : { + "other" : "za {0} tyźenjow", + "two" : "za {0} tyźenja", + "few" : "za {0} tyźenje", + "one" : "za {0} tyźeń" + }, + "previous" : "slědny tyźeń", + "current" : "ten tyźeń", + "next" : "pśiducy tyźeń" + }, + "now" : "now", + "quarter" : { + "previous" : "last quarter", + "past" : { + "one" : "pśed {0} kwartalom", + "two" : "pśed {0} kwartaloma", + "other" : "pśed {0} kwartalami" + }, + "future" : { + "one" : "za {0} kwartal", + "two" : "za {0} kwartala", + "few" : "za {0} kwartale", + "other" : "za {0} kwartalow" + }, + "current" : "this quarter", + "next" : "next quarter" + }, + "month" : { + "past" : { + "one" : "pśed {0} mjasecom", + "other" : "pśed {0} mjasecami", + "two" : "pśed {0} mjasecoma" + }, + "current" : "ten mjasec", + "next" : "pśiducy mjasec", + "future" : { + "one" : "za {0} mjasec", + "few" : "za {0} mjasecy", + "two" : "za {0} mjaseca", + "other" : "za {0} mjasecow" + }, + "previous" : "slědny mjasec" + }, + "year" : { + "previous" : "łoni", + "future" : { + "one" : "za {0} lěto", + "few" : "za {0} lěta", + "other" : "za {0} lět", + "two" : "za {0} lěśe" + }, + "next" : "znowa", + "current" : "lětosa", + "past" : { + "two" : "pśed {0} lětoma", + "one" : "pśed {0} lětom", + "other" : "pśed {0} lětami" + } + }, + "minute" : { + "current" : "this minute", + "future" : { + "one" : "za {0} minutu", + "few" : "za {0} minuty", + "two" : "za {0} minuśe", + "other" : "za {0} minutow" + }, + "past" : { + "two" : "pśed {0} minutoma", + "one" : "pśed {0} minutu", + "other" : "pśed {0} minutami" + } + }, + "hour" : { + "future" : { + "two" : "za {0} góźinje", + "few" : "za {0} góźiny", + "one" : "za {0} góźinu", + "other" : "za {0} góźin" + }, + "past" : { + "one" : "pśed {0} góźinu", + "two" : "pśed {0} góźinoma", + "other" : "pśed {0} góźinami" + }, + "current" : "this hour" + }, + "day" : { + "previous" : "cora", + "current" : "źinsa", + "next" : "witśe", + "future" : { + "two" : "za {0} dnja", + "few" : "za {0} dny", + "one" : "za {0} źeń", + "other" : "za {0} dnjow" + }, + "past" : { + "other" : "pśed {0} dnjami", + "two" : "pśed {0} dnjoma", + "one" : "pśed {0} dnjom" + } + }, + "second" : { + "future" : { + "two" : "za {0} sekunźe", + "other" : "za {0} sekundow", + "few" : "za {0} sekundy", + "one" : "za {0} sekundu" + }, + "current" : "now", + "past" : { + "one" : "pśed {0} sekundu", + "two" : "pśed {0} sekundoma", + "other" : "pśed {0} sekundami" + } + } + }, + "short" : { + "minute" : { + "past" : "pśed {0} min.", + "current" : "this minute", + "future" : "za {0} min." + }, + "month" : { + "current" : "ten mjasec", + "past" : "pśed {0} mjas.", + "future" : "za {0} mjas.", + "next" : "pśiducy mjasec", + "previous" : "slědny mjasec" + }, + "week" : { + "current" : "ten tyźeń", + "past" : "pśed {0} tyź.", + "future" : "za {0} tyź.", + "next" : "pśiducy tyźeń", + "previous" : "slědny tyźeń" + }, + "hour" : { + "past" : "pśed {0} góź.", + "future" : "za {0} góź.", + "current" : "this hour" + }, + "day" : { + "next" : "witśe", + "current" : "źinsa", + "previous" : "cora", + "past" : "pśed {0} dnj.", + "future" : { + "few" : "za {0} dny", + "other" : "za {0} dnj.", + "one" : "za {0} źeń" + } + }, + "second" : { + "current" : "now", + "past" : "pśed {0} sek.", + "future" : "za {0} sek." + }, + "now" : "now", + "year" : { + "future" : "za {0} l.", + "previous" : "łoni", + "next" : "znowa", + "current" : "lětosa", + "past" : "pśed {0} l." + }, + "quarter" : { + "current" : "this quarter", + "future" : "za {0} kwart.", + "previous" : "last quarter", + "next" : "next quarter", + "past" : "pśed {0} kwart." + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/dz.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/dz.json new file mode 100644 index 0000000..8428014 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/dz.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "quarter" : { + "current" : "this quarter", + "past" : "-{0} Q", + "next" : "next quarter", + "future" : "+{0} Q", + "previous" : "last quarter" + }, + "day" : { + "next" : "ནངས་པ་", + "previous" : "ཁ་ཙ་", + "future" : "ཉིནམ་ {0} ནང་", + "past" : "ཉིནམ་ {0} ཧེ་མ་", + "current" : "ད་རིས་" + }, + "year" : { + "past" : "ལོ་འཁོར་ {0} ཧེ་མ་", + "previous" : "last year", + "future" : "ལོ་འཁོར་ {0} ནང་", + "next" : "next year", + "current" : "this year" + }, + "minute" : { + "current" : "this minute", + "past" : "སྐར་མ་ {0} ཧེ་མ་", + "future" : "སྐར་མ་ {0} ནང་" + }, + "now" : "now", + "week" : { + "current" : "this week", + "previous" : "last week", + "past" : "བངུན་ཕྲག་ {0} ཧེ་མ་", + "next" : "next week", + "future" : "བངུན་ཕྲག་ {0} ནང་" + }, + "second" : { + "current" : "now", + "future" : "སྐར་ཆ་ {0} ནང་", + "past" : "སྐར་ཆ་ {0} ཧེ་མ་" + }, + "month" : { + "future" : "ཟླཝ་ {0} ནང་", + "current" : "this month", + "past" : "ཟླཝ་ {0} ཧེ་མ་", + "previous" : "last month", + "next" : "next month" + }, + "hour" : { + "past" : "ཆུ་ཚོད་ {0} ཧེ་མ་", + "future" : "ཆུ་ཚོད་ {0} ནང་", + "current" : "this hour" + } + }, + "long" : { + "year" : { + "next" : "next year", + "previous" : "last year", + "past" : "ལོ་འཁོར་ {0} ཧེ་མ་", + "future" : "ལོ་འཁོར་ {0} ནང་", + "current" : "this year" + }, + "now" : "now", + "quarter" : { + "next" : "next quarter", + "past" : "-{0} Q", + "future" : "+{0} Q", + "current" : "this quarter", + "previous" : "last quarter" + }, + "month" : { + "past" : "ཟླཝ་ {0} ཧེ་མ་", + "next" : "next month", + "previous" : "last month", + "future" : "ཟླཝ་ {0} ནང་", + "current" : "this month" + }, + "second" : { + "past" : "སྐར་ཆ་ {0} ཧེ་མ་", + "future" : "སྐར་ཆ་ {0} ནང་", + "current" : "now" + }, + "week" : { + "past" : "བངུན་ཕྲག་ {0} ཧེ་མ་", + "previous" : "last week", + "future" : "བངུན་ཕྲག་ {0} ནང་", + "next" : "next week", + "current" : "this week" + }, + "day" : { + "next" : "ནངས་པ་", + "future" : "ཉིནམ་ {0} ནང་", + "previous" : "ཁ་ཙ་", + "current" : "ད་རིས་", + "past" : "ཉིནམ་ {0} ཧེ་མ་" + }, + "minute" : { + "past" : "སྐར་མ་ {0} ཧེ་མ་", + "future" : "སྐར་མ་ {0} ནང་", + "current" : "this minute" + }, + "hour" : { + "current" : "this hour", + "past" : "ཆུ་ཚོད་ {0} ཧེ་མ་", + "future" : "ཆུ་ཚོད་ {0} ནང་" + } + }, + "short" : { + "minute" : { + "current" : "this minute", + "past" : "སྐར་མ་ {0} ཧེ་མ་", + "future" : "སྐར་མ་ {0} ནང་" + }, + "week" : { + "future" : "བངུན་ཕྲག་ {0} ནང་", + "previous" : "last week", + "next" : "next week", + "current" : "this week", + "past" : "བངུན་ཕྲག་ {0} ཧེ་མ་" + }, + "year" : { + "current" : "this year", + "previous" : "last year", + "future" : "ལོ་འཁོར་ {0} ནང་", + "past" : "ལོ་འཁོར་ {0} ཧེ་མ་", + "next" : "next year" + }, + "month" : { + "next" : "next month", + "past" : "ཟླཝ་ {0} ཧེ་མ་", + "future" : "ཟླཝ་ {0} ནང་", + "previous" : "last month", + "current" : "this month" + }, + "quarter" : { + "next" : "next quarter", + "past" : "-{0} Q", + "previous" : "last quarter", + "current" : "this quarter", + "future" : "+{0} Q" + }, + "day" : { + "current" : "ད་རིས་", + "previous" : "ཁ་ཙ་", + "past" : "ཉིནམ་ {0} ཧེ་མ་", + "next" : "ནངས་པ་", + "future" : "ཉིནམ་ {0} ནང་" + }, + "hour" : { + "future" : "ཆུ་ཚོད་ {0} ནང་", + "current" : "this hour", + "past" : "ཆུ་ཚོད་ {0} ཧེ་མ་" + }, + "second" : { + "current" : "now", + "past" : "སྐར་ཆ་ {0} ཧེ་མ་", + "future" : "སྐར་ཆ་ {0} ནང་" + }, + "now" : "now" + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ee.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ee.json new file mode 100644 index 0000000..c1a7bfb --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ee.json @@ -0,0 +1,275 @@ +{ + "narrow" : { + "day" : { + "current" : "egbe", + "next" : "etsɔ si gbɔna", + "future" : { + "one" : "le ŋkeke {0} me", + "other" : "le ŋkeke {0} wo me" + }, + "past" : { + "one" : "ŋkeke {0} si va yi", + "other" : "ŋkeke {0} si wo va yi" + }, + "previous" : "etsɔ si va yi" + }, + "week" : { + "next" : "kɔsiɖa si gbɔ na", + "previous" : "kɔsiɖa si va yi", + "future" : { + "other" : "le kɔsiɖa {0} wo me", + "one" : "le kɔsiɖa {0} me" + }, + "current" : "kɔsiɖa sia", + "past" : { + "one" : "kɔsiɖa {0} si va yi", + "other" : "kɔsiɖa {0} si wo va yi" + } + }, + "year" : { + "current" : "ƒe sia", + "past" : "ƒe {0} si va yi me", + "next" : "ƒe si gbɔ na", + "previous" : "ƒe si va yi", + "future" : "le ƒe {0} si gbɔna me" + }, + "hour" : { + "past" : { + "other" : "gaƒoƒo {0} si wo va yi", + "one" : "gaƒoƒo {0} si va yi" + }, + "future" : { + "other" : "le gaƒoƒo {0} wo me", + "one" : "le gaƒoƒo {0} me" + }, + "current" : "this hour" + }, + "now" : "fifi", + "second" : { + "past" : { + "one" : "sekend {0} si va yi", + "other" : "sekend {0} si wo va yi" + }, + "current" : "fifi", + "future" : { + "other" : "le sekend {0} wo me", + "one" : "le sekend {0} me" + } + }, + "minute" : { + "future" : { + "other" : "le aɖabaƒoƒo {0} wo me", + "one" : "le aɖabaƒoƒo {0} me" + }, + "current" : "this minute", + "past" : { + "one" : "aɖabaƒoƒo {0} si va yi", + "other" : "aɖabaƒoƒo {0} si wo va yi" + } + }, + "quarter" : { + "current" : "this quarter", + "future" : { + "one" : "le kɔta {0} si gbɔna me", + "other" : "le kɔta {0} si gbɔ na me" + }, + "next" : "next quarter", + "previous" : "last quarter", + "past" : "kɔta {0} si va yi me" + }, + "month" : { + "next" : "ɣleti si gbɔ na", + "past" : { + "other" : "ɣleti {0} si wo va yi", + "one" : "ɣleti {0} si va yi" + }, + "future" : { + "one" : "le ɣleti {0} me", + "other" : "le ɣleti {0} wo me" + }, + "previous" : "ɣleti si va yi", + "current" : "ɣleti sia" + } + }, + "long" : { + "second" : { + "past" : { + "other" : "sekend {0} si wo va yi", + "one" : "sekend {0} si va yi" + }, + "future" : { + "one" : "le sekend {0} me", + "other" : "le sekend {0} wo me" + }, + "current" : "fifi" + }, + "week" : { + "current" : "kɔsiɖa sia", + "next" : "kɔsiɖa si gbɔ na", + "previous" : "kɔsiɖa si va yi", + "past" : { + "one" : "kɔsiɖa {0} si va yi", + "other" : "kɔsiɖa {0} si wo va yi" + }, + "future" : { + "one" : "le kɔsiɖa {0} me", + "other" : "le kɔsiɖa {0} wo me" + } + }, + "day" : { + "past" : { + "other" : "ŋkeke {0} si wo va yi", + "one" : "ŋkeke {0} si va yi" + }, + "previous" : "etsɔ si va yi", + "next" : "etsɔ si gbɔna", + "future" : { + "one" : "le ŋkeke {0} me", + "other" : "le ŋkeke {0} wo me" + }, + "current" : "egbe" + }, + "now" : "fifi", + "hour" : { + "future" : { + "other" : "le gaƒoƒo {0} wo me", + "one" : "le gaƒoƒo {0} me" + }, + "past" : { + "one" : "gaƒoƒo {0} si va yi", + "other" : "gaƒoƒo {0} si wo va yi" + }, + "current" : "this hour" + }, + "month" : { + "future" : { + "one" : "le ɣleti {0} me", + "other" : "le ɣleti {0} wo me" + }, + "past" : { + "other" : "ɣleti {0} si wo va yi", + "one" : "ɣleti {0} si va yi" + }, + "current" : "ɣleti sia", + "next" : "ɣleti si gbɔ na", + "previous" : "ɣleti si va yi" + }, + "minute" : { + "past" : { + "other" : "aɖabaƒoƒo {0} si wo va yi", + "one" : "aɖabaƒoƒo {0} si va yi" + }, + "future" : { + "other" : "le aɖabaƒoƒo {0} wo me", + "one" : "le aɖabaƒoƒo {0} me" + }, + "current" : "this minute" + }, + "year" : { + "next" : "ƒe si gbɔ na", + "previous" : "ƒe si va yi", + "past" : { + "one" : "ƒe {0} si va yi", + "other" : "ƒe {0} si wo va yi" + }, + "future" : "le ƒe {0} me", + "current" : "ƒe sia" + }, + "quarter" : { + "future" : "le kɔta {0} si gbɔ na me", + "current" : "this quarter", + "past" : "kɔta {0} si va yi me", + "next" : "next quarter", + "previous" : "last quarter" + } + }, + "short" : { + "week" : { + "future" : { + "one" : "le kɔsiɖa {0} me", + "other" : "le kɔsiɖa {0} wo me" + }, + "next" : "kɔsiɖa si gbɔ na", + "current" : "kɔsiɖa sia", + "past" : { + "one" : "kɔsiɖa {0} si va yi", + "other" : "kɔsiɖa {0} si wo va yi" + }, + "previous" : "kɔsiɖa si va yi" + }, + "minute" : { + "current" : "this minute", + "future" : { + "one" : "le aɖabaƒoƒo {0} me", + "other" : "le aɖabaƒoƒo {0} wo me" + }, + "past" : { + "one" : "aɖabaƒoƒo {0} si va yi", + "other" : "aɖabaƒoƒo {0} si wo va yi" + } + }, + "day" : { + "next" : "etsɔ si gbɔna", + "current" : "egbe", + "previous" : "etsɔ si va yi", + "future" : { + "one" : "le ŋkeke {0} me", + "other" : "le ŋkeke {0} wo me" + }, + "past" : { + "other" : "ŋkeke {0} si wo va yi", + "one" : "ŋkeke {0} si va yi" + } + }, + "now" : "fifi", + "second" : { + "past" : { + "one" : "sekend {0} si va yi", + "other" : "sekend {0} si wo va yi" + }, + "future" : { + "other" : "le sekend {0} wo me", + "one" : "le sekend {0} me" + }, + "current" : "fifi" + }, + "hour" : { + "current" : "this hour", + "past" : { + "one" : "gaƒoƒo {0} si va yi", + "other" : "gaƒoƒo {0} si wo va yi" + }, + "future" : { + "one" : "le gaƒoƒo {0} me", + "other" : "le gaƒoƒo {0} wo me" + } + }, + "month" : { + "current" : "ɣleti sia", + "past" : { + "one" : "ɣleti {0} si va yi", + "other" : "ɣleti {0} si wo va yi" + }, + "previous" : "ɣleti si va yi", + "next" : "ɣleti si gbɔ na", + "future" : { + "other" : "le ɣleti {0} wo me", + "one" : "le ɣleti {0} me" + } + }, + "year" : { + "next" : "ƒe si gbɔ na", + "future" : "le ƒe {0} me", + "current" : "ƒe sia", + "past" : "le ƒe {0} si va yi me", + "previous" : "ƒe si va yi" + }, + "quarter" : { + "future" : "le kɔta {0} si gbɔ na me", + "next" : "next quarter", + "previous" : "last quarter", + "current" : "this quarter", + "past" : "kɔta {0} si va yi me" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/el.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/el.json new file mode 100644 index 0000000..06e6004 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/el.json @@ -0,0 +1,227 @@ +{ + "narrow" : { + "now" : "τώρα", + "hour" : { + "future" : "σε {0} ώ.", + "past" : "{0} ώ. πριν", + "current" : "τρέχουσα ώρα" + }, + "minute" : { + "past" : "{0} λ. πριν", + "current" : "τρέχον λεπτό", + "future" : "σε {0} λ." + }, + "second" : { + "future" : "σε {0} δ.", + "current" : "τώρα", + "past" : "{0} δ. πριν" + }, + "year" : { + "next" : "επόμενο έτος", + "future" : { + "one" : "σε {0} έτος", + "other" : "σε {0} έτη" + }, + "previous" : "πέρσι", + "current" : "φέτος", + "past" : { + "one" : "{0} έτος πριν", + "other" : "{0} έτη πριν" + } + }, + "week" : { + "past" : "{0} εβδ. πριν", + "next" : "επόμενη εβδομάδα", + "future" : "σε {0} εβδ.", + "previous" : "προηγούμενη εβδομάδα", + "current" : "τρέχουσα εβδομάδα" + }, + "month" : { + "previous" : "προηγούμενος μήνας", + "current" : "τρέχων μήνας", + "next" : "επόμενος μήνας", + "past" : "{0} μ. πριν", + "future" : "σε {0} μ." + }, + "quarter" : { + "next" : "επόμ. τρίμ.", + "past" : "{0} τρίμ. πριν", + "future" : "σε {0} τρίμ.", + "previous" : "προηγ. τρίμ.", + "current" : "τρέχον τρίμ." + }, + "day" : { + "next" : "αύριο", + "previous" : "χθες", + "past" : "{0} ημ. πριν", + "future" : "σε {0} ημ.", + "current" : "σήμερα" + } + }, + "long" : { + "week" : { + "future" : { + "other" : "σε {0} εβδομάδες", + "one" : "σε {0} εβδομάδα" + }, + "past" : { + "other" : "πριν από {0} εβδομάδες", + "one" : "πριν από {0} εβδομάδα" + }, + "next" : "επόμενη εβδομάδα", + "current" : "τρέχουσα εβδομάδα", + "previous" : "προηγούμενη εβδομάδα" + }, + "minute" : { + "current" : "τρέχον λεπτό", + "future" : { + "other" : "σε {0} λεπτά", + "one" : "σε {0} λεπτό" + }, + "past" : { + "one" : "πριν από {0} λεπτό", + "other" : "πριν από {0} λεπτά" + } + }, + "month" : { + "current" : "τρέχων μήνας", + "past" : { + "other" : "πριν από {0} μήνες", + "one" : "πριν από {0} μήνα" + }, + "previous" : "προηγούμενος μήνας", + "future" : { + "one" : "σε {0} μήνα", + "other" : "σε {0} μήνες" + }, + "next" : "επόμενος μήνας" + }, + "hour" : { + "future" : { + "one" : "σε {0} ώρα", + "other" : "σε {0} ώρες" + }, + "past" : { + "one" : "πριν από {0} ώρα", + "other" : "πριν από {0} ώρες" + }, + "current" : "τρέχουσα ώρα" + }, + "year" : { + "previous" : "πέρσι", + "past" : { + "one" : "πριν από {0} έτος", + "other" : "πριν από {0} έτη" + }, + "next" : "επόμενο έτος", + "future" : { + "one" : "σε {0} έτος", + "other" : "σε {0} έτη" + }, + "current" : "φέτος" + }, + "day" : { + "current" : "σήμερα", + "previous" : "χθες", + "next" : "αύριο", + "future" : { + "other" : "σε {0} ημέρες", + "one" : "σε {0} ημέρα" + }, + "past" : { + "other" : "πριν από {0} ημέρες", + "one" : "πριν από {0} ημέρα" + } + }, + "second" : { + "current" : "τώρα", + "future" : { + "other" : "σε {0} δευτερόλεπτα", + "one" : "σε {0} δευτερόλεπτο" + }, + "past" : { + "one" : "πριν από {0} δευτερόλεπτο", + "other" : "πριν από {0} δευτερόλεπτα" + } + }, + "quarter" : { + "previous" : "προηγούμενο τρίμηνο", + "current" : "τρέχον τρίμηνο", + "next" : "επόμενο τρίμηνο", + "past" : { + "one" : "πριν από {0} τρίμηνο", + "other" : "πριν από {0} τρίμηνα" + }, + "future" : { + "one" : "σε {0} τρίμηνο", + "other" : "σε {0} τρίμηνα" + } + }, + "now" : "τώρα" + }, + "short" : { + "hour" : { + "future" : "σε {0} ώ.", + "current" : "τρέχουσα ώρα", + "past" : "πριν από {0} ώ." + }, + "now" : "τώρα", + "quarter" : { + "current" : "τρέχον τρίμ.", + "future" : "σε {0} τρίμ.", + "past" : "πριν από {0} τρίμ.", + "next" : "επόμ. τρίμ.", + "previous" : "προηγ. τρίμ." + }, + "day" : { + "current" : "σήμερα", + "past" : "πριν από {0} ημ.", + "future" : "σε {0} ημ.", + "next" : "αύριο", + "previous" : "χθες" + }, + "week" : { + "current" : "τρέχουσα εβδομάδα", + "past" : "πριν από {0} εβδ.", + "future" : "σε {0} εβδ.", + "next" : "επόμενη εβδομάδα", + "previous" : "προηγούμενη εβδομάδα" + }, + "minute" : { + "future" : "σε {0} λεπ.", + "current" : "τρέχον λεπτό", + "past" : "πριν από {0} λεπ." + }, + "second" : { + "future" : "σε {0} δευτ.", + "current" : "τώρα", + "past" : "πριν από {0} δευτ." + }, + "month" : { + "current" : "τρέχων μήνας", + "future" : { + "one" : "σε {0} μήνα", + "other" : "σε {0} μήνες" + }, + "previous" : "προηγούμενος μήνας", + "next" : "επόμενος μήνας", + "past" : { + "one" : "πριν από {0} μήνα", + "other" : "πριν από {0} μήνες" + } + }, + "year" : { + "future" : { + "one" : "σε {0} έτος", + "other" : "σε {0} έτη" + }, + "previous" : "πέρσι", + "next" : "επόμενο έτος", + "current" : "φέτος", + "past" : { + "other" : "πριν από {0} έτη", + "one" : "πριν από {0} έτος" + } + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/en.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/en.json new file mode 100644 index 0000000..223f702 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/en.json @@ -0,0 +1,233 @@ +{ + "long" : { + "quarter" : { + "next" : "next quarter", + "previous" : "last quarter", + "current" : "this quarter", + "future" : { + "one" : "in {0} quarter", + "other" : "in {0} quarters" + }, + "past" : { + "one" : "{0} quarter ago", + "other" : "{0} quarters ago" + } + }, + "month" : { + "next" : "next month", + "past" : { + "one" : "{0} month ago", + "other" : "{0} months ago" + }, + "future" : { + "one" : "in {0} month", + "other" : "in {0} months" + }, + "previous" : "last month", + "current" : "this month" + }, + "hour" : { + "past" : { + "other" : "{0} hours ago", + "one" : "{0} hour ago" + }, + "future" : { + "one" : "in {0} hour", + "other" : "in {0} hours" + }, + "current" : "this hour" + }, + "week" : { + "previous" : "last week", + "current" : "this week", + "future" : { + "one" : "in {0} week", + "other" : "in {0} weeks" + }, + "next" : "next week", + "past" : { + "one" : "{0} week ago", + "other" : "{0} weeks ago" + } + }, + "minute" : { + "current" : "this minute", + "past" : { + "one" : "{0} minute ago", + "other" : "{0} minutes ago" + }, + "future" : { + "one" : "in {0} minute", + "other" : "in {0} minutes" + } + }, + "now" : "now", + "year" : { + "next" : "next year", + "future" : { + "one" : "in {0} year", + "other" : "in {0} years" + }, + "past" : { + "other" : "{0} years ago", + "one" : "{0} year ago" + }, + "current" : "this year", + "previous" : "last year" + }, + "second" : { + "current" : "now", + "past" : { + "other" : "{0} seconds ago", + "one" : "{0} second ago" + }, + "future" : { + "one" : "in {0} second", + "other" : "in {0} seconds" + } + }, + "day" : { + "next" : "tomorrow", + "past" : { + "other" : "{0} days ago", + "one" : "{0} day ago" + }, + "future" : { + "other" : "in {0} days", + "one" : "in {0} day" + }, + "previous" : "yesterday", + "current" : "today" + } + }, + "short" : { + "month" : { + "future" : "in {0} mo.", + "previous" : "last mo.", + "current" : "this mo.", + "next" : "next mo.", + "past" : "{0} mo. ago" + }, + "day" : { + "past" : { + "one" : "{0} day ago", + "other" : "{0} days ago" + }, + "previous" : "yesterday", + "current" : "today", + "next" : "tomorrow", + "future" : { + "other" : "in {0} days", + "one" : "in {0} day" + } + }, + "hour" : { + "current" : "this hour", + "future" : "in {0} hr.", + "past" : "{0} hr. ago" + }, + "second" : { + "past" : "{0} sec. ago", + "future" : "in {0} sec.", + "current" : "now" + }, + "year" : { + "current" : "this yr.", + "previous" : "last yr.", + "future" : "in {0} yr.", + "past" : "{0} yr. ago", + "next" : "next yr." + }, + "week" : { + "previous" : "last wk.", + "current" : "this wk.", + "future" : "in {0} wk.", + "past" : "{0} wk. ago", + "next" : "next wk." + }, + "minute" : { + "current" : "this minute", + "future" : "in {0} min.", + "past" : "{0} min. ago" + }, + "now" : "now", + "quarter" : { + "next" : "next qtr.", + "previous" : "last qtr.", + "current" : "this qtr.", + "past" : { + "other" : "{0} qtrs. ago", + "one" : "{0} qtr. ago" + }, + "future" : { + "one" : "in {0} qtr.", + "other" : "in {0} qtrs." + } + } + }, + "narrow" : { + "hour" : { + "future" : "in {0} hr.", + "current" : "this hour", + "past" : "{0} hr. ago" + }, + "week" : { + "next" : "next wk.", + "previous" : "last wk.", + "past" : "{0} wk. ago", + "current" : "this wk.", + "future" : "in {0} wk." + }, + "minute" : { + "current" : "this minute", + "past" : "{0} min. ago", + "future" : "in {0} min." + }, + "second" : { + "current" : "now", + "past" : "{0} sec. ago", + "future" : "in {0} sec." + }, + "now" : "now", + "month" : { + "past" : "{0} mo. ago", + "current" : "this mo.", + "next" : "next mo.", + "previous" : "last mo.", + "future" : "in {0} mo." + }, + "day" : { + "current" : "today", + "future" : { + "one" : "in {0} day", + "other" : "in {0} days" + }, + "previous" : "yesterday", + "next" : "tomorrow", + "past" : { + "one" : "{0} day ago", + "other" : "{0} days ago" + } + }, + "year" : { + "previous" : "last yr.", + "current" : "this yr.", + "past" : "{0} yr. ago", + "next" : "next yr.", + "future" : "in {0} yr." + }, + "quarter" : { + "previous" : "last qtr.", + "next" : "next qtr.", + "past" : { + "one" : "{0} qtr. ago", + "other" : "{0} qtrs. ago" + }, + "future" : { + "one" : "in {0} qtr.", + "other" : "in {0} qtrs." + }, + "current" : "this qtr." + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/es.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/es.json new file mode 100644 index 0000000..bcddb5c --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/es.json @@ -0,0 +1,221 @@ +{ + "narrow" : { + "quarter" : { + "previous" : "el trimestre pasado", + "current" : "este trimestre", + "next" : "el próximo trimestre", + "past" : "hace {0} trim.", + "future" : "dentro de {0} trim." + }, + "month" : { + "past" : "hace {0} m", + "next" : "el próximo mes", + "future" : "dentro de {0} m", + "previous" : "el mes pasado", + "current" : "este mes" + }, + "now" : "ahora", + "hour" : { + "future" : "dentro de {0} h", + "past" : "hace {0} h", + "current" : "esta hora" + }, + "minute" : { + "past" : "hace {0} min", + "current" : "este minuto", + "future" : "dentro de {0} min" + }, + "day" : { + "previous" : "ayer", + "future" : { + "other" : "dentro de {0} días", + "one" : "dentro de {0} día" + }, + "past" : { + "one" : "hace {0} día", + "other" : "hace {0} días" + }, + "current" : "hoy", + "next" : "mañana" + }, + "year" : { + "next" : "el próximo año", + "past" : "hace {0} a", + "future" : "dentro de {0} a", + "previous" : "el año pasado", + "current" : "este año" + }, + "week" : { + "next" : "la próxima semana", + "previous" : "la semana pasada", + "past" : "hace {0} sem.", + "future" : "dentro de {0} sem.", + "current" : "esta semana" + }, + "second" : { + "future" : "dentro de {0} s", + "past" : "hace {0} s", + "current" : "ahora" + } + }, + "short" : { + "minute" : { + "current" : "este minuto", + "past" : "hace {0} min", + "future" : "dentro de {0} min" + }, + "month" : { + "current" : "este mes", + "past" : "hace {0} m", + "future" : "dentro de {0} m", + "next" : "el próximo mes", + "previous" : "el mes pasado" + }, + "week" : { + "current" : "esta semana", + "past" : "hace {0} sem.", + "future" : "dentro de {0} sem.", + "next" : "la próxima semana", + "previous" : "la semana pasada" + }, + "hour" : { + "past" : "hace {0} h", + "current" : "esta hora", + "future" : "dentro de {0} h" + }, + "day" : { + "next" : "mañana", + "current" : "hoy", + "previous" : "ayer", + "past" : { + "other" : "hace {0} días", + "one" : "hace {0} día" + }, + "future" : { + "one" : "dentro de {0} día", + "other" : "dentro de {0} días" + } + }, + "second" : { + "future" : "dentro de {0} s", + "current" : "ahora", + "past" : "hace {0} s" + }, + "now" : "ahora", + "year" : { + "future" : "dentro de {0} a", + "previous" : "el año pasado", + "next" : "el próximo año", + "current" : "este año", + "past" : "hace {0} a" + }, + "quarter" : { + "current" : "este trimestre", + "future" : "dentro de {0} trim.", + "previous" : "el trimestre pasado", + "next" : "el próximo trimestre", + "past" : "hace {0} trim." + } + }, + "long" : { + "week" : { + "current" : "esta semana", + "previous" : "la semana pasada", + "next" : "la próxima semana", + "future" : { + "one" : "dentro de {0} semana", + "other" : "dentro de {0} semanas" + }, + "past" : { + "other" : "hace {0} semanas", + "one" : "hace {0} semana" + } + }, + "month" : { + "future" : { + "one" : "dentro de {0} mes", + "other" : "dentro de {0} meses" + }, + "past" : { + "one" : "hace {0} mes", + "other" : "hace {0} meses" + }, + "next" : "el próximo mes", + "current" : "este mes", + "previous" : "el mes pasado" + }, + "minute" : { + "past" : { + "one" : "hace {0} minuto", + "other" : "hace {0} minutos" + }, + "future" : { + "one" : "dentro de {0} minuto", + "other" : "dentro de {0} minutos" + }, + "current" : "este minuto" + }, + "now" : "ahora", + "year" : { + "previous" : "el año pasado", + "current" : "este año", + "next" : "el próximo año", + "past" : { + "other" : "hace {0} años", + "one" : "hace {0} año" + }, + "future" : { + "other" : "dentro de {0} años", + "one" : "dentro de {0} año" + } + }, + "day" : { + "current" : "hoy", + "future" : { + "other" : "dentro de {0} días", + "one" : "dentro de {0} día" + }, + "past" : { + "other" : "hace {0} días", + "one" : "hace {0} día" + }, + "next" : "mañana", + "previous" : "ayer" + }, + "quarter" : { + "current" : "este trimestre", + "past" : { + "one" : "hace {0} trimestre", + "other" : "hace {0} trimestres" + }, + "previous" : "el trimestre pasado", + "future" : { + "one" : "dentro de {0} trimestre", + "other" : "dentro de {0} trimestres" + }, + "next" : "el próximo trimestre" + }, + "hour" : { + "current" : "esta hora", + "future" : { + "other" : "dentro de {0} horas", + "one" : "dentro de {0} hora" + }, + "past" : { + "other" : "hace {0} horas", + "one" : "hace {0} hora" + } + }, + "second" : { + "future" : { + "other" : "dentro de {0} segundos", + "one" : "dentro de {0} segundo" + }, + "current" : "ahora", + "past" : { + "one" : "hace {0} segundo", + "other" : "hace {0} segundos" + } + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/es_AR.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/es_AR.json new file mode 100644 index 0000000..803a066 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/es_AR.json @@ -0,0 +1,209 @@ +{ + "narrow" : { + "day" : { + "next" : "mañana", + "future" : "dentro de {0} días", + "previous" : "ayer", + "current" : "hoy", + "past" : "hace {0} días" + }, + "quarter" : { + "next" : "el próximo trimestre", + "past" : "hace {0} trim.", + "future" : "dentro de {0} trim.", + "previous" : "el trimestre pasado", + "current" : "este trimestre" + }, + "hour" : { + "future" : "dentro de {0} h", + "current" : "esta hora", + "past" : "hace {0} h" + }, + "year" : { + "next" : "el próximo año", + "past" : "hace {0} a", + "current" : "este año", + "previous" : "el año pasado", + "future" : "dentro de {0} a" + }, + "now" : "ahora", + "month" : { + "current" : "este mes", + "future" : "dentro de {0} m", + "past" : "hace {0} m", + "next" : "el próximo mes", + "previous" : "el mes pasado" + }, + "week" : { + "previous" : "la semana pasada", + "current" : "esta semana", + "past" : "hace {0} sem.", + "future" : "dentro de {0} sem.", + "next" : "la próxima semana" + }, + "minute" : { + "past" : "hace {0} min", + "current" : "este minuto", + "future" : "dentro de {0} min" + }, + "second" : { + "current" : "ahora", + "past" : "hace {0} seg.", + "future" : "dentro de {0} seg." + } + }, + "long" : { + "month" : { + "next" : "el próximo mes", + "previous" : "el mes pasado", + "future" : { + "one" : "dentro de {0} mes", + "other" : "dentro de {0} meses" + }, + "current" : "este mes", + "past" : { + "other" : "hace {0} meses", + "one" : "hace {0} mes" + } + }, + "week" : { + "future" : { + "one" : "dentro de {0} semana", + "other" : "dentro de {0} semanas" + }, + "previous" : "la semana pasada", + "next" : "la próxima semana", + "current" : "esta semana", + "past" : { + "one" : "hace {0} semana", + "other" : "hace {0} semanas" + } + }, + "second" : { + "current" : "ahora", + "past" : { + "other" : "hace {0} segundos", + "one" : "hace {0} segundo" + }, + "future" : { + "one" : "dentro de {0} segundo", + "other" : "dentro de {0} segundos" + } + }, + "year" : { + "future" : { + "one" : "dentro de {0} año", + "other" : "dentro de {0} años" + }, + "previous" : "el año pasado", + "next" : "el próximo año", + "current" : "este año", + "past" : { + "one" : "hace {0} año", + "other" : "hace {0} años" + } + }, + "day" : { + "next" : "mañana", + "current" : "hoy", + "previous" : "ayer", + "future" : { + "other" : "dentro de {0} días", + "one" : "dentro de {0} día" + }, + "past" : { + "other" : "hace {0} días", + "one" : "hace {0} día" + } + }, + "now" : "ahora", + "minute" : { + "future" : { + "one" : "dentro de {0} minuto", + "other" : "dentro de {0} minutos" + }, + "past" : { + "other" : "hace {0} minutos", + "one" : "hace {0} minuto" + }, + "current" : "este minuto" + }, + "quarter" : { + "next" : "el próximo trimestre", + "future" : { + "one" : "dentro de {0} trimestre", + "other" : "dentro de {0} trimestres" + }, + "previous" : "el trimestre pasado", + "current" : "este trimestre", + "past" : { + "one" : "hace {0} trimestre", + "other" : "hace {0} trimestres" + } + }, + "hour" : { + "future" : { + "other" : "dentro de {0} horas", + "one" : "dentro de {0} hora" + }, + "past" : { + "other" : "hace {0} horas", + "one" : "hace {0} hora" + }, + "current" : "esta hora" + } + }, + "short" : { + "quarter" : { + "future" : "dentro de {0} trim.", + "next" : "el próximo trimestre", + "previous" : "el trimestre pasado", + "current" : "este trimestre", + "past" : "hace {0} trim." + }, + "minute" : { + "current" : "este minuto", + "past" : "hace {0} min", + "future" : "dentro de {0} min" + }, + "year" : { + "next" : "el próximo año", + "future" : "dentro de {0} a", + "current" : "este año", + "past" : "hace {0} a", + "previous" : "el año pasado" + }, + "second" : { + "past" : "hace {0} seg.", + "current" : "ahora", + "future" : "dentro de {0} seg." + }, + "hour" : { + "current" : "esta hora", + "past" : "hace {0} h", + "future" : "dentro de {0} h" + }, + "now" : "ahora", + "month" : { + "previous" : "el mes pasado", + "next" : "el próximo mes", + "past" : "hace {0} m", + "current" : "este mes", + "future" : "dentro de {0} m" + }, + "week" : { + "previous" : "la semana pasada", + "current" : "esta semana", + "next" : "la próxima semana", + "past" : "hace {0} sem.", + "future" : "dentro de {0} sem." + }, + "day" : { + "next" : "mañana", + "past" : "hace {0} días", + "future" : "dentro de {0} días", + "previous" : "ayer", + "current" : "hoy" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/es_MX.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/es_MX.json new file mode 100644 index 0000000..ef65dcb --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/es_MX.json @@ -0,0 +1,221 @@ +{ + "narrow" : { + "minute" : { + "future" : "dentro de {0} min", + "past" : "hace {0} min", + "current" : "este minuto" + }, + "year" : { + "past" : "hace {0} a", + "current" : "este año", + "next" : "el próximo año", + "previous" : "el año pasado", + "future" : "dentro de {0} a" + }, + "now" : "ahora", + "second" : { + "past" : "hace {0} seg.", + "future" : "dentro de {0} seg.", + "current" : "ahora" + }, + "day" : { + "previous" : "ayer", + "current" : "hoy", + "next" : "mañana", + "past" : { + "one" : "hace {0} día", + "other" : "hace {0} días" + }, + "future" : { + "other" : "dentro de {0} días", + "one" : "dentro de {0} día" + } + }, + "month" : { + "past" : "hace {0} m", + "current" : "este mes", + "next" : "el próximo mes", + "future" : "dentro de {0} m", + "previous" : "el mes pasado" + }, + "week" : { + "next" : "la próxima semana", + "current" : "esta semana", + "past" : "hace {0} sem.", + "future" : "dentro de {0} sem.", + "previous" : "la semana pasada" + }, + "quarter" : { + "current" : "este trimestre", + "future" : "dentro de {0} trim.", + "next" : "el próximo trimestre", + "past" : "hace {0} trim.", + "previous" : "el trimestre pasado" + }, + "hour" : { + "future" : "dentro de {0} h", + "current" : "esta hora", + "past" : "hace {0} h" + } + }, + "short" : { + "second" : { + "past" : "hace {0} seg.", + "future" : "dentro de {0} seg.", + "current" : "ahora" + }, + "now" : "ahora", + "hour" : { + "current" : "esta hora", + "past" : "hace {0} h", + "future" : "dentro de {0} h" + }, + "month" : { + "past" : "hace {0} m", + "current" : "este mes", + "next" : "el próximo mes", + "future" : "dentro de {0} m", + "previous" : "el mes pasado" + }, + "day" : { + "future" : { + "other" : "dentro de {0} días", + "one" : "dentro de {0} día" + }, + "current" : "hoy", + "previous" : "ayer", + "next" : "mañana", + "past" : { + "one" : "hace {0} día", + "other" : "hace {0} días" + } + }, + "minute" : { + "future" : "dentro de {0} min", + "current" : "este minuto", + "past" : "hace {0} min" + }, + "week" : { + "next" : "la próxima semana", + "past" : "hace {0} sem.", + "previous" : "la semana pasada", + "current" : "esta semana", + "future" : "dentro de {0} sem." + }, + "quarter" : { + "current" : "este trimestre", + "future" : "dentro de {0} trim.", + "next" : "el próximo trimestre", + "previous" : "el trimestre pasado", + "past" : "hace {0} trim." + }, + "year" : { + "next" : "el próximo año", + "current" : "este año", + "future" : "dentro de {0} a", + "past" : "hace {0} a", + "previous" : "el año pasado" + } + }, + "long" : { + "week" : { + "current" : "esta semana", + "previous" : "la semana pasada", + "next" : "la próxima semana", + "past" : { + "one" : "hace {0} semana", + "other" : "hace {0} semanas" + }, + "future" : { + "one" : "dentro de {0} semana", + "other" : "dentro de {0} semanas" + } + }, + "hour" : { + "current" : "esta hora", + "future" : { + "other" : "dentro de {0} horas", + "one" : "dentro de {0} hora" + }, + "past" : { + "other" : "hace {0} horas", + "one" : "hace {0} hora" + } + }, + "minute" : { + "future" : { + "one" : "dentro de {0} minuto", + "other" : "dentro de {0} minutos" + }, + "current" : "este minuto", + "past" : { + "one" : "hace {0} minuto", + "other" : "hace {0} minutos" + } + }, + "day" : { + "previous" : "ayer", + "current" : "hoy", + "future" : { + "other" : "dentro de {0} días", + "one" : "dentro de {0} día" + }, + "next" : "mañana", + "past" : { + "other" : "hace {0} días", + "one" : "hace {0} día" + } + }, + "second" : { + "current" : "ahora", + "future" : { + "other" : "dentro de {0} segundos", + "one" : "dentro de {0} segundo" + }, + "past" : { + "one" : "hace {0} segundo", + "other" : "hace {0} segundos" + } + }, + "now" : "ahora", + "month" : { + "next" : "el próximo mes", + "future" : { + "other" : "dentro de {0} meses", + "one" : "dentro de {0} mes" + }, + "previous" : "el mes pasado", + "current" : "este mes", + "past" : { + "other" : "hace {0} meses", + "one" : "hace {0} mes" + } + }, + "quarter" : { + "previous" : "el trimestre pasado", + "future" : { + "one" : "dentro de {0} trimestre", + "other" : "dentro de {0} trimestres" + }, + "current" : "este trimestre", + "past" : { + "one" : "hace {0} trimestre", + "other" : "hace {0} trimestres" + }, + "next" : "el próximo trimestre" + }, + "year" : { + "next" : "el próximo año", + "past" : { + "one" : "hace {0} año", + "other" : "hace {0} años" + }, + "future" : { + "other" : "dentro de {0} años", + "one" : "dentro de {0} año" + }, + "current" : "este año", + "previous" : "el año pasado" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/es_PY.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/es_PY.json new file mode 100644 index 0000000..04177c7 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/es_PY.json @@ -0,0 +1,227 @@ +{ + "narrow" : { + "minute" : { + "current" : "este minuto", + "past" : "-{0} min", + "future" : "+{0} min" + }, + "year" : { + "previous" : "el año pasado", + "past" : "-{0} a", + "future" : "en {0} a", + "next" : "el próximo año", + "current" : "este año" + }, + "day" : { + "next" : "mañana", + "previous" : "ayer", + "past" : { + "one" : "hace {0} día", + "other" : "hace {0} días" + }, + "future" : { + "other" : "+{0} días", + "one" : "+{0} día" + }, + "current" : "hoy" + }, + "month" : { + "current" : "este mes", + "past" : "-{0} m", + "next" : "el próximo mes", + "previous" : "el mes pasado", + "future" : "+{0} m" + }, + "hour" : { + "current" : "esta hora", + "past" : "hace {0} h", + "future" : "dentro de {0} h" + }, + "now" : "ahora", + "quarter" : { + "past" : "-{0} T", + "current" : "este trimestre", + "future" : "+{0} T", + "previous" : "el trimestre pasado", + "next" : "el próximo trimestre" + }, + "second" : { + "future" : "+{0} s", + "current" : "ahora", + "past" : "hace {0} s" + }, + "week" : { + "past" : "hace {0} sem.", + "previous" : "la semana pasada", + "current" : "esta semana", + "next" : "la semana próxima", + "future" : "dentro de {0} sem." + } + }, + "long" : { + "year" : { + "next" : "el año próximo", + "future" : { + "one" : "dentro de {0} año", + "other" : "dentro de {0} años" + }, + "previous" : "el año pasado", + "current" : "este año", + "past" : { + "one" : "hace {0} año", + "other" : "hace {0} años" + } + }, + "now" : "ahora", + "month" : { + "future" : { + "one" : "en {0} mes", + "other" : "en {0} meses" + }, + "previous" : "el mes pasado", + "next" : "el mes próximo", + "current" : "este mes", + "past" : { + "other" : "hace {0} meses", + "one" : "hace {0} mes" + } + }, + "quarter" : { + "next" : "el próximo trimestre", + "previous" : "el trimestre pasado", + "future" : { + "other" : "dentro de {0} trimetres", + "one" : "dentro de {0} trimetre" + }, + "current" : "este trimestre", + "past" : { + "other" : "hace {0} trimestres", + "one" : "hace {0} trimestre" + } + }, + "day" : { + "previous" : "ayer", + "future" : { + "other" : "dentro de {0} días", + "one" : "dentro de {0} día" + }, + "current" : "hoy", + "next" : "mañana", + "past" : { + "one" : "hace {0} día", + "other" : "hace {0} días" + } + }, + "week" : { + "next" : "la semana próxima", + "current" : "esta semana", + "previous" : "la semana pasada", + "future" : { + "other" : "dentro de {0} semanas", + "one" : "dentro de {0} semana" + }, + "past" : { + "one" : "hace {0} semana", + "other" : "hace {0} semanas" + } + }, + "hour" : { + "current" : "esta hora", + "past" : { + "one" : "hace {0} hora", + "other" : "hace {0} horas" + }, + "future" : { + "one" : "dentro de {0} hora", + "other" : "dentro de {0} horas" + } + }, + "minute" : { + "future" : { + "other" : "dentro de {0} minutos", + "one" : "dentro de {0} minuto" + }, + "current" : "este minuto", + "past" : { + "one" : "hace {0} minuto", + "other" : "hace {0} minutos" + } + }, + "second" : { + "current" : "ahora", + "future" : { + "other" : "dentro de {0} segundos", + "one" : "dentro de {0} segundo" + }, + "past" : { + "one" : "hace {0} segundo", + "other" : "hace {0} segundos" + } + } + }, + "short" : { + "minute" : { + "current" : "este minuto", + "past" : "hace {0} min", + "future" : "en {0} min" + }, + "second" : { + "current" : "ahora", + "past" : "hace {0} s", + "future" : "en {0} s" + }, + "hour" : { + "future" : { + "one" : "en {0} h", + "other" : "en {0} n" + }, + "current" : "esta hora", + "past" : "hace {0} h" + }, + "year" : { + "next" : "el próximo año", + "future" : "en {0} a", + "current" : "este año", + "past" : "hace {0} a", + "previous" : "el año pasado" + }, + "now" : "ahora", + "quarter" : { + "previous" : "el trimestre pasado", + "current" : "este trimestre", + "past" : "hace {0} trim.", + "next" : "el próximo trimestre", + "future" : { + "other" : "en {0} trim", + "one" : "en {0} trim." + } + }, + "month" : { + "past" : "hace {0} m", + "future" : "en {0} m", + "next" : "el próximo mes", + "previous" : "el mes pasado", + "current" : "este mes" + }, + "week" : { + "future" : "en {0} sem.", + "next" : "la semana próxima", + "current" : "esta semana", + "past" : "hace {0} sem.", + "previous" : "la semana pasada" + }, + "day" : { + "previous" : "ayer", + "current" : "hoy", + "next" : "mañana", + "past" : { + "one" : "hace {0} día", + "other" : "hace {0} días" + }, + "future" : { + "one" : "en {0} día", + "other" : "en {0} días" + } + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/es_US.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/es_US.json new file mode 100644 index 0000000..ad972ac --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/es_US.json @@ -0,0 +1,221 @@ +{ + "narrow" : { + "second" : { + "future" : "dentro de {0} s", + "past" : "hace {0} s", + "current" : "ahora" + }, + "month" : { + "past" : "hace {0} m", + "future" : "dentro de {0} m", + "current" : "este mes", + "previous" : "el mes pasado", + "next" : "el próximo mes" + }, + "hour" : { + "future" : "dentro de {0} h", + "past" : "hace {0} h", + "current" : "esta hora" + }, + "week" : { + "next" : "la semana próxima", + "current" : "esta semana", + "past" : "hace {0} sem.", + "future" : "dentro de {0} sem.", + "previous" : "la semana pasada" + }, + "day" : { + "future" : { + "other" : "dentro de {0} días", + "one" : "dentro de {0} día" + }, + "previous" : "ayer", + "next" : "mañana", + "past" : { + "one" : "hace {0} día", + "other" : "hace {0} días" + }, + "current" : "hoy" + }, + "minute" : { + "past" : "hace {0} min", + "current" : "este minuto", + "future" : "dentro de {0} min" + }, + "year" : { + "next" : "el próximo año", + "future" : "dentro de {0} a", + "previous" : "el año pasado", + "current" : "este año", + "past" : "hace {0} a" + }, + "now" : "ahora", + "quarter" : { + "previous" : "el trimestre pasado", + "next" : "el próximo trimestre", + "future" : "dentro de {0} trim.", + "current" : "este trimestre", + "past" : "hace {0} trim." + } + }, + "long" : { + "minute" : { + "past" : { + "one" : "hace {0} minuto", + "other" : "hace {0} minutos" + }, + "future" : { + "one" : "dentro de {0} minuto", + "other" : "dentro de {0} minutos" + }, + "current" : "este minuto" + }, + "month" : { + "past" : { + "other" : "hace {0} meses", + "one" : "hace {0} mes" + }, + "next" : "el mes próximo", + "previous" : "el mes pasado", + "current" : "este mes", + "future" : { + "one" : "dentro de {0} mes", + "other" : "dentro de {0} meses" + } + }, + "hour" : { + "future" : { + "other" : "dentro de {0} horas", + "one" : "dentro de {0} hora" + }, + "current" : "esta hora", + "past" : { + "one" : "hace {0} hora", + "other" : "hace {0} horas" + } + }, + "second" : { + "past" : { + "other" : "hace {0} segundos", + "one" : "hace {0} segundo" + }, + "future" : { + "one" : "dentro de {0} segundo", + "other" : "dentro de {0} segundos" + }, + "current" : "ahora" + }, + "now" : "ahora", + "year" : { + "future" : { + "one" : "dentro de {0} año", + "other" : "dentro de {0} años" + }, + "previous" : "el año pasado", + "current" : "este año", + "next" : "el año próximo", + "past" : { + "one" : "hace {0} año", + "other" : "hace {0} años" + } + }, + "week" : { + "future" : { + "other" : "dentro de {0} semanas", + "one" : "dentro de {0} semana" + }, + "current" : "esta semana", + "previous" : "la semana pasada", + "next" : "la semana próxima", + "past" : { + "one" : "hace {0} semana", + "other" : "hace {0} semanas" + } + }, + "quarter" : { + "past" : { + "one" : "hace {0} trimestre", + "other" : "hace {0} trimestres" + }, + "future" : { + "other" : "dentro de {0} trimestres", + "one" : "dentro de {0} trimestre" + }, + "next" : "el próximo trimestre", + "current" : "este trimestre", + "previous" : "el trimestre pasado" + }, + "day" : { + "current" : "hoy", + "past" : { + "other" : "hace {0} días", + "one" : "hace {0} día" + }, + "future" : { + "one" : "dentro de {0} día", + "other" : "dentro de {0} días" + }, + "next" : "mañana", + "previous" : "ayer" + } + }, + "short" : { + "hour" : { + "past" : "hace {0} h", + "current" : "esta hora", + "future" : "dentro de {0} h" + }, + "now" : "ahora", + "quarter" : { + "current" : "este trimestre", + "future" : "dentro de {0} trim.", + "past" : "hace {0} trim.", + "next" : "el próximo trimestre", + "previous" : "el trimestre pasado" + }, + "day" : { + "current" : "hoy", + "past" : { + "other" : "hace {0} días", + "one" : "hace {0} día" + }, + "future" : { + "one" : "dentro de {0} día", + "other" : "dentro de {0} días" + }, + "next" : "mañana", + "previous" : "ayer" + }, + "week" : { + "current" : "esta semana", + "past" : "hace {0} sem.", + "future" : "dentro de {0} sem.", + "next" : "la semana próxima", + "previous" : "la semana pasada" + }, + "minute" : { + "current" : "este minuto", + "past" : "hace {0} min", + "future" : "dentro de {0} min" + }, + "second" : { + "future" : "dentro de {0} s", + "current" : "ahora", + "past" : "hace {0} s" + }, + "month" : { + "current" : "este mes", + "future" : "dentro de {0} m", + "previous" : "el mes pasado", + "next" : "el próximo mes", + "past" : "hace {0} m" + }, + "year" : { + "future" : "dentro de {0} a", + "previous" : "el año pasado", + "next" : "el próximo año", + "current" : "este año", + "past" : "hace {0} a" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/et.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/et.json new file mode 100644 index 0000000..b98d740 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/et.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "year" : { + "future" : "{0} a pärast", + "previous" : "eelmine aasta", + "next" : "järgmine aasta", + "current" : "käesolev aasta", + "past" : "{0} a eest" + }, + "week" : { + "past" : "{0} näd eest", + "previous" : "eelmine nädal", + "future" : "{0} näd pärast", + "current" : "käesolev nädal", + "next" : "järgmine nädal" + }, + "hour" : { + "past" : "{0} t eest", + "future" : "{0} t pärast", + "current" : "praegusel tunnil" + }, + "quarter" : { + "current" : "käesolev kv", + "previous" : "eelmine kv", + "future" : "{0} kv pärast", + "past" : "{0} kv eest", + "next" : "järgmine kv" + }, + "second" : { + "future" : "{0} s pärast", + "current" : "nüüd", + "past" : "{0} s eest" + }, + "month" : { + "current" : "käesolev kuu", + "future" : "{0} k pärast", + "past" : "{0} k eest", + "next" : "järgmine kuu", + "previous" : "eelmine kuu" + }, + "day" : { + "previous" : "eile", + "future" : "{0} p pärast", + "next" : "homme", + "current" : "täna", + "past" : "{0} p eest" + }, + "minute" : { + "future" : "{0} min pärast", + "current" : "praegusel minutil", + "past" : "{0} min eest" + }, + "now" : "nüüd" + }, + "long" : { + "quarter" : { + "next" : "järgmine kvartal", + "current" : "käesolev kvartal", + "previous" : "eelmine kvartal", + "past" : "{0} kvartali eest", + "future" : "{0} kvartali pärast" + }, + "now" : "nüüd", + "year" : { + "previous" : "eelmine aasta", + "past" : "{0} aasta eest", + "future" : "{0} aasta pärast", + "next" : "järgmine aasta", + "current" : "käesolev aasta" + }, + "month" : { + "previous" : "eelmine kuu", + "current" : "käesolev kuu", + "future" : "{0} kuu pärast", + "past" : "{0} kuu eest", + "next" : "järgmine kuu" + }, + "day" : { + "previous" : "eile", + "future" : "{0} päeva pärast", + "next" : "homme", + "past" : "{0} päeva eest", + "current" : "täna" + }, + "second" : { + "past" : "{0} sekundi eest", + "future" : "{0} sekundi pärast", + "current" : "nüüd" + }, + "week" : { + "past" : "{0} nädala eest", + "current" : "käesolev nädal", + "next" : "järgmine nädal", + "previous" : "eelmine nädal", + "future" : "{0} nädala pärast" + }, + "hour" : { + "future" : "{0} tunni pärast", + "current" : "praegusel tunnil", + "past" : "{0} tunni eest" + }, + "minute" : { + "current" : "praegusel minutil", + "past" : "{0} minuti eest", + "future" : "{0} minuti pärast" + } + }, + "short" : { + "second" : { + "current" : "nüüd", + "past" : "{0} sek eest", + "future" : "{0} sek pärast" + }, + "now" : "nüüd", + "month" : { + "future" : "{0} kuu pärast", + "current" : "käesolev kuu", + "past" : "{0} kuu eest", + "previous" : "eelmine kuu", + "next" : "järgmine kuu" + }, + "day" : { + "previous" : "eile", + "current" : "täna", + "next" : "homme", + "future" : "{0} p pärast", + "past" : "{0} p eest" + }, + "minute" : { + "current" : "praegusel minutil", + "future" : "{0} min pärast", + "past" : "{0} min eest" + }, + "quarter" : { + "past" : "{0} kv eest", + "previous" : "eelmine kv", + "current" : "käesolev kv", + "future" : "{0} kv pärast", + "next" : "järgmine kv" + }, + "hour" : { + "current" : "praegusel tunnil", + "future" : "{0} t pärast", + "past" : "{0} t eest" + }, + "week" : { + "future" : "{0} näd pärast", + "previous" : "eelmine nädal", + "next" : "järgmine nädal", + "past" : "{0} näd eest", + "current" : "käesolev nädal" + }, + "year" : { + "next" : "järgmine aasta", + "current" : "käesolev aasta", + "past" : "{0} a eest", + "future" : "{0} a pärast", + "previous" : "eelmine aasta" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/eu.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/eu.json new file mode 100644 index 0000000..7f5b766 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/eu.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "year" : { + "current" : "aurten", + "past" : "Duela {0} urte", + "future" : "{0} urte barru", + "next" : "hurrengo urtea", + "previous" : "aurreko urtea" + }, + "minute" : { + "future" : "{0} minutu barru", + "current" : "minutu honetan", + "past" : "Duela {0} minutu" + }, + "day" : { + "past" : "Duela {0} egun", + "future" : "{0} egun barru", + "current" : "gaur", + "previous" : "atzo", + "next" : "bihar" + }, + "second" : { + "future" : "{0} segundo barru", + "current" : "orain", + "past" : "Duela {0} segundo" + }, + "now" : "orain", + "month" : { + "next" : "hurrengo hilabetean", + "future" : "{0} hilabete barru", + "previous" : "aurreko hilabetean", + "current" : "hilabete honetan", + "past" : "Duela {0} hilabete" + }, + "week" : { + "previous" : "aurreko astean", + "next" : "hurrengo astean", + "future" : "{0} aste barru", + "current" : "aste honetan", + "past" : "Duela {0} aste" + }, + "quarter" : { + "current" : "hiruhileko hau", + "past" : "Duela {0} hiruhileko", + "future" : "{0} hiruhileko barru", + "next" : "hurrengo hiruhilekoa", + "previous" : "aurreko hiruhilekoa" + }, + "hour" : { + "current" : "ordu honetan", + "past" : "Duela {0} ordu", + "future" : "{0} ordu barru" + } + }, + "short" : { + "hour" : { + "future" : "{0} ordu barru", + "current" : "ordu honetan", + "past" : "Duela {0} ordu" + }, + "now" : "orain", + "quarter" : { + "future" : "{0} hiruhileko barru", + "previous" : "aurreko hiruhilekoa", + "next" : "hurrengo hiruhilekoa", + "past" : "Duela {0} hiruhileko", + "current" : "hiruhileko hau" + }, + "day" : { + "current" : "gaur", + "future" : "{0} egun barru", + "past" : "Duela {0} egun", + "next" : "bihar", + "previous" : "atzo" + }, + "week" : { + "future" : "{0} aste barru", + "previous" : "aurreko astean", + "next" : "hurrengo astean", + "current" : "aste honetan", + "past" : "Duela {0} aste" + }, + "minute" : { + "past" : "Duela {0} minutu", + "future" : "{0} minutu barru", + "current" : "minutu honetan" + }, + "second" : { + "past" : "Duela {0} segundo", + "current" : "orain", + "future" : "{0} segundo barru" + }, + "month" : { + "current" : "hilabete honetan", + "previous" : "aurreko hilabetean", + "next" : "hurrengo hilabetean", + "past" : "Duela {0} hilabete", + "future" : "{0} hilabete barru" + }, + "year" : { + "current" : "aurten", + "future" : "{0} urte barru", + "previous" : "aurreko urtea", + "next" : "hurrengo urtea", + "past" : "Duela {0} urte" + } + }, + "long" : { + "quarter" : { + "previous" : "aurreko hiruhilekoa", + "current" : "hiruhileko hau", + "future" : "{0} hiruhileko barru", + "next" : "hurrengo hiruhilekoa", + "past" : "Duela {0} hiruhileko" + }, + "hour" : { + "future" : "{0} ordu barru", + "current" : "ordu honetan", + "past" : "Duela {0} ordu" + }, + "now" : "orain", + "week" : { + "current" : "aste honetan", + "next" : "hurrengo astean", + "previous" : "aurreko astean", + "future" : "{0} aste barru", + "past" : "Duela {0} aste" + }, + "second" : { + "past" : "Duela {0} segundo", + "current" : "orain", + "future" : "{0} segundo barru" + }, + "year" : { + "current" : "aurten", + "previous" : "iaz", + "past" : "Duela {0} urte", + "future" : "{0} urte barru", + "next" : "hurrengo urtean" + }, + "day" : { + "future" : "{0} egun barru", + "previous" : "atzo", + "past" : "Duela {0} egun", + "next" : "bihar", + "current" : "gaur" + }, + "minute" : { + "future" : "{0} minutu barru", + "past" : "Duela {0} minutu", + "current" : "minutu honetan" + }, + "month" : { + "future" : "{0} hilabete barru", + "next" : "hurrengo hilabetean", + "past" : "Duela {0} hilabete", + "previous" : "aurreko hilabetean", + "current" : "hilabete honetan" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/fa.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/fa.json new file mode 100644 index 0000000..064505c --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/fa.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "day" : { + "next" : "فردا", + "future" : "{0} روز بعد", + "previous" : "دیروز", + "current" : "امروز", + "past" : "{0} روز پیش" + }, + "quarter" : { + "next" : "سه‌ماههٔ آینده", + "past" : "{0} سه‌ماههٔ پیش", + "future" : "{0} سه‌ماههٔ بعد", + "previous" : "سه‌ماههٔ گذشته", + "current" : "سه‌ماههٔ کنونی" + }, + "hour" : { + "future" : "{0} ساعت بعد", + "current" : "همین ساعت", + "past" : "{0} ساعت پیش" + }, + "year" : { + "next" : "سال آینده", + "past" : "{0} سال پیش", + "current" : "امسال", + "previous" : "سال گذشته", + "future" : "{0} سال بعد" + }, + "now" : "اکنون", + "month" : { + "current" : "این ماه", + "future" : "{0} ماه بعد", + "past" : "{0} ماه پیش", + "next" : "ماه آینده", + "previous" : "ماه پیش" + }, + "week" : { + "previous" : "هفتهٔ گذشته", + "current" : "این هفته", + "past" : "{0} هفته پیش", + "future" : "{0} هفته بعد", + "next" : "هفتهٔ آینده" + }, + "minute" : { + "current" : "همین دقیقه", + "future" : "{0} دقیقه بعد", + "past" : "{0} دقیقه پیش" + }, + "second" : { + "past" : "{0} ثانیه پیش", + "current" : "اکنون", + "future" : "{0} ثانیه بعد" + } + }, + "long" : { + "day" : { + "previous" : "دیروز", + "current" : "امروز", + "next" : "فردا", + "past" : "{0} روز پیش", + "future" : "{0} روز بعد" + }, + "week" : { + "current" : "این هفته", + "future" : "{0} هفته بعد", + "past" : "{0} هفته پیش", + "previous" : "هفتهٔ گذشته", + "next" : "هفتهٔ آینده" + }, + "minute" : { + "past" : "{0} دقیقه پیش", + "current" : "همین دقیقه", + "future" : "{0} دقیقه بعد" + }, + "month" : { + "future" : "{0} ماه بعد", + "next" : "ماه آینده", + "previous" : "ماه گذشته", + "current" : "این ماه", + "past" : "{0} ماه پیش" + }, + "hour" : { + "past" : "{0} ساعت پیش", + "current" : "همین ساعت", + "future" : "{0} ساعت بعد" + }, + "year" : { + "past" : "{0} سال پیش", + "future" : "{0} سال بعد", + "previous" : "سال گذشته", + "next" : "سال آینده", + "current" : "امسال" + }, + "second" : { + "current" : "اکنون", + "past" : "{0} ثانیه پیش", + "future" : "{0} ثانیه بعد" + }, + "now" : "اکنون", + "quarter" : { + "past" : "{0} سه‌ماههٔ پیش", + "current" : "سه‌ماههٔ کنونی", + "previous" : "سه‌ماههٔ گذشته", + "future" : "{0} سه‌ماههٔ بعد", + "next" : "سه‌ماههٔ آینده" + } + }, + "short" : { + "quarter" : { + "future" : "{0} سه‌ماههٔ بعد", + "next" : "سه‌ماههٔ آینده", + "previous" : "سه‌ماههٔ گذشته", + "current" : "سه‌ماههٔ کنونی", + "past" : "{0} سه‌ماههٔ پیش" + }, + "minute" : { + "current" : "همین دقیقه", + "past" : "{0} دقیقه پیش", + "future" : "{0} دقیقه بعد" + }, + "year" : { + "next" : "سال آینده", + "future" : "{0} سال بعد", + "current" : "امسال", + "past" : "{0} سال پیش", + "previous" : "سال گذشته" + }, + "second" : { + "future" : "{0} ثانیه بعد", + "current" : "اکنون", + "past" : "{0} ثانیه پیش" + }, + "hour" : { + "past" : "{0} ساعت پیش", + "future" : "{0} ساعت بعد", + "current" : "همین ساعت" + }, + "now" : "اکنون", + "month" : { + "previous" : "ماه پیش", + "next" : "ماه آینده", + "past" : "{0} ماه پیش", + "current" : "این ماه", + "future" : "{0} ماه بعد" + }, + "week" : { + "previous" : "هفتهٔ گذشته", + "current" : "این هفته", + "next" : "هفتهٔ آینده", + "past" : "{0} هفته پیش", + "future" : "{0} هفته بعد" + }, + "day" : { + "next" : "فردا", + "past" : "{0} روز پیش", + "future" : "{0} روز بعد", + "previous" : "دیروز", + "current" : "امروز" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/fi.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/fi.json new file mode 100644 index 0000000..fd09969 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/fi.json @@ -0,0 +1,188 @@ +{ + "long" : { + "minute" : { + "past" : { + "other" : "{0} minuuttia sitten", + "one" : "{0} minuutti sitten" + }, + "future" : "{0} minuutin päästä", + "current" : "tämän minuutin aikana" + }, + "year" : { + "future" : "{0} vuoden päästä", + "current" : "tänä vuonna", + "previous" : "viime vuonna", + "next" : "ensi vuonna", + "past" : { + "one" : "{0} vuosi sitten", + "other" : "{0} vuotta sitten" + } + }, + "quarter" : { + "past" : { + "one" : "{0} neljännesvuosi sitten", + "other" : "{0} neljännesvuotta sitten" + }, + "next" : "ensi neljännesvuonna", + "previous" : "viime neljännesvuonna", + "future" : "{0} neljännesvuoden päästä", + "current" : "tänä neljännesvuonna" + }, + "week" : { + "future" : "{0} viikon päästä", + "past" : { + "other" : "{0} viikkoa sitten", + "one" : "{0} viikko sitten" + }, + "previous" : "viime viikolla", + "current" : "tällä viikolla", + "next" : "ensi viikolla" + }, + "hour" : { + "past" : { + "other" : "{0} tuntia sitten", + "one" : "{0} tunti sitten" + }, + "future" : "{0} tunnin päästä", + "current" : "tämän tunnin aikana" + }, + "month" : { + "previous" : "viime kuussa", + "next" : "ensi kuussa", + "future" : "{0} kuukauden päästä", + "past" : { + "one" : "{0} kuukausi sitten", + "other" : "{0} kuukautta sitten" + }, + "current" : "tässä kuussa" + }, + "second" : { + "current" : "nyt", + "past" : { + "one" : "{0} sekunti sitten", + "other" : "{0} sekuntia sitten" + }, + "future" : "{0} sekunnin päästä" + }, + "now" : "nyt", + "day" : { + "next" : "huomenna", + "future" : "{0} päivän päästä", + "previous" : "eilen", + "current" : "tänään", + "past" : { + "other" : "{0} päivää sitten", + "one" : "{0} päivä sitten" + } + } + }, + "short" : { + "month" : { + "future" : "{0} kk päästä", + "previous" : "viime kk", + "current" : "tässä kk", + "next" : "ensi kk", + "past" : "{0} kk sitten" + }, + "week" : { + "previous" : "viime vk", + "current" : "tällä vk", + "future" : "{0} vk päästä", + "past" : "{0} vk sitten", + "next" : "ensi vk" + }, + "hour" : { + "future" : "{0} t päästä", + "current" : "tunnin sisällä", + "past" : "{0} t sitten" + }, + "quarter" : { + "next" : "ensi neljänneksenä", + "previous" : "viime neljänneksenä", + "current" : "tänä neljänneksenä", + "past" : { + "other" : "{0} neljännestä sitten", + "one" : "{0} neljännes sitten" + }, + "future" : "{0} neljänneksen päästä" + }, + "minute" : { + "past" : "{0} min sitten", + "future" : "{0} min päästä", + "current" : "minuutin sisällä" + }, + "now" : "nyt", + "day" : { + "past" : "{0} pv sitten", + "previous" : "eilen", + "current" : "tänään", + "next" : "huom.", + "future" : "{0} pv päästä" + }, + "year" : { + "current" : "tänä v", + "previous" : "viime v", + "future" : "{0} v päästä", + "past" : "{0} v sitten", + "next" : "ensi v" + }, + "second" : { + "current" : "nyt", + "past" : "{0} s sitten", + "future" : "{0} s päästä" + } + }, + "narrow" : { + "day" : { + "next" : "huom.", + "current" : "tänään", + "future" : "{0} pv päästä", + "past" : "{0} pv sitten", + "previous" : "eilen" + }, + "week" : { + "current" : "tällä vk", + "next" : "ensi vk", + "previous" : "viime vk", + "past" : "{0} vk sitten", + "future" : "{0} vk päästä" + }, + "quarter" : { + "past" : "{0} nelj. sitten", + "future" : "{0} nelj. päästä", + "previous" : "viime nelj.", + "current" : "tänä nelj.", + "next" : "ensi nelj." + }, + "month" : { + "previous" : "viime kk", + "current" : "tässä kk", + "next" : "ensi kk", + "past" : "{0} kk sitten", + "future" : "{0} kk päästä" + }, + "hour" : { + "future" : "{0} t päästä", + "past" : "{0} t sitten", + "current" : "tunnin sisällä" + }, + "year" : { + "current" : "tänä v", + "past" : "{0} v sitten", + "future" : "{0} v päästä", + "next" : "ensi v", + "previous" : "viime v" + }, + "now" : "nyt", + "minute" : { + "past" : "{0} min sitten", + "current" : "minuutin sisällä", + "future" : "{0} min päästä" + }, + "second" : { + "past" : "{0} s sitten", + "future" : "{0} s päästä", + "current" : "nyt" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/fil.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/fil.json new file mode 100644 index 0000000..7853220 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/fil.json @@ -0,0 +1,296 @@ +{ + "narrow" : { + "hour" : { + "current" : "ngayong oras", + "past" : { + "one" : "{0} oras nakalipas", + "other" : "{0} (na) oras nakalipas" + }, + "future" : { + "other" : "sa {0} (na) oras", + "one" : "sa {0} oras" + } + }, + "week" : { + "previous" : "nakaraang linggo", + "past" : { + "one" : "{0} linggo ang nakalipas", + "other" : "{0} (na) linggo ang nakalipas" + }, + "future" : { + "other" : "sa {0} (na) linggo", + "one" : "sa {0} linggo" + }, + "next" : "susunod na linggo", + "current" : "ngayong linggo" + }, + "minute" : { + "future" : { + "one" : "sa {0} min.", + "other" : "sa {0} (na) min." + }, + "past" : { + "one" : "{0} min. ang nakalipas", + "other" : "{0} (na) min. ang nakalipas" + }, + "current" : "sa minutong ito" + }, + "quarter" : { + "future" : { + "other" : "sa {0} (na) quarter", + "one" : "sa {0} quarter" + }, + "next" : "susunod na quarter", + "current" : "ngayong quarter", + "previous" : "nakaraang quarter", + "past" : { + "other" : "{0} (na) quarter ang nakalipas", + "one" : "{0} quarter ang nakalipas" + } + }, + "year" : { + "current" : "ngayong taon", + "past" : { + "one" : "{0} taon ang nakalipas", + "other" : "{0} (na) taon ang nakalipas" + }, + "future" : { + "one" : "sa {0} taon", + "other" : "sa {0} (na) taon" + }, + "next" : "susunod na taon", + "previous" : "nakaraang taon" + }, + "month" : { + "previous" : "nakaraang buwan", + "current" : "ngayong buwan", + "next" : "susunod na buwan", + "past" : { + "one" : "{0} buwan ang nakalipas", + "other" : "{0} (na) buwan ang nakalipas" + }, + "future" : { + "other" : "sa {0} (na) buwan", + "one" : "sa {0} buwan" + } + }, + "day" : { + "next" : "bukas", + "previous" : "kahapon", + "past" : { + "other" : "{0} (na) araw ang nakalipas", + "one" : "{0} araw ang nakalipas" + }, + "current" : "ngayong araw", + "future" : { + "one" : "sa {0} araw", + "other" : "sa {0} (na) araw" + } + }, + "now" : "ngayon", + "second" : { + "current" : "ngayon", + "past" : { + "one" : "{0} seg. nakalipas", + "other" : "{0} (na) seg. nakalipas" + }, + "future" : { + "one" : "sa {0} seg.", + "other" : "sa {0} (na) seg." + } + } + }, + "long" : { + "week" : { + "current" : "sa linggong ito", + "next" : "susunod na linggo", + "past" : { + "one" : "{0} linggo ang nakalipas", + "other" : "{0} (na) linggo ang nakalipas" + }, + "previous" : "nakalipas na linggo", + "future" : { + "one" : "sa {0} linggo", + "other" : "sa {0} (na) linggo" + } + }, + "quarter" : { + "current" : "ngayong quarter", + "past" : { + "one" : "{0} quarter ang nakalipas", + "other" : "{0} (na) quarter ang nakalipas" + }, + "previous" : "nakaraang quarter", + "future" : { + "one" : "sa {0} quarter", + "other" : "sa {0} (na) quarter" + }, + "next" : "susunod na quarter" + }, + "second" : { + "future" : { + "one" : "sa {0} segundo", + "other" : "sa {0} (na) segundo" + }, + "past" : { + "other" : "{0} (na) segundo ang nakalipas", + "one" : "{0} segundo ang nakalipas" + }, + "current" : "ngayon" + }, + "day" : { + "current" : "ngayong araw", + "future" : { + "one" : "sa {0} araw", + "other" : "sa {0} (na) araw" + }, + "previous" : "kahapon", + "past" : { + "one" : "{0} araw ang nakalipas", + "other" : "{0} (na) araw ang nakalipas" + }, + "next" : "bukas" + }, + "minute" : { + "current" : "sa minutong ito", + "past" : { + "other" : "{0} (na) minuto ang nakalipas", + "one" : "{0} minuto ang nakalipas" + }, + "future" : { + "other" : "sa {0} (na) minuto", + "one" : "sa {0} minuto" + } + }, + "month" : { + "next" : "susunod na buwan", + "previous" : "nakaraang buwan", + "past" : { + "one" : "{0} buwan ang nakalipas", + "other" : "{0} (na) buwan ang nakalipas" + }, + "future" : { + "other" : "sa {0} (na) buwan", + "one" : "sa {0} buwan" + }, + "current" : "ngayong buwan" + }, + "now" : "ngayon", + "year" : { + "previous" : "nakaraang taon", + "past" : { + "one" : "{0} taon ang nakalipas", + "other" : "{0} (na) taon ang nakalipas" + }, + "current" : "ngayong taon", + "next" : "susunod na taon", + "future" : { + "one" : "sa {0} taon", + "other" : "sa {0} (na) taon" + } + }, + "hour" : { + "past" : { + "other" : "{0} (na) oras ang nakalipas", + "one" : "{0} oras ang nakalipas" + }, + "current" : "ngayong oras", + "future" : { + "other" : "sa {0} (na) oras", + "one" : "sa {0} oras" + } + } + }, + "short" : { + "minute" : { + "current" : "sa minutong ito", + "future" : { + "other" : "sa {0} (na) min.", + "one" : "sa {0} min." + }, + "past" : { + "other" : "{0} (na) min. ang nakalipas", + "one" : "{0} min. ang nakalipas" + } + }, + "second" : { + "past" : { + "other" : "{0} (na) seg. nakalipas", + "one" : "{0} seg. ang nakalipas" + }, + "current" : "ngayon", + "future" : { + "one" : "sa {0} seg.", + "other" : "sa {0} (na) seg." + } + }, + "year" : { + "next" : "susunod na taon", + "current" : "ngayong taon", + "past" : { + "one" : "{0} taon ang nakalipas", + "other" : "{0} (na) taon ang nakalipas" + }, + "previous" : "nakaraang taon", + "future" : { + "one" : "sa {0} taon", + "other" : "sa {0} (na) taon" + } + }, + "month" : { + "past" : { + "other" : "{0} (na) buwan ang nakalipas", + "one" : "{0} buwan ang nakalipas" + }, + "next" : "susunod na buwan", + "future" : { + "one" : "sa {0} buwan", + "other" : "sa {0} (na) buwan" + }, + "previous" : "nakaraang buwan", + "current" : "ngayong buwan" + }, + "day" : { + "previous" : "kahapon", + "past" : "{0} (na) araw ang nakalipas", + "current" : "ngayong araw", + "next" : "bukas", + "future" : "sa {0} (na) araw" + }, + "now" : "ngayon", + "hour" : { + "current" : "ngayong oras", + "future" : { + "one" : "sa {0} oras", + "other" : "sa {0} (na) oras" + }, + "past" : { + "other" : "{0} (na) oras ang nakalipas", + "one" : "{0} oras ang nakalipas" + } + }, + "quarter" : { + "next" : "susunod na quarter", + "previous" : "nakaraang quarter", + "past" : { + "one" : "{0} quarter ang nakalipas", + "other" : "{0} (na) quarter ang nakalipas" + }, + "future" : "sa {0} (na) quarter", + "current" : "ngayong quarter" + }, + "week" : { + "next" : "susunod na linggo", + "previous" : "nakaraang linggo", + "past" : { + "one" : "{0} linggo ang nakalipas", + "other" : "{0} (na) linggo ang nakalipas" + }, + "current" : "ngayong linggo", + "future" : { + "one" : "sa {0} linggo", + "other" : "sa {0} (na) linggo" + } + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/fo.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/fo.json new file mode 100644 index 0000000..cf85ade --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/fo.json @@ -0,0 +1,197 @@ +{ + "narrow" : { + "year" : { + "future" : "um {0} ár", + "previous" : "í fjør", + "next" : "næsta ár", + "current" : "í ár", + "past" : "{0} ár síðan" + }, + "week" : { + "past" : "{0} v. síðan", + "previous" : "seinastu viku", + "future" : "um {0} v.", + "current" : "hesu viku", + "next" : "næstu viku" + }, + "hour" : { + "current" : "hendan tíman", + "future" : "um {0} t.", + "past" : "{0} t. síðan" + }, + "quarter" : { + "current" : "hendan ársfjórðingin", + "previous" : "seinasta ársfjórðing", + "future" : "um {0} ársfj.", + "past" : "{0} ársfj. síðan", + "next" : "næsta ársfjórðing" + }, + "second" : { + "past" : "{0} s. síðan", + "future" : "um {0} s.", + "current" : "nú" + }, + "month" : { + "current" : "henda mánaðin", + "future" : "um {0} mnð.", + "past" : "{0} mnð. síðan", + "next" : "næsta mánað", + "previous" : "seinasta mánað" + }, + "day" : { + "previous" : "í gjár", + "future" : "um {0} d.", + "next" : "í morgin", + "current" : "í dag", + "past" : "{0} d. síðan" + }, + "minute" : { + "past" : "{0} m. síðan", + "future" : "um {0} m.", + "current" : "hendan minuttin" + }, + "now" : "nú" + }, + "long" : { + "month" : { + "previous" : "seinasta mánað", + "past" : { + "one" : "{0} mánað síðan", + "other" : "{0} mánaðir síðan" + }, + "next" : "næsta mánað", + "current" : "henda mánaðin", + "future" : { + "other" : "um {0} mánaðir", + "one" : "um {0} mánað" + } + }, + "minute" : { + "current" : "hendan minuttin", + "future" : { + "one" : "um {0} minutt", + "other" : "um {0} minuttir" + }, + "past" : { + "one" : "{0} minutt síðan", + "other" : "{0} minuttir síðan" + } + }, + "quarter" : { + "next" : "næsta ársfjórðing", + "past" : { + "one" : "{0} ársfjórðing síðan", + "other" : "{0} ársfjórðingar síðan" + }, + "future" : { + "one" : "um {0} ársfjórðing", + "other" : "um {0} ársfjórðingar" + }, + "current" : "hendan ársfjórðingin", + "previous" : "seinasta ársfjórðing" + }, + "week" : { + "next" : "næstu viku", + "previous" : "seinastu viku", + "future" : { + "other" : "um {0} vikur", + "one" : "um {0} viku" + }, + "past" : { + "one" : "{0} vika síðan", + "other" : "{0} vikur síðan" + }, + "current" : "hesu viku" + }, + "day" : { + "previous" : "í gjár", + "past" : { + "one" : "{0} dagur síðan", + "other" : "{0} dagar síðan" + }, + "future" : { + "other" : "um {0} dagar", + "one" : "um {0} dag" + }, + "current" : "í dag", + "next" : "í morgin" + }, + "hour" : { + "future" : { + "one" : "um {0} tíma", + "other" : "um {0} tímar" + }, + "current" : "hendan tíman", + "past" : { + "one" : "{0} tími síðan", + "other" : "{0} tímar síðan" + } + }, + "year" : { + "current" : "í ár", + "future" : "um {0} ár", + "next" : "næsta ár", + "past" : "{0} ár síðan", + "previous" : "í fjør" + }, + "second" : { + "future" : "um {0} sekund", + "current" : "nú", + "past" : "{0} sekund síðan" + }, + "now" : "nú" + }, + "short" : { + "second" : { + "current" : "nú", + "past" : "{0} sek. síðan", + "future" : "um {0} sek." + }, + "now" : "nú", + "month" : { + "future" : "um {0} mnð.", + "current" : "henda mánaðin", + "past" : "{0} mnð. síðan", + "previous" : "seinasta mánað", + "next" : "næsta mánað" + }, + "day" : { + "previous" : "í gjár", + "current" : "í dag", + "next" : "í morgin", + "future" : "um {0} da.", + "past" : "{0} da. síðan" + }, + "minute" : { + "past" : "{0} min. síðan", + "future" : "um {0} min.", + "current" : "hendan minuttin" + }, + "quarter" : { + "past" : "{0} ársfj. síðan", + "previous" : "seinasta ársfjórðing", + "current" : "hendan ársfjórðingin", + "future" : "um {0} ársfj.", + "next" : "næsta ársfjórðing" + }, + "hour" : { + "future" : "um {0} t.", + "current" : "hendan tíman", + "past" : "{0} t. síðan" + }, + "week" : { + "future" : "um {0} vi.", + "previous" : "seinastu viku", + "next" : "næstu viku", + "past" : "{0} vi. síðan", + "current" : "hesu viku" + }, + "year" : { + "next" : "næsta ár", + "current" : "í ár", + "past" : "{0} ár síðan", + "future" : "um {0} ár", + "previous" : "í fjør" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/fr.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/fr.json new file mode 100644 index 0000000..4901fbc --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/fr.json @@ -0,0 +1,203 @@ +{ + "narrow" : { + "day" : { + "next" : "demain", + "future" : "+{0} j", + "previous" : "hier", + "current" : "aujourd’hui", + "past" : "-{0} j" + }, + "quarter" : { + "next" : "le trimestre prochain", + "past" : "-{0} trim.", + "future" : "+{0} trim.", + "previous" : "le trimestre dernier", + "current" : "ce trimestre" + }, + "hour" : { + "past" : "-{0} h", + "future" : "+{0} h", + "current" : "cette heure-ci" + }, + "year" : { + "next" : "l’année prochaine", + "past" : "-{0} a", + "current" : "cette année", + "previous" : "l’année dernière", + "future" : "+{0} a" + }, + "now" : "maintenant", + "month" : { + "current" : "ce mois-ci", + "future" : "+{0} m.", + "past" : "-{0} m.", + "next" : "le mois prochain", + "previous" : "le mois dernier" + }, + "week" : { + "previous" : "la semaine dernière", + "current" : "cette semaine", + "past" : "-{0} sem.", + "future" : "+{0} sem.", + "next" : "la semaine prochaine" + }, + "minute" : { + "current" : "cette minute-ci", + "past" : "-{0} min", + "future" : "+{0} min" + }, + "second" : { + "current" : "maintenant", + "past" : "-{0} s", + "future" : "+{0} s" + } + }, + "long" : { + "quarter" : { + "next" : "le trimestre prochain", + "future" : { + "other" : "dans {0} trimestres", + "one" : "dans {0} trimestre" + }, + "previous" : "le trimestre dernier", + "current" : "ce trimestre", + "past" : { + "other" : "il y a {0} trimestres", + "one" : "il y a {0} trimestre" + } + }, + "hour" : { + "future" : { + "other" : "dans {0} heures", + "one" : "dans {0} heure" + }, + "past" : { + "one" : "il y a {0} heure", + "other" : "il y a {0} heures" + }, + "current" : "cette heure-ci" + }, + "minute" : { + "past" : { + "one" : "il y a {0} minute", + "other" : "il y a {0} minutes" + }, + "future" : { + "one" : "dans {0} minute", + "other" : "dans {0} minutes" + }, + "current" : "cette minute-ci" + }, + "now" : "maintenant", + "month" : { + "next" : "le mois prochain", + "previous" : "le mois dernier", + "future" : "dans {0} mois", + "current" : "ce mois-ci", + "past" : "il y a {0} mois" + }, + "day" : { + "next" : "demain", + "future" : { + "one" : "dans {0} jour", + "other" : "dans {0} jours" + }, + "past" : { + "one" : "il y a {0} jour", + "other" : "il y a {0} jours" + }, + "current" : "aujourd’hui", + "previous" : "hier" + }, + "year" : { + "future" : { + "one" : "dans {0} an", + "other" : "dans {0} ans" + }, + "previous" : "l’année dernière", + "next" : "l’année prochaine", + "current" : "cette année", + "past" : { + "other" : "il y a {0} ans", + "one" : "il y a {0} an" + } + }, + "week" : { + "next" : "la semaine prochaine", + "past" : { + "one" : "il y a {0} semaine", + "other" : "il y a {0} semaines" + }, + "previous" : "la semaine dernière", + "current" : "cette semaine", + "future" : { + "one" : "dans {0} semaine", + "other" : "dans {0} semaines" + } + }, + "second" : { + "future" : { + "one" : "dans {0} seconde", + "other" : "dans {0} secondes" + }, + "current" : "maintenant", + "past" : { + "other" : "il y a {0} secondes", + "one" : "il y a {0} seconde" + } + } + }, + "short" : { + "quarter" : { + "future" : "dans {0} trim.", + "next" : "le trimestre prochain", + "previous" : "le trimestre dernier", + "current" : "ce trimestre", + "past" : "il y a {0} trim." + }, + "minute" : { + "future" : "dans {0} min", + "current" : "cette minute-ci", + "past" : "il y a {0} min" + }, + "year" : { + "next" : "l’année prochaine", + "future" : "dans {0} a", + "current" : "cette année", + "past" : "il y a {0} a", + "previous" : "l’année dernière" + }, + "second" : { + "current" : "maintenant", + "past" : "il y a {0} s", + "future" : "dans {0} s" + }, + "hour" : { + "current" : "cette heure-ci", + "past" : "il y a {0} h", + "future" : "dans {0} h" + }, + "now" : "maintenant", + "month" : { + "previous" : "le mois dernier", + "next" : "le mois prochain", + "past" : "il y a {0} m.", + "current" : "ce mois-ci", + "future" : "dans {0} m." + }, + "week" : { + "previous" : "la semaine dernière", + "current" : "cette semaine", + "next" : "la semaine prochaine", + "past" : "il y a {0} sem.", + "future" : "dans {0} sem." + }, + "day" : { + "next" : "demain", + "past" : "il y a {0} j", + "future" : "dans {0} j", + "previous" : "hier", + "current" : "aujourd’hui" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/fr_CA.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/fr_CA.json new file mode 100644 index 0000000..6e50f6b --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/fr_CA.json @@ -0,0 +1,206 @@ +{ + "long" : { + "quarter" : { + "past" : { + "one" : "il y a {0} trimestre", + "other" : "il y a {0} trimestres" + }, + "next" : "le trimestre prochain", + "previous" : "le trimestre dernier", + "current" : "ce trimestre-ci", + "future" : { + "one" : "dans {0} trimestre", + "other" : "dans {0} trimestres" + } + }, + "day" : { + "future" : { + "other" : "dans {0} jours", + "one" : "dans {0} jour" + }, + "previous" : "hier", + "past" : { + "other" : "il y a {0} jours", + "one" : "il y a {0} jour" + }, + "next" : "demain", + "current" : "aujourd’hui" + }, + "year" : { + "previous" : "l’année dernière", + "current" : "cette année", + "future" : { + "one" : "Dans {0} an", + "other" : "Dans {0} ans" + }, + "next" : "l’année prochaine", + "past" : { + "other" : "Il y a {0} ans", + "one" : "Il y a {0} an" + } + }, + "hour" : { + "future" : { + "one" : "dans {0} heure", + "other" : "dans {0} heures" + }, + "current" : "cette heure-ci", + "past" : { + "other" : "il y a {0} heures", + "one" : "il y a {0} heure" + } + }, + "second" : { + "past" : { + "one" : "il y a {0} seconde", + "other" : "il y a {0} secondes" + }, + "current" : "maintenant", + "future" : { + "other" : "dans {0} secondes", + "one" : "dans {0} seconde" + } + }, + "minute" : { + "past" : { + "one" : "il y a {0} minute", + "other" : "il y a {0} minutes" + }, + "current" : "cette minute-ci", + "future" : { + "one" : "dans {0} minute", + "other" : "dans {0} minutes" + } + }, + "month" : { + "current" : "ce mois-ci", + "next" : "le mois prochain", + "previous" : "le mois dernier", + "past" : "il y a {0} mois", + "future" : "dans {0} mois" + }, + "now" : "maintenant", + "week" : { + "past" : { + "one" : "il y a {0} semaine", + "other" : "il y a {0} semaines" + }, + "current" : "cette semaine", + "next" : "la semaine prochaine", + "previous" : "la semaine dernière", + "future" : { + "one" : "dans {0} semaine", + "other" : "dans {0} semaines" + } + } + }, + "narrow" : { + "week" : { + "current" : "cette semaine", + "next" : "la semaine prochaine", + "past" : "-{0} sem.", + "previous" : "la semaine dernière", + "future" : "+{0} sem." + }, + "minute" : { + "current" : "cette minute-ci", + "past" : "-{0} min", + "future" : "+{0} min" + }, + "month" : { + "current" : "ce mois-ci", + "previous" : "le mois dernier", + "past" : "-{0} m.", + "next" : "le mois prochain", + "future" : "+{0} m." + }, + "now" : "maintenant", + "year" : { + "current" : "cette année", + "next" : "l’année prochaine", + "past" : "-{0} a", + "future" : "+{0} a", + "previous" : "l’année dernière" + }, + "hour" : { + "current" : "cette heure-ci", + "future" : "+{0} h", + "past" : "-{0} h" + }, + "quarter" : { + "previous" : "le trimestre dernier", + "current" : "ce trimestre-ci", + "past" : "-{0} trim.", + "future" : "+{0} trim.", + "next" : "le trimestre prochain" + }, + "second" : { + "past" : "-{0} s", + "future" : { + "one" : "+ {0} s", + "other" : "+{0} s" + }, + "current" : "maintenant" + }, + "day" : { + "past" : "-{0} j", + "current" : "aujourd’hui", + "future" : "+{0} j", + "previous" : "hier", + "next" : "demain" + } + }, + "short" : { + "month" : { + "previous" : "le mois dernier", + "current" : "ce mois-ci", + "next" : "le mois prochain", + "past" : "il y a {0} m.", + "future" : "dans {0} m." + }, + "now" : "maintenant", + "day" : { + "next" : "demain", + "current" : "aujourd’hui", + "previous" : "hier", + "past" : "il y a {0} j", + "future" : "dans {0} j" + }, + "year" : { + "current" : "cette année", + "future" : "dans {0} a", + "previous" : "l’année dernière", + "next" : "l’année prochaine", + "past" : "il y a {0} a" + }, + "hour" : { + "future" : "dans {0} h", + "current" : "cette heure-ci", + "past" : "il y a {0} h" + }, + "minute" : { + "past" : "il y a {0} min", + "future" : "dans {0} min", + "current" : "cette minute-ci" + }, + "second" : { + "past" : "il y a {0} s", + "current" : "maintenant", + "future" : "dans {0} s" + }, + "quarter" : { + "future" : "dans {0} trim.", + "previous" : "le trimestre dernier", + "next" : "le trimestre prochain", + "past" : "il y a {0} trim.", + "current" : "ce trimestre-ci" + }, + "week" : { + "next" : "la semaine prochaine", + "past" : "il y a {0} sem.", + "current" : "cette semaine", + "previous" : "la semaine dernière", + "future" : "dans {0} sem." + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/fur.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/fur.json new file mode 100644 index 0000000..6f49556 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/fur.json @@ -0,0 +1,269 @@ +{ + "short" : { + "day" : { + "next" : "doman", + "past" : { + "one" : "{0} zornade indaûr", + "other" : "{0} zornadis indaûr" + }, + "current" : "vuê", + "previous" : "îr", + "future" : { + "one" : "ca di {0} zornade", + "other" : "ca di {0} zornadis" + } + }, + "month" : { + "past" : "{0} mês indaûr", + "future" : "ca di {0} mês", + "next" : "next month", + "current" : "this month", + "previous" : "last month" + }, + "quarter" : { + "current" : "this quarter", + "past" : "-{0} Q", + "next" : "next quarter", + "previous" : "last quarter", + "future" : "+{0} Q" + }, + "hour" : { + "current" : "this hour", + "future" : { + "one" : "ca di {0} ore", + "other" : "ca di {0} oris" + }, + "past" : { + "other" : "{0} oris indaûr", + "one" : "{0} ore indaûr" + } + }, + "year" : { + "next" : "next year", + "previous" : "last year", + "past" : { + "other" : "{0} agns indaûr", + "one" : "{0} an indaûr" + }, + "current" : "this year", + "future" : { + "one" : "ca di {0} an", + "other" : "ca di {0} agns" + } + }, + "minute" : { + "current" : "this minute", + "future" : { + "one" : "ca di {0} minût", + "other" : "ca di {0} minûts" + }, + "past" : { + "other" : "{0} minûts indaûr", + "one" : "{0} minût indaûr" + } + }, + "now" : "now", + "week" : { + "next" : "next week", + "previous" : "last week", + "current" : "this week", + "past" : { + "one" : "{0} setemane indaûr", + "other" : "{0} setemanis indaûr" + }, + "future" : { + "other" : "ca di {0} setemanis", + "one" : "ca di {0} setemane" + } + }, + "second" : { + "current" : "now", + "future" : { + "one" : "ca di {0} secont", + "other" : "ca di {0} seconts" + }, + "past" : { + "one" : "{0} secont indaûr", + "other" : "{0} seconts indaûr" + } + } + }, + "long" : { + "hour" : { + "past" : { + "one" : "{0} ore indaûr", + "other" : "{0} oris indaûr" + }, + "future" : { + "one" : "ca di {0} ore", + "other" : "ca di {0} oris" + }, + "current" : "this hour" + }, + "now" : "now", + "quarter" : { + "future" : "+{0} Q", + "previous" : "last quarter", + "next" : "next quarter", + "current" : "this quarter", + "past" : "-{0} Q" + }, + "day" : { + "current" : "vuê", + "past" : { + "one" : "{0} zornade indaûr", + "other" : "{0} zornadis indaûr" + }, + "future" : { + "one" : "ca di {0} zornade", + "other" : "ca di {0} zornadis" + }, + "next" : "doman", + "previous" : "îr" + }, + "week" : { + "current" : "this week", + "future" : { + "one" : "ca di {0} setemane", + "other" : "ca di {0} setemanis" + }, + "previous" : "last week", + "next" : "next week", + "past" : { + "other" : "{0} setemanis indaûr", + "one" : "{0} setemane indaûr" + } + }, + "minute" : { + "future" : { + "one" : "ca di {0} minût", + "other" : "ca di {0} minûts" + }, + "past" : { + "other" : "{0} minûts indaûr", + "one" : "{0} minût indaûr" + }, + "current" : "this minute" + }, + "second" : { + "current" : "now", + "future" : { + "one" : "ca di {0} secont", + "other" : "ca di {0} seconts" + }, + "past" : { + "one" : "{0} secont indaûr", + "other" : "{0} seconts indaûr" + } + }, + "month" : { + "current" : "this month", + "future" : "ca di {0} mês", + "past" : "{0} mês indaûr", + "next" : "next month", + "previous" : "last month" + }, + "year" : { + "current" : "this year", + "past" : { + "one" : "{0} an indaûr", + "other" : "{0} agns indaûr" + }, + "next" : "next year", + "previous" : "last year", + "future" : { + "one" : "ca di {0} an", + "other" : "ca di {0} agns" + } + } + }, + "narrow" : { + "week" : { + "previous" : "last week", + "past" : { + "other" : "{0} setemanis indaûr", + "one" : "{0} setemane indaûr" + }, + "current" : "this week", + "future" : { + "other" : "ca di {0} setemanis", + "one" : "ca di {0} setemane" + }, + "next" : "next week" + }, + "hour" : { + "future" : { + "other" : "ca di {0} oris", + "one" : "ca di {0} ore" + }, + "current" : "this hour", + "past" : { + "one" : "{0} ore indaûr", + "other" : "{0} oris indaûr" + } + }, + "now" : "now", + "second" : { + "past" : { + "other" : "{0} seconts indaûr", + "one" : "{0} secont indaûr" + }, + "future" : { + "other" : "ca di {0} seconts", + "one" : "ca di {0} secont" + }, + "current" : "now" + }, + "month" : { + "previous" : "last month", + "next" : "next month", + "current" : "this month", + "past" : "{0} mês indaûr", + "future" : "ca di {0} mês" + }, + "day" : { + "previous" : "îr", + "current" : "vuê", + "next" : "doman", + "past" : { + "other" : "{0} zornadis indaûr", + "one" : "{0} zornade indaûr" + }, + "future" : { + "other" : "ca di {0} zornadis", + "one" : "ca di {0} zornade" + } + }, + "year" : { + "future" : { + "one" : "ca di {0} an", + "other" : "ca di {0} agns" + }, + "current" : "this year", + "past" : { + "other" : "{0} agns indaûr", + "one" : "{0} an indaûr" + }, + "previous" : "last year", + "next" : "next year" + }, + "quarter" : { + "past" : "-{0} Q", + "next" : "next quarter", + "previous" : "last quarter", + "current" : "this quarter", + "future" : "+{0} Q" + }, + "minute" : { + "current" : "this minute", + "past" : { + "other" : "{0} minûts indaûr", + "one" : "{0} minût indaûr" + }, + "future" : { + "other" : "ca di {0} minûts", + "one" : "ca di {0} minût" + } + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/fy.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/fy.json new file mode 100644 index 0000000..2a55615 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/fy.json @@ -0,0 +1,251 @@ +{ + "narrow" : { + "week" : { + "current" : "dizze wike", + "next" : "folgjende wike", + "future" : { + "other" : "Oer {0} wiken", + "one" : "Oer {0} wike" + }, + "past" : { + "one" : "{0} wike lyn", + "other" : "{0} wiken lyn" + }, + "previous" : "foarige wike" + }, + "month" : { + "past" : { + "one" : "{0} moanne lyn", + "other" : "{0} moannen lyn" + }, + "current" : "dizze moanne", + "future" : { + "one" : "Oer {0} moanne", + "other" : "Oer {0} moannen" + }, + "next" : "folgjende moanne", + "previous" : "foarige moanne" + }, + "quarter" : { + "next" : "next quarter", + "previous" : "last quarter", + "current" : "this quarter", + "past" : "-{0} Q", + "future" : "+{0} Q" + }, + "year" : { + "current" : "dit jier", + "next" : "folgjend jier", + "previous" : "foarich jier", + "past" : "{0} jier lyn", + "future" : "Oer {0} jier" + }, + "hour" : { + "past" : "{0} oere lyn", + "future" : "Oer {0} oere", + "current" : "this hour" + }, + "now" : "nu", + "day" : { + "current" : "vandaag", + "past" : { + "other" : "{0} deien lyn", + "one" : "{0} dei lyn" + }, + "previous" : "gisteren", + "next" : "morgen", + "future" : { + "one" : "Oer {0} dei", + "other" : "Oer {0} deien" + } + }, + "minute" : { + "current" : "this minute", + "past" : { + "other" : "{0} minuten lyn", + "one" : "{0} minút lyn" + }, + "future" : { + "other" : "Oer {0} minuten", + "one" : "Oer {0} minút" + } + }, + "second" : { + "future" : { + "one" : "Oer {0} sekonde", + "other" : "Oer {0} sekonden" + }, + "current" : "nu", + "past" : { + "one" : "{0} sekonde lyn", + "other" : "{0} sekonden lyn" + } + } + }, + "long" : { + "quarter" : { + "next" : "next quarter", + "current" : "this quarter", + "past" : "-{0} Q", + "previous" : "last quarter", + "future" : "+{0} Q" + }, + "now" : "nu", + "day" : { + "previous" : "gisteren", + "past" : { + "one" : "{0} dei lyn", + "other" : "{0} deien lyn" + }, + "current" : "vandaag", + "next" : "morgen", + "future" : { + "one" : "Oer {0} dei", + "other" : "Oer {0} deien" + } + }, + "month" : { + "next" : "folgjende moanne", + "previous" : "foarige moanne", + "past" : { + "other" : "{0} moannen lyn", + "one" : "{0} moanne lyn" + }, + "future" : { + "other" : "Oer {0} moannen", + "one" : "Oer {0} moanne" + }, + "current" : "dizze moanne" + }, + "second" : { + "past" : { + "one" : "{0} sekonde lyn", + "other" : "{0} sekonden lyn" + }, + "future" : { + "one" : "Oer {0} sekonde", + "other" : "Oer {0} sekonden" + }, + "current" : "nu" + }, + "year" : { + "previous" : "foarich jier", + "next" : "folgjend jier", + "future" : "Oer {0} jier", + "past" : "{0} jier lyn", + "current" : "dit jier" + }, + "week" : { + "future" : { + "one" : "Oer {0} wike", + "other" : "Oer {0} wiken" + }, + "current" : "dizze wike", + "past" : { + "other" : "{0} wiken lyn", + "one" : "{0} wike lyn" + }, + "next" : "folgjende wike", + "previous" : "foarige wike" + }, + "hour" : { + "past" : "{0} oere lyn", + "future" : "Oer {0} oere", + "current" : "this hour" + }, + "minute" : { + "future" : { + "one" : "Oer {0} minút", + "other" : "Oer {0} minuten" + }, + "past" : { + "one" : "{0} minút lyn", + "other" : "{0} minuten lyn" + }, + "current" : "this minute" + } + }, + "short" : { + "year" : { + "next" : "folgjend jier", + "future" : "Oer {0} jier", + "current" : "dit jier", + "past" : "{0} jier lyn", + "previous" : "foarich jier" + }, + "minute" : { + "current" : "this minute", + "past" : { + "one" : "{0} minút lyn", + "other" : "{0} minuten lyn" + }, + "future" : { + "one" : "Oer {0} minút", + "other" : "Oer {0} minuten" + } + }, + "week" : { + "future" : { + "other" : "Oer {0} wiken", + "one" : "Oer {0} wike" + }, + "next" : "folgjende wike", + "current" : "dizze wike", + "past" : { + "one" : "{0} wike lyn", + "other" : "{0} wiken lyn" + }, + "previous" : "foarige wike" + }, + "day" : { + "next" : "morgen", + "current" : "vandaag", + "previous" : "gisteren", + "future" : { + "one" : "Oer {0} dei", + "other" : "Oer {0} deien" + }, + "past" : { + "one" : "{0} dei lyn", + "other" : "{0} deien lyn" + } + }, + "quarter" : { + "future" : "+{0} Q", + "next" : "next quarter", + "previous" : "last quarter", + "current" : "this quarter", + "past" : "-{0} Q" + }, + "month" : { + "current" : "dizze moanne", + "past" : { + "other" : "{0} moannen lyn", + "one" : "{0} moanne lyn" + }, + "previous" : "foarige moanne", + "next" : "folgjende moanne", + "future" : { + "other" : "Oer {0} moannen", + "one" : "Oer {0} moanne" + } + }, + "now" : "nu", + "second" : { + "current" : "nu", + "future" : { + "other" : "Oer {0} sekonden", + "one" : "Oer {0} sekonde" + }, + "past" : { + "one" : "{0} sekonde lyn", + "other" : "{0} sekonden lyn" + } + }, + "hour" : { + "past" : "{0} oere lyn", + "current" : "this hour", + "future" : "Oer {0} oere" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ga.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ga.json new file mode 100644 index 0000000..da1357d --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ga.json @@ -0,0 +1,267 @@ +{ + "long" : { + "month" : { + "next" : "an mhí seo chugainn", + "current" : "an mhí seo", + "future" : { + "one" : "i gceann {0} mhí", + "two" : "i gceann {0} mhí", + "other" : "i gceann {0} mí", + "few" : "i gceann {0} mhí" + }, + "previous" : "an mhí seo caite", + "past" : { + "one" : "{0} mhí ó shin", + "other" : "{0} mí ó shin", + "two" : "{0} mhí ó shin", + "few" : "{0} mhí ó shin" + } + }, + "second" : { + "current" : "anois", + "past" : { + "few" : "{0} shoicind ó shin", + "other" : "{0} soicind ó shin", + "two" : "{0} shoicind ó shin" + }, + "future" : { + "other" : "i gceann {0} soicind", + "two" : "i gceann {0} shoicind", + "few" : "i gceann {0} shoicind" + } + }, + "day" : { + "past" : "{0} lá ó shin", + "future" : "i gceann {0} lá", + "next" : "amárach", + "previous" : "inné", + "current" : "inniu" + }, + "minute" : { + "future" : "i gceann {0} nóiméad", + "current" : "an nóiméad seo", + "past" : "{0} nóiméad ó shin" + }, + "hour" : { + "current" : "an uair seo", + "past" : { + "many" : "{0} n-uaire an chloig ó shin", + "few" : "{0} huaire an chloig ó shin", + "other" : "{0} uair an chloig ó shin" + }, + "future" : { + "few" : "i gceann {0} huaire an chloig", + "many" : "i gceann {0} n-uaire an chloig", + "other" : "i gceann {0} uair an chloig" + } + }, + "quarter" : { + "next" : "an ráithe seo chugainn", + "current" : "an ráithe seo", + "future" : "i gceann {0} ráithe", + "past" : "{0} ráithe ó shin", + "previous" : "an ráithe seo caite" + }, + "now" : "anois", + "year" : { + "next" : "an bhliain seo chugainn", + "past" : { + "two" : "{0} bhliain ó shin", + "many" : "{0} mbliana ó shin", + "other" : "{0} bliain ó shin", + "one" : "{0} bhliain ó shin", + "few" : "{0} bliana ó shin" + }, + "future" : { + "one" : "i gceann {0} bhliain", + "two" : "i gceann {0} bhliain", + "few" : "i gceann {0} bliana", + "many" : "i gceann {0} mbliana", + "other" : "i gceann {0} bliain" + }, + "previous" : "anuraidh", + "current" : "an bhliain seo" + }, + "week" : { + "previous" : "an tseachtain seo caite", + "next" : "an tseachtain seo chugainn", + "past" : { + "other" : "{0} seachtain ó shin", + "many" : "{0} seachtaine ó shin", + "few" : "{0} seachtaine ó shin", + "two" : "{0} sheachtain ó shin" + }, + "current" : "an tseachtain seo", + "future" : { + "other" : "i gceann {0} seachtain", + "many" : "i gceann {0} seachtaine", + "few" : "i gceann {0} seachtaine", + "two" : "i gceann {0} sheachtain" + } + } + }, + "short" : { + "minute" : { + "past" : "{0} nóim. ó shin", + "future" : "i gceann {0} nóim.", + "current" : "an nóiméad seo" + }, + "hour" : { + "current" : "an uair seo", + "future" : { + "few" : "i gceann {0} huaire", + "many" : "i gceann {0} n-uaire", + "other" : "i gceann {0} uair" + }, + "past" : { + "other" : "{0} uair ó shin", + "few" : "{0} huaire ó shin", + "many" : "{0} n-uaire ó shin" + } + }, + "day" : { + "past" : "{0} lá ó shin", + "previous" : "inné", + "current" : "inniu", + "future" : "i gceann {0} lá", + "next" : "amárach" + }, + "second" : { + "future" : { + "few" : "i gceann {0} shoic.", + "two" : "i gceann {0} shoic.", + "other" : "i gceann {0} soic." + }, + "past" : { + "few" : "{0} shoic. ó shin", + "two" : "{0} shoic. ó shin", + "other" : "{0} soic. ó shin" + }, + "current" : "anois" + }, + "quarter" : { + "future" : "i gceann {0} ráithe", + "next" : "an ráithe seo chugainn", + "current" : "an ráithe seo", + "past" : "{0} ráithe ó shin", + "previous" : "an ráithe seo caite" + }, + "year" : { + "current" : "an bhl. seo", + "past" : { + "other" : "{0} bl. ó shin", + "two" : "{0} bhl. ó shin", + "many" : "{0} mbl. ó shin", + "one" : "{0} bhl. ó shin" + }, + "previous" : "anuraidh", + "next" : "an bhl. seo chugainn", + "future" : { + "two" : "i gceann {0} bhl.", + "many" : "i gceann {0} mbl.", + "other" : "i gceann {0} bl." + } + }, + "week" : { + "future" : { + "two" : "i gceann {0} shcht.", + "other" : "i gceann {0} scht." + }, + "past" : "{0} scht. ó shin", + "next" : "an tscht. seo chugainn", + "current" : "an tscht. seo", + "previous" : "an tscht. seo caite" + }, + "month" : { + "future" : { + "few" : "i gceann {0} mhí", + "other" : "i gceann {0} mí", + "one" : "i gceann {0} mhí", + "two" : "i gceann {0} mhí" + }, + "past" : { + "two" : "{0} mhí ó shin", + "one" : "{0} mhí ó shin", + "other" : "{0} mí ó shin", + "few" : "{0} mhí ó shin" + }, + "current" : "an mhí seo", + "previous" : "an mhí seo caite", + "next" : "an mhí seo chugainn" + }, + "now" : "anois" + }, + "narrow" : { + "now" : "anois", + "day" : { + "future" : "+{0} lá", + "current" : "inniu", + "next" : "amárach", + "previous" : "inné", + "past" : "-{0} lá" + }, + "year" : { + "next" : "an bhl. seo chugainn", + "future" : { + "two" : "+{0} bhl.", + "many" : "+{0} mbl.", + "one" : "+{0} bhl.", + "other" : "+{0} bl." + }, + "past" : { + "other" : "-{0} bl.", + "two" : "-{0} bhl.", + "one" : "-{0} bhl.", + "many" : "-{0} mbl." + }, + "current" : "an bhl. seo", + "previous" : "anuraidh" + }, + "minute" : { + "current" : "an nóiméad seo", + "past" : "-{0} n", + "future" : "+{0} n" + }, + "week" : { + "previous" : "an tscht. seo caite", + "current" : "an tscht. seo", + "past" : "-{0} scht.", + "future" : "+{0} scht.", + "next" : "an tscht. seo chugainn" + }, + "hour" : { + "current" : "an uair seo", + "future" : "+{0} u", + "past" : "-{0} u" + }, + "second" : { + "current" : "anois", + "future" : "+{0} s", + "past" : "-{0} s" + }, + "month" : { + "next" : "an mhí seo chugainn", + "past" : { + "one" : "-{0} mhí", + "other" : "-{0} mí", + "few" : "-{0} mhí", + "two" : "-{0} mhí" + }, + "previous" : "an mhí seo caite", + "future" : { + "two" : "+{0} mhí", + "one" : "+{0} mhí", + "few" : "+{0} mhí", + "other" : "+{0} mí" + }, + "current" : "an mhí seo" + }, + "quarter" : { + "next" : "an ráithe seo chugainn", + "future" : "+{0} R", + "past" : "-{0} R", + "previous" : "an ráithe seo caite", + "current" : "an ráithe seo" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/gd.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/gd.json new file mode 100644 index 0000000..4db3619 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/gd.json @@ -0,0 +1,305 @@ +{ + "narrow" : { + "week" : { + "next" : "ath-shn.", + "previous" : "sn. ch.", + "current" : "an t-sn. seo", + "future" : "+{0} sn.", + "past" : "-{0} sn." + }, + "quarter" : { + "future" : "+{0} c.", + "previous" : "c. ch.", + "current" : "an c. seo", + "next" : "ath-ch.", + "past" : "-{0} c." + }, + "minute" : { + "past" : "-{0} m", + "current" : "sa mhion.", + "future" : "+{0} m" + }, + "year" : { + "previous" : "an-uir.", + "current" : "am bl.", + "past" : { + "two" : "-{0} bhl.", + "other" : "-{0} bl.", + "one" : "-{0} bhl." + }, + "next" : "an ath-bhl.", + "future" : { + "two" : "+{0} bhl.", + "one" : "+{0} bhl.", + "other" : "+{0} bl." + } + }, + "second" : { + "future" : "+{0} d", + "past" : "-{0} d", + "current" : "an-dràsta" + }, + "month" : { + "future" : { + "two" : "+{0} mhì.", + "other" : "+{0} mì.", + "one" : "+{0} mhì." + }, + "current" : "am mì. seo", + "past" : { + "two" : "-{0} mhì.", + "one" : "-{0} mhì.", + "other" : "-{0} mì." + }, + "previous" : "mì. ch.", + "next" : "ath-mhì." + }, + "now" : "an-dràsta", + "hour" : { + "future" : "+{0} u.", + "current" : "san uair", + "past" : "-{0} u." + }, + "day" : { + "current" : "an-diugh", + "previous" : "an-dè", + "next" : "a-màireach", + "past" : "-{0} là", + "future" : "+{0} là" + } + }, + "long" : { + "hour" : { + "future" : { + "few" : "an ceann {0} uairean a thìde", + "other" : "an ceann {0} uair a thìde" + }, + "current" : "am broinn uair a thìde", + "past" : { + "other" : "{0} uair a thìde air ais", + "few" : "{0} uairean a thìde air ais" + } + }, + "year" : { + "previous" : "an-uiridh", + "current" : "am bliadhna", + "next" : "an ath-bhliadhna", + "past" : { + "few" : "{0} bhliadhnaichean air ais", + "two" : "{0} bhliadhna air ais", + "other" : "{0} bliadhna air ais", + "one" : "{0} bhliadhna air ais" + }, + "future" : { + "one" : "an ceann {0} bhliadhna", + "few" : "an ceann {0} bliadhnaichean", + "other" : "an ceann {0} bliadhna", + "two" : "an ceann {0} bhliadhna" + } + }, + "day" : { + "previous" : "an-dè", + "current" : "an-diugh", + "next" : "a-màireach", + "future" : { + "other" : "an ceann {0} latha", + "few" : "an ceann {0} làithean" + }, + "past" : { + "few" : "{0} làithean air ais", + "other" : "{0} latha air ais" + } + }, + "minute" : { + "future" : { + "one" : "an ceann {0} mhionaid", + "two" : "an ceann {0} mhionaid", + "other" : "an ceann {0} mionaid", + "few" : "an ceann {0} mionaidean" + }, + "current" : "am broinn mionaid", + "past" : { + "two" : "{0} mhionaid air ais", + "one" : "{0} mhionaid air ais", + "few" : "{0} mionaidean air ais", + "other" : "{0} mionaid air ais" + } + }, + "second" : { + "future" : { + "few" : "an ceann {0} diogan", + "other" : "an ceann {0} diog", + "two" : "an ceann {0} dhiog" + }, + "current" : "an-dràsta", + "past" : { + "two" : "{0} dhiog air ais", + "few" : "{0} diogan air ais", + "other" : "{0} diog air ais" + } + }, + "now" : "an-dràsta", + "week" : { + "previous" : "an t-seachdain seo chaidh", + "next" : "an ath-sheachdain", + "future" : { + "two" : "an ceann {0} sheachdain", + "few" : "an ceann {0} seachdainean", + "other" : "an ceann {0} seachdain" + }, + "current" : "an t-seachdain seo", + "past" : { + "few" : "{0} seachdainean air ais", + "two" : "{0} sheachdain air ais", + "other" : "{0} seachdain air ais" + } + }, + "quarter" : { + "past" : { + "two" : "o chionn {0} chairteil", + "few" : "o chionn {0} cairtealan", + "other" : "o chionn {0} cairteil", + "one" : "o chionn {0} chairteil" + }, + "future" : { + "other" : "an ceann {0} cairteil", + "two" : "an ceann {0} chairteil", + "few" : "an ceann {0} cairtealan", + "one" : "an ceann {0} chairteil" + }, + "previous" : "an cairteal seo chaidh", + "current" : "an cairteal seo", + "next" : "an ath-chairteal" + }, + "month" : { + "past" : { + "two" : "{0} mhìos air ais", + "few" : "{0} mìosan air ais", + "one" : "{0} mhìos air ais", + "other" : "{0} mìos air ais" + }, + "previous" : "am mìos seo chaidh", + "future" : { + "one" : "an ceann {0} mhìosa", + "other" : "an ceann {0} mìosa", + "two" : "an ceann {0} mhìosa", + "few" : "an ceann {0} mìosan" + }, + "current" : "am mìos seo", + "next" : "an ath-mhìos" + } + }, + "short" : { + "hour" : { + "future" : { + "few" : "an {0} uair.", + "other" : "an {0} uair" + }, + "past" : { + "other" : "o {0} uair", + "few" : "o {0} uair." + }, + "current" : "am broinn uair" + }, + "quarter" : { + "current" : "an cairt. seo", + "future" : { + "one" : "an {0} chairt.", + "other" : "an {0} cairt.", + "two" : "an {0} chairt." + }, + "previous" : "an cairt. sa chaidh", + "next" : "an ath-chairt.", + "past" : { + "other" : "o {0} cairt.", + "one" : "o {0} chairt.", + "two" : "o {0} chairt." + } + }, + "week" : { + "next" : "an ath-sheachd.", + "current" : "an t-seachd. seo", + "previous" : "seachd. sa chaidh", + "past" : { + "two" : "o {0} sheachd.", + "other" : "o {0} seachd.", + "one" : "o {0} sheachd." + }, + "future" : { + "two" : "an {0} sheachd.", + "one" : "an {0} sheachd.", + "other" : "an {0} seachd." + } + }, + "year" : { + "current" : "am bliadhna", + "future" : { + "one" : "an {0} bhlia.", + "two" : "an {0} bhlia.", + "other" : "an {0} blia." + }, + "past" : { + "two" : "o {0} bhlia.", + "other" : "o {0} blia.", + "one" : "o {0} bhlia." + }, + "next" : "an ath-bhliadhna", + "previous" : "an-uiridh" + }, + "minute" : { + "current" : "am broinn mion.", + "future" : { + "two" : "an {0} mhion.", + "one" : "an {0} mhion.", + "other" : "an {0} mion." + }, + "past" : { + "one" : "o {0} mhion.", + "two" : "o {0} mhion.", + "other" : "o {0} mion." + } + }, + "now" : "an-dràsta", + "month" : { + "current" : "am mìos seo", + "past" : { + "two" : "o {0} mhìos.", + "one" : "o {0} mhìos.", + "other" : "o {0} mìos." + }, + "future" : { + "two" : "an {0} mhìos.", + "one" : "an {0} mhìos.", + "other" : "an {0} mìos." + }, + "next" : "an ath-mhìos", + "previous" : "am mìos sa chaidh" + }, + "day" : { + "future" : { + "other" : "an {0} là", + "few" : "an {0} là." + }, + "current" : "an-diugh", + "next" : "a-màireach", + "previous" : "an-dè", + "past" : { + "few" : "o {0} là.", + "other" : "o {0} là" + } + }, + "second" : { + "past" : { + "other" : "o {0} diog", + "two" : "o {0} dhiog", + "few" : "o {0} diog." + }, + "future" : { + "few" : "an {0} diog.", + "two" : "an {0} dhiog", + "other" : "an {0} diog" + }, + "current" : "an-dràsta" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/gl.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/gl.json new file mode 100644 index 0000000..ac500c7 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/gl.json @@ -0,0 +1,227 @@ +{ + "narrow" : { + "second" : { + "future" : "en {0} s", + "current" : "agora", + "past" : "hai {0} s" + }, + "year" : { + "next" : "seguinte ano", + "past" : "hai {0} a.", + "future" : "en {0} a.", + "previous" : "ano pasado", + "current" : "este ano" + }, + "month" : { + "past" : "hai {0} m.", + "next" : "m. seguinte", + "future" : "en {0} m.", + "previous" : "m. pasado", + "current" : "este m." + }, + "minute" : { + "past" : "hai {0} min", + "current" : "este minuto", + "future" : "en {0} min" + }, + "quarter" : { + "previous" : "trim. pasado", + "current" : "este trim.", + "next" : "trim. seguinte", + "past" : "hai {0} trim.", + "future" : "en {0} trim." + }, + "hour" : { + "future" : "en {0} h", + "past" : "hai {0} h", + "current" : "esta hora" + }, + "now" : "agora", + "week" : { + "next" : "sem. seguinte", + "previous" : "sem. pasada", + "past" : "hai {0} sem.", + "future" : "en {0} sem.", + "current" : "esta sem." + }, + "day" : { + "previous" : "onte", + "future" : "en {0} d.", + "past" : "hai {0} d.", + "current" : "hoxe", + "next" : "mañá" + } + }, + "short" : { + "minute" : { + "future" : "dentro de {0} min", + "past" : "hai {0} min", + "current" : "este minuto" + }, + "month" : { + "current" : "este m.", + "past" : { + "one" : "hai {0} mes", + "other" : "hai {0} mes." + }, + "future" : { + "one" : "dentro de {0} mes", + "other" : "dentro de {0} mes." + }, + "next" : "m. seguinte", + "previous" : "m. pasado" + }, + "week" : { + "future" : "dentro de {0} sem.", + "previous" : "sem. pasada", + "current" : "esta sem.", + "next" : "sem. seguinte", + "past" : "hai {0} sem." + }, + "hour" : { + "future" : "dentro de {0} h", + "current" : "esta hora", + "past" : "hai {0} h" + }, + "day" : { + "next" : "mañá", + "current" : "hoxe", + "previous" : "onte", + "past" : { + "one" : "hai {0} día", + "other" : "hai {0} días" + }, + "future" : { + "one" : "dentro de {0} día", + "other" : "dentro de {0} días" + } + }, + "second" : { + "past" : "hai {0} s", + "current" : "agora", + "future" : "dentro de {0} s" + }, + "now" : "agora", + "year" : { + "future" : { + "one" : "dentro de {0} ano", + "other" : "dentro de {0} anos" + }, + "previous" : "ano pasado", + "next" : "seguinte ano", + "current" : "este ano", + "past" : { + "other" : "hai {0} anos", + "one" : "hai {0} ano" + } + }, + "quarter" : { + "current" : "este trim.", + "future" : "dentro de {0} trim.", + "previous" : "trim. pasado", + "next" : "trim. seguinte", + "past" : "hai {0} trim." + } + }, + "long" : { + "day" : { + "previous" : "onte", + "past" : { + "other" : "hai {0} días", + "one" : "hai {0} día" + }, + "future" : { + "other" : "dentro de {0} días", + "one" : "dentro de {0} día" + }, + "next" : "mañá", + "current" : "hoxe" + }, + "hour" : { + "current" : "esta hora", + "future" : { + "one" : "dentro de {0} hora", + "other" : "dentro de {0} horas" + }, + "past" : { + "one" : "hai {0} hora", + "other" : "hai {0} horas" + } + }, + "month" : { + "next" : "o próximo mes", + "current" : "este mes", + "past" : { + "other" : "hai {0} meses", + "one" : "hai {0} mes" + }, + "previous" : "o mes pasado", + "future" : { + "one" : "dentro de {0} mes", + "other" : "dentro de {0} meses" + } + }, + "quarter" : { + "next" : "o próximo trimestre", + "past" : { + "one" : "hai {0} trimestre", + "other" : "hai {0} trimestres" + }, + "previous" : "o trimestre pasado", + "current" : "este trimestre", + "future" : { + "one" : "dentro de {0} trimestre", + "other" : "dentro de {0} trimestres" + } + }, + "year" : { + "next" : "o próximo ano", + "current" : "este ano", + "future" : { + "one" : "dentro de {0} ano", + "other" : "dentro de {0} anos" + }, + "previous" : "o ano pasado", + "past" : { + "one" : "hai {0} ano", + "other" : "hai {0} anos" + } + }, + "minute" : { + "past" : { + "one" : "hai {0} minuto", + "other" : "hai {0} minutos" + }, + "future" : { + "other" : "dentro de {0} minutos", + "one" : "dentro de {0} minuto" + }, + "current" : "este minuto" + }, + "second" : { + "future" : { + "other" : "dentro de {0} segundos", + "one" : "dentro de {0} segundo" + }, + "current" : "agora", + "past" : { + "one" : "hai {0} segundo", + "other" : "hai {0} segundos" + } + }, + "week" : { + "future" : { + "other" : "dentro de {0} semanas", + "one" : "dentro de {0} semana" + }, + "previous" : "a semana pasada", + "current" : "esta semana", + "next" : "a próxima semana", + "past" : { + "other" : "hai {0} semanas", + "one" : "hai {0} semana" + } + }, + "now" : "agora" + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/gu.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/gu.json new file mode 100644 index 0000000..17a7e5b --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/gu.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "day" : { + "next" : "આવતીકાલે", + "future" : "{0} દિવસમાં", + "previous" : "ગઈકાલે", + "current" : "આજે", + "past" : "{0} દિવસ પહેલાં" + }, + "quarter" : { + "next" : "પછીનું ત્રિમાસિક", + "past" : "{0} ત્રિમાસિક પહેલાં", + "future" : "{0} ત્રિમાસિકમાં", + "previous" : "છેલ્લું ત્રિમાસિક", + "current" : "આ ત્રિમાસિક" + }, + "hour" : { + "current" : "આ કલાક", + "past" : "{0} કલાક પહેલાં", + "future" : "{0} કલાકમાં" + }, + "year" : { + "next" : "આવતા વર્ષે", + "past" : "{0} વર્ષ પહેલાં", + "current" : "આ વર્ષે", + "previous" : "ગયા વર્ષે", + "future" : "{0} વર્ષમાં" + }, + "now" : "હમણાં", + "month" : { + "current" : "આ મહિને", + "future" : "{0} મહિનામાં", + "past" : "{0} મહિના પહેલાં", + "next" : "આવતા મહિને", + "previous" : "ગયા મહિને" + }, + "week" : { + "previous" : "ગયા અઠવાડિયે", + "current" : "આ અઠવાડિયે", + "past" : "{0} અઠ. પહેલાં", + "future" : "{0} અઠ. માં", + "next" : "આવતા અઠવાડિયે" + }, + "minute" : { + "current" : "આ મિનિટ", + "past" : "{0} મિનિટ પહેલાં", + "future" : "{0} મિનિટમાં" + }, + "second" : { + "current" : "હમણાં", + "past" : "{0} સેકંડ પહેલાં", + "future" : "{0} સેકંડમાં" + } + }, + "long" : { + "day" : { + "previous" : "ગઈકાલે", + "current" : "આજે", + "next" : "આવતીકાલે", + "past" : "{0} દિવસ પહેલાં", + "future" : "{0} દિવસમાં" + }, + "week" : { + "current" : "આ અઠવાડિયે", + "future" : "{0} અઠવાડિયામાં", + "past" : "{0} અઠવાડિયા પહેલાં", + "previous" : "ગયા અઠવાડિયે", + "next" : "આવતા અઠવાડિયે" + }, + "minute" : { + "current" : "આ મિનિટ", + "past" : "{0} મિનિટ પહેલાં", + "future" : "{0} મિનિટમાં" + }, + "month" : { + "future" : "{0} મહિનામાં", + "next" : "આવતા મહિને", + "previous" : "ગયા મહિને", + "current" : "આ મહિને", + "past" : "{0} મહિના પહેલાં" + }, + "hour" : { + "current" : "આ કલાક", + "past" : "{0} કલાક પહેલાં", + "future" : "{0} કલાકમાં" + }, + "year" : { + "past" : "{0} વર્ષ પહેલાં", + "future" : "{0} વર્ષમાં", + "previous" : "ગયા વર્ષે", + "next" : "આવતા વર્ષે", + "current" : "આ વર્ષે" + }, + "second" : { + "past" : "{0} સેકંડ પહેલાં", + "future" : "{0} સેકંડમાં", + "current" : "હમણાં" + }, + "now" : "હમણાં", + "quarter" : { + "past" : "{0} ત્રિમાસિક પહેલાં", + "current" : "આ ત્રિમાસિક", + "previous" : "છેલ્લું ત્રિમાસિક", + "future" : "{0} ત્રિમાસિકમાં", + "next" : "પછીનું ત્રિમાસિક" + } + }, + "short" : { + "quarter" : { + "future" : "{0} ત્રિમાસિકમાં", + "next" : "પછીનું ત્રિમાસિક", + "previous" : "છેલ્લું ત્રિમાસિક", + "current" : "આ ત્રિમાસિક", + "past" : "{0} ત્રિમાસિક પહેલાં" + }, + "minute" : { + "past" : "{0} મિનિટ પહેલાં", + "future" : "{0} મિનિટમાં", + "current" : "આ મિનિટ" + }, + "year" : { + "next" : "આવતા વર્ષે", + "future" : "{0} વર્ષમાં", + "current" : "આ વર્ષે", + "past" : "{0} વર્ષ પહેલાં", + "previous" : "ગયા વર્ષે" + }, + "second" : { + "past" : "{0} સેકંડ પહેલાં", + "current" : "હમણાં", + "future" : "{0} સેકંડમાં" + }, + "hour" : { + "past" : "{0} કલાક પહેલાં", + "current" : "આ કલાક", + "future" : "{0} કલાકમાં" + }, + "now" : "હમણાં", + "month" : { + "previous" : "ગયા મહિને", + "next" : "આવતા મહિને", + "past" : "{0} મહિના પહેલાં", + "current" : "આ મહિને", + "future" : "{0} મહિનામાં" + }, + "week" : { + "previous" : "ગયા અઠવાડિયે", + "current" : "આ અઠવાડિયે", + "next" : "આવતા અઠવાડિયે", + "past" : "{0} અઠ. પહેલાં", + "future" : "{0} અઠ. માં" + }, + "day" : { + "next" : "આવતીકાલે", + "past" : "{0} દિવસ પહેલાં", + "future" : "{0} દિવસમાં", + "previous" : "ગઈકાલે", + "current" : "આજે" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/he.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/he.json new file mode 100644 index 0000000..27e809d --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/he.json @@ -0,0 +1,358 @@ +{ + "long" : { + "second" : { + "past" : { + "one" : "לפני שנייה", + "two" : "לפני שתי שניות", + "other" : "לפני {0} שניות" + }, + "current" : "עכשיו", + "future" : { + "two" : "בעוד שתי שניות", + "other" : "בעוד {0} שניות", + "one" : "בעוד שנייה" + } + }, + "hour" : { + "current" : "בשעה זו", + "past" : { + "one" : "לפני שעה", + "two" : "לפני שעתיים", + "other" : "לפני {0} שעות" + }, + "future" : { + "one" : "בעוד שעה", + "two" : "בעוד שעתיים", + "other" : "בעוד {0} שעות" + } + }, + "quarter" : { + "next" : "הרבעון הבא", + "current" : "רבעון זה", + "future" : { + "one" : "ברבעון הבא", + "two" : "בעוד שני רבעונים", + "other" : "בעוד {0} רבעונים" + }, + "previous" : "הרבעון הקודם", + "past" : { + "one" : "ברבעון הקודם", + "two" : "לפני שני רבעונים", + "other" : "לפני {0} רבעונים" + } + }, + "year" : { + "future" : { + "one" : "בעוד שנה", + "many" : "בעוד {0} שנה", + "other" : "בעוד {0} שנים", + "two" : "בעוד שנתיים" + }, + "next" : "השנה הבאה", + "past" : { + "other" : "לפני {0} שנים", + "two" : "לפני שנתיים", + "many" : "לפני {0} שנה", + "one" : "לפני שנה" + }, + "previous" : "השנה שעברה", + "current" : "השנה" + }, + "day" : { + "future" : { + "other" : "בעוד {0} ימים", + "two" : "בעוד יומיים", + "one" : "בעוד יום {0}" + }, + "previous" : "אתמול", + "current" : "היום", + "next" : "מחר", + "past" : { + "other" : "לפני {0} ימים", + "one" : "לפני יום {0}", + "two" : "לפני יומיים" + } + }, + "minute" : { + "future" : { + "other" : "בעוד {0} דקות", + "two" : "בעוד שתי דקות", + "one" : "בעוד דקה" + }, + "past" : { + "two" : "לפני שתי דקות", + "one" : "לפני דקה", + "other" : "לפני {0} דקות" + }, + "current" : "בדקה זו" + }, + "month" : { + "next" : "החודש הבא", + "past" : { + "two" : "לפני חודשיים", + "other" : "לפני {0} חודשים", + "one" : "לפני חודש" + }, + "previous" : "החודש שעבר", + "current" : "החודש", + "future" : { + "two" : "בעוד חודשיים", + "one" : "בעוד חודש", + "other" : "בעוד {0} חודשים" + } + }, + "week" : { + "next" : "השבוע הבא", + "current" : "השבוע", + "past" : { + "two" : "לפני שבועיים", + "one" : "לפני שבוע", + "other" : "לפני {0} שבועות" + }, + "previous" : "השבוע שעבר", + "future" : { + "two" : "בעוד שבועיים", + "other" : "בעוד {0} שבועות", + "one" : "בעוד שבוע" + } + }, + "now" : "עכשיו" + }, + "short" : { + "week" : { + "previous" : "השבוע שעבר", + "next" : "השבוע הבא", + "current" : "השבוע", + "past" : { + "other" : "לפני {0} שב׳", + "two" : "לפני שבועיים", + "one" : "לפני שב׳" + }, + "future" : { + "other" : "בעוד {0} שב׳", + "one" : "בעוד שב׳", + "two" : "בעוד שבועיים" + } + }, + "month" : { + "next" : "החודש הבא", + "current" : "החודש", + "previous" : "החודש שעבר", + "future" : { + "two" : "בעוד חודשיים", + "one" : "בעוד חודש", + "other" : "בעוד {0} חודשים" + }, + "past" : { + "two" : "לפני חודשיים", + "one" : "לפני חודש", + "other" : "לפני {0} חודשים" + } + }, + "minute" : { + "current" : "בדקה זו", + "past" : { + "other" : "לפני {0} דק׳", + "one" : "לפני דקה" + }, + "future" : { + "two" : "בעוד שתי דק׳", + "other" : "בעוד {0} דק׳", + "one" : "בעוד דקה" + } + }, + "second" : { + "past" : { + "two" : "לפני שתי שנ׳", + "one" : "לפני שנ׳", + "other" : "לפני {0} שנ׳" + }, + "future" : { + "one" : "בעוד שנ׳", + "two" : "בעוד שתי שנ׳", + "other" : "בעוד {0} שנ׳" + }, + "current" : "עכשיו" + }, + "now" : "עכשיו", + "day" : { + "next" : "מחר", + "previous" : "אתמול", + "current" : "היום", + "past" : { + "other" : "לפני {0} ימים", + "one" : "אתמול", + "two" : "לפני יומיים" + }, + "future" : { + "one" : "מחר", + "two" : "בעוד יומיים", + "other" : "בעוד {0} ימים" + } + }, + "year" : { + "current" : "השנה", + "past" : { + "two" : "לפני שנתיים", + "other" : "לפני {0} שנים", + "one" : "לפני שנה", + "many" : "לפני {0} שנה" + }, + "previous" : "השנה שעברה", + "next" : "השנה הבאה", + "future" : { + "many" : "בעוד {0} שנה", + "one" : "בעוד שנה", + "two" : "בעוד שנתיים", + "other" : "בעוד {0} שנים" + } + }, + "quarter" : { + "future" : { + "one" : "ברבע׳ הבא", + "two" : "בעוד שני רבע׳", + "other" : "בעוד {0} רבע׳" + }, + "next" : "הרבעון הבא", + "current" : "רבעון זה", + "past" : { + "one" : "ברבע׳ הקודם", + "two" : "לפני שני רבע׳", + "other" : "לפני {0} רבע׳" + }, + "previous" : "הרבעון הקודם" + }, + "hour" : { + "current" : "בשעה זו", + "past" : { + "other" : "לפני {0} שע׳", + "two" : "לפני שעתיים", + "one" : "לפני שעה" + }, + "future" : { + "other" : "בעוד {0} שע׳", + "one" : "בעוד שעה", + "two" : "בעוד שעתיים" + } + } + }, + "narrow" : { + "year" : { + "current" : "השנה", + "past" : { + "one" : "לפני שנה", + "two" : "לפני שנתיים", + "other" : "לפני {0} שנים", + "many" : "לפני {0} שנה" + }, + "future" : { + "one" : "בעוד שנה", + "two" : "בעוד שנתיים", + "many" : "בעוד {0} שנה", + "other" : "בעוד {0} שנים" + }, + "next" : "השנה הבאה", + "previous" : "השנה שעברה" + }, + "minute" : { + "current" : "בדקה זו", + "future" : { + "other" : "בעוד {0} דק׳", + "two" : "בעוד שתי דק׳", + "one" : "בעוד דקה" + }, + "past" : { + "two" : "לפני שתי דק׳", + "other" : "לפני {0} דק׳", + "one" : "לפני דקה" + } + }, + "day" : { + "previous" : "אתמול", + "current" : "היום", + "next" : "מחר", + "past" : { + "two" : "לפני יומיים", + "other" : "לפני {0} ימים", + "one" : "אתמול" + }, + "future" : { + "two" : "בעוד יומיים", + "one" : "מחר", + "other" : "בעוד {0} ימים" + } + }, + "second" : { + "future" : { + "two" : "בעוד שתי שנ׳", + "one" : "בעוד שנ׳", + "other" : "בעוד {0} שנ׳" + }, + "past" : { + "one" : "לפני שנ׳", + "two" : "לפני שתי שנ׳", + "other" : "לפני {0} שנ׳" + }, + "current" : "עכשיו" + }, + "now" : "עכשיו", + "month" : { + "future" : { + "one" : "בעוד חו׳", + "other" : "בעוד {0} חו׳", + "two" : "בעוד חודשיים" + }, + "current" : "החודש", + "next" : "החודש הבא", + "previous" : "החודש שעבר", + "past" : { + "other" : "לפני {0} חו׳", + "one" : "לפני חו׳", + "two" : "לפני חודשיים" + } + }, + "week" : { + "past" : { + "two" : "לפני שבועיים", + "one" : "לפני שבוע", + "other" : "לפני {0} שב׳" + }, + "previous" : "השבוע שעבר", + "future" : { + "two" : "בעוד שבועיים", + "one" : "בעוד שב׳", + "other" : "בעוד {0} שב׳" + }, + "next" : "השבוע הבא", + "current" : "השבוע" + }, + "quarter" : { + "next" : "הרבעון הבא", + "current" : "רבעון זה", + "previous" : "הרבעון הקודם", + "past" : { + "two" : "לפני שני רבע׳", + "other" : "לפני {0} רבע׳", + "one" : "ברבע׳ הקודם" + }, + "future" : { + "one" : "ברבע׳ הבא", + "two" : "בעוד שני רבע׳", + "other" : "בעוד {0} רבע׳" + } + }, + "hour" : { + "past" : { + "one" : "לפני שעה", + "two" : "לפני שעתיים", + "other" : "לפני {0} שע׳" + }, + "future" : { + "one" : "בעוד שעה", + "other" : "בעוד {0} שע׳", + "two" : "בעוד שעתיים" + }, + "current" : "בשעה זו" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/hi.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/hi.json new file mode 100644 index 0000000..5d6566e --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/hi.json @@ -0,0 +1,170 @@ +{ + "long" : { + "year" : { + "future" : "{0} वर्ष में", + "past" : "{0} वर्ष पहले", + "next" : "अगला वर्ष", + "previous" : "पिछला वर्ष", + "current" : "इस वर्ष" + }, + "week" : { + "current" : "इस सप्ताह", + "next" : "अगला सप्ताह", + "future" : "{0} सप्ताह में", + "previous" : "पिछला सप्ताह", + "past" : "{0} सप्ताह पहले" + }, + "quarter" : { + "next" : "अगली तिमाही", + "past" : "{0} तिमाही पहले", + "current" : "इस तिमाही", + "future" : { + "other" : "{0} तिमाहियों में", + "one" : "{0} तिमाही में" + }, + "previous" : "अंतिम तिमाही" + }, + "minute" : { + "future" : "{0} मिनट में", + "past" : "{0} मिनट पहले", + "current" : "यह मिनट" + }, + "month" : { + "current" : "इस माह", + "next" : "अगला माह", + "previous" : "पिछला माह", + "future" : "{0} माह में", + "past" : "{0} माह पहले" + }, + "second" : { + "future" : "{0} सेकंड में", + "current" : "अब", + "past" : "{0} सेकंड पहले" + }, + "day" : { + "next" : "कल", + "past" : "{0} दिन पहले", + "previous" : "कल", + "current" : "आज", + "future" : "{0} दिन में" + }, + "now" : "अब", + "hour" : { + "future" : "{0} घंटे में", + "current" : "यह घंटा", + "past" : "{0} घंटे पहले" + } + }, + "narrow" : { + "now" : "अब", + "minute" : { + "future" : "{0} मि॰ में", + "current" : "यह मिनट", + "past" : "{0} मि॰ पहले" + }, + "year" : { + "previous" : "पिछला वर्ष", + "current" : "इस वर्ष", + "next" : "अगला वर्ष", + "past" : "{0} वर्ष पहले", + "future" : "{0} वर्ष में" + }, + "second" : { + "current" : "अब", + "future" : "{0} से॰ में", + "past" : "{0} से॰ पहले" + }, + "hour" : { + "past" : "{0} घं॰ पहले", + "future" : "{0} घं॰ में", + "current" : "यह घंटा" + }, + "month" : { + "current" : "इस माह", + "previous" : "पिछला माह", + "past" : "{0} माह पहले", + "next" : "अगला माह", + "future" : "{0} माह में" + }, + "quarter" : { + "previous" : "अंतिम तिमाही", + "current" : "इस तिमाही", + "past" : "{0} ति॰ पहले", + "future" : "{0} ति॰ में", + "next" : "अगली तिमाही" + }, + "week" : { + "future" : "{0} सप्ताह में", + "current" : "इस सप्ताह", + "past" : "{0} सप्ताह पहले", + "previous" : "पिछला सप्ताह", + "next" : "अगला सप्ताह" + }, + "day" : { + "current" : "आज", + "future" : "{0} दिन में", + "next" : "कल", + "past" : "{0} दिन पहले", + "previous" : "कल" + } + }, + "short" : { + "month" : { + "future" : "{0} माह में", + "previous" : "पिछला माह", + "next" : "अगला माह", + "past" : "{0} माह पहले", + "current" : "इस माह" + }, + "now" : "अब", + "day" : { + "next" : "कल", + "current" : "आज", + "previous" : "कल", + "past" : "{0} दिन पहले", + "future" : "{0} दिन में" + }, + "year" : { + "current" : "इस वर्ष", + "future" : "{0} वर्ष में", + "previous" : "पिछला वर्ष", + "next" : "अगला वर्ष", + "past" : "{0} वर्ष पहले" + }, + "hour" : { + "future" : "{0} घं॰ में", + "past" : "{0} घं॰ पहले", + "current" : "यह घंटा" + }, + "minute" : { + "current" : "यह मिनट", + "past" : "{0} मि॰ पहले", + "future" : "{0} मि॰ में" + }, + "second" : { + "past" : "{0} से॰ पहले", + "future" : "{0} से॰ में", + "current" : "अब" + }, + "quarter" : { + "current" : "इस तिमाही", + "next" : "अगली तिमाही", + "past" : { + "other" : "{0} तिमाहियों पहले", + "one" : "{0} तिमाही पहले" + }, + "future" : { + "other" : "{0} तिमाहियों में", + "one" : "{0} तिमाही में" + }, + "previous" : "अंतिम तिमाही" + }, + "week" : { + "next" : "अगला सप्ताह", + "past" : "{0} सप्ताह पहले", + "current" : "इस सप्ताह", + "previous" : "पिछला सप्ताह", + "future" : "{0} सप्ताह में" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/hr.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/hr.json new file mode 100644 index 0000000..b59263f --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/hr.json @@ -0,0 +1,227 @@ +{ + "narrow" : { + "year" : { + "future" : "za {0} g.", + "previous" : "prošle g.", + "current" : "ove g.", + "next" : "sljedeće g.", + "past" : "prije {0} g." + }, + "day" : { + "current" : "danas", + "past" : "prije {0} d", + "next" : "sutra", + "previous" : "jučer", + "future" : "za {0} d" + }, + "quarter" : { + "future" : "za {0} kv.", + "previous" : "prošli kv.", + "current" : "ovaj kv.", + "next" : "sljedeći kv.", + "past" : "prije {0} kv." + }, + "week" : { + "next" : "sljedeći tj.", + "past" : "prije {0} tj.", + "current" : "ovaj tj.", + "future" : "za {0} tj.", + "previous" : "prošli tj." + }, + "hour" : { + "current" : "ovaj sat", + "past" : "prije {0} h", + "future" : "za {0} h" + }, + "month" : { + "past" : "prije {0} mj.", + "previous" : "prošli mj.", + "current" : "ovaj mj.", + "future" : "za {0} mj.", + "next" : "sljedeći mj." + }, + "minute" : { + "current" : "ova minuta", + "past" : "prije {0} min", + "future" : "za {0} min" + }, + "second" : { + "past" : "prije {0} s", + "future" : "za {0} s", + "current" : "sad" + }, + "now" : "sad" + }, + "short" : { + "hour" : { + "current" : "ovaj sat", + "past" : "prije {0} h", + "future" : "za {0} h" + }, + "now" : "sad", + "quarter" : { + "current" : "ovaj kv.", + "future" : "za {0} kv.", + "past" : "prije {0} kv.", + "next" : "sljedeći kv.", + "previous" : "prošli kv." + }, + "day" : { + "current" : "danas", + "past" : { + "other" : "prije {0} dana", + "one" : "prije {0} dan" + }, + "future" : { + "other" : "za {0} dana", + "one" : "za {0} dan" + }, + "next" : "sutra", + "previous" : "jučer" + }, + "week" : { + "current" : "ovaj tj.", + "future" : "za {0} tj.", + "previous" : "prošli tj.", + "next" : "sljedeći tj.", + "past" : "prije {0} tj." + }, + "minute" : { + "future" : "za {0} min", + "past" : "prije {0} min", + "current" : "ova minuta" + }, + "second" : { + "future" : "za {0} s", + "current" : "sad", + "past" : "prije {0} s" + }, + "month" : { + "future" : "za {0} mj.", + "previous" : "prošli mj.", + "next" : "sljedeći mj.", + "current" : "ovaj mj.", + "past" : "prije {0} mj." + }, + "year" : { + "next" : "sljedeće god.", + "previous" : "prošle god.", + "current" : "ove god.", + "future" : "za {0} g.", + "past" : "prije {0} g." + } + }, + "long" : { + "second" : { + "future" : { + "few" : "za {0} sekunde", + "one" : "za {0} sekundu", + "other" : "za {0} sekundi" + }, + "current" : "sad", + "past" : { + "one" : "prije {0} sekundu", + "other" : "prije {0} sekundi", + "few" : "prije {0} sekunde" + } + }, + "year" : { + "previous" : "prošle godine", + "next" : "sljedeće godine", + "past" : { + "few" : "prije {0} godine", + "one" : "prije {0} godinu", + "other" : "prije {0} godina" + }, + "current" : "ove godine", + "future" : { + "other" : "za {0} godina", + "few" : "za {0} godine", + "one" : "za {0} godinu" + } + }, + "day" : { + "previous" : "jučer", + "future" : { + "one" : "za {0} dan", + "other" : "za {0} dana" + }, + "past" : { + "other" : "prije {0} dana", + "one" : "prije {0} dan" + }, + "current" : "danas", + "next" : "sutra" + }, + "now" : "sad", + "month" : { + "past" : { + "few" : "prije {0} mjeseca", + "one" : "prije {0} mjesec", + "other" : "prije {0} mjeseci" + }, + "next" : "sljedeći mjesec", + "previous" : "prošli mjesec", + "future" : { + "other" : "za {0} mjeseci", + "one" : "za {0} mjesec", + "few" : "za {0} mjeseca" + }, + "current" : "ovaj mjesec" + }, + "week" : { + "past" : { + "one" : "prije {0} tjedan", + "few" : "prije {0} tjedna", + "other" : "prije {0} tjedana" + }, + "future" : { + "one" : "za {0} tjedan", + "few" : "za {0} tjedna", + "other" : "za {0} tjedana" + }, + "current" : "ovaj tjedan", + "previous" : "prošli tjedan", + "next" : "sljedeći tjedan" + }, + "quarter" : { + "past" : { + "one" : "prije {0} kvartal", + "other" : "prije {0} kvartala" + }, + "current" : "ovaj kvartal", + "future" : { + "one" : "za {0} kvartal", + "other" : "za {0} kvartala" + }, + "previous" : "prošli kvartal", + "next" : "sljedeći kvartal" + }, + "hour" : { + "past" : { + "one" : "prije {0} sat", + "few" : "prije {0} sata", + "other" : "prije {0} sati" + }, + "future" : { + "other" : "za {0} sati", + "few" : "za {0} sata", + "one" : "za {0} sat" + }, + "current" : "ovaj sat" + }, + "minute" : { + "current" : "ova minuta", + "future" : { + "few" : "za {0} minute", + "other" : "za {0} minuta", + "one" : "za {0} minutu" + }, + "past" : { + "few" : "prije {0} minute", + "other" : "prije {0} minuta", + "one" : "prije {0} minutu" + } + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/hsb.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/hsb.json new file mode 100644 index 0000000..74914ad --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/hsb.json @@ -0,0 +1,237 @@ +{ + "narrow" : { + "week" : { + "next" : "přichodny tydźeń", + "past" : "před {0} tydź.", + "future" : "za {0} tydź.", + "previous" : "zašły tydźeń", + "current" : "tutón tydźeń" + }, + "quarter" : { + "next" : "next quarter", + "past" : "před {0} kw.", + "previous" : "last quarter", + "current" : "this quarter", + "future" : "za {0} kw." + }, + "minute" : { + "past" : "před {0} m", + "future" : "za {0} m", + "current" : "this minute" + }, + "day" : { + "previous" : "wčera", + "next" : "jutře", + "current" : "dźensa", + "future" : "za {0} d", + "past" : "před {0} d" + }, + "year" : { + "current" : "lětsa", + "previous" : "loni", + "next" : "klětu", + "past" : "před {0} l.", + "future" : "za {0} l." + }, + "second" : { + "future" : "za {0} s", + "current" : "now", + "past" : "před {0} s" + }, + "month" : { + "past" : "před {0} měs.", + "future" : "za {0} měs.", + "next" : "přichodny měsac", + "current" : "tutón měsac", + "previous" : "zašły měsac" + }, + "now" : "now", + "hour" : { + "future" : "za {0} h", + "current" : "this hour", + "past" : "před {0} h" + } + }, + "short" : { + "year" : { + "next" : "klětu", + "future" : "za {0} l.", + "current" : "lětsa", + "past" : "před {0} l.", + "previous" : "loni" + }, + "quarter" : { + "future" : "za {0} kwart.", + "next" : "next quarter", + "previous" : "last quarter", + "current" : "this quarter", + "past" : "před {0} kwart." + }, + "second" : { + "current" : "now", + "past" : "před {0} sek.", + "future" : "za {0} sek." + }, + "minute" : { + "past" : "před {0} min.", + "future" : "za {0} min.", + "current" : "this minute" + }, + "day" : { + "past" : "před {0} dnj.", + "next" : "jutře", + "future" : { + "one" : "za {0} dźeń", + "few" : "za {0} dny", + "other" : "za {0} dnj." + }, + "previous" : "wčera", + "current" : "dźensa" + }, + "month" : { + "previous" : "zašły měsac", + "next" : "přichodny měsac", + "past" : "před {0} měs.", + "current" : "tutón měsac", + "future" : "za {0} měs." + }, + "hour" : { + "current" : "this hour", + "past" : "před {0} hodź.", + "future" : "za {0} hodź." + }, + "now" : "now", + "week" : { + "previous" : "zašły tydźeń", + "current" : "tutón tydźeń", + "next" : "přichodny tydźeń", + "past" : "před {0} tydź.", + "future" : "za {0} tydź." + } + }, + "long" : { + "quarter" : { + "previous" : "last quarter", + "current" : "this quarter", + "next" : "next quarter", + "past" : { + "two" : "před {0} kwartalomaj", + "one" : "před {0} kwartalom", + "other" : "před {0} kwartalemi" + }, + "future" : { + "one" : "za {0} kwartal", + "few" : "za {0} kwartale", + "other" : "za {0} kwartalow", + "two" : "za {0} kwartalej" + } + }, + "hour" : { + "future" : { + "two" : "za {0} hodźinje", + "few" : "za {0} hodźiny", + "one" : "za {0} hodźinu", + "other" : "za {0} hodźin" + }, + "current" : "this hour", + "past" : { + "two" : "před {0} hodźinomaj", + "other" : "před {0} hodźinami", + "one" : "před {0} hodźinu" + } + }, + "day" : { + "previous" : "wčera", + "current" : "dźensa", + "next" : "jutře", + "past" : { + "one" : "před {0} dnjom", + "two" : "před {0} dnjomaj", + "other" : "před {0} dnjemi" + }, + "future" : { + "one" : "za {0} dźeń", + "two" : "za {0} dnjej", + "other" : "za {0} dnjow", + "few" : "za {0} dny" + } + }, + "month" : { + "next" : "přichodny měsac", + "previous" : "zašły měsac", + "current" : "tutón měsac", + "future" : { + "one" : "za {0} měsac", + "other" : "za {0} měsacow", + "two" : "za {0} měsacaj", + "few" : "za {0} měsacy" + }, + "past" : { + "one" : "před {0} měsacom", + "two" : "před {0} měsacomaj", + "other" : "před {0} měsacami" + } + }, + "second" : { + "future" : { + "other" : "za {0} sekundow", + "two" : "za {0} sekundźe", + "one" : "za {0} sekundu", + "few" : "za {0} sekundy" + }, + "current" : "now", + "past" : { + "other" : "před {0} sekundami", + "one" : "před {0} sekundu", + "two" : "před {0} sekundomaj" + } + }, + "now" : "now", + "week" : { + "current" : "tutón tydźeń", + "previous" : "zašły tydźeń", + "next" : "přichodny tydźeń", + "past" : { + "two" : "před {0} tydźenjomaj", + "one" : "před {0} tydźenjom", + "other" : "před {0} tydźenjemi" + }, + "future" : { + "two" : "za {0} tydźenjej", + "one" : "za {0} tydźeń", + "few" : "za {0} tydźenje", + "other" : "za {0} tydźenjow" + } + }, + "minute" : { + "past" : { + "other" : "před {0} minutami", + "one" : "před {0} minutu", + "two" : "před {0} minutomaj" + }, + "future" : { + "one" : "za {0} minutu", + "few" : "za {0} minuty", + "two" : "za {0} minuće", + "other" : "za {0} minutow" + }, + "current" : "this minute" + }, + "year" : { + "next" : "klětu", + "previous" : "loni", + "past" : { + "one" : "před {0} lětom", + "two" : "před {0} lětomaj", + "other" : "před {0} lětami" + }, + "current" : "lětsa", + "future" : { + "other" : "za {0} lět", + "two" : "za {0} lěće", + "few" : "za {0} lěta", + "one" : "za {0} lěto" + } + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/hu.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/hu.json new file mode 100644 index 0000000..2ee74c5 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/hu.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "day" : { + "next" : "holnap", + "future" : "{0} nap múlva", + "previous" : "tegnap", + "current" : "ma", + "past" : "{0} napja" + }, + "quarter" : { + "next" : "következő negyedév", + "past" : "{0} negyedévvel ezelőtt", + "future" : "{0} n.év múlva", + "previous" : "előző negyedév", + "current" : "ez a negyedév" + }, + "hour" : { + "future" : "{0} óra múlva", + "current" : "ebben az órában", + "past" : "{0} órával ezelőtt" + }, + "year" : { + "next" : "következő év", + "past" : "{0} évvel ezelőtt", + "current" : "ez az év", + "previous" : "előző év", + "future" : "{0} év múlva" + }, + "now" : "most", + "month" : { + "current" : "ez a hónap", + "future" : "{0} hónap múlva", + "past" : "{0} hónappal ezelőtt", + "next" : "következő hónap", + "previous" : "előző hónap" + }, + "week" : { + "previous" : "előző hét", + "current" : "ez a hét", + "past" : "{0} héttel ezelőtt", + "future" : "{0} hét múlva", + "next" : "következő hét" + }, + "minute" : { + "future" : "{0} perc múlva", + "current" : "ebben a percben", + "past" : "{0} perccel ezelőtt" + }, + "second" : { + "current" : "most", + "past" : "{0} másodperccel ezelőtt", + "future" : "{0} másodperc múlva" + } + }, + "long" : { + "day" : { + "previous" : "tegnap", + "current" : "ma", + "next" : "holnap", + "past" : "{0} nappal ezelőtt", + "future" : "{0} nap múlva" + }, + "week" : { + "current" : "ez a hét", + "future" : "{0} hét múlva", + "past" : "{0} héttel ezelőtt", + "previous" : "előző hét", + "next" : "következő hét" + }, + "minute" : { + "current" : "ebben a percben", + "past" : "{0} perccel ezelőtt", + "future" : "{0} perc múlva" + }, + "month" : { + "future" : "{0} hónap múlva", + "next" : "következő hónap", + "previous" : "előző hónap", + "current" : "ez a hónap", + "past" : "{0} hónappal ezelőtt" + }, + "hour" : { + "current" : "ebben az órában", + "past" : "{0} órával ezelőtt", + "future" : "{0} óra múlva" + }, + "year" : { + "past" : "{0} évvel ezelőtt", + "future" : "{0} év múlva", + "previous" : "előző év", + "next" : "következő év", + "current" : "ez az év" + }, + "second" : { + "past" : "{0} másodperccel ezelőtt", + "future" : "{0} másodperc múlva", + "current" : "most" + }, + "now" : "most", + "quarter" : { + "past" : "{0} negyedévvel ezelőtt", + "current" : "ez a negyedév", + "previous" : "előző negyedév", + "future" : "{0} negyedév múlva", + "next" : "következő negyedév" + } + }, + "short" : { + "quarter" : { + "future" : "{0} negyedév múlva", + "next" : "következő negyedév", + "previous" : "előző negyedév", + "current" : "ez a negyedév", + "past" : "{0} negyedévvel ezelőtt" + }, + "minute" : { + "future" : "{0} perc múlva", + "current" : "ebben a percben", + "past" : "{0} perccel ezelőtt" + }, + "year" : { + "next" : "következő év", + "future" : "{0} év múlva", + "current" : "ez az év", + "past" : "{0} évvel ezelőtt", + "previous" : "előző év" + }, + "second" : { + "future" : "{0} másodperc múlva", + "current" : "most", + "past" : "{0} másodperccel ezelőtt" + }, + "hour" : { + "past" : "{0} órával ezelőtt", + "current" : "ebben az órában", + "future" : "{0} óra múlva" + }, + "now" : "most", + "month" : { + "previous" : "előző hónap", + "next" : "következő hónap", + "past" : "{0} hónappal ezelőtt", + "current" : "ez a hónap", + "future" : "{0} hónap múlva" + }, + "week" : { + "previous" : "előző hét", + "current" : "ez a hét", + "next" : "következő hét", + "past" : "{0} héttel ezelőtt", + "future" : "{0} hét múlva" + }, + "day" : { + "next" : "holnap", + "past" : "{0} napja", + "future" : "{0} nap múlva", + "previous" : "tegnap", + "current" : "ma" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/hy.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/hy.json new file mode 100644 index 0000000..585bc2c --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/hy.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "day" : { + "next" : "վաղը", + "future" : "{0} օրից", + "previous" : "երեկ", + "current" : "այսօր", + "past" : "{0} օր առաջ" + }, + "quarter" : { + "next" : "հաջորդ եռամսյակ", + "past" : "{0} եռմս առաջ", + "future" : "{0} եռմս-ից", + "previous" : "նախորդ եռամսյակ", + "current" : "այս եռամսյակ" + }, + "hour" : { + "past" : "{0} ժ առաջ", + "current" : "այս ժամին", + "future" : "{0} ժ-ից" + }, + "year" : { + "next" : "հաջորդ տարի", + "past" : "{0} տ առաջ", + "current" : "այս տարի", + "previous" : "նախորդ տարի", + "future" : "{0} տարուց" + }, + "now" : "հիմա", + "month" : { + "current" : "այս ամիս", + "future" : "{0} ամսից", + "past" : "{0} ամիս առաջ", + "next" : "հաջորդ ամիս", + "previous" : "անցյալ ամիս" + }, + "week" : { + "previous" : "նախորդ շաբաթ", + "current" : "այս շաբաթ", + "past" : "{0} շաբ առաջ", + "future" : "{0} շաբ անց", + "next" : "հաջորդ շաբաթ" + }, + "minute" : { + "current" : "այս րոպեին", + "future" : "{0} ր-ից", + "past" : "{0} ր առաջ" + }, + "second" : { + "current" : "հիմա", + "past" : "{0} վ առաջ", + "future" : "{0} վ-ից" + } + }, + "long" : { + "day" : { + "previous" : "երեկ", + "current" : "այսօր", + "next" : "վաղը", + "past" : "{0} օր առաջ", + "future" : "{0} օրից" + }, + "week" : { + "current" : "այս շաբաթ", + "future" : "{0} շաբաթից", + "past" : "{0} շաբաթ առաջ", + "previous" : "նախորդ շաբաթ", + "next" : "հաջորդ շաբաթ" + }, + "minute" : { + "current" : "այս րոպեին", + "past" : "{0} րոպե առաջ", + "future" : "{0} րոպեից" + }, + "month" : { + "future" : "{0} ամսից", + "next" : "հաջորդ ամիս", + "previous" : "նախորդ ամիս", + "current" : "այս ամիս", + "past" : "{0} ամիս առաջ" + }, + "hour" : { + "past" : "{0} ժամ առաջ", + "current" : "այս ժամին", + "future" : "{0} ժամից" + }, + "year" : { + "past" : "{0} տարի առաջ", + "future" : "{0} տարուց", + "previous" : "նախորդ տարի", + "next" : "հաջորդ տարի", + "current" : "այս տարի" + }, + "second" : { + "future" : "{0} վայրկյանից", + "current" : "հիմա", + "past" : "{0} վայրկյան առաջ" + }, + "now" : "հիմա", + "quarter" : { + "past" : "{0} եռամսյակ առաջ", + "current" : "այս եռամսյակ", + "previous" : "նախորդ եռամսյակ", + "future" : "{0} եռամսյակից", + "next" : "հաջորդ եռամսյակ" + } + }, + "short" : { + "quarter" : { + "future" : "{0} եռմս-ից", + "next" : "հաջորդ եռամսյակ", + "previous" : "նախորդ եռամսյակ", + "current" : "այս եռամսյակ", + "past" : "{0} եռմս առաջ" + }, + "minute" : { + "past" : "{0} ր առաջ", + "current" : "այս րոպեին", + "future" : "{0} ր-ից" + }, + "year" : { + "next" : "հաջորդ տարի", + "future" : "{0} տարուց", + "current" : "այս տարի", + "past" : "{0} տ առաջ", + "previous" : "նախորդ տարի" + }, + "second" : { + "current" : "հիմա", + "past" : "{0} վրկ առաջ", + "future" : "{0} վրկ-ից" + }, + "hour" : { + "current" : "այս ժամին", + "past" : "{0} ժ առաջ", + "future" : "{0} ժ-ից" + }, + "now" : "հիմա", + "month" : { + "previous" : "անցյալ ամիս", + "next" : "հաջորդ ամիս", + "past" : "{0} ամիս առաջ", + "current" : "այս ամիս", + "future" : "{0} ամսից" + }, + "week" : { + "previous" : "նախորդ շաբաթ", + "current" : "այս շաբաթ", + "next" : "հաջորդ շաբաթ", + "past" : "{0} շաբ առաջ", + "future" : "{0} շաբ-ից" + }, + "day" : { + "next" : "վաղը", + "past" : "{0} օր առաջ", + "future" : "{0} օրից", + "previous" : "երեկ", + "current" : "այսօր" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/id.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/id.json new file mode 100644 index 0000000..360765f --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/id.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "day" : { + "next" : "besok", + "future" : "dalam {0} h", + "previous" : "kemarin", + "current" : "hari ini", + "past" : "{0} h lalu" + }, + "quarter" : { + "next" : "kuartal berikutnya", + "past" : "{0} krtl. lalu", + "future" : "dlm {0} krtl.", + "previous" : "Kuartal lalu", + "current" : "kuartal ini" + }, + "hour" : { + "future" : "dalam {0} jam", + "current" : "jam ini", + "past" : "{0} jam lalu" + }, + "year" : { + "next" : "tahun depan", + "past" : "{0} thn lalu", + "current" : "tahun ini", + "previous" : "tahun lalu", + "future" : "dlm {0} thn" + }, + "now" : "sekarang", + "month" : { + "current" : "bulan ini", + "future" : "dlm {0} bln", + "past" : "{0} bln lalu", + "next" : "bulan berikutnya", + "previous" : "bulan lalu" + }, + "week" : { + "previous" : "minggu lalu", + "current" : "minggu ini", + "past" : "{0} mgg lalu", + "future" : "dlm {0} mgg", + "next" : "minggu depan" + }, + "minute" : { + "future" : "dlm {0} mnt", + "current" : "menit ini", + "past" : "{0} mnt lalu" + }, + "second" : { + "current" : "sekarang", + "future" : "dlm {0} dtk", + "past" : "{0} dtk lalu" + } + }, + "long" : { + "day" : { + "previous" : "kemarin", + "current" : "hari ini", + "next" : "besok", + "past" : "{0} hari yang lalu", + "future" : "dalam {0} hari" + }, + "week" : { + "current" : "minggu ini", + "future" : "dalam {0} minggu", + "past" : "{0} minggu yang lalu", + "previous" : "minggu lalu", + "next" : "minggu depan" + }, + "minute" : { + "past" : "{0} menit yang lalu", + "current" : "menit ini", + "future" : "dalam {0} menit" + }, + "month" : { + "future" : "dalam {0} bulan", + "next" : "bulan berikutnya", + "previous" : "bulan lalu", + "current" : "bulan ini", + "past" : "{0} bulan yang lalu" + }, + "hour" : { + "past" : "{0} jam yang lalu", + "future" : "dalam {0} jam", + "current" : "jam ini" + }, + "year" : { + "past" : "{0} tahun yang lalu", + "future" : "dalam {0} tahun", + "previous" : "tahun lalu", + "next" : "tahun depan", + "current" : "tahun ini" + }, + "second" : { + "past" : "{0} detik yang lalu", + "current" : "sekarang", + "future" : "dalam {0} detik" + }, + "now" : "sekarang", + "quarter" : { + "past" : "{0} kuartal yang lalu", + "current" : "kuartal ini", + "previous" : "Kuartal lalu", + "future" : "dalam {0} kuartal", + "next" : "kuartal berikutnya" + } + }, + "short" : { + "quarter" : { + "future" : "dlm {0} krtl.", + "next" : "kuartal berikutnya", + "previous" : "Kuartal lalu", + "current" : "kuartal ini", + "past" : "{0} krtl. lalu" + }, + "minute" : { + "past" : "{0} mnt lalu", + "current" : "menit ini", + "future" : "dlm {0} mnt" + }, + "year" : { + "next" : "tahun depan", + "future" : "dlm {0} thn", + "current" : "tahun ini", + "past" : "{0} thn lalu", + "previous" : "tahun lalu" + }, + "second" : { + "current" : "sekarang", + "past" : "{0} dtk lalu", + "future" : "dlm {0} dtk" + }, + "hour" : { + "current" : "jam ini", + "past" : "{0} jam lalu", + "future" : "dalam {0} jam" + }, + "now" : "sekarang", + "month" : { + "previous" : "bulan lalu", + "next" : "bulan berikutnya", + "past" : "{0} bln lalu", + "current" : "bulan ini", + "future" : "dlm {0} bln" + }, + "week" : { + "previous" : "minggu lalu", + "current" : "minggu ini", + "next" : "minggu depan", + "past" : "{0} mgg lalu", + "future" : "dlm {0} mgg" + }, + "day" : { + "next" : "besok", + "past" : "{0} h lalu", + "future" : "dalam {0} h", + "previous" : "kemarin", + "current" : "hari ini" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/is.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/is.json new file mode 100644 index 0000000..9fd856b --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/is.json @@ -0,0 +1,230 @@ +{ + "short" : { + "now" : "núna", + "month" : { + "future" : "eftir {0} mán.", + "next" : "í næsta mán.", + "current" : "í þessum mán.", + "past" : "fyrir {0} mán.", + "previous" : "í síðasta mán." + }, + "second" : { + "past" : "fyrir {0} sek.", + "future" : "eftir {0} sek.", + "current" : "núna" + }, + "year" : { + "next" : "á næsta ári", + "current" : "á þessu ári", + "past" : { + "other" : "fyrir {0} árum", + "one" : "fyrir {0} ári" + }, + "previous" : "á síðasta ári", + "future" : "eftir {0} ár" + }, + "week" : { + "previous" : "í síðustu viku", + "current" : "í þessari viku", + "past" : { + "other" : "fyrir {0} vikum", + "one" : "fyrir {0} viku" + }, + "future" : "eftir {0} vikur", + "next" : "í næstu viku" + }, + "day" : { + "previous" : "í gær", + "current" : "í dag", + "past" : { + "one" : "fyrir {0} degi", + "other" : "fyrir {0} dögum" + }, + "next" : "á morgun", + "future" : { + "one" : "eftir {0} dag", + "other" : "eftir {0} daga" + } + }, + "hour" : { + "past" : "fyrir {0} klst.", + "future" : "eftir {0} klst.", + "current" : "þessa stundina" + }, + "quarter" : { + "next" : "næsti ársfj.", + "previous" : "síðasti ársfj.", + "past" : "fyrir {0} ársfj.", + "future" : "eftir {0} ársfj.", + "current" : "þessi ársfj." + }, + "minute" : { + "future" : "eftir {0} mín.", + "current" : "á þessari mínútu", + "past" : "fyrir {0} mín." + } + }, + "long" : { + "minute" : { + "past" : { + "one" : "fyrir {0} mínútu", + "other" : "fyrir {0} mínútum" + }, + "future" : { + "one" : "eftir {0} mínútu", + "other" : "eftir {0} mínútur" + }, + "current" : "á þessari mínútu" + }, + "year" : { + "future" : "eftir {0} ár", + "current" : "á þessu ári", + "previous" : "á síðasta ári", + "next" : "á næsta ári", + "past" : { + "one" : "fyrir {0} ári", + "other" : "fyrir {0} árum" + } + }, + "quarter" : { + "past" : { + "one" : "fyrir {0} ársfjórðungi", + "other" : "fyrir {0} ársfjórðungum" + }, + "next" : "næsti ársfjórðungur", + "previous" : "síðasti ársfjórðungur", + "future" : { + "one" : "eftir {0} ársfjórðung", + "other" : "eftir {0} ársfjórðunga" + }, + "current" : "þessi ársfjórðungur" + }, + "week" : { + "future" : { + "one" : "eftir {0} viku", + "other" : "eftir {0} vikur" + }, + "past" : { + "other" : "fyrir {0} vikum", + "one" : "fyrir {0} viku" + }, + "previous" : "í síðustu viku", + "current" : "í þessari viku", + "next" : "í næstu viku" + }, + "hour" : { + "past" : { + "one" : "fyrir {0} klukkustund", + "other" : "fyrir {0} klukkustundum" + }, + "future" : { + "other" : "eftir {0} klukkustundir", + "one" : "eftir {0} klukkustund" + }, + "current" : "þessa stundina" + }, + "month" : { + "previous" : "í síðasta mánuði", + "next" : "í næsta mánuði", + "future" : { + "one" : "eftir {0} mánuð", + "other" : "eftir {0} mánuði" + }, + "past" : { + "one" : "fyrir {0} mánuði", + "other" : "fyrir {0} mánuðum" + }, + "current" : "í þessum mánuði" + }, + "second" : { + "current" : "núna", + "past" : { + "one" : "fyrir {0} sekúndu", + "other" : "fyrir {0} sekúndum" + }, + "future" : { + "other" : "eftir {0} sekúndur", + "one" : "eftir {0} sekúndu" + } + }, + "now" : "núna", + "day" : { + "next" : "á morgun", + "future" : { + "other" : "eftir {0} daga", + "one" : "eftir {0} dag" + }, + "previous" : "í gær", + "current" : "í dag", + "past" : { + "one" : "fyrir {0} degi", + "other" : "fyrir {0} dögum" + } + } + }, + "narrow" : { + "day" : { + "previous" : "í gær", + "future" : { + "other" : "+{0} daga", + "one" : "+{0} dag" + }, + "past" : { + "one" : "-{0} degi", + "other" : "-{0} dögum" + }, + "current" : "í dag", + "next" : "á morgun" + }, + "week" : { + "past" : { + "other" : "-{0} vikur", + "one" : "-{0} viku" + }, + "future" : { + "one" : "+{0} viku", + "other" : "+{0} vikur" + }, + "current" : "í þessari viku", + "previous" : "í síðustu viku", + "next" : "í næstu viku" + }, + "quarter" : { + "previous" : "síðasti ársfj.", + "future" : "eftir {0} ársfj.", + "next" : "næsti ársfj.", + "past" : "fyrir {0} ársfj.", + "current" : "þessi ársfj." + }, + "month" : { + "future" : "eftir {0} mán.", + "current" : "í þessum mán.", + "previous" : "í síðasta mán.", + "past" : "fyrir {0} mán.", + "next" : "í næsta mán." + }, + "hour" : { + "past" : "-{0} klst.", + "future" : "+{0} klst.", + "current" : "þessa stundina" + }, + "year" : { + "past" : "fyrir {0} árum", + "previous" : "á síðasta ári", + "next" : "á næsta ári", + "future" : "eftir {0} ár", + "current" : "á þessu ári" + }, + "now" : "núna", + "minute" : { + "past" : "-{0} mín.", + "future" : "+{0} mín.", + "current" : "á þessari mínútu" + }, + "second" : { + "current" : "núna", + "past" : "-{0} sek.", + "future" : "+{0} sek." + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/it.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/it.json new file mode 100644 index 0000000..10116e0 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/it.json @@ -0,0 +1,251 @@ +{ + "long" : { + "day" : { + "current" : "oggi", + "next" : "domani", + "past" : { + "one" : "{0} giorno fa", + "other" : "{0} giorni fa" + }, + "future" : { + "one" : "tra {0} giorno", + "other" : "tra {0} giorni" + }, + "previous" : "ieri" + }, + "minute" : { + "future" : { + "one" : "tra {0} minuto", + "other" : "tra {0} minuti" + }, + "current" : "questo minuto", + "past" : { + "other" : "{0} minuti fa", + "one" : "{0} minuto fa" + } + }, + "second" : { + "future" : { + "one" : "tra {0} secondo", + "other" : "tra {0} secondi" + }, + "current" : "ora", + "past" : { + "one" : "{0} secondo fa", + "other" : "{0} secondi fa" + } + }, + "week" : { + "future" : { + "other" : "tra {0} settimane", + "one" : "tra {0} settimana" + }, + "previous" : "settimana scorsa", + "current" : "questa settimana", + "next" : "settimana prossima", + "past" : { + "one" : "{0} settimana fa", + "other" : "{0} settimane fa" + } + }, + "now" : "ora", + "month" : { + "past" : { + "other" : "{0} mesi fa", + "one" : "{0} mese fa" + }, + "current" : "questo mese", + "future" : { + "other" : "tra {0} mesi", + "one" : "tra {0} mese" + }, + "previous" : "mese scorso", + "next" : "mese prossimo" + }, + "quarter" : { + "future" : { + "other" : "tra {0} trimestri", + "one" : "tra {0} trimestre" + }, + "previous" : "trimestre scorso", + "next" : "trimestre prossimo", + "current" : "questo trimestre", + "past" : { + "other" : "{0} trimestri fa", + "one" : "{0} trimestre fa" + } + }, + "hour" : { + "past" : { + "other" : "{0} ore fa", + "one" : "{0} ora fa" + }, + "current" : "quest’ora", + "future" : { + "one" : "tra {0} ora", + "other" : "tra {0} ore" + } + }, + "year" : { + "current" : "quest’anno", + "next" : "anno prossimo", + "previous" : "anno scorso", + "future" : { + "one" : "tra {0} anno", + "other" : "tra {0} anni" + }, + "past" : { + "one" : "{0} anno fa", + "other" : "{0} anni fa" + } + } + }, + "narrow" : { + "second" : { + "future" : "tra {0} s", + "current" : "ora", + "past" : "{0}s fa" + }, + "month" : { + "past" : { + "other" : "{0} mesi fa", + "one" : "{0} mese fa" + }, + "future" : { + "one" : "tra {0} mese", + "other" : "tra {0} mesi" + }, + "next" : "mese prossimo", + "current" : "questo mese", + "previous" : "mese scorso" + }, + "quarter" : { + "current" : "questo trimestre", + "next" : "trimestre prossimo", + "past" : "{0} trim. fa", + "future" : "tra {0} trim.", + "previous" : "trimestre scorso" + }, + "now" : "ora", + "week" : { + "past" : "{0} sett. fa", + "current" : "questa settimana", + "next" : "settimana prossima", + "future" : "tra {0} sett.", + "previous" : "settimana scorsa" + }, + "year" : { + "previous" : "anno scorso", + "current" : "quest’anno", + "past" : { + "one" : "{0} anno fa", + "other" : "{0} anni fa" + }, + "future" : { + "one" : "tra {0} anno", + "other" : "tra {0} anni" + }, + "next" : "anno prossimo" + }, + "day" : { + "current" : "oggi", + "future" : { + "one" : "tra {0}g", + "other" : "tra {0} gg" + }, + "past" : { + "other" : "{0} gg fa", + "one" : "{0}g fa" + }, + "next" : "domani", + "previous" : "ieri" + }, + "hour" : { + "future" : "tra {0} h", + "current" : "quest’ora", + "past" : "{0}h fa" + }, + "minute" : { + "future" : "tra {0} min", + "current" : "questo minuto", + "past" : "{0} min fa" + } + }, + "short" : { + "month" : { + "next" : "mese prossimo", + "past" : { + "one" : "{0} mese fa", + "other" : "{0} mesi fa" + }, + "current" : "questo mese", + "previous" : "mese scorso", + "future" : { + "one" : "tra {0} mese", + "other" : "tra {0} mesi" + } + }, + "now" : "ora", + "day" : { + "next" : "domani", + "current" : "oggi", + "previous" : "ieri", + "past" : { + "other" : "{0}gg fa", + "one" : "{0}g fa" + }, + "future" : { + "one" : "tra {0} g", + "other" : "tra {0} gg" + } + }, + "year" : { + "previous" : "anno scorso", + "current" : "quest’anno", + "next" : "anno prossimo", + "past" : { + "other" : "{0} anni fa", + "one" : "{0} anno fa" + }, + "future" : { + "one" : "tra {0} anno", + "other" : "tra {0} anni" + } + }, + "hour" : { + "past" : "{0}h fa", + "future" : "tra {0}h", + "current" : "quest’ora" + }, + "minute" : { + "future" : "tra {0} min", + "current" : "questo minuto", + "past" : "{0} min fa" + }, + "second" : { + "past" : { + "one" : "{0}s fa", + "other" : "{0} sec. fa" + }, + "future" : { + "one" : "tra {0}s", + "other" : "tra {0} sec." + }, + "current" : "ora" + }, + "quarter" : { + "current" : "questo trimestre", + "future" : "tra {0} trim.", + "previous" : "trimestre scorso", + "next" : "trimestre prossimo", + "past" : "{0} trim. fa" + }, + "week" : { + "future" : "tra {0} sett.", + "previous" : "settimana scorsa", + "next" : "settimana prossima", + "past" : "{0} sett. fa", + "current" : "questa settimana" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ja.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ja.json new file mode 100644 index 0000000..2e673c0 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ja.json @@ -0,0 +1,161 @@ +{ + "long" : { + "hour" : { + "future" : "{0} 時間後", + "past" : "{0} 時間前", + "current" : "1 時間以内" + }, + "second" : { + "future" : "{0} 秒後", + "past" : "{0} 秒前", + "current" : "今" + }, + "week" : { + "next" : "翌週", + "current" : "今週", + "previous" : "先週", + "future" : "{0} 週間後", + "past" : "{0} 週間前" + }, + "minute" : { + "current" : "1 分以内", + "past" : "{0} 分前", + "future" : "{0} 分後" + }, + "year" : { + "current" : "今年", + "past" : "{0} 年前", + "future" : "{0} 年後", + "previous" : "昨年", + "next" : "翌年" + }, + "quarter" : { + "next" : "翌四半期", + "current" : "今四半期", + "future" : "{0} 四半期後", + "previous" : "前四半期", + "past" : "{0} 四半期前" + }, + "month" : { + "previous" : "先月", + "future" : "{0} か月後", + "current" : "今月", + "next" : "翌月", + "past" : "{0} か月前" + }, + "day" : { + "next" : "明日", + "past" : "{0} 日前", + "current" : "今日", + "future" : "{0} 日後", + "previous" : "昨日" + }, + "now" : "今" + }, + "narrow" : { + "week" : { + "current" : "今週", + "next" : "翌週", + "past" : "{0}週間前", + "previous" : "先週", + "future" : "{0}週間後" + }, + "minute" : { + "current" : "1 分以内", + "past" : "{0}分前", + "future" : "{0}分後" + }, + "month" : { + "current" : "今月", + "previous" : "先月", + "past" : "{0}か月前", + "next" : "翌月", + "future" : "{0}か月後" + }, + "now" : "今", + "year" : { + "current" : "今年", + "next" : "翌年", + "past" : "{0}年前", + "future" : "{0}年後", + "previous" : "昨年" + }, + "hour" : { + "future" : "{0}時間後", + "current" : "1 時間以内", + "past" : "{0}時間前" + }, + "quarter" : { + "previous" : "前四半期", + "current" : "今四半期", + "past" : "{0}四半期前", + "future" : "{0}四半期後", + "next" : "翌四半期" + }, + "second" : { + "past" : "{0}秒前", + "current" : "今", + "future" : "{0}秒後" + }, + "day" : { + "past" : "{0}日前", + "current" : "今日", + "future" : "{0}日後", + "previous" : "昨日", + "next" : "明日" + } + }, + "short" : { + "month" : { + "previous" : "先月", + "current" : "今月", + "next" : "翌月", + "past" : "{0} か月前", + "future" : "{0} か月後" + }, + "now" : "今", + "day" : { + "next" : "明日", + "current" : "今日", + "previous" : "昨日", + "past" : "{0} 日前", + "future" : "{0} 日後" + }, + "year" : { + "current" : "今年", + "future" : "{0} 年後", + "previous" : "昨年", + "next" : "翌年", + "past" : "{0} 年前" + }, + "hour" : { + "current" : "1 時間以内", + "past" : "{0} 時間前", + "future" : "{0} 時間後" + }, + "minute" : { + "past" : "{0} 分前", + "future" : "{0} 分後", + "current" : "1 分以内" + }, + "second" : { + "current" : "今", + "past" : "{0} 秒前", + "future" : "{0} 秒後" + }, + "quarter" : { + "future" : "{0} 四半期後", + "previous" : "前四半期", + "next" : "翌四半期", + "past" : "{0} 四半期前", + "current" : "今四半期" + }, + "week" : { + "next" : "翌週", + "past" : "{0} 週間前", + "current" : "今週", + "previous" : "先週", + "future" : "{0} 週間後" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/jgo.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/jgo.json new file mode 100644 index 0000000..26f333b --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/jgo.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "now" : "now", + "week" : { + "next" : "next week", + "current" : "this week", + "past" : "Ɛ́ gɛ́ mɔ {0} ŋgap-mbi", + "future" : "Nǔu ŋgap-mbi {0}", + "previous" : "last week" + }, + "quarter" : { + "previous" : "last quarter", + "next" : "next quarter", + "future" : "+{0} Q", + "current" : "this quarter", + "past" : "-{0} Q" + }, + "day" : { + "future" : "Nǔu lɛ́Ꞌ {0}", + "previous" : "yesterday", + "next" : "tomorrow", + "past" : "Ɛ́ gɛ́ mɔ́ lɛ́Ꞌ {0}", + "current" : "lɔꞋɔ" + }, + "hour" : { + "current" : "this hour", + "past" : "ɛ́ gɛ mɔ́ {0} háwa", + "future" : "nǔu háwa {0}" + }, + "second" : { + "future" : "+{0} s", + "current" : "now", + "past" : "-{0} s" + }, + "month" : { + "past" : "ɛ́ gɛ́ mɔ́ pɛsaŋ {0}", + "future" : "Nǔu {0} saŋ", + "current" : "this month", + "previous" : "last month", + "next" : "next month" + }, + "minute" : { + "future" : "nǔu {0} minút", + "current" : "this minute", + "past" : "ɛ́ gɛ́ mɔ́ minút {0}" + }, + "year" : { + "next" : "next year", + "future" : "Nǔu ŋguꞋ {0}", + "previous" : "last year", + "current" : "this year", + "past" : "Ɛ́gɛ́ mɔ́ ŋguꞋ {0}" + } + }, + "long" : { + "day" : { + "future" : "Nǔu lɛ́Ꞌ {0}", + "past" : "Ɛ́ gɛ́ mɔ́ lɛ́Ꞌ {0}", + "current" : "lɔꞋɔ", + "next" : "tomorrow", + "previous" : "yesterday" + }, + "second" : { + "past" : "-{0} s", + "current" : "now", + "future" : "+{0} s" + }, + "quarter" : { + "current" : "this quarter", + "next" : "next quarter", + "previous" : "last quarter", + "future" : "+{0} Q", + "past" : "-{0} Q" + }, + "month" : { + "future" : "Nǔu {0} saŋ", + "previous" : "last month", + "past" : "ɛ́ gɛ́ mɔ́ pɛsaŋ {0}", + "next" : "next month", + "current" : "this month" + }, + "week" : { + "future" : "Nǔu ŋgap-mbi {0}", + "past" : "Ɛ́ gɛ́ mɔ {0} ŋgap-mbi", + "current" : "this week", + "previous" : "last week", + "next" : "next week" + }, + "hour" : { + "future" : "nǔu háwa {0}", + "current" : "this hour", + "past" : "ɛ́ gɛ mɔ́ {0} háwa" + }, + "minute" : { + "future" : "nǔu {0} minút", + "past" : "ɛ́ gɛ́ mɔ́ minút {0}", + "current" : "this minute" + }, + "now" : "now", + "year" : { + "future" : "Nǔu ŋguꞋ {0}", + "next" : "next year", + "past" : "Ɛ́gɛ́ mɔ́ ŋguꞋ {0}", + "previous" : "last year", + "current" : "this year" + } + }, + "short" : { + "hour" : { + "future" : "nǔu háwa {0}", + "current" : "this hour", + "past" : "ɛ́ gɛ mɔ́ {0} háwa" + }, + "now" : "now", + "quarter" : { + "current" : "this quarter", + "future" : "+{0} Q", + "past" : "-{0} Q", + "next" : "next quarter", + "previous" : "last quarter" + }, + "day" : { + "current" : "lɔꞋɔ", + "past" : "Ɛ́ gɛ́ mɔ́ lɛ́Ꞌ {0}", + "future" : "Nǔu lɛ́Ꞌ {0}", + "next" : "tomorrow", + "previous" : "yesterday" + }, + "week" : { + "current" : "this week", + "past" : "Ɛ́ gɛ́ mɔ {0} ŋgap-mbi", + "future" : "Nǔu ŋgap-mbi {0}", + "next" : "next week", + "previous" : "last week" + }, + "minute" : { + "past" : "ɛ́ gɛ́ mɔ́ minút {0}", + "future" : "nǔu {0} minút", + "current" : "this minute" + }, + "second" : { + "past" : "-{0} s", + "current" : "now", + "future" : "+{0} s" + }, + "month" : { + "current" : "this month", + "future" : "Nǔu {0} saŋ", + "previous" : "last month", + "next" : "next month", + "past" : "ɛ́ gɛ́ mɔ́ pɛsaŋ {0}" + }, + "year" : { + "future" : "Nǔu ŋguꞋ {0}", + "previous" : "last year", + "next" : "next year", + "current" : "this year", + "past" : "Ɛ́gɛ́ mɔ́ ŋguꞋ {0}" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ka.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ka.json new file mode 100644 index 0000000..8537adb --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ka.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "quarter" : { + "current" : "ამ კვარტალში", + "past" : "{0} კვარტ. წინ", + "next" : "შემდეგ კვარტალში", + "future" : "{0} კვარტალში", + "previous" : "გასულ კვარტალში" + }, + "day" : { + "next" : "ხვალ", + "previous" : "გუშინ", + "future" : "{0} დღეში", + "past" : "{0} დღის წინ", + "current" : "დღეს" + }, + "year" : { + "past" : "{0} წლის წინ", + "previous" : "გასულ წელს", + "future" : "{0} წელში", + "next" : "მომავალ წელს", + "current" : "ამ წელს" + }, + "minute" : { + "current" : "ამ წუთში", + "past" : "{0} წთ წინ", + "future" : "{0} წუთში" + }, + "now" : "ახლა", + "week" : { + "current" : "ამ კვირაში", + "previous" : "გასულ კვირაში", + "past" : "{0} კვირის წინ", + "next" : "მომავალ კვირაში", + "future" : "{0} კვირაში" + }, + "second" : { + "current" : "ახლა", + "future" : "{0} წამში", + "past" : "{0} წმ წინ" + }, + "month" : { + "future" : "{0} თვეში", + "current" : "ამ თვეში", + "past" : "{0} თვის წინ", + "previous" : "გასულ თვეს", + "next" : "მომავალ თვეს" + }, + "hour" : { + "past" : "{0} სთ წინ", + "future" : "{0} საათში", + "current" : "ამ საათში" + } + }, + "long" : { + "year" : { + "next" : "მომავალ წელს", + "previous" : "გასულ წელს", + "past" : "{0} წლის წინ", + "future" : "{0} წელიწადში", + "current" : "ამ წელს" + }, + "now" : "ახლა", + "quarter" : { + "next" : "შემდეგ კვარტალში", + "past" : "{0} კვარტალის წინ", + "future" : "{0} კვარტალში", + "current" : "ამ კვარტალში", + "previous" : "გასულ კვარტალში" + }, + "month" : { + "past" : "{0} თვის წინ", + "next" : "მომავალ თვეს", + "previous" : "გასულ თვეს", + "future" : "{0} თვეში", + "current" : "ამ თვეში" + }, + "second" : { + "current" : "ახლა", + "future" : "{0} წამში", + "past" : "{0} წამის წინ" + }, + "week" : { + "past" : "{0} კვირის წინ", + "previous" : "გასულ კვირაში", + "future" : "{0} კვირაში", + "next" : "მომავალ კვირაში", + "current" : "ამ კვირაში" + }, + "day" : { + "next" : "ხვალ", + "future" : "{0} დღეში", + "previous" : "გუშინ", + "current" : "დღეს", + "past" : "{0} დღის წინ" + }, + "minute" : { + "current" : "ამ წუთში", + "future" : "{0} წუთში", + "past" : "{0} წუთის წინ" + }, + "hour" : { + "past" : "{0} საათის წინ", + "future" : "{0} საათში", + "current" : "ამ საათში" + } + }, + "short" : { + "minute" : { + "past" : "{0} წთ წინ", + "future" : "{0} წუთში", + "current" : "ამ წუთში" + }, + "week" : { + "future" : "{0} კვირაში", + "previous" : "გასულ კვირაში", + "next" : "მომავალ კვირაში", + "current" : "ამ კვირაში", + "past" : "{0} კვ. წინ" + }, + "year" : { + "current" : "ამ წელს", + "previous" : "გასულ წელს", + "future" : "{0} წელში", + "past" : "{0} წლის წინ", + "next" : "მომავალ წელს" + }, + "month" : { + "next" : "მომავალ თვეს", + "past" : "{0} თვის წინ", + "future" : "{0} თვეში", + "previous" : "გასულ თვეს", + "current" : "ამ თვეში" + }, + "quarter" : { + "next" : "შემდეგ კვარტალში", + "past" : "{0} კვარტ. წინ", + "previous" : "გასულ კვარტალში", + "current" : "ამ კვარტალში", + "future" : "{0} კვარტალში" + }, + "day" : { + "current" : "დღეს", + "previous" : "გუშინ", + "past" : "{0} დღის წინ", + "next" : "ხვალ", + "future" : "{0} დღეში" + }, + "hour" : { + "past" : "{0} სთ წინ", + "future" : "{0} საათში", + "current" : "ამ საათში" + }, + "second" : { + "past" : "{0} წმ წინ", + "future" : "{0} წამში", + "current" : "ახლა" + }, + "now" : "ახლა" + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/kea.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/kea.json new file mode 100644 index 0000000..d7504d4 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/kea.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "day" : { + "next" : "manha", + "future" : "di li {0} dia", + "previous" : "onti", + "current" : "oji", + "past" : "a ten {0} dia" + }, + "quarter" : { + "next" : "next quarter", + "past" : "a ten {0} trim.", + "future" : "di li {0} trim.", + "previous" : "last quarter", + "current" : "this quarter" + }, + "hour" : { + "current" : "this hour", + "past" : "a ten {0} ora", + "future" : "di li {0} ora" + }, + "year" : { + "next" : "prósimu anu", + "past" : "a ten {0} anu", + "current" : "es anu li", + "previous" : "anu pasadu", + "future" : "di li {0} anu" + }, + "now" : "now", + "month" : { + "current" : "es mes li", + "future" : "di li {0} mes", + "past" : "a ten {0} mes", + "next" : "prósimu mes", + "previous" : "mes pasadu" + }, + "week" : { + "previous" : "simana pasadu", + "current" : "es simana li", + "past" : "a ten {0} sim.", + "future" : "di li {0} sim.", + "next" : "prósimu simana" + }, + "minute" : { + "past" : "a ten {0} m", + "future" : "di li {0} m", + "current" : "this minute" + }, + "second" : { + "current" : "now", + "past" : "a ten {0} s", + "future" : "di li {0} s" + } + }, + "long" : { + "day" : { + "previous" : "onti", + "current" : "oji", + "next" : "manha", + "past" : "a ten {0} dia", + "future" : "di li {0} dia" + }, + "week" : { + "current" : "es simana li", + "future" : "di li {0} simana", + "past" : "a ten {0} simana", + "previous" : "simana pasadu", + "next" : "prósimu simana" + }, + "minute" : { + "current" : "this minute", + "past" : "a ten {0} minutu", + "future" : "di li {0} minutu" + }, + "month" : { + "future" : "di li {0} mes", + "next" : "prósimu mes", + "previous" : "mes pasadu", + "current" : "es mes li", + "past" : "a ten {0} mes" + }, + "hour" : { + "current" : "this hour", + "past" : "a ten {0} ora", + "future" : "di li {0} ora" + }, + "year" : { + "past" : "a ten {0} anu", + "future" : "di li {0} anu", + "previous" : "anu pasadu", + "next" : "prósimu anu", + "current" : "es anu li" + }, + "second" : { + "future" : "di li {0} sigundu", + "current" : "now", + "past" : "a ten {0} sigundu" + }, + "now" : "now", + "quarter" : { + "past" : "a ten {0} trimestri", + "current" : "this quarter", + "previous" : "last quarter", + "future" : "di li {0} trimestri", + "next" : "next quarter" + } + }, + "short" : { + "quarter" : { + "future" : "di li {0} trim.", + "next" : "next quarter", + "previous" : "last quarter", + "current" : "this quarter", + "past" : "a ten {0} trim." + }, + "minute" : { + "past" : "a ten {0} min", + "current" : "this minute", + "future" : "di li {0} min" + }, + "year" : { + "next" : "prósimu anu", + "future" : "di li {0} anu", + "current" : "es anu li", + "past" : "a ten {0} anu", + "previous" : "anu pasadu" + }, + "second" : { + "future" : "di li {0} sig", + "current" : "now", + "past" : "a ten {0} sig" + }, + "hour" : { + "future" : "di li {0} ora", + "current" : "this hour", + "past" : "a ten {0} ora" + }, + "now" : "now", + "month" : { + "previous" : "mes pasadu", + "next" : "prósimu mes", + "past" : "a ten {0} mes", + "current" : "es mes li", + "future" : "di li {0} mes" + }, + "week" : { + "previous" : "simana pasadu", + "current" : "es simana li", + "next" : "prósimu simana", + "past" : "a ten {0} sim.", + "future" : "di li {0} sim." + }, + "day" : { + "next" : "manha", + "past" : "a ten {0} dia", + "future" : "di li {0} dia", + "previous" : "onti", + "current" : "oji" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/kk.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/kk.json new file mode 100644 index 0000000..bce9c11 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/kk.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "day" : { + "next" : "ертең", + "future" : "{0} күннен кейін", + "previous" : "кеше", + "current" : "бүгін", + "past" : "{0} күн бұрын" + }, + "quarter" : { + "next" : "келесі тоқсан", + "past" : "{0} тқс. бұрын", + "future" : "{0} тқс. кейін", + "previous" : "өткен тоқсан", + "current" : "осы тоқсан" + }, + "hour" : { + "current" : "осы сағат", + "past" : "{0} сағ. бұрын", + "future" : "{0} сағ. кейін" + }, + "year" : { + "next" : "келесі жыл", + "past" : "{0} ж. бұрын", + "current" : "биылғы жыл", + "previous" : "былтырғы жыл", + "future" : "{0} ж. кейін" + }, + "now" : "қазір", + "month" : { + "current" : "осы ай", + "future" : "{0} айдан кейін", + "past" : "{0} ай бұрын", + "next" : "келесі ай", + "previous" : "өткен ай" + }, + "week" : { + "previous" : "өткен апта", + "current" : "осы апта", + "past" : "{0} ап. бұрын", + "future" : "{0} ап. кейін", + "next" : "келесі апта" + }, + "minute" : { + "past" : "{0} мин. бұрын", + "current" : "осы минут", + "future" : "{0} мин. кейін" + }, + "second" : { + "future" : "{0} сек. кейін", + "current" : "қазір", + "past" : "{0} сек. бұрын" + } + }, + "long" : { + "day" : { + "previous" : "кеше", + "current" : "бүгін", + "next" : "ертең", + "past" : "{0} күн бұрын", + "future" : "{0} күннен кейін" + }, + "week" : { + "current" : "осы апта", + "future" : "{0} аптадан кейін", + "past" : "{0} апта бұрын", + "previous" : "өткен апта", + "next" : "келесі апта" + }, + "minute" : { + "current" : "осы минут", + "past" : "{0} минут бұрын", + "future" : "{0} минуттан кейін" + }, + "month" : { + "future" : "{0} айдан кейін", + "next" : "келесі ай", + "previous" : "өткен ай", + "current" : "осы ай", + "past" : "{0} ай бұрын" + }, + "hour" : { + "current" : "осы сағат", + "past" : "{0} сағат бұрын", + "future" : "{0} сағаттан кейін" + }, + "year" : { + "past" : "{0} жыл бұрын", + "future" : "{0} жылдан кейін", + "previous" : "былтырғы жыл", + "next" : "келесі жыл", + "current" : "биылғы жыл" + }, + "second" : { + "current" : "қазір", + "past" : "{0} секунд бұрын", + "future" : "{0} секундтан кейін" + }, + "now" : "қазір", + "quarter" : { + "past" : "{0} тоқсан бұрын", + "current" : "осы тоқсан", + "previous" : "өткен тоқсан", + "future" : "{0} тоқсаннан кейін", + "next" : "келесі тоқсан" + } + }, + "short" : { + "quarter" : { + "future" : "{0} тқс. кейін", + "next" : "келесі тоқсан", + "previous" : "өткен тоқсан", + "current" : "осы тоқсан", + "past" : "{0} тқс. бұрын" + }, + "minute" : { + "past" : "{0} мин. бұрын", + "future" : "{0} мин. кейін", + "current" : "осы минут" + }, + "year" : { + "next" : "келесі жыл", + "future" : "{0} ж. кейін", + "current" : "биылғы жыл", + "past" : "{0} ж. бұрын", + "previous" : "былтырғы жыл" + }, + "second" : { + "current" : "қазір", + "past" : "{0} сек. бұрын", + "future" : "{0} сек. кейін" + }, + "hour" : { + "future" : "{0} сағ. кейін", + "current" : "осы сағат", + "past" : "{0} сағ. бұрын" + }, + "now" : "қазір", + "month" : { + "previous" : "өткен ай", + "next" : "келесі ай", + "past" : "{0} ай бұрын", + "current" : "осы ай", + "future" : "{0} айдан кейін" + }, + "week" : { + "previous" : "өткен апта", + "current" : "осы апта", + "next" : "келесі апта", + "past" : "{0} ап. бұрын", + "future" : "{0} ап. кейін" + }, + "day" : { + "next" : "ертең", + "past" : "{0} күн бұрын", + "future" : "{0} күннен кейін", + "previous" : "кеше", + "current" : "бүгін" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/kl.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/kl.json new file mode 100644 index 0000000..a519ecd --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/kl.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "quarter" : { + "past" : "-{0} Q", + "future" : "+{0} Q", + "current" : "this quarter", + "previous" : "last quarter", + "next" : "next quarter" + }, + "year" : { + "previous" : "last year", + "next" : "next year", + "future" : "om {0} ukioq", + "current" : "this year", + "past" : "for {0} ukioq siden" + }, + "week" : { + "future" : "om {0} sapaatip-akunnera", + "previous" : "last week", + "next" : "next week", + "past" : "for {0} sapaatip-akunnera siden", + "current" : "this week" + }, + "day" : { + "current" : "today", + "past" : "for {0} ulloq unnuarlu siden", + "next" : "tomorrow", + "future" : "om {0} ulloq unnuarlu", + "previous" : "yesterday" + }, + "hour" : { + "current" : "this hour", + "past" : "for {0} nalunaaquttap-akunnera siden", + "future" : "om {0} nalunaaquttap-akunnera" + }, + "minute" : { + "future" : "om {0} minutsi", + "current" : "this minute", + "past" : "for {0} minutsi siden" + }, + "month" : { + "next" : "next month", + "current" : "this month", + "past" : "for {0} qaammat siden", + "future" : "om {0} qaammat", + "previous" : "last month" + }, + "now" : "now", + "second" : { + "future" : "om {0} sekundi", + "current" : "now", + "past" : "for {0} sekundi siden" + } + }, + "short" : { + "minute" : { + "past" : "for {0} minutsi siden", + "future" : "om {0} minutsi", + "current" : "this minute" + }, + "week" : { + "current" : "this week", + "past" : "for {0} sapaatip-akunnera siden", + "future" : "om {0} sapaatip-akunnera", + "next" : "next week", + "previous" : "last week" + }, + "year" : { + "current" : "this year", + "future" : "om {0} ukioq", + "past" : "for {0} ukioq siden", + "next" : "next year", + "previous" : "last year" + }, + "day" : { + "next" : "tomorrow", + "current" : "today", + "previous" : "yesterday", + "past" : "for {0} ulloq unnuarlu siden", + "future" : "om {0} ulloq unnuarlu" + }, + "hour" : { + "future" : "om {0} nalunaaquttap-akunnera", + "current" : "this hour", + "past" : "for {0} nalunaaquttap-akunnera siden" + }, + "quarter" : { + "current" : "this quarter", + "future" : "+{0} Q", + "previous" : "last quarter", + "next" : "next quarter", + "past" : "-{0} Q" + }, + "second" : { + "past" : "for {0} sekundi siden", + "current" : "now", + "future" : "om {0} sekundi" + }, + "month" : { + "current" : "this month", + "past" : "for {0} qaammat siden", + "future" : "om {0} qaammat", + "next" : "next month", + "previous" : "last month" + }, + "now" : "now" + }, + "long" : { + "hour" : { + "future" : "om {0} nalunaaquttap-akunnera", + "current" : "this hour", + "past" : "for {0} nalunaaquttap-akunnera siden" + }, + "day" : { + "next" : "tomorrow", + "past" : "for {0} ulloq unnuarlu siden", + "previous" : "yesterday", + "future" : "om {0} ulloq unnuarlu", + "current" : "today" + }, + "second" : { + "past" : "for {0} sekundi siden", + "current" : "now", + "future" : "om {0} sekundi" + }, + "week" : { + "future" : "om {0} sapaatip-akunnera", + "past" : "for {0} sapaatip-akunnera siden", + "current" : "this week", + "next" : "next week", + "previous" : "last week" + }, + "minute" : { + "future" : "om {0} minutsi", + "past" : "for {0} minutsi siden", + "current" : "this minute" + }, + "month" : { + "future" : "om {0} qaammat", + "past" : "for {0} qaammat siden", + "current" : "this month", + "previous" : "last month", + "next" : "next month" + }, + "now" : "now", + "year" : { + "current" : "this year", + "next" : "next year", + "previous" : "last year", + "future" : "om {0} ukioq", + "past" : "for {0} ukioq siden" + }, + "quarter" : { + "future" : "+{0} Q", + "previous" : "last quarter", + "past" : "-{0} Q", + "next" : "next quarter", + "current" : "this quarter" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/km.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/km.json new file mode 100644 index 0000000..a790f0b --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/km.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "day" : { + "next" : "ថ្ងៃស្អែក", + "future" : "{0} ថ្ងៃទៀត", + "previous" : "ម្សិលមិញ", + "current" : "ថ្ងៃ​នេះ", + "past" : "{0} ថ្ងៃ​​មុន" + }, + "quarter" : { + "next" : "ត្រីមាស​ក្រោយ", + "past" : "{0} ត្រីមាស​មុន", + "future" : "{0} ត្រីមាសទៀត", + "previous" : "ត្រីមាស​មុន", + "current" : "ត្រីមាស​នេះ" + }, + "hour" : { + "current" : "ម៉ោងនេះ", + "future" : "{0} ម៉ោងទៀត", + "past" : "{0} ម៉ោង​មុន" + }, + "year" : { + "next" : "ឆ្នាំ​ក្រោយ", + "past" : "{0} ឆ្នាំ​មុន", + "current" : "ឆ្នាំ​នេះ", + "previous" : "ឆ្នាំ​មុន", + "future" : "{0} ឆ្នាំទៀត" + }, + "now" : "ឥឡូវ", + "month" : { + "current" : "ខែ​នេះ", + "future" : "{0} ខែទៀត", + "past" : "{0} ខែមុន", + "next" : "ខែ​ក្រោយ", + "previous" : "ខែ​មុន" + }, + "week" : { + "previous" : "សប្ដាហ៍​មុន", + "current" : "សប្ដាហ៍​នេះ", + "past" : "{0} សប្ដាហ៍​មុន", + "future" : "{0} សប្ដាហ៍ទៀត", + "next" : "សប្ដាហ៍​ក្រោយ" + }, + "minute" : { + "past" : "{0} នាទី​​មុន", + "future" : "{0} នាទីទៀត", + "current" : "នាទីនេះ" + }, + "second" : { + "current" : "ឥឡូវ", + "past" : "{0} វិនាទី​មុន", + "future" : "{0} វិនាទីទៀត" + } + }, + "long" : { + "day" : { + "previous" : "ម្សិលមិញ", + "current" : "ថ្ងៃ​នេះ", + "next" : "ថ្ងៃ​ស្អែក", + "past" : "{0} ថ្ងៃ​មុន", + "future" : "{0} ថ្ងៃទៀត" + }, + "week" : { + "current" : "សប្ដាហ៍​នេះ", + "future" : "{0} សប្ដាហ៍ទៀត", + "past" : "{0} សប្ដាហ៍​មុន", + "previous" : "សប្ដាហ៍​មុន", + "next" : "សប្ដាហ៍​ក្រោយ" + }, + "minute" : { + "past" : "{0} នាទី​មុន", + "future" : "{0} នាទីទៀត", + "current" : "នាទីនេះ" + }, + "month" : { + "future" : "{0} ខែទៀត", + "next" : "ខែ​ក្រោយ", + "previous" : "ខែ​មុន", + "current" : "ខែ​នេះ", + "past" : "{0} ខែមុន" + }, + "hour" : { + "future" : "ក្នុង​រយៈ​ពេល {0} ម៉ោង", + "current" : "ម៉ោងនេះ", + "past" : "{0} ម៉ោង​មុន" + }, + "year" : { + "past" : "{0} ឆ្នាំ​មុន", + "future" : "{0} ឆ្នាំទៀត", + "previous" : "ឆ្នាំ​មុន", + "next" : "ឆ្នាំ​ក្រោយ", + "current" : "ឆ្នាំ​នេះ" + }, + "second" : { + "future" : "{0} វិនាទីទៀត", + "current" : "ឥឡូវ", + "past" : "{0} វិនាទី​មុន" + }, + "now" : "ឥឡូវ", + "quarter" : { + "past" : "{0} ត្រីមាស​មុន", + "current" : "ត្រីមាស​នេះ", + "previous" : "ត្រីមាស​មុន", + "future" : "{0} ត្រីមាសទៀត", + "next" : "ត្រីមាស​ក្រោយ" + } + }, + "short" : { + "quarter" : { + "future" : "{0} ត្រីមាសទៀត", + "next" : "ត្រីមាស​ក្រោយ", + "previous" : "ត្រីមាស​មុន", + "current" : "ត្រីមាស​នេះ", + "past" : "{0} ត្រីមាស​មុន" + }, + "minute" : { + "current" : "នាទីនេះ", + "past" : "{0} នាទី​​មុន", + "future" : "{0} នាទីទៀត" + }, + "year" : { + "next" : "ឆ្នាំ​ក្រោយ", + "future" : "{0} ឆ្នាំទៀត", + "current" : "ឆ្នាំ​នេះ", + "past" : "{0} ឆ្នាំ​មុន", + "previous" : "ឆ្នាំ​មុន" + }, + "second" : { + "current" : "ឥឡូវ", + "past" : "{0} វិនាទី​មុន", + "future" : "{0} វិនាទីទៀត" + }, + "hour" : { + "past" : "{0} ម៉ោង​មុន", + "current" : "ម៉ោងនេះ", + "future" : "{0} ម៉ោងទៀត" + }, + "now" : "ឥឡូវ", + "month" : { + "previous" : "ខែ​មុន", + "next" : "ខែ​ក្រោយ", + "past" : "{0} ខែមុន", + "current" : "ខែ​នេះ", + "future" : "{0} ខែទៀត" + }, + "week" : { + "previous" : "សប្ដាហ៍​មុន", + "current" : "សប្ដាហ៍​នេះ", + "next" : "សប្ដាហ៍​ក្រោយ", + "past" : "{0} សប្ដាហ៍​មុន", + "future" : "{0} សប្ដាហ៍ទៀត" + }, + "day" : { + "next" : "ថ្ងៃស្អែក", + "past" : "{0} ថ្ងៃ​​មុន", + "future" : "{0} ថ្ងៃទៀត", + "previous" : "ម្សិលមិញ", + "current" : "ថ្ងៃ​នេះ" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/kn.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/kn.json new file mode 100644 index 0000000..f7ba414 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/kn.json @@ -0,0 +1,302 @@ +{ + "narrow" : { + "now" : "ಈಗ", + "minute" : { + "current" : "ಈ ನಿಮಿಷ", + "future" : { + "one" : "{0} ನಿಮಿಷದಲ್ಲಿ", + "other" : "{0} ನಿಮಿಷಗಳಲ್ಲಿ" + }, + "past" : { + "other" : "{0} ನಿಮಿಷಗಳ ಹಿಂದೆ", + "one" : "{0} ನಿಮಿಷದ ಹಿಂದೆ" + } + }, + "week" : { + "future" : { + "one" : "{0} ವಾರದಲ್ಲಿ", + "other" : "{0} ವಾರಗಳಲ್ಲಿ" + }, + "current" : "ಈ ವಾರ", + "previous" : "ಕಳೆದ ವಾರ", + "next" : "ಮುಂದಿನ ವಾರ", + "past" : { + "one" : "{0} ವಾರದ ಹಿಂದೆ", + "other" : "{0} ವಾರಗಳ ಹಿಂದೆ" + } + }, + "hour" : { + "current" : "ಈ ಗಂಟೆ", + "future" : { + "one" : "{0} ಗಂಟೆಯಲ್ಲಿ", + "other" : "{0} ಗಂಟೆಗಳಲ್ಲಿ" + }, + "past" : { + "other" : "{0} ಗಂಟೆಗಳ ಹಿಂದೆ", + "one" : "{0} ಗಂಟೆ ಹಿಂದೆ" + } + }, + "month" : { + "current" : "ಈ ತಿಂಗಳು", + "future" : { + "other" : "{0} ತಿಂಗಳುಗಳಲ್ಲಿ", + "one" : "{0} ತಿಂಗಳಲ್ಲಿ" + }, + "previous" : "ಕಳೆದ ತಿಂಗಳು", + "next" : "ಮುಂದಿನ ತಿಂಗಳು", + "past" : { + "one" : "{0} ತಿಂಗಳ ಹಿಂದೆ", + "other" : "{0} ತಿಂಗಳುಗಳ ಹಿಂದೆ" + } + }, + "second" : { + "future" : { + "one" : "{0} ಸೆಕೆಂಡ್‌ನಲ್ಲಿ", + "other" : "{0} ಸೆಕೆಂಡ್‌ಗಳಲ್ಲಿ" + }, + "past" : { + "other" : "{0} ಸೆಕೆಂಡುಗಳ ಹಿಂದೆ", + "one" : "{0} ಸೆಕೆಂಡ್ ಹಿಂದೆ" + }, + "current" : "ಈಗ" + }, + "year" : { + "past" : { + "one" : "{0} ವರ್ಷದ ಹಿಂದೆ", + "other" : "{0} ವರ್ಷಗಳ ಹಿಂದೆ" + }, + "future" : { + "other" : "{0} ವರ್ಷಗಳಲ್ಲಿ", + "one" : "{0} ವರ್ಷದಲ್ಲಿ" + }, + "current" : "ಈ ವರ್ಷ", + "next" : "ಮುಂದಿನ ವರ್ಷ", + "previous" : "ಕಳೆದ ವರ್ಷ" + }, + "day" : { + "next" : "ನಾಳೆ", + "future" : { + "one" : "{0} ದಿನದಲ್ಲಿ", + "other" : "{0} ದಿನಗಳಲ್ಲಿ" + }, + "past" : { + "one" : "{0} ದಿನದ ಹಿಂದೆ", + "other" : "{0} ದಿನಗಳ ಹಿಂದೆ" + }, + "current" : "ಇಂದು", + "previous" : "ನಿನ್ನೆ" + }, + "quarter" : { + "future" : "{0} ತ್ರೈಮಾಸಿಕಗಳಲ್ಲಿ", + "current" : "ಈ ತ್ರೈಮಾಸಿಕ", + "next" : "ಮುಂದಿನ ತ್ರೈಮಾಸಿಕ", + "past" : { + "one" : "{0} ತ್ರೈ.ಮಾ. ಹಿಂದೆ", + "other" : "{0} ತ್ರೈಮಾಸಿಕಗಳ ಹಿಂದೆ" + }, + "previous" : "ಕಳೆದ ತ್ರೈಮಾಸಿಕ" + } + }, + "long" : { + "second" : { + "past" : { + "one" : "{0} ಸೆಕೆಂಡ್ ಹಿಂದೆ", + "other" : "{0} ಸೆಕೆಂಡುಗಳ ಹಿಂದೆ" + }, + "future" : { + "one" : "{0} ಸೆಕೆಂಡ್‌ನಲ್ಲಿ", + "other" : "{0} ಸೆಕೆಂಡ್‌ಗಳಲ್ಲಿ" + }, + "current" : "ಈಗ" + }, + "year" : { + "future" : { + "other" : "{0} ವರ್ಷಗಳಲ್ಲಿ", + "one" : "{0} ವರ್ಷದಲ್ಲಿ" + }, + "past" : { + "one" : "{0} ವರ್ಷದ ಹಿಂದೆ", + "other" : "{0} ವರ್ಷಗಳ ಹಿಂದೆ" + }, + "next" : "ಮುಂದಿನ ವರ್ಷ", + "current" : "ಈ ವರ್ಷ", + "previous" : "ಹಿಂದಿನ ವರ್ಷ" + }, + "day" : { + "current" : "ಇಂದು", + "next" : "ನಾಳೆ", + "previous" : "ನಿನ್ನೆ", + "past" : { + "one" : "{0} ದಿನದ ಹಿಂದೆ", + "other" : "{0} ದಿನಗಳ ಹಿಂದೆ" + }, + "future" : { + "one" : "{0} ದಿನದಲ್ಲಿ", + "other" : "{0} ದಿನಗಳಲ್ಲಿ" + } + }, + "minute" : { + "past" : { + "one" : "{0} ನಿಮಿಷದ ಹಿಂದೆ", + "other" : "{0} ನಿಮಿಷಗಳ ಹಿಂದೆ" + }, + "future" : { + "one" : "{0} ನಿಮಿಷದಲ್ಲಿ", + "other" : "{0} ನಿಮಿಷಗಳಲ್ಲಿ" + }, + "current" : "ಈ ನಿಮಿಷ" + }, + "quarter" : { + "next" : "ಮುಂದಿನ ತ್ರೈಮಾಸಿಕ", + "previous" : "ಹಿಂದಿನ ತ್ರೈಮಾಸಿಕ", + "future" : { + "one" : "{0} ತ್ರೈಮಾಸಿಕದಲ್ಲಿ", + "other" : "{0} ತ್ರೈಮಾಸಿಕಗಳಲ್ಲಿ" + }, + "past" : { + "other" : "{0} ತ್ರೈಮಾಸಿಕಗಳ ಹಿಂದೆ", + "one" : "{0} ತ್ರೈಮಾಸಿಕದ ಹಿಂದೆ" + }, + "current" : "ಈ ತ್ರೈಮಾಸಿಕ" + }, + "month" : { + "current" : "ಈ ತಿಂಗಳು", + "next" : "ಮುಂದಿನ ತಿಂಗಳು", + "previous" : "ಕಳೆದ ತಿಂಗಳು", + "past" : { + "other" : "{0} ತಿಂಗಳುಗಳ ಹಿಂದೆ", + "one" : "{0} ತಿಂಗಳ ಹಿಂದೆ" + }, + "future" : { + "other" : "{0} ತಿಂಗಳುಗಳಲ್ಲಿ", + "one" : "{0} ತಿಂಗಳಲ್ಲಿ" + } + }, + "hour" : { + "current" : "ಈ ಗಂಟೆ", + "past" : { + "other" : "{0} ಗಂಟೆಗಳ ಹಿಂದೆ", + "one" : "{0} ಗಂಟೆ ಹಿಂದೆ" + }, + "future" : { + "one" : "{0} ಗಂಟೆಯಲ್ಲಿ", + "other" : "{0} ಗಂಟೆಗಳಲ್ಲಿ" + } + }, + "week" : { + "next" : "ಮುಂದಿನ ವಾರ", + "future" : { + "one" : "{0} ವಾರದಲ್ಲಿ", + "other" : "{0} ವಾರಗಳಲ್ಲಿ" + }, + "current" : "ಈ ವಾರ", + "previous" : "ಕಳೆದ ವಾರ", + "past" : { + "other" : "{0} ವಾರಗಳ ಹಿಂದೆ", + "one" : "{0} ವಾರದ ಹಿಂದೆ" + } + }, + "now" : "ಈಗ" + }, + "short" : { + "month" : { + "previous" : "ಕಳೆದ ತಿಂಗಳು", + "current" : "ಈ ತಿಂಗಳು", + "next" : "ಮುಂದಿನ ತಿಂಗಳು", + "past" : { + "one" : "{0} ತಿಂಗಳು ಹಿಂದೆ", + "other" : "{0} ತಿಂಗಳುಗಳ ಹಿಂದೆ" + }, + "future" : { + "other" : "{0} ತಿಂಗಳುಗಳಲ್ಲಿ", + "one" : "{0} ತಿಂಗಳಲ್ಲಿ" + } + }, + "hour" : { + "current" : "ಈ ಗಂಟೆ", + "past" : { + "other" : "{0} ಗಂಟೆಗಳ ಹಿಂದೆ", + "one" : "{0} ಗಂಟೆ ಹಿಂದೆ" + }, + "future" : { + "one" : "{0} ಗಂಟೆಯಲ್ಲಿ", + "other" : "{0} ಗಂಟೆಗಳಲ್ಲಿ" + } + }, + "now" : "ಈಗ", + "quarter" : { + "future" : { + "one" : "{0} ತ್ರೈ.ಮಾ.ದಲ್ಲಿ", + "other" : "{0} ತ್ರೈಮಾಸಿಕಗಳಲ್ಲಿ" + }, + "previous" : "ಕಳೆದ ತ್ರೈಮಾಸಿಕ", + "current" : "ಈ ತ್ರೈಮಾಸಿಕ", + "next" : "ಮುಂದಿನ ತ್ರೈಮಾಸಿಕ", + "past" : { + "one" : "{0} ತ್ರೈ.ಮಾ. ಹಿಂದೆ", + "other" : "{0} ತ್ರೈಮಾಸಿಕಗಳ ಹಿಂದೆ" + } + }, + "week" : { + "previous" : "ಕಳೆದ ವಾರ", + "next" : "ಮುಂದಿನ ವಾರ", + "future" : { + "one" : "{0} ವಾರದಲ್ಲಿ", + "other" : "{0} ವಾರಗಳಲ್ಲಿ" + }, + "current" : "ಈ ವಾರ", + "past" : { + "one" : "{0} ವಾರದ ಹಿಂದೆ", + "other" : "{0} ವಾರಗಳ ಹಿಂದೆ" + } + }, + "day" : { + "current" : "ಇಂದು", + "previous" : "ನಿನ್ನೆ", + "next" : "ನಾಳೆ", + "past" : { + "other" : "{0} ದಿನಗಳ ಹಿಂದೆ", + "one" : "{0} ದಿನದ ಹಿಂದೆ" + }, + "future" : { + "other" : "{0} ದಿನಗಳಲ್ಲಿ", + "one" : "{0} ದಿನದಲ್ಲಿ" + } + }, + "minute" : { + "future" : { + "other" : "{0} ನಿಮಿಷಗಳಲ್ಲಿ", + "one" : "{0} ನಿಮಿಷದಲ್ಲಿ" + }, + "past" : { + "other" : "{0} ನಿಮಿಷಗಳ ಹಿಂದೆ", + "one" : "{0} ನಿಮಿಷದ ಹಿಂದೆ" + }, + "current" : "ಈ ನಿಮಿಷ" + }, + "second" : { + "current" : "ಈಗ", + "past" : { + "one" : "{0} ಸೆಕೆಂಡ್ ಹಿಂದೆ", + "other" : "{0} ಸೆಕೆಂಡುಗಳ ಹಿಂದೆ" + }, + "future" : { + "one" : "{0} ಸೆಕೆಂಡ್‌ನಲ್ಲಿ", + "other" : "{0} ಸೆಕೆಂಡ್‌ಗಳಲ್ಲಿ" + } + }, + "year" : { + "previous" : "ಕಳೆದ ವರ್ಷ", + "next" : "ಮುಂದಿನ ವರ್ಷ", + "current" : "ಈ ವರ್ಷ", + "future" : { + "other" : "{0} ವರ್ಷಗಳಲ್ಲಿ", + "one" : "{0} ವರ್ಷದಲ್ಲಿ" + }, + "past" : { + "one" : "{0} ವರ್ಷದ ಹಿಂದೆ", + "other" : "{0} ವರ್ಷಗಳ ಹಿಂದೆ" + } + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ko.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ko.json new file mode 100644 index 0000000..bb4cd5c --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ko.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "now" : "지금", + "week" : { + "next" : "다음 주", + "current" : "이번 주", + "past" : "{0}주 전", + "future" : "{0}주 후", + "previous" : "지난주" + }, + "quarter" : { + "previous" : "지난 분기", + "next" : "다음 분기", + "future" : "{0}분기 후", + "current" : "이번 분기", + "past" : "{0}분기 전" + }, + "day" : { + "future" : "{0}일 후", + "previous" : "어제", + "next" : "내일", + "past" : "{0}일 전", + "current" : "오늘" + }, + "hour" : { + "current" : "현재 시간", + "past" : "{0}시간 전", + "future" : "{0}시간 후" + }, + "second" : { + "future" : "{0}초 후", + "current" : "지금", + "past" : "{0}초 전" + }, + "month" : { + "past" : "{0}개월 전", + "future" : "{0}개월 후", + "current" : "이번 달", + "previous" : "지난달", + "next" : "다음 달" + }, + "minute" : { + "future" : "{0}분 후", + "current" : "현재 분", + "past" : "{0}분 전" + }, + "year" : { + "next" : "내년", + "future" : "{0}년 후", + "previous" : "작년", + "current" : "올해", + "past" : "{0}년 전" + } + }, + "long" : { + "day" : { + "future" : "{0}일 후", + "past" : "{0}일 전", + "current" : "오늘", + "next" : "내일", + "previous" : "어제" + }, + "second" : { + "past" : "{0}초 전", + "current" : "지금", + "future" : "{0}초 후" + }, + "quarter" : { + "current" : "이번 분기", + "next" : "다음 분기", + "previous" : "지난 분기", + "future" : "{0}분기 후", + "past" : "{0}분기 전" + }, + "month" : { + "future" : "{0}개월 후", + "previous" : "지난달", + "past" : "{0}개월 전", + "next" : "다음 달", + "current" : "이번 달" + }, + "week" : { + "future" : "{0}주 후", + "past" : "{0}주 전", + "current" : "이번 주", + "previous" : "지난주", + "next" : "다음 주" + }, + "hour" : { + "future" : "{0}시간 후", + "current" : "현재 시간", + "past" : "{0}시간 전" + }, + "minute" : { + "future" : "{0}분 후", + "past" : "{0}분 전", + "current" : "현재 분" + }, + "now" : "지금", + "year" : { + "future" : "{0}년 후", + "next" : "내년", + "past" : "{0}년 전", + "previous" : "작년", + "current" : "올해" + } + }, + "short" : { + "hour" : { + "future" : "{0}시간 후", + "current" : "현재 시간", + "past" : "{0}시간 전" + }, + "now" : "지금", + "quarter" : { + "current" : "이번 분기", + "future" : "{0}분기 후", + "past" : "{0}분기 전", + "next" : "다음 분기", + "previous" : "지난 분기" + }, + "day" : { + "current" : "오늘", + "past" : "{0}일 전", + "future" : "{0}일 후", + "next" : "내일", + "previous" : "어제" + }, + "week" : { + "current" : "이번 주", + "past" : "{0}주 전", + "future" : "{0}주 후", + "next" : "다음 주", + "previous" : "지난주" + }, + "minute" : { + "past" : "{0}분 전", + "future" : "{0}분 후", + "current" : "현재 분" + }, + "second" : { + "past" : "{0}초 전", + "current" : "지금", + "future" : "{0}초 후" + }, + "month" : { + "current" : "이번 달", + "future" : "{0}개월 후", + "previous" : "지난달", + "next" : "다음 달", + "past" : "{0}개월 전" + }, + "year" : { + "future" : "{0}년 후", + "previous" : "작년", + "next" : "내년", + "current" : "올해", + "past" : "{0}년 전" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/kok.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/kok.json new file mode 100644 index 0000000..628f04a --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/kok.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "quarter" : { + "past" : "{0} त्रैमासीकां आदीं", + "future" : "{0} त्रैमासीकांत", + "current" : "हो त्रैमासीक", + "previous" : "फाटलो त्रैमासीक", + "next" : "फुडलो त्रैमासीक" + }, + "year" : { + "previous" : "फाटलें वर्स", + "next" : "फुडलें वर्स", + "future" : "{0} वर्सांनीं", + "current" : "हें वर्स", + "past" : "{0} वर्स आदीं" + }, + "week" : { + "future" : "{0} सप्तकांनीं", + "previous" : "निमाणो सप्तक", + "next" : "फुडलो सप्तक", + "past" : "{0} सप्त. आदीं", + "current" : "हो सप्तक" + }, + "day" : { + "current" : "आयज", + "past" : "{0} दीस आदीं", + "next" : "फाल्यां", + "future" : "{0} दिसानीं", + "previous" : "काल" + }, + "hour" : { + "current" : "हें वर", + "past" : "{0} वरा आदीं", + "future" : "{0} वरांनीं" + }, + "minute" : { + "future" : "{0} मिन्टां", + "current" : "हें मिनीट", + "past" : "{0} मिन्टां आदीं" + }, + "month" : { + "next" : "फुडलो म्हयनो", + "current" : "हो म्हयनो", + "past" : "{0} म्हयन्यां आदीं", + "future" : "{0} म्हयन्यानीं", + "previous" : "फाटलो म्हयनो" + }, + "now" : "आतां", + "second" : { + "future" : "{0} सेकंदानीं", + "current" : "आतां", + "past" : "{0} से. आदीं" + } + }, + "short" : { + "minute" : { + "past" : "{0} मिन्टां आदीं", + "future" : "{0} मिन्टां", + "current" : "हें मिनीट" + }, + "week" : { + "current" : "हो सप्तक", + "past" : "{0} सप्तकां आदीं", + "future" : "{0} सप्त.", + "next" : "फुडलो सप्तक", + "previous" : "निमाणो सप्तक" + }, + "year" : { + "future" : "{0} वर्सांनीं", + "previous" : "फाटलें वर्स", + "next" : "फुडलें वर्स", + "current" : "हें वर्स", + "past" : "{0} वर्स आदीं" + }, + "day" : { + "next" : "फाल्यां", + "current" : "आयज", + "previous" : "काल", + "past" : "{0} दीस आदीं", + "future" : "{0} दिसानीं" + }, + "hour" : { + "future" : "{0} वरांनीं", + "current" : "हें वर", + "past" : "{0} वरा आदीं" + }, + "quarter" : { + "current" : "हो त्रैमासीक", + "future" : "{0} त्रैमासीकांत", + "previous" : "फाटलो त्रैमासीक", + "next" : "फुडलो त्रैमासीक", + "past" : "{0} त्रैमासीकां आदीं" + }, + "second" : { + "past" : "{0} से. आदीं", + "current" : "आतां", + "future" : "{0} सेकंदानीं" + }, + "month" : { + "current" : "हो म्हयनो", + "past" : "{0} म्हयन्यां आदीं", + "future" : "{0} म्हयन्यानीं", + "next" : "फुडलो म्हयनो", + "previous" : "फाटलो म्हयनो" + }, + "now" : "आतां" + }, + "long" : { + "hour" : { + "future" : "{0} वरांनीं", + "current" : "हें वर", + "past" : "{0} वरा आदीं" + }, + "day" : { + "next" : "फाल्यां", + "past" : "{0} दीस आदीं", + "previous" : "काल", + "future" : "{0} दिसानीं", + "current" : "आयज" + }, + "second" : { + "past" : "{0} सेकंद आदीं", + "current" : "आतां", + "future" : "{0} सेकंदानीं" + }, + "week" : { + "future" : "{0} सप्तकांनीं", + "past" : "{0} सप्तकां आदीं", + "current" : "हो सप्तक", + "next" : "फुडलो सप्तक", + "previous" : "निमाणो सप्तक" + }, + "minute" : { + "future" : "{0} मिन्टां", + "past" : "{0} मिन्टां आदीं", + "current" : "हें मिनीट" + }, + "month" : { + "future" : "{0} म्हयन्यानीं", + "past" : "{0} म्हयन्यां आदीं", + "current" : "हो म्हयनो", + "previous" : "फाटलो म्हयनो", + "next" : "फुडलो म्हयनो" + }, + "now" : "आतां", + "year" : { + "current" : "हें वर्स", + "next" : "फुडलें वर्स", + "previous" : "फाटलें वर्स", + "future" : "{0} वर्सांनीं", + "past" : "{0} वर्सां आदीं" + }, + "quarter" : { + "future" : "{0} त्रैमासीकांत", + "previous" : "फाटलो त्रैमासीक", + "past" : "{0} त्रैमासीकां आदीं", + "next" : "फुडलो त्रैमासीक", + "current" : "हो त्रैमासीक" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ksh.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ksh.json new file mode 100644 index 0000000..1ff9a84 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ksh.json @@ -0,0 +1,185 @@ +{ + "narrow" : { + "second" : { + "future" : "+{0} s", + "past" : "-{0} s", + "current" : "now" + }, + "year" : { + "previous" : "läz Johr", + "next" : "näx Johr", + "future" : { + "zero" : "en keinem Johr", + "other" : "en {0} Johre", + "one" : "en {0} Johr" + }, + "current" : "diß Johr", + "past" : { + "other" : "vör {0} Johre", + "zero" : "vör keijnem Johr", + "one" : "vör {0} Johr" + } + }, + "month" : { + "past" : "-{0} m", + "next" : "nächste Mohnd", + "future" : "+{0} m", + "previous" : "lätzde Mohnd", + "current" : "diese Mohnd" + }, + "minute" : { + "past" : "-{0} min", + "current" : "this minute", + "future" : "+{0} min" + }, + "quarter" : { + "previous" : "last quarter", + "current" : "this quarter", + "next" : "next quarter", + "past" : "-{0} Q", + "future" : "+{0} Q" + }, + "hour" : { + "future" : "+{0} h", + "past" : "-{0} h", + "current" : "this hour" + }, + "now" : "now", + "week" : { + "next" : "nächste Woche", + "previous" : "läz Woch", + "past" : "-{0} w", + "future" : "+{0} w", + "current" : "di Woch" + }, + "day" : { + "previous" : "jestere", + "future" : "+{0} d", + "past" : "-{0} d", + "current" : "hück", + "next" : "morje" + } + }, + "short" : { + "minute" : { + "current" : "this minute", + "past" : "-{0} min", + "future" : "+{0} min" + }, + "week" : { + "current" : "di Woch", + "past" : "-{0} w", + "future" : "+{0} w", + "next" : "nächste Woche", + "previous" : "läz Woch" + }, + "year" : { + "future" : { + "one" : "en {0} Johr", + "zero" : "en keinem Johr", + "other" : "en {0} Johre" + }, + "previous" : "läz Johr", + "next" : "näx Johr", + "current" : "diß Johr", + "past" : { + "zero" : "vör keijnem Johr", + "other" : "vör {0} Johre", + "one" : "vör {0} Johr" + } + }, + "day" : { + "next" : "morje", + "current" : "hück", + "previous" : "jestere", + "past" : "-{0} d", + "future" : "+{0} d" + }, + "hour" : { + "past" : "-{0} h", + "current" : "this hour", + "future" : "+{0} h" + }, + "quarter" : { + "current" : "this quarter", + "future" : "+{0} Q", + "previous" : "last quarter", + "next" : "next quarter", + "past" : "-{0} Q" + }, + "second" : { + "future" : "+{0} s", + "current" : "now", + "past" : "-{0} s" + }, + "month" : { + "current" : "diese Mohnd", + "past" : "-{0} m", + "future" : "+{0} m", + "next" : "nächste Mohnd", + "previous" : "lätzde Mohnd" + }, + "now" : "now" + }, + "long" : { + "minute" : { + "past" : "-{0} min", + "future" : "+{0} min", + "current" : "this minute" + }, + "now" : "now", + "week" : { + "previous" : "läz Woch", + "past" : "-{0} w", + "future" : "+{0} w", + "current" : "di Woch", + "next" : "nächste Woche" + }, + "quarter" : { + "next" : "next quarter", + "past" : "-{0} Q", + "previous" : "last quarter", + "current" : "this quarter", + "future" : "+{0} Q" + }, + "hour" : { + "future" : "+{0} h", + "current" : "this hour", + "past" : "-{0} h" + }, + "day" : { + "current" : "hück", + "future" : "+{0} d", + "next" : "morje", + "previous" : "jestere", + "past" : "-{0} d" + }, + "month" : { + "next" : "nächste Mohnd", + "past" : "-{0} m", + "future" : "+{0} m", + "previous" : "lätzde Mohnd", + "current" : "diese Mohnd" + }, + "second" : { + "current" : "now", + "future" : "+{0} s", + "past" : "-{0} s" + }, + "year" : { + "next" : "näx Johr", + "current" : "diß Johr", + "future" : { + "other" : "en {0} Johre", + "zero" : "en keinem Johr", + "one" : "en {0} Johr" + }, + "previous" : "läz Johr", + "past" : { + "zero" : "vör keijnem Johr", + "other" : "vör {0} Johre", + "one" : "vör {0} Johr" + } + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ky.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ky.json new file mode 100644 index 0000000..924eed0 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ky.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "quarter" : { + "next" : "кийинки чейр.", + "past" : "{0} чейр. мурун", + "future" : "{0} чейр. кийин", + "previous" : "акыркы чейр.", + "current" : "бул чейр." + }, + "day" : { + "next" : "эртеӊ", + "future" : "{0} күн. кийин", + "previous" : "кечээ", + "current" : "бүгүн", + "past" : "{0} күн мурун" + }, + "year" : { + "next" : "эмдиги жылы", + "past" : "{0} жыл мурун", + "current" : "быйыл", + "previous" : "былтыр", + "future" : "{0} жыл. кийин" + }, + "week" : { + "previous" : "өткөн апт.", + "current" : "ушул апт.", + "past" : "{0} апт. мурун", + "future" : "{0} апт. кийин", + "next" : "келерки апт." + }, + "second" : { + "future" : "{0} сек. кийн", + "current" : "азыр", + "past" : "{0} сек. мурн" + }, + "minute" : { + "current" : "ушул мүнөттө", + "past" : "{0} мүн. мурн", + "future" : "{0} мүн. кийн" + }, + "hour" : { + "past" : "{0} с. мурн", + "future" : "{0} с. кийн", + "current" : "ушул саатта" + }, + "now" : "азыр", + "month" : { + "current" : "бул айда", + "future" : "{0} айд. кийн", + "past" : "{0} ай мурн", + "next" : "эмдиги айда", + "previous" : "өткөн айда" + } + }, + "long" : { + "now" : "азыр", + "minute" : { + "current" : "ушул мүнөттө", + "past" : "{0} мүнөт мурун", + "future" : "{0} мүнөттөн кийин" + }, + "quarter" : { + "future" : "{0} чейректен кийин", + "current" : "бул чейрек", + "next" : "кийинки чейрек", + "past" : "{0} чейрек мурун", + "previous" : "акыркы чейрек" + }, + "week" : { + "past" : "{0} апта мурун", + "future" : "{0} аптадан кийин", + "previous" : "өткөн аптада", + "next" : "келерки аптада", + "current" : "ушул аптада" + }, + "day" : { + "next" : "эртеӊ", + "previous" : "кечээ", + "future" : "{0} күндөн кийин", + "current" : "бүгүн", + "past" : "{0} күн мурун" + }, + "hour" : { + "future" : "{0} сааттан кийин", + "current" : "ушул саатта", + "past" : "{0} саат мурун" + }, + "month" : { + "current" : "бул айда", + "past" : "{0} ай мурун", + "previous" : "өткөн айда", + "future" : "{0} айдан кийин", + "next" : "эмдиги айда" + }, + "second" : { + "future" : "{0} секунддан кийин", + "current" : "азыр", + "past" : "{0} секунд мурун" + }, + "year" : { + "previous" : "былтыр", + "next" : "эмдиги жылы", + "past" : "{0} жыл мурун", + "current" : "быйыл", + "future" : "{0} жылдан кийин" + } + }, + "short" : { + "quarter" : { + "future" : "{0} чейректен кийин", + "next" : "кийинки чейр.", + "previous" : "акыркы чейр.", + "current" : "бул чейр.", + "past" : "{0} чейр. мурун" + }, + "minute" : { + "current" : "ушул мүнөттө", + "past" : "{0} мүн. мурун", + "future" : "{0} мүн. кийин" + }, + "year" : { + "next" : "эмдиги жылы", + "future" : "{0} жыл. кийин", + "current" : "быйыл", + "past" : "{0} жыл мурун", + "previous" : "былтыр" + }, + "second" : { + "future" : "{0} сек. кийин", + "current" : "азыр", + "past" : "{0} сек. мурун" + }, + "hour" : { + "current" : "ушул саатта", + "past" : "{0} саат. мурун", + "future" : "{0} саат. кийин" + }, + "now" : "азыр", + "month" : { + "previous" : "өткөн айда", + "next" : "эмдиги айда", + "past" : "{0} ай мурун", + "current" : "бул айда", + "future" : "{0} айд. кийин" + }, + "week" : { + "previous" : "өткөн апт.", + "current" : "ушул апт.", + "next" : "келерки апт.", + "past" : "{0} апт. мурун", + "future" : "{0} апт. кийин" + }, + "day" : { + "next" : "эртеӊ", + "past" : "{0} күн мурун", + "future" : "{0} күн. кийин", + "previous" : "кечээ", + "current" : "бүгүн" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/lb.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/lb.json new file mode 100644 index 0000000..b13897f --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/lb.json @@ -0,0 +1,257 @@ +{ + "narrow" : { + "month" : { + "past" : "-{0} M.", + "next" : "nächste Mount", + "previous" : "leschte Mount", + "current" : "dëse Mount", + "future" : "+{0} M." + }, + "second" : { + "current" : "now", + "past" : "-{0} Sek.", + "future" : "+{0} Sek." + }, + "day" : { + "current" : "haut", + "past" : "-{0} D.", + "previous" : "gëschter", + "next" : "muer", + "future" : "+{0} D." + }, + "now" : "now", + "quarter" : { + "previous" : "last quarter", + "next" : "next quarter", + "current" : "this quarter", + "future" : "+{0} Q.", + "past" : "-{0} Q." + }, + "week" : { + "current" : "dës Woch", + "future" : "+{0} W.", + "next" : "nächst Woch", + "past" : "-{0} W.", + "previous" : "lescht Woch" + }, + "minute" : { + "future" : "+{0} Min.", + "past" : "-{0} Min.", + "current" : "this minute" + }, + "hour" : { + "current" : "this hour", + "past" : "-{0} St.", + "future" : "+{0} St." + }, + "year" : { + "previous" : "lescht Joer", + "next" : "nächst Joer", + "current" : "dëst Joer", + "future" : "+{0} J.", + "past" : "-{0} J." + } + }, + "long" : { + "quarter" : { + "next" : "next quarter", + "current" : "this quarter", + "past" : { + "one" : "virun {0} Quartal", + "other" : "viru(n) {0} Quartaler" + }, + "previous" : "last quarter", + "future" : { + "other" : "a(n) {0} Quartaler", + "one" : "an {0} Quartal" + } + }, + "hour" : { + "future" : { + "one" : "an {0} Stonn", + "other" : "a(n) {0} Stonnen" + }, + "past" : { + "one" : "virun {0} Stonn", + "other" : "viru(n) {0} Stonnen" + }, + "current" : "this hour" + }, + "month" : { + "next" : "nächste Mount", + "previous" : "leschte Mount", + "current" : "dëse Mount", + "future" : { + "one" : "an {0} Mount", + "other" : "a(n) {0} Méint" + }, + "past" : { + "other" : "viru(n) {0} Méint", + "one" : "virun {0} Mount" + } + }, + "now" : "now", + "week" : { + "current" : "dës Woch", + "next" : "nächst Woch", + "past" : { + "one" : "virun {0} Woch", + "other" : "viru(n) {0} Wochen" + }, + "previous" : "lescht Woch", + "future" : { + "other" : "a(n) {0} Wochen", + "one" : "an {0} Woch" + } + }, + "minute" : { + "current" : "this minute", + "future" : { + "one" : "an {0} Minutt", + "other" : "a(n) {0} Minutten" + }, + "past" : { + "one" : "virun {0} Minutt", + "other" : "viru(n) {0} Minutten" + } + }, + "second" : { + "future" : { + "one" : "an {0} Sekonn", + "other" : "a(n) {0} Sekonnen" + }, + "current" : "now", + "past" : { + "other" : "viru(n) {0} Sekonnen", + "one" : "virun {0} Sekonn" + } + }, + "day" : { + "current" : "haut", + "future" : { + "one" : "an {0} Dag", + "other" : "a(n) {0} Deeg" + }, + "previous" : "gëschter", + "next" : "muer", + "past" : { + "other" : "viru(n) {0} Deeg", + "one" : "virun {0} Dag" + } + }, + "year" : { + "past" : { + "one" : "virun {0} Joer", + "other" : "viru(n) {0} Joer" + }, + "next" : "nächst Joer", + "previous" : "lescht Joer", + "current" : "dëst Joer", + "future" : { + "one" : "an {0} Joer", + "other" : "a(n) {0} Joer" + } + } + }, + "short" : { + "hour" : { + "current" : "this hour", + "past" : { + "other" : "viru(n) {0} St.", + "one" : "virun {0} St." + }, + "future" : { + "one" : "an {0} St.", + "other" : "a(n) {0} St." + } + }, + "second" : { + "future" : { + "one" : "an {0} Sek.", + "other" : "a(n) {0} Sek." + }, + "past" : { + "one" : "virun {0} Sek.", + "other" : "viru(n) {0} Sek." + }, + "current" : "now" + }, + "now" : "now", + "year" : { + "past" : { + "one" : "virun {0} J.", + "other" : "viru(n) {0} J." + }, + "future" : { + "one" : "an {0} J.", + "other" : "a(n) {0} J." + }, + "previous" : "lescht Joer", + "current" : "dëst Joer", + "next" : "nächst Joer" + }, + "quarter" : { + "previous" : "last quarter", + "future" : { + "other" : "a(n) {0} Q.", + "one" : "an {0} Q." + }, + "next" : "next quarter", + "past" : { + "other" : "viru(n) {0} Q.", + "one" : "virun {0} Q." + }, + "current" : "this quarter" + }, + "week" : { + "previous" : "lescht Woch", + "current" : "dës Woch", + "next" : "nächst Woch", + "past" : { + "one" : "virun {0} W.", + "other" : "viru(n) {0} W." + }, + "future" : { + "other" : "a(n) {0} W.", + "one" : "an {0} W." + } + }, + "day" : { + "next" : "muer", + "past" : { + "other" : "viru(n) {0} D.", + "one" : "virun {0} D." + }, + "previous" : "gëschter", + "future" : { + "one" : "an {0} D.", + "other" : "a(n) {0} D." + }, + "current" : "haut" + }, + "minute" : { + "past" : { + "other" : "viru(n) {0} Min.", + "one" : "virun {0} Min." + }, + "future" : { + "one" : "an {0} Min.", + "other" : "a(n) {0} Min." + }, + "current" : "this minute" + }, + "month" : { + "next" : "nächste Mount", + "past" : { + "one" : "virun {0} M.", + "other" : "viru(n) {0} M." + }, + "future" : { + "one" : "an {0} M.", + "other" : "a(n) {0} M." + }, + "previous" : "leschte Mount", + "current" : "dëse Mount" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/lkt.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/lkt.json new file mode 100644 index 0000000..8d668d6 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/lkt.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "year" : { + "future" : "Letáŋhaŋ ómakȟa {0} kiŋháŋ", + "previous" : "Ómakȟa kʼuŋ héhaŋ", + "next" : "Tȟokáta ómakȟa kiŋháŋ", + "current" : "Lé ómakȟa kiŋ", + "past" : "Hékta ómakȟa {0} kʼuŋ héhaŋ" + }, + "week" : { + "past" : "Hékta okó {0} kʼuŋ héhaŋ", + "previous" : "Okó kʼuŋ héhaŋ", + "future" : "Letáŋhaŋ okó {0} kiŋháŋ", + "current" : "Lé okó kiŋ", + "next" : "Tȟokáta okó kiŋháŋ" + }, + "hour" : { + "current" : "this hour", + "past" : "Hékta owápȟe {0} kʼuŋ héhaŋ", + "future" : "Letáŋhaŋ owápȟe {0} kiŋháŋ" + }, + "quarter" : { + "current" : "this quarter", + "previous" : "last quarter", + "future" : "+{0} Q", + "past" : "-{0} Q", + "next" : "next quarter" + }, + "second" : { + "past" : "Hékta okpí {0} k’uŋ héhaŋ", + "future" : "Letáŋhaŋ okpí {0} kiŋháŋ", + "current" : "now" + }, + "month" : { + "current" : "Lé wí kiŋ", + "future" : "Letáŋhaŋ wíyawapi {0} kiŋháŋ", + "past" : "Hékta wíyawapi {0} kʼuŋ héhaŋ", + "next" : "Tȟokáta wí kiŋháŋ", + "previous" : "Wí kʼuŋ héhaŋ" + }, + "day" : { + "previous" : "Ȟtálehaŋ", + "future" : "Letáŋhaŋ {0}-čháŋ kiŋháŋ", + "next" : "Híŋhaŋni kiŋháŋ", + "current" : "Lé aŋpétu kiŋ", + "past" : "Hékta {0}-čháŋ k’uŋ héhaŋ" + }, + "minute" : { + "future" : "Letáŋhaŋ oȟ’áŋkȟo {0} kiŋháŋ", + "current" : "this minute", + "past" : "Hékta oȟ’áŋkȟo {0} k’uŋ héhaŋ" + }, + "now" : "now" + }, + "long" : { + "quarter" : { + "next" : "next quarter", + "current" : "this quarter", + "previous" : "last quarter", + "past" : "-{0} Q", + "future" : "+{0} Q" + }, + "now" : "now", + "year" : { + "previous" : "Ómakȟa kʼuŋ héhaŋ", + "past" : "Hékta ómakȟa {0} kʼuŋ héhaŋ", + "future" : "Letáŋhaŋ ómakȟa {0} kiŋháŋ", + "next" : "Tȟokáta ómakȟa kiŋháŋ", + "current" : "Lé ómakȟa kiŋ" + }, + "month" : { + "previous" : "Wí kʼuŋ héhaŋ", + "current" : "Lé wí kiŋ", + "future" : "Letáŋhaŋ wíyawapi {0} kiŋháŋ", + "past" : "Hékta wíyawapi {0} kʼuŋ héhaŋ", + "next" : "Tȟokáta wí kiŋháŋ" + }, + "day" : { + "previous" : "Ȟtálehaŋ", + "future" : "Letáŋhaŋ {0}-čháŋ kiŋháŋ", + "next" : "Híŋhaŋni kiŋháŋ", + "past" : "Hékta {0}-čháŋ k’uŋ héhaŋ", + "current" : "Lé aŋpétu kiŋ" + }, + "second" : { + "past" : "Hékta okpí {0} k’uŋ héhaŋ", + "future" : "Letáŋhaŋ okpí {0} kiŋháŋ", + "current" : "now" + }, + "week" : { + "past" : "Hékta okó {0} kʼuŋ héhaŋ", + "current" : "Lé okó kiŋ", + "next" : "Tȟokáta okó kiŋháŋ", + "previous" : "Okó kʼuŋ héhaŋ", + "future" : "Letáŋhaŋ okó {0} kiŋháŋ" + }, + "hour" : { + "future" : "Letáŋhaŋ owápȟe {0} kiŋháŋ", + "current" : "this hour", + "past" : "Hékta owápȟe {0} kʼuŋ héhaŋ" + }, + "minute" : { + "future" : "Letáŋhaŋ oȟ’áŋkȟo {0} kiŋháŋ", + "current" : "this minute", + "past" : "Hékta oȟ’áŋkȟo {0} k’uŋ héhaŋ" + } + }, + "short" : { + "second" : { + "current" : "now", + "past" : "Hékta okpí {0} k’uŋ héhaŋ", + "future" : "Letáŋhaŋ okpí {0} kiŋháŋ" + }, + "now" : "now", + "month" : { + "future" : "Letáŋhaŋ wíyawapi {0} kiŋháŋ", + "current" : "Lé wí kiŋ", + "past" : "Hékta wíyawapi {0} kʼuŋ héhaŋ", + "previous" : "Wí kʼuŋ héhaŋ", + "next" : "Tȟokáta wí kiŋháŋ" + }, + "day" : { + "previous" : "Ȟtálehaŋ", + "current" : "Lé aŋpétu kiŋ", + "next" : "Híŋhaŋni kiŋháŋ", + "future" : "Letáŋhaŋ {0}-čháŋ kiŋháŋ", + "past" : "Hékta {0}-čháŋ k’uŋ héhaŋ" + }, + "minute" : { + "current" : "this minute", + "future" : "Letáŋhaŋ oȟ’áŋkȟo {0} kiŋháŋ", + "past" : "Hékta oȟ’áŋkȟo {0} k’uŋ héhaŋ" + }, + "quarter" : { + "past" : "-{0} Q", + "previous" : "last quarter", + "current" : "this quarter", + "future" : "+{0} Q", + "next" : "next quarter" + }, + "hour" : { + "current" : "this hour", + "future" : "Letáŋhaŋ owápȟe {0} kiŋháŋ", + "past" : "Hékta owápȟe {0} kʼuŋ héhaŋ" + }, + "week" : { + "future" : "Letáŋhaŋ okó {0} kiŋháŋ", + "previous" : "Okó kʼuŋ héhaŋ", + "next" : "Tȟokáta okó kiŋháŋ", + "past" : "Hékta okó {0} kʼuŋ héhaŋ", + "current" : "Lé okó kiŋ" + }, + "year" : { + "next" : "Tȟokáta ómakȟa kiŋháŋ", + "current" : "Lé ómakȟa kiŋ", + "past" : "Hékta ómakȟa {0} kʼuŋ héhaŋ", + "future" : "Letáŋhaŋ ómakȟa {0} kiŋháŋ", + "previous" : "Ómakȟa kʼuŋ héhaŋ" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/lo.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/lo.json new file mode 100644 index 0000000..6954f38 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/lo.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "quarter" : { + "past" : "{0} ຕມ. ກ່ອນ", + "future" : "ໃນ {0} ຕມ.", + "current" : "ໄຕຣມາດນີ້", + "previous" : "ໄຕຣມາດກ່ອນໜ້າ", + "next" : "ໄຕຣມາດໜ້າ" + }, + "year" : { + "previous" : "ປີກາຍ", + "next" : "ປີໜ້າ", + "future" : "ໃນອີກ {0} ປີ", + "current" : "ປີນີ້", + "past" : "{0} ປີກ່ອນ" + }, + "week" : { + "future" : "ໃນອີກ {0} ອທ.", + "previous" : "ອາທິດແລ້ວ", + "next" : "ອາທິດໜ້າ", + "past" : "{0} ອທ. ກ່ອນ", + "current" : "ອາທິດນີ້" + }, + "day" : { + "current" : "ມື້ນີ້", + "past" : "{0} ມື້ກ່ອນ", + "next" : "ມື້ອື່ນ", + "future" : "ໃນອີກ {0} ມື້", + "previous" : "ມື້ວານ" + }, + "hour" : { + "current" : "ຊົ່ວໂມງນີ້", + "past" : "{0} ຊມ. ກ່ອນ", + "future" : "ໃນອີກ {0} ຊມ." + }, + "minute" : { + "future" : "ໃນ {0} ນທ.", + "current" : "ນາທີນີ້", + "past" : "{0} ນທ. ກ່ອນ" + }, + "month" : { + "next" : "ເດືອນໜ້າ", + "current" : "ເດືອນນີ້", + "past" : "{0} ດ. ກ່ອນ", + "future" : "ໃນອີກ {0} ດ.", + "previous" : "ເດືອນແລ້ວ" + }, + "now" : "ຕອນນີ້", + "second" : { + "future" : "ໃນ {0} ວິ.", + "current" : "ຕອນນີ້", + "past" : "{0} ວິ. ກ່ອນ" + } + }, + "short" : { + "minute" : { + "past" : "{0} ນທ. ກ່ອນ", + "future" : "ໃນ {0} ນທ.", + "current" : "ນາທີນີ້" + }, + "week" : { + "current" : "ອາທິດນີ້", + "past" : "{0} ອທ. ກ່ອນ", + "future" : "ໃນອີກ {0} ອທ.", + "next" : "ອາທິດໜ້າ", + "previous" : "ອາທິດແລ້ວ" + }, + "year" : { + "future" : "ໃນອີກ {0} ປີ", + "previous" : "ປີກາຍ", + "next" : "ປີໜ້າ", + "current" : "ປີນີ້", + "past" : "{0} ປີກ່ອນ" + }, + "day" : { + "next" : "ມື້ອື່ນ", + "current" : "ມື້ນີ້", + "previous" : "ມື້ວານ", + "past" : "{0} ມື້ກ່ອນ", + "future" : "ໃນອີກ {0} ມື້" + }, + "hour" : { + "future" : "ໃນອີກ {0} ຊມ.", + "current" : "ຊົ່ວໂມງນີ້", + "past" : "{0} ຊມ. ກ່ອນ" + }, + "quarter" : { + "current" : "ໄຕຣມາດນີ້", + "future" : "ໃນ {0} ຕມ.", + "previous" : "ໄຕຣມາດກ່ອນໜ້າ", + "next" : "ໄຕຣມາດໜ້າ", + "past" : "{0} ຕມ. ກ່ອນ" + }, + "second" : { + "past" : "{0} ວິ. ກ່ອນ", + "current" : "ຕອນນີ້", + "future" : "ໃນ {0} ວິ." + }, + "month" : { + "current" : "ເດືອນນີ້", + "past" : "{0} ດ. ກ່ອນ", + "future" : "ໃນອີກ {0} ດ.", + "next" : "ເດືອນໜ້າ", + "previous" : "ເດືອນແລ້ວ" + }, + "now" : "ຕອນນີ້" + }, + "long" : { + "hour" : { + "future" : "ໃນອີກ {0} ຊົ່ວໂມງ", + "current" : "ຊົ່ວໂມງນີ້", + "past" : "{0} ຊົ່ວໂມງກ່ອນ" + }, + "day" : { + "next" : "ມື້ອື່ນ", + "past" : "{0} ມື້ກ່ອນ", + "previous" : "ມື້ວານ", + "future" : "ໃນອີກ {0} ມື້", + "current" : "ມື້ນີ້" + }, + "second" : { + "past" : "{0} ວິນາທີກ່ອນ", + "current" : "ຕອນນີ້", + "future" : "ໃນອີກ {0} ວິນາທີ" + }, + "week" : { + "future" : "ໃນອີກ {0} ອາທິດ", + "past" : "{0} ອາທິດກ່ອນ", + "current" : "ອາທິດນີ້", + "next" : "ອາທິດໜ້າ", + "previous" : "ອາທິດແລ້ວ" + }, + "minute" : { + "future" : "{0} ໃນອີກ 0 ນາທີ", + "past" : "{0} ນາທີກ່ອນ", + "current" : "ນາທີນີ້" + }, + "month" : { + "future" : "ໃນອີກ {0} ເດືອນ", + "past" : "{0} ເດືອນກ່ອນ", + "current" : "ເດືອນນີ້", + "previous" : "ເດືອນແລ້ວ", + "next" : "ເດືອນໜ້າ" + }, + "now" : "ຕອນນີ້", + "year" : { + "current" : "ປີນີ້", + "next" : "ປີໜ້າ", + "previous" : "ປີກາຍ", + "future" : "ໃນອີກ {0} ປີ", + "past" : "{0} ປີກ່ອນ" + }, + "quarter" : { + "future" : "ໃນອີກ {0} ໄຕຣມາດ", + "previous" : "ໄຕຣມາດກ່ອນໜ້າ", + "past" : "{0} ໄຕຣມາດກ່ອນ", + "next" : "ໄຕຣມາດໜ້າ", + "current" : "ໄຕຣມາດນີ້" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/lt.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/lt.json new file mode 100644 index 0000000..c30914b --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/lt.json @@ -0,0 +1,228 @@ +{ + "narrow" : { + "quarter" : { + "past" : "prieš {0} ketv.", + "future" : "po {0} ketv.", + "current" : "šis ketvirtis", + "previous" : "praėjęs ketvirtis", + "next" : "kitas ketvirtis" + }, + "year" : { + "previous" : "praėjusiais metais", + "next" : "kitais metais", + "future" : "po {0} m.", + "current" : "šiais metais", + "past" : "prieš {0} m." + }, + "week" : { + "future" : "po {0} sav.", + "previous" : "praėjusią savaitę", + "next" : "kitą savaitę", + "past" : "prieš {0} sav.", + "current" : "šią savaitę" + }, + "day" : { + "current" : "šiandien", + "past" : "prieš {0} d.", + "next" : "rytoj", + "future" : "po {0} d.", + "previous" : "vakar" + }, + "hour" : { + "current" : "šią valandą", + "past" : "prieš {0} val.", + "future" : "po {0} val." + }, + "minute" : { + "future" : "po {0} min.", + "current" : "šią minutę", + "past" : "prieš {0} min." + }, + "month" : { + "next" : "kitą mėnesį", + "current" : "šį mėnesį", + "past" : "prieš {0} mėn.", + "future" : "po {0} mėn.", + "previous" : "praėjusį mėnesį" + }, + "now" : "dabar", + "second" : { + "future" : "po {0} s", + "current" : "dabar", + "past" : "prieš {0} s" + } + }, + "short" : { + "minute" : { + "past" : "prieš {0} min.", + "future" : "po {0} min.", + "current" : "šią minutę" + }, + "week" : { + "current" : "šią savaitę", + "past" : "prieš {0} sav.", + "future" : "po {0} sav.", + "next" : "kitą savaitę", + "previous" : "praėjusią savaitę" + }, + "year" : { + "future" : "po {0} m.", + "previous" : "praėjusiais metais", + "next" : "kitais metais", + "current" : "šiais metais", + "past" : "prieš {0} m." + }, + "day" : { + "next" : "rytoj", + "current" : "šiandien", + "previous" : "vakar", + "past" : "prieš {0} d.", + "future" : "po {0} d." + }, + "hour" : { + "future" : "po {0} val.", + "current" : "šią valandą", + "past" : "prieš {0} val." + }, + "quarter" : { + "current" : "šis ketvirtis", + "future" : "po {0} ketv.", + "previous" : "praėjęs ketvirtis", + "next" : "kitas ketvirtis", + "past" : "prieš {0} ketv." + }, + "second" : { + "past" : "prieš {0} sek.", + "current" : "dabar", + "future" : "po {0} sek." + }, + "month" : { + "current" : "šį mėnesį", + "past" : "prieš {0} mėn.", + "future" : "po {0} mėn.", + "next" : "kitą mėnesį", + "previous" : "praėjusį mėnesį" + }, + "now" : "dabar" + }, + "long" : { + "quarter" : { + "next" : "kitas ketvirtis", + "current" : "šis ketvirtis", + "future" : { + "many" : "po {0} ketvirčio", + "one" : "po {0} ketvirčio", + "other" : "po {0} ketvirčių" + }, + "previous" : "praėjęs ketvirtis", + "past" : { + "few" : "prieš {0} ketvirčius", + "one" : "prieš {0} ketvirtį", + "many" : "prieš {0} ketvirčio", + "other" : "prieš {0} ketvirčių" + } + }, + "day" : { + "next" : "rytoj", + "past" : { + "few" : "prieš {0} dienas", + "one" : "prieš {0} dieną", + "many" : "prieš {0} dienos", + "other" : "prieš {0} dienų" + }, + "previous" : "vakar", + "current" : "šiandien", + "future" : { + "other" : "po {0} dienų", + "many" : "po {0} dienos", + "one" : "po {0} dienos" + } + }, + "week" : { + "current" : "šią savaitę", + "next" : "kitą savaitę", + "past" : { + "one" : "prieš {0} savaitę", + "few" : "prieš {0} savaites", + "other" : "prieš {0} savaičių", + "many" : "prieš {0} savaitės" + }, + "future" : { + "one" : "po {0} savaitės", + "other" : "po {0} savaičių", + "many" : "po {0} savaitės" + }, + "previous" : "praėjusią savaitę" + }, + "month" : { + "current" : "šį mėnesį", + "future" : { + "one" : "po {0} mėnesio", + "many" : "po {0} mėnesio", + "other" : "po {0} mėnesių" + }, + "next" : "kitą mėnesį", + "previous" : "praėjusį mėnesį", + "past" : { + "one" : "prieš {0} mėnesį", + "many" : "prieš {0} mėnesio", + "other" : "prieš {0} mėnesių", + "few" : "prieš {0} mėnesius" + } + }, + "second" : { + "future" : { + "one" : "po {0} sekundės", + "many" : "po {0} sekundės", + "other" : "po {0} sekundžių" + }, + "current" : "dabar", + "past" : { + "many" : "prieš {0} sekundės", + "one" : "prieš {0} sekundę", + "few" : "prieš {0} sekundes", + "other" : "prieš {0} sekundžių" + } + }, + "year" : { + "current" : "šiais metais", + "next" : "kitais metais", + "previous" : "praėjusiais metais", + "future" : "po {0} metų", + "past" : { + "other" : "prieš {0} metų", + "one" : "prieš {0} metus", + "few" : "prieš {0} metus" + } + }, + "hour" : { + "past" : { + "one" : "prieš {0} valandą", + "other" : "prieš {0} valandų", + "few" : "prieš {0} valandas", + "many" : "prieš {0} valandos" + }, + "future" : { + "many" : "po {0} valandos", + "other" : "po {0} valandų", + "one" : "po {0} valandos" + }, + "current" : "šią valandą" + }, + "now" : "dabar", + "minute" : { + "current" : "šią minutę", + "future" : { + "one" : "po {0} minutės", + "other" : "po {0} minučių", + "many" : "po {0} minutės" + }, + "past" : { + "other" : "prieš {0} minučių", + "many" : "prieš {0} minutės", + "one" : "prieš {0} minutę", + "few" : "prieš {0} minutes" + } + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/lv.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/lv.json new file mode 100644 index 0000000..29e9af9 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/lv.json @@ -0,0 +1,227 @@ +{ + "short" : { + "now" : "tagad", + "minute" : { + "past" : "pirms {0} min.", + "future" : "pēc {0} min.", + "current" : "šajā minūtē" + }, + "year" : { + "current" : "šajā gadā", + "future" : "pēc {0} g.", + "previous" : "pagājušajā gadā", + "next" : "nākamajā gadā", + "past" : "pirms {0} g." + }, + "second" : { + "current" : "tagad", + "future" : "pēc {0} sek.", + "past" : "pirms {0} sek." + }, + "hour" : { + "future" : "pēc {0} st.", + "past" : "pirms {0} st.", + "current" : "šajā stundā" + }, + "month" : { + "current" : "šajā mēnesī", + "next" : "nākamajā mēnesī", + "past" : "pirms {0} mēn.", + "future" : "pēc {0} mēn.", + "previous" : "pagājušajā mēnesī" + }, + "quarter" : { + "future" : "pēc {0} cet.", + "previous" : "pēdējais ceturksnis", + "next" : "nākamais ceturksnis", + "past" : "pirms {0} cet.", + "current" : "šis ceturksnis" + }, + "week" : { + "next" : "nākamajā nedēļā", + "past" : "pirms {0} ned.", + "current" : "šajā nedēļā", + "previous" : "pagājušajā nedēļā", + "future" : "pēc {0} ned." + }, + "day" : { + "next" : "rīt", + "current" : "šodien", + "previous" : "vakar", + "past" : { + "one" : "pirms {0} d.", + "other" : "pirms {0} d." + }, + "future" : { + "one" : "pēc {0} d.", + "other" : "pēc {0} d." + } + } + }, + "long" : { + "quarter" : { + "current" : "šis ceturksnis", + "previous" : "pēdējais ceturksnis", + "next" : "nākamais ceturksnis", + "past" : { + "one" : "pirms {0} ceturkšņa", + "other" : "pirms {0} ceturkšņiem" + }, + "future" : { + "one" : "pēc {0} ceturkšņa", + "other" : "pēc {0} ceturkšņiem" + } + }, + "minute" : { + "current" : "šajā minūtē", + "past" : { + "one" : "pirms {0} minūtes", + "other" : "pirms {0} minūtēm" + }, + "future" : { + "one" : "pēc {0} minūtes", + "other" : "pēc {0} minūtēm" + } + }, + "now" : "tagad", + "second" : { + "past" : { + "other" : "pirms {0} sekundēm", + "one" : "pirms {0} sekundes" + }, + "future" : { + "one" : "pēc {0} sekundes", + "other" : "pēc {0} sekundēm" + }, + "current" : "tagad" + }, + "hour" : { + "future" : { + "other" : "pēc {0} stundām", + "one" : "pēc {0} stundas" + }, + "current" : "šajā stundā", + "past" : { + "other" : "pirms {0} stundām", + "one" : "pirms {0} stundas" + } + }, + "week" : { + "next" : "nākamajā nedēļā", + "past" : { + "other" : "pirms {0} nedēļām", + "one" : "pirms {0} nedēļas" + }, + "current" : "šajā nedēļā", + "previous" : "pagājušajā nedēļā", + "future" : { + "other" : "pēc {0} nedēļām", + "one" : "pēc {0} nedēļas" + } + }, + "day" : { + "future" : { + "other" : "pēc {0} dienām", + "one" : "pēc {0} dienas" + }, + "past" : { + "one" : "pirms {0} dienas", + "other" : "pirms {0} dienām" + }, + "previous" : "vakar", + "current" : "šodien", + "next" : "rīt" + }, + "month" : { + "past" : { + "other" : "pirms {0} mēnešiem", + "one" : "pirms {0} mēneša" + }, + "previous" : "pagājušajā mēnesī", + "next" : "nākamajā mēnesī", + "future" : { + "other" : "pēc {0} mēnešiem", + "one" : "pēc {0} mēneša" + }, + "current" : "šajā mēnesī" + }, + "year" : { + "current" : "šajā gadā", + "previous" : "pagājušajā gadā", + "future" : { + "one" : "pēc {0} gada", + "other" : "pēc {0} gadiem" + }, + "next" : "nākamajā gadā", + "past" : { + "other" : "pirms {0} gadiem", + "one" : "pirms {0} gada" + } + } + }, + "narrow" : { + "week" : { + "past" : "pirms {0} ned.", + "future" : "pēc {0} ned.", + "next" : "nākamajā nedēļā", + "current" : "šajā nedēļā", + "previous" : "pagājušajā nedēļā" + }, + "minute" : { + "past" : "pirms {0} min", + "future" : { + "other" : "pēc {0} min", + "one" : "pēc {0} min" + }, + "current" : "šajā minūtē" + }, + "month" : { + "next" : "nākamajā mēnesī", + "past" : "pirms {0} mēn.", + "current" : "šajā mēnesī", + "future" : "pēc {0} mēn.", + "previous" : "pagājušajā mēnesī" + }, + "now" : "tagad", + "year" : { + "previous" : "pagājušajā gadā", + "current" : "šajā gadā", + "past" : "pirms {0} g.", + "future" : "pēc {0} g.", + "next" : "nākamajā gadā" + }, + "day" : { + "current" : "šodien", + "past" : { + "one" : "pirms {0} d.", + "other" : "pirms {0} d." + }, + "future" : { + "one" : "pēc {0} d.", + "other" : "pēc {0} d." + }, + "previous" : "vakar", + "next" : "rīt" + }, + "second" : { + "past" : { + "other" : "pirms {0} s", + "one" : "pirms {0} s" + }, + "current" : "tagad", + "future" : "pēc {0} s" + }, + "quarter" : { + "current" : "šis ceturksnis", + "previous" : "pēdējais ceturksnis", + "past" : "pirms {0} cet.", + "next" : "nākamais ceturksnis", + "future" : "pēc {0} cet." + }, + "hour" : { + "current" : "šajā stundā", + "past" : "pirms {0} h", + "future" : "pēc {0} h" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/mk.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/mk.json new file mode 100644 index 0000000..3c440c6 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/mk.json @@ -0,0 +1,257 @@ +{ + "short" : { + "month" : { + "current" : "овој месец", + "next" : "следниот месец", + "past" : { + "one" : "пред {0} месец", + "other" : "пред {0} месеци" + }, + "future" : { + "one" : "за {0} месец", + "other" : "за {0} месеци" + }, + "previous" : "минатиот месец" + }, + "now" : "сега", + "day" : { + "next" : "утре", + "current" : "денес", + "previous" : "вчера", + "past" : { + "one" : "пред {0} ден", + "other" : "пред {0} дена" + }, + "future" : { + "one" : "за {0} ден", + "other" : "за {0} дена" + } + }, + "year" : { + "current" : "оваа година", + "future" : "за {0} год.", + "previous" : "минатата година", + "next" : "следната година", + "past" : "пред {0} год." + }, + "hour" : { + "past" : { + "other" : "пред {0} часа", + "one" : "пред {0} час" + }, + "future" : { + "one" : "за {0} час", + "other" : "за {0} часа" + }, + "current" : "часов" + }, + "minute" : { + "future" : "за {0} мин.", + "past" : "пред {0} мин.", + "current" : "оваа минута" + }, + "second" : { + "current" : "сега", + "future" : "за {0} сек.", + "past" : "пред {0} сек." + }, + "quarter" : { + "future" : "за {0} тромес.", + "previous" : "последното тромесечје", + "next" : "следното тромесечје", + "past" : "пред {0} тромес.", + "current" : "ова тромесечје" + }, + "week" : { + "next" : "следната седмица", + "past" : { + "one" : "пред {0} седмица", + "other" : "пред {0} седмици" + }, + "current" : "оваа седмица", + "previous" : "минатата седмица", + "future" : { + "other" : "за {0} седмици", + "one" : "за {0} седмица" + } + } + }, + "narrow" : { + "second" : { + "current" : "сега", + "past" : "пред {0} сек.", + "future" : "за {0} сек." + }, + "now" : "сега", + "quarter" : { + "previous" : "последното тромесечје", + "current" : "ова тромесечје", + "past" : "пред {0} тромес.", + "future" : "за {0} тромес.", + "next" : "следното тромесечје" + }, + "minute" : { + "future" : "за {0} мин.", + "current" : "оваа минута", + "past" : "пред {0} мин." + }, + "day" : { + "next" : "утре", + "current" : "денес", + "past" : { + "other" : "пред {0} дена", + "one" : "пред {0} ден" + }, + "future" : { + "other" : "за {0} дена", + "one" : "за {0} ден" + }, + "previous" : "вчера" + }, + "week" : { + "current" : "оваа седмица", + "next" : "следната седмица", + "past" : { + "other" : "пред {0} седмици", + "one" : "пред {0} седмица" + }, + "previous" : "минатата седмица", + "future" : { + "one" : "за {0} седмица", + "other" : "за {0} седмици" + } + }, + "month" : { + "current" : "овој месец", + "next" : "следниот месец", + "past" : { + "other" : "пред {0} месеци", + "one" : "пред {0} месец" + }, + "previous" : "минатиот месец", + "future" : { + "one" : "за {0} месец", + "other" : "за {0} месеци" + } + }, + "year" : { + "previous" : "минатата година", + "current" : "оваа година", + "next" : "следната година", + "past" : "пред {0} год.", + "future" : "за {0} год." + }, + "hour" : { + "current" : "часов", + "past" : { + "one" : "пред {0} час", + "other" : "пред {0} часа" + }, + "future" : { + "one" : "за {0} час", + "other" : "за {0} часа" + } + } + }, + "long" : { + "now" : "сега", + "minute" : { + "current" : "оваа минута", + "future" : { + "one" : "за {0} минута", + "other" : "за {0} минути" + }, + "past" : { + "other" : "пред {0} минути", + "one" : "пред {0} минута" + } + }, + "year" : { + "future" : { + "other" : "за {0} години", + "one" : "за {0} година" + }, + "previous" : "минатата година", + "next" : "следната година", + "past" : { + "other" : "пред {0} години", + "one" : "пред {0} година" + }, + "current" : "оваа година" + }, + "hour" : { + "current" : "часов", + "past" : { + "one" : "пред {0} час", + "other" : "пред {0} часа" + }, + "future" : { + "one" : "за {0} час", + "other" : "за {0} часа" + } + }, + "second" : { + "current" : "сега", + "past" : { + "one" : "пред {0} секунда", + "other" : "пред {0} секунди" + }, + "future" : { + "one" : "за {0} секунда", + "other" : "за {0} секунди" + } + }, + "day" : { + "previous" : "вчера", + "current" : "денес", + "future" : { + "other" : "за {0} дена", + "one" : "за {0} ден" + }, + "past" : { + "one" : "пред {0} ден", + "other" : "пред {0} дена" + }, + "next" : "утре" + }, + "month" : { + "previous" : "минатиот месец", + "current" : "овој месец", + "next" : "следниот месец", + "future" : { + "other" : "за {0} месеци", + "one" : "за {0} месец" + }, + "past" : { + "one" : "пред {0} месец", + "other" : "пред {0} месеци" + } + }, + "quarter" : { + "current" : "ова тромесечје", + "previous" : "последното тромесечје", + "past" : { + "one" : "пред {0} тромесечје", + "other" : "пред {0} тромесечја" + }, + "future" : { + "other" : "за {0} тромесечја", + "one" : "за {0} тромесечје" + }, + "next" : "следното тромесечје" + }, + "week" : { + "future" : { + "one" : "за {0} седмица", + "other" : "за {0} седмици" + }, + "current" : "оваа седмица", + "next" : "следната седмица", + "previous" : "минатата седмица", + "past" : { + "one" : "пред {0} седмица", + "other" : "пред {0} седмици" + } + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ml.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ml.json new file mode 100644 index 0000000..b828f8e --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ml.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "day" : { + "next" : "നാളെ", + "future" : "{0} ദിവസത്തിൽ", + "previous" : "ഇന്നലെ", + "current" : "ഇന്ന്", + "past" : "{0} ദിവസം മുമ്പ്" + }, + "quarter" : { + "next" : "അടുത്ത പാദം", + "past" : "{0} പാദം മുമ്പ്", + "future" : "{0} പാദത്തിൽ", + "previous" : "കഴിഞ്ഞ പാദം", + "current" : "ഈ പാദം" + }, + "hour" : { + "future" : "{0} മണിക്കൂറിൽ", + "current" : "ഈ മണിക്കൂറിൽ", + "past" : "{0} മണിക്കൂർ മുമ്പ്" + }, + "year" : { + "next" : "അടുത്തവർഷം", + "past" : "{0} വർഷം മുമ്പ്", + "current" : "ഈ വർ‌ഷം", + "previous" : "കഴിഞ്ഞ വർഷം", + "future" : "{0} വർഷത്തിൽ" + }, + "now" : "ഇപ്പോൾ", + "month" : { + "current" : "ഈ മാസം", + "future" : "{0} മാസത്തിൽ", + "past" : "{0} മാസം മുമ്പ്", + "next" : "അടുത്ത മാസം", + "previous" : "കഴിഞ്ഞ മാസം" + }, + "week" : { + "previous" : "കഴിഞ്ഞ ആഴ്‌ച", + "current" : "ഈ ആഴ്ച", + "past" : "{0} ആഴ്ച മുമ്പ്", + "future" : "{0} ആഴ്ചയിൽ", + "next" : "അടുത്ത ആഴ്ച" + }, + "minute" : { + "current" : "ഈ മിനിറ്റിൽ", + "past" : "{0} മിനിറ്റ് മുമ്പ്", + "future" : "{0} മിനിറ്റിൽ" + }, + "second" : { + "current" : "ഇപ്പോൾ", + "past" : "{0} സെക്കൻഡ് മുമ്പ്", + "future" : "{0} സെക്കൻഡിൽ" + } + }, + "long" : { + "day" : { + "previous" : "ഇന്നലെ", + "current" : "ഇന്ന്", + "next" : "നാളെ", + "past" : "{0} ദിവസം മുമ്പ്", + "future" : "{0} ദിവസത്തിൽ" + }, + "week" : { + "current" : "ഈ ആഴ്ച", + "future" : "{0} ആഴ്ചയിൽ", + "past" : "{0} ആഴ്ച മുമ്പ്", + "previous" : "കഴിഞ്ഞ ആഴ്‌ച", + "next" : "അടുത്ത ആഴ്ച" + }, + "minute" : { + "past" : "{0} മിനിറ്റ് മുമ്പ്", + "future" : "{0} മിനിറ്റിൽ", + "current" : "ഈ മിനിറ്റിൽ" + }, + "month" : { + "future" : "{0} മാസത്തിൽ", + "next" : "അടുത്ത മാസം", + "previous" : "കഴിഞ്ഞ മാസം", + "current" : "ഈ മാസം", + "past" : "{0} മാസം മുമ്പ്" + }, + "hour" : { + "future" : "{0} മണിക്കൂറിൽ", + "current" : "ഈ മണിക്കൂറിൽ", + "past" : "{0} മണിക്കൂർ മുമ്പ്" + }, + "year" : { + "past" : "{0} വർഷം മുമ്പ്", + "future" : "{0} വർഷത്തിൽ", + "previous" : "കഴിഞ്ഞ വർഷം", + "next" : "അടുത്തവർഷം", + "current" : "ഈ വർ‌ഷം" + }, + "second" : { + "past" : "{0} സെക്കൻഡ് മുമ്പ്", + "future" : "{0} സെക്കൻഡിൽ", + "current" : "ഇപ്പോൾ" + }, + "now" : "ഇപ്പോൾ", + "quarter" : { + "past" : "{0} പാദം മുമ്പ്", + "current" : "ഈ പാദം", + "previous" : "കഴിഞ്ഞ പാദം", + "future" : "{0} പാദത്തിൽ", + "next" : "അടുത്ത പാദം" + } + }, + "short" : { + "quarter" : { + "future" : "{0} പാദത്തിൽ", + "next" : "അടുത്ത പാദം", + "previous" : "കഴിഞ്ഞ പാദം", + "current" : "ഈ പാദം", + "past" : "{0} പാദം മുമ്പ്" + }, + "minute" : { + "future" : "{0} മിനിറ്റിൽ", + "current" : "ഈ മിനിറ്റിൽ", + "past" : "{0} മിനിറ്റ് മുമ്പ്" + }, + "year" : { + "next" : "അടുത്തവർഷം", + "future" : "{0} വർഷത്തിൽ", + "current" : "ഈ വർ‌ഷം", + "past" : "{0} വർഷം മുമ്പ്", + "previous" : "കഴിഞ്ഞ വർഷം" + }, + "second" : { + "future" : "{0} സെക്കൻഡിൽ", + "current" : "ഇപ്പോൾ", + "past" : "{0} സെക്കൻഡ് മുമ്പ്" + }, + "hour" : { + "past" : "{0} മണിക്കൂർ മുമ്പ്", + "current" : "ഈ മണിക്കൂറിൽ", + "future" : "{0} മണിക്കൂറിൽ" + }, + "now" : "ഇപ്പോൾ", + "month" : { + "previous" : "കഴിഞ്ഞ മാസം", + "next" : "അടുത്ത മാസം", + "past" : "{0} മാസം മുമ്പ്", + "current" : "ഈ മാസം", + "future" : "{0} മാസത്തിൽ" + }, + "week" : { + "previous" : "കഴിഞ്ഞ ആഴ്‌ച", + "current" : "ഈ ആഴ്ച", + "next" : "അടുത്ത ആഴ്ച", + "past" : "{0} ആഴ്ച മുമ്പ്", + "future" : "{0} ആഴ്ചയിൽ" + }, + "day" : { + "next" : "നാളെ", + "past" : "{0} ദിവസം മുമ്പ്", + "future" : "{0} ദിവസത്തിൽ", + "previous" : "ഇന്നലെ", + "current" : "ഇന്ന്" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/mn.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/mn.json new file mode 100644 index 0000000..946947e --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/mn.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "day" : { + "next" : "маргааш", + "future" : "{0} өдөрт", + "previous" : "өчигдөр", + "current" : "өнөөдөр", + "past" : "{0} өдрийн өмнө" + }, + "quarter" : { + "next" : "дараагийн улирал", + "past" : "{0} улирлын өмнө", + "future" : "{0} улиралд", + "previous" : "өнгөрсөн улирал", + "current" : "энэ улирал" + }, + "hour" : { + "future" : "{0} цагт", + "current" : "энэ цаг", + "past" : "{0} ц. өмнө" + }, + "year" : { + "next" : "ирэх жил", + "past" : "-{0} жил.н өмнө", + "current" : "энэ жил", + "previous" : "өнгөрсөн жил", + "future" : "+{0} жилд" + }, + "now" : "одоо", + "month" : { + "current" : "энэ сар", + "future" : "+{0} сард", + "past" : "{0} сарын өмнө", + "next" : "ирэх сар", + "previous" : "өнгөрсөн сар" + }, + "week" : { + "previous" : "өнгөрсөн долоо хоног", + "current" : "энэ долоо хоног", + "past" : "{0} 7 хоногийн өмнө", + "future" : "{0} 7 хоногт", + "next" : "ирэх долоо хоног" + }, + "minute" : { + "current" : "энэ минут", + "past" : "{0} мин. өмнө", + "future" : "{0} мин. дотор" + }, + "second" : { + "current" : "одоо", + "past" : "{0} сек. өмнө", + "future" : "{0} сек. дотор" + } + }, + "long" : { + "day" : { + "previous" : "өчигдөр", + "current" : "өнөөдөр", + "next" : "маргааш", + "past" : "{0} өдрийн өмнө", + "future" : "{0} өдөрт" + }, + "week" : { + "current" : "энэ долоо хоног", + "future" : "{0} 7 хоногт", + "past" : "{0} 7 хоногийн өмнө", + "previous" : "өнгөрсөн долоо хоног", + "next" : "ирэх долоо хоног" + }, + "minute" : { + "current" : "энэ минут", + "past" : "{0} минутын өмнө", + "future" : "{0} минутын дотор" + }, + "month" : { + "future" : "{0} сард", + "next" : "ирэх сар", + "previous" : "өнгөрсөн сар", + "current" : "энэ сар", + "past" : "{0} сарын өмнө" + }, + "hour" : { + "current" : "энэ цаг", + "past" : "{0} цагийн өмнө", + "future" : "{0} цагт" + }, + "year" : { + "past" : "{0} жилийн өмнө", + "future" : "{0} жилийн дотор", + "previous" : "өнгөрсөн жил", + "next" : "ирэх жил", + "current" : "энэ жил" + }, + "second" : { + "past" : "{0} секундын өмнө", + "future" : "{0} секундын дотор", + "current" : "одоо" + }, + "now" : "одоо", + "quarter" : { + "past" : "{0} улирлын өмнө", + "current" : "энэ улирал", + "previous" : "өнгөрсөн улирал", + "future" : "{0} улиралд", + "next" : "дараагийн улирал" + } + }, + "short" : { + "quarter" : { + "future" : "{0} улиралд", + "next" : "дараагийн улирал", + "previous" : "өнгөрсөн улирал", + "current" : "энэ улирал", + "past" : "{0} улирлын өмнө" + }, + "minute" : { + "current" : "энэ минут", + "past" : "{0} мин. өмнө", + "future" : "{0} мин. дотор" + }, + "year" : { + "next" : "ирэх жил", + "future" : "{0} жилийн дотор", + "current" : "энэ жил", + "past" : "{0} жилийн өмнө", + "previous" : "өнгөрсөн жил" + }, + "second" : { + "future" : "{0} сек. дотор", + "current" : "одоо", + "past" : "{0} сек. өмнө" + }, + "hour" : { + "current" : "энэ цаг", + "past" : "{0} ц. өмнө", + "future" : "{0} цагт" + }, + "now" : "одоо", + "month" : { + "previous" : "өнгөрсөн сар", + "next" : "ирэх сар", + "past" : "{0} сарын өмнө", + "current" : "энэ сар", + "future" : "{0} сард" + }, + "week" : { + "previous" : "өнгөрсөн долоо хоног", + "current" : "энэ долоо хоног", + "next" : "ирэх долоо хоног", + "past" : "{0} 7 хоногийн өмнө", + "future" : "{0} 7 хоногт" + }, + "day" : { + "next" : "маргааш", + "past" : "{0} өдрийн өмнө", + "future" : "{0} өдөрт", + "previous" : "өчигдөр", + "current" : "өнөөдөр" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/mr.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/mr.json new file mode 100644 index 0000000..94aa82d --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/mr.json @@ -0,0 +1,281 @@ +{ + "narrow" : { + "hour" : { + "future" : { + "other" : "येत्या {0} तासांमध्ये", + "one" : "येत्या {0} तासामध्ये" + }, + "past" : { + "one" : "{0} तासापूर्वी", + "other" : "{0} तासांपूर्वी" + }, + "current" : "तासात" + }, + "now" : "आत्ता", + "quarter" : { + "current" : "ही तिमाही", + "next" : "पुढील तिमाही", + "previous" : "मागील तिमाही", + "past" : { + "one" : "{0} तिमाहीपूर्वी", + "other" : "{0} तिमाहींपूर्वी" + }, + "future" : { + "one" : "{0} तिमाहीमध्ये", + "other" : "{0} तिमाहींमध्ये" + } + }, + "year" : { + "next" : "पुढील वर्ष", + "previous" : "मागील वर्ष", + "past" : { + "one" : "{0} वर्षापूर्वी", + "other" : "{0} वर्षांपूर्वी" + }, + "current" : "हे वर्ष", + "future" : { + "one" : "येत्या {0} वर्षामध्ये", + "other" : "येत्या {0} वर्षांमध्ये" + } + }, + "week" : { + "next" : "पुढील आठवडा", + "previous" : "मागील आठवडा", + "future" : { + "other" : "येत्या {0} आठवड्यांमध्ये", + "one" : "येत्या {0} आठवड्यामध्ये" + }, + "past" : { + "other" : "{0} आठवड्यांपूर्वी", + "one" : "{0} आठवड्यापूर्वी" + }, + "current" : "हा आठवडा" + }, + "month" : { + "previous" : "मागील महिना", + "next" : "पुढील महिना", + "future" : { + "one" : "{0} महिन्यामध्ये", + "other" : "{0} महिन्यांमध्ये" + }, + "past" : { + "other" : "{0} महिन्यांपूर्वी", + "one" : "{0} महिन्यापूर्वी" + }, + "current" : "हा महिना" + }, + "day" : { + "future" : { + "one" : "{0} दिवसामध्ये", + "other" : "{0} दिवसांमध्ये" + }, + "previous" : "काल", + "current" : "आज", + "next" : "उद्या", + "past" : { + "one" : "{0} दिवसापूर्वी", + "other" : "{0} दिवसांपूर्वी" + } + }, + "minute" : { + "future" : "{0} मिनि. मध्ये", + "current" : "या मिनिटात", + "past" : "{0} मिनि. पूर्वी" + }, + "second" : { + "past" : "{0} से. पूर्वी", + "current" : "आत्ता", + "future" : { + "one" : "{0} से. मध्ये", + "other" : "येत्या {0} से. मध्ये" + } + } + }, + "long" : { + "second" : { + "past" : { + "other" : "{0} सेकंदांपूर्वी", + "one" : "{0} सेकंदापूर्वी" + }, + "future" : { + "other" : "{0} सेकंदांमध्ये", + "one" : "{0} सेकंदामध्ये" + }, + "current" : "आत्ता" + }, + "year" : { + "previous" : "मागील वर्ष", + "current" : "हे वर्ष", + "next" : "पुढील वर्ष", + "past" : { + "one" : "{0} वर्षापूर्वी", + "other" : "{0} वर्षांपूर्वी" + }, + "future" : { + "one" : "येत्या {0} वर्षामध्ये", + "other" : "येत्या {0} वर्षांमध्ये" + } + }, + "quarter" : { + "current" : "ही तिमाही", + "future" : { + "one" : "{0} तिमाहीमध्ये", + "other" : "{0} तिमाहींमध्ये" + }, + "past" : { + "other" : "{0} तिमाहींपूर्वी", + "one" : "{0} तिमाहीपूर्वी" + }, + "previous" : "मागील तिमाही", + "next" : "पुढील तिमाही" + }, + "minute" : { + "current" : "या मिनिटात", + "past" : { + "other" : "{0} मिनिटांपूर्वी", + "one" : "{0} मिनिटापूर्वी" + }, + "future" : { + "other" : "{0} मिनिटांमध्ये", + "one" : "{0} मिनिटामध्ये" + } + }, + "now" : "आत्ता", + "month" : { + "future" : { + "other" : "येत्या {0} महिन्यांमध्ये", + "one" : "येत्या {0} महिन्यामध्ये" + }, + "past" : { + "one" : "{0} महिन्यापूर्वी", + "other" : "{0} महिन्यांपूर्वी" + }, + "current" : "हा महिना", + "next" : "पुढील महिना", + "previous" : "मागील महिना" + }, + "week" : { + "current" : "हा आठवडा", + "next" : "पुढील आठवडा", + "previous" : "मागील आठवडा", + "past" : { + "one" : "{0} आठवड्यापूर्वी", + "other" : "{0} आठवड्यांपूर्वी" + }, + "future" : { + "one" : "{0} आठवड्यामध्ये", + "other" : "{0} आठवड्यांमध्ये" + } + }, + "hour" : { + "current" : "तासात", + "past" : { + "one" : "{0} तासापूर्वी", + "other" : "{0} तासांपूर्वी" + }, + "future" : { + "other" : "{0} तासांमध्ये", + "one" : "{0} तासामध्ये" + } + }, + "day" : { + "past" : { + "one" : "{0} दिवसापूर्वी", + "other" : "{0} दिवसांपूर्वी" + }, + "previous" : "काल", + "next" : "उद्या", + "future" : { + "other" : "येत्या {0} दिवसांमध्ये", + "one" : "येत्या {0} दिवसामध्ये" + }, + "current" : "आज" + } + }, + "short" : { + "second" : { + "past" : "{0} से. पूर्वी", + "current" : "आत्ता", + "future" : "{0} से. मध्ये" + }, + "day" : { + "next" : "उद्या", + "past" : { + "one" : "{0} दिवसापूर्वी", + "other" : "{0} दिवसांपूर्वी" + }, + "previous" : "काल", + "future" : { + "other" : "येत्या {0} दिवसांमध्ये", + "one" : "{0} दिवसामध्ये" + }, + "current" : "आज" + }, + "year" : { + "past" : { + "one" : "{0} वर्षापूर्वी", + "other" : "{0} वर्षांपूर्वी" + }, + "future" : { + "one" : "{0} वर्षामध्ये", + "other" : "{0} वर्षांमध्ये" + }, + "previous" : "मागील वर्ष", + "current" : "हे वर्ष", + "next" : "पुढील वर्ष" + }, + "week" : { + "previous" : "मागील आठवडा", + "current" : "हा आठवडा", + "next" : "पुढील आठवडा", + "past" : { + "one" : "{0} आठवड्यापूर्वी", + "other" : "{0} आठवड्यांपूर्वी" + }, + "future" : { + "one" : "येत्या {0} आठवड्यामध्ये", + "other" : "येत्या {0} आठवड्यांमध्ये" + } + }, + "now" : "आत्ता", + "minute" : { + "past" : "{0} मिनि. पूर्वी", + "future" : "{0} मिनि. मध्ये", + "current" : "या मिनिटात" + }, + "quarter" : { + "previous" : "मागील तिमाही", + "future" : { + "other" : "येत्या {0} तिमाहींमध्ये", + "one" : "येत्या {0} तिमाहीमध्ये" + }, + "next" : "पुढील तिमाही", + "past" : { + "other" : "{0} तिमाहींपूर्वी", + "one" : "{0} तिमाहीपूर्वी" + }, + "current" : "ही तिमाही" + }, + "month" : { + "next" : "पुढील महिना", + "past" : { + "one" : "{0} महिन्यापूर्वी", + "other" : "{0} महिन्यांपूर्वी" + }, + "future" : "{0} महिन्यामध्ये", + "previous" : "मागील महिना", + "current" : "हा महिना" + }, + "hour" : { + "current" : "तासात", + "past" : { + "one" : "{0} तासापूर्वी", + "other" : "{0} तासांपूर्वी" + }, + "future" : { + "one" : "{0} तासामध्ये", + "other" : "{0} तासांमध्ये" + } + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ms.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ms.json new file mode 100644 index 0000000..ab98d0d --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ms.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "day" : { + "next" : "esok", + "future" : "dlm {0} hari", + "previous" : "semlm", + "current" : "hari ini", + "past" : "{0} hari lalu" + }, + "quarter" : { + "next" : "suku seterusnya", + "past" : "{0} suku thn lalu", + "future" : "dlm {0} suku thn", + "previous" : "suku lepas", + "current" : "suku ini" + }, + "hour" : { + "future" : "dlm {0} jam", + "current" : "jam ini", + "past" : "{0} jam lalu" + }, + "year" : { + "next" : "thn depan", + "past" : "{0} thn lalu", + "current" : "thn ini", + "previous" : "thn lepas", + "future" : "dalam {0} thn" + }, + "now" : "sekarang", + "month" : { + "current" : "bln ini", + "future" : "dlm {0} bln", + "past" : "{0} bulan lalu", + "next" : "bln depan", + "previous" : "bln lalu" + }, + "week" : { + "previous" : "mng lepas", + "current" : "mng ini", + "past" : "{0} mgu lalu", + "future" : "dlm {0} mgu", + "next" : "mng depan" + }, + "minute" : { + "current" : "pada minit ini", + "past" : "{0} min lalu", + "future" : "dlm {0} min" + }, + "second" : { + "past" : "{0} saat lalu", + "current" : "sekarang", + "future" : "dlm {0} saat" + } + }, + "long" : { + "day" : { + "previous" : "semalam", + "current" : "hari ini", + "next" : "esok", + "past" : "{0} hari lalu", + "future" : "dalam {0} hari" + }, + "week" : { + "current" : "minggu ini", + "future" : "dalam {0} minggu", + "past" : "{0} minggu lalu", + "previous" : "minggu lalu", + "next" : "minggu depan" + }, + "minute" : { + "current" : "pada minit ini", + "past" : "{0} minit lalu", + "future" : "dalam {0} minit" + }, + "month" : { + "future" : "dalam {0} bulan", + "next" : "bulan depan", + "previous" : "bulan lalu", + "current" : "bulan ini", + "past" : "{0} bulan lalu" + }, + "hour" : { + "current" : "jam ini", + "future" : "dalam {0} jam", + "past" : "{0} jam lalu" + }, + "year" : { + "past" : "{0} tahun lalu", + "future" : "dalam {0} tahun", + "previous" : "tahun lalu", + "next" : "tahun depan", + "current" : "tahun ini" + }, + "second" : { + "past" : "{0} saat lalu", + "current" : "sekarang", + "future" : "dalam {0} saat" + }, + "now" : "sekarang", + "quarter" : { + "past" : "{0} suku tahun lalu", + "current" : "suku tahun ini", + "previous" : "suku tahun lalu", + "future" : "dalam {0} suku tahun", + "next" : "suku tahun seterusnya" + } + }, + "short" : { + "quarter" : { + "future" : "dlm {0} suku thn", + "next" : "suku seterusnya", + "previous" : "suku lepas", + "current" : "suku ini", + "past" : "{0} suku thn lalu" + }, + "minute" : { + "current" : "pada minit ini", + "past" : "{0} min lalu", + "future" : "dlm {0} min" + }, + "year" : { + "next" : "thn depan", + "future" : "dalam {0} thn", + "current" : "thn ini", + "past" : "{0} thn lalu", + "previous" : "thn lepas" + }, + "second" : { + "past" : "{0} saat lalu", + "current" : "sekarang", + "future" : "dlm {0} saat" + }, + "hour" : { + "current" : "jam ini", + "past" : "{0} jam lalu", + "future" : "dlm {0} jam" + }, + "now" : "sekarang", + "month" : { + "previous" : "bln lalu", + "next" : "bln depan", + "past" : "{0} bln lalu", + "current" : "bln ini", + "future" : "dlm {0} bln" + }, + "week" : { + "previous" : "mng lepas", + "current" : "mng ini", + "next" : "mng depan", + "past" : "{0} mgu lalu", + "future" : "dlm {0} mgu" + }, + "day" : { + "next" : "esok", + "past" : "{0} hari lalu", + "future" : "dlm {0} hari", + "previous" : "semlm", + "current" : "hari ini" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/mt.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/mt.json new file mode 100644 index 0000000..aee1b26 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/mt.json @@ -0,0 +1,170 @@ +{ + "narrow" : { + "now" : "now", + "hour" : { + "future" : "+{0} h", + "current" : "this hour", + "past" : "-{0} h" + }, + "minute" : { + "future" : "+{0} min", + "current" : "this minute", + "past" : "-{0} min" + }, + "second" : { + "future" : "+{0} s", + "past" : "-{0} s", + "current" : "now" + }, + "year" : { + "next" : "Is-sena d-dieħla", + "future" : "+{0} y", + "previous" : "Is-sena li għaddiet", + "current" : "din is-sena", + "past" : { + "one" : "{0} sena ilu", + "other" : "{0} snin ilu" + } + }, + "week" : { + "past" : "-{0} w", + "next" : "Il-ġimgħa d-dieħla", + "future" : "+{0} w", + "previous" : "Il-ġimgħa li għaddiet", + "current" : "Din il-ġimgħa" + }, + "month" : { + "previous" : "Ix-xahar li għadda", + "current" : "Dan ix-xahar", + "next" : "Ix-xahar id-dieħel", + "past" : "-{0} m", + "future" : "+{0} m" + }, + "quarter" : { + "next" : "next quarter", + "past" : "-{0} Q", + "future" : "+{0} Q", + "previous" : "last quarter", + "current" : "this quarter" + }, + "day" : { + "next" : "Għada", + "previous" : "Ilbieraħ", + "past" : "-{0} d", + "future" : "+{0} d", + "current" : "Illum" + } + }, + "long" : { + "quarter" : { + "previous" : "last quarter", + "current" : "this quarter", + "next" : "next quarter", + "past" : "-{0} Q", + "future" : "+{0} Q" + }, + "day" : { + "previous" : "Ilbieraħ", + "past" : "-{0} d", + "future" : "+{0} d", + "current" : "Illum", + "next" : "Għada" + }, + "week" : { + "next" : "Il-ġimgħa d-dieħla", + "past" : "-{0} w", + "future" : "+{0} w", + "previous" : "Il-ġimgħa li għaddiet", + "current" : "Din il-ġimgħa" + }, + "hour" : { + "future" : "+{0} h", + "past" : "-{0} h", + "current" : "this hour" + }, + "second" : { + "future" : "+{0} s", + "current" : "now", + "past" : "-{0} s" + }, + "year" : { + "previous" : "Is-sena li għaddiet", + "past" : { + "one" : "{0} sena ilu", + "other" : "{0} snin ilu" + }, + "next" : "Is-sena d-dieħla", + "future" : "+{0} y", + "current" : "din is-sena" + }, + "month" : { + "next" : "Ix-xahar id-dieħel", + "past" : "-{0} m", + "previous" : "Ix-xahar li għadda", + "current" : "Dan ix-xahar", + "future" : "+{0} m" + }, + "minute" : { + "past" : "-{0} min", + "current" : "this minute", + "future" : "+{0} min" + }, + "now" : "now" + }, + "short" : { + "hour" : { + "past" : "-{0} h", + "future" : "+{0} h", + "current" : "this hour" + }, + "now" : "now", + "quarter" : { + "current" : "this quarter", + "future" : "+{0} Q", + "past" : "-{0} Q", + "next" : "next quarter", + "previous" : "last quarter" + }, + "day" : { + "current" : "Illum", + "past" : "-{0} d", + "future" : "+{0} d", + "next" : "Għada", + "previous" : "Ilbieraħ" + }, + "week" : { + "current" : "Din il-ġimgħa", + "past" : "-{0} w", + "future" : "+{0} w", + "next" : "Il-ġimgħa d-dieħla", + "previous" : "Il-ġimgħa li għaddiet" + }, + "minute" : { + "past" : "-{0} min", + "current" : "this minute", + "future" : "+{0} min" + }, + "second" : { + "current" : "now", + "past" : "-{0} s", + "future" : "+{0} s" + }, + "month" : { + "current" : "Dan ix-xahar", + "future" : "+{0} m", + "previous" : "Ix-xahar li għadda", + "next" : "Ix-xahar id-dieħel", + "past" : "-{0} m" + }, + "year" : { + "future" : "+{0} y", + "previous" : "Is-sena li għaddiet", + "next" : "Is-sena d-dieħla", + "current" : "din is-sena", + "past" : { + "other" : "{0} snin ilu", + "one" : "{0} sena ilu" + } + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/my.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/my.json new file mode 100644 index 0000000..3afada9 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/my.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "quarter" : { + "past" : "ပြီးခဲ့သည့် သုံးလပတ်ကာလ {0} ခုအတွင်း", + "future" : "သုံးလပတ်ကာလ {0} ခုအတွင်း", + "current" : "ယခုသုံးလပတ်", + "previous" : "ပြီးခဲ့သောသုံးလပတ်", + "next" : "နောက်လာမည့်သုံးလပတ်" + }, + "year" : { + "previous" : "ယမန်နှစ်", + "next" : "လာမည့်နှစ်", + "future" : "{0} နှစ်အတွင်း", + "current" : "ယခုနှစ်", + "past" : "ပြီးခဲ့သည့် {0} နှစ်" + }, + "week" : { + "future" : "{0} ပတ်အတွင်း", + "previous" : "ပြီးခဲ့သည့် သီတင်းပတ်", + "next" : "လာမည့် သီတင်းပတ်", + "past" : "ပြီးခဲ့သည့် {0} ပတ်", + "current" : "ယခု သီတင်းပတ်" + }, + "day" : { + "current" : "ယနေ့", + "past" : "ပြီးခဲ့သည့် {0} ရက်", + "next" : "မနက်ဖြန်", + "future" : "{0} ရက်အတွင်း", + "previous" : "မနေ့က" + }, + "hour" : { + "current" : "ဤအချိန်", + "past" : "ပြီးခဲ့သည့် {0} နာရီ", + "future" : "{0} နာရီအတွင်း" + }, + "minute" : { + "future" : "{0} မိနစ်အတွင်း", + "current" : "ဤမိနစ်", + "past" : "ပြီးခဲ့သည့် {0} မိနစ်" + }, + "month" : { + "next" : "လာမည့်လ", + "current" : "ယခုလ", + "past" : "ပြီးခဲ့သည့် {0} လ", + "future" : "{0} လအတွင်း", + "previous" : "ပြီးခဲ့သည့်လ" + }, + "now" : "ယခု", + "second" : { + "future" : "{0} စက္ကန့်အတွင်း", + "current" : "ယခု", + "past" : "ပြီးခဲ့သည့် {0} စက္ကန့်" + } + }, + "short" : { + "minute" : { + "past" : "ပြီးခဲ့သည့် {0} မိနစ်", + "future" : "{0} မိနစ်အတွင်း", + "current" : "ဤမိနစ်" + }, + "week" : { + "current" : "ယခု သီတင်းပတ်", + "past" : "ပြီးခဲ့သည့် {0} ပတ်", + "future" : "{0} ပတ်အတွင်း", + "next" : "လာမည့် သီတင်းပတ်", + "previous" : "ပြီးခဲ့သည့် သီတင်းပတ်" + }, + "year" : { + "current" : "ယခုနှစ်", + "future" : "{0} နှစ်အတွင်း", + "past" : "ပြီးခဲ့သည့် {0} နှစ်", + "next" : "လာမည့်နှစ်", + "previous" : "ယမန်နှစ်" + }, + "day" : { + "next" : "မနက်ဖြန်", + "current" : "ယနေ့", + "previous" : "မနေ့က", + "past" : "ပြီးခဲ့သည့် {0} ရက်", + "future" : "{0} ရက်အတွင်း" + }, + "hour" : { + "future" : "{0} နာရီအတွင်း", + "current" : "ဤအချိန်", + "past" : "ပြီးခဲ့သည့် {0} နာရီ" + }, + "quarter" : { + "current" : "ယခုသုံးလပတ်", + "future" : "သုံးလပတ်ကာလ {0} ခုအတွင်း", + "previous" : "ပြီးခဲ့သောသုံးလပတ်", + "next" : "နောက်လာမည့်သုံးလပတ်", + "past" : "ပြီးခဲ့သည့် သုံးလပတ်ကာလ {0} ခုအတွင်း" + }, + "second" : { + "past" : "ပြီးခဲ့သည့် {0} စက္ကန့်", + "current" : "ယခု", + "future" : "{0} စက္ကန့်အတွင်း" + }, + "month" : { + "current" : "ယခုလ", + "past" : "ပြီးခဲ့သည့် {0} လ", + "future" : "{0} လအတွင်း", + "next" : "လာမည့်လ", + "previous" : "ပြီးခဲ့သည့်လ" + }, + "now" : "ယခု" + }, + "long" : { + "hour" : { + "future" : "{0} နာရီအတွင်း", + "current" : "ဤအချိန်", + "past" : "ပြီးခဲ့သည့် {0} နာရီ" + }, + "day" : { + "next" : "မနက်ဖြန်", + "past" : "ပြီးခဲ့သည့် {0} ရက်", + "previous" : "မနေ့က", + "future" : "{0} ရက်အတွင်း", + "current" : "ယနေ့" + }, + "second" : { + "past" : "ပြီးခဲ့သည့် {0} စက္ကန့်", + "current" : "ယခု", + "future" : "{0} စက္ကန့်အတွင်း" + }, + "week" : { + "future" : "{0} ပတ်အတွင်း", + "past" : "ပြီးခဲ့သည့် {0} ပတ်", + "current" : "ယခု သီတင်းပတ်", + "next" : "လာမည့် သီတင်းပတ်", + "previous" : "ပြီးခဲ့သည့် သီတင်းပတ်" + }, + "minute" : { + "future" : "{0} မိနစ်အတွင်း", + "past" : "ပြီးခဲ့သည့် {0} မိနစ်", + "current" : "ဤမိနစ်" + }, + "month" : { + "future" : "{0} လအတွင်း", + "past" : "ပြီးခဲ့သည့် {0} လ", + "current" : "ယခုလ", + "previous" : "ပြီးခဲ့သည့်လ", + "next" : "လာမည့်လ" + }, + "now" : "ယခု", + "year" : { + "current" : "ယခုနှစ်", + "next" : "လာမည့်နှစ်", + "previous" : "ယမန်နှစ်", + "future" : "{0} နှစ်အတွင်း", + "past" : "ပြီးခဲ့သည့် {0} နှစ်" + }, + "quarter" : { + "future" : "သုံးလပတ်ကာလ {0} အတွင်း", + "previous" : "ပြီးခဲ့သည့် သုံးလပတ်", + "past" : "ပြီးခဲ့သည့် သုံးလပတ်ကာလ {0} ခုအတွင်း", + "next" : "လာမည့် သုံးလပတ်", + "current" : "ယခု သုံးလပတ်" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/mzn.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/mzn.json new file mode 100644 index 0000000..55504bf --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/mzn.json @@ -0,0 +1,161 @@ +{ + "long" : { + "hour" : { + "future" : "{0} ساعِت دله", + "current" : "this hour", + "past" : "{0} ساعِت پیش" + }, + "second" : { + "future" : "{0} ثانیه دله", + "past" : "{0} ثانیه پیش", + "current" : "now" + }, + "week" : { + "next" : "بعدی هفته", + "current" : "این هفته", + "previous" : "قبلی هفته", + "future" : "{0} هفته دله", + "past" : "{0} هفته پیش" + }, + "minute" : { + "past" : "{0} دَقه پیش", + "future" : "{0} دقیقه دله", + "current" : "this minute" + }, + "year" : { + "current" : "امسال", + "past" : "{0} سال پیش", + "future" : "{0} سال دله", + "previous" : "پارسال", + "next" : "سال دیگه" + }, + "quarter" : { + "next" : "next quarter", + "current" : "this quarter", + "future" : "{0} ربع دله", + "previous" : "last quarter", + "past" : "{0} ربع پیش" + }, + "month" : { + "previous" : "ماه قبل", + "future" : "{0} ماه دله", + "current" : "این ماه", + "next" : "ماه ِبعد", + "past" : "{0} ماه پیش" + }, + "day" : { + "next" : "فِردا", + "past" : "{0} روز پیش", + "current" : "اَمروز", + "future" : "{0} روز دله", + "previous" : "دیروز" + }, + "now" : "now" + }, + "narrow" : { + "week" : { + "current" : "این هفته", + "next" : "بعدی هفته", + "past" : "{0} هفته پیش", + "previous" : "قبلی هفته", + "future" : "{0} هفته دله" + }, + "minute" : { + "future" : "{0} دَقه دله", + "past" : "{0} دَقه پیش", + "current" : "this minute" + }, + "month" : { + "current" : "این ماه", + "previous" : "ماه قبل", + "past" : "{0} ماه پیش", + "next" : "ماه ِبعد", + "future" : "{0} ماه دله" + }, + "now" : "now", + "year" : { + "previous" : "پارسال", + "current" : "امسال", + "next" : "سال دیگه", + "past" : "{0} سال پیش", + "future" : "{0} سال دله" + }, + "hour" : { + "current" : "this hour", + "past" : "{0} ساعت پیش", + "future" : "{0} ساعت دله" + }, + "quarter" : { + "previous" : "last quarter", + "current" : "this quarter", + "past" : "{0} ربع پیش", + "future" : "{0} ربع دله", + "next" : "next quarter" + }, + "second" : { + "current" : "now", + "future" : "{0} ثانیه دله", + "past" : "{0} ثانیه پیش" + }, + "day" : { + "past" : "{0} روز پیش", + "current" : "اَمروز", + "future" : "{0} روز دله", + "previous" : "دیروز", + "next" : "فِردا" + } + }, + "short" : { + "month" : { + "current" : "این ماه", + "next" : "ماه ِبعد", + "past" : "{0} ماه پیش", + "future" : "{0} ماه دله", + "previous" : "ماه قبل" + }, + "now" : "now", + "day" : { + "next" : "فِردا", + "current" : "اَمروز", + "previous" : "دیروز", + "past" : "{0} روز پیش", + "future" : "{0} روز دله" + }, + "year" : { + "current" : "امسال", + "future" : "{0} سال دله", + "previous" : "پارسال", + "next" : "سال دیگه", + "past" : "{0} سال پیش" + }, + "hour" : { + "past" : "{0} ساعت پیش", + "current" : "this hour", + "future" : "{0} ساعت دله" + }, + "minute" : { + "past" : "{0} دَقه پیش", + "future" : "{0} دَقه دله", + "current" : "this minute" + }, + "second" : { + "future" : "{0} ثانیه دله", + "current" : "now", + "past" : "{0} ثانیه پیش" + }, + "quarter" : { + "future" : "{0} ربع دله", + "previous" : "last quarter", + "next" : "next quarter", + "past" : "{0} ربع پیش", + "current" : "this quarter" + }, + "week" : { + "next" : "بعدی هفته", + "past" : "{0} هفته پیش", + "current" : "این هفته", + "previous" : "قبلی هفته", + "future" : "{0} هفته دله" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/nb.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/nb.json new file mode 100644 index 0000000..3c4fc9b --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/nb.json @@ -0,0 +1,197 @@ +{ + "narrow" : { + "quarter" : { + "past" : "–{0} kv.", + "future" : "+{0} kv.", + "current" : "dette kv.", + "previous" : "forrige kv.", + "next" : "neste kv." + }, + "year" : { + "previous" : "i fjor", + "next" : "neste år", + "future" : "+{0} år", + "current" : "i år", + "past" : "–{0} år" + }, + "week" : { + "future" : "+{0} u.", + "previous" : "forrige uke", + "next" : "neste uke", + "past" : "-{0} u.", + "current" : "denne uken" + }, + "day" : { + "current" : "i dag", + "past" : "-{0} d.", + "next" : "i morgen", + "future" : "+{0} d.", + "previous" : "i går" + }, + "hour" : { + "current" : "denne timen", + "past" : "-{0} t", + "future" : "+{0} t" + }, + "minute" : { + "future" : "+{0} min", + "current" : "dette minuttet", + "past" : "-{0} min" + }, + "month" : { + "next" : "neste md.", + "current" : "denne md.", + "past" : "-{0} md.", + "future" : "+{0} md.", + "previous" : "forrige md." + }, + "now" : "nå", + "second" : { + "future" : "+{0} s", + "current" : "nå", + "past" : "-{0} s" + } + }, + "long" : { + "month" : { + "next" : "neste måned", + "current" : "denne måneden", + "future" : { + "one" : "om {0} måned", + "other" : "om {0} måneder" + }, + "previous" : "forrige måned", + "past" : { + "one" : "for {0} måned siden", + "other" : "for {0} måneder siden" + } + }, + "hour" : { + "current" : "denne timen", + "future" : { + "one" : "om {0} time", + "other" : "om {0} timer" + }, + "past" : { + "one" : "for {0} time siden", + "other" : "for {0} timer siden" + } + }, + "second" : { + "future" : { + "one" : "om {0} sekund", + "other" : "om {0} sekunder" + }, + "current" : "nå", + "past" : { + "other" : "for {0} sekunder siden", + "one" : "for {0} sekund siden" + } + }, + "week" : { + "previous" : "forrige uke", + "past" : { + "other" : "for {0} uker siden", + "one" : "for {0} uke siden" + }, + "future" : { + "other" : "om {0} uker", + "one" : "om {0} uke" + }, + "current" : "denne uken", + "next" : "neste uke" + }, + "year" : { + "current" : "i år", + "next" : "neste år", + "previous" : "i fjor", + "future" : "om {0} år", + "past" : "for {0} år siden" + }, + "now" : "nå", + "quarter" : { + "future" : { + "one" : "om {0} kvartal", + "other" : "om {0} kvartaler" + }, + "previous" : "forrige kvartal", + "past" : { + "other" : "for {0} kvartaler siden", + "one" : "for {0} kvartal siden" + }, + "next" : "neste kvartal", + "current" : "dette kvartalet" + }, + "day" : { + "previous" : "i går", + "current" : "i dag", + "next" : "i morgen", + "past" : "for {0} døgn siden", + "future" : "om {0} døgn" + }, + "minute" : { + "future" : { + "one" : "om {0} minutt", + "other" : "om {0} minutter" + }, + "past" : { + "one" : "for {0} minutt siden", + "other" : "for {0} minutter siden" + }, + "current" : "dette minuttet" + } + }, + "short" : { + "minute" : { + "past" : "for {0} min siden", + "future" : "om {0} min", + "current" : "dette minuttet" + }, + "week" : { + "current" : "denne uken", + "past" : "for {0} u. siden", + "future" : "om {0} u.", + "next" : "neste uke", + "previous" : "forrige uke" + }, + "year" : { + "current" : "i år", + "future" : "om {0} år", + "past" : "for {0} år siden", + "next" : "neste år", + "previous" : "i fjor" + }, + "day" : { + "next" : "i morgen", + "current" : "i dag", + "previous" : "i går", + "past" : "for {0} d. siden", + "future" : "om {0} d." + }, + "hour" : { + "future" : "om {0} t", + "current" : "denne timen", + "past" : "for {0} t siden" + }, + "quarter" : { + "current" : "dette kv.", + "future" : "om {0} kv.", + "previous" : "forrige kv.", + "next" : "neste kv.", + "past" : "for {0} kv. siden" + }, + "second" : { + "past" : "for {0} sek siden", + "current" : "nå", + "future" : "om {0} sek" + }, + "month" : { + "current" : "denne md.", + "past" : "for {0} md. siden", + "future" : "om {0} md.", + "next" : "neste md.", + "previous" : "forrige md." + }, + "now" : "nå" + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ne.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ne.json new file mode 100644 index 0000000..ac0c0c0 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ne.json @@ -0,0 +1,164 @@ +{ + "narrow" : { + "quarter" : { + "past" : "{0}सत्र अघि", + "future" : "{0}सत्रमा", + "current" : "यो सत्र", + "previous" : "अघिल्लो सत्र", + "next" : "अर्को सत्र" + }, + "year" : { + "previous" : "गत वर्ष", + "next" : "आगामी वर्ष", + "future" : "{0} वर्षमा", + "current" : "यो वर्ष", + "past" : "{0} वर्ष अघि" + }, + "week" : { + "future" : "{0} हप्तामा", + "previous" : "गत हप्ता", + "next" : "आउने हप्ता", + "past" : "{0} हप्ता पहिले", + "current" : "यो हप्ता" + }, + "day" : { + "current" : "आज", + "past" : "{0} दिन पहिले", + "next" : "भोलि", + "future" : "{0} दिनमा", + "previous" : "हिजो" + }, + "hour" : { + "current" : "यस घडीमा", + "past" : "{0} घण्टा पहिले", + "future" : "{0} घण्टामा" + }, + "minute" : { + "future" : "{0} मिनेटमा", + "current" : "यही मिनेटमा", + "past" : "{0} मिनेट पहिले" + }, + "month" : { + "next" : "अर्को महिना", + "current" : "यो महिना", + "past" : "{0} महिना पहिले", + "future" : "{0} महिनामा", + "previous" : "गत महिना" + }, + "now" : "अहिले", + "second" : { + "future" : "{0} सेकेन्डमा", + "current" : "अहिले", + "past" : "{0} सेकेन्ड पहिले" + } + }, + "short" : { + "minute" : { + "past" : "{0} मिनेट पहिले", + "future" : "{0} मिनेटमा", + "current" : "यही मिनेटमा" + }, + "week" : { + "current" : "यो हप्ता", + "past" : "{0} हप्ता पहिले", + "future" : "{0} हप्तामा", + "next" : "आउने हप्ता", + "previous" : "गत हप्ता" + }, + "year" : { + "current" : "यो वर्ष", + "future" : "{0} वर्षमा", + "past" : "{0} वर्ष अघि", + "next" : "आगामी वर्ष", + "previous" : "गत वर्ष" + }, + "day" : { + "next" : "भोलि", + "current" : "आज", + "previous" : "हिजो", + "past" : "{0} दिन पहिले", + "future" : "{0} दिनमा" + }, + "hour" : { + "future" : "{0} घण्टामा", + "current" : "यस घडीमा", + "past" : "{0} घण्टा पहिले" + }, + "quarter" : { + "current" : "यो सत्र", + "future" : "{0}सत्रमा", + "previous" : "अघिल्लो सत्र", + "next" : "अर्को सत्र", + "past" : "{0}सत्र अघि" + }, + "second" : { + "past" : "{0} सेकेन्ड पहिले", + "current" : "अहिले", + "future" : "{0} सेकेन्डमा" + }, + "month" : { + "current" : "यो महिना", + "past" : "{0} महिना पहिले", + "future" : "{0} महिनामा", + "next" : "अर्को महिना", + "previous" : "गत महिना" + }, + "now" : "अहिले" + }, + "long" : { + "week" : { + "current" : "यो हप्ता", + "past" : "{0} हप्ता पहिले", + "next" : "आउने हप्ता", + "previous" : "गत हप्ता", + "future" : "{0} हप्तामा" + }, + "second" : { + "future" : "{0} सेकेन्डमा", + "past" : "{0} सेकेन्ड पहिले", + "current" : "अहिले" + }, + "quarter" : { + "future" : { + "other" : "{0}सत्रमा", + "one" : "+{0} सत्रमा" + }, + "previous" : "अघिल्लो सत्र", + "past" : "{0}सत्र अघि", + "next" : "अर्को सत्र", + "current" : "यो सत्र" + }, + "now" : "अहिले", + "day" : { + "future" : "{0} दिनमा", + "previous" : "हिजो", + "past" : "{0} दिन पहिले", + "next" : "भोलि", + "current" : "आज" + }, + "year" : { + "current" : "यो वर्ष", + "next" : "आगामी वर्ष", + "previous" : "गत वर्ष", + "future" : "{0} वर्षमा", + "past" : "{0} वर्ष अघि" + }, + "hour" : { + "future" : "{0} घण्टामा", + "past" : "{0} घण्टा पहिले", + "current" : "यस घडीमा" + }, + "month" : { + "next" : "अर्को महिना", + "current" : "यो महिना", + "future" : "{0} महिनामा", + "previous" : "गत महिना", + "past" : "{0} महिना पहिले" + }, + "minute" : { + "past" : "{0} मिनेट पहिले", + "current" : "यही मिनेटमा", + "future" : "{0} मिनेटमा" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/nl.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/nl.json new file mode 100644 index 0000000..61964f5 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/nl.json @@ -0,0 +1,245 @@ +{ + "narrow" : { + "minute" : { + "future" : "over {0} min.", + "current" : "binnen een minuut", + "past" : "{0} min. geleden" + }, + "week" : { + "current" : "deze week", + "previous" : "vorige week", + "past" : { + "one" : "{0} week geleden", + "other" : "{0} weken geleden" + }, + "future" : { + "other" : "over {0} weken", + "one" : "over {0} week" + }, + "next" : "volgende week" + }, + "quarter" : { + "previous" : "vorig kwartaal", + "current" : "dit kwartaal", + "past" : { + "other" : "{0} kwartalen geleden", + "one" : "{0} kwartaal geleden" + }, + "next" : "volgend kwartaal", + "future" : { + "one" : "over {0} kw.", + "other" : "over {0} kwartalen" + } + }, + "year" : { + "future" : "over {0} jaar", + "previous" : "vorig jaar", + "current" : "dit jaar", + "next" : "volgend jaar", + "past" : "{0} jaar geleden" + }, + "hour" : { + "current" : "binnen een uur", + "future" : "over {0} uur", + "past" : "{0} uur geleden" + }, + "day" : { + "previous" : "gisteren", + "current" : "vandaag", + "past" : { + "one" : "{0} dag geleden", + "other" : "{0} dgn geleden" + }, + "future" : { + "other" : "over {0} dgn", + "one" : "over {0} dag" + }, + "next" : "morgen" + }, + "second" : { + "past" : "{0} sec. geleden", + "current" : "nu", + "future" : "over {0} sec." + }, + "now" : "nu", + "month" : { + "previous" : "vorige maand", + "current" : "deze maand", + "past" : { + "one" : "{0} maand geleden", + "other" : "{0} maanden geleden" + }, + "future" : { + "one" : "over {0} maand", + "other" : "over {0} maanden" + }, + "next" : "volgende maand" + } + }, + "long" : { + "year" : { + "past" : "{0} jaar geleden", + "future" : "over {0} jaar", + "previous" : "vorig jaar", + "next" : "volgend jaar", + "current" : "dit jaar" + }, + "quarter" : { + "future" : { + "one" : "over {0} kwartaal", + "other" : "over {0} kwartalen" + }, + "current" : "dit kwartaal", + "next" : "volgend kwartaal", + "past" : { + "one" : "{0} kwartaal geleden", + "other" : "{0} kwartalen geleden" + }, + "previous" : "vorig kwartaal" + }, + "hour" : { + "future" : "over {0} uur", + "current" : "binnen een uur", + "past" : "{0} uur geleden" + }, + "month" : { + "past" : { + "one" : "{0} maand geleden", + "other" : "{0} maanden geleden" + }, + "previous" : "vorige maand", + "current" : "deze maand", + "future" : { + "other" : "over {0} maanden", + "one" : "over {0} maand" + }, + "next" : "volgende maand" + }, + "week" : { + "past" : { + "one" : "{0} week geleden", + "other" : "{0} weken geleden" + }, + "previous" : "vorige week", + "next" : "volgende week", + "current" : "deze week", + "future" : { + "other" : "over {0} weken", + "one" : "over {0} week" + } + }, + "day" : { + "previous" : "gisteren", + "current" : "vandaag", + "future" : { + "one" : "over {0} dag", + "other" : "over {0} dagen" + }, + "next" : "morgen", + "past" : { + "other" : "{0} dagen geleden", + "one" : "{0} dag geleden" + } + }, + "minute" : { + "future" : { + "other" : "over {0} minuten", + "one" : "over {0} minuut" + }, + "past" : { + "one" : "{0} minuut geleden", + "other" : "{0} minuten geleden" + }, + "current" : "binnen een minuut" + }, + "now" : "nu", + "second" : { + "current" : "nu", + "future" : { + "other" : "over {0} seconden", + "one" : "over {0} seconde" + }, + "past" : { + "one" : "{0} seconde geleden", + "other" : "{0} seconden geleden" + } + } + }, + "short" : { + "hour" : { + "past" : "{0} uur geleden", + "current" : "binnen een uur", + "future" : "over {0} uur" + }, + "quarter" : { + "current" : "dit kwartaal", + "future" : { + "one" : "over {0} kwartaal", + "other" : "over {0} kwartalen" + }, + "previous" : "vorig kwartaal", + "next" : "volgend kwartaal", + "past" : { + "other" : "{0} kwartalen geleden", + "one" : "{0} kwartaal geleden" + } + }, + "week" : { + "next" : "volgende week", + "current" : "deze week", + "previous" : "vorige week", + "past" : { + "one" : "{0} week geleden", + "other" : "{0} weken geleden" + }, + "future" : { + "one" : "over {0} week", + "other" : "over {0} weken" + } + }, + "year" : { + "future" : "over {0} jaar", + "previous" : "vorig jaar", + "next" : "volgend jaar", + "current" : "dit jaar", + "past" : "{0} jaar geleden" + }, + "minute" : { + "future" : "over {0} min.", + "past" : "{0} min. geleden", + "current" : "binnen een minuut" + }, + "now" : "nu", + "month" : { + "current" : "deze maand", + "past" : { + "one" : "{0} maand geleden", + "other" : "{0} maanden geleden" + }, + "future" : { + "one" : "over {0} maand", + "other" : "over {0} maanden" + }, + "next" : "volgende maand", + "previous" : "vorige maand" + }, + "day" : { + "future" : { + "one" : "over {0} dag", + "other" : "over {0} dgn" + }, + "current" : "vandaag", + "next" : "morgen", + "previous" : "gisteren", + "past" : { + "other" : "{0} dgn geleden", + "one" : "{0} dag geleden" + } + }, + "second" : { + "past" : "{0} sec. geleden", + "current" : "nu", + "future" : "over {0} sec." + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/nn.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/nn.json new file mode 100644 index 0000000..803bab0 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/nn.json @@ -0,0 +1,185 @@ +{ + "narrow" : { + "hour" : { + "future" : "+{0} t", + "current" : "denne timen", + "past" : "–{0} t" + }, + "quarter" : { + "current" : "dette kvartalet", + "previous" : "førre kvartal", + "future" : "+{0} kv.", + "past" : "–{0} kv.", + "next" : "neste kvartal" + }, + "year" : { + "future" : "om {0} år", + "previous" : "i fjor", + "next" : "neste år", + "current" : "i år", + "past" : "for {0} år sidan" + }, + "day" : { + "previous" : "i går", + "future" : "+{0} d.", + "next" : "i morgon", + "current" : "i dag", + "past" : "–{0} d." + }, + "month" : { + "current" : "denne månaden", + "future" : "+{0} md.", + "past" : "–{0} md.", + "next" : "neste månad", + "previous" : "førre månad" + }, + "now" : "no", + "second" : { + "past" : { + "one" : "–{0} s", + "other" : "–{0} s" + }, + "future" : "+{0} s", + "current" : "no" + }, + "minute" : { + "current" : "dette minuttet", + "past" : "–{0} min", + "future" : "+{0} min" + }, + "week" : { + "past" : "–{0} v.", + "previous" : "førre veke", + "future" : "+{0} v.", + "current" : "denne veka", + "next" : "neste veke" + } + }, + "long" : { + "week" : { + "future" : { + "other" : "om {0} veker", + "one" : "om {0} veke" + }, + "past" : { + "one" : "for {0} veke sidan", + "other" : "for {0} veker sidan" + }, + "next" : "neste veke", + "previous" : "førre veke", + "current" : "denne veka" + }, + "day" : { + "future" : "om {0} døgn", + "previous" : "i går", + "current" : "i dag", + "next" : "i morgon", + "past" : "for {0} døgn sidan" + }, + "hour" : { + "past" : { + "one" : "for {0} time sidan", + "other" : "for {0} timar sidan" + }, + "current" : "denne timen", + "future" : { + "one" : "om {0} time", + "other" : "om {0} timar" + } + }, + "minute" : { + "future" : "om {0} minutt", + "current" : "dette minuttet", + "past" : "for {0} minutt sidan" + }, + "now" : "no", + "month" : { + "past" : { + "other" : "for {0} månadar sidan", + "one" : "for {0} månad sidan" + }, + "current" : "denne månaden", + "next" : "neste månad", + "previous" : "førre månad", + "future" : { + "one" : "om {0} månad", + "other" : "om {0} månadar" + } + }, + "quarter" : { + "next" : "neste kvartal", + "past" : "for {0} kvartal sidan", + "future" : "om {0} kvartal", + "previous" : "førre kvartal", + "current" : "dette kvartalet" + }, + "second" : { + "current" : "no", + "past" : "for {0} sekund sidan", + "future" : { + "one" : "om {0} sekund", + "other" : "om {0} sekund" + } + }, + "year" : { + "future" : "om {0} år", + "previous" : "i fjor", + "next" : "neste år", + "past" : "for {0} år sidan", + "current" : "i år" + } + }, + "short" : { + "second" : { + "current" : "no", + "past" : "for {0} sek sidan", + "future" : "om {0} sek" + }, + "now" : "no", + "month" : { + "future" : "om {0} md.", + "current" : "denne månaden", + "past" : "for {0} md. sidan", + "previous" : "førre månad", + "next" : "neste månad" + }, + "day" : { + "previous" : "i går", + "current" : "i dag", + "next" : "i morgon", + "future" : "om {0} d.", + "past" : "for {0} d. sidan" + }, + "minute" : { + "past" : "for {0} min sidan", + "future" : "om {0} min", + "current" : "dette minuttet" + }, + "quarter" : { + "past" : "for {0} kv. sidan", + "previous" : "førre kvartal", + "current" : "dette kvartalet", + "future" : "om {0} kv.", + "next" : "neste kvartal" + }, + "hour" : { + "future" : "om {0} t", + "current" : "denne timen", + "past" : "for {0} t sidan" + }, + "week" : { + "future" : "om {0} v.", + "previous" : "førre veke", + "next" : "neste veke", + "past" : "for {0} v. sidan", + "current" : "denne veka" + }, + "year" : { + "next" : "neste år", + "current" : "i år", + "past" : "for {0} år sidan", + "future" : "om {0} år", + "previous" : "i fjor" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/or.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/or.json new file mode 100644 index 0000000..8260f85 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/or.json @@ -0,0 +1,164 @@ +{ + "narrow" : { + "day" : { + "next" : "ଆସନ୍ତାକାଲି", + "future" : "{0} ଦିନରେ", + "previous" : "ଗତକାଲି", + "current" : "ଆଜି", + "past" : "{0} ଦିନ ପୂର୍ବେ" + }, + "quarter" : { + "next" : "ଆଗାମୀ ତ୍ରୟମାସ", + "past" : "{0} ତ୍ରୟ. ପୂର୍ବେ", + "future" : "{0} ତ୍ରୟ. ରେ", + "previous" : "ଗତ ତ୍ରୟମାସ", + "current" : "ଗତ ତ୍ରୟମାସ" + }, + "hour" : { + "past" : "{0} ଘ. ପୂର୍ବେ", + "future" : "{0} ଘ. ରେ", + "current" : "ଏହି ଘଣ୍ଟା" + }, + "year" : { + "next" : "ଆଗାମୀ ବର୍ଷ", + "past" : "{0} ବ. ପୂର୍ବେ", + "current" : "ଏହି ବର୍ଷ", + "previous" : "ଗତ ବର୍ଷ", + "future" : "{0} ବ. ରେ" + }, + "now" : "ବର୍ତ୍ତମାନ", + "month" : { + "current" : "ଏହି ମାସ", + "future" : "{0} ମା. ରେ", + "past" : "{0} ମା. ପୂର୍ବେ", + "next" : "ଆଗାମୀ ମାସ", + "previous" : "ଗତ ମାସ" + }, + "week" : { + "previous" : "ଗତ ସପ୍ତାହ", + "current" : "ଏହି ସପ୍ତାହ", + "past" : "{0} ସପ୍ତା. ପୂର୍ବେ", + "future" : "{0} ସପ୍ତା. ରେ", + "next" : "ଆଗାମୀ ସପ୍ତାହ" + }, + "minute" : { + "future" : "{0} ମି. ରେ", + "current" : "ଏହି ମିନିଟ୍", + "past" : "{0} ମି. ପୂର୍ବେ" + }, + "second" : { + "past" : "{0} ସେ. ପୂର୍ବେ", + "future" : "{0} ସେ. ରେ", + "current" : "ବର୍ତ୍ତମାନ" + } + }, + "long" : { + "now" : "ବର୍ତ୍ତମାନ", + "hour" : { + "current" : "ଏହି ଘଣ୍ଟା", + "past" : "{0} ଘଣ୍ଟା ପୂର୍ବେ", + "future" : "{0} ଘଣ୍ଟାରେ" + }, + "quarter" : { + "past" : "{0} ତ୍ରୟମାସ ପୂର୍ବେ", + "current" : "ଗତ ତ୍ରୟମାସ", + "previous" : "ଗତ ତ୍ରୟମାସ", + "future" : "{0} ତ୍ରୟମାସରେ", + "next" : "ଆଗାମୀ ତ୍ରୟମାସ" + }, + "second" : { + "current" : "ବର୍ତ୍ତମାନ", + "past" : "{0} ସେକେଣ୍ଡ ପୂର୍ବେ", + "future" : "{0} ସେକେଣ୍ଡରେ" + }, + "month" : { + "future" : "{0} ମାସରେ", + "next" : "ଆଗାମୀ ମାସ", + "previous" : "ଗତ ମାସ", + "current" : "ଏହି ମାସ", + "past" : "{0} ମାସ ପୂର୍ବେ" + }, + "minute" : { + "future" : "{0} ମିନିଟ୍‌‌ରେ", + "current" : "ଏହି ମିନିଟ୍", + "past" : "{0} ମିନିଟ୍ ପୂର୍ବେ" + }, + "day" : { + "next" : "ଆସନ୍ତାକାଲି", + "current" : "ଆଜି", + "future" : "{0} ଦିନରେ", + "previous" : "ଗତକାଲି", + "past" : "{0} ଦିନ ପୂର୍ବେ" + }, + "week" : { + "future" : "{0} ସପ୍ତାହରେ", + "current" : "ଏହି ସପ୍ତାହ", + "next" : "ଆଗାମୀ ସପ୍ତାହ", + "past" : { + "other" : "{0} ସପ୍ତାହ ପୂର୍ବେ", + "one" : "{0} ସପ୍ତାହରେ" + }, + "previous" : "ଗତ ସପ୍ତାହ" + }, + "year" : { + "past" : "{0} ବର୍ଷ ପୂର୍ବେ", + "future" : "{0} ବର୍ଷରେ", + "previous" : "ଗତ ବର୍ଷ", + "next" : "ଆଗାମୀ ବର୍ଷ", + "current" : "ଏହି ବର୍ଷ" + } + }, + "short" : { + "quarter" : { + "future" : "{0} ତ୍ରୟ. ରେ", + "next" : "ଆଗାମୀ ତ୍ରୟମାସ", + "previous" : "ଗତ ତ୍ରୟମାସ", + "current" : "ଗତ ତ୍ରୟମାସ", + "past" : "{0} ତ୍ରୟ. ପୂର୍ବେ" + }, + "minute" : { + "future" : "{0} ମି. ରେ", + "current" : "ଏହି ମିନିଟ୍", + "past" : "{0} ମି. ପୂର୍ବେ" + }, + "year" : { + "next" : "ଆଗାମୀ ବର୍ଷ", + "future" : "{0} ବ. ରେ", + "current" : "ଏହି ବର୍ଷ", + "past" : "{0} ବ. ପୂର୍ବେ", + "previous" : "ଗତ ବର୍ଷ" + }, + "second" : { + "future" : "{0} ସେ. ରେ", + "current" : "ବର୍ତ୍ତମାନ", + "past" : "{0} ସେ. ପୂର୍ବେ" + }, + "hour" : { + "past" : "{0} ଘ. ପୂର୍ବେ", + "current" : "ଏହି ଘଣ୍ଟା", + "future" : "{0} ଘ. ରେ" + }, + "now" : "ବର୍ତ୍ତମାନ", + "month" : { + "previous" : "ଗତ ମାସ", + "next" : "ଆଗାମୀ ମାସ", + "past" : "{0} ମା. ପୂର୍ବେ", + "current" : "ଏହି ମାସ", + "future" : "{0} ମା. ରେ" + }, + "week" : { + "previous" : "ଗତ ସପ୍ତାହ", + "current" : "ଏହି ସପ୍ତାହ", + "next" : "ଆଗାମୀ ସପ୍ତାହ", + "past" : "{0} ସପ୍ତା. ପୂର୍ବେ", + "future" : "{0} ସପ୍ତା. ରେ" + }, + "day" : { + "next" : "ଆସନ୍ତାକାଲି", + "past" : "{0} ଦିନ ପୂର୍ବେ", + "future" : "{0} ଦିନରେ", + "previous" : "ଗତକାଲି", + "current" : "ଆଜି" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/pa.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/pa.json new file mode 100644 index 0000000..f551582 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/pa.json @@ -0,0 +1,263 @@ +{ + "narrow" : { + "quarter" : { + "past" : "{0} ਤਿਮਾਹੀਆਂ ਪਹਿਲਾਂ", + "current" : "ਇਹ ਤਿਮਾਹੀ", + "next" : "ਅਗਲੀ ਤਿਮਾਹੀ", + "future" : "{0} ਤਿਮਾਹੀਆਂ ਵਿੱਚ", + "previous" : "ਪਿਛਲੀ ਤਿਮਾਹੀ" + }, + "week" : { + "next" : "ਅਗਲਾ ਹਫ਼ਤਾ", + "future" : { + "other" : "{0} ਹਫ਼ਤਿਆਂ ਵਿੱਚ", + "one" : "{0} ਹਫ਼ਤੇ ਵਿੱਚ" + }, + "previous" : "ਪਿਛਲਾ ਹਫ਼ਤਾ", + "current" : "ਇਹ ਹਫ਼ਤਾ", + "past" : { + "one" : "{0} ਹਫ਼ਤਾ ਪਹਿਲਾਂ", + "other" : "{0} ਹਫ਼ਤੇ ਪਹਿਲਾਂ" + } + }, + "hour" : { + "current" : "ਇਸ ਘੰਟੇ", + "past" : { + "one" : "{0} ਘੰਟਾ ਪਹਿਲਾਂ", + "other" : "{0} ਘੰਟੇ ਪਹਿਲਾਂ" + }, + "future" : { + "other" : "{0} ਘੰਟਿਆਂ ਵਿੱਚ", + "one" : "{0} ਘੰਟੇ ਵਿੱਚ" + } + }, + "now" : "ਹੁਣ", + "day" : { + "past" : "{0} ਦਿਨ ਪਹਿਲਾਂ", + "future" : { + "one" : "{0} ਦਿਨ ਵਿੱਚ", + "other" : "{0} ਦਿਨਾਂ ਵਿੱਚ" + }, + "previous" : "ਬੀਤਿਆ ਕੱਲ੍ਹ", + "current" : "ਅੱਜ", + "next" : "ਭਲਕੇ" + }, + "minute" : { + "current" : "ਇਸ ਮਿੰਟ", + "past" : "{0} ਮਿੰਟ ਪਹਿਲਾਂ", + "future" : { + "one" : "{0} ਮਿੰਟ ਵਿੱਚ", + "other" : "{0} ਮਿੰਟਾਂ ਵਿੱਚ" + } + }, + "month" : { + "current" : "ਇਹ ਮਹੀਨਾ", + "future" : { + "one" : "{0} ਮਹੀਨੇ ਵਿੱਚ", + "other" : "{0} ਮਹੀਨਿਆਂ ਵਿੱਚ" + }, + "past" : { + "other" : "{0} ਮਹੀਨੇ ਪਹਿਲਾਂ", + "one" : "{0} ਮਹੀਨਾ ਪਹਿਲਾਂ" + }, + "next" : "ਅਗਲਾ ਮਹੀਨਾ", + "previous" : "ਪਿਛਲਾ ਮਹੀਨਾ" + }, + "year" : { + "past" : "{0} ਸਾਲ ਪਹਿਲਾਂ", + "future" : { + "one" : "{0} ਸਾਲ ਵਿੱਚ", + "other" : "{0} ਸਾਲਾਂ ਵਿੱਚ" + }, + "next" : "ਅਗਲਾ ਸਾਲ", + "current" : "ਇਹ ਸਾਲ", + "previous" : "ਪਿਛਲਾ ਸਾਲ" + }, + "second" : { + "future" : { + "other" : "{0} ਸਕਿੰਟਾਂ ਵਿੱਚ", + "one" : "{0} ਸਕਿੰਟ ਵਿੱਚ" + }, + "current" : "ਹੁਣ", + "past" : "{0} ਸਕਿੰਟ ਪਹਿਲਾਂ" + } + }, + "long" : { + "hour" : { + "current" : "ਇਸ ਘੰਟੇ", + "past" : { + "one" : "{0} ਘੰਟਾ ਪਹਿਲਾਂ", + "other" : "{0} ਘੰਟੇ ਪਹਿਲਾਂ" + }, + "future" : { + "other" : "{0} ਘੰਟਿਆਂ ਵਿੱਚ", + "one" : "{0} ਘੰਟੇ ਵਿੱਚ" + } + }, + "now" : "ਹੁਣ", + "quarter" : { + "previous" : "ਪਿਛਲੀ ਤਿਮਾਹੀ", + "future" : { + "other" : "{0} ਤਿਮਾਹੀਆਂ ਵਿੱਚ", + "one" : "{0} ਤਿਮਾਹੀ ਵਿੱਚ" + }, + "next" : "ਅਗਲੀ ਤਿਮਾਹੀ", + "past" : { + "one" : "{0} ਤਿਮਾਹੀ ਪਹਿਲਾਂ", + "other" : "{0} ਤਿਮਾਹੀਆਂ ਪਹਿਲਾਂ" + }, + "current" : "ਇਸ ਤਿਮਾਹੀ" + }, + "day" : { + "future" : { + "other" : "{0} ਦਿਨਾਂ ਵਿੱਚ", + "one" : "{0} ਦਿਨ ਵਿੱਚ" + }, + "current" : "ਅੱਜ", + "past" : "{0} ਦਿਨ ਪਹਿਲਾਂ", + "previous" : "ਬੀਤਿਆ ਕੱਲ੍ਹ", + "next" : "ਭਲਕੇ" + }, + "week" : { + "previous" : "ਪਿਛਲਾ ਹਫ਼ਤਾ", + "past" : { + "one" : "{0} ਹਫ਼ਤਾ ਪਹਿਲਾਂ", + "other" : "{0} ਹਫ਼ਤੇ ਪਹਿਲਾਂ" + }, + "current" : "ਇਹ ਹਫ਼ਤਾ", + "next" : "ਅਗਲਾ ਹਫ਼ਤਾ", + "future" : { + "one" : "{0} ਹਫ਼ਤੇ ਵਿੱਚ", + "other" : "{0} ਹਫ਼ਤਿਆਂ ਵਿੱਚ" + } + }, + "minute" : { + "past" : "{0} ਮਿੰਟ ਪਹਿਲਾਂ", + "current" : "ਇਸ ਮਿੰਟ", + "future" : { + "other" : "{0} ਮਿੰਟਾਂ ਵਿੱਚ", + "one" : "{0} ਮਿੰਟ ਵਿੱਚ" + } + }, + "second" : { + "past" : "{0} ਸਕਿੰਟ ਪਹਿਲਾਂ", + "future" : { + "other" : "{0} ਸਕਿੰਟਾਂ ਵਿੱਚ", + "one" : "{0} ਸਕਿੰਟ ਵਿੱਚ" + }, + "current" : "ਹੁਣ" + }, + "month" : { + "past" : { + "other" : "{0} ਮਹੀਨੇ ਪਹਿਲਾਂ", + "one" : "{0} ਮਹੀਨਾ ਪਹਿਲਾਂ" + }, + "next" : "ਅਗਲਾ ਮਹੀਨਾ", + "future" : { + "one" : "{0} ਮਹੀਨੇ ਵਿੱਚ", + "other" : "{0} ਮਹੀਨਿਆਂ ਵਿੱਚ" + }, + "previous" : "ਪਿਛਲਾ ਮਹੀਨਾ", + "current" : "ਇਹ ਮਹੀਨਾ" + }, + "year" : { + "current" : "ਇਹ ਸਾਲ", + "future" : { + "other" : "{0} ਸਾਲਾਂ ਵਿੱਚ", + "one" : "{0} ਸਾਲ ਵਿੱਚ" + }, + "previous" : "ਪਿਛਲਾ ਸਾਲ", + "next" : "ਅਗਲਾ ਸਾਲ", + "past" : "{0} ਸਾਲ ਪਹਿਲਾਂ" + } + }, + "short" : { + "month" : { + "next" : "ਅਗਲਾ ਮਹੀਨਾ", + "current" : "ਇਹ ਮਹੀਨਾ", + "previous" : "ਪਿਛਲਾ ਮਹੀਨਾ", + "past" : { + "one" : "{0} ਮਹੀਨਾ ਪਹਿਲਾਂ", + "other" : "{0} ਮਹੀਨੇ ਪਹਿਲਾਂ" + }, + "future" : { + "other" : "{0} ਮਹੀਨਿਆਂ ਵਿੱਚ", + "one" : "{0} ਮਹੀਨੇ ਵਿੱਚ" + } + }, + "now" : "ਹੁਣ", + "week" : { + "previous" : "ਪਿਛਲਾ ਹਫ਼ਤਾ", + "current" : "ਇਹ ਹਫ਼ਤਾ", + "past" : { + "one" : "{0} ਹਫ਼ਤਾ ਪਹਿਲਾਂ", + "other" : "{0} ਹਫ਼ਤੇ ਪਹਿਲਾਂ" + }, + "future" : { + "one" : "{0} ਹਫ਼ਤੇ ਵਿੱਚ", + "other" : "{0} ਹਫ਼ਤਿਆਂ ਵਿੱਚ" + }, + "next" : "ਅਗਲਾ ਹਫ਼ਤਾ" + }, + "day" : { + "future" : { + "other" : "{0} ਦਿਨਾਂ ਵਿੱਚ", + "one" : "{0} ਦਿਨ ਵਿੱਚ" + }, + "previous" : "ਬੀਤਿਆ ਕੱਲ੍ਹ", + "current" : "ਅੱਜ", + "next" : "ਭਲਕੇ", + "past" : "{0} ਦਿਨ ਪਹਿਲਾਂ" + }, + "year" : { + "previous" : "ਪਿਛਲਾ ਸਾਲ", + "current" : "ਇਹ ਸਾਲ", + "next" : "ਅਗਲਾ ਸਾਲ", + "past" : "{0} ਸਾਲ ਪਹਿਲਾਂ", + "future" : { + "other" : "{0} ਸਾਲਾਂ ਵਿੱਚ", + "one" : "{0} ਸਾਲ ਵਿੱਚ" + } + }, + "hour" : { + "past" : { + "other" : "{0} ਘੰਟੇ ਪਹਿਲਾਂ", + "one" : "{0} ਘੰਟਾ ਪਹਿਲਾਂ" + }, + "future" : { + "one" : "{0} ਘੰਟੇ ਵਿੱਚ", + "other" : "{0} ਘੰਟਿਆਂ ਵਿੱਚ" + }, + "current" : "ਇਸ ਘੰਟੇ" + }, + "minute" : { + "current" : "ਇਸ ਮਿੰਟ", + "past" : "{0} ਮਿੰਟ ਪਹਿਲਾਂ", + "future" : { + "one" : "{0} ਮਿੰਟ ਵਿੱਚ", + "other" : "{0} ਮਿੰਟਾਂ ਵਿੱਚ" + } + }, + "second" : { + "future" : { + "one" : "{0} ਸਕਿੰਟ ਵਿੱਚ", + "other" : "{0} ਸਕਿੰਟਾਂ ਵਿੱਚ" + }, + "past" : "{0} ਸਕਿੰਟ ਪਹਿਲਾਂ", + "current" : "ਹੁਣ" + }, + "quarter" : { + "next" : "ਅਗਲੀ ਤਿਮਾਹੀ", + "past" : { + "one" : "{0} ਤਿਮਾਹੀ ਪਹਿਲਾਂ", + "other" : "{0} ਤਿਮਾਹੀਆਂ ਪਹਿਲਾਂ" + }, + "current" : "ਇਹ ਤਿਮਾਹੀ", + "previous" : "ਪਿਛਲੀ ਤਿਮਾਹੀ", + "future" : { + "one" : "{0} ਤਿਮਾਹੀ ਵਿੱਚ", + "other" : "{0} ਤਿਮਾਹੀਆਂ ਵਿੱਚ" + } + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/pl.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/pl.json new file mode 100644 index 0000000..d7652c0 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/pl.json @@ -0,0 +1,287 @@ +{ + "narrow" : { + "day" : { + "previous" : "wczoraj", + "current" : "dzisiaj", + "next" : "jutro", + "past" : { + "many" : "{0} dni temu", + "few" : "{0} dni temu", + "one" : "{0} dzień temu", + "other" : "{0} dnia temu" + }, + "future" : { + "few" : "za {0} dni", + "many" : "za {0} dni", + "other" : "za {0} dnia", + "one" : "za {0} dzień" + } + }, + "hour" : { + "future" : "za {0} g.", + "past" : "{0} g. temu", + "current" : "ta godzina" + }, + "now" : "teraz", + "week" : { + "current" : "w tym tygodniu", + "previous" : "w zeszłym tygodniu", + "past" : { + "one" : "{0} tydz. temu", + "other" : "{0} tyg. temu" + }, + "future" : { + "other" : "za {0} tyg.", + "one" : "za {0} tydz." + }, + "next" : "w przyszłym tygodniu" + }, + "month" : { + "next" : "w przyszłym miesiącu", + "previous" : "w zeszłym miesiącu", + "current" : "w tym miesiącu", + "future" : "za {0} mies.", + "past" : "{0} mies. temu" + }, + "year" : { + "previous" : "w zeszłym roku", + "future" : { + "few" : "za {0} lata", + "one" : "za {0} rok", + "many" : "za {0} lat", + "other" : "za {0} roku" + }, + "next" : "w przyszłym roku", + "current" : "w tym roku", + "past" : { + "one" : "{0} rok temu", + "other" : "{0} roku temu", + "few" : "{0} lata temu", + "many" : "{0} lat temu" + } + }, + "quarter" : { + "current" : "w tym kwartale", + "future" : "za {0} kw.", + "previous" : "w zeszłym kwartale", + "next" : "w przyszłym kwartale", + "past" : "{0} kw. temu" + }, + "minute" : { + "past" : "{0} min temu", + "current" : "ta minuta", + "future" : "za {0} min" + }, + "second" : { + "future" : "za {0} s", + "past" : "{0} s temu", + "current" : "teraz" + } + }, + "long" : { + "week" : { + "future" : { + "other" : "za {0} tygodnia", + "one" : "za {0} tydzień", + "few" : "za {0} tygodnie", + "many" : "za {0} tygodni" + }, + "current" : "w tym tygodniu", + "past" : { + "few" : "{0} tygodnie temu", + "one" : "{0} tydzień temu", + "other" : "{0} tygodnia temu", + "many" : "{0} tygodni temu" + }, + "previous" : "w zeszłym tygodniu", + "next" : "w przyszłym tygodniu" + }, + "quarter" : { + "current" : "w tym kwartale", + "next" : "w przyszłym kwartale", + "future" : { + "other" : "za {0} kwartału", + "many" : "za {0} kwartałów", + "few" : "za {0} kwartały", + "one" : "za {0} kwartał" + }, + "previous" : "w zeszłym kwartale", + "past" : { + "one" : "{0} kwartał temu", + "many" : "{0} kwartałów temu", + "few" : "{0} kwartały temu", + "other" : "{0} kwartału temu" + } + }, + "second" : { + "future" : { + "one" : "za {0} sekundę", + "many" : "za {0} sekund", + "other" : "za {0} sekundy" + }, + "current" : "teraz", + "past" : { + "one" : "{0} sekundę temu", + "many" : "{0} sekund temu", + "other" : "{0} sekundy temu" + } + }, + "year" : { + "past" : { + "many" : "{0} lat temu", + "few" : "{0} lata temu", + "one" : "{0} rok temu", + "other" : "{0} roku temu" + }, + "previous" : "w zeszłym roku", + "future" : { + "one" : "za {0} rok", + "other" : "za {0} roku", + "few" : "za {0} lata", + "many" : "za {0} lat" + }, + "current" : "w tym roku", + "next" : "w przyszłym roku" + }, + "now" : "teraz", + "hour" : { + "past" : { + "other" : "{0} godziny temu", + "many" : "{0} godzin temu", + "one" : "{0} godzinę temu" + }, + "future" : { + "many" : "za {0} godzin", + "other" : "za {0} godziny", + "one" : "za {0} godzinę" + }, + "current" : "ta godzina" + }, + "day" : { + "previous" : "wczoraj", + "next" : "jutro", + "past" : { + "one" : "{0} dzień temu", + "many" : "{0} dni temu", + "other" : "{0} dnia temu", + "few" : "{0} dni temu" + }, + "current" : "dzisiaj", + "future" : { + "many" : "za {0} dni", + "one" : "za {0} dzień", + "few" : "za {0} dni", + "other" : "za {0} dnia" + } + }, + "minute" : { + "future" : { + "one" : "za {0} minutę", + "many" : "za {0} minut", + "other" : "za {0} minuty" + }, + "past" : { + "one" : "{0} minutę temu", + "other" : "{0} minuty temu", + "many" : "{0} minut temu" + }, + "current" : "ta minuta" + }, + "month" : { + "past" : { + "few" : "{0} miesiące temu", + "one" : "{0} miesiąc temu", + "many" : "{0} miesięcy temu", + "other" : "{0} miesiąca temu" + }, + "previous" : "w zeszłym miesiącu", + "next" : "w przyszłym miesiącu", + "future" : { + "few" : "za {0} miesiące", + "many" : "za {0} miesięcy", + "other" : "za {0} miesiąca", + "one" : "za {0} miesiąc" + }, + "current" : "w tym miesiącu" + } + }, + "short" : { + "minute" : { + "current" : "ta minuta", + "past" : "{0} min temu", + "future" : "za {0} min" + }, + "year" : { + "current" : "w tym roku", + "past" : { + "one" : "{0} rok temu", + "other" : "{0} roku temu", + "many" : "{0} lat temu", + "few" : "{0} lata temu" + }, + "future" : { + "few" : "za {0} lata", + "one" : "za {0} rok", + "many" : "za {0} lat", + "other" : "za {0} roku" + }, + "next" : "w przyszłym roku", + "previous" : "w zeszłym roku" + }, + "day" : { + "past" : { + "other" : "{0} dnia temu", + "one" : "{0} dzień temu", + "many" : "{0} dni temu", + "few" : "{0} dni temu" + }, + "current" : "dzisiaj", + "future" : { + "few" : "za {0} dni", + "other" : "za {0} dnia", + "one" : "za {0} dzień", + "many" : "za {0} dni" + }, + "next" : "jutro", + "previous" : "wczoraj" + }, + "hour" : { + "past" : "{0} godz. temu", + "current" : "ta godzina", + "future" : "za {0} godz." + }, + "quarter" : { + "future" : "za {0} kw.", + "previous" : "w zeszłym kwartale", + "current" : "w tym kwartale", + "next" : "w przyszłym kwartale", + "past" : "{0} kw. temu" + }, + "second" : { + "future" : "za {0} sek.", + "current" : "teraz", + "past" : "{0} sek. temu" + }, + "now" : "teraz", + "month" : { + "next" : "w przyszłym miesiącu", + "current" : "w tym miesiącu", + "previous" : "w zeszłym miesiącu", + "past" : "{0} mies. temu", + "future" : "za {0} mies." + }, + "week" : { + "next" : "w przyszłym tygodniu", + "past" : { + "other" : "{0} tyg. temu", + "one" : "{0} tydz. temu" + }, + "previous" : "w zeszłym tygodniu", + "current" : "w tym tygodniu", + "future" : { + "one" : "za {0} tydz.", + "other" : "za {0} tyg." + } + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ps.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ps.json new file mode 100644 index 0000000..8aaf08c --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ps.json @@ -0,0 +1,179 @@ +{ + "short" : { + "month" : { + "future" : "+{0} m", + "previous" : "last month", + "current" : "this month", + "next" : "next month", + "past" : "-{0} m" + }, + "week" : { + "previous" : "last week", + "current" : "this week", + "future" : "+{0} w", + "past" : "-{0} w", + "next" : "next week" + }, + "hour" : { + "past" : "-{0} h", + "current" : "this hour", + "future" : "+{0} h" + }, + "quarter" : { + "future" : "+{0} Q", + "previous" : "last quarter", + "current" : "this quarter", + "next" : "next quarter", + "past" : "-{0} Q" + }, + "minute" : { + "future" : "+{0} min", + "current" : "this minute", + "past" : "-{0} min" + }, + "now" : "now", + "day" : { + "past" : "-{0} d", + "previous" : "yesterday", + "current" : "today", + "next" : "tomorrow", + "future" : "+{0} d" + }, + "year" : { + "previous" : "پروسږکال", + "next" : "بل کال", + "current" : "سږکال", + "future" : { + "other" : "په {0} کالونو کې", + "one" : "په {0} کال کې" + }, + "past" : { + "one" : "{0} کال مخکې", + "other" : "{0} کاله مخکې" + } + }, + "second" : { + "past" : "-{0} s", + "future" : "+{0} s", + "current" : "now" + } + }, + "narrow" : { + "day" : { + "future" : "+{0} d", + "previous" : "yesterday", + "current" : "today", + "next" : "tomorrow", + "past" : "-{0} d" + }, + "second" : { + "current" : "now", + "past" : "-{0} s", + "future" : "+{0} s" + }, + "hour" : { + "future" : "+{0} h", + "current" : "this hour", + "past" : "-{0} h" + }, + "quarter" : { + "previous" : "last quarter", + "next" : "next quarter", + "past" : "-{0} Q", + "future" : "+{0} Q", + "current" : "this quarter" + }, + "minute" : { + "past" : "-{0} min", + "future" : "+{0} min", + "current" : "this minute" + }, + "year" : { + "current" : "سږکال", + "past" : { + "one" : "{0} کال مخکې", + "other" : "{0} کاله مخکې" + }, + "future" : { + "one" : "په {0} کال کې", + "other" : "په {0} کالونو کې" + }, + "next" : "بل کال", + "previous" : "پروسږکال" + }, + "now" : "now", + "week" : { + "current" : "this week", + "past" : "-{0} w", + "future" : "+{0} w", + "next" : "next week", + "previous" : "last week" + }, + "month" : { + "previous" : "last month", + "current" : "this month", + "next" : "next month", + "future" : "+{0} m", + "past" : "-{0} m" + } + }, + "long" : { + "quarter" : { + "next" : "next quarter", + "current" : "this quarter", + "future" : "+{0} Q", + "past" : "-{0} Q", + "previous" : "last quarter" + }, + "week" : { + "next" : "next week", + "current" : "this week", + "past" : "-{0} w", + "previous" : "last week", + "future" : "+{0} w" + }, + "year" : { + "next" : "بل کال", + "past" : { + "other" : "{0} کاله مخکې", + "one" : "{0} کال مخکې" + }, + "future" : { + "other" : "په {0} کالونو کې", + "one" : "په {0} کال کې" + }, + "current" : "سږکال", + "previous" : "پروسږکال" + }, + "hour" : { + "current" : "this hour", + "future" : "+{0} h", + "past" : "-{0} h" + }, + "minute" : { + "past" : "-{0} min", + "future" : "+{0} min", + "current" : "this minute" + }, + "second" : { + "current" : "now", + "past" : "-{0} s", + "future" : "+{0} s" + }, + "day" : { + "previous" : "yesterday", + "current" : "today", + "next" : "tomorrow", + "past" : "-{0} d", + "future" : "+{0} d" + }, + "now" : "now", + "month" : { + "current" : "this month", + "future" : "+{0} m", + "next" : "next month", + "previous" : "last month", + "past" : "-{0} m" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/pt.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/pt.json new file mode 100644 index 0000000..c33f159 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/pt.json @@ -0,0 +1,242 @@ +{ + "narrow" : { + "minute" : { + "future" : "+{0} min", + "past" : "-{0} min", + "current" : "este minuto" + }, + "second" : { + "future" : "+{0} s", + "current" : "agora", + "past" : "-{0} s" + }, + "now" : "agora", + "day" : { + "next" : "amanhã", + "previous" : "ontem", + "past" : "há {0} dias", + "current" : "hoje", + "future" : { + "other" : "+{0} dias", + "one" : "+{0} dia" + } + }, + "month" : { + "previous" : "mês passado", + "next" : "próximo mês", + "current" : "este mês", + "future" : { + "one" : "+{0} mês", + "other" : "+{0} meses" + }, + "past" : { + "one" : "-{0} mês", + "other" : "-{0} meses" + } + }, + "quarter" : { + "next" : "próximo trim.", + "past" : "-{0} trim.", + "future" : "+{0} trim.", + "previous" : "trim. passado", + "current" : "este trim." + }, + "week" : { + "previous" : "semana passada", + "next" : "próxima semana", + "future" : "+{0} sem.", + "current" : "esta semana", + "past" : "-{0} sem." + }, + "hour" : { + "current" : "esta hora", + "past" : "-{0} h", + "future" : "+{0} h" + }, + "year" : { + "past" : { + "one" : "-{0} ano", + "other" : "-{0} anos" + }, + "next" : "próximo ano", + "previous" : "ano passado", + "current" : "este ano", + "future" : { + "other" : "+{0} anos", + "one" : "+{0} ano" + } + } + }, + "long" : { + "year" : { + "previous" : "ano passado", + "current" : "este ano", + "next" : "próximo ano", + "past" : { + "one" : "há {0} ano", + "other" : "há {0} anos" + }, + "future" : { + "one" : "dentro de {0} ano", + "other" : "dentro de {0} anos" + } + }, + "month" : { + "previous" : "mês passado", + "current" : "este mês", + "next" : "próximo mês", + "past" : { + "other" : "há {0} meses", + "one" : "há {0} mês" + }, + "future" : { + "other" : "dentro de {0} meses", + "one" : "dentro de {0} mês" + } + }, + "day" : { + "previous" : "ontem", + "current" : "hoje", + "future" : { + "one" : "dentro de {0} dia", + "other" : "dentro de {0} dias" + }, + "next" : "amanhã", + "past" : { + "one" : "há {0} dia", + "other" : "há {0} dias" + } + }, + "hour" : { + "past" : { + "other" : "há {0} horas", + "one" : "há {0} hora" + }, + "current" : "esta hora", + "future" : { + "other" : "dentro de {0} horas", + "one" : "dentro de {0} hora" + } + }, + "now" : "agora", + "minute" : { + "current" : "este minuto", + "past" : { + "one" : "há {0} minuto", + "other" : "há {0} minutos" + }, + "future" : { + "one" : "dentro de {0} minuto", + "other" : "dentro de {0} minutos" + } + }, + "second" : { + "past" : { + "one" : "há {0} segundo", + "other" : "há {0} segundos" + }, + "current" : "agora", + "future" : { + "one" : "dentro de {0} segundo", + "other" : "dentro de {0} segundos" + } + }, + "quarter" : { + "next" : "próximo trimestre", + "future" : { + "other" : "dentro de {0} trimestres", + "one" : "dentro de {0} trimestre" + }, + "past" : { + "one" : "há {0} trimestre", + "other" : "há {0} trimestres" + }, + "current" : "este trimestre", + "previous" : "trimestre passado" + }, + "week" : { + "past" : { + "other" : "há {0} semanas", + "one" : "há {0} semana" + }, + "current" : "esta semana", + "previous" : "semana passada", + "next" : "próxima semana", + "future" : { + "one" : "dentro de {0} semana", + "other" : "dentro de {0} semanas" + } + } + }, + "short" : { + "year" : { + "past" : { + "one" : "há {0} ano", + "other" : "há {0} anos" + }, + "future" : { + "one" : "dentro de {0} ano", + "other" : "dentro de {0} anos" + }, + "previous" : "ano passado", + "current" : "este ano", + "next" : "próximo ano" + }, + "day" : { + "next" : "amanhã", + "current" : "hoje", + "previous" : "ontem", + "future" : { + "other" : "dentro de {0} dias", + "one" : "dentro de {0} dia" + }, + "past" : { + "other" : "há {0} dias", + "one" : "há {0} dia" + } + }, + "minute" : { + "current" : "este minuto", + "past" : "há {0} min", + "future" : "dentro de {0} min" + }, + "hour" : { + "past" : "há {0} h", + "future" : "dentro de {0} h", + "current" : "esta hora" + }, + "quarter" : { + "previous" : "trim. passado", + "future" : "dentro de {0} trim.", + "next" : "próximo trim.", + "past" : "há {0} trim.", + "current" : "este trim." + }, + "second" : { + "future" : "dentro de {0} s", + "current" : "agora", + "past" : "há {0} s" + }, + "now" : "agora", + "week" : { + "past" : "há {0} sem.", + "future" : "dentro de {0} sem.", + "next" : "próxima semana", + "current" : "esta semana", + "previous" : "semana passada" + }, + "month" : { + "past" : { + "one" : "há {0} mês", + "other" : "há {0} meses" + }, + "future" : { + "other" : "dentro de {0} meses", + "one" : "dentro de {0} mês" + }, + "next" : "próximo mês", + "previous" : "mês passado", + "current" : "este mês" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ro.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ro.json new file mode 100644 index 0000000..829f4b9 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ro.json @@ -0,0 +1,265 @@ +{ + "short" : { + "year" : { + "previous" : "anul trecut", + "next" : "anul viitor", + "current" : "anul acesta", + "future" : { + "other" : "peste {0} de ani", + "one" : "peste {0} an", + "few" : "peste {0} ani" + }, + "past" : { + "few" : "acum {0} ani", + "one" : "acum {0} an", + "other" : "acum {0} de ani" + } + }, + "quarter" : { + "future" : "peste {0} trim.", + "previous" : "trim. trecut", + "current" : "trim. acesta", + "next" : "trim. viitor", + "past" : "acum {0} trim." + }, + "hour" : { + "past" : "acum {0} h", + "future" : "peste {0} h", + "current" : "ora aceasta" + }, + "day" : { + "past" : { + "one" : "acum {0} zi", + "few" : "acum {0} zile", + "other" : "acum {0} de zile" + }, + "future" : { + "other" : "peste {0} de zile", + "few" : "peste {0} zile", + "one" : "peste {0} zi" + }, + "previous" : "ieri", + "next" : "mâine", + "current" : "azi" + }, + "minute" : { + "current" : "minutul acesta", + "past" : "acum {0} min.", + "future" : "peste {0} min." + }, + "month" : { + "future" : { + "other" : "peste {0} luni", + "one" : "peste {0} lună" + }, + "previous" : "luna trecută", + "current" : "luna aceasta", + "next" : "luna viitoare", + "past" : { + "one" : "acum {0} lună", + "other" : "acum {0} luni" + } + }, + "week" : { + "past" : "acum {0} săpt.", + "future" : "peste {0} săpt.", + "next" : "săptămâna viitoare", + "current" : "săptămâna aceasta", + "previous" : "săptămâna trecută" + }, + "second" : { + "future" : "peste {0} sec.", + "current" : "acum", + "past" : "acum {0} sec." + }, + "now" : "acum" + }, + "narrow" : { + "month" : { + "future" : { + "one" : "+{0} lună", + "other" : "+{0} luni" + }, + "next" : "luna viitoare", + "current" : "luna aceasta", + "previous" : "luna trecută", + "past" : { + "one" : "-{0} lună", + "other" : "-{0} luni" + } + }, + "minute" : { + "future" : "+{0} m", + "current" : "minutul acesta", + "past" : "-{0} m" + }, + "second" : { + "current" : "acum", + "future" : "+{0} s", + "past" : "-{0} s" + }, + "now" : "acum", + "day" : { + "future" : { + "other" : "+{0} zile", + "one" : "+{0} zi" + }, + "previous" : "ieri", + "current" : "azi", + "next" : "mâine", + "past" : { + "one" : "-{0} zi", + "other" : "-{0} zile" + } + }, + "year" : { + "previous" : "anul trecut", + "past" : { + "one" : "-{0} an", + "other" : "-{0} ani" + }, + "future" : { + "other" : "+{0} ani", + "one" : "+{0} an" + }, + "current" : "anul acesta", + "next" : "anul viitor" + }, + "quarter" : { + "past" : "-{0} trim.", + "previous" : "trim. trecut", + "current" : "trim. acesta", + "next" : "trim. viitor", + "future" : "+{0} trim." + }, + "week" : { + "previous" : "săptămâna trecută", + "past" : "-{0} săpt.", + "future" : "+{0} săpt.", + "current" : "săptămâna aceasta", + "next" : "săptămâna viitoare" + }, + "hour" : { + "future" : "+{0} h", + "past" : "-{0} h", + "current" : "ora aceasta" + } + }, + "long" : { + "minute" : { + "past" : { + "one" : "acum {0} minut", + "few" : "acum {0} minute", + "other" : "acum {0} de minute" + }, + "current" : "minutul acesta", + "future" : { + "one" : "peste {0} minut", + "other" : "peste {0} de minute", + "few" : "peste {0} minute" + } + }, + "second" : { + "current" : "acum", + "future" : { + "few" : "peste {0} secunde", + "one" : "peste {0} secundă", + "other" : "peste {0} de secunde" + }, + "past" : { + "few" : "acum {0} secunde", + "other" : "acum {0} de secunde", + "one" : "acum {0} secundă" + } + }, + "month" : { + "next" : "luna viitoare", + "current" : "luna aceasta", + "previous" : "luna trecută", + "past" : { + "other" : "acum {0} de luni", + "one" : "acum {0} lună", + "few" : "acum {0} luni" + }, + "future" : { + "one" : "peste {0} lună", + "other" : "peste {0} de luni", + "few" : "peste {0} luni" + } + }, + "day" : { + "current" : "azi", + "future" : { + "other" : "peste {0} de zile", + "few" : "peste {0} zile", + "one" : "peste {0} zi" + }, + "next" : "mâine", + "previous" : "ieri", + "past" : { + "one" : "acum {0} zi", + "few" : "acum {0} zile", + "other" : "acum {0} de zile" + } + }, + "now" : "acum", + "hour" : { + "current" : "ora aceasta", + "past" : { + "few" : "acum {0} ore", + "one" : "acum {0} oră", + "other" : "acum {0} de ore" + }, + "future" : { + "few" : "peste {0} ore", + "other" : "peste {0} de ore", + "one" : "peste {0} oră" + } + }, + "quarter" : { + "previous" : "trimestrul trecut", + "current" : "trimestrul acesta", + "past" : { + "one" : "acum {0} trimestru", + "few" : "acum {0} trimestre", + "other" : "acum {0} de trimestre" + }, + "future" : { + "other" : "peste {0} de trimestre", + "one" : "peste {0} trimestru", + "few" : "peste {0} trimestre" + }, + "next" : "trimestrul viitor" + }, + "year" : { + "next" : "anul viitor", + "past" : { + "few" : "acum {0} ani", + "other" : "acum {0} de ani", + "one" : "acum {0} an" + }, + "previous" : "anul trecut", + "future" : { + "few" : "peste {0} ani", + "other" : "peste {0} de ani", + "one" : "peste {0} an" + }, + "current" : "anul acesta" + }, + "week" : { + "next" : "săptămâna viitoare", + "future" : { + "few" : "peste {0} săptămâni", + "other" : "peste {0} de săptămâni", + "one" : "peste {0} săptămână" + }, + "previous" : "săptămâna trecută", + "current" : "săptămâna aceasta", + "past" : { + "one" : "acum {0} săptămână", + "few" : "acum {0} săptămâni", + "other" : "acum {0} de săptămâni" + } + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ru.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ru.json new file mode 100644 index 0000000..4750d82 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ru.json @@ -0,0 +1,243 @@ +{ + "narrow" : { + "second" : { + "past" : "-{0} с", + "current" : "сейчас", + "future" : "+{0} с" + }, + "year" : { + "previous" : "в пр. г.", + "next" : "в сл. г.", + "future" : { + "many" : "+{0} л.", + "other" : "+{0} г." + }, + "current" : "в эт. г.", + "past" : { + "other" : "-{0} г.", + "many" : "-{0} л." + } + }, + "month" : { + "past" : "-{0} мес.", + "next" : "в след. мес.", + "future" : "+{0} мес.", + "previous" : "в пр. мес.", + "current" : "в эт. мес." + }, + "minute" : { + "future" : "+{0} мин.", + "past" : "-{0} мин.", + "current" : "в эту минуту" + }, + "quarter" : { + "previous" : "посл. кв.", + "current" : "тек. кв.", + "next" : "след. кв.", + "past" : "-{0} кв.", + "future" : "+{0} кв." + }, + "hour" : { + "past" : "-{0} ч.", + "current" : "в этот час", + "future" : "+{0} ч." + }, + "now" : "сейчас", + "week" : { + "next" : "на след. неделе", + "previous" : "на пр. нед.", + "past" : "-{0} нед.", + "future" : "+{0} нед.", + "current" : "на эт. нед." + }, + "day" : { + "previous" : "вчера", + "future" : "+{0} дн.", + "past" : "-{0} дн.", + "current" : "сегодня", + "next" : "завтра" + } + }, + "short" : { + "minute" : { + "future" : "через {0} мин.", + "current" : "в эту минуту", + "past" : "{0} мин. назад" + }, + "week" : { + "current" : "на этой нед.", + "past" : "{0} нед. назад", + "future" : "через {0} нед.", + "next" : "на следующей нед.", + "previous" : "на прошлой нед." + }, + "year" : { + "current" : "в этом г.", + "future" : { + "many" : "через {0} л.", + "other" : "через {0} г." + }, + "past" : { + "many" : "{0} л. назад", + "other" : "{0} г. назад" + }, + "next" : "в след. г.", + "previous" : "в прошлом г." + }, + "day" : { + "next" : "завтра", + "current" : "сегодня", + "previous" : "вчера", + "past" : "{0} дн. назад", + "future" : "через {0} дн." + }, + "hour" : { + "past" : { + "one" : "{0} ч. назад", + "other" : "{0} ч. назад" + }, + "future" : { + "one" : "через {0} ч.", + "other" : "через {0} ч." + }, + "current" : "в этот час" + }, + "quarter" : { + "current" : "текущий кв.", + "future" : "через {0} кв.", + "previous" : "последний кв.", + "next" : "следующий кв.", + "past" : "{0} кв. назад" + }, + "second" : { + "future" : "через {0} сек.", + "current" : "сейчас", + "past" : "{0} сек. назад" + }, + "month" : { + "current" : "в этом мес.", + "past" : "{0} мес. назад", + "future" : "через {0} мес.", + "next" : "в следующем мес.", + "previous" : "в прошлом мес." + }, + "now" : "сейчас" + }, + "long" : { + "quarter" : { + "next" : "в следующем квартале", + "past" : { + "one" : "{0} квартал назад", + "many" : "{0} кварталов назад", + "other" : "{0} квартала назад" + }, + "previous" : "в прошлом квартале", + "current" : "в текущем квартале", + "future" : { + "one" : "через {0} квартал", + "many" : "через {0} кварталов", + "other" : "через {0} квартала" + } + }, + "month" : { + "next" : "в следующем месяце", + "current" : "в этом месяце", + "past" : { + "one" : "{0} месяц назад", + "many" : "{0} месяцев назад", + "other" : "{0} месяца назад" + }, + "previous" : "в прошлом месяце", + "future" : { + "other" : "через {0} месяца", + "many" : "через {0} месяцев", + "one" : "через {0} месяц" + } + }, + "now" : "сейчас", + "week" : { + "future" : { + "other" : "через {0} недели", + "one" : "через {0} неделю", + "many" : "через {0} недель" + }, + "previous" : "на прошлой неделе", + "current" : "на этой неделе", + "next" : "на следующей неделе", + "past" : { + "many" : "{0} недель назад", + "one" : "{0} неделю назад", + "other" : "{0} недели назад" + } + }, + "hour" : { + "current" : "в этот час", + "future" : { + "one" : "через {0} час", + "many" : "через {0} часов", + "other" : "через {0} часа" + }, + "past" : { + "other" : "{0} часа назад", + "many" : "{0} часов назад", + "one" : "{0} час назад" + } + }, + "minute" : { + "future" : { + "many" : "через {0} минут", + "one" : "через {0} минуту", + "other" : "через {0} минуты" + }, + "current" : "в эту минуту", + "past" : { + "one" : "{0} минуту назад", + "many" : "{0} минут назад", + "other" : "{0} минуты назад" + } + }, + "second" : { + "past" : { + "other" : "{0} секунды назад", + "many" : "{0} секунд назад", + "one" : "{0} секунду назад" + }, + "current" : "сейчас", + "future" : { + "other" : "через {0} секунды", + "one" : "через {0} секунду", + "many" : "через {0} секунд" + } + }, + "day" : { + "previous" : "вчера", + "past" : { + "many" : "{0} дней назад", + "other" : "{0} дня назад", + "one" : "{0} день назад" + }, + "future" : { + "other" : "через {0} дня", + "one" : "через {0} день", + "many" : "через {0} дней" + }, + "next" : "завтра", + "current" : "сегодня" + }, + "year" : { + "next" : "в следующем году", + "current" : "в этом году", + "future" : { + "one" : "через {0} год", + "other" : "через {0} года", + "many" : "через {0} лет" + }, + "previous" : "в прошлом году", + "past" : { + "many" : "{0} лет назад", + "other" : "{0} года назад", + "one" : "{0} год назад" + } + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/sah.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/sah.json new file mode 100644 index 0000000..286b997 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/sah.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "day" : { + "next" : "Сарсын", + "future" : "{0} күнүнэн", + "previous" : "Бэҕэһээ", + "current" : "Бүгүн", + "past" : "{0} күн ынараа өттүгэр" + }, + "quarter" : { + "next" : "кэлэр кыбаартал", + "past" : "{0} кыб. анараа өттүгэр", + "future" : "{0} кыбаарталынан", + "previous" : "ааспыт кыбаартал", + "current" : "бу кыбаартал" + }, + "hour" : { + "past" : "{0} чаас ынараа өттүгэр", + "future" : "{0} чааһынан", + "current" : "this hour" + }, + "year" : { + "next" : "эһиил", + "past" : "{0} сыл ынараа өттүгэр", + "current" : "быйыл", + "previous" : "Былырыын", + "future" : "{0} сылынан" + }, + "now" : "билигин", + "month" : { + "current" : "бу ый", + "future" : "{0} ыйынан", + "past" : "{0} ый ынараа өттүгэр", + "next" : "аныгыскы ый", + "previous" : "ааспыт ый" + }, + "week" : { + "previous" : "ааспыт нэдиэлэ", + "current" : "бу нэдиэлэ", + "past" : "{0} нэдиэлэ анараа өттүгэр", + "future" : "{0} нэдиэлэннэн", + "next" : "кэлэр нэдиэлэ" + }, + "minute" : { + "past" : "{0} мүнүүтэ ынараа өттүгэр", + "current" : "this minute", + "future" : "{0} мүнүүтэннэн" + }, + "second" : { + "future" : "{0} сөкүүндэннэн", + "current" : "билигин", + "past" : "{0} сөк. анараа өттүгэр" + } + }, + "long" : { + "day" : { + "previous" : "Бэҕэһээ", + "current" : "Бүгүн", + "next" : "Сарсын", + "past" : "{0} күн ынараа өттүгэр", + "future" : "{0} күнүнэн" + }, + "week" : { + "current" : "бу нэдиэлэ", + "future" : "{0} нэдиэлэннэн", + "past" : "{0} нэдиэлэ анараа өттүгэр", + "previous" : "ааспыт нэдиэлэ", + "next" : "кэлэр нэдиэлэ" + }, + "minute" : { + "future" : "{0} мүнүүтэннэн", + "current" : "this minute", + "past" : "{0} мүнүүтэ ынараа өттүгэр" + }, + "month" : { + "future" : "{0} ыйынан", + "next" : "аныгыскы ый", + "previous" : "ааспыт ый", + "current" : "бу ый", + "past" : "{0} ый ынараа өттүгэр" + }, + "hour" : { + "current" : "this hour", + "past" : "{0} чаас ынараа өттүгэр", + "future" : "{0} чааһынан" + }, + "year" : { + "past" : "{0} сыл ынараа өттүгэр", + "future" : "{0} сылынан", + "previous" : "Былырыын", + "next" : "эһиил", + "current" : "быйыл" + }, + "second" : { + "past" : "{0} сөкүүндэ ынараа өттүгэр", + "current" : "билигин", + "future" : "{0} сөкүүндэннэн" + }, + "now" : "билигин", + "quarter" : { + "past" : "{0} кыбаартал анараа өттүгэр", + "current" : "бу кыбаартал", + "previous" : "ааспыт кыбаартал", + "future" : "{0} кыбаарталынан", + "next" : "кэлэр кыбаартал" + } + }, + "short" : { + "quarter" : { + "future" : "{0} кыбаарталынан", + "next" : "кэлэр кыбаартал", + "previous" : "ааспыт кыбаартал", + "current" : "бу кыбаартал", + "past" : "{0} кыб. анараа өттүгэр" + }, + "minute" : { + "past" : "{0} мүнүүтэ ынараа өттүгэр", + "future" : "{0} мүнүүтэннэн", + "current" : "this minute" + }, + "year" : { + "next" : "эһиил", + "future" : "{0} сылынан", + "current" : "быйыл", + "past" : "{0} сыл ынараа өттүгэр", + "previous" : "Былырыын" + }, + "second" : { + "current" : "билигин", + "past" : "{0} сөк. анараа өттүгэр", + "future" : "{0} сөкүүндэннэн" + }, + "hour" : { + "current" : "this hour", + "past" : "{0} чаас ынараа өттүгэр", + "future" : "{0} чааһынан" + }, + "now" : "билигин", + "month" : { + "previous" : "ааспыт ый", + "next" : "аныгыскы ый", + "past" : "{0} ый ынараа өттүгэр", + "current" : "бу ый", + "future" : "{0} ыйынан" + }, + "week" : { + "previous" : "ааспыт нэдиэлэ", + "current" : "бу нэдиэлэ", + "next" : "кэлэр нэдиэлэ", + "past" : "{0} нэдиэлэ анараа өттүгэр", + "future" : "{0} нэдиэлэннэн" + }, + "day" : { + "next" : "Сарсын", + "past" : "{0} күн ынараа өттүгэр", + "future" : "{0} күнүнэн", + "previous" : "Бэҕэһээ", + "current" : "Бүгүн" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/sd.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/sd.json new file mode 100644 index 0000000..4e7a293 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/sd.json @@ -0,0 +1,164 @@ +{ + "narrow" : { + "year" : { + "future" : "{0} سالن ۾", + "previous" : "پويون سال", + "next" : "پويون سال", + "current" : "پويون سال", + "past" : "{0} سال پهرين" + }, + "week" : { + "past" : "{0} هفتا پهرين", + "previous" : "پوئين هفتي", + "future" : "{0} هفتن ۾", + "current" : "هن هفتي", + "next" : "اڳين هفتي" + }, + "hour" : { + "future" : "{0} ڪلاڪ ۾", + "current" : "هن ڪلڪ", + "past" : "{0} ڪلاڪ پهرين" + }, + "quarter" : { + "current" : "هن ٽي ماهي", + "previous" : "پوئين ٽي ماهي", + "future" : "{0} ٽي ماهي ۾", + "past" : "{0} ٽي ماهي پهرين", + "next" : "اڳين ٽي ماهي" + }, + "second" : { + "current" : "هاڻي", + "future" : "{0} سيڪنڊن ۾", + "past" : "{0} سيڪنڊ پهرين" + }, + "month" : { + "current" : "هن مهيني", + "future" : "{0} مهينن ۾", + "past" : "{0} مهينا پهرين", + "next" : "اڳين مهيني", + "previous" : "پوئين مهيني" + }, + "day" : { + "previous" : "ڪل", + "future" : "{0} ڏينهن ۾", + "next" : "سڀاڻي", + "current" : "اڄ", + "past" : "{0} ڏينهن پهرين" + }, + "minute" : { + "past" : "{0} منٽ پهرين", + "future" : "{0} منٽن ۾", + "current" : "هن منٽ" + }, + "now" : "هاڻي" + }, + "long" : { + "quarter" : { + "next" : "اڳين ٽي ماهي", + "current" : "هن ٽي ماهي", + "previous" : "پوئين ٽي ماهي", + "past" : "{0} ٽي ماهي پهرين", + "future" : "{0} ٽي ماهي ۾" + }, + "year" : { + "previous" : "پويون سال", + "past" : "{0} سال پهرين", + "future" : "{0} سالن ۾", + "next" : "پويون سال", + "current" : "پويون سال" + }, + "minute" : { + "past" : "{0} منٽ پهرين", + "future" : { + "one" : "{0} منٽن ۾", + "other" : "+{0} min" + }, + "current" : "هن منٽ" + }, + "month" : { + "previous" : "پوئين مهيني", + "current" : "هن مهيني", + "future" : "{0} مهينن ۾", + "past" : "{0} مهينا پهرين", + "next" : "اڳين مهيني" + }, + "now" : "هاڻي", + "hour" : { + "past" : "{0} ڪلاڪ پهرين", + "future" : "{0} ڪلاڪ ۾", + "current" : "هن ڪلڪ" + }, + "second" : { + "future" : "{0} سيڪنڊن ۾", + "current" : "هاڻي", + "past" : "{0} سيڪنڊ پهرين" + }, + "week" : { + "past" : "{0} هفتا پهرين", + "current" : "هن هفتي", + "next" : "اڳين هفتي", + "previous" : "پوئين هفتي", + "future" : "{0} هفتن ۾" + }, + "day" : { + "previous" : "ڪل", + "future" : "{0} ڏينهن ۾", + "next" : "سڀاڻي", + "past" : "{0} ڏينهن پهرين", + "current" : "اڄ" + } + }, + "short" : { + "second" : { + "current" : "هاڻي", + "past" : "{0} سيڪنڊ پهرين", + "future" : "{0} سيڪنڊن ۾" + }, + "now" : "هاڻي", + "month" : { + "future" : "{0} مهينن ۾", + "current" : "هن مهيني", + "past" : "{0} مهينا پهرين", + "previous" : "پوئين مهيني", + "next" : "اڳين مهيني" + }, + "day" : { + "previous" : "ڪل", + "current" : "اڄ", + "next" : "سڀاڻي", + "future" : "{0} ڏينهن ۾", + "past" : "{0} ڏينهن پهرين" + }, + "minute" : { + "current" : "هن منٽ", + "future" : "{0} منٽن ۾", + "past" : "{0} منٽ پهرين" + }, + "quarter" : { + "past" : "{0} ٽي ماهي پهرين", + "previous" : "پوئين ٽي ماهي", + "current" : "هن ٽي ماهي", + "future" : "{0} ٽي ماهي ۾", + "next" : "اڳين ٽي ماهي" + }, + "hour" : { + "current" : "هن ڪلڪ", + "future" : "{0} ڪلاڪ ۾", + "past" : "{0} ڪلاڪ پهرين" + }, + "week" : { + "future" : "{0} هفتن ۾", + "previous" : "پوئين هفتي", + "next" : "اڳين هفتي", + "past" : "{0} هفتا پهرين", + "current" : "هن هفتي" + }, + "year" : { + "next" : "پويون سال", + "current" : "پويون سال", + "past" : "{0} سال پهرين", + "future" : "{0} سالن ۾", + "previous" : "پويون سال" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/se.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/se.json new file mode 100644 index 0000000..dd6e15a --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/se.json @@ -0,0 +1,272 @@ +{ + "narrow" : { + "second" : { + "future" : { + "one" : "{0} sekunda maŋŋilit", + "other" : "{0} sekundda maŋŋilit" + }, + "past" : { + "one" : "{0} sekunda árat", + "other" : "{0} sekundda árat" + }, + "current" : "now" + }, + "week" : { + "past" : { + "one" : "{0} vahku árat", + "other" : "{0} vahkku árat" + }, + "next" : "next week", + "previous" : "last week", + "current" : "this week", + "future" : { + "one" : "{0} vahku maŋŋilit", + "other" : "{0} vahkku maŋŋilit" + } + }, + "month" : { + "current" : "this month", + "next" : "next month", + "future" : "{0} mánotbadji maŋŋilit", + "previous" : "last month", + "past" : "{0} mánotbadji árat" + }, + "quarter" : { + "previous" : "last quarter", + "current" : "this quarter", + "past" : "-{0} Q", + "future" : "+{0} Q", + "next" : "next quarter" + }, + "year" : { + "current" : "this year", + "previous" : "last year", + "future" : { + "other" : "{0} jahkki maŋŋilit", + "one" : "{0} jahki maŋŋilit" + }, + "next" : "next year", + "past" : { + "other" : "{0} jahkki árat", + "one" : "{0} jahki árat" + } + }, + "hour" : { + "current" : "this hour", + "past" : { + "one" : "{0} diibmu árat", + "other" : "{0} diibmur árat" + }, + "future" : { + "one" : "{0} diibmu maŋŋilit", + "other" : "{0} diibmur maŋŋilit" + } + }, + "day" : { + "current" : "odne", + "next" : "ihttin", + "previous" : "ikte", + "past" : { + "other" : "{0} jándora árat", + "one" : "{0} jándor árat" + }, + "future" : { + "other" : "{0} jándora maŋŋilit", + "one" : "{0} jándor maŋŋilit", + "two" : "{0} jándor amaŋŋilit" + } + }, + "minute" : { + "past" : { + "one" : "{0} minuhta árat", + "other" : "{0} minuhtta árat" + }, + "current" : "this minute", + "future" : { + "one" : "{0} minuhta maŋŋilit", + "other" : "{0} minuhtta maŋŋilit" + } + }, + "now" : "now" + }, + "long" : { + "minute" : { + "past" : { + "one" : "{0} minuhta árat", + "other" : "{0} minuhtta árat" + }, + "current" : "this minute", + "future" : { + "one" : "{0} minuhta maŋŋilit", + "other" : "{0} minuhtta maŋŋilit" + } + }, + "hour" : { + "current" : "this hour", + "past" : { + "other" : "{0} diibmur árat", + "one" : "{0} diibmu árat" + }, + "future" : { + "one" : "{0} diibmu maŋŋilit", + "other" : "{0} diibmur maŋŋilit" + } + }, + "quarter" : { + "previous" : "last quarter", + "current" : "this quarter", + "next" : "next quarter", + "future" : "+{0} Q", + "past" : "-{0} Q" + }, + "year" : { + "previous" : "last year", + "next" : "next year", + "past" : { + "one" : "{0} jahki árat", + "other" : "{0} jahkki árat" + }, + "current" : "this year", + "future" : { + "one" : "{0} jahki maŋŋilit", + "other" : "{0} jahkki maŋŋilit" + } + }, + "week" : { + "next" : "next week", + "previous" : "last week", + "current" : "this week", + "past" : { + "one" : "{0} vahku árat", + "other" : "{0} vahkku árat" + }, + "future" : { + "other" : "{0} vahkku maŋŋilit", + "one" : "{0} vahku maŋŋilit" + } + }, + "day" : { + "current" : "odne", + "future" : { + "one" : "{0} jándor maŋŋilit", + "other" : "{0} jándora maŋŋilit", + "two" : "{0} jándor amaŋŋilit" + }, + "past" : { + "other" : "{0} jándora árat", + "one" : "{0} jándor árat" + }, + "next" : "ihttin", + "previous" : "ikte" + }, + "second" : { + "current" : "now", + "past" : { + "one" : "{0} sekunda árat", + "other" : "{0} sekundda árat" + }, + "future" : { + "other" : "{0} sekundda maŋŋilit", + "one" : "{0} sekunda maŋŋilit" + } + }, + "now" : "now", + "month" : { + "previous" : "last month", + "future" : "{0} mánotbadji maŋŋilit", + "past" : "{0} mánotbadji árat", + "current" : "this month", + "next" : "next month" + } + }, + "short" : { + "now" : "now", + "minute" : { + "current" : "this minute", + "future" : { + "one" : "{0} minuhta maŋŋilit", + "other" : "{0} minuhtta maŋŋilit" + }, + "past" : { + "other" : "{0} minuhtta árat", + "one" : "{0} minuhta árat" + } + }, + "year" : { + "previous" : "last year", + "current" : "this year", + "next" : "next year", + "past" : { + "other" : "{0} jahkki árat", + "one" : "{0} jahki árat" + }, + "future" : { + "one" : "{0} jahki maŋŋilit", + "other" : "{0} jahkki maŋŋilit" + } + }, + "second" : { + "current" : "now", + "future" : { + "one" : "{0} sekunda maŋŋilit", + "other" : "{0} sekundda maŋŋilit" + }, + "past" : { + "one" : "{0} sekunda árat", + "other" : "{0} sekundda árat" + } + }, + "hour" : { + "past" : { + "other" : "{0} diibmur árat", + "one" : "{0} diibmu árat" + }, + "future" : { + "other" : "{0} diibmur maŋŋilit", + "one" : "{0} diibmu maŋŋilit" + }, + "current" : "this hour" + }, + "month" : { + "future" : "{0} mánotbadji maŋŋilit", + "previous" : "last month", + "next" : "next month", + "past" : "{0} mánotbadji árat", + "current" : "this month" + }, + "quarter" : { + "current" : "this quarter", + "future" : "+{0} Q", + "previous" : "last quarter", + "next" : "next quarter", + "past" : "-{0} Q" + }, + "week" : { + "next" : "next week", + "past" : { + "other" : "{0} vahkku árat", + "one" : "{0} vahku árat" + }, + "current" : "this week", + "previous" : "last week", + "future" : { + "other" : "{0} vahkku maŋŋilit", + "one" : "{0} vahku maŋŋilit" + } + }, + "day" : { + "next" : "ihttin", + "current" : "odne", + "previous" : "ikte", + "past" : { + "other" : "{0} jándora árat", + "one" : "{0} jándor árat" + }, + "future" : { + "two" : "{0} jándor amaŋŋilit", + "other" : "{0} jándora maŋŋilit", + "one" : "{0} jándor maŋŋilit" + } + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/se_FI.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/se_FI.json new file mode 100644 index 0000000..d62c789 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/se_FI.json @@ -0,0 +1,266 @@ +{ + "narrow" : { + "year" : { + "next" : "boahtte jagi", + "past" : { + "other" : "{0} j. dás ovdal", + "two" : "{0} jagi dás ovdal" + }, + "future" : "{0} jagi siste", + "previous" : "diibmá", + "current" : "dán jagi" + }, + "quarter" : { + "past" : { + "two" : "-{0} njealjádasjagi dás ovdal", + "other" : "{0} njealj.j. dás ovdal" + }, + "previous" : "mannan njealjádasjagi", + "current" : "dán njealjádasjagi", + "next" : "boahtte njealjádasjagi", + "future" : { + "other" : "boahtte {0} njealj.j.", + "two" : "boahtte {0} njealjádasjagi" + } + }, + "hour" : { + "past" : { + "two" : "{0} diimmu áigi", + "other" : "{0} dmu áigi" + }, + "future" : { + "other" : "{0} dmu siste", + "two" : "{0} diimmu siste" + }, + "current" : "dán diimmu" + }, + "second" : { + "past" : { + "two" : "{0} sekundda áigi", + "other" : "{0} sek. áigi" + }, + "current" : "dál", + "future" : { + "two" : "{0} sekundda siste", + "other" : "{0} sek. siste" + } + }, + "week" : { + "previous" : "mannan vahku", + "past" : { + "two" : "{0} vahku dás ovdal", + "one" : "{0} vahkku dás ovdal", + "other" : "{0} v(k) dás ovdal" + }, + "next" : "boahtte vahku", + "future" : "{0} v(k) geahčen", + "current" : "dán vahku" + }, + "month" : { + "past" : { + "other" : "{0} mánu dás ovdal", + "one" : "{0} mánnu dás ovdal" + }, + "current" : "dán mánu", + "future" : "{0} mánu geahčen", + "next" : "boahtte mánu", + "previous" : "mannan mánu" + }, + "day" : { + "future" : "{0} beaivve siste", + "current" : "odne", + "past" : { + "two" : "ovddet beaivve", + "one" : "ikte", + "other" : "{0} beaivve dás ovdal" + }, + "previous" : "ikte", + "next" : "ihttin" + }, + "minute" : { + "current" : "dán minuhta", + "past" : { + "other" : "{0} min. áigi", + "two" : "{0} minuhta áigi" + }, + "future" : { + "other" : "{0} min. siste", + "two" : "{0} minuhta siste" + } + }, + "now" : "dál" + }, + "long" : { + "month" : { + "past" : { + "one" : "{0} mánnu dás ovdal", + "other" : "{0} mánu dás ovdal" + }, + "previous" : "mannan mánu", + "future" : "{0} mánu siste", + "next" : "boahtte mánu", + "current" : "dán mánu" + }, + "now" : "dál", + "year" : { + "current" : "dán jagi", + "past" : { + "other" : "{0} jagi dás ovdal", + "one" : "diibmá", + "two" : "ovddet jagi" + }, + "future" : "{0} jagi siste", + "next" : "boahtte jagi", + "previous" : "diibmá" + }, + "quarter" : { + "past" : "-{0} njealjádasjagi dás ovdal", + "future" : "čuovvovaš {0} njealjádasjagi", + "current" : "dán njealjádasjagi", + "next" : "boahtte njealjádasjagi", + "previous" : "mannan njealjádasjagi" + }, + "minute" : { + "current" : "dán minuhta", + "past" : { + "other" : "{0} minuhta áigi", + "one" : "{0} minuhtta áigi" + }, + "future" : "{0} minuhta siste" + }, + "week" : { + "future" : "{0} vahku geahčen", + "previous" : "mannan vahku", + "current" : "dán vahku", + "next" : "boahtte vahku", + "past" : { + "one" : "{0} vahkku dás ovdal", + "other" : "{0} vahku dás ovdal" + } + }, + "second" : { + "future" : "{0} sekundda siste", + "current" : "dál", + "past" : { + "one" : "{0} sekunda áigi", + "other" : "{0} sekundda áigi" + } + }, + "hour" : { + "future" : "{0} diimmu siste", + "current" : "dán diimmu", + "past" : { + "other" : "{0} diimmu áigi", + "one" : "{0} diibmu áigi" + } + }, + "day" : { + "next" : "ihttin", + "past" : { + "other" : "{0} beaivve dás ovdal", + "two" : "ovddet beaivve", + "one" : "ikte" + }, + "future" : "{0} beaivve siste", + "previous" : "ikte", + "current" : "odne" + } + }, + "short" : { + "hour" : { + "current" : "dán diimmu", + "past" : { + "other" : "{0} dmu áigi", + "two" : "{0} diimmu áigi" + }, + "future" : { + "two" : "{0} diimmu siste", + "other" : "{0} dmu siste" + } + }, + "second" : { + "future" : { + "two" : "{0} sekundda siste", + "other" : "{0} sek. siste" + }, + "past" : { + "other" : "{0} sek. áigi", + "two" : "{0} sekundda áigi" + }, + "current" : "dál" + }, + "now" : "dál", + "year" : { + "past" : { + "one" : "diibmá", + "two" : "ovddet jagi", + "other" : "{0} j. dás ovdal" + }, + "future" : { + "two" : "{0} jagi siste", + "other" : "{0} j. siste" + }, + "previous" : "diibmá", + "current" : "dán jagi", + "next" : "boahtte jagi" + }, + "quarter" : { + "previous" : "mannan njealjádasjagi", + "future" : { + "other" : "boahtte {0} njealj.j.", + "two" : "boahtte {0} njealjádasjagi" + }, + "next" : "boahtte njealjádasjagi", + "past" : { + "two" : "{0} njealjádasjagi dás ovdal", + "other" : "{0} njealj.j. dás ovdal" + }, + "current" : "dán njealjádasjagi" + }, + "week" : { + "previous" : "mannan vahku", + "current" : "dán vahku", + "next" : "boahtte vahku", + "past" : { + "two" : "{0} vahku dás ovdal", + "other" : "{0} v(k) dás ovdal" + }, + "future" : { + "other" : "{0} v(k) siste", + "two" : "{0} vahku siste" + } + }, + "day" : { + "next" : "ihttin", + "past" : { + "one" : "ikte", + "other" : "{0} beaivve dás ovdal", + "two" : "ovddet beaivve" + }, + "previous" : "ikte", + "future" : "{0} beaivve siste", + "current" : "odne" + }, + "minute" : { + "past" : { + "two" : "{0} minuhta áigi", + "other" : "{0} min. áigi" + }, + "future" : { + "two" : "{0} minuhta siste", + "other" : "{0} min. siste" + }, + "current" : "dán minuhta" + }, + "month" : { + "next" : "boahtte mánu", + "past" : { + "other" : "{0} mánu dás ovdal", + "one" : "{0} mánnu dás ovdal" + }, + "future" : "{0} mánu siste", + "previous" : "mannan mánu", + "current" : "dán mánu" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/si.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/si.json new file mode 100644 index 0000000..5d098e3 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/si.json @@ -0,0 +1,161 @@ +{ + "long" : { + "hour" : { + "future" : "පැය {0}කින්", + "past" : "පැය {0}කට පෙර", + "current" : "මෙම පැය" + }, + "second" : { + "past" : "තත්පර {0}කට පෙර", + "future" : "තත්පර {0}කින්", + "current" : "දැන්" + }, + "week" : { + "next" : "ඊළඟ සතිය", + "current" : "මෙම සතිය", + "previous" : "පසුගිය සතිය", + "future" : "සති {0}කින්", + "past" : "සති {0}කට පෙර" + }, + "minute" : { + "current" : "මෙම මිනිත්තුව", + "past" : "මිනිත්තු {0}කට පෙර", + "future" : "මිනිත්තු {0}කින්" + }, + "year" : { + "current" : "මෙම වසර", + "past" : "වසර {0}කට පෙර", + "future" : "වසර {0}කින්", + "previous" : "පසුගිය වසර", + "next" : "ඊළඟ වසර" + }, + "quarter" : { + "next" : "ඊළඟ කාර්තුව", + "current" : "මෙම කාර්තුව", + "future" : "කාර්තු {0}කින්", + "previous" : "පසුගිය කාර්තුව", + "past" : "කාර්තු {0}කට පෙර" + }, + "month" : { + "previous" : "පසුගිය මාසය", + "future" : "මාස {0}කින්", + "current" : "මෙම මාසය", + "next" : "ඊළඟ මාසය", + "past" : "මාස {0}කට පෙර" + }, + "day" : { + "next" : "හෙට", + "past" : "දින {0}කට පෙර", + "current" : "අද", + "future" : "දින {0}න්", + "previous" : "ඊයේ" + }, + "now" : "දැන්" + }, + "narrow" : { + "week" : { + "current" : "මෙම සති.", + "next" : "ඊළඟ සති.", + "past" : "සති {0}කට පෙර", + "previous" : "පසුගිය සති.", + "future" : "සති {0}කින්" + }, + "minute" : { + "current" : "මෙම මිනිත්තුව", + "future" : "මිනිත්තු {0}කින්", + "past" : "මිනිත්තු {0}කට පෙර" + }, + "month" : { + "current" : "මෙම මාස.", + "previous" : "පසුගිය මාස.", + "past" : "මාස {0}කට පෙර", + "next" : "ඊළඟ මාස.", + "future" : "මාස {0}කින්" + }, + "now" : "දැන්", + "year" : { + "current" : "මෙම වසර", + "next" : "ඊළඟ වසර", + "past" : "වසර {0}කට පෙර", + "future" : "වසර {0}කින්", + "previous" : "පසුගිය වසර" + }, + "hour" : { + "future" : "පැය {0}කින්", + "past" : "පැය {0}කට පෙර", + "current" : "මෙම පැය" + }, + "quarter" : { + "previous" : "පසුගිය කාර්.", + "current" : "මෙම කාර්.", + "past" : "කාර්. {0}කට පෙර", + "future" : "කාර්. {0}කින්", + "next" : "ඊළඟ කාර්." + }, + "second" : { + "current" : "දැන්", + "past" : "තත්පර {0}කට පෙර", + "future" : "තත්පර {0}කින්" + }, + "day" : { + "past" : "දින {0}කට පෙර", + "current" : "අද", + "future" : "දින {0}න්", + "previous" : "ඊයේ", + "next" : "හෙට" + } + }, + "short" : { + "month" : { + "previous" : "පසුගිය මාස.", + "current" : "මෙම මාස.", + "next" : "ඊළඟ මාස.", + "past" : "මාස {0}කට පෙර", + "future" : "මාස {0}කින්" + }, + "now" : "දැන්", + "day" : { + "next" : "හෙට", + "current" : "අද", + "previous" : "ඊයේ", + "past" : "දින {0}කට පෙර", + "future" : "දින {0}න්" + }, + "year" : { + "current" : "මෙම වසර", + "future" : "වසර {0}කින්", + "previous" : "පසුගිය වසර", + "next" : "ඊළඟ වසර", + "past" : "වසර {0}කට පෙර" + }, + "hour" : { + "past" : "පැය {0}කට පෙර", + "current" : "මෙම පැය", + "future" : "පැය {0}කින්" + }, + "minute" : { + "past" : "මිනිත්තු {0}කට පෙර", + "future" : "මිනිත්තු {0}කින්", + "current" : "මෙම මිනිත්තුව" + }, + "second" : { + "future" : "තත්පර {0}කින්", + "current" : "දැන්", + "past" : "තත්පර {0}කට පෙර" + }, + "quarter" : { + "future" : "කාර්. {0}කින්", + "previous" : "පසුගිය කාර්.", + "next" : "ඊළඟ කාර්.", + "past" : "කාර්. {0}කට පෙර", + "current" : "මෙම කාර්." + }, + "week" : { + "next" : "ඊළඟ සති.", + "past" : "සති {0}කට පෙර", + "current" : "මෙම සති.", + "previous" : "පසුගිය සති.", + "future" : "සති {0}කින්" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/sk.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/sk.json new file mode 100644 index 0000000..9a6b2f2 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/sk.json @@ -0,0 +1,233 @@ +{ + "narrow" : { + "quarter" : { + "current" : "tento štvrťr.", + "past" : "pred {0} štvrťr.", + "next" : "budúci štvrťr.", + "future" : "o {0} štvrťr.", + "previous" : "minulý štvrťr." + }, + "day" : { + "next" : "zajtra", + "previous" : "včera", + "future" : "o {0} d.", + "past" : "pred {0} d.", + "current" : "dnes" + }, + "year" : { + "past" : "pred {0} r.", + "previous" : "minulý rok", + "future" : "o {0} r.", + "next" : "budúci rok", + "current" : "tento rok" + }, + "minute" : { + "past" : "pred {0} min", + "current" : "v tejto minúte", + "future" : "o {0} min" + }, + "now" : "teraz", + "week" : { + "current" : "tento týž.", + "previous" : "minulý týž.", + "past" : "pred {0} týž.", + "next" : "budúci týž.", + "future" : "o {0} týž." + }, + "second" : { + "future" : "o {0} s", + "current" : "teraz", + "past" : "pred {0} s" + }, + "month" : { + "future" : "o {0} mes.", + "current" : "tento mes.", + "past" : "pred {0} mes.", + "previous" : "minulý mes.", + "next" : "budúci mes." + }, + "hour" : { + "future" : "o {0} h", + "past" : "pred {0} h", + "current" : "v tejto hodine" + } + }, + "long" : { + "now" : "teraz", + "week" : { + "current" : "tento týždeň", + "past" : { + "other" : "pred {0} týždňami", + "many" : "pred {0} týždňa", + "one" : "pred {0} týždňom" + }, + "previous" : "minulý týždeň", + "future" : { + "many" : "o {0} týždňa", + "one" : "o {0} týždeň", + "few" : "o {0} týždne", + "other" : "o {0} týždňov" + }, + "next" : "budúci týždeň" + }, + "hour" : { + "past" : { + "many" : "pred {0} hodinou", + "one" : "pred {0} hodinou", + "other" : "pred {0} hodinami" + }, + "future" : { + "many" : "o {0} hodiny", + "one" : "o {0} hodinu", + "few" : "o {0} hodiny", + "other" : "o {0} hodín" + }, + "current" : "v tejto hodine" + }, + "quarter" : { + "previous" : "minulý štvrťrok", + "future" : { + "many" : "o {0} štvrťroka", + "other" : "o {0} štvrťrokov", + "few" : "o {0} štvrťroky", + "one" : "o {0} štvrťrok" + }, + "past" : { + "many" : "pred {0} štvrťroka", + "one" : "pred {0} štvrťrokom", + "other" : "pred {0} štvrťrokmi" + }, + "current" : "tento štvrťrok", + "next" : "budúci štvrťrok" + }, + "minute" : { + "current" : "v tejto minúte", + "future" : { + "many" : "o {0} minúty", + "one" : "o {0} minútu", + "other" : "o {0} minút", + "few" : "o {0} minúty" + }, + "past" : { + "other" : "pred {0} minútami", + "one" : "pred {0} minútou", + "many" : "pred {0} minúty" + } + }, + "year" : { + "past" : { + "many" : "pred {0} roka", + "other" : "pred {0} rokmi", + "one" : "pred {0} rokom" + }, + "future" : { + "few" : "o {0} roky", + "one" : "o {0} rok", + "many" : "o {0} roka", + "other" : "o {0} rokov" + }, + "current" : "tento rok", + "next" : "budúci rok", + "previous" : "minulý rok" + }, + "month" : { + "future" : { + "many" : "o {0} mesiaca", + "one" : "o {0} mesiac", + "few" : "o {0} mesiace", + "other" : "o {0} mesiacov" + }, + "current" : "tento mesiac", + "previous" : "minulý mesiac", + "next" : "budúci mesiac", + "past" : { + "many" : "pred {0} mesiaca", + "other" : "pred {0} mesiacmi", + "one" : "pred {0} mesiacom" + } + }, + "second" : { + "current" : "teraz", + "past" : { + "one" : "pred {0} sekundou", + "many" : "pred {0} sekundy", + "other" : "pred {0} sekundami" + }, + "future" : { + "many" : "o {0} sekundy", + "few" : "o {0} sekundy", + "one" : "o {0} sekundu", + "other" : "o {0} sekúnd" + } + }, + "day" : { + "previous" : "včera", + "next" : "zajtra", + "past" : { + "many" : "pred {0} dňa", + "one" : "pred {0} dňom", + "other" : "pred {0} dňami" + }, + "current" : "dnes", + "future" : { + "many" : "o {0} dňa", + "one" : "o {0} deň", + "other" : "o {0} dní", + "few" : "o {0} dni" + } + } + }, + "short" : { + "minute" : { + "future" : "o {0} min", + "current" : "v tejto minúte", + "past" : "pred {0} min" + }, + "week" : { + "future" : "o {0} týž.", + "previous" : "minulý týž.", + "next" : "budúci týž.", + "current" : "tento týž.", + "past" : "pred {0} týž." + }, + "year" : { + "current" : "tento rok", + "previous" : "minulý rok", + "future" : "o {0} r.", + "past" : "pred {0} r.", + "next" : "budúci rok" + }, + "month" : { + "next" : "budúci mes.", + "past" : "pred {0} mes.", + "future" : "o {0} mes.", + "previous" : "minulý mes.", + "current" : "tento mes." + }, + "quarter" : { + "next" : "budúci štvrťr.", + "past" : "pred {0} štvrťr.", + "previous" : "minulý štvrťr.", + "current" : "tento štvrťr.", + "future" : "o {0} štvrťr." + }, + "day" : { + "current" : "dnes", + "previous" : "včera", + "past" : "pred {0} d.", + "next" : "zajtra", + "future" : "o {0} d." + }, + "hour" : { + "past" : "pred {0} h", + "current" : "v tejto hodine", + "future" : "o {0} h" + }, + "second" : { + "past" : "pred {0} s", + "current" : "teraz", + "future" : "o {0} s" + }, + "now" : "teraz" + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/sl.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/sl.json new file mode 100644 index 0000000..e124fea --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/sl.json @@ -0,0 +1,275 @@ +{ + "long" : { + "day" : { + "next" : "jutri", + "past" : { + "other" : "pred {0} dnevi", + "one" : "pred {0} dnevom", + "two" : "pred {0} dnevoma" + }, + "future" : { + "two" : "čez {0} dneva", + "one" : "čez {0} dan", + "other" : "čez {0} dni" + }, + "previous" : "včeraj", + "current" : "danes" + }, + "month" : { + "future" : { + "few" : "čez {0} mesece", + "other" : "čez {0} mesecev", + "two" : "čez {0} meseca", + "one" : "čez {0} mesec" + }, + "next" : "naslednji mesec", + "current" : "ta mesec", + "past" : { + "other" : "pred {0} meseci", + "two" : "pred {0} mesecema", + "one" : "pred {0} mesecem" + }, + "previous" : "prejšnji mesec" + }, + "second" : { + "past" : { + "two" : "pred {0} sekundama", + "other" : "pred {0} sekundami", + "one" : "pred {0} sekundo" + }, + "current" : "zdaj", + "future" : { + "other" : "čez {0} sekund", + "one" : "čez {0} sekundo", + "few" : "čez {0} sekunde", + "two" : "čez {0} sekundi" + } + }, + "now" : "zdaj", + "hour" : { + "past" : { + "two" : "pred {0} urama", + "other" : "pred {0} urami", + "one" : "pred {0} uro" + }, + "current" : "v tej uri", + "future" : { + "few" : "čez {0} ure", + "one" : "čez {0} uro", + "other" : "čez {0} ur", + "two" : "čez {0} uri" + } + }, + "minute" : { + "past" : { + "two" : "pred {0} minutama", + "one" : "pred {0} minuto", + "other" : "pred {0} minutami" + }, + "current" : "to minuto", + "future" : { + "two" : "čez {0} minuti", + "one" : "čez {0} minuto", + "few" : "čez {0} minute", + "other" : "čez {0} minut" + } + }, + "week" : { + "past" : { + "other" : "pred {0} tedni", + "one" : "pred {0} tednom", + "two" : "pred {0} tednoma" + }, + "next" : "naslednji teden", + "previous" : "prejšnji teden", + "current" : "ta teden", + "future" : { + "one" : "čez {0} teden", + "two" : "čez {0} tedna", + "few" : "čez {0} tedne", + "other" : "čez {0} tednov" + } + }, + "year" : { + "previous" : "lani", + "future" : { + "two" : "čez {0} leti", + "other" : "čez {0} let", + "one" : "čez {0} leto", + "few" : "čez {0} leta" + }, + "past" : { + "one" : "pred {0} letom", + "other" : "pred {0} leti", + "two" : "pred {0} letoma" + }, + "current" : "letos", + "next" : "naslednje leto" + }, + "quarter" : { + "current" : "to četrtletje", + "previous" : "zadnje četrtletje", + "future" : { + "few" : "čez {0} četrtletja", + "one" : "čez {0} četrtletje", + "other" : "čez {0} četrtletij", + "two" : "čez {0} četrtletji" + }, + "next" : "naslednje četrtletje", + "past" : { + "one" : "pred {0} četrtletjem", + "two" : "pred {0} četrtletjema", + "other" : "pred {0} četrtletji" + } + } + }, + "narrow" : { + "quarter" : { + "next" : "naslednje četrtletje", + "past" : "pred {0} četr.", + "future" : "čez {0} četr.", + "previous" : "zadnje četrtletje", + "current" : "to četrtletje" + }, + "hour" : { + "past" : "pred {0} h", + "future" : "čez {0} h", + "current" : "v tej uri" + }, + "day" : { + "previous" : "včeraj", + "past" : { + "two" : "pred {0} dnevoma", + "other" : "pred {0} dnevi", + "one" : "pred {0} dnevom" + }, + "future" : { + "one" : "čez {0} dan", + "two" : "čez {0} dneva", + "other" : "čez {0} dni" + }, + "next" : "jutri", + "current" : "danes" + }, + "year" : { + "current" : "letos", + "future" : { + "few" : "čez {0} leta", + "one" : "čez {0} leto", + "two" : "čez {0} leti", + "other" : "čez {0} let" + }, + "next" : "naslednje leto", + "previous" : "lani", + "past" : { + "other" : "pred {0} leti", + "one" : "pred {0} letom", + "two" : "pred {0} letoma" + } + }, + "week" : { + "next" : "naslednji teden", + "future" : "čez {0} ted.", + "past" : "pred {0} ted.", + "previous" : "prejšnji teden", + "current" : "ta teden" + }, + "minute" : { + "current" : "to minuto", + "past" : "pred {0} min", + "future" : "čez {0} min" + }, + "month" : { + "next" : "naslednji mesec", + "current" : "ta mesec", + "previous" : "prejšnji mesec", + "past" : "pred {0} mes.", + "future" : "čez {0} mes." + }, + "second" : { + "current" : "zdaj", + "future" : "čez {0} s", + "past" : "pred {0} s" + }, + "now" : "zdaj" + }, + "short" : { + "week" : { + "previous" : "prejšnji teden", + "current" : "ta teden", + "next" : "naslednji teden", + "past" : "pred {0} ted.", + "future" : "čez {0} ted." + }, + "minute" : { + "past" : "pred {0} min.", + "current" : "to minuto", + "future" : "čez {0} min." + }, + "day" : { + "past" : { + "one" : "pred {0} dnevom", + "two" : "pred {0} dnevoma", + "other" : "pred {0} dnevi" + }, + "next" : "jutri", + "previous" : "včeraj", + "current" : "danes", + "future" : { + "other" : "čez {0} dni", + "one" : "čez {0} dan", + "two" : "čez {0} dneva" + } + }, + "now" : "zdaj", + "second" : { + "past" : "pred {0} s", + "current" : "zdaj", + "future" : "čez {0} s" + }, + "hour" : { + "current" : "v tej uri", + "past" : { + "other" : "pred {0} urami", + "two" : "pred {0} urama", + "one" : "pred {0} uro" + }, + "future" : { + "two" : "čez {0} uri", + "other" : "čez {0} ur", + "few" : "čez {0} ure", + "one" : "čez {0} uro" + } + }, + "month" : { + "future" : "čez {0} mes.", + "next" : "naslednji mesec", + "current" : "ta mesec", + "past" : "pred {0} mes.", + "previous" : "prejšnji mesec" + }, + "year" : { + "previous" : "lani", + "current" : "letos", + "past" : { + "one" : "pred {0} letom", + "two" : "pred {0} letoma", + "other" : "pred {0} leti" + }, + "next" : "naslednje leto", + "future" : { + "few" : "čez {0} leta", + "two" : "čez {0} leti", + "other" : "čez {0} let", + "one" : "čez {0} leto" + } + }, + "quarter" : { + "past" : "pred {0} četrtl.", + "future" : "čez {0} četrtl.", + "next" : "naslednje četrtletje", + "previous" : "zadnje četrtletje", + "current" : "to četrtletje" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/sq.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/sq.json new file mode 100644 index 0000000..10274da --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/sq.json @@ -0,0 +1,245 @@ +{ + "narrow" : { + "quarter" : { + "current" : "këtë tremujor", + "previous" : "tremujorin e kaluar", + "past" : { + "other" : "{0} tremujorë më parë", + "one" : "{0} tremujor më parë" + }, + "future" : { + "one" : "pas {0} tremujori", + "other" : "pas {0} tremujorësh" + }, + "next" : "tremujorin e ardhshëm" + }, + "now" : "tani", + "minute" : { + "past" : "{0} min. më parë", + "future" : "pas {0} min.", + "current" : "këtë minutë" + }, + "month" : { + "future" : { + "other" : "pas {0} muajsh", + "one" : "pas {0} muaji" + }, + "previous" : "muajin e kaluar", + "next" : "muajin e ardhshëm", + "current" : "këtë muaj", + "past" : "{0} muaj më parë" + }, + "second" : { + "future" : "pas {0} sek.", + "current" : "tani", + "past" : "{0} sek. më parë" + }, + "week" : { + "past" : "{0} javë më parë", + "future" : { + "one" : "pas {0} jave", + "other" : "pas {0} javësh" + }, + "previous" : "javën e kaluar", + "current" : "këtë javë", + "next" : "javën e ardhshme" + }, + "hour" : { + "past" : "{0} orë më parë", + "future" : { + "one" : "pas {0} ore", + "other" : "pas {0} orësh" + }, + "current" : "këtë orë" + }, + "day" : { + "previous" : "dje", + "past" : "{0} ditë më parë", + "current" : "sot", + "future" : { + "other" : "pas {0} ditësh", + "one" : "pas {0} dite" + }, + "next" : "nesër" + }, + "year" : { + "next" : "vitin e ardhshëm", + "past" : { + "other" : "{0} vjet më parë", + "one" : "{0} vit më parë" + }, + "previous" : "vitin e kaluar", + "current" : "këtë vit", + "future" : { + "one" : "pas {0} viti", + "other" : "pas {0} vjetësh" + } + } + }, + "long" : { + "day" : { + "current" : "sot", + "past" : "{0} ditë më parë", + "previous" : "dje", + "next" : "nesër", + "future" : { + "one" : "pas {0} dite", + "other" : "pas {0} ditësh" + } + }, + "now" : "tani", + "quarter" : { + "current" : "këtë tremujor", + "past" : { + "one" : "{0} tremujor më parë", + "other" : "{0} tremujorë më parë" + }, + "future" : { + "one" : "pas {0} tremujori", + "other" : "pas {0} tremujorësh" + }, + "next" : "tremujorin e ardhshëm", + "previous" : "tremujorin e kaluar" + }, + "year" : { + "current" : "këtë vit", + "past" : { + "other" : "{0} vjet më parë", + "one" : "{0} vit më parë" + }, + "previous" : "vitin e kaluar", + "future" : { + "other" : "pas {0} vjetësh", + "one" : "pas {0} viti" + }, + "next" : "vitin e ardhshëm" + }, + "week" : { + "current" : "këtë javë", + "next" : "javën e ardhshme", + "past" : "{0} javë më parë", + "future" : { + "other" : "pas {0} javësh", + "one" : "pas {0} jave" + }, + "previous" : "javën e kaluar" + }, + "hour" : { + "past" : "{0} orë më parë", + "future" : { + "one" : "pas {0} ore", + "other" : "pas {0} orësh" + }, + "current" : "këtë orë" + }, + "second" : { + "future" : { + "one" : "pas {0} sekonde", + "other" : "pas {0} sekondash" + }, + "current" : "tani", + "past" : { + "one" : "{0} sekondë më parë", + "other" : "{0} sekonda më parë" + } + }, + "minute" : { + "past" : { + "other" : "{0} minuta më parë", + "one" : "{0} minutë më parë" + }, + "current" : "këtë minutë", + "future" : { + "one" : "pas {0} minute", + "other" : "pas {0} minutash" + } + }, + "month" : { + "past" : "{0} muaj më parë", + "next" : "muajin e ardhshëm", + "future" : { + "one" : "pas {0} muaji", + "other" : "pas {0} muajsh" + }, + "current" : "këtë muaj", + "previous" : "muajin e kaluar" + } + }, + "short" : { + "week" : { + "previous" : "javën e kaluar", + "next" : "javën e ardhshme", + "future" : { + "other" : "pas {0} javësh", + "one" : "pas {0} jave" + }, + "current" : "këtë javë", + "past" : "{0} javë më parë" + }, + "day" : { + "current" : "sot", + "previous" : "dje", + "next" : "nesër", + "past" : "{0} ditë më parë", + "future" : { + "other" : "pas {0} ditësh", + "one" : "pas {0} dite" + } + }, + "second" : { + "future" : "pas {0} sek.", + "past" : "{0} sek. më parë", + "current" : "tani" + }, + "year" : { + "previous" : "vitin e kaluar", + "next" : "vitin e ardhshëm", + "current" : "këtë vit", + "future" : { + "one" : "pas {0} viti", + "other" : "pas {0} vjetësh" + }, + "past" : { + "other" : "{0} vjet më parë", + "one" : "{0} vit më parë" + } + }, + "hour" : { + "current" : "këtë orë", + "past" : "{0} orë më parë", + "future" : { + "one" : "pas {0} ore", + "other" : "pas {0} orësh" + } + }, + "now" : "tani", + "quarter" : { + "future" : { + "other" : "pas {0} tremujorësh", + "one" : "pas {0} tremujori" + }, + "previous" : "tremujorin e kaluar", + "current" : "këtë tremujor", + "next" : "tremujorin e ardhshëm", + "past" : { + "one" : "{0} tremujor më parë", + "other" : "{0} tremujorë më parë" + } + }, + "minute" : { + "current" : "këtë minutë", + "past" : "{0} min. më parë", + "future" : "pas {0} min." + }, + "month" : { + "previous" : "muajin e kaluar", + "current" : "këtë muaj", + "next" : "muajin e ardhshëm", + "past" : "{0} muaj më parë", + "future" : { + "one" : "pas {0} muaji", + "other" : "pas {0} muajsh" + } + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/sr_Latn.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/sr_Latn.json new file mode 100644 index 0000000..6ea807c --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/sr_Latn.json @@ -0,0 +1,210 @@ +{ + "narrow" : { + "year" : { + "future" : "za {0} g.", + "previous" : "prošle g.", + "next" : "sledeće g.", + "current" : "ove g.", + "past" : "pre {0} g." + }, + "week" : { + "past" : "pre {0} n.", + "previous" : "prošle n.", + "future" : "za {0} n.", + "current" : "ove n.", + "next" : "sledeće n." + }, + "hour" : { + "future" : "za {0} č.", + "current" : "ovog sata", + "past" : "pre {0} č." + }, + "quarter" : { + "current" : "ovog kvartala", + "previous" : "prošlog kvartala", + "future" : "za {0} kv.", + "past" : "pre {0} kv.", + "next" : "sledećeg kvartala" + }, + "second" : { + "past" : "pre {0} s.", + "future" : "za {0} s.", + "current" : "sada" + }, + "month" : { + "current" : "ovog m.", + "future" : "za {0} m.", + "past" : "pre {0} m.", + "next" : "sledećeg m.", + "previous" : "prošlog m." + }, + "day" : { + "previous" : "juče", + "future" : "za {0} d.", + "next" : "sutra", + "current" : "danas", + "past" : "pre {0} d." + }, + "minute" : { + "future" : "za {0} min.", + "current" : "ovog minuta", + "past" : "pre {0} min." + }, + "now" : "sada" + }, + "long" : { + "now" : "sada", + "week" : { + "previous" : "prošle nedelje", + "current" : "ove nedelje", + "future" : { + "one" : "za {0} nedelju", + "few" : "za {0} nedelje", + "other" : "za {0} nedelja" + }, + "next" : "sledeće nedelje", + "past" : { + "other" : "pre {0} nedelja", + "few" : "pre {0} nedelje", + "one" : "pre {0} nedelje" + } + }, + "quarter" : { + "current" : "ovog kvartala", + "previous" : "prošlog kvartala", + "past" : "pre {0} kvartala", + "next" : "sledećeg kvartala", + "future" : { + "other" : "za {0} kvartala", + "one" : "za {0} kvartal" + } + }, + "month" : { + "current" : "ovog meseca", + "future" : { + "one" : "za {0} mesec", + "few" : "za {0} meseca", + "other" : "za {0} meseci" + }, + "past" : { + "one" : "pre {0} meseca", + "other" : "pre {0} meseci", + "few" : "pre {0} meseca" + }, + "previous" : "prošlog meseca", + "next" : "sledećeg meseca" + }, + "day" : { + "future" : { + "other" : "za {0} dana", + "one" : "za {0} dan" + }, + "previous" : "juče", + "current" : "danas", + "next" : "sutra", + "past" : "pre {0} dana" + }, + "hour" : { + "future" : { + "one" : "za {0} sat", + "few" : "za {0} sata", + "other" : "za {0} sati" + }, + "current" : "ovog sata", + "past" : { + "one" : "pre {0} sata", + "few" : "pre {0} sata", + "other" : "pre {0} sati" + } + }, + "minute" : { + "past" : "pre {0} minuta", + "current" : "ovog minuta", + "future" : { + "one" : "za {0} minut", + "other" : "za {0} minuta" + } + }, + "second" : { + "current" : "sada", + "past" : { + "few" : "pre {0} sekunde", + "other" : "pre {0} sekundi", + "one" : "pre {0} sekunde" + }, + "future" : { + "other" : "za {0} sekundi", + "one" : "za {0} sekundu", + "few" : "za {0} sekunde" + } + }, + "year" : { + "future" : { + "few" : "za {0} godine", + "one" : "za {0} godinu", + "other" : "za {0} godina" + }, + "previous" : "prošle godine", + "next" : "sledeće godine", + "past" : { + "one" : "pre {0} godine", + "few" : "pre {0} godine", + "other" : "pre {0} godina" + }, + "current" : "ove godine" + } + }, + "short" : { + "second" : { + "current" : "sada", + "past" : "pre {0} sek.", + "future" : "za {0} sek." + }, + "now" : "sada", + "month" : { + "future" : "za {0} mes.", + "current" : "ovog mes.", + "past" : "pre {0} mes.", + "previous" : "prošlog mes.", + "next" : "sledećeg mes." + }, + "day" : { + "previous" : "juče", + "current" : "danas", + "next" : "sutra", + "future" : "za {0} d.", + "past" : "pre {0} d." + }, + "minute" : { + "current" : "ovog minuta", + "future" : "za {0} min.", + "past" : "pre {0} min." + }, + "quarter" : { + "past" : "pre {0} kv.", + "previous" : "prošlog kvartala", + "current" : "ovog kvartala", + "future" : "za {0} kv.", + "next" : "sledećeg kvartala" + }, + "hour" : { + "current" : "ovog sata", + "future" : "za {0} č.", + "past" : "pre {0} č." + }, + "week" : { + "future" : "za {0} ned.", + "previous" : "prošle ned.", + "next" : "sledeće ned.", + "past" : "pre {0} ned.", + "current" : "ove ned." + }, + "year" : { + "next" : "sledeće god.", + "current" : "ove god.", + "past" : "pre {0} god.", + "future" : "za {0} god.", + "previous" : "prošle god." + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/sv.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/sv.json new file mode 100644 index 0000000..df70bb3 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/sv.json @@ -0,0 +1,203 @@ +{ + "short" : { + "now" : "nu", + "minute" : { + "past" : "för {0} min sen", + "current" : "denna minut", + "future" : "om {0} min" + }, + "year" : { + "current" : "i år", + "future" : "om {0} år", + "previous" : "i fjol", + "next" : "nästa år", + "past" : "för {0} år sen" + }, + "second" : { + "past" : "för {0} s sen", + "future" : { + "one" : "om {0} sek", + "other" : "om {0} sek" + }, + "current" : "nu" + }, + "hour" : { + "past" : "för {0} tim sedan", + "future" : "om {0} tim", + "current" : "denna timme" + }, + "month" : { + "current" : "denna mån.", + "next" : "nästa mån.", + "past" : "för {0} mån. sen", + "future" : "om {0} mån.", + "previous" : "förra mån." + }, + "quarter" : { + "future" : "om {0} kv.", + "previous" : "förra kv.", + "next" : "nästa kv.", + "past" : "för {0} kv. sen", + "current" : "detta kv." + }, + "week" : { + "next" : "nästa v.", + "past" : "för {0} v. sedan", + "current" : "denna v.", + "previous" : "förra v.", + "future" : "om {0} v." + }, + "day" : { + "next" : "i morgon", + "current" : "i dag", + "previous" : "i går", + "past" : { + "one" : "för {0} d sedan", + "other" : "för {0} d sedan" + }, + "future" : "om {0} d" + } + }, + "long" : { + "minute" : { + "current" : "denna minut", + "past" : { + "one" : "för {0} minut sedan", + "other" : "för {0} minuter sedan" + }, + "future" : { + "other" : "om {0} minuter", + "one" : "om {0} minut" + } + }, + "quarter" : { + "current" : "detta kvartal", + "past" : "för {0} kvartal sedan", + "next" : "nästa kvartal", + "future" : "om {0} kvartal", + "previous" : "förra kvartalet" + }, + "week" : { + "future" : { + "other" : "om {0} veckor", + "one" : "om {0} vecka" + }, + "previous" : "förra veckan", + "current" : "denna vecka", + "next" : "nästa vecka", + "past" : { + "one" : "för {0} vecka sedan", + "other" : "för {0} veckor sedan" + } + }, + "second" : { + "current" : "nu", + "future" : { + "one" : "om {0} sekund", + "other" : "om {0} sekunder" + }, + "past" : { + "one" : "för {0} sekund sedan", + "other" : "för {0} sekunder sedan" + } + }, + "hour" : { + "current" : "denna timme", + "past" : { + "other" : "för {0} timmar sedan", + "one" : "för {0} timme sedan" + }, + "future" : { + "other" : "om {0} timmar", + "one" : "om {0} timme" + } + }, + "now" : "nu", + "year" : { + "past" : "för {0} år sedan", + "previous" : "i fjol", + "current" : "i år", + "next" : "nästa år", + "future" : "om {0} år" + }, + "day" : { + "current" : "i dag", + "previous" : "i går", + "next" : "i morgon", + "past" : { + "other" : "för {0} dagar sedan", + "one" : "för {0} dag sedan" + }, + "future" : { + "other" : "om {0} dagar", + "one" : "om {0} dag" + } + }, + "month" : { + "next" : "nästa månad", + "past" : { + "other" : "för {0} månader sedan", + "one" : "för {0} månad sedan" + }, + "future" : { + "other" : "om {0} månader", + "one" : "om {0} månad" + }, + "current" : "denna månad", + "previous" : "förra månaden" + } + }, + "narrow" : { + "month" : { + "next" : "nästa mån.", + "past" : "−{0} mån", + "current" : "denna mån.", + "future" : "+{0} mån.", + "previous" : "förra mån." + }, + "day" : { + "current" : "idag", + "past" : "−{0} d", + "future" : "+{0} d", + "previous" : "igår", + "next" : "imorgon" + }, + "second" : { + "past" : "−{0} s", + "future" : "+{0} s", + "current" : "nu" + }, + "quarter" : { + "current" : "detta kv.", + "previous" : "förra kv.", + "past" : "−{0} kv", + "next" : "nästa kv.", + "future" : "+{0} kv." + }, + "year" : { + "previous" : "i fjol", + "current" : "i år", + "past" : "−{0} år", + "future" : "+{0} år", + "next" : "nästa år" + }, + "now" : "nu", + "minute" : { + "current" : "denna minut", + "past" : "−{0} min", + "future" : "+{0} min" + }, + "week" : { + "past" : "−{0} v", + "future" : "+{0} v.", + "next" : "nästa v.", + "current" : "denna v.", + "previous" : "förra v." + }, + "hour" : { + "past" : "−{0} h", + "future" : "+{0} h", + "current" : "denna timme" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/sw.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/sw.json new file mode 100644 index 0000000..9049f86 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/sw.json @@ -0,0 +1,251 @@ +{ + "narrow" : { + "year" : { + "next" : "mwaka ujao", + "past" : { + "one" : "mwaka {0} uliopita", + "other" : "miaka {0} iliyopita" + }, + "future" : { + "one" : "baada ya mwaka {0}", + "other" : "baada ya miaka {0}" + }, + "previous" : "mwaka uliopita", + "current" : "mwaka huu" + }, + "quarter" : { + "past" : { + "one" : "robo {0} iliyopita", + "other" : "robo {0} zilizopita" + }, + "previous" : "robo ya mwaka iliyopita", + "current" : "robo hii ya mwaka", + "next" : "robo ya mwaka inayofuata", + "future" : "baada ya robo {0}" + }, + "hour" : { + "past" : { + "other" : "Saa {0} zilizopita", + "one" : "Saa {0} iliyopita" + }, + "future" : "baada ya saa {0}", + "current" : "saa hii" + }, + "second" : { + "past" : { + "one" : "sekunde {0} iliyopita", + "other" : "sekunde {0} zilizopita" + }, + "current" : "sasa hivi", + "future" : "baada ya sekunde {0}" + }, + "week" : { + "previous" : "wiki iliyopita", + "past" : { + "other" : "wiki {0} zilizopita", + "one" : "wiki {0} iliyopita" + }, + "next" : "wiki ijayo", + "future" : "baada ya wiki {0}", + "current" : "wiki hii" + }, + "month" : { + "past" : { + "one" : "mwezi {0} uliopita", + "other" : "miezi {0} iliyopita" + }, + "current" : "mwezi huu", + "future" : { + "one" : "baada ya mwezi {0}", + "other" : "baada ya miezi {0}" + }, + "next" : "mwezi ujao", + "previous" : "mwezi uliopita" + }, + "day" : { + "future" : "baada ya siku {0}", + "current" : "leo", + "past" : { + "one" : "siku {0} iliyopita", + "other" : "siku {0} zilizopita" + }, + "previous" : "jana", + "next" : "kesho" + }, + "minute" : { + "current" : "dakika hii", + "past" : { + "other" : "dakika {0} zilizopita", + "one" : "dakika {0} iliyopita" + }, + "future" : "baada ya dakika {0}" + }, + "now" : "sasa hivi" + }, + "long" : { + "hour" : { + "future" : "baada ya saa {0}", + "current" : "saa hii", + "past" : { + "one" : "saa {0} iliyopita", + "other" : "saa {0} zilizopita" + } + }, + "week" : { + "previous" : "wiki iliyopita", + "past" : { + "other" : "wiki {0} zilizopita", + "one" : "wiki {0} iliyopita" + }, + "current" : "wiki hii", + "next" : "wiki ijayo", + "future" : "baada ya wiki {0}" + }, + "month" : { + "previous" : "mwezi uliopita", + "future" : { + "one" : "baada ya mwezi {0}", + "other" : "baada ya miezi {0}" + }, + "next" : "mwezi ujao", + "current" : "mwezi huu", + "past" : { + "one" : "mwezi {0} uliopita", + "other" : "miezi {0} iliyopita" + } + }, + "day" : { + "previous" : "jana", + "current" : "leo", + "next" : "kesho", + "past" : { + "one" : "siku {0} iliyopita", + "other" : "siku {0} zilizopita" + }, + "future" : "baada ya siku {0}" + }, + "second" : { + "future" : "baada ya sekunde {0}", + "current" : "sasa hivi", + "past" : { + "one" : "Sekunde {0} iliyopita", + "other" : "Sekunde {0} zilizopita" + } + }, + "minute" : { + "past" : { + "one" : "dakika {0} iliyopita", + "other" : "dakika {0} zilizopita" + }, + "future" : "baada ya dakika {0}", + "current" : "dakika hii" + }, + "year" : { + "current" : "mwaka huu", + "past" : { + "one" : "mwaka {0} uliopita", + "other" : "miaka {0} iliyopita" + }, + "future" : { + "other" : "baada ya miaka {0}", + "one" : "baada ya mwaka {0}" + }, + "next" : "mwaka ujao", + "previous" : "mwaka uliopita" + }, + "now" : "sasa hivi", + "quarter" : { + "past" : { + "other" : "robo {0} zilizopita", + "one" : "robo {0} iliyopita" + }, + "future" : "baada ya robo {0}", + "current" : "robo hii ya mwaka", + "next" : "robo ya mwaka inayofuata", + "previous" : "robo ya mwaka iliyopita" + } + }, + "short" : { + "hour" : { + "current" : "saa hii", + "past" : { + "other" : "saa {0} zilizopita", + "one" : "saa {0} iliyopita" + }, + "future" : "baada ya saa {0}" + }, + "second" : { + "future" : "baada ya sekunde {0}", + "past" : { + "other" : "sekunde {0} zilizopita", + "one" : "sekunde {0} iliyopita" + }, + "current" : "sasa hivi" + }, + "now" : "sasa hivi", + "year" : { + "past" : { + "one" : "mwaka {0} uliopita", + "other" : "miaka {0} iliyopita" + }, + "future" : { + "other" : "baada ya miaka {0}", + "one" : "baada ya mwaka {0}" + }, + "previous" : "mwaka uliopita", + "current" : "mwaka huu", + "next" : "mwaka ujao" + }, + "quarter" : { + "previous" : "robo ya mwaka iliyopita", + "future" : "baada ya robo {0}", + "next" : "robo ya mwaka inayofuata", + "past" : { + "one" : "robo {0} iliyopita", + "other" : "robo {0} zilizopita" + }, + "current" : "robo hii ya mwaka" + }, + "week" : { + "previous" : "wiki iliyopita", + "current" : "wiki hii", + "next" : "wiki ijayo", + "past" : { + "one" : "wiki {0} iliyopita", + "other" : "wiki {0} zilizopita" + }, + "future" : "baada ya wiki {0}" + }, + "day" : { + "next" : "kesho", + "past" : { + "other" : "siku {0} zilizopita", + "one" : "siku {0} iliyopita" + }, + "previous" : "jana", + "future" : "baada ya siku {0}", + "current" : "leo" + }, + "minute" : { + "past" : { + "one" : "dakika {0} iliyopita", + "other" : "dakika {0} zilizopita" + }, + "future" : "baada ya dakika {0}", + "current" : "dakika hii" + }, + "month" : { + "next" : "mwezi ujao", + "past" : { + "one" : "mwezi {0} uliopita", + "other" : "miezi {0} iliyopita" + }, + "future" : { + "one" : "baada ya mwezi {0}", + "other" : "baada ya miezi {0}" + }, + "previous" : "mwezi uliopita", + "current" : "mwezi huu" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ta.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ta.json new file mode 100644 index 0000000..9122e7d --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ta.json @@ -0,0 +1,215 @@ +{ + "narrow" : { + "second" : { + "future" : "{0} வி.", + "past" : "{0} வி. முன்", + "current" : "இப்போது" + }, + "year" : { + "next" : "அடுத்த ஆண்டு", + "past" : "{0} ஆ. முன்", + "future" : "{0} ஆ.", + "previous" : "கடந்த ஆண்டு", + "current" : "இந்த ஆண்டு" + }, + "month" : { + "past" : "{0} மா. முன்", + "next" : "அடுத்த மாதம்", + "future" : "{0} மா.", + "previous" : "கடந்த மாதம்", + "current" : "இந்த மாதம்" + }, + "minute" : { + "past" : "{0} நி. முன்", + "current" : "இந்த ஒரு நிமிடத்தில்", + "future" : "{0} நி." + }, + "quarter" : { + "previous" : "இறுதி காலாண்டு", + "current" : "இந்த காலாண்டு", + "next" : "அடுத்த காலாண்டு", + "past" : "{0} கா. முன்", + "future" : "{0} கா." + }, + "hour" : { + "future" : "{0} ம.", + "past" : "{0} ம. முன்", + "current" : "இந்த ஒரு மணிநேரத்தில்" + }, + "now" : "இப்போது", + "week" : { + "next" : "அடுத்த வாரம்", + "previous" : "கடந்த வாரம்", + "past" : "{0} வா. முன்", + "future" : "{0} வா.", + "current" : "இந்த வாரம்" + }, + "day" : { + "previous" : "நேற்று", + "future" : "{0} நா.", + "past" : "{0} நா. முன்", + "current" : "இன்று", + "next" : "நாளை" + } + }, + "long" : { + "day" : { + "previous" : "நேற்று", + "past" : { + "other" : "{0} நாட்களுக்கு முன்", + "one" : "{0} நாளுக்கு முன்" + }, + "future" : { + "other" : "{0} நாட்களில்", + "one" : "{0} நாளில்" + }, + "next" : "நாளை", + "current" : "இன்று" + }, + "hour" : { + "future" : "{0} மணிநேரத்தில்", + "current" : "இந்த ஒரு மணிநேரத்தில்", + "past" : "{0} மணிநேரம் முன்" + }, + "month" : { + "next" : "அடுத்த மாதம்", + "current" : "இந்த மாதம்", + "past" : { + "one" : "{0} மாதத்துக்கு முன்", + "other" : "{0} மாதங்களுக்கு முன்" + }, + "previous" : "கடந்த மாதம்", + "future" : { + "one" : "{0} மாதத்தில்", + "other" : "{0} மாதங்களில்" + } + }, + "quarter" : { + "next" : "அடுத்த காலாண்டு", + "past" : { + "one" : "{0} காலாண்டுக்கு முன்", + "other" : "{0} காலாண்டுகளுக்கு முன்" + }, + "previous" : "கடந்த காலாண்டு", + "current" : "இந்த காலாண்டு", + "future" : { + "one" : "+{0} காலாண்டில்", + "other" : "{0} காலாண்டுகளில்" + } + }, + "year" : { + "next" : "அடுத்த ஆண்டு", + "current" : "இந்த ஆண்டு", + "future" : { + "other" : "{0} ஆண்டுகளில்", + "one" : "{0} ஆண்டில்" + }, + "previous" : "கடந்த ஆண்டு", + "past" : { + "other" : "{0} ஆண்டுகளுக்கு முன்", + "one" : "{0} ஆண்டிற்கு முன்" + } + }, + "minute" : { + "current" : "இந்த ஒரு நிமிடத்தில்", + "future" : { + "one" : "{0} நிமிடத்தில்", + "other" : "{0} நிமிடங்களில்" + }, + "past" : { + "other" : "{0} நிமிடங்களுக்கு முன்", + "one" : "{0} நிமிடத்திற்கு முன்" + } + }, + "second" : { + "future" : { + "one" : "{0} விநாடியில்", + "other" : "{0} விநாடிகளில்" + }, + "past" : { + "one" : "{0} விநாடிக்கு முன்", + "other" : "{0} விநாடிகளுக்கு முன்" + }, + "current" : "இப்போது" + }, + "week" : { + "future" : { + "one" : "{0} வாரத்தில்", + "other" : "{0} வாரங்களில்" + }, + "previous" : "கடந்த வாரம்", + "current" : "இந்த வாரம்", + "next" : "அடுத்த வாரம்", + "past" : { + "other" : "{0} வாரங்களுக்கு முன்", + "one" : "{0} வாரத்திற்கு முன்" + } + }, + "now" : "இப்போது" + }, + "short" : { + "minute" : { + "future" : "{0} நிமி.", + "current" : "இந்த ஒரு நிமிடத்தில்", + "past" : "{0} நிமி. முன்" + }, + "month" : { + "current" : "இந்த மாதம்", + "past" : "{0} மாத. முன்", + "future" : "{0} மாத.", + "next" : "அடுத்த மாதம்", + "previous" : "கடந்த மாதம்" + }, + "week" : { + "current" : "இந்த வாரம்", + "past" : "{0} வார. முன்", + "future" : "{0} வார.", + "next" : "அடுத்த வாரம்", + "previous" : "கடந்த வாரம்" + }, + "hour" : { + "future" : "{0} மணி.", + "current" : "இந்த ஒரு மணிநேரத்தில்", + "past" : "{0} மணி. முன்" + }, + "day" : { + "next" : "நாளை", + "current" : "இன்று", + "previous" : "நேற்று", + "past" : { + "one" : "{0} நாளுக்கு முன்", + "other" : "{0} நாட்களுக்கு முன்" + }, + "future" : { + "one" : "{0} நாளில்", + "other" : "{0} நாட்களில்" + } + }, + "second" : { + "future" : "{0} விநா.", + "current" : "இப்போது", + "past" : "{0} விநா. முன்" + }, + "now" : "இப்போது", + "year" : { + "future" : { + "one" : "{0} ஆண்டில்", + "other" : "{0} ஆண்டுகளில்" + }, + "previous" : "கடந்த ஆண்டு", + "next" : "அடுத்த ஆண்டு", + "current" : "இந்த ஆண்டு", + "past" : { + "other" : "{0} ஆண்டுகளுக்கு முன்", + "one" : "{0} ஆண்டிற்கு முன்" + } + }, + "quarter" : { + "current" : "இந்த காலாண்டு", + "future" : "{0} காலா.", + "previous" : "இறுதி காலாண்டு", + "next" : "அடுத்த காலாண்டு", + "past" : "{0} காலா. முன்" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/te.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/te.json new file mode 100644 index 0000000..159c190 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/te.json @@ -0,0 +1,263 @@ +{ + "narrow" : { + "now" : "ప్రస్తుతం", + "hour" : { + "past" : "{0} గం. క్రితం", + "future" : "{0} గం.లో", + "current" : "ఈ గంట" + }, + "year" : { + "future" : { + "one" : "{0} సం.లో", + "other" : "{0} సం.ల్లో" + }, + "current" : "ఈ సంవత్సరం", + "past" : "{0} సం. క్రితం", + "previous" : "గత సంవత్సరం", + "next" : "తదుపరి సంవత్సరం" + }, + "month" : { + "past" : { + "other" : "{0} నెలల క్రితం", + "one" : "{0} నెల క్రితం" + }, + "future" : { + "other" : "{0} నెలల్లో", + "one" : "{0} నెలలో" + }, + "previous" : "గత నెల", + "current" : "ఈ నెల", + "next" : "తదుపరి నెల" + }, + "day" : { + "current" : "ఈ రోజు", + "future" : { + "other" : "{0} రోజుల్లో", + "one" : "{0} రోజులో" + }, + "previous" : "నిన్న", + "next" : "రేపు", + "past" : { + "other" : "{0} రోజుల క్రితం", + "one" : "{0} రోజు క్రితం" + } + }, + "second" : { + "past" : "{0} సెక. క్రితం", + "future" : { + "other" : "{0} సెక. లో", + "one" : "{0} సెక.లో" + }, + "current" : "ప్రస్తుతం" + }, + "minute" : { + "current" : "ఈ నిమిషం", + "past" : "{0} నిమి. క్రితం", + "future" : "{0} నిమి.లో" + }, + "quarter" : { + "previous" : "గత త్రైమాసికం", + "past" : "{0} త్రైమా. క్రితం", + "current" : "ఈ త్రైమాసికం", + "next" : "తదుపరి త్రైమాసికం", + "future" : { + "one" : "{0} త్రైమాసికంలో", + "other" : "{0} త్రైమాసికాల్లో" + } + }, + "week" : { + "next" : "తదుపరి వారం", + "current" : "ఈ వారం", + "past" : { + "one" : "{0} వారం క్రితం", + "other" : "{0} వారాల క్రితం" + }, + "future" : { + "one" : "{0} వారంలో", + "other" : "{0} వారాల్లో" + }, + "previous" : "గత వారం" + } + }, + "long" : { + "month" : { + "future" : { + "one" : "{0} నెలలో", + "other" : "{0} నెలల్లో" + }, + "previous" : "గత నెల", + "current" : "ఈ నెల", + "next" : "తదుపరి నెల", + "past" : { + "other" : "{0} నెలల క్రితం", + "one" : "{0} నెల క్రితం" + } + }, + "quarter" : { + "previous" : "గత త్రైమాసికం", + "next" : "తదుపరి త్రైమాసికం", + "current" : "ఈ త్రైమాసికం", + "past" : { + "other" : "{0} త్రైమాసికాల క్రితం", + "one" : "{0} త్రైమాసికం క్రితం" + }, + "future" : { + "other" : "{0} త్రైమాసికాల్లో", + "one" : "{0} త్రైమాసికంలో" + } + }, + "hour" : { + "current" : "ఈ గంట", + "past" : { + "other" : "{0} గంటల క్రితం", + "one" : "{0} గంట క్రితం" + }, + "future" : { + "one" : "{0} గంటలో", + "other" : "{0} గంటల్లో" + } + }, + "second" : { + "current" : "ప్రస్తుతం", + "past" : { + "other" : "{0} సెకన్ల క్రితం", + "one" : "{0} సెకను క్రితం" + }, + "future" : { + "one" : "{0} సెకనులో", + "other" : "{0} సెకన్లలో" + } + }, + "year" : { + "past" : { + "one" : "{0} సంవత్సరం క్రితం", + "other" : "{0} సంవత్సరాల క్రితం" + }, + "future" : { + "one" : "{0} సంవత్సరంలో", + "other" : "{0} సంవత్సరాల్లో" + }, + "previous" : "గత సంవత్సరం", + "current" : "ఈ సంవత్సరం", + "next" : "తదుపరి సంవత్సరం" + }, + "day" : { + "future" : { + "one" : "{0} రోజులో", + "other" : "{0} రోజుల్లో" + }, + "current" : "ఈ రోజు", + "previous" : "నిన్న", + "next" : "రేపు", + "past" : { + "one" : "{0} రోజు క్రితం", + "other" : "{0} రోజుల క్రితం" + } + }, + "minute" : { + "current" : "ఈ నిమిషం", + "past" : { + "other" : "{0} నిమిషాల క్రితం", + "one" : "{0} నిమిషం క్రితం" + }, + "future" : { + "one" : "{0} నిమిషంలో", + "other" : "{0} నిమిషాల్లో" + } + }, + "week" : { + "past" : { + "one" : "{0} వారం క్రితం", + "other" : "{0} వారాల క్రితం" + }, + "next" : "తదుపరి వారం", + "current" : "ఈ వారం", + "future" : { + "one" : "{0} వారంలో", + "other" : "{0} వారాల్లో" + }, + "previous" : "గత వారం" + }, + "now" : "ప్రస్తుతం" + }, + "short" : { + "month" : { + "past" : { + "one" : "{0} నెల క్రితం", + "other" : "{0} నెలల క్రితం" + }, + "next" : "తదుపరి నెల", + "future" : { + "one" : "{0} నెలలో", + "other" : "{0} నెలల్లో" + }, + "previous" : "గత నెల", + "current" : "ఈ నెల" + }, + "week" : { + "next" : "తదుపరి వారం", + "previous" : "గత వారం", + "past" : { + "one" : "{0} వారం క్రితం", + "other" : "{0} వారాల క్రితం" + }, + "current" : "ఈ వారం", + "future" : { + "one" : "{0} వారంలో", + "other" : "{0} వారాల్లో" + } + }, + "hour" : { + "future" : "{0} గం.లో", + "current" : "ఈ గంట", + "past" : "{0} గం. క్రితం" + }, + "quarter" : { + "next" : "తదుపరి త్రైమాసికం", + "previous" : "గత త్రైమాసికం", + "past" : "{0} త్రైమా. క్రితం", + "future" : { + "one" : "{0} త్రైమా.లో", + "other" : "{0} త్రైమా.ల్లో" + }, + "current" : "ఈ త్రైమాసికం" + }, + "minute" : { + "current" : "ఈ నిమిషం", + "past" : "{0} నిమి. క్రితం", + "future" : "{0} నిమి.లో" + }, + "now" : "ప్రస్తుతం", + "day" : { + "previous" : "నిన్న", + "past" : { + "other" : "{0} రోజుల క్రితం", + "one" : "{0} రోజు క్రితం" + }, + "current" : "ఈ రోజు", + "next" : "రేపు", + "future" : { + "one" : "{0} రోజులో", + "other" : "{0} రోజుల్లో" + } + }, + "year" : { + "next" : "తదుపరి సంవత్సరం", + "current" : "ఈ సంవత్సరం", + "past" : "{0} సం. క్రితం", + "previous" : "గత సంవత్సరం", + "future" : { + "one" : "{0} సం.లో", + "other" : "{0} సం.ల్లో" + } + }, + "second" : { + "current" : "ప్రస్తుతం", + "future" : { + "other" : "{0} సెకన్లలో", + "one" : "{0} సెకనులో" + }, + "past" : "{0} సెక. క్రితం" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/th.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/th.json new file mode 100644 index 0000000..7078e21 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/th.json @@ -0,0 +1,161 @@ +{ + "long" : { + "week" : { + "past" : "{0} สัปดาห์ที่ผ่านมา", + "next" : "สัปดาห์หน้า", + "current" : "สัปดาห์นี้", + "future" : "ในอีก {0} สัปดาห์", + "previous" : "สัปดาห์ที่แล้ว" + }, + "hour" : { + "future" : "ในอีก {0} ชั่วโมง", + "past" : "{0} ชั่วโมงที่ผ่านมา", + "current" : "ชั่วโมงนี้" + }, + "second" : { + "future" : "ในอีก {0} วินาที", + "current" : "ขณะนี้", + "past" : "{0} วินาทีที่ผ่านมา" + }, + "day" : { + "future" : "ในอีก {0} วัน", + "previous" : "เมื่อวาน", + "current" : "วันนี้", + "next" : "พรุ่งนี้", + "past" : "{0} วันที่ผ่านมา" + }, + "month" : { + "previous" : "เดือนที่แล้ว", + "current" : "เดือนนี้", + "future" : "ในอีก {0} เดือน", + "past" : "{0} เดือนที่ผ่านมา", + "next" : "เดือนหน้า" + }, + "year" : { + "current" : "ปีนี้", + "next" : "ปีหน้า", + "previous" : "ปีที่แล้ว", + "past" : "{0} ปีที่แล้ว", + "future" : "ในอีก {0} ปี" + }, + "now" : "ขณะนี้", + "minute" : { + "past" : "{0} นาทีที่ผ่านมา", + "future" : "ในอีก {0} นาที", + "current" : "นาทีนี้" + }, + "quarter" : { + "previous" : "ไตรมาสที่แล้ว", + "future" : "ในอีก {0} ไตรมาส", + "next" : "ไตรมาสหน้า", + "past" : "{0} ไตรมาสที่แล้ว", + "current" : "ไตรมาสนี้" + } + }, + "narrow" : { + "month" : { + "next" : "เดือนหน้า", + "past" : "{0} เดือนที่แล้ว", + "current" : "เดือนนี้", + "future" : "ใน {0} เดือน", + "previous" : "เดือนที่แล้ว" + }, + "day" : { + "current" : "วันนี้", + "past" : "{0} วันที่แล้ว", + "future" : "ใน {0} วัน", + "previous" : "เมื่อวาน", + "next" : "พรุ่งนี้" + }, + "second" : { + "future" : "ใน {0} วินาที", + "past" : "{0} วินาทีที่แล้ว", + "current" : "ขณะนี้" + }, + "quarter" : { + "current" : "ไตรมาสนี้", + "previous" : "ไตรมาสที่แล้ว", + "past" : "{0} ไตรมาสที่แล้ว", + "next" : "ไตรมาสหน้า", + "future" : "ใน {0} ไตรมาส" + }, + "year" : { + "previous" : "ปีที่แล้ว", + "current" : "ปีนี้", + "past" : "{0} ปีที่แล้ว", + "future" : "ใน {0} ปี", + "next" : "ปีหน้า" + }, + "now" : "ขณะนี้", + "minute" : { + "future" : "ใน {0} นาที", + "past" : "{0} นาทีที่แล้ว", + "current" : "นาทีนี้" + }, + "week" : { + "past" : "{0} สัปดาห์ที่แล้ว", + "future" : "ใน {0} สัปดาห์", + "next" : "สัปดาห์หน้า", + "current" : "สัปดาห์นี้", + "previous" : "สัปดาห์ที่แล้ว" + }, + "hour" : { + "current" : "ชั่วโมงนี้", + "future" : "ใน {0} ชม.", + "past" : "{0} ชม. ที่แล้ว" + } + }, + "short" : { + "now" : "ขณะนี้", + "minute" : { + "current" : "นาทีนี้", + "past" : "{0} นาทีที่แล้ว", + "future" : "ใน {0} นาที" + }, + "year" : { + "current" : "ปีนี้", + "future" : "ใน {0} ปี", + "previous" : "ปีที่แล้ว", + "next" : "ปีหน้า", + "past" : "{0} ปีที่แล้ว" + }, + "second" : { + "past" : "{0} วินาทีที่แล้ว", + "future" : "ใน {0} วินาที", + "current" : "ขณะนี้" + }, + "hour" : { + "past" : "{0} ชม. ที่แล้ว", + "future" : "ใน {0} ชม.", + "current" : "ชั่วโมงนี้" + }, + "month" : { + "current" : "เดือนนี้", + "next" : "เดือนหน้า", + "past" : "{0} เดือนที่แล้ว", + "future" : "ใน {0} เดือน", + "previous" : "เดือนที่แล้ว" + }, + "quarter" : { + "future" : "ใน {0} ไตรมาส", + "previous" : "ไตรมาสที่แล้ว", + "next" : "ไตรมาสหน้า", + "past" : "{0} ไตรมาสที่แล้ว", + "current" : "ไตรมาสนี้" + }, + "week" : { + "next" : "สัปดาห์หน้า", + "past" : "{0} สัปดาห์ที่แล้ว", + "current" : "สัปดาห์นี้", + "previous" : "สัปดาห์ที่แล้ว", + "future" : "ใน {0} สัปดาห์" + }, + "day" : { + "next" : "พรุ่งนี้", + "current" : "วันนี้", + "previous" : "เมื่อวาน", + "past" : "{0} วันที่แล้ว", + "future" : "ใน {0} วัน" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ti.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ti.json new file mode 100644 index 0000000..48f8cec --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ti.json @@ -0,0 +1,167 @@ +{ + "short" : { + "month" : { + "future" : "ኣብ {0} ወርሒ", + "previous" : "last month", + "current" : "ህሉው ወርሒ", + "next" : "ዝመጽእ ወርሒ", + "past" : "ቅድሚ {0} ወርሒ" + }, + "week" : { + "previous" : "ዝሓለፈ ሰሙን", + "current" : "ህሉው ሰሙን", + "future" : "ኣብ {0} ሰሙን", + "past" : "ቅድሚ {0} ሰሙን", + "next" : "ዝመጽእ ሰሙን" + }, + "hour" : { + "past" : "ቅድሚ {0} ሰዓት", + "current" : "ኣብዚ ሰዓት", + "future" : "ኣብ {0} ሰዓት" + }, + "quarter" : { + "future" : "ኣብ {0} ርብዒ", + "previous" : "ዝሓለፈ ርብዒ", + "current" : "ህሉው ርብዒ", + "next" : "ዝመጽእ ርብዒ", + "past" : "ቅድሚ {0} ርብዒ" + }, + "minute" : { + "current" : "ኣብዚ ደቒቕ", + "past" : "ቅድሚ {0} ደቒቕ", + "future" : "ኣብ {0} ደቒቕ" + }, + "now" : "ሕጂ", + "day" : { + "past" : "ቅድሚ {0} መዓልቲ", + "previous" : "ትማሊ", + "current" : "ሎሚ", + "next" : "ጽባሕ", + "future" : "ኣብ {0} መዓልቲ" + }, + "year" : { + "previous" : "ዓሚ", + "next" : "ንዓመታ", + "current" : "ሎሚ ዓመት", + "future" : "ኣብ {0} ዓ", + "past" : { + "other" : "ቅድሚ {0} ዓ", + "one" : "ቅድሚ -{0} ዓ" + } + }, + "second" : { + "current" : "ሕጂ", + "past" : "ቅድሚ {0} ካልኢት", + "future" : "ኣብ {0} ካልኢት" + } + }, + "narrow" : { + "day" : { + "next" : "ጽባሕ", + "current" : "ሎሚ", + "future" : "ኣብ {0} መዓልቲ", + "past" : "ቅድሚ {0} መዓልቲ", + "previous" : "ትማሊ" + }, + "week" : { + "current" : "ህሉው ሰሙን", + "next" : "ዝመጽእ ሰሙን", + "previous" : "ዝሓለፈ ሰሙን", + "past" : "ቅድሚ {0} ሰሙን", + "future" : "ኣብ {0} ሰሙን" + }, + "quarter" : { + "past" : "ቅድሚ {0} ርብዒ", + "future" : "ኣብ {0} ርብዒ", + "previous" : "ዝሓለፈ ርብዒ", + "current" : "ህሉው ርብዒ", + "next" : "ዝመጽእ ርብዒ" + }, + "month" : { + "previous" : "last month", + "current" : "ህሉው ወርሒ", + "next" : "ዝመጽእ ወርሒ", + "past" : "ቅድሚ {0} ወርሒ", + "future" : "ኣብ {0} ወርሒ" + }, + "hour" : { + "past" : "ቅድሚ {0} ሰዓት", + "future" : "ኣብ {0} ሰዓት", + "current" : "ኣብዚ ሰዓት" + }, + "year" : { + "current" : "ሎሚ ዓመት", + "past" : "ቅድሚ {0} ዓ", + "future" : "ኣብ {0} ዓ", + "next" : "ንዓመታ", + "previous" : "ዓሚ" + }, + "now" : "ሕጂ", + "minute" : { + "future" : "ኣብ {0} ደቒቕ", + "current" : "ኣብዚ ደቒቕ", + "past" : "ቅድሚ {0} ደቒቕ" + }, + "second" : { + "current" : "ሕጂ", + "past" : "ቅድሚ {0} ካልኢት", + "future" : "ኣብ {0} ካልኢት" + } + }, + "long" : { + "minute" : { + "past" : "ቅድሚ {0} ደቒቕ", + "future" : "ኣብ {0} ደቒቕ", + "current" : "ኣብዚ ደቒቕ" + }, + "quarter" : { + "next" : "ዝመጽእ ርብዒ", + "past" : "ቅድሚ {0} ርብዒ", + "future" : "ኣብ {0} ርብዒ", + "previous" : "ዝሓለፈ ርብዒ", + "current" : "ህሉው ርብዒ" + }, + "year" : { + "past" : "ቅድሚ {0} ዓ", + "current" : "ሎሚ ዓመት", + "previous" : "ዓሚ", + "next" : "ንዓመታ", + "future" : "ኣብ {0} ዓ" + }, + "month" : { + "past" : "ቅድሚ {0} ወርሒ", + "future" : "ኣብ {0} ወርሒ", + "current" : "ህሉው ወርሒ", + "next" : "ዝመጽእ ወርሒ", + "previous" : "last month" + }, + "hour" : { + "future" : "ኣብ {0} ሰዓት", + "past" : "ቅድሚ {0} ሰዓት", + "current" : "ኣብዚ ሰዓት" + }, + "now" : "ሕጂ", + "week" : { + "future" : "ኣብ {0} ሰሙን", + "past" : "ቅድሚ {0} ሰሙን", + "previous" : "ዝሓለፈ ሰሙን", + "current" : "ህሉው ሰሙን", + "next" : "ዝመጽእ ሰሙን" + }, + "day" : { + "current" : "ሎሚ", + "previous" : "ትማሊ", + "next" : "ጽባሕ", + "past" : { + "other" : "ኣብ {0} መዓልቲ", + "one" : "ቅድሚ {0} መዓልቲ" + }, + "future" : "ኣብ {0} መዓልቲ" + }, + "second" : { + "future" : "ኣብ {0} ካልኢት", + "current" : "ሕጂ", + "past" : "ቅድሚ {0} ካልኢት" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/tk.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/tk.json new file mode 100644 index 0000000..43fbafa --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/tk.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "quarter" : { + "past" : "{0} ç. öň", + "future" : "{0} ç.-den", + "current" : "şu çärýek", + "previous" : "geçen çärýek", + "next" : "indiki çärýek" + }, + "year" : { + "previous" : "geçen ýyl", + "next" : "indiki ýyl", + "future" : "{0}ý.-dan", + "current" : "şu ýyl", + "past" : "{0}ý. öň" + }, + "week" : { + "future" : "{0} h-den", + "previous" : "geçen hepde", + "next" : "indiki hepde", + "past" : "{0} h. öň", + "current" : "şu hepde" + }, + "day" : { + "current" : "şu gün", + "past" : "{0} g. öň", + "next" : "ertir", + "future" : "{0} g-den", + "previous" : "düýn" + }, + "hour" : { + "current" : "şu sagat", + "past" : "{0} sag. öň", + "future" : "{0} sag-dan" + }, + "minute" : { + "future" : "{0} min-dan", + "current" : "şu minut", + "past" : "{0} min. öň" + }, + "month" : { + "next" : "indiki aý", + "current" : "şu aý", + "past" : "{0} aý öň", + "future" : "{0} aýdan", + "previous" : "geçen aý" + }, + "now" : "häzir", + "second" : { + "future" : "{0} sek-dan", + "current" : "häzir", + "past" : "{0} sek. öň" + } + }, + "short" : { + "minute" : { + "past" : "{0} min. öň", + "future" : "{0} min-dan", + "current" : "şu minut" + }, + "week" : { + "current" : "şu hepde", + "past" : "{0} hep. öň", + "future" : "{0} hep-den", + "next" : "indiki hepde", + "previous" : "geçen hepde" + }, + "year" : { + "future" : "{0}ý.-dan", + "previous" : "geçen ýyl", + "next" : "indiki ýyl", + "current" : "şu ýyl", + "past" : "{0}ý. öň" + }, + "day" : { + "next" : "ertir", + "current" : "şu gün", + "previous" : "düýn", + "past" : "{0} g. öň", + "future" : "{0} g-den" + }, + "hour" : { + "future" : "{0} sag-dan", + "current" : "şu sagat", + "past" : "{0} sag. öň" + }, + "quarter" : { + "current" : "şu çärýek", + "future" : "{0} çär.-den", + "previous" : "geçen çärýek", + "next" : "indiki çärýek", + "past" : "{0} çär. öň" + }, + "second" : { + "past" : "{0} sek. öň", + "current" : "häzir", + "future" : "{0} sek-dan" + }, + "month" : { + "current" : "şu aý", + "past" : "{0} aý öň", + "future" : "{0} aýdan", + "next" : "indiki aý", + "previous" : "geçen aý" + }, + "now" : "häzir" + }, + "long" : { + "hour" : { + "future" : "{0} sagatdan", + "current" : "şu sagat", + "past" : "{0} sagat öň" + }, + "day" : { + "next" : "ertir", + "past" : "{0} gün öň", + "previous" : "düýn", + "future" : "{0} günden", + "current" : "şu gün" + }, + "second" : { + "past" : "{0} sekunt öň", + "current" : "häzir", + "future" : "{0} sekuntdan" + }, + "week" : { + "future" : "{0} hepdeden", + "past" : "{0} hepde öň", + "current" : "şu hepde", + "next" : "indiki hepde", + "previous" : "geçen hepde" + }, + "minute" : { + "future" : "{0} minutdan", + "past" : "{0} minut öň", + "current" : "şu minut" + }, + "month" : { + "future" : "{0} aýdan", + "past" : "{0} aý öň", + "current" : "şu aý", + "previous" : "geçen aý", + "next" : "indiki aý" + }, + "now" : "häzir", + "year" : { + "current" : "şu ýyl", + "next" : "indiki ýyl", + "previous" : "geçen ýyl", + "future" : "{0} ýyldan", + "past" : "{0} ýyl öň" + }, + "quarter" : { + "future" : "{0} çärýekden", + "previous" : "geçen çärýek", + "past" : "{0} çärýek öň", + "next" : "indiki çärýek", + "current" : "şu çärýek" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/to.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/to.json new file mode 100644 index 0000000..0a79ba4 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/to.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "year" : { + "future" : "ʻi he taʻu ʻe {0}", + "previous" : "taʻu kuoʻosi", + "next" : "taʻu kahaʻu", + "current" : "taʻú ni", + "past" : "taʻu ʻe {0} kuoʻosi" + }, + "week" : { + "past" : "uike ʻe {0} kuoʻosi", + "previous" : "uike kuoʻosi", + "future" : "ʻi he uike ʻe {0}", + "current" : "uiké ni", + "next" : "uike kahaʻu" + }, + "hour" : { + "future" : "ʻi he houa ʻe {0}", + "current" : "this hour", + "past" : "houa ʻe {0} kuoʻosi" + }, + "quarter" : { + "current" : "kuata koʻeni", + "previous" : "kuata kuoʻosi", + "future" : "ʻi he kuata ʻe {0}", + "past" : "kuata ʻe {0} kuoʻosi", + "next" : "kuata hoko" + }, + "second" : { + "past" : "sekoni ʻe {0} kuoʻosi", + "future" : "ʻi he sekoni ʻe {0}", + "current" : "taimí ni" + }, + "month" : { + "current" : "māhiná ni", + "future" : "ʻi he māhina ʻe {0}", + "past" : "māhina ʻe {0} kuoʻosi", + "next" : "māhina kahaʻu", + "previous" : "māhina kuoʻosi" + }, + "day" : { + "previous" : "ʻaneafi", + "future" : "ʻi he ʻaho ʻe {0}", + "next" : "ʻapongipongi", + "current" : "ʻahó ni", + "past" : "ʻaho ʻe {0} kuoʻosi" + }, + "minute" : { + "past" : "miniti ʻe {0} kuoʻosi", + "future" : "ʻi he miniti ʻe {0}", + "current" : "this minute" + }, + "now" : "taimí ni" + }, + "long" : { + "quarter" : { + "next" : "kuata hoko", + "current" : "kuata koʻeni", + "previous" : "kuata kuoʻosi", + "past" : "kuata ʻe {0} kuoʻosi", + "future" : "ʻi he kuata ʻe {0}" + }, + "now" : "taimí ni", + "year" : { + "previous" : "taʻu kuoʻosi", + "past" : "taʻu ʻe {0} kuoʻosi", + "future" : "ʻi he taʻu ʻe {0}", + "next" : "taʻu kahaʻu", + "current" : "taʻú ni" + }, + "month" : { + "previous" : "māhina kuoʻosi", + "current" : "māhiná ni", + "future" : "ʻi he māhina ʻe {0}", + "past" : "māhina ʻe {0} kuoʻosi", + "next" : "māhina kahaʻu" + }, + "day" : { + "previous" : "ʻaneafi", + "future" : "ʻi he ʻaho ʻe {0}", + "next" : "ʻapongipongi", + "past" : "ʻaho ʻe {0} kuoʻosi", + "current" : "ʻahó ni" + }, + "second" : { + "future" : "ʻi he sekoni ʻe {0}", + "current" : "taimí ni", + "past" : "sekoni ʻe {0} kuoʻosi" + }, + "week" : { + "past" : "uike ʻe {0} kuoʻosi", + "current" : "uiké ni", + "next" : "uike kahaʻu", + "previous" : "uike kuoʻosi", + "future" : "ʻi he uike ʻe {0}" + }, + "hour" : { + "past" : "houa ʻe {0} kuoʻosi", + "future" : "ʻi he houa ʻe {0}", + "current" : "this hour" + }, + "minute" : { + "current" : "this minute", + "future" : "ʻi he miniti ʻe {0}", + "past" : "miniti ʻe {0} kuoʻosi" + } + }, + "short" : { + "second" : { + "current" : "taimí ni", + "past" : "sekoni ʻe {0} kuoʻosi", + "future" : "ʻi he sekoni ʻe {0}" + }, + "now" : "taimí ni", + "month" : { + "future" : "ʻi he māhina ʻe {0}", + "current" : "māhiná ni", + "past" : "māhina ʻe {0} kuoʻosi", + "previous" : "māhina kuoʻosi", + "next" : "māhina kahaʻu" + }, + "day" : { + "previous" : "ʻaneafi", + "current" : "ʻahó ni", + "next" : "ʻapongipongi", + "future" : "ʻi he ʻaho ʻe {0}", + "past" : "ʻaho ʻe {0} kuoʻosi" + }, + "minute" : { + "current" : "this minute", + "future" : "ʻi he miniti ʻe {0}", + "past" : "miniti ʻe {0} kuoʻosi" + }, + "quarter" : { + "past" : "kuata ʻe {0} kuoʻosi", + "previous" : "kuata kuoʻosi", + "current" : "kuata koʻeni", + "future" : "ʻi he kuata ʻe {0}", + "next" : "kuata hoko" + }, + "hour" : { + "current" : "this hour", + "future" : "ʻi he houa ʻe {0}", + "past" : "houa ʻe {0} kuoʻosi" + }, + "week" : { + "future" : "ʻi he uike ʻe {0}", + "previous" : "uike kuoʻosi", + "next" : "uike kahaʻu", + "past" : "uike ʻe {0} kuoʻosi", + "current" : "uiké ni" + }, + "year" : { + "next" : "taʻu kahaʻu", + "current" : "taʻú ni", + "past" : "taʻu ʻe {0} kuoʻosi", + "future" : "ʻi he taʻu ʻe {0}", + "previous" : "taʻu kuoʻosi" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/tr.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/tr.json new file mode 100644 index 0000000..c6ca9b8 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/tr.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "day" : { + "next" : "yarın", + "future" : "{0} gün sonra", + "previous" : "dün", + "current" : "bugün", + "past" : "{0} gün önce" + }, + "quarter" : { + "next" : "gelecek çeyrek", + "past" : "{0} çyr. önce", + "future" : "{0} çyr. sonra", + "previous" : "geçen çeyrek", + "current" : "bu çeyrek" + }, + "hour" : { + "past" : "{0} sa. önce", + "future" : "{0} sa. sonra", + "current" : "bu saat" + }, + "year" : { + "next" : "gelecek yıl", + "past" : "{0} yıl önce", + "current" : "bu yıl", + "previous" : "geçen yıl", + "future" : "{0} yıl sonra" + }, + "now" : "şimdi", + "month" : { + "current" : "bu ay", + "future" : "{0} ay sonra", + "past" : "{0} ay önce", + "next" : "gelecek ay", + "previous" : "geçen ay" + }, + "week" : { + "previous" : "geçen hafta", + "current" : "bu hafta", + "past" : "{0} hf. önce", + "future" : "{0} hf. sonra", + "next" : "gelecek hafta" + }, + "minute" : { + "current" : "bu dakika", + "past" : "{0} dk. önce", + "future" : "{0} dk. sonra" + }, + "second" : { + "current" : "şimdi", + "past" : "{0} sn. önce", + "future" : "{0} sn. sonra" + } + }, + "long" : { + "day" : { + "previous" : "dün", + "current" : "bugün", + "next" : "yarın", + "past" : "{0} gün önce", + "future" : "{0} gün sonra" + }, + "week" : { + "current" : "bu hafta", + "future" : "{0} hafta sonra", + "past" : "{0} hafta önce", + "previous" : "geçen hafta", + "next" : "gelecek hafta" + }, + "minute" : { + "current" : "bu dakika", + "past" : "{0} dakika önce", + "future" : "{0} dakika sonra" + }, + "month" : { + "future" : "{0} ay sonra", + "next" : "gelecek ay", + "previous" : "geçen ay", + "current" : "bu ay", + "past" : "{0} ay önce" + }, + "hour" : { + "current" : "bu saat", + "past" : "{0} saat önce", + "future" : "{0} saat sonra" + }, + "year" : { + "past" : "{0} yıl önce", + "future" : "{0} yıl sonra", + "previous" : "geçen yıl", + "next" : "gelecek yıl", + "current" : "bu yıl" + }, + "second" : { + "current" : "şimdi", + "past" : "{0} saniye önce", + "future" : "{0} saniye sonra" + }, + "now" : "şimdi", + "quarter" : { + "past" : "{0} çeyrek önce", + "current" : "bu çeyrek", + "previous" : "geçen çeyrek", + "future" : "{0} çeyrek sonra", + "next" : "gelecek çeyrek" + } + }, + "short" : { + "quarter" : { + "future" : "{0} çyr. sonra", + "next" : "gelecek çeyrek", + "previous" : "geçen çeyrek", + "current" : "bu çeyrek", + "past" : "{0} çyr. önce" + }, + "minute" : { + "past" : "{0} dk. önce", + "current" : "bu dakika", + "future" : "{0} dk. sonra" + }, + "year" : { + "next" : "gelecek yıl", + "future" : "{0} yıl sonra", + "current" : "bu yıl", + "past" : "{0} yıl önce", + "previous" : "geçen yıl" + }, + "second" : { + "past" : "{0} sn. önce", + "future" : "{0} sn. sonra", + "current" : "şimdi" + }, + "hour" : { + "past" : "{0} sa. önce", + "current" : "bu saat", + "future" : "{0} sa. sonra" + }, + "now" : "şimdi", + "month" : { + "previous" : "geçen ay", + "next" : "gelecek ay", + "past" : "{0} ay önce", + "current" : "bu ay", + "future" : "{0} ay sonra" + }, + "week" : { + "previous" : "geçen hafta", + "current" : "bu hafta", + "next" : "gelecek hafta", + "past" : "{0} hf. önce", + "future" : "{0} hf. sonra" + }, + "day" : { + "next" : "yarın", + "past" : "{0} gün önce", + "future" : "{0} gün sonra", + "previous" : "dün", + "current" : "bugün" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ug.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ug.json new file mode 100644 index 0000000..19fca90 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ug.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "quarter" : { + "current" : "this quarter", + "past" : "-{0} Q", + "next" : "next quarter", + "future" : "+{0} Q", + "previous" : "last quarter" + }, + "day" : { + "next" : "ئەتە", + "previous" : "تۈنۈگۈن", + "future" : "{0} كۈندىن كېيىن", + "past" : "{0} كۈن ئىلگىرى", + "current" : "بۈگۈن" + }, + "year" : { + "past" : "{0} يىل ئىلگىرى", + "previous" : "ئۆتكەن يىل", + "future" : "{0} يىلدىن كېيىن", + "next" : "كېلەر يىل", + "current" : "بۇ يىل" + }, + "minute" : { + "past" : "{0} مىنۇت ئىلگىرى", + "future" : "{0} مىنۇتتىن كېيىن", + "current" : "this minute" + }, + "now" : "now", + "week" : { + "current" : "بۇ ھەپتە", + "previous" : "ئۆتكەن ھەپتە", + "past" : "{0} ھەپتە ئىلگىرى", + "next" : "كېلەر ھەپتە", + "future" : "{0} ھەپتىدىن كېيىن" + }, + "second" : { + "past" : "{0} سېكۇنت ئىلگىرى", + "future" : "{0} سېكۇنتتىن كېيىن", + "current" : "now" + }, + "month" : { + "future" : "{0} ئايدىن كېيىن", + "current" : "بۇ ئاي", + "past" : "{0} ئاي ئىلگىرى", + "previous" : "ئۆتكەن ئاي", + "next" : "كېلەر ئاي" + }, + "hour" : { + "current" : "this hour", + "past" : "{0} سائەت ئىلگىرى", + "future" : "{0} سائەتتىن كېيىن" + } + }, + "long" : { + "year" : { + "next" : "كېلەر يىل", + "previous" : "ئۆتكەن يىل", + "past" : "{0} يىل ئىلگىرى", + "future" : "{0} يىلدىن كېيىن", + "current" : "بۇ يىل" + }, + "now" : "now", + "quarter" : { + "next" : "next quarter", + "past" : "-{0} Q", + "future" : "+{0} Q", + "current" : "this quarter", + "previous" : "last quarter" + }, + "month" : { + "past" : "{0} ئاي ئىلگىرى", + "next" : "كېلەر ئاي", + "previous" : "ئۆتكەن ئاي", + "future" : "{0} ئايدىن كېيىن", + "current" : "بۇ ئاي" + }, + "second" : { + "current" : "now", + "future" : "{0} سېكۇنتتىن كېيىن", + "past" : "{0} سېكۇنت ئىلگىرى" + }, + "week" : { + "past" : "{0} ھەپتە ئىلگىرى", + "previous" : "ئۆتكەن ھەپتە", + "future" : "{0} ھەپتىدىن كېيىن", + "next" : "كېلەر ھەپتە", + "current" : "بۇ ھەپتە" + }, + "day" : { + "next" : "ئەتە", + "future" : "{0} كۈندىن كېيىن", + "previous" : "تۈنۈگۈن", + "current" : "بۈگۈن", + "past" : "{0} كۈن ئىلگىرى" + }, + "minute" : { + "current" : "this minute", + "past" : "{0} مىنۇت ئىلگىرى", + "future" : "{0} مىنۇتتىن كېيىن" + }, + "hour" : { + "past" : "{0} سائەت ئىلگىرى", + "future" : "{0} سائەتتىن كېيىن", + "current" : "this hour" + } + }, + "short" : { + "minute" : { + "current" : "this minute", + "past" : "{0} مىنۇت ئىلگىرى", + "future" : "{0} مىنۇتتىن كېيىن" + }, + "week" : { + "future" : "{0} ھەپتىدىن كېيىن", + "previous" : "ئۆتكەن ھەپتە", + "next" : "كېلەر ھەپتە", + "current" : "بۇ ھەپتە", + "past" : "{0} ھەپتە ئىلگىرى" + }, + "year" : { + "current" : "بۇ يىل", + "previous" : "ئۆتكەن يىل", + "future" : "{0} يىلدىن كېيىن", + "past" : "{0} يىل ئىلگىرى", + "next" : "كېلەر يىل" + }, + "month" : { + "next" : "كېلەر ئاي", + "past" : "{0} ئاي ئىلگىرى", + "future" : "{0} ئايدىن كېيىن", + "previous" : "ئۆتكەن ئاي", + "current" : "بۇ ئاي" + }, + "quarter" : { + "next" : "next quarter", + "past" : "-{0} Q", + "previous" : "last quarter", + "current" : "this quarter", + "future" : "+{0} Q" + }, + "day" : { + "current" : "بۈگۈن", + "previous" : "تۈنۈگۈن", + "past" : "{0} كۈن ئىلگىرى", + "next" : "ئەتە", + "future" : "{0} كۈندىن كېيىن" + }, + "hour" : { + "current" : "this hour", + "past" : "{0} سائەت ئىلگىرى", + "future" : "{0} سائەتتىن كېيىن" + }, + "second" : { + "future" : "{0} سېكۇنتتىن كېيىن", + "current" : "now", + "past" : "{0} سېكۇنت ئىلگىرى" + }, + "now" : "now" + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/uk.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/uk.json new file mode 100644 index 0000000..c313de0 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/uk.json @@ -0,0 +1,238 @@ +{ + "long" : { + "day" : { + "future" : { + "many" : "через {0} днів", + "one" : "через {0} день", + "few" : "через {0} дні", + "other" : "через {0} дня" + }, + "previous" : "учора", + "current" : "сьогодні", + "past" : { + "many" : "{0} днів тому", + "other" : "{0} дня тому", + "few" : "{0} дні тому", + "one" : "{0} день тому" + }, + "next" : "завтра" + }, + "minute" : { + "current" : "цієї хвилини", + "past" : { + "one" : "{0} хвилину тому", + "many" : "{0} хвилин тому", + "other" : "{0} хвилини тому" + }, + "future" : { + "many" : "через {0} хвилин", + "one" : "через {0} хвилину", + "other" : "через {0} хвилини" + } + }, + "now" : "зараз", + "second" : { + "past" : { + "one" : "{0} секунду тому", + "other" : "{0} секунди тому", + "many" : "{0} секунд тому" + }, + "future" : { + "one" : "через {0} секунду", + "other" : "через {0} секунди", + "many" : "через {0} секунд" + }, + "current" : "зараз" + }, + "week" : { + "current" : "цього тижня", + "next" : "наступного тижня", + "previous" : "минулого тижня", + "future" : { + "many" : "через {0} тижнів", + "few" : "через {0} тижні", + "other" : "через {0} тижня", + "one" : "через {0} тиждень" + }, + "past" : { + "many" : "{0} тижнів тому", + "other" : "{0} тижня тому", + "few" : "{0} тижні тому", + "one" : "{0} тиждень тому" + } + }, + "quarter" : { + "previous" : "минулого кварталу", + "past" : { + "few" : "{0} квартали тому", + "one" : "{0} квартал тому", + "other" : "{0} кварталу тому", + "many" : "{0} кварталів тому" + }, + "future" : { + "one" : "через {0} квартал", + "many" : "через {0} кварталів", + "other" : "через {0} кварталу", + "few" : "через {0} квартали" + }, + "current" : "цього кварталу", + "next" : "наступного кварталу" + }, + "month" : { + "current" : "цього місяця", + "next" : "наступного місяця", + "previous" : "минулого місяця", + "past" : { + "many" : "{0} місяців тому", + "one" : "{0} місяць тому", + "few" : "{0} місяці тому", + "other" : "{0} місяця тому" + }, + "future" : { + "many" : "через {0} місяців", + "one" : "через {0} місяць", + "few" : "через {0} місяці", + "other" : "через {0} місяця" + } + }, + "hour" : { + "future" : { + "many" : "через {0} годин", + "one" : "через {0} годину", + "other" : "через {0} години" + }, + "current" : "цієї години", + "past" : { + "one" : "{0} годину тому", + "many" : "{0} годин тому", + "other" : "{0} години тому" + } + }, + "year" : { + "past" : { + "other" : "{0} року тому", + "many" : "{0} років тому", + "few" : "{0} роки тому", + "one" : "{0} рік тому" + }, + "future" : { + "one" : "через {0} рік", + "other" : "через {0} року", + "many" : "через {0} років", + "few" : "через {0} роки" + }, + "previous" : "торік", + "current" : "цього року", + "next" : "наступного року" + } + }, + "short" : { + "quarter" : { + "future" : "через {0} кв.", + "next" : "наступного кв.", + "previous" : "минулого кв.", + "current" : "цього кв.", + "past" : "{0} кв. тому" + }, + "minute" : { + "current" : "цієї хвилини", + "past" : "{0} хв тому", + "future" : "через {0} хв" + }, + "year" : { + "next" : "наступного року", + "future" : "через {0} р.", + "current" : "цього року", + "past" : "{0} р. тому", + "previous" : "торік" + }, + "second" : { + "current" : "зараз", + "past" : "{0} с тому", + "future" : "через {0} с" + }, + "hour" : { + "future" : "через {0} год", + "current" : "цієї години", + "past" : "{0} год тому" + }, + "now" : "зараз", + "month" : { + "previous" : "минулого місяця", + "next" : "наступного місяця", + "past" : "{0} міс. тому", + "current" : "цього місяця", + "future" : "через {0} міс." + }, + "week" : { + "previous" : "минулого тижня", + "current" : "цього тижня", + "next" : "наступного тижня", + "past" : "{0} тиж. тому", + "future" : "через {0} тиж." + }, + "day" : { + "next" : "завтра", + "past" : "{0} дн. тому", + "future" : "через {0} дн.", + "previous" : "учора", + "current" : "сьогодні" + } + }, + "narrow" : { + "week" : { + "previous" : "минулого тижня", + "current" : "цього тижня", + "past" : "{0} тиж. тому", + "future" : "за {0} тиж.", + "next" : "наступного тижня" + }, + "quarter" : { + "next" : "наступного кв.", + "past" : "{0} кв. тому", + "future" : "за {0} кв.", + "previous" : "минулого кв.", + "current" : "цього кв." + }, + "minute" : { + "future" : "за {0} хв", + "current" : "цієї хвилини", + "past" : "{0} хв тому" + }, + "day" : { + "previous" : "учора", + "current" : "сьогодні", + "next" : "завтра", + "past" : { + "other" : "-{0} дн.", + "one" : "{0} д. тому" + }, + "future" : "за {0} д." + }, + "year" : { + "next" : "наступного року", + "past" : "{0} р. тому", + "current" : "цього року", + "previous" : "торік", + "future" : "за {0} р." + }, + "second" : { + "future" : "за {0} с", + "current" : "зараз", + "past" : "{0} с тому" + }, + "month" : { + "current" : "цього місяця", + "future" : "за {0} міс.", + "past" : "{0} міс. тому", + "next" : "наступного місяця", + "previous" : "минулого місяця" + }, + "now" : "зараз", + "hour" : { + "past" : "{0} год тому", + "current" : "цієї години", + "future" : "за {0} год" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ur.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ur.json new file mode 100644 index 0000000..f53486a --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ur.json @@ -0,0 +1,203 @@ +{ + "narrow" : { + "quarter" : { + "previous" : "گزشتہ سہ ماہی", + "current" : "اس سہ ماہی", + "next" : "اگلے سہ ماہی", + "past" : "{0} سہ ماہی پہلے", + "future" : "{0} سہ ماہی میں" + }, + "month" : { + "past" : "{0} ماہ پہلے", + "next" : "اگلے مہینہ", + "future" : "{0} ماہ میں", + "previous" : "پچھلے مہینہ", + "current" : "اس مہینہ" + }, + "week" : { + "next" : "اگلے ہفتہ", + "previous" : "پچھلے ہفتہ", + "past" : { + "one" : "{0} ہفتہ پہلے", + "other" : "{0} ہفتے پہلے" + }, + "future" : { + "other" : "{0} ہفتے میں", + "one" : "{0} ہفتہ میں" + }, + "current" : "اس ہفتہ" + }, + "second" : { + "future" : "{0} سیکنڈ میں", + "current" : "اب", + "past" : "{0} سیکنڈ پہلے" + }, + "day" : { + "current" : "آج", + "future" : { + "one" : "{0} دن میں", + "other" : "{0} دنوں میں" + }, + "next" : "آئندہ کل", + "previous" : "گزشتہ کل", + "past" : "{0} دن پہلے" + }, + "now" : "اب", + "hour" : { + "current" : "اس گھنٹے", + "future" : { + "one" : "{0} گھنٹہ میں", + "other" : "{0} گھنٹوں میں" + }, + "past" : { + "one" : "{0} گھنٹہ پہلے", + "other" : "{0} گھنٹے پہلے" + } + }, + "minute" : { + "past" : "{0} منٹ پہلے", + "current" : "اس منٹ", + "future" : "{0} منٹ میں" + }, + "year" : { + "next" : "اگلے سال", + "past" : "{0} سال پہلے", + "future" : "{0} سال میں", + "previous" : "گزشتہ سال", + "current" : "اس سال" + } + }, + "short" : { + "minute" : { + "current" : "اس منٹ", + "past" : "{0} منٹ پہلے", + "future" : "{0} منٹ میں" + }, + "month" : { + "current" : "اس مہینہ", + "past" : "{0} ماہ قبل", + "future" : "{0} ماہ میں", + "next" : "اگلے مہینہ", + "previous" : "پچھلے مہینہ" + }, + "week" : { + "current" : "اس ہفتہ", + "past" : "{0} ہفتے پہلے", + "future" : "{0} ہفتے میں", + "next" : "اگلے ہفتہ", + "previous" : "پچھلے ہفتہ" + }, + "hour" : { + "past" : "{0} گھنٹے پہلے", + "current" : "اس گھنٹے", + "future" : "{0} گھنٹے میں" + }, + "day" : { + "next" : "آئندہ کل", + "current" : "آج", + "previous" : "گزشتہ کل", + "past" : { + "other" : "{0} دنوں پہلے", + "one" : "{0} دن پہلے" + }, + "future" : { + "one" : "{0} دن میں", + "other" : "{0} دنوں میں" + } + }, + "second" : { + "future" : "{0} سیکنڈ میں", + "current" : "اب", + "past" : "{0} سیکنڈ پہلے" + }, + "now" : "اب", + "year" : { + "current" : "اس سال", + "future" : "{0} سال میں", + "past" : "{0} سال پہلے", + "next" : "اگلے سال", + "previous" : "گزشتہ سال" + }, + "quarter" : { + "current" : "اس سہ ماہی", + "future" : "{0} سہ ماہی میں", + "previous" : "گزشتہ سہ ماہی", + "next" : "اگلے سہ ماہی", + "past" : "{0} سہ ماہی قبل" + } + }, + "long" : { + "day" : { + "previous" : "گزشتہ کل", + "past" : { + "other" : "{0} دنوں پہلے", + "one" : "{0} دن پہلے" + }, + "future" : { + "one" : "{0} دن میں", + "other" : "{0} دنوں میں" + }, + "next" : "آئندہ کل", + "current" : "آج" + }, + "hour" : { + "past" : { + "other" : "{0} گھنٹے پہلے", + "one" : "{0} گھنٹہ پہلے" + }, + "future" : "{0} گھنٹے میں", + "current" : "اس گھنٹے" + }, + "month" : { + "next" : "اگلا مہینہ", + "current" : "اس مہینہ", + "past" : { + "one" : "{0} مہینہ پہلے", + "other" : "{0} مہینے پہلے" + }, + "previous" : "پچھلا مہینہ", + "future" : { + "one" : "{0} مہینہ میں", + "other" : "{0} مہینے میں" + } + }, + "quarter" : { + "current" : "اس سہ ماہی", + "past" : "{0} سہ ماہی پہلے", + "previous" : "گزشتہ سہ ماہی", + "future" : "{0} سہ ماہی میں", + "next" : "اگلے سہ ماہی" + }, + "year" : { + "past" : "{0} سال پہلے", + "previous" : "گزشتہ سال", + "next" : "اگلے سال", + "future" : "{0} سال میں", + "current" : "اس سال" + }, + "minute" : { + "current" : "اس منٹ", + "future" : "{0} منٹ میں", + "past" : "{0} منٹ پہلے" + }, + "second" : { + "future" : "{0} سیکنڈ میں", + "current" : "اب", + "past" : "{0} سیکنڈ پہلے" + }, + "week" : { + "future" : { + "one" : "{0} ہفتہ میں", + "other" : "{0} ہفتے میں" + }, + "previous" : "پچھلے ہفتہ", + "current" : "اس ہفتہ", + "next" : "اگلے ہفتہ", + "past" : { + "one" : "{0} ہفتہ پہلے", + "other" : "{0} ہفتے پہلے" + } + }, + "now" : "اب" + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ur_IN.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ur_IN.json new file mode 100644 index 0000000..6206490 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/ur_IN.json @@ -0,0 +1,203 @@ +{ + "narrow" : { + "quarter" : { + "previous" : "گزشتہ سہ ماہی", + "current" : "اس سہ ماہی", + "next" : "اگلے سہ ماہی", + "past" : "{0} سہ ماہی پہلے", + "future" : "{0} سہ ماہی میں" + }, + "month" : { + "past" : "{0} ماہ قبل", + "next" : "اگلے مہینہ", + "future" : "{0} ماہ میں", + "previous" : "پچھلے مہینہ", + "current" : "اس مہینہ" + }, + "week" : { + "next" : "اگلے ہفتہ", + "previous" : "پچھلے ہفتہ", + "past" : { + "other" : "{0} ہفتے قبل", + "one" : "{0} ہفتہ قبل" + }, + "future" : { + "one" : "{0} ہفتہ میں", + "other" : "{0} ہفتے میں" + }, + "current" : "اس ہفتہ" + }, + "second" : { + "future" : "{0} سیکنڈ میں", + "current" : "اب", + "past" : "{0} سیکنڈ قبل" + }, + "day" : { + "current" : "آج", + "future" : { + "one" : "{0} دن میں", + "other" : "{0} دنوں میں" + }, + "next" : "آئندہ کل", + "previous" : "گزشتہ کل", + "past" : "{0} دن قبل" + }, + "now" : "اب", + "hour" : { + "future" : { + "other" : "{0} گھنٹوں میں", + "one" : "{0} گھنٹہ میں" + }, + "past" : { + "one" : "{0} گھنٹہ قبل", + "other" : "{0} گھنٹے قبل" + }, + "current" : "اس گھنٹے" + }, + "minute" : { + "future" : "{0} منٹ میں", + "current" : "اس منٹ", + "past" : "{0} منٹ قبل" + }, + "year" : { + "next" : "اگلے سال", + "past" : "{0} سال پہلے", + "future" : "{0} سال میں", + "previous" : "گزشتہ سال", + "current" : "اس سال" + } + }, + "long" : { + "day" : { + "previous" : "گزشتہ کل", + "past" : { + "other" : "{0} دنوں پہلے", + "one" : "{0} دن پہلے" + }, + "future" : { + "one" : "{0} دن میں", + "other" : "{0} دنوں میں" + }, + "next" : "آئندہ کل", + "current" : "آج" + }, + "hour" : { + "past" : { + "other" : "{0} گھنٹے پہلے", + "one" : "{0} گھنٹہ پہلے" + }, + "future" : "{0} گھنٹے میں", + "current" : "اس گھنٹے" + }, + "month" : { + "future" : "{0} ماہ میں", + "past" : "{0} ماہ قبل", + "next" : "اگلے ماہ", + "current" : "اس ماہ", + "previous" : "گزشتہ ماہ" + }, + "quarter" : { + "previous" : "گزشتہ سہ ماہی", + "next" : "اگلے سہ ماہی", + "past" : "{0} سہ ماہی پہلے", + "future" : "{0} سہ ماہی میں", + "current" : "اس سہ ماہی" + }, + "year" : { + "past" : "{0} سال پہلے", + "previous" : "گزشتہ سال", + "next" : "اگلے سال", + "future" : { + "one" : "{0} سال میں", + "other" : "{0} سالوں میں" + }, + "current" : "اس سال" + }, + "minute" : { + "current" : "اس منٹ", + "future" : "{0} منٹ میں", + "past" : "{0} منٹ قبل" + }, + "second" : { + "future" : "{0} سیکنڈ میں", + "current" : "اب", + "past" : "{0} سیکنڈ قبل" + }, + "week" : { + "future" : { + "one" : "{0} ہفتہ میں", + "other" : "{0} ہفتوں میں" + }, + "previous" : "گزشتہ ہفتہ", + "current" : "اس ہفتہ", + "next" : "اگلے ہفتہ", + "past" : { + "one" : "{0} ہفتہ قبل", + "other" : "{0} ہفتے قبل" + } + }, + "now" : "اب" + }, + "short" : { + "minute" : { + "future" : "{0} منٹ میں", + "current" : "اس منٹ", + "past" : "{0} منٹ قبل" + }, + "month" : { + "current" : "اس مہینہ", + "past" : "{0} ماہ قبل", + "future" : "{0} ماہ میں", + "next" : "اگلے مہینہ", + "previous" : "پچھلے مہینہ" + }, + "week" : { + "current" : "اس ہفتہ", + "past" : "{0} ہفتے قبل", + "future" : "{0} ہفتے میں", + "next" : "اگلے ہفتہ", + "previous" : "پچھلے ہفتہ" + }, + "hour" : { + "current" : "اس گھنٹے", + "past" : "{0} گھنٹے قبل", + "future" : "{0} گھنٹے میں" + }, + "day" : { + "next" : "آئندہ کل", + "current" : "آج", + "previous" : "گزشتہ کل", + "past" : { + "one" : "{0} دن پہلے", + "other" : "{0} دنوں پہلے" + }, + "future" : "{0} دنوں میں" + }, + "second" : { + "future" : "{0} سیکنڈ میں", + "current" : "اب", + "past" : "{0} سیکنڈ قبل" + }, + "now" : "اب", + "year" : { + "future" : { + "one" : "{0} سال میں", + "other" : "{0} سالوں میں" + }, + "previous" : "گزشتہ سال", + "next" : "اگلے سال", + "current" : "اس سال", + "past" : { + "other" : "{0} سالوں پہلے", + "one" : "{0} سال پہلے" + } + }, + "quarter" : { + "current" : "اس سہ ماہی", + "future" : "{0} سہ ماہی میں", + "previous" : "گزشتہ سہ ماہی", + "next" : "اگلے سہ ماہی", + "past" : "{0} سہ ماہی قبل" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/uz.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/uz.json new file mode 100644 index 0000000..bee6c39 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/uz.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "quarter" : { + "past" : "{0} chorak oldin", + "future" : "{0} chorakdan keyin", + "current" : "shu chorak", + "previous" : "o‘tgan chorak", + "next" : "keyingi chorak" + }, + "year" : { + "previous" : "oʻtgan yil", + "next" : "keyingi yil", + "future" : "{0} yildan keyin", + "current" : "bu yil", + "past" : "{0} yil oldin" + }, + "week" : { + "future" : "{0} haftadan keyin", + "previous" : "o‘tgan hafta", + "next" : "keyingi hafta", + "past" : "{0} hafta oldin", + "current" : "shu hafta" + }, + "day" : { + "current" : "bugun", + "past" : "{0} kun oldin", + "next" : "ertaga", + "future" : "{0} kundan keyin", + "previous" : "kecha" + }, + "hour" : { + "current" : "shu soatda", + "past" : "{0} soat oldin", + "future" : "{0} soatdan keyin" + }, + "minute" : { + "future" : "{0} daqiqadan keyin", + "current" : "shu daqiqada", + "past" : "{0} daqiqa oldin" + }, + "month" : { + "next" : "keyingi oy", + "current" : "shu oy", + "past" : "{0} oy oldin", + "future" : "{0} oydan keyin", + "previous" : "o‘tgan oy" + }, + "now" : "hozir", + "second" : { + "future" : "{0} soniyadan keyin", + "current" : "hozir", + "past" : "{0} soniya oldin" + } + }, + "short" : { + "minute" : { + "past" : "{0} daqiqa oldin", + "future" : "{0} daqiqadan keyin", + "current" : "shu daqiqada" + }, + "week" : { + "current" : "shu hafta", + "past" : "{0} hafta oldin", + "future" : "{0} haftadan keyin", + "next" : "keyingi hafta", + "previous" : "o‘tgan hafta" + }, + "year" : { + "future" : "{0} yildan keyin", + "previous" : "oʻtgan yil", + "next" : "keyingi yil", + "current" : "bu yil", + "past" : "{0} yil oldin" + }, + "day" : { + "next" : "ertaga", + "current" : "bugun", + "previous" : "kecha", + "past" : "{0} kun oldin", + "future" : "{0} kundan keyin" + }, + "hour" : { + "future" : "{0} soatdan keyin", + "current" : "shu soatda", + "past" : "{0} soat oldin" + }, + "quarter" : { + "current" : "shu chorak", + "future" : "{0} chorakdan keyin", + "previous" : "o‘tgan chorak", + "next" : "keyingi chorak", + "past" : "{0} chorak oldin" + }, + "second" : { + "past" : "{0} soniya oldin", + "current" : "hozir", + "future" : "{0} soniyadan keyin" + }, + "month" : { + "current" : "shu oy", + "past" : "{0} oy oldin", + "future" : "{0} oydan keyin", + "next" : "keyingi oy", + "previous" : "o‘tgan oy" + }, + "now" : "hozir" + }, + "long" : { + "hour" : { + "future" : "{0} soatdan keyin", + "current" : "shu soatda", + "past" : "{0} soat oldin" + }, + "day" : { + "next" : "ertaga", + "past" : "{0} kun oldin", + "previous" : "kecha", + "future" : "{0} kundan keyin", + "current" : "bugun" + }, + "second" : { + "past" : "{0} soniya oldin", + "current" : "hozir", + "future" : "{0} soniyadan keyin" + }, + "week" : { + "future" : "{0} haftadan keyin", + "past" : "{0} hafta oldin", + "current" : "shu hafta", + "next" : "keyingi hafta", + "previous" : "o‘tgan hafta" + }, + "minute" : { + "future" : "{0} daqiqadan keyin", + "past" : "{0} daqiqa oldin", + "current" : "shu daqiqada" + }, + "month" : { + "future" : "{0} oydan keyin", + "past" : "{0} oy oldin", + "current" : "shu oy", + "previous" : "o‘tgan oy", + "next" : "keyingi oy" + }, + "now" : "hozir", + "year" : { + "current" : "shu yil", + "next" : "keyingi yil", + "previous" : "o‘tgan yil", + "future" : "{0} yildan keyin", + "past" : "{0} yil oldin" + }, + "quarter" : { + "future" : "{0} chorakdan keyin", + "previous" : "o‘tgan chorak", + "past" : "{0} chorak oldin", + "next" : "keyingi chorak", + "current" : "shu chorak" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/uz_Cyrl.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/uz_Cyrl.json new file mode 100644 index 0000000..8c6a32c --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/uz_Cyrl.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "quarter" : { + "past" : "-{0} Q", + "future" : "+{0} Q", + "current" : "this quarter", + "previous" : "last quarter", + "next" : "next quarter" + }, + "year" : { + "previous" : "ўтган йил", + "next" : "кейинги йил", + "future" : "{0} йилдан сўнг", + "current" : "бу йил", + "past" : "{0} йил аввал" + }, + "week" : { + "future" : "{0} ҳафтадан сўнг", + "previous" : "ўтган ҳафта", + "next" : "кейинги ҳафта", + "past" : "{0} ҳафта олдин", + "current" : "бу ҳафта" + }, + "day" : { + "current" : "бугун", + "past" : "{0} кун олдин", + "next" : "эртага", + "future" : "{0} кундан сўнг", + "previous" : "кеча" + }, + "hour" : { + "current" : "this hour", + "past" : "{0} соат олдин", + "future" : "{0} соатдан сўнг" + }, + "minute" : { + "future" : "{0} дақиқадан сўнг", + "current" : "this minute", + "past" : "{0} дақиқа олдин" + }, + "month" : { + "next" : "кейинги ой", + "current" : "бу ой", + "past" : "{0} ой аввал", + "future" : "{0} ойдан сўнг", + "previous" : "ўтган ой" + }, + "now" : "ҳозир", + "second" : { + "future" : "{0} сониядан сўнг", + "current" : "ҳозир", + "past" : "{0} сония олдин" + } + }, + "long" : { + "hour" : { + "future" : "{0} соатдан сўнг", + "current" : "this hour", + "past" : "{0} соат олдин" + }, + "day" : { + "next" : "эртага", + "past" : "{0} кун олдин", + "previous" : "кеча", + "future" : "{0} кундан сўнг", + "current" : "бугун" + }, + "second" : { + "past" : "{0} сония олдин", + "current" : "ҳозир", + "future" : "{0} сониядан сўнг" + }, + "week" : { + "future" : "{0} ҳафтадан сўнг", + "past" : "{0} ҳафта олдин", + "current" : "бу ҳафта", + "next" : "кейинги ҳафта", + "previous" : "ўтган ҳафта" + }, + "minute" : { + "future" : "{0} дақиқадан сўнг", + "past" : "{0} дақиқа олдин", + "current" : "this minute" + }, + "month" : { + "future" : "{0} ойдан сўнг", + "past" : "{0} ой аввал", + "current" : "бу ой", + "previous" : "ўтган ой", + "next" : "кейинги ой" + }, + "now" : "ҳозир", + "year" : { + "current" : "бу йил", + "next" : "кейинги йил", + "previous" : "ўтган йил", + "future" : "{0} йилдан сўнг", + "past" : "{0} йил аввал" + }, + "quarter" : { + "future" : "+{0} Q", + "previous" : "last quarter", + "past" : "-{0} Q", + "next" : "next quarter", + "current" : "this quarter" + } + }, + "short" : { + "minute" : { + "past" : "{0} дақиқа олдин", + "future" : "{0} дақиқадан сўнг", + "current" : "this minute" + }, + "week" : { + "current" : "бу ҳафта", + "past" : "{0} ҳафта олдин", + "future" : "{0} ҳафтадан сўнг", + "next" : "кейинги ҳафта", + "previous" : "ўтган ҳафта" + }, + "year" : { + "future" : "{0} йилдан сўнг", + "previous" : "ўтган йил", + "next" : "кейинги йил", + "current" : "бу йил", + "past" : "{0} йил аввал" + }, + "day" : { + "next" : "эртага", + "current" : "бугун", + "previous" : "кеча", + "past" : "{0} кун олдин", + "future" : "{0} кундан сўнг" + }, + "hour" : { + "future" : "{0} соатдан сўнг", + "current" : "this hour", + "past" : "{0} соат олдин" + }, + "quarter" : { + "current" : "this quarter", + "future" : "+{0} Q", + "previous" : "last quarter", + "next" : "next quarter", + "past" : "-{0} Q" + }, + "second" : { + "past" : "{0} сония олдин", + "current" : "ҳозир", + "future" : "{0} сониядан сўнг" + }, + "month" : { + "current" : "бу ой", + "past" : "{0} ой аввал", + "future" : "{0} ойдан сўнг", + "next" : "кейинги ой", + "previous" : "ўтган ой" + }, + "now" : "ҳозир" + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/vi.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/vi.json new file mode 100644 index 0000000..89251db --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/vi.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "week" : { + "past" : "{0} tuần trước", + "future" : "sau {0} tuần nữa", + "current" : "tuần này", + "previous" : "tuần trước", + "next" : "tuần sau" + }, + "hour" : { + "current" : "giờ này", + "past" : "{0} giờ trước", + "future" : "sau {0} giờ nữa" + }, + "now" : "bây giờ", + "day" : { + "next" : "Ngày mai", + "current" : "Hôm nay", + "past" : "{0} ngày trước", + "future" : "sau {0} ngày nữa", + "previous" : "Hôm qua" + }, + "minute" : { + "future" : "sau {0} phút nữa", + "current" : "phút này", + "past" : "{0} phút trước" + }, + "quarter" : { + "next" : "quý sau", + "future" : "sau {0} quý nữa", + "previous" : "quý trước", + "current" : "quý này", + "past" : "{0} quý trước" + }, + "second" : { + "future" : "sau {0} giây nữa", + "current" : "bây giờ", + "past" : "{0} giây trước" + }, + "year" : { + "next" : "năm sau", + "previous" : "năm ngoái", + "current" : "năm nay", + "future" : "sau {0} năm nữa", + "past" : "{0} năm trước" + }, + "month" : { + "previous" : "tháng trước", + "next" : "tháng sau", + "future" : "sau {0} tháng nữa", + "current" : "tháng này", + "past" : "{0} tháng trước" + } + }, + "short" : { + "hour" : { + "future" : "sau {0} giờ nữa", + "current" : "giờ này", + "past" : "{0} giờ trước" + }, + "now" : "bây giờ", + "quarter" : { + "future" : "sau {0} quý nữa", + "previous" : "quý trước", + "next" : "quý sau", + "current" : "quý này", + "past" : "{0} quý trước" + }, + "day" : { + "current" : "Hôm nay", + "past" : "{0} ngày trước", + "future" : "sau {0} ngày nữa", + "next" : "Ngày mai", + "previous" : "Hôm qua" + }, + "week" : { + "current" : "tuần này", + "future" : "sau {0} tuần nữa", + "previous" : "tuần trước", + "next" : "tuần sau", + "past" : "{0} tuần trước" + }, + "minute" : { + "past" : "{0} phút trước", + "future" : "sau {0} phút nữa", + "current" : "phút này" + }, + "second" : { + "past" : "{0} giây trước", + "current" : "bây giờ", + "future" : "sau {0} giây nữa" + }, + "month" : { + "current" : "tháng này", + "future" : "sau {0} tháng nữa", + "past" : "{0} tháng trước", + "next" : "tháng sau", + "previous" : "tháng trước" + }, + "year" : { + "past" : "{0} năm trước", + "future" : "sau {0} năm nữa", + "previous" : "năm ngoái", + "current" : "năm nay", + "next" : "năm sau" + } + }, + "long" : { + "month" : { + "current" : "tháng này", + "next" : "tháng sau", + "previous" : "tháng trước", + "future" : "sau {0} tháng nữa", + "past" : "{0} tháng trước" + }, + "quarter" : { + "future" : "sau {0} quý nữa", + "next" : "quý sau", + "past" : "{0} quý trước", + "previous" : "quý trước", + "current" : "quý này" + }, + "minute" : { + "future" : "sau {0} phút nữa", + "past" : "{0} phút trước", + "current" : "phút này" + }, + "day" : { + "future" : "sau {0} ngày nữa", + "past" : "{0} ngày trước", + "current" : "Hôm nay", + "previous" : "Hôm qua", + "next" : "Ngày mai" + }, + "year" : { + "previous" : "năm ngoái", + "current" : "năm nay", + "future" : "sau {0} năm nữa", + "next" : "năm sau", + "past" : "{0} năm trước" + }, + "week" : { + "future" : "sau {0} tuần nữa", + "previous" : "tuần trước", + "past" : "{0} tuần trước", + "next" : "tuần sau", + "current" : "tuần này" + }, + "second" : { + "past" : "{0} giây trước", + "current" : "bây giờ", + "future" : "sau {0} giây nữa" + }, + "hour" : { + "future" : "sau {0} giờ nữa", + "current" : "giờ này", + "past" : "{0} giờ trước" + }, + "now" : "bây giờ" + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/wae.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/wae.json new file mode 100644 index 0000000..a063f42 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/wae.json @@ -0,0 +1,260 @@ +{ + "narrow" : { + "week" : { + "next" : "next week", + "current" : "this week", + "previous" : "last week", + "past" : { + "one" : "vor {0} wuča", + "other" : "cor {0} wučä" + }, + "future" : { + "other" : "i {0} wučä", + "one" : "i {0} wuča" + } + }, + "hour" : { + "past" : { + "other" : "vor {0} stunde", + "one" : "vor {0} stund" + }, + "future" : { + "other" : "i {0} stunde", + "one" : "i {0} stund" + }, + "current" : "this hour" + }, + "second" : { + "current" : "now", + "past" : { + "one" : "vor {0} sekund", + "other" : "vor {0} sekunde" + }, + "future" : { + "one" : "i {0} sekund", + "other" : "i {0} sekunde" + } + }, + "quarter" : { + "next" : "next quarter", + "past" : "-{0} Q", + "current" : "this quarter", + "previous" : "last quarter", + "future" : "+{0} Q" + }, + "now" : "now", + "day" : { + "future" : { + "other" : "i {0} täg", + "one" : "i {0} tag" + }, + "current" : "Hitte", + "next" : "Móre", + "past" : { + "one" : "vor {0} tag", + "other" : "vor {0} täg" + }, + "previous" : "Gešter" + }, + "month" : { + "next" : "next month", + "past" : "vor {0} mánet", + "future" : "I {0} mánet", + "previous" : "last month", + "current" : "this month" + }, + "year" : { + "previous" : "last year", + "past" : { + "one" : "vor {0} jár", + "other" : "cor {0} jár" + }, + "current" : "this year", + "next" : "next year", + "future" : "I {0} jár" + }, + "minute" : { + "past" : { + "other" : "vor {0} minüte", + "one" : "vor {0} minüta" + }, + "current" : "this minute", + "future" : { + "one" : "i {0} minüta", + "other" : "i {0} minüte" + } + } + }, + "long" : { + "day" : { + "next" : "Móre", + "future" : { + "one" : "i {0} tag", + "other" : "i {0} täg" + }, + "current" : "Hitte", + "previous" : "Gešter", + "past" : { + "one" : "vor {0} tag", + "other" : "vor {0} täg" + } + }, + "minute" : { + "current" : "this minute", + "past" : { + "other" : "vor {0} minüte", + "one" : "vor {0} minüta" + }, + "future" : { + "other" : "i {0} minüte", + "one" : "i {0} minüta" + } + }, + "second" : { + "current" : "now", + "future" : { + "other" : "i {0} sekunde", + "one" : "i {0} sekund" + }, + "past" : { + "one" : "vor {0} sekund", + "other" : "vor {0} sekunde" + } + }, + "month" : { + "past" : "vor {0} mánet", + "previous" : "last month", + "current" : "this month", + "next" : "next month", + "future" : "I {0} mánet" + }, + "week" : { + "future" : { + "other" : "i {0} wučä", + "one" : "i {0} wuča" + }, + "next" : "next week", + "current" : "this week", + "past" : { + "one" : "vor {0} wuča", + "other" : "cor {0} wučä" + }, + "previous" : "last week" + }, + "now" : "now", + "hour" : { + "past" : { + "one" : "vor {0} stund", + "other" : "vor {0} stunde" + }, + "current" : "this hour", + "future" : { + "one" : "i {0} stund", + "other" : "i {0} stunde" + } + }, + "year" : { + "previous" : "last year", + "current" : "this year", + "next" : "next year", + "past" : { + "one" : "vor {0} jár", + "other" : "cor {0} jár" + }, + "future" : "I {0} jár" + }, + "quarter" : { + "current" : "this quarter", + "future" : "+{0} Q", + "past" : "-{0} Q", + "previous" : "last quarter", + "next" : "next quarter" + } + }, + "short" : { + "week" : { + "future" : { + "other" : "i {0} wučä", + "one" : "i {0} wuča" + }, + "next" : "next week", + "current" : "this week", + "past" : { + "one" : "vor {0} wuča", + "other" : "cor {0} wučä" + }, + "previous" : "last week" + }, + "minute" : { + "current" : "this minute", + "future" : { + "one" : "i {0} minüta", + "other" : "i {0} minüte" + }, + "past" : { + "other" : "vor {0} minüte", + "one" : "vor {0} minüta" + } + }, + "day" : { + "next" : "Móre", + "current" : "Hitte", + "previous" : "Gešter", + "future" : { + "one" : "i {0} tag", + "other" : "i {0} täg" + }, + "past" : { + "other" : "vor {0} täg", + "one" : "vor {0} tag" + } + }, + "now" : "now", + "second" : { + "past" : { + "one" : "vor {0} sekund", + "other" : "vor {0} sekunde" + }, + "future" : { + "one" : "i {0} sekund", + "other" : "i {0} sekunde" + }, + "current" : "now" + }, + "hour" : { + "current" : "this hour", + "past" : { + "other" : "vor {0} stunde", + "one" : "vor {0} stund" + }, + "future" : { + "one" : "i {0} stund", + "other" : "i {0} stunde" + } + }, + "month" : { + "past" : "vor {0} mánet", + "future" : "I {0} mánet", + "next" : "next month", + "previous" : "last month", + "current" : "this month" + }, + "year" : { + "past" : { + "one" : "vor {0} jár", + "other" : "cor {0} jár" + }, + "future" : "I {0} jár", + "previous" : "last year", + "current" : "this year", + "next" : "next year" + }, + "quarter" : { + "previous" : "last quarter", + "future" : "+{0} Q", + "next" : "next quarter", + "past" : "-{0} Q", + "current" : "this quarter" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/yi.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/yi.json new file mode 100644 index 0000000..95d6582 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/yi.json @@ -0,0 +1,191 @@ +{ + "long" : { + "quarter" : { + "next" : "next quarter", + "future" : "+{0} Q", + "previous" : "last quarter", + "past" : "-{0} Q", + "current" : "this quarter" + }, + "month" : { + "current" : "דעם חודש", + "next" : "קומענדיקן חודש", + "previous" : "פֿאַרגאנגענעם חודש", + "past" : { + "one" : "פֿאַר {0} חודש", + "other" : "פֿאַר {0} חדשים" + }, + "future" : { + "one" : "איבער {0} חודש", + "other" : "איבער {0} חדשים" + } + }, + "second" : { + "future" : "+{0} s", + "current" : "now", + "past" : "-{0} s" + }, + "hour" : { + "past" : "-{0} h", + "current" : "this hour", + "future" : "+{0} h" + }, + "day" : { + "future" : { + "one" : "אין {0} טאָג אַרום", + "other" : "אין {0} טעג אַרום" + }, + "previous" : "נעכטן", + "past" : "-{0} d", + "next" : "מארגן", + "current" : "היינט" + }, + "minute" : { + "past" : "-{0} min", + "future" : "+{0} min", + "current" : "this minute" + }, + "week" : { + "past" : "-{0} w", + "previous" : "last week", + "future" : "+{0} w", + "current" : "this week", + "next" : "איבער אַכט טאָג" + }, + "year" : { + "next" : "איבער א יאָר", + "current" : "הײַ יאָר", + "previous" : "פֿאַראַיאָר", + "future" : "איבער {0} יאָר", + "past" : "פֿאַר {0} יאָר" + }, + "now" : "now" + }, + "narrow" : { + "year" : { + "current" : "הײַ יאָר", + "next" : "איבער א יאָר", + "past" : "פֿאַר {0} יאָר", + "future" : "איבער {0} יאָר", + "previous" : "פֿאַראַיאָר" + }, + "second" : { + "past" : "-{0} s", + "future" : "+{0} s", + "current" : "now" + }, + "hour" : { + "future" : "+{0} h", + "current" : "this hour", + "past" : "-{0} h" + }, + "week" : { + "current" : "this week", + "previous" : "last week", + "past" : "-{0} w", + "next" : "איבער אַכט טאָג", + "future" : "+{0} w" + }, + "day" : { + "current" : "היינט", + "next" : "מארגן", + "past" : "-{0} d", + "previous" : "נעכטן", + "future" : { + "one" : "אין {0} טאָג אַרום", + "other" : "אין {0} טעג אַרום" + } + }, + "month" : { + "current" : "דעם חודש", + "next" : "קומענדיקן חודש", + "past" : { + "one" : "פֿאַר {0} חודש", + "other" : "פֿאַר {0} חדשים" + }, + "previous" : "פֿאַרגאנגענעם חודש", + "future" : { + "one" : "איבער {0} חודש", + "other" : "איבער {0} חדשים" + } + }, + "now" : "now", + "minute" : { + "future" : "+{0} min", + "current" : "this minute", + "past" : "-{0} min" + }, + "quarter" : { + "previous" : "last quarter", + "current" : "this quarter", + "past" : "-{0} Q", + "future" : "+{0} Q", + "next" : "next quarter" + } + }, + "short" : { + "month" : { + "next" : "קומענדיקן חודש", + "past" : { + "one" : "פֿאַר {0} חודש", + "other" : "פֿאַר {0} חדשים" + }, + "current" : "דעם חודש", + "previous" : "פֿאַרגאנגענעם חודש", + "future" : { + "one" : "איבער {0} חודש", + "other" : "איבער {0} חדשים" + } + }, + "now" : "now", + "day" : { + "next" : "מארגן", + "current" : "היינט", + "previous" : "נעכטן", + "past" : "-{0} d", + "future" : { + "other" : "אין {0} טעג אַרום", + "one" : "אין {0} טאָג אַרום" + } + }, + "year" : { + "previous" : "פֿאַראַיאָר", + "current" : "הײַ יאָר", + "next" : "איבער א יאָר", + "past" : "פֿאַר {0} יאָר", + "future" : { + "other" : "איבער {0} יאָר", + "one" : "איבער א יאָר" + } + }, + "hour" : { + "past" : "-{0} h", + "future" : "+{0} h", + "current" : "this hour" + }, + "minute" : { + "past" : "-{0} min", + "future" : "+{0} min", + "current" : "this minute" + }, + "second" : { + "current" : "now", + "future" : "+{0} s", + "past" : "-{0} s" + }, + "quarter" : { + "current" : "this quarter", + "future" : "+{0} Q", + "previous" : "last quarter", + "next" : "next quarter", + "past" : "-{0} Q" + }, + "week" : { + "future" : "+{0} w", + "previous" : "last week", + "next" : "איבער אַכט טאָג", + "past" : "-{0} w", + "current" : "this week" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/yue_Hans.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/yue_Hans.json new file mode 100644 index 0000000..06c1a41 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/yue_Hans.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "day" : { + "next" : "听日", + "future" : "{0} 日后", + "previous" : "寻日", + "current" : "今日", + "past" : "{0} 日前" + }, + "quarter" : { + "next" : "下季", + "past" : "{0} 季前", + "future" : "{0} 季后", + "previous" : "上季", + "current" : "今季" + }, + "hour" : { + "future" : "{0} 小时后", + "current" : "呢个小时", + "past" : "{0} 小时前" + }, + "year" : { + "next" : "下年", + "past" : "{0} 年前", + "current" : "今年", + "previous" : "旧年", + "future" : "{0} 年后" + }, + "now" : "宜家", + "month" : { + "current" : "今个月", + "future" : "{0} 个月后", + "past" : "{0} 个月前", + "next" : "下个月", + "previous" : "上个月" + }, + "week" : { + "previous" : "上星期", + "current" : "今个星期", + "past" : "{0} 个星期前", + "future" : "{0} 个星期后", + "next" : "下星期" + }, + "minute" : { + "past" : "{0} 分钟前", + "future" : "{0} 分钟后", + "current" : "呢分钟" + }, + "second" : { + "past" : "{0} 秒前", + "current" : "宜家", + "future" : "{0} 秒后" + } + }, + "long" : { + "day" : { + "previous" : "寻日", + "current" : "今日", + "next" : "听日", + "past" : "{0} 日前", + "future" : "{0} 日后" + }, + "week" : { + "current" : "今个星期", + "future" : "{0} 个星期后", + "past" : "{0} 个星期前", + "previous" : "上星期", + "next" : "下星期" + }, + "minute" : { + "current" : "呢分钟", + "past" : "{0} 分钟前", + "future" : "{0} 分钟后" + }, + "month" : { + "future" : "{0} 个月后", + "next" : "下个月", + "previous" : "上个月", + "current" : "今个月", + "past" : "{0} 个月前" + }, + "hour" : { + "past" : "{0} 小时前", + "current" : "呢个小时", + "future" : "{0} 小时后" + }, + "year" : { + "past" : "{0} 年前", + "future" : "{0} 年后", + "previous" : "旧年", + "next" : "下年", + "current" : "今年" + }, + "second" : { + "current" : "宜家", + "past" : "{0} 秒前", + "future" : "{0} 秒后" + }, + "now" : "宜家", + "quarter" : { + "past" : "{0} 季前", + "current" : "今季", + "previous" : "上一季", + "future" : "{0} 季后", + "next" : "下一季" + } + }, + "short" : { + "quarter" : { + "future" : "{0} 季后", + "next" : "下季", + "previous" : "上季", + "current" : "今季", + "past" : "{0} 季前" + }, + "minute" : { + "current" : "呢分钟", + "past" : "{0} 分钟前", + "future" : "{0} 分钟后" + }, + "year" : { + "next" : "下年", + "future" : "{0} 年后", + "current" : "今年", + "past" : "{0} 年前", + "previous" : "旧年" + }, + "second" : { + "future" : "{0} 秒后", + "current" : "宜家", + "past" : "{0} 秒前" + }, + "hour" : { + "past" : "{0} 小时前", + "current" : "呢个小时", + "future" : "{0} 小时后" + }, + "now" : "宜家", + "month" : { + "previous" : "上个月", + "next" : "下个月", + "past" : "{0} 个月前", + "current" : "今个月", + "future" : "{0} 个月后" + }, + "week" : { + "previous" : "上星期", + "current" : "今个星期", + "next" : "下星期", + "past" : "{0} 个星期前", + "future" : "{0} 个星期后" + }, + "day" : { + "next" : "听日", + "past" : "{0} 日前", + "future" : "{0} 日后", + "previous" : "寻日", + "current" : "今日" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/yue_Hant.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/yue_Hant.json new file mode 100644 index 0000000..3307274 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/yue_Hant.json @@ -0,0 +1,161 @@ +{ + "long" : { + "hour" : { + "current" : "呢個小時", + "past" : "{0} 小時前", + "future" : "{0} 小時後" + }, + "second" : { + "future" : "{0} 秒後", + "past" : "{0} 秒前", + "current" : "宜家" + }, + "week" : { + "next" : "下星期", + "current" : "今個星期", + "previous" : "上星期", + "future" : "{0} 個星期後", + "past" : "{0} 個星期前" + }, + "minute" : { + "current" : "呢分鐘", + "future" : "{0} 分鐘後", + "past" : "{0} 分鐘前" + }, + "year" : { + "current" : "今年", + "past" : "{0} 年前", + "future" : "{0} 年後", + "previous" : "舊年", + "next" : "下年" + }, + "quarter" : { + "next" : "下一季", + "current" : "今季", + "future" : "{0} 季後", + "previous" : "上一季", + "past" : "{0} 季前" + }, + "month" : { + "previous" : "上個月", + "future" : "{0} 個月後", + "current" : "今個月", + "next" : "下個月", + "past" : "{0} 個月前" + }, + "day" : { + "next" : "聽日", + "past" : "{0} 日前", + "current" : "今日", + "future" : "{0} 日後", + "previous" : "尋日" + }, + "now" : "宜家" + }, + "narrow" : { + "week" : { + "current" : "今個星期", + "next" : "下星期", + "past" : "{0} 個星期前", + "previous" : "上星期", + "future" : "{0} 個星期後" + }, + "minute" : { + "past" : "{0} 分鐘前", + "future" : "{0} 分鐘後", + "current" : "呢分鐘" + }, + "month" : { + "current" : "今個月", + "previous" : "上個月", + "past" : "{0} 個月前", + "next" : "下個月", + "future" : "{0} 個月後" + }, + "now" : "宜家", + "year" : { + "previous" : "舊年", + "current" : "今年", + "next" : "下年", + "past" : "{0} 年前", + "future" : "{0} 年後" + }, + "hour" : { + "past" : "{0} 小時前", + "future" : "{0} 小時後", + "current" : "呢個小時" + }, + "quarter" : { + "previous" : "上季", + "current" : "今季", + "past" : "{0} 季前", + "future" : "{0} 季後", + "next" : "下季" + }, + "second" : { + "future" : "{0} 秒後", + "current" : "宜家", + "past" : "{0} 秒前" + }, + "day" : { + "past" : "{0} 日前", + "current" : "今日", + "future" : "{0} 日後", + "previous" : "尋日", + "next" : "聽日" + } + }, + "short" : { + "month" : { + "current" : "今個月", + "next" : "下個月", + "past" : "{0} 個月前", + "future" : "{0} 個月後", + "previous" : "上個月" + }, + "now" : "宜家", + "day" : { + "next" : "聽日", + "current" : "今日", + "previous" : "尋日", + "past" : "{0} 日前", + "future" : "{0} 日後" + }, + "year" : { + "current" : "今年", + "future" : "{0} 年後", + "previous" : "舊年", + "next" : "下年", + "past" : "{0} 年前" + }, + "hour" : { + "future" : "{0} 小時後", + "current" : "呢個小時", + "past" : "{0} 小時前" + }, + "minute" : { + "current" : "呢分鐘", + "future" : "{0} 分鐘後", + "past" : "{0} 分鐘前" + }, + "second" : { + "future" : "{0} 秒後", + "current" : "宜家", + "past" : "{0} 秒前" + }, + "quarter" : { + "future" : "{0} 季後", + "previous" : "上季", + "next" : "下季", + "past" : "{0} 季前", + "current" : "今季" + }, + "week" : { + "next" : "下星期", + "past" : "{0} 個星期前", + "current" : "今個星期", + "previous" : "上星期", + "future" : "{0} 個星期後" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/zh.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/zh.json new file mode 100644 index 0000000..fa1d3ec --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/zh.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "quarter" : { + "current" : "本季度", + "past" : "{0}个季度前", + "next" : "下季度", + "future" : "{0}个季度后", + "previous" : "上季度" + }, + "day" : { + "next" : "明天", + "previous" : "昨天", + "future" : "{0}天后", + "past" : "{0}天前", + "current" : "今天" + }, + "year" : { + "past" : "{0}年前", + "previous" : "去年", + "future" : "{0}年后", + "next" : "明年", + "current" : "今年" + }, + "minute" : { + "past" : "{0}分钟前", + "future" : "{0}分钟后", + "current" : "此刻" + }, + "now" : "现在", + "week" : { + "current" : "本周", + "previous" : "上周", + "past" : "{0}周前", + "next" : "下周", + "future" : "{0}周后" + }, + "second" : { + "future" : "{0}秒后", + "current" : "现在", + "past" : "{0}秒前" + }, + "month" : { + "future" : "{0}个月后", + "current" : "本月", + "past" : "{0}个月前", + "previous" : "上个月", + "next" : "下个月" + }, + "hour" : { + "current" : "这一时间 \/ 此时", + "past" : "{0}小时前", + "future" : "{0}小时后" + } + }, + "long" : { + "year" : { + "next" : "明年", + "previous" : "去年", + "past" : "{0}年前", + "future" : "{0}年后", + "current" : "今年" + }, + "now" : "现在", + "quarter" : { + "next" : "下季度", + "past" : "{0}个季度前", + "future" : "{0}个季度后", + "current" : "本季度", + "previous" : "上季度" + }, + "month" : { + "past" : "{0}个月前", + "next" : "下个月", + "previous" : "上个月", + "future" : "{0}个月后", + "current" : "本月" + }, + "second" : { + "current" : "现在", + "past" : "{0}秒钟前", + "future" : "{0}秒钟后" + }, + "week" : { + "past" : "{0}周前", + "previous" : "上周", + "future" : "{0}周后", + "next" : "下周", + "current" : "本周" + }, + "day" : { + "next" : "明天", + "future" : "{0}天后", + "previous" : "昨天", + "current" : "今天", + "past" : "{0}天前" + }, + "minute" : { + "past" : "{0}分钟前", + "future" : "{0}分钟后", + "current" : "此刻" + }, + "hour" : { + "future" : "{0}小时后", + "current" : "这一时间 \/ 此时", + "past" : "{0}小时前" + } + }, + "short" : { + "minute" : { + "past" : "{0}分钟前", + "current" : "此刻", + "future" : "{0}分钟后" + }, + "week" : { + "future" : "{0}周后", + "previous" : "上周", + "next" : "下周", + "current" : "本周", + "past" : "{0}周前" + }, + "year" : { + "current" : "今年", + "previous" : "去年", + "future" : "{0}年后", + "past" : "{0}年前", + "next" : "明年" + }, + "month" : { + "next" : "下个月", + "past" : "{0}个月前", + "future" : "{0}个月后", + "previous" : "上个月", + "current" : "本月" + }, + "quarter" : { + "next" : "下季度", + "past" : "{0}个季度前", + "previous" : "上季度", + "current" : "本季度", + "future" : "{0}个季度后" + }, + "day" : { + "current" : "今天", + "previous" : "昨天", + "past" : "{0}天前", + "next" : "明天", + "future" : "{0}天后" + }, + "hour" : { + "past" : "{0}小时前", + "future" : "{0}小时后", + "current" : "这一时间 \/ 此时" + }, + "second" : { + "future" : "{0}秒后", + "past" : "{0}秒前", + "current" : "现在" + }, + "now" : "现在" + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/zh_Hans.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/zh_Hans.json new file mode 100644 index 0000000..77cef63 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/zh_Hans.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "quarter" : { + "current" : "本季度", + "past" : "{0}个季度前", + "next" : "下季度", + "future" : "{0}个季度后", + "previous" : "上季度" + }, + "day" : { + "next" : "明天", + "previous" : "昨天", + "future" : "{0}天后", + "past" : "{0}天前", + "current" : "今天" + }, + "year" : { + "past" : "{0}年前", + "previous" : "去年", + "future" : "{0}年后", + "next" : "明年", + "current" : "今年" + }, + "minute" : { + "past" : "{0}分钟前", + "future" : "{0}分钟后", + "current" : "此刻" + }, + "now" : "现在", + "week" : { + "current" : "本周", + "previous" : "上周", + "past" : "{0}周前", + "next" : "下周", + "future" : "{0}周后" + }, + "second" : { + "future" : "{0}秒后", + "current" : "现在", + "past" : "{0}秒前" + }, + "month" : { + "future" : "{0}个月后", + "current" : "本月", + "past" : "{0}个月前", + "previous" : "上个月", + "next" : "下个月" + }, + "hour" : { + "current" : "这一时间 \/ 此时", + "past" : "{0}小时前", + "future" : "{0}小时后" + } + }, + "long" : { + "year" : { + "next" : "明年", + "previous" : "去年", + "past" : "{0}年前", + "future" : "{0}年后", + "current" : "今年" + }, + "now" : "现在", + "quarter" : { + "next" : "下季度", + "past" : "{0}个季度前", + "future" : "{0}个季度后", + "current" : "本季度", + "previous" : "上季度" + }, + "month" : { + "past" : "{0}个月前", + "next" : "下个月", + "previous" : "上个月", + "future" : "{0}个月后", + "current" : "本月" + }, + "second" : { + "current" : "现在", + "past" : "{0}秒钟前", + "future" : "{0}秒钟后" + }, + "week" : { + "past" : "{0}周前", + "previous" : "上周", + "future" : "{0}周后", + "next" : "下周", + "current" : "本周" + }, + "day" : { + "next" : "明天", + "future" : "{0}天后", + "previous" : "昨天", + "current" : "今天", + "past" : "{0}天前" + }, + "minute" : { + "past" : "{0}分钟前", + "future" : "{0}分钟后", + "current" : "此刻" + }, + "hour" : { + "future" : "{0}小时后", + "current" : "这一时间 \/ 此时", + "past" : "{0}小时前" + } + }, + "short" : { + "minute" : { + "past" : "{0}分钟前", + "current" : "此刻", + "future" : "{0}分钟后" + }, + "week" : { + "future" : "{0}周后", + "previous" : "上周", + "next" : "下周", + "current" : "本周", + "past" : "{0}周前" + }, + "year" : { + "current" : "今年", + "previous" : "去年", + "future" : "{0}年后", + "past" : "{0}年前", + "next" : "明年" + }, + "month" : { + "next" : "下个月", + "past" : "{0}个月前", + "future" : "{0}个月后", + "previous" : "上个月", + "current" : "本月" + }, + "quarter" : { + "next" : "下季度", + "past" : "{0}个季度前", + "previous" : "上季度", + "current" : "本季度", + "future" : "{0}个季度后" + }, + "day" : { + "current" : "今天", + "previous" : "昨天", + "past" : "{0}天前", + "next" : "明天", + "future" : "{0}天后" + }, + "hour" : { + "past" : "{0}小时前", + "future" : "{0}小时后", + "current" : "这一时间 \/ 此时" + }, + "second" : { + "future" : "{0}秒后", + "past" : "{0}秒前", + "current" : "现在" + }, + "now" : "现在" + } +} diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/zh_Hans_HK.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/zh_Hans_HK.json new file mode 100644 index 0000000..2d6bd91 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/zh_Hans_HK.json @@ -0,0 +1,61 @@ +{ + "narrow" : { + + }, + "short" : { + + }, + "long" : { + "minute" : { + "past" : "{0}分钟前", + "future" : "{0}分钟后", + "current" : "此刻" + }, + "week" : { + "current" : "本周", + "past" : "{0}周前", + "future" : "{0}周后", + "next" : "下周", + "previous" : "上周" + }, + "year" : { + "current" : "今年", + "future" : "{0}年后", + "past" : "{0}年前", + "next" : "明年", + "previous" : "去年" + }, + "day" : { + "next" : "明天", + "current" : "今天", + "previous" : "昨天", + "past" : "{0}天前", + "future" : "{0}天后" + }, + "hour" : { + "future" : "{0}小时后", + "current" : "这一时间 \/ 此时", + "past" : "{0}小时前" + }, + "quarter" : { + "current" : "本季度", + "future" : "{0}个季度后", + "previous" : "上季度", + "next" : "下季度", + "past" : "{0}个季度前" + }, + "second" : { + "past" : "{0}秒前", + "current" : "现在", + "future" : "{0}秒后" + }, + "month" : { + "current" : "本月", + "past" : "{0}个月前", + "future" : "{0}个月后", + "next" : "下个月", + "previous" : "上个月" + }, + "now" : "现在" + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/zh_Hans_MO.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/zh_Hans_MO.json new file mode 100644 index 0000000..f2bfbec --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/zh_Hans_MO.json @@ -0,0 +1,61 @@ +{ + "narrow" : { + + }, + "long" : { + "second" : { + "future" : "{0}秒后", + "current" : "现在", + "past" : "{0}秒前" + }, + "hour" : { + "future" : "{0}小时后", + "past" : "{0}小时前", + "current" : "这一时间 \/ 此时" + }, + "day" : { + "previous" : "昨天", + "past" : "{0}天前", + "future" : "{0}天后", + "current" : "今天", + "next" : "明天" + }, + "minute" : { + "past" : "{0}分钟前", + "current" : "此刻", + "future" : "{0}分钟后" + }, + "now" : "现在", + "year" : { + "future" : "{0}年后", + "past" : "{0}年前", + "previous" : "去年", + "next" : "明年", + "current" : "今年" + }, + "quarter" : { + "current" : "本季度", + "next" : "下季度", + "previous" : "上季度", + "future" : "{0}个季度后", + "past" : "{0}个季度前" + }, + "week" : { + "past" : "{0}周前", + "next" : "下周", + "future" : "{0}周后", + "current" : "本周", + "previous" : "上周" + }, + "month" : { + "next" : "下个月", + "future" : "{0}个月后", + "previous" : "上个月", + "past" : "{0}个月前", + "current" : "本月" + } + }, + "short" : { + + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/zh_Hans_SG.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/zh_Hans_SG.json new file mode 100644 index 0000000..2d6bd91 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/zh_Hans_SG.json @@ -0,0 +1,61 @@ +{ + "narrow" : { + + }, + "short" : { + + }, + "long" : { + "minute" : { + "past" : "{0}分钟前", + "future" : "{0}分钟后", + "current" : "此刻" + }, + "week" : { + "current" : "本周", + "past" : "{0}周前", + "future" : "{0}周后", + "next" : "下周", + "previous" : "上周" + }, + "year" : { + "current" : "今年", + "future" : "{0}年后", + "past" : "{0}年前", + "next" : "明年", + "previous" : "去年" + }, + "day" : { + "next" : "明天", + "current" : "今天", + "previous" : "昨天", + "past" : "{0}天前", + "future" : "{0}天后" + }, + "hour" : { + "future" : "{0}小时后", + "current" : "这一时间 \/ 此时", + "past" : "{0}小时前" + }, + "quarter" : { + "current" : "本季度", + "future" : "{0}个季度后", + "previous" : "上季度", + "next" : "下季度", + "past" : "{0}个季度前" + }, + "second" : { + "past" : "{0}秒前", + "current" : "现在", + "future" : "{0}秒后" + }, + "month" : { + "current" : "本月", + "past" : "{0}个月前", + "future" : "{0}个月后", + "next" : "下个月", + "previous" : "上个月" + }, + "now" : "现在" + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/zh_Hant.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/zh_Hant.json new file mode 100644 index 0000000..ff9e1d9 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/zh_Hant.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "now" : "現在", + "week" : { + "next" : "下週", + "current" : "本週", + "past" : "{0} 週前", + "future" : "{0} 週後", + "previous" : "上週" + }, + "quarter" : { + "previous" : "上一季", + "next" : "下一季", + "future" : "{0} 季後", + "current" : "這一季", + "past" : "{0} 季前" + }, + "day" : { + "future" : "{0} 天後", + "previous" : "昨天", + "next" : "明天", + "past" : "{0} 天前", + "current" : "今天" + }, + "hour" : { + "current" : "這一小時", + "past" : "{0} 小時前", + "future" : "{0} 小時後" + }, + "second" : { + "future" : "{0} 秒後", + "current" : "現在", + "past" : "{0} 秒前" + }, + "month" : { + "past" : "{0} 個月前", + "future" : "{0} 個月後", + "current" : "本月", + "previous" : "上個月", + "next" : "下個月" + }, + "minute" : { + "future" : "{0} 分鐘後", + "current" : "這一分鐘", + "past" : "{0} 分鐘前" + }, + "year" : { + "next" : "明年", + "future" : "{0} 年後", + "previous" : "去年", + "current" : "今年", + "past" : "{0} 年前" + } + }, + "long" : { + "day" : { + "future" : "{0} 天後", + "past" : "{0} 天前", + "current" : "今天", + "next" : "明天", + "previous" : "昨天" + }, + "second" : { + "past" : "{0} 秒前", + "current" : "現在", + "future" : "{0} 秒後" + }, + "quarter" : { + "current" : "這一季", + "next" : "下一季", + "previous" : "上一季", + "future" : "{0} 季後", + "past" : "{0} 季前" + }, + "month" : { + "future" : "{0} 個月後", + "previous" : "上個月", + "past" : "{0} 個月前", + "next" : "下個月", + "current" : "本月" + }, + "week" : { + "future" : "{0} 週後", + "past" : "{0} 週前", + "current" : "本週", + "previous" : "上週", + "next" : "下週" + }, + "hour" : { + "future" : "{0} 小時後", + "current" : "這一小時", + "past" : "{0} 小時前" + }, + "minute" : { + "future" : "{0} 分鐘後", + "past" : "{0} 分鐘前", + "current" : "這一分鐘" + }, + "now" : "現在", + "year" : { + "future" : "{0} 年後", + "next" : "明年", + "past" : "{0} 年前", + "previous" : "去年", + "current" : "今年" + } + }, + "short" : { + "hour" : { + "future" : "{0} 小時後", + "current" : "這一小時", + "past" : "{0} 小時前" + }, + "now" : "現在", + "quarter" : { + "current" : "這一季", + "future" : "{0} 季後", + "past" : "{0} 季前", + "next" : "下一季", + "previous" : "上一季" + }, + "day" : { + "current" : "今天", + "past" : "{0} 天前", + "future" : "{0} 天後", + "next" : "明天", + "previous" : "昨天" + }, + "week" : { + "current" : "本週", + "past" : "{0} 週前", + "future" : "{0} 週後", + "next" : "下週", + "previous" : "上週" + }, + "minute" : { + "past" : "{0} 分鐘前", + "future" : "{0} 分鐘後", + "current" : "這一分鐘" + }, + "second" : { + "past" : "{0} 秒前", + "current" : "現在", + "future" : "{0} 秒後" + }, + "month" : { + "current" : "本月", + "future" : "{0} 個月後", + "previous" : "上個月", + "next" : "下個月", + "past" : "{0} 個月前" + }, + "year" : { + "future" : "{0} 年後", + "previous" : "去年", + "next" : "明年", + "current" : "今年", + "past" : "{0} 年前" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/zh_Hant_HK.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/zh_Hant_HK.json new file mode 100644 index 0000000..a73e0ab --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/zh_Hant_HK.json @@ -0,0 +1,161 @@ +{ + "narrow" : { + "quarter" : { + "current" : "今季", + "past" : "-{0}Q", + "next" : "下季", + "future" : "+{0}Q", + "previous" : "上季" + }, + "day" : { + "next" : "明日", + "previous" : "昨日", + "future" : "{0}日後", + "past" : "{0}日前", + "current" : "今日" + }, + "year" : { + "past" : "{0}年前", + "previous" : "上年", + "future" : "{0}年後", + "next" : "下年", + "current" : "今年" + }, + "minute" : { + "current" : "這分鐘", + "future" : "{0}分後", + "past" : "{0}分前" + }, + "now" : "現在", + "week" : { + "current" : "本星期", + "previous" : "上星期", + "past" : "{0}星期前", + "next" : "下星期", + "future" : "{0}星期後" + }, + "second" : { + "current" : "現在", + "past" : "{0}秒前", + "future" : "{0}秒後" + }, + "month" : { + "future" : "{0}個月後", + "current" : "本月", + "past" : "{0}個月前", + "previous" : "上個月", + "next" : "下個月" + }, + "hour" : { + "past" : "{0}小時前", + "future" : "{0}小時後", + "current" : "這個小時" + } + }, + "long" : { + "year" : { + "next" : "下年", + "previous" : "上年", + "past" : "{0} 年前", + "future" : "{0} 年後", + "current" : "今年" + }, + "now" : "現在", + "quarter" : { + "next" : "下一季", + "past" : "{0} 季前", + "future" : "{0} 季後", + "current" : "今季", + "previous" : "上一季" + }, + "month" : { + "past" : "{0} 個月前", + "next" : "下個月", + "previous" : "上個月", + "future" : "{0} 個月後", + "current" : "本月" + }, + "second" : { + "past" : "{0} 秒前", + "future" : "{0} 秒後", + "current" : "現在" + }, + "week" : { + "past" : "{0} 星期前", + "previous" : "上星期", + "future" : "{0} 星期後", + "next" : "下星期", + "current" : "本星期" + }, + "day" : { + "next" : "明日", + "future" : "{0} 日後", + "previous" : "昨日", + "current" : "今日", + "past" : "{0} 日前" + }, + "minute" : { + "past" : "{0} 分鐘前", + "future" : "{0} 分鐘後", + "current" : "這分鐘" + }, + "hour" : { + "current" : "這個小時", + "past" : "{0} 小時前", + "future" : "{0} 小時後" + } + }, + "short" : { + "minute" : { + "future" : "{0} 分鐘後", + "current" : "這分鐘", + "past" : "{0} 分鐘前" + }, + "week" : { + "future" : "{0} 星期後", + "previous" : "上星期", + "next" : "下星期", + "current" : "本星期", + "past" : "{0} 星期前" + }, + "year" : { + "current" : "今年", + "previous" : "上年", + "future" : "{0} 年後", + "past" : "{0} 年前", + "next" : "下年" + }, + "month" : { + "next" : "下個月", + "past" : "{0} 個月前", + "future" : "{0} 個月後", + "previous" : "上個月", + "current" : "本月" + }, + "quarter" : { + "next" : "下季", + "past" : "{0} 季前", + "previous" : "上季", + "current" : "今季", + "future" : "{0} 季後" + }, + "day" : { + "current" : "今日", + "previous" : "昨日", + "past" : "{0} 日前", + "next" : "明日", + "future" : "{0} 日後" + }, + "hour" : { + "current" : "這個小時", + "past" : "{0} 小時前", + "future" : "{0} 小時後" + }, + "second" : { + "current" : "現在", + "past" : "{0} 秒前", + "future" : "{0} 秒後" + }, + "now" : "現在" + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/zu.json b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/zu.json new file mode 100644 index 0000000..99d4cbb --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Formatters/RelativeFormatter/langs/zu.json @@ -0,0 +1,275 @@ +{ + "short" : { + "day" : { + "previous" : "izolo", + "current" : "namhlanje", + "past" : { + "other" : "{0} izinsuku ezedlule", + "one" : "{0} usuku olwedlule" + }, + "future" : { + "one" : "osukwini olungu-{0} oluzayo", + "other" : "ezinsukwini ezingu-{0} ezizayo" + }, + "next" : "kusasa" + }, + "week" : { + "next" : "iviki elizayo", + "current" : "leli viki", + "previous" : "iviki eledlule", + "past" : "amaviki angu-{0} edlule", + "future" : { + "other" : "emavikini angu-{0} ezayo", + "one" : "evikini elingu-{0} elizayo" + } + }, + "quarter" : { + "next" : "ikota ezayo", + "past" : { + "one" : "{0} amakota adlule", + "other" : "{0} amakota edlule" + }, + "current" : "le kota", + "previous" : "ikota edlule", + "future" : { + "one" : "kwikota engu-{0} ezayo", + "other" : "kumakota angu-{0} ezayo" + } + }, + "minute" : { + "future" : { + "one" : "kuminithi elingu-{0} elizayo", + "other" : "kumaminithi angu-{0} ezayo" + }, + "past" : { + "one" : "{0} iminithi eledlule", + "other" : "{0} amaminithi edlule" + }, + "current" : "leli minithi" + }, + "year" : { + "current" : "kulo nyaka", + "next" : "unyaka ozayo", + "past" : "{0} unyaka odlule", + "future" : { + "other" : "eminyakeni engu-{0} ezayo", + "one" : "onyakeni ongu-{0} ozayo" + }, + "previous" : "onyakeni odlule" + }, + "hour" : { + "past" : { + "one" : "{0} ihora eledlule", + "other" : "emahoreni angu-{0} edlule" + }, + "future" : { + "other" : "emahoreni angu-{0} ezayo", + "one" : "ehoreni elingu-{0} elizayo" + }, + "current" : "leli hora" + }, + "month" : { + "current" : "le nyanga", + "future" : "ezinyangeni ezingu-{0} ezizayo", + "previous" : "inyanga edlule", + "next" : "inyanga ezayo", + "past" : "{0} izinyanga ezedlule" + }, + "second" : { + "future" : { + "other" : "kumasekhondi angu-{0} ezayo", + "one" : "kusekhondi elingu-{0} elizayo" + }, + "current" : "manje", + "past" : { + "one" : "{0} isekhondi eledlule", + "other" : "{0} amasekhondi edlule" + } + }, + "now" : "manje" + }, + "long" : { + "month" : { + "previous" : "inyanga edlule", + "next" : "inyanga ezayo", + "future" : { + "one" : "enyangeni engu-{0}", + "other" : "ezinyangeni ezingu-{0} ezizayo" + }, + "current" : "le nyanga", + "past" : { + "other" : "{0} izinyanga ezedlule", + "one" : "{0} inyanga edlule" + } + }, + "minute" : { + "past" : { + "one" : "{0} iminithi eledlule", + "other" : "{0} amaminithi edlule" + }, + "future" : { + "one" : "kuminithi elingu-{0} elizayo", + "other" : "kumaminithi angu-{0} ezayo" + }, + "current" : "leli minithi" + }, + "quarter" : { + "previous" : "ikota edlule", + "past" : { + "other" : "{0} amakota adlule", + "one" : "{0} ikota edlule" + }, + "current" : "le kota", + "next" : "ikota ezayo", + "future" : { + "other" : "kumakota angu-{0} ezayo", + "one" : "kwikota engu-{0} ezayo" + } + }, + "week" : { + "current" : "leli viki", + "past" : { + "other" : "amaviki angu-{0} edlule", + "one" : "evikini elingu-{0} eledlule" + }, + "previous" : "iviki eledlule", + "future" : { + "one" : "evikini elingu-{0}", + "other" : "emavikini angu-{0}" + }, + "next" : "iviki elizayo" + }, + "now" : "manje", + "second" : { + "future" : { + "other" : "kumasekhondi angu-{0} ezayo", + "one" : "kusekhondi elingu-{0} elizayo" + }, + "current" : "manje", + "past" : { + "other" : "{0} amasekhondi edlule", + "one" : "{0} isekhondi eledlule" + } + }, + "year" : { + "past" : { + "other" : "{0} iminyaka edlule", + "one" : "{0} unyaka odlule" + }, + "next" : "unyaka ozayo", + "current" : "kulo nyaka", + "future" : { + "other" : "eminyakeni engu-{0} ezayo", + "one" : "onyakeni ongu-{0} ozayo" + }, + "previous" : "onyakeni odlule" + }, + "hour" : { + "current" : "leli hora", + "past" : { + "one" : "{0} ihora eledlule", + "other" : "emahoreni angu-{0} edlule" + }, + "future" : { + "one" : "ehoreni elingu-{0} elizayo", + "other" : "emahoreni angu-{0} ezayo" + } + }, + "day" : { + "past" : { + "one" : "osukwini olungu-{0} olwedlule", + "other" : "ezinsukwini ezingu-{0} ezedlule." + }, + "future" : { + "other" : "ezinsukwini ezingu-{0} ezizayo", + "one" : "osukwini olungu-{0} oluzayo" + }, + "current" : "namhlanje", + "previous" : "izolo", + "next" : "kusasa" + } + }, + "narrow" : { + "year" : { + "past" : "{0} unyaka odlule", + "future" : { + "other" : "eminyakeni engu-{0} ezayo", + "one" : "onyakeni ongu-{0} ozayo" + }, + "next" : "unyaka ozayo", + "current" : "kulo nyaka", + "previous" : "onyakeni odlule" + }, + "quarter" : { + "past" : { + "other" : "{0} amakota edlule", + "one" : "{0} amakota adlule" + }, + "current" : "le kota", + "next" : "ikota ezayo", + "future" : "kumakota angu-{0}", + "previous" : "ikota edlule" + }, + "day" : { + "current" : "namhlanje", + "next" : "kusasa", + "past" : { + "one" : "{0} usuku olwedlule", + "other" : "{0} izinsuku ezedlule" + }, + "future" : { + "one" : "osukwini olungu-{0} oluzayo", + "other" : "ezinsukwini ezingu-{0} ezizayo" + }, + "previous" : "izolo" + }, + "month" : { + "previous" : "inyanga edlule", + "next" : "inyanga ezayo", + "future" : "enyangeni engu-{0} ezayo", + "current" : "le nyanga", + "past" : "{0} izinyanga ezedlule" + }, + "hour" : { + "current" : "leli hora", + "past" : { + "one" : "{0} ihora eledlule", + "other" : "{0} amahora edlule" + }, + "future" : { + "one" : "ehoreni elingu-{0} elizayo", + "other" : "emahoreni angu-{0} ezayo" + } + }, + "second" : { + "past" : { + "one" : "{0} isekhondi eledlule", + "other" : "{0} amasekhondi edlule" + }, + "current" : "manje", + "future" : { + "one" : "kusekhondi elingu-{0} elizayo", + "other" : "kumasekhondi angu-{0} ezayo" + } + }, + "minute" : { + "past" : { + "one" : "{0} iminithi eledlule", + "other" : "{0} amaminithi edlule" + }, + "future" : { + "one" : "kuminithi elingu-{0} elizayo", + "other" : "kumaminithi angu-{0} ezayo" + }, + "current" : "leli minithi" + }, + "now" : "manje", + "week" : { + "next" : "iviki elizayo", + "future" : "emavikini angu-{0} ezayo", + "previous" : "iviki eledlule", + "current" : "leli viki", + "past" : "amaviki angu-{0} edlule" + } + } +} \ No newline at end of file diff --git a/Sources/App/Libraries/SwiftDate/Foundation+Extras/DateComponents+Extras.swift b/Sources/App/Libraries/SwiftDate/Foundation+Extras/DateComponents+Extras.swift new file mode 100644 index 0000000..2df1656 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Foundation+Extras/DateComponents+Extras.swift @@ -0,0 +1,290 @@ +// +// SwiftDate +// Parse, validate, manipulate, and display dates, time and timezones in Swift +// +// Created by Daniele Margutti +// - Web: https://www.danielemargutti.com +// - Twitter: https://twitter.com/danielemargutti +// - Mail: hello@danielemargutti.com +// +// Copyright © 2019 Daniele Margutti. Licensed under MIT License. +// + +import Foundation + +// MARK: - Date Components Extensions + +public extension Calendar.Component { + + /// Return a description of the calendar component in seconds. + /// Note: Values for `era`,`weekday`,`weekdayOrdinal`, `yearForWeekOfYear`, `calendar`, `timezone` are `nil`. + /// For `weekOfYear` it return the same value of `weekOfMonth`. + var timeInterval: Double? { + switch self { + case .era: return nil + case .year: return (Calendar.Component.day.timeInterval! * 365.0) + case .month: return (Calendar.Component.minute.timeInterval! * 43800) + case .day: return 86400 + case .hour: return 3600 + case .minute: return 60 + case .second: return 1 + case .quarter: return (Calendar.Component.day.timeInterval! * 91.25) + case .weekOfMonth, .weekOfYear: return (Calendar.Component.day.timeInterval! * 7) + case .nanosecond: return 1e-9 + default: return nil + } + } + + /// Return the localized identifier of a calendar component + /// + /// - parameter unit: unit + /// - parameter value: value + /// + /// - returns: return the plural or singular form of the time unit used to compose a valid identifier for search a localized + /// string in resource bundle + internal func localizedKey(forValue value: Int) -> String { + let locKey = localizedKey + let absValue = abs(value) + switch absValue { + case 0: // zero difference for this unit + return "0\(locKey)" + case 1: // one unit of difference + return locKey + default: // more than 1 unit of difference + return "\(locKey)\(locKey)" + } + } + + internal var localizedKey: String { + switch self { + case .year: return "y" + case .month: return "m" + case .weekOfYear: return "w" + case .day: return "d" + case .hour: return "h" + case .minute: return "M" + case .second: return "s" + default: + return "" + } + } + +} + +public extension DateComponents { + + /// Shortcut for 'all calendar components'. + static var allComponentsSet: Set { + return [.era, .year, .month, .day, .hour, .minute, + .second, .weekday, .weekdayOrdinal, .quarter, + .weekOfMonth, .weekOfYear, .yearForWeekOfYear, + .nanosecond, .calendar, .timeZone] + } + + internal static let allComponents: [Calendar.Component] = [.nanosecond, .second, .minute, .hour, + .day, .month, .year, .yearForWeekOfYear, + .weekOfYear, .weekday, .quarter, .weekdayOrdinal, + .weekOfMonth] + + /// This function return the absolute amount of seconds described by the components of the receiver. + /// Note: evaluated value maybe not strictly exact because it ignore the context (calendar/date) of + /// the date components. In details: + /// - The following keys are ignored: `era`,`weekday`,`weekdayOrdinal`, + /// `weekOfYear`, `yearForWeekOfYear`, `calendar`, `timezone + /// + /// Some other values dependant from dates are fixed. This is a complete table: + /// - `year` is 365.0 `days` + /// - `month` is 30.4167 `days` (or 43800 minutes) + /// - `quarter` is 91.25 `days` + /// - `weekOfMonth` is 7 `days` + /// - `day` is 86400 `seconds` + /// - `hour` is 3600 `seconds` + /// - `minute` is 60 `seconds` + /// - `nanosecond` is 1e-9 `seconds` + var timeInterval: TimeInterval { + var totalAmount: TimeInterval = 0 + DateComponents.allComponents.forEach { + if let multipler = $0.timeInterval, let value = value(for: $0), value != Int(NSDateComponentUndefined) { + totalAmount += (TimeInterval(value) * multipler) + } + } + return totalAmount + } + + /// Create a new `DateComponents` instance with builder pattern. + /// + /// - Parameter builder: callback for builder + /// - Returns: new instance + static func create(_ builder: ((inout DateComponents) -> Void)) -> DateComponents { + var components = DateComponents() + builder(&components) + return components + } + + /// Return the current date plus the receive's interval + /// The default calendar used is the `SwiftDate.defaultRegion`'s calendar. + var fromNow: Date { + return SwiftDate.defaultRegion.calendar.date(byAdding: (self as DateComponents) as DateComponents, to: Date() as Date)! + } + + /// Returns the current date minus the receiver's interval + /// The default calendar used is the `SwiftDate.defaultRegion`'s calendar. + var ago: Date { + return SwiftDate.defaultRegion.calendar.date(byAdding: -self as DateComponents, to: Date())! + } + + /// - returns: the date that will occur once the receiver's components pass after the provide date. + func from(_ date: DateRepresentable) -> Date? { + return date.calendar.date(byAdding: self, to: date.date) + } + + /// Return `true` if all interval components are zeroes + var isZero: Bool { + for component in DateComponents.allComponents { + if let value = value(for: component), value != 0 { + return false + } + } + return true + } + + /// Transform a `DateComponents` instance to a dictionary where key is the `Calendar.Component` and value is the + /// value associated. + /// + /// - returns: a new `[Calendar.Component : Int]` dict representing source `DateComponents` instance + internal func toDict() -> [Calendar.Component: Int] { + var list: [Calendar.Component: Int] = [:] + DateComponents.allComponents.forEach { component in + let value = self.value(for: component) + if value != nil && value != Int(NSDateComponentUndefined) { + list[component] = value! + } + } + return list + } + + /// Alter date components specified into passed dictionary. + /// + /// - Parameter components: components dictionary with their values. + internal mutating func alterComponents(_ components: [Calendar.Component: Int?]) { + components.forEach { + if let v = $0.value { + setValue(v, for: $0.key) + } + } + } + + /// Adds two NSDateComponents and returns their combined individual components. + static func + (lhs: DateComponents, rhs: DateComponents) -> DateComponents { + return combine(lhs, rhs: rhs, transform: +) + } + + /// Subtracts two NSDateComponents and returns the relative difference between them. + static func - (lhs: DateComponents, rhs: DateComponents) -> DateComponents { + return lhs + (-rhs) + } + + /// Applies the `transform` to the two `T` provided, defaulting either of them if it's + /// `nil` + internal static func bimap(_ a: T?, _ b: T?, default: T, _ transform: (T, T) -> T) -> T? { + if a == nil && b == nil { return nil } + return transform(a ?? `default`, b ?? `default`) + } + + /// - returns: a new `NSDateComponents` that represents the negative of all values within the + /// components that are not `NSDateComponentUndefined`. + static prefix func - (rhs: DateComponents) -> DateComponents { + var components = DateComponents() + components.era = rhs.era.map(-) + components.year = rhs.year.map(-) + components.month = rhs.month.map(-) + components.day = rhs.day.map(-) + components.hour = rhs.hour.map(-) + components.minute = rhs.minute.map(-) + components.second = rhs.second.map(-) + components.nanosecond = rhs.nanosecond.map(-) + components.weekday = rhs.weekday.map(-) + components.weekdayOrdinal = rhs.weekdayOrdinal.map(-) + components.quarter = rhs.quarter.map(-) + components.weekOfMonth = rhs.weekOfMonth.map(-) + components.weekOfYear = rhs.weekOfYear.map(-) + components.yearForWeekOfYear = rhs.yearForWeekOfYear.map(-) + return components + } + + /// Combines two date components using the provided `transform` on all + /// values within the components that are not `NSDateComponentUndefined`. + private static func combine(_ lhs: DateComponents, rhs: DateComponents, transform: (Int, Int) -> Int) -> DateComponents { + var components = DateComponents() + components.era = bimap(lhs.era, rhs.era, default: 0, transform) + components.year = bimap(lhs.year, rhs.year, default: 0, transform) + components.month = bimap(lhs.month, rhs.month, default: 0, transform) + components.day = bimap(lhs.day, rhs.day, default: 0, transform) + components.hour = bimap(lhs.hour, rhs.hour, default: 0, transform) + components.minute = bimap(lhs.minute, rhs.minute, default: 0, transform) + components.second = bimap(lhs.second, rhs.second, default: 0, transform) + components.nanosecond = bimap(lhs.nanosecond, rhs.nanosecond, default: 0, transform) + components.weekday = bimap(lhs.weekday, rhs.weekday, default: 0, transform) + components.weekdayOrdinal = bimap(lhs.weekdayOrdinal, rhs.weekdayOrdinal, default: 0, transform) + components.quarter = bimap(lhs.quarter, rhs.quarter, default: 0, transform) + components.weekOfMonth = bimap(lhs.weekOfMonth, rhs.weekOfMonth, default: 0, transform) + components.weekOfYear = bimap(lhs.weekOfYear, rhs.weekOfYear, default: 0, transform) + components.yearForWeekOfYear = bimap(lhs.yearForWeekOfYear, rhs.yearForWeekOfYear, default: 0, transform) + return components + } + + /// Subscription support for `DateComponents` instances. + /// ie. `cmps[.day] = 5` + /// + /// Note: This does not take into account any built-in errors, `Int.max` returned instead of `nil`. + /// + /// - Parameter component: component to get + subscript(component: Calendar.Component) -> Int? { + switch component { + case .era: return era + case .year: return year + case .month: return month + case .day: return day + case .hour: return hour + case .minute: return minute + case .second: return second + case .weekday: return weekday + case .weekdayOrdinal: return weekdayOrdinal + case .quarter: return quarter + case .weekOfMonth: return weekOfMonth + case .weekOfYear: return weekOfYear + case .yearForWeekOfYear: return yearForWeekOfYear + case .nanosecond: return nanosecond + default: return nil // `calendar` and `timezone` are ignored in this context + } + } + + /// Express a `DateComponents` instance in another time unit you choose. + /// + /// - parameter component: time component + /// - parameter calendar: context calendar to use + /// + /// - returns: the value of interval expressed in selected `Calendar.Component` + func `in`(_ component: Calendar.Component, of calendar: CalendarConvertible? = nil) -> Int? { + let cal = (calendar?.toCalendar() ?? SwiftDate.defaultRegion.calendar) + let dateFrom = Date() + let dateTo = (dateFrom + self) + let components: Set = [component] + let value = cal.dateComponents(components, from: dateFrom, to: dateTo).value(for: component) + return value + } + + /// Express a `DateComponents` instance in a set of time units you choose. + /// + /// - Parameters: + /// - component: time component + /// - calendar: context calendar to use + /// - Returns: a dictionary of extract values. + func `in`(_ components: Set, of calendar: CalendarConvertible? = nil) -> [Calendar.Component: Int] { + let cal = (calendar?.toCalendar() ?? SwiftDate.defaultRegion.calendar) + let dateFrom = Date() + let dateTo = (dateFrom + self) + let extractedCmps = cal.dateComponents(components, from: dateFrom, to: dateTo) + return extractedCmps.toDict() + } +} diff --git a/Sources/App/Libraries/SwiftDate/Foundation+Extras/Int+DateComponents.swift b/Sources/App/Libraries/SwiftDate/Foundation+Extras/Int+DateComponents.swift new file mode 100644 index 0000000..8ca8a8c --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Foundation+Extras/Int+DateComponents.swift @@ -0,0 +1,78 @@ +// +// SwiftDate +// Parse, validate, manipulate, and display dates, time and timezones in Swift +// +// Created by Daniele Margutti +// - Web: https://www.danielemargutti.com +// - Twitter: https://twitter.com/danielemargutti +// - Mail: hello@danielemargutti.com +// +// Copyright © 2019 Daniele Margutti. Licensed under MIT License. +// + +import Foundation + +// MARK: Int Extension + +/// This allows us to transform a literal number in a `DateComponents` and use it in math operations +/// For example `5.days` will create a new `DateComponents` where `.day = 5`. + +public extension Int { + + /// Internal transformation function + /// + /// - parameter type: component to use + /// + /// - returns: return self value in form of `DateComponents` where given `Calendar.Component` has `self` as value + internal func toDateComponents(type: Calendar.Component) -> DateComponents { + var dateComponents = DateComponents() + dateComponents.setValue(self, for: type) + return dateComponents + } + + /// Create a `DateComponents` with `self` value set as nanoseconds + var nanoseconds: DateComponents { + return toDateComponents(type: .nanosecond) + } + + /// Create a `DateComponents` with `self` value set as seconds + var seconds: DateComponents { + return toDateComponents(type: .second) + } + + /// Create a `DateComponents` with `self` value set as minutes + var minutes: DateComponents { + return toDateComponents(type: .minute) + } + + /// Create a `DateComponents` with `self` value set as hours + var hours: DateComponents { + return toDateComponents(type: .hour) + } + + /// Create a `DateComponents` with `self` value set as days + var days: DateComponents { + return toDateComponents(type: .day) + } + + /// Create a `DateComponents` with `self` value set as weeks + var weeks: DateComponents { + return toDateComponents(type: .weekOfYear) + } + + /// Create a `DateComponents` with `self` value set as months + var months: DateComponents { + return toDateComponents(type: .month) + } + + /// Create a `DateComponents` with `self` value set as years + var years: DateComponents { + return toDateComponents(type: .year) + } + + /// Create a `DateComponents` with `self` value set as quarters + var quarters: DateComponents { + return toDateComponents(type: .quarter) + } + +} diff --git a/Sources/App/Libraries/SwiftDate/Foundation+Extras/String+Parser.swift b/Sources/App/Libraries/SwiftDate/Foundation+Extras/String+Parser.swift new file mode 100644 index 0000000..e9a2c2a --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Foundation+Extras/String+Parser.swift @@ -0,0 +1,120 @@ +// +// SwiftDate +// Parse, validate, manipulate, and display dates, time and timezones in Swift +// +// Created by Daniele Margutti +// - Web: https://www.danielemargutti.com +// - Twitter: https://twitter.com/danielemargutti +// - Mail: hello@danielemargutti.com +// +// Copyright © 2019 Daniele Margutti. Licensed under MIT License. +// + +import Foundation + +// MARK: - DataParsable Protocol + +public protocol DateParsable { + + /// Convert a string to a `DateInRegion` instance by parsing it with given parser + /// or using one of the built-in parser (if you know the format of the date you + /// should consider explicitly pass it to avoid unecessary computations). + /// + /// - Parameters: + /// - format: format of the date, `nil` to leave the library to found the best + /// one via `SwiftDate.autoFormats` + /// - region: region in which the date should be expressed in. + /// Region's locale is used to format the date when using long readable unit names (like MMM + /// for month). + /// - Returns: date in region representation, `nil` if parse fails + func toDate(_ format: String?, region: Region) -> DateInRegion? + + /// Convert a string to a `DateInRegion` instance by parsing it with the ordered + /// list of provided formats. + /// If `formats` array is not provided it uses the `SwiftDate.autoFormats` array instead. + /// Note: if you knwo the format of the date you should consider explicitly pass it to avoid + /// unecessary computations. + /// + /// - Parameters: + /// - format: ordered formats to parse date (if you don't have a list of formats you can pass `SwiftDate.autoFormats`) + /// - region: region in which the date should be expressed in. + /// Region's locale is used to format the date when using long readable unit names (like MMM + /// for month). + /// - Returns: date in region representation, `nil` if parse fails + func toDate(_ formats: [String], region: Region) -> DateInRegion? + + /// Convert a string to a valid `DateInRegion` using passed style. + /// + /// - Parameters: + /// - style: parsing style. + /// - region: region in which the date should be expressed in + /// - Returns: date in region representation, `nil` if parse fails + func toDate(style: StringToDateStyles, region: Region) -> DateInRegion? + + /// Convert to date from a valid ISO8601 string + /// + /// - Parameters: + /// - options: options of the parser + /// - region: region in which the date should be expressed in (timzone is ignored and evaluated automatically) + /// - Returns: date in region representation, `nil` if parse fails + func toISODate(_ options: ISOParser.Options?, region: Region?) -> DateInRegion? + + /// Convert to date from a valid DOTNET string + /// + /// - region: region in which the date should be expressed in (timzone is ignored and evaluated automatically) + /// - Returns: date in region representation, `nil` if parse fails + func toDotNETDate(region: Region) -> DateInRegion? + + /// Convert to a date from a valid RSS/ALT RSS string + /// + /// - Parameters: + /// - alt: `true` if string represent an ALT RSS formatted date, `false` if a standard RSS formatted date. + /// - region: region in which the date should be expressed in (timzone is ignored and evaluated automatically) + /// - Returns: date in region representation, `nil` if parse fails + func toRSSDate(alt: Bool, region: Region) -> DateInRegion? + + /// Convert to a date from a valid SQL format string. + /// + /// - Parameters: + /// - region: region in which the date should be expressed in (timzone is ignored and evaluated automatically) + /// - Returns: date in region representation, `nil` if parse fails + func toSQLDate(region: Region) -> DateInRegion? + +} + +// MARK: - DataParsable Implementation for Strings + +extension String: DateParsable { + + public func toDate(_ format: String? = nil, region: Region = SwiftDate.defaultRegion) -> DateInRegion? { + return DateInRegion(self, format: format, region: region) + } + + public func toDate(_ formats: [String], region: Region) -> DateInRegion? { + return DateInRegion(self, formats: formats, region: region) + } + + public func toDate(style: StringToDateStyles, region: Region = SwiftDate.defaultRegion) -> DateInRegion? { + return style.toDate(self, region: region) + } + + public func toISODate(_ options: ISOParser.Options? = nil, region: Region? = nil) -> DateInRegion? { + return ISOParser.parse(self, region: region, options: options) + } + + public func toDotNETDate(region: Region = Region.ISO) -> DateInRegion? { + return DOTNETParser.parse(self, region: region, options: nil) + } + + public func toRSSDate(alt: Bool, region: Region = Region.ISO) -> DateInRegion? { + switch alt { + case true: return StringToDateStyles.altRSS.toDate(self, region: region) + case false: return StringToDateStyles.rss.toDate(self, region: region) + } + } + + public func toSQLDate(region: Region = Region.ISO) -> DateInRegion? { + return StringToDateStyles.sql.toDate(self, region: region) + } + +} diff --git a/Sources/App/Libraries/SwiftDate/Foundation+Extras/TimeInterval+Formatter.swift b/Sources/App/Libraries/SwiftDate/Foundation+Extras/TimeInterval+Formatter.swift new file mode 100644 index 0000000..c2408ef --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Foundation+Extras/TimeInterval+Formatter.swift @@ -0,0 +1,168 @@ +// +// SwiftDate +// Parse, validate, manipulate, and display dates, time and timezones in Swift +// +// Created by Daniele Margutti +// - Web: https://www.danielemargutti.com +// - Twitter: https://twitter.com/danielemargutti +// - Mail: hello@danielemargutti.com +// +// Copyright © 2019 Daniele Margutti. Licensed under MIT License. +// + +import Foundation + +public extension TimeInterval { + + struct ComponentsFormatterOptions { + + /// Fractional units may be used when a value cannot be exactly represented using the available units. + /// For example, if minutes are not allowed, the value “1h 30m” could be formatted as “1.5h”. + public var allowsFractionalUnits: Bool? + + /// Specify the units that can be used in the output. + public var allowedUnits: NSCalendar.Unit? + + /// A Boolean value indicating whether to collapse the largest unit into smaller units when a certain threshold is met. + public var collapsesLargestUnit: Bool? + + /// The maximum number of time units to include in the output string. + /// If 0 does not cause the elimination of any units. + public var maximumUnitCount: Int? + + /// The formatting style for units whose value is 0. + public var zeroFormattingBehavior: DateComponentsFormatter.ZeroFormattingBehavior? + + /// The preferred style for units. + public var unitsStyle: DateComponentsFormatter.UnitsStyle? + + /// Locale of the formatter + public var locale: LocaleConvertible? { + set { calendar.locale = newValue?.toLocale() } + get { return calendar.locale } + } + + /// Calendar + public var calendar = Calendar.autoupdatingCurrent + + public func apply(toFormatter formatter: DateComponentsFormatter) { + formatter.calendar = calendar + + if let allowsFractionalUnits = self.allowsFractionalUnits { + formatter.allowsFractionalUnits = allowsFractionalUnits + } + if let allowedUnits = self.allowedUnits { + formatter.allowedUnits = allowedUnits + } + if let collapsesLargestUnit = self.collapsesLargestUnit { + formatter.collapsesLargestUnit = collapsesLargestUnit + } + if let maximumUnitCount = self.maximumUnitCount { + formatter.maximumUnitCount = maximumUnitCount + } + if let zeroFormattingBehavior = self.zeroFormattingBehavior { + formatter.zeroFormattingBehavior = zeroFormattingBehavior + } + if let unitsStyle = self.unitsStyle { + formatter.unitsStyle = unitsStyle + } + } + + public init() {} + } + + /// Return the local thread shared formatter for date components + private static func sharedFormatter() -> DateComponentsFormatter { + let name = "SwiftDate_\(NSStringFromClass(DateComponentsFormatter.self))" + return threadSharedObject(key: name, create: { + let formatter = DateComponentsFormatter() + formatter.includesApproximationPhrase = false + formatter.includesTimeRemainingPhrase = false + return formatter + }) + } + + //@available(*, deprecated: 5.0.13, obsoleted: 5.1, message: "Use toIntervalString function instead") + func toString(options callback: ((inout ComponentsFormatterOptions) -> Void)? = nil) -> String { + return self.toIntervalString(options: callback) + } + + /// Format a time interval in a string with desidered components with passed style. + /// + /// - Parameters: + /// - units: units to include in string. + /// - style: style of the units, by default is `.abbreviated` + /// - Returns: string representation + func toIntervalString(options callback: ((inout ComponentsFormatterOptions) -> Void)? = nil) -> String { + let formatter = DateComponentsFormatter() + var options = ComponentsFormatterOptions() + callback?(&options) + options.apply(toFormatter: formatter) + + let formattedValue = formatter.string(from: self)! + if options.zeroFormattingBehavior?.contains(.pad) ?? false { + // for some strange reason padding is not added at the very beginning positional item. + // we'll add it manually if necessaru + if let index = formattedValue.firstIndex(of: ":"), index.utf16Offset(in: formattedValue) < 2 { + return "0\(formattedValue)" + } + } + return formattedValue + } + + /// Format a time interval in a string with desidered components with passed style. + /// + /// - Parameter options: options for formatting. + /// - Returns: string representation + func toString(options: ComponentsFormatterOptions) -> String { + let formatter = TimeInterval.sharedFormatter() + options.apply(toFormatter: formatter) + return (formatter.string(from: self) ?? "") + } + + /// Return a string representation of the time interval in form of clock countdown (ie. 57:00:00) + /// + /// - Parameter zero: behaviour with zero. + /// - Returns: string representation + func toClock(zero: DateComponentsFormatter.ZeroFormattingBehavior = [.pad, .dropLeading]) -> String { + return toIntervalString(options: { + $0.collapsesLargestUnit = true + $0.maximumUnitCount = 0 + $0.unitsStyle = .positional + $0.locale = Locales.englishUnitedStatesComputer + $0.zeroFormattingBehavior = zero + }) + } + + /// Extract requeste time units components from given interval. + /// Reference date's calendar is used to make the extraction. + /// + /// NOTE: + /// Extraction is calendar/date based; if you specify a `refDate` calculation is made + /// between the `refDate` and `refDate + interval`. + /// If `refDate` is `nil` evaluation is made from `now()` and `now() + interval` in the context + /// of the `SwiftDate.defaultRegion` set. + /// + /// - Parameters: + /// - units: units to extract + /// - from: starting reference date, `nil` means `now()` in the context of the default region set. + /// - Returns: dictionary with extracted components + func toUnits(_ units: Set, to refDate: DateInRegion? = nil) -> [Calendar.Component: Int] { + let dateTo = (refDate ?? DateInRegion()) + let dateFrom = dateTo.addingTimeInterval(-self) + let components = dateFrom.calendar.dateComponents(units, from: dateFrom.date, to: dateTo.date) + return components.toDict() + } + + /// Express a time interval (expressed in seconds) in another time unit you choose. + /// Reference date's calendar is used to make the extraction. + /// + /// - parameter component: time unit in which you want to express the calendar component + /// - parameter from: starting reference date, `nil` means `now()` in the context of the default region set. + /// + /// - returns: the value of interval expressed in selected `Calendar.Component` + func toUnit(_ component: Calendar.Component, to refDate: DateInRegion? = nil) -> Int? { + return toUnits([component], to: refDate)[component] + } + +} diff --git a/Sources/App/Libraries/SwiftDate/Supports/AssociatedValues.swift b/Sources/App/Libraries/SwiftDate/Supports/AssociatedValues.swift new file mode 100644 index 0000000..4b671d8 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Supports/AssociatedValues.swift @@ -0,0 +1,74 @@ +// +// SwiftDate +// Parse, validate, manipulate, and display dates, time and timezones in Swift +// +// Created by Daniele Margutti +// - Web: https://www.danielemargutti.com +// - Twitter: https://twitter.com/danielemargutti +// - Mail: hello@danielemargutti.com +// +// Copyright © 2019 Daniele Margutti. Licensed under MIT License. +// + +#if os(Linux) + +#else +import Foundation +import ObjectiveC.runtime + +internal func getAssociatedValue(key: String, object: AnyObject) -> T? { + return (objc_getAssociatedObject(object, key.address) as? AssociatedValue)?.value as? T +} + +internal func getAssociatedValue(key: String, object: AnyObject, initialValue: @autoclosure () -> T) -> T { + return getAssociatedValue(key: key, object: object) ?? setAndReturn(initialValue: initialValue(), key: key, object: object) +} + +internal func getAssociatedValue(key: String, object: AnyObject, initialValue: () -> T) -> T { + return getAssociatedValue(key: key, object: object) ?? setAndReturn(initialValue: initialValue(), key: key, object: object) +} + +private func setAndReturn(initialValue: T, key: String, object: AnyObject) -> T { + set(associatedValue: initialValue, key: key, object: object) + return initialValue +} + +internal func set(associatedValue: T?, key: String, object: AnyObject) { + set(associatedValue: AssociatedValue(associatedValue), key: key, object: object) +} + +internal func set(weakAssociatedValue: T?, key: String, object: AnyObject) { + set(associatedValue: AssociatedValue(weak: weakAssociatedValue), key: key, object: object) +} + +extension String { + + fileprivate var address: UnsafeRawPointer { + return UnsafeRawPointer(bitPattern: abs(hashValue))! + } + +} + +private func set(associatedValue: AssociatedValue, key: String, object: AnyObject) { + objc_setAssociatedObject(object, key.address, associatedValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) +} + +private class AssociatedValue { + + weak var _weakValue: AnyObject? + var _value: Any? + + var value: Any? { + return _weakValue ?? _value + } + + init(_ value: Any?) { + _value = value + } + + init(weak: AnyObject?) { + _weakValue = weak + } + +} +#endif diff --git a/Sources/App/Libraries/SwiftDate/Supports/Calendars.swift b/Sources/App/Libraries/SwiftDate/Supports/Calendars.swift new file mode 100644 index 0000000..9a6b11c --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Supports/Calendars.swift @@ -0,0 +1,96 @@ +// +// SwiftDate +// Parse, validate, manipulate, and display dates, time and timezones in Swift +// +// Created by Daniele Margutti +// - Web: https://www.danielemargutti.com +// - Twitter: https://twitter.com/danielemargutti +// - Mail: hello@danielemargutti.com +// +// Copyright © 2019 Daniele Margutti. Licensed under MIT License. +// + +import Foundation + +public typealias Calendars = Calendar.Identifier + +public protocol CalendarConvertible { + func toCalendar() -> Calendar +} + +extension Calendar: CalendarConvertible { + + public func toCalendar() -> Calendar { + return self + } + + internal static func newCalendar(_ calendar: CalendarConvertible, configure: ((inout Calendar) -> Void)? = nil) -> Calendar { + var cal = calendar.toCalendar() + configure?(&cal) + return cal + } + +} + +extension Calendar.Identifier: CalendarConvertible { + + public func toCalendar() -> Calendar { + return Calendar(identifier: self) + } + +} + +// MARK: - Support for Calendar.Identifier encoding with Codable + +extension Calendar.Identifier: CustomStringConvertible { + + public var description: String { + switch self { + case .gregorian: return "gregorian" + case .buddhist: return "buddhist" + case .chinese: return "chinese" + case .coptic: return "coptic" + case .ethiopicAmeteMihret: return "ethiopicAmeteMihret" + case .ethiopicAmeteAlem: return "ethiopicAmeteAlem" + case .hebrew: return "hebrew" + case .iso8601: return "iso8601" + case .indian: return "indian" + case .islamic: return "islamic" + case .islamicCivil: return "islamicCivil" + case .japanese: return "japanese" + case .persian: return "persian" + case .republicOfChina: return "republicOfChina" + case .islamicTabular: return "islamicTabular" + case .islamicUmmAlQura: return "islamicUmmAlQura" + @unknown default: + fatalError("Unsupported calendar \(self)") + } + } + + public init(_ rawValue: String) { + switch rawValue { + case Calendar.Identifier.gregorian.description: self = .gregorian + case Calendar.Identifier.buddhist.description: self = .buddhist + case Calendar.Identifier.chinese.description: self = .chinese + case Calendar.Identifier.coptic.description: self = .coptic + case Calendar.Identifier.ethiopicAmeteMihret.description: self = .ethiopicAmeteMihret + case Calendar.Identifier.ethiopicAmeteAlem.description: self = .ethiopicAmeteAlem + case Calendar.Identifier.hebrew.description: self = .hebrew + case Calendar.Identifier.iso8601.description: self = .iso8601 + case Calendar.Identifier.indian.description: self = .indian + case Calendar.Identifier.islamic.description: self = .islamic + case Calendar.Identifier.islamicCivil.description: self = .islamicCivil + case Calendar.Identifier.japanese.description: self = .japanese + case Calendar.Identifier.persian.description: self = .persian + case Calendar.Identifier.republicOfChina.description: self = .republicOfChina + case Calendar.Identifier.islamicTabular.description: self = .islamicTabular + case Calendar.Identifier.islamicTabular.description: self = .islamicTabular + case Calendar.Identifier.islamicUmmAlQura.description: self = .islamicUmmAlQura + default: + let defaultCalendar = SwiftDate.defaultRegion.calendar.identifier + debugPrint("Calendar Identifier '\(rawValue)' not recognized. Using default (\(defaultCalendar))") + self = defaultCalendar + } + } + +} diff --git a/Sources/App/Libraries/SwiftDate/Supports/Commons.swift b/Sources/App/Libraries/SwiftDate/Supports/Commons.swift new file mode 100644 index 0000000..a805c95 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Supports/Commons.swift @@ -0,0 +1,286 @@ +// +// SwiftDate +// Parse, validate, manipulate, and display dates, time and timezones in Swift +// +// Created by Daniele Margutti +// - Web: https://www.danielemargutti.com +// - Twitter: https://twitter.com/danielemargutti +// - Mail: hello@danielemargutti.com +// +// Copyright © 2019 Daniele Margutti. Licensed under MIT License. +// + +import Foundation + +public extension DateFormatter { + + /// Return the local thread shared formatter initialized with the configuration of the region passed. + /// + /// - Parameters: + /// - region: region used to pre-configure the cell. + /// - format: optional format used to set the `dateFormat` property. + /// - Returns: date formatter instance + static func sharedFormatter(forRegion region: Region?, format: String? = nil) -> DateFormatter { + let name = "SwiftDate_\(NSStringFromClass(DateFormatter.self))" + let formatter: DateFormatter = threadSharedObject(key: name, create: { return DateFormatter() }) + if let region = region { + formatter.timeZone = region.timeZone + formatter.calendar = region.calendar + formatter.locale = region.locale + } + formatter.dateFormat = (format ?? DateFormats.iso8601) + return formatter + } + + /// Returned number formatter instance shared along calling thread to format ordinal numbers. + /// + /// - Parameter locale: locale to set + /// - Returns: number formatter instance + @available(iOS 9.0, macOS 10.11, *) + static func sharedOrdinalNumberFormatter(locale: LocaleConvertible) -> NumberFormatter { + var formatter: NumberFormatter? + let name = "SwiftDate_\(NSStringFromClass(NumberFormatter.self))" + formatter = threadSharedObject(key: name, create: { return NumberFormatter() }) + formatter!.numberStyle = .ordinal + formatter!.locale = locale.toLocale() + return formatter! + } + +} + +/// This function create (if necessary) and return a thread singleton instance of the +/// object you want. +/// +/// - Parameters: +/// - key: identifier of the object. +/// - create: create routine used the first time you are about to create the object in thread. +/// - Returns: instance of the object for caller's thread. +internal func threadSharedObject(key: String, create: () -> T) -> T { + if let cachedObj = Thread.current.threadDictionary[key] as? T { + return cachedObj + } else { + let newObject = create() + Thread.current.threadDictionary[key] = newObject + return newObject + } +} + +/// Style used to format month, weekday, quarter symbols. +/// Stand-alone properties are for use in places like calendar headers. +/// Non-stand-alone properties are for use in context (for example, “Saturday, November 12th”). +/// +/// - `default`: Default formatter (ie. `4th quarter` for quarter, `April` for months and `Wednesday` for weekdays) +/// - defaultStandalone: See `default`; See `short`; stand-alone properties are for use in places like calendar headers. +/// - short: Short symbols (ie. `Jun` for months, `Fri` for weekdays, `Q1` for quarters). +/// - veryShort: Very short symbols (ie. `J` for months, `F` for weekdays, for quarter it just return `short` variant). +/// - standaloneShort: See `short`; stand-alone properties are for use in places like calendar headers. +/// - standaloneVeryShort: See `veryShort`; stand-alone properties are for use in places like calendar headers. +public enum SymbolFormatStyle { + case `default` + case defaultStandalone + case short + case veryShort + case standaloneShort + case standaloneVeryShort +} + +/// Encapsulate the logic to use date format strings +public struct DateFormats { + + /// This is the built-in list of all supported formats for auto-parsing of a string to a date. + internal static let builtInAutoFormat: [String] = [ + DateFormats.iso8601, + "yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'", + "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'SSS'Z'", + "yyyy-MM-dd'T'HH:mm:ss.SSSZ", + "yyyy-MM-dd HH:mm:ss", + "yyyy-MM-dd HH:mm", + "yyyy-MM-dd", + "h:mm:ss A", + "h:mm A", + "MM/dd/yyyy", + "MMMM d, yyyy", + "MMMM d, yyyy LT", + "dddd, MMMM D, yyyy LT", + "yyyyyy-MM-dd", + "yyyy-MM-dd", + "yyyy-'W'ww-E", + "GGGG-'['W']'ww-E", + "yyyy-'W'ww", + "GGGG-'['W']'ww", + "yyyy'W'ww", + "yyyy-ddd", + "HH:mm:ss.SSSS", + "HH:mm:ss", + "HH:mm", + "HH" + ] + + /// This is the ordered list of all formats SwiftDate can use in order to attempt parsing a passaed + /// date expressed as string. Evaluation is made in order; you can add or remove new formats as you wish. + /// In order to reset the list call `resetAutoFormats()` function. + public static var autoFormats: [String] = DateFormats.builtInAutoFormat + + /// Default ISO8601 format string + public static let iso8601: String = "yyyy-MM-dd'T'HH:mm:ssZZZZZ" + + /// Extended format + public static let extended: String = "eee dd-MMM-yyyy GG HH:mm:ss.SSS zzz" + + /// The Alternative RSS formatted date "d MMM yyyy HH:mm:ss ZZZ" i.e. "09 Sep 2011 15:26:08 +0200" + public static let altRSS: String = "d MMM yyyy HH:mm:ss ZZZ" + + /// The RSS formatted date "EEE, d MMM yyyy HH:mm:ss ZZZ" i.e. "Fri, 09 Sep 2011 15:26:08 +0200" + public static let rss: String = "EEE, d MMM yyyy HH:mm:ss ZZZ" + + /// The http header formatted date "EEE, dd MMM yyyy HH:mm:ss zzz" i.e. "Tue, 15 Nov 1994 12:45:26 GMT" + public static let httpHeader: String = "EEE, dd MMM yyyy HH:mm:ss zzz" + + /// A generic standard format date i.e. "EEE MMM dd HH:mm:ss Z yyyy" + public static let standard: String = "EEE MMM dd HH:mm:ss Z yyyy" + + /// SQL date format + public static let sql: String = "yyyy-MM-dd'T'HH:mm:ss.SSSX" + + /// Reset the list of auto formats to the initial settings. + public static func resetAutoFormats() { + autoFormats = DateFormats.builtInAutoFormat + } + + /// Parse a new string optionally passing the format in which is encoded. If no format is passed + /// an attempt is made by cycling all the formats set in `autoFormats` property. + /// + /// - Parameters: + /// - string: date expressed as string. + /// - suggestedFormat: optional format of the date expressed by the string (set it if you can in order to optimize the parse task). + /// - region: region in which the date is expressed. + /// - Returns: parsed absolute `Date`, `nil` if parse fails. + public static func parse(string: String, format: String?, region: Region) -> Date? { + let formats = (format != nil ? [format!] : DateFormats.autoFormats) + return DateFormats.parse(string: string, formats: formats, region: region) + } + + public static func parse(string: String, formats: [String], region: Region) -> Date? { + let formatter = DateFormatter.sharedFormatter(forRegion: region) + + var parsedDate: Date? + for format in formats { + formatter.dateFormat = format + formatter.locale = region.locale + if let date = formatter.date(from: string) { + parsedDate = date + break + } + } + return parsedDate + } +} + +// MARK: - Calendar Extension + +public extension Calendar.Component { + + internal static func toSet(_ src: [Calendar.Component]) -> Set { + var l: Set = [] + src.forEach { l.insert($0) } + return l + } + + internal var nsCalendarUnit: NSCalendar.Unit { + switch self { + case .era: return NSCalendar.Unit.era + case .year: return NSCalendar.Unit.year + case .month: return NSCalendar.Unit.month + case .day: return NSCalendar.Unit.day + case .hour: return NSCalendar.Unit.hour + case .minute: return NSCalendar.Unit.minute + case .second: return NSCalendar.Unit.second + case .weekday: return NSCalendar.Unit.weekday + case .weekdayOrdinal: return NSCalendar.Unit.weekdayOrdinal + case .quarter: return NSCalendar.Unit.quarter + case .weekOfMonth: return NSCalendar.Unit.weekOfMonth + case .weekOfYear: return NSCalendar.Unit.weekOfYear + case .yearForWeekOfYear: return NSCalendar.Unit.yearForWeekOfYear + case .nanosecond: return NSCalendar.Unit.nanosecond + case .calendar: return NSCalendar.Unit.calendar + case .timeZone: return NSCalendar.Unit.timeZone + @unknown default: + fatalError("Unsupported type \(self)") + } + } +} + +/// Rounding mode for dates. +/// Round off/up (ceil) or down (floor) target date. +public enum RoundDateMode { + case to5Mins + case to10Mins + case to30Mins + case toMins(_: Int) + case toCeil5Mins + case toCeil10Mins + case toCeil30Mins + case toCeilMins(_: Int) + case toFloor5Mins + case toFloor10Mins + case toFloor30Mins + case toFloorMins(_: Int) +} + +/// Related type enum to get derivated date from a receiver date. +public enum DateRelatedType { + case startOfDay + case endOfDay + case startOfWeek + case endOfWeek + case startOfMonth + case endOfMonth + case tomorrow + case tomorrowAtStart + case yesterday + case yesterdayAtStart + case nearestMinute(minute:Int) + case nearestHour(hour:Int) + case nextWeekday(_: WeekDay) + case nextDSTDate + case prevMonth + case nextMonth + case prevWeek + case nextWeek + case nextYear + case prevYear + case nextDSTTransition +} + +public struct TimeCalculationOptions { + + /// Specifies the technique the search algorithm uses to find result + public var matchingPolicy: Calendar.MatchingPolicy + + /// Specifies the behavior when multiple matches are found + public var repeatedTimePolicy: Calendar.RepeatedTimePolicy + + /// Specifies the direction in time to search + public var direction: Calendar.SearchDirection + + public init(matching: Calendar.MatchingPolicy = .nextTime, + timePolicy: Calendar.RepeatedTimePolicy = .first, + direction: Calendar.SearchDirection = .forward) { + self.matchingPolicy = matching + self.repeatedTimePolicy = timePolicy + self.direction = direction + } +} + +// MARK: - compactMap for Swift 4.0 (not necessary > 4.0) + +#if swift(>=4.1) +#else + extension Collection { + func compactMap( + _ transform: (Element) throws -> ElementOfResult? + ) rethrows -> [ElementOfResult] { + return try flatMap(transform) + } + } +#endif diff --git a/Sources/App/Libraries/SwiftDate/Supports/Locales.swift b/Sources/App/Libraries/SwiftDate/Supports/Locales.swift new file mode 100644 index 0000000..d4caab3 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Supports/Locales.swift @@ -0,0 +1,757 @@ +// +// SwiftDate +// Parse, validate, manipulate, and display dates, time and timezones in Swift +// +// Created by Daniele Margutti +// - Web: https://www.danielemargutti.com +// - Twitter: https://twitter.com/danielemargutti +// - Mail: hello@danielemargutti.com +// +// Copyright © 2019 Daniele Margutti. Licensed under MIT License. +// + +// swiftlint:disable file_length + +import Foundation + +public protocol LocaleConvertible { + func toLocale() -> Locale +} + +extension Locale: LocaleConvertible { + public func toLocale() -> Locale { + return self + } +} + +// swiftlint:disable type_body_length +public enum Locales: String, LocaleConvertible { + + case current = "current" + case autoUpdating = "currentAutoUpdating" + + case afrikaans = "af" + case afrikaansNamibia = "af_NA" + case afrikaansSouthAfrica = "af_ZA" + case aghem = "agq" + case aghemCameroon = "agq_CM" + case akan = "ak" + case akanGhana = "ak_GH" + case albanian = "sq" + case albanianAlbania = "sq_AL" + case albanianKosovo = "sq_XK" + case albanianMacedonia = "sq_MK" + case amharic = "am" + case amharicEthiopia = "am_ET" + case arabic = "ar" + case arabicAlgeria = "ar_DZ" + case arabicBahrain = "ar_BH" + case arabicChad = "ar_TD" + case arabicComoros = "ar_KM" + case arabicDjibouti = "ar_DJ" + case arabicEgypt = "ar_EG" + case arabicEritrea = "ar_ER" + case arabicIraq = "ar_IQ" + case arabicIsrael = "ar_IL" + case arabicJordan = "ar_JO" + case arabicKuwait = "ar_KW" + case arabicLebanon = "ar_LB" + case arabicLibya = "ar_LY" + case arabicMauritania = "ar_MR" + case arabicMorocco = "ar_MA" + case arabicOman = "ar_OM" + case arabicPalestinianTerritories = "ar_PS" + case arabicQatar = "ar_QA" + case arabicSaudiArabia = "ar_SA" + case arabicSomalia = "ar_SO" + case arabicSouthSudan = "ar_SS" + case arabicSudan = "ar_SD" + case arabicSyria = "ar_SY" + case arabicTunisia = "ar_TN" + case arabicUnitedArabEmirates = "ar_AE" + case arabicWesternSahara = "ar_EH" + case arabicWorld = "ar_001" + case arabicYemen = "ar_YE" + case armenian = "hy" + case armenianArmenia = "hy_AM" + case assamese = "as" + case assameseIndia = "as_IN" + case asu = "asa" + case asuTanzania = "asa_TZ" + case azerbaijani = "az_Latn" + case azerbaijaniAzerbaijan = "az_Latn_AZ" + case azerbaijaniCyrillic = "az_Cyrl" + case azerbaijaniCyrillicAzerbaijan = "az_Cyrl_AZ" + case bafia = "ksf" + case bafiaCameroon = "ksf_CM" + case bambara = "bm_Latn" + case bambaraMali = "bm_Latn_ML" + case basaa = "bas" + case basaaCameroon = "bas_CM" + case basque = "eu" + case basqueSpain = "eu_ES" + case belarusian = "be" + case belarusianBelarus = "be_BY" + case bemba = "bem" + case bembaZambia = "bem_ZM" + case bena = "bez" + case benaTanzania = "bez_TZ" + case bengali = "bn" + case bengaliBangladesh = "bn_BD" + case engaliIndia = "bn_IN" + case bodo = "brx" + case bodoIndia = "brx_IN" + case bosnian = "bs_Latn" + case bosnianBosniaHerzegovina = "bs_Latn_BA" + case bosnianCyrillic = "bs_Cyrl" + case bosnianCyrillicBosniaHerzegovina = "bs_Cyrl_BA" + case breton = "br" + case bretonFrance = "br_FR" + case bulgarian = "bg" + case bulgarianBulgaria = "bg_BG" + case burmese = "my" + case burmeseMyanmarBurma = "my_MM" + case catalan = "ca" + case catalanAndorra = "ca_AD" + case catalanFrance = "ca_FR" + case catalanItaly = "ca_IT" + case catalanSpain = "ca_ES" + case centralAtlasTamazight = "tzm_Latn" + case centralAtlasTamazightMorocco = "tzm_Latn_MA" + case centralKurdish = "ckb" + case centralKurdishIran = "ckb_IR" + case centralKurdishIraq = "ckb_IQ" + case cherokee = "chr" + case cherokeeUnitedStates = "chr_US" + case chiga = "cgg" + case chigaUganda = "cgg_UG" + case chinese = "zh" + case chineseChina = "zh_Hans_CN" + case chineseHongKongSarChina = "zh_Hant_HK" + case chineseMacauSarChina = "zh_Hant_MO" + case chineseSimplified = "zh_Hans" + case chineseSimplifiedHongKongSarChina = "zh_Hans_HK" + case chineseSimplifiedMacauSarChina = "zh_Hans_MO" + case chineseSingapore = "zh_Hans_SG" + case chineseTaiwan = "zh_Hant_TW" + case chineseTraditional = "zh_Hant" + case colognian = "ksh" + case colognianGermany = "ksh_DE" + case cornish = "kw" + case cornishUnitedKingdom = "kw_GB" + case croatian = "hr" + case croatianBosniaHerzegovina = "hr_BA" + case croatianCroatia = "hr_HR" + case czech = "cs" + case czechCzechRepublic = "cs_CZ" + case danish = "da" + case danishDenmark = "da_DK" + case danishGreenland = "da_GL" + case duala = "dua" + case dualaCameroon = "dua_CM" + case dutch = "nl" + case dutchAruba = "nl_AW" + case dutchBelgium = "nl_BE" + case dutchCaribbeanNetherlands = "nl_BQ" + case dutchCuraao = "nl_CW" + case dutchNetherlands = "nl_NL" + case dutchSintMaarten = "nl_SX" + case dutchSuriname = "nl_SR" + case dzongkha = "dz" + case dzongkhaBhutan = "dz_BT" + case embu = "ebu" + case embuKenya = "ebu_KE" + case english = "en" + case englishAlbania = "en_AL" + case englishAmericanSamoa = "en_AS" + case englishAndorra = "en_AD" + case englishAnguilla = "en_AI" + case englishAntiguaBarbuda = "en_AG" + case englishAustralia = "en_AU" + case englishAustria = "en_AT" + case englishBahamas = "en_BS" + case englishBarbados = "en_BB" + case englishBelgium = "en_BE" + case englishBelize = "en_BZ" + case englishBermuda = "en_BM" + case englishBosniaHerzegovina = "en_BA" + case englishBotswana = "en_BW" + case englishBritishIndianOceanTerritory = "en_IO" + case englishBritishVirginIslands = "en_VG" + case englishCameroon = "en_CM" + case englishCanada = "en_CA" + case englishCaymanIslands = "en_KY" + case englishChristmasIsland = "en_CX" + case englishCocosKeelingIslands = "en_CC" + case englishCookIslands = "en_CK" + case englishCroatia = "en_HR" + case englishCyprus = "en_CY" + case englishCzechRepublic = "en_CZ" + case englishDenmark = "en_DK" + case englishDiegoGarcia = "en_DG" + case englishDominica = "en_DM" + case englishEritrea = "en_ER" + case englishEstonia = "en_EE" + case englishEurope = "en_150" + case englishFalklandIslands = "en_FK" + case englishFiji = "en_FJ" + case englishFinland = "en_FI" + case englishFrance = "en_FR" + case englishGambia = "en_GM" + case englishGermany = "en_DE" + case englishGhana = "en_GH" + case englishGibraltar = "en_GI" + case englishGreece = "en_GR" + case englishGrenada = "en_GD" + case englishGuam = "en_GU" + case englishGuernsey = "en_GG" + case englishGuyana = "en_GY" + case englishHongKongSarChina = "en_HK" + case englishHungary = "en_HU" + case englishIceland = "en_IS" + case englishIndia = "en_IN" + case englishIreland = "en_IE" + case englishIsleOfMan = "en_IM" + case englishIsrael = "en_IL" + case englishItaly = "en_IT" + case englishJamaica = "en_JM" + case englishJersey = "en_JE" + case englishKenya = "en_KE" + case englishKiribati = "en_KI" + case englishLatvia = "en_LV" + case englishLesotho = "en_LS" + case englishLiberia = "en_LR" + case englishLithuania = "en_LT" + case englishLuxembourg = "en_LU" + case englishMacauSarChina = "en_MO" + case englishMadagascar = "en_MG" + case englishMalawi = "en_MW" + case englishMalaysia = "en_MY" + case englishMalta = "en_MT" + case englishMarshallIslands = "en_MH" + case englishMauritius = "en_MU" + case englishMicronesia = "en_FM" + case englishMontenegro = "en_ME" + case englishMontserrat = "en_MS" + case englishNamibia = "en_NA" + case englishNauru = "en_NR" + case englishNetherlands = "en_NL" + case englishNewZealand = "en_NZ" + case englishNigeria = "en_NG" + case englishNiue = "en_NU" + case englishNorfolkIsland = "en_NF" + case englishNorthernMarianaIslands = "en_MP" + case englishNorway = "en_NO" + case englishPakistan = "en_PK" + case englishPalau = "en_PW" + case englishPapuaNewGuinea = "en_PG" + case englishPhilippines = "en_PH" + case englishPitcairnIslands = "en_PN" + case englishPoland = "en_PL" + case englishPortugal = "en_PT" + case englishPuertoRico = "en_PR" + case englishRomania = "en_RO" + case englishRussia = "en_RU" + case englishRwanda = "en_RW" + case englishSamoa = "en_WS" + case englishSeychelles = "en_SC" + case englishSierraLeone = "en_SL" + case englishSingapore = "en_SG" + case englishSintMaarten = "en_SX" + case englishSlovakia = "en_SK" + case englishSlovenia = "en_SI" + case englishSolomonIslands = "en_SB" + case englishSouthAfrica = "en_ZA" + case englishSouthSudan = "en_SS" + case englishSpain = "en_ES" + case englishStHelena = "en_SH" + case englishStKittsNevis = "en_KN" + case englishStLucia = "en_LC" + case englishStVincentGrenadines = "en_VC" + case englishSudan = "en_SD" + case englishSwaziland = "en_SZ" + case englishSweden = "en_SE" + case englishSwitzerland = "en_CH" + case englishTanzania = "en_TZ" + case englishTokelau = "en_TK" + case englishTonga = "en_TO" + case englishTrinidadTobago = "en_TT" + case englishTurkey = "en_TR" + case englishTurksCaicosIslands = "en_TC" + case englishTuvalu = "en_TV" + case englishUSOutlyingIslands = "en_UM" + case englishUSVirginIslands = "en_VI" + case englishUganda = "en_UG" + case englishUnitedKingdom = "en_GB" + case englishUnitedStates = "en_US" + case englishUnitedStatesComputer = "en_US_POSIX" + case englishVanuatu = "en_VU" + case englishWorld = "en_001" + case englishZambia = "en_ZM" + case englishZimbabwe = "en_ZW" + case esperanto = "eo" + case estonian = "et" + case estonianEstonia = "et_EE" + case ewe = "ee" + case eweGhana = "ee_GH" + case eweTogo = "ee_TG" + case ewondo = "ewo" + case ewondoCameroon = "ewo_CM" + case faroese = "fo" + case faroeseFaroeIslands = "fo_FO" + case filipino = "fil" + case filipinoPhilippines = "fil_PH" + case finnish = "fi" + case finnishFinland = "fi_FI" + case french = "fr" + case frenchAlgeria = "fr_DZ" + case frenchBelgium = "fr_BE" + case frenchBenin = "fr_BJ" + case frenchBurkinaFaso = "fr_BF" + case frenchBurundi = "fr_BI" + case frenchCameroon = "fr_CM" + case frenchCanada = "fr_CA" + case frenchCentralAfricanRepublic = "fr_CF" + case frenchChad = "fr_TD" + case frenchComoros = "fr_KM" + case frenchCongoBrazzaville = "fr_CG" + case frenchCongoKinshasa = "fr_CD" + case frenchCteDivoire = "fr_CI" + case frenchDjibouti = "fr_DJ" + case frenchEquatorialGuinea = "fr_GQ" + case frenchFrance = "fr_FR" + case frenchFrenchGuiana = "fr_GF" + case frenchFrenchPolynesia = "fr_PF" + case frenchGabon = "fr_GA" + case frenchGuadeloupe = "fr_GP" + case frenchGuinea = "fr_GN" + case frenchHaiti = "fr_HT" + case frenchLuxembourg = "fr_LU" + case frenchMadagascar = "fr_MG" + case frenchMali = "fr_ML" + case frenchMartinique = "fr_MQ" + case frenchMauritania = "fr_MR" + case frenchMauritius = "fr_MU" + case frenchMayotte = "fr_YT" + case frenchMonaco = "fr_MC" + case frenchMorocco = "fr_MA" + case frenchNewCaledonia = "fr_NC" + case frenchNiger = "fr_NE" + case frenchRunion = "fr_RE" + case frenchRwanda = "fr_RW" + case frenchSenegal = "fr_SN" + case frenchSeychelles = "fr_SC" + case frenchStBarthlemy = "fr_BL" + case frenchStMartin = "fr_MF" + case frenchStPierreMiquelon = "fr_PM" + case frenchSwitzerland = "fr_CH" + case frenchSyria = "fr_SY" + case frenchTogo = "fr_TG" + case frenchTunisia = "fr_TN" + case frenchVanuatu = "fr_VU" + case frenchWallisFutuna = "fr_WF" + case friulian = "fur" + case friulianItaly = "fur_IT" + case fulah = "ff" + case fulahCameroon = "ff_CM" + case fulahGuinea = "ff_GN" + case fulahMauritania = "ff_MR" + case fulahSenegal = "ff_SN" + case galician = "gl" + case galicianSpain = "gl_ES" + case ganda = "lg" + case gandaUganda = "lg_UG" + case georgian = "ka" + case georgianGeorgia = "ka_GE" + case german = "de" + case germanAustria = "de_AT" + case germanBelgium = "de_BE" + case germanGermany = "de_DE" + case germanLiechtenstein = "de_LI" + case germanLuxembourg = "de_LU" + case germanSwitzerland = "de_CH" + case greek = "el" + case greekCyprus = "el_CY" + case greekGreece = "el_GR" + case gujarati = "gu" + case gujaratiIndia = "gu_IN" + case gusii = "guz" + case gusiiKenya = "guz_KE" + case hausa = "ha_Latn" + case hausaGhana = "ha_Latn_GH" + case hausaNiger = "ha_Latn_NE" + case hausaNigeria = "ha_Latn_NG" + case hawaiian = "haw" + case hawaiianUnitedStates = "haw_US" + case hebrew = "he" + case hebrewIsrael = "he_IL" + case hindi = "hi" + case hindiIndia = "hi_IN" + case hungarian = "hu" + case hungarianHungary = "hu_HU" + case icelandic = "is" + case icelandicIceland = "is_IS" + case igbo = "ig" + case igboNigeria = "ig_NG" + case inariSami = "smn" + case inariSamiFinland = "smn_FI" + case indonesian = "id" + case indonesianIndonesia = "id_ID" + case inuktitut = "iu" + case inuktitutUnifiedCanadianAboriginalSyllabics = "iu_Cans" + case inuktitutUnifiedCanadianAboriginalSyllabicsCanada = "iu_Cans_CA" + case irish = "ga" + case irishIreland = "ga_IE" + case italian = "it" + case italianItaly = "it_IT" + case italianSanMarino = "it_SM" + case italianSwitzerland = "it_CH" + case japanese = "ja" + case japaneseJapan = "ja_JP" + case jolaFonyi = "dyo" + case jolaFonyiSenegal = "dyo_SN" + case kabuverdianu = "kea" + case kabuverdianuCapeVerde = "kea_CV" + case kabyle = "kab" + case kabyleAlgeria = "kab_DZ" + case kako = "kkj" + case kakoCameroon = "kkj_CM" + case kalaallisut = "kl" + case kalaallisutGreenland = "kl_GL" + case kalenjin = "kln" + case kalenjinKenya = "kln_KE" + case kamba = "kam" + case kambaKenya = "kam_KE" + case kannada = "kn" + case kannadaIndia = "kn_IN" + case kashmiri = "ks" + case kashmiriArabic = "ks_Arab" + case kashmiriArabicIndia = "ks_Arab_IN" + case kazakh = "kk_Cyrl" + case kazakhKazakhstan = "kk_Cyrl_KZ" + case khmer = "km" + case khmerCambodia = "km_KH" + case kikuyu = "ki" + case kikuyuKenya = "ki_KE" + case kinyarwanda = "rw" + case kinyarwandaRwanda = "rw_RW" + case konkani = "kok" + case konkaniIndia = "kok_IN" + case korean = "ko" + case koreanNorthKorea = "ko_KP" + case koreanSouthKorea = "ko_KR" + case koyraChiini = "khq" + case koyraChiiniMali = "khq_ML" + case koyraboroSenni = "ses" + case koyraboroSenniMali = "ses_ML" + case kwasio = "nmg" + case kwasioCameroon = "nmg_CM" + case kyrgyz = "ky_Cyrl" + case kyrgyzKyrgyzstan = "ky_Cyrl_KG" + case lakota = "lkt" + case lakotaUnitedStates = "lkt_US" + case langi = "lag" + case langiTanzania = "lag_TZ" + case lao = "lo" + case laoLaos = "lo_LA" + case latvian = "lv" + case latvianLatvia = "lv_LV" + case lingala = "ln" + case lingalaAngola = "ln_AO" + case lingalaCentralAfricanRepublic = "ln_CF" + case lingalaCongoBrazzaville = "ln_CG" + case lingalaCongoKinshasa = "ln_CD" + case lithuanian = "lt" + case lithuanianLithuania = "lt_LT" + case lowerSorbian = "dsb" + case lowerSorbianGermany = "dsb_DE" + case lubaKatanga = "lu" + case lubaKatangaCongoKinshasa = "lu_CD" + case luo = "luo" + case luoKenya = "luo_KE" + case luxembourgish = "lb" + case luxembourgishLuxembourg = "lb_LU" + case luyia = "luy" + case luyiaKenya = "luy_KE" + case macedonian = "mk" + case macedonianMacedonia = "mk_MK" + case machame = "jmc" + case machameTanzania = "jmc_TZ" + case makhuwaMeetto = "mgh" + case makhuwaMeettoMozambique = "mgh_MZ" + case makonde = "kde" + case makondeTanzania = "kde_TZ" + case malagasy = "mg" + case malagasyMadagascar = "mg_MG" + case malay = "ms_Latn" + case malayArabic = "ms_Arab" + case malayArabicBrunei = "ms_Arab_BN" + case malayArabicMalaysia = "ms_Arab_MY" + case malayBrunei = "ms_Latn_BN" + case malayMalaysia = "ms_Latn_MY" + case malaySingapore = "ms_Latn_SG" + case malayalam = "ml" + case malayalamIndia = "ml_IN" + case maltese = "mt" + case malteseMalta = "mt_MT" + case manx = "gv" + case manxIsleOfMan = "gv_IM" + case marathi = "mr" + case marathiIndia = "mr_IN" + case masai = "mas" + case masaiKenya = "mas_KE" + case masaiTanzania = "mas_TZ" + case meru = "mer" + case meruKenya = "mer_KE" + case meta = "mgo" + case metaCameroon = "mgo_CM" + case mongolian = "mn_Cyrl" + case mongolianMongolia = "mn_Cyrl_MN" + case morisyen = "mfe" + case morisyenMauritius = "mfe_MU" + case mundang = "mua" + case mundangCameroon = "mua_CM" + case nama = "naq" + case namaNamibia = "naq_NA" + case nepali = "ne" + case nepaliIndia = "ne_IN" + case nepaliNepal = "ne_NP" + case ngiemboon = "nnh" + case ngiemboonCameroon = "nnh_CM" + case ngomba = "jgo" + case ngombaCameroon = "jgo_CM" + case northNdebele = "nd" + case northNdebeleZimbabwe = "nd_ZW" + case northernSami = "se" + case northernSamiFinland = "se_FI" + case northernSamiNorway = "se_NO" + case northernSamiSweden = "se_SE" + case norwegianBokml = "nb" + case norwegianBokmlNorway = "nb_NO" + case norwegianBokmlSvalbardJanMayen = "nb_SJ" + case norwegianNynorsk = "nn" + case norwegianNynorskNorway = "nn_NO" + case nuer = "nus" + case nuerSudan = "nus_SD" + case nyankole = "nyn" + case nyankoleUganda = "nyn_UG" + case oriya = "or" + case oriyaIndia = "or_IN" + case oromo = "om" + case oromoEthiopia = "om_ET" + case oromoKenya = "om_KE" + case ossetic = "os" + case osseticGeorgia = "os_GE" + case osseticRussia = "os_RU" + case pashto = "ps" + case pashtoAfghanistan = "ps_AF" + case persian = "fa" + case persianAfghanistan = "fa_AF" + case persianIran = "fa_IR" + case polish = "pl" + case polishPoland = "pl_PL" + case portuguese = "pt" + case portugueseAngola = "pt_AO" + case portugueseBrazil = "pt_BR" + case portugueseCapeVerde = "pt_CV" + case portugueseGuineaBissau = "pt_GW" + case portugueseMacauSarChina = "pt_MO" + case portugueseMozambique = "pt_MZ" + case portuguesePortugal = "pt_PT" + case portugueseSoTomPrncipe = "pt_ST" + case portugueseTimorLeste = "pt_TL" + case punjabi = "pa_Guru" + case punjabiArabic = "pa_Arab" + case punjabiArabicPakistan = "pa_Arab_PK" + case punjabiIndia = "pa_Guru_IN" + case quechua = "qu" + case quechuaBolivia = "qu_BO" + case quechuaEcuador = "qu_EC" + case quechuaPeru = "qu_PE" + case romanian = "ro" + case romanianMoldova = "ro_MD" + case romanianRomania = "ro_RO" + case romansh = "rm" + case romanshSwitzerland = "rm_CH" + case rombo = "rof" + case romboTanzania = "rof_TZ" + case rundi = "rn" + case rundiBurundi = "rn_BI" + case russian = "ru" + case russianBelarus = "ru_BY" + case russianKazakhstan = "ru_KZ" + case russianKyrgyzstan = "ru_KG" + case russianMoldova = "ru_MD" + case russianRussia = "ru_RU" + case russianUkraine = "ru_UA" + case rwa = "rwk" + case rwaTanzania = "rwk_TZ" + case sakha = "sah" + case sakhaRussia = "sah_RU" + case samburu = "saq" + case samburuKenya = "saq_KE" + case sango = "sg" + case sangoCentralAfricanRepublic = "sg_CF" + case sangu = "sbp" + case sanguTanzania = "sbp_TZ" + case scottishGaelic = "gd" + case scottishGaelicUnitedKingdom = "gd_GB" + case sena = "seh" + case senaMozambique = "seh_MZ" + case serbian = "sr_Cyrl" + case serbianBosniaHerzegovina = "sr_Cyrl_BA" + case serbianKosovo = "sr_Cyrl_XK" + case serbianLatin = "sr_Latn" + case serbianLatinBosniaHerzegovina = "sr_Latn_BA" + case serbianLatinKosovo = "sr_Latn_XK" + case serbianLatinMontenegro = "sr_Latn_ME" + case serbianLatinSerbia = "sr_Latn_RS" + case serbianMontenegro = "sr_Cyrl_ME" + case serbianSerbia = "sr_Cyrl_RS" + case shambala = "ksb" + case shambalaTanzania = "ksb_TZ" + case shona = "sn" + case shonaZimbabwe = "sn_ZW" + case sichuanYi = "ii" + case sichuanYiChina = "ii_CN" + case sinhala = "si" + case sinhalaSriLanka = "si_LK" + case slovak = "sk" + case slovakSlovakia = "sk_SK" + case slovenian = "sl" + case slovenianSlovenia = "sl_SI" + case soga = "xog" + case sogaUganda = "xog_UG" + case somali = "so" + case somaliDjibouti = "so_DJ" + case somaliEthiopia = "so_ET" + case somaliKenya = "so_KE" + case somaliSomalia = "so_SO" + case spanish = "es" + case spanishArgentina = "es_AR" + case spanishBolivia = "es_BO" + case spanishCanaryIslands = "es_IC" + case spanishCeutaMelilla = "es_EA" + case spanishChile = "es_CL" + case spanishColombia = "es_CO" + case spanishCostaRica = "es_CR" + case spanishCuba = "es_CU" + case spanishDominicanRepublic = "es_DO" + case spanishEcuador = "es_EC" + case spanishElSalvador = "es_SV" + case spanishEquatorialGuinea = "es_GQ" + case spanishGuatemala = "es_GT" + case spanishHonduras = "es_HN" + case spanishLatinAmerica = "es_419" + case spanishMexico = "es_MX" + case spanishNicaragua = "es_NI" + case spanishPanama = "es_PA" + case spanishParaguay = "es_PY" + case spanishPeru = "es_PE" + case spanishPhilippines = "es_PH" + case spanishPuertoRico = "es_PR" + case spanishSpain = "es_ES" + case spanishUnitedStates = "es_US" + case spanishUruguay = "es_UY" + case spanishVenezuela = "es_VE" + case standardMoroccanTamazight = "zgh" + case standardMoroccanTamazightMorocco = "zgh_MA" + case swahili = "sw" + case swahiliCongoKinshasa = "sw_CD" + case swahiliKenya = "sw_KE" + case swahiliTanzania = "sw_TZ" + case swahiliUganda = "sw_UG" + case swedish = "sv" + case swedishlandIslands = "sv_AX" + case swedishFinland = "sv_FI" + case swedishSweden = "sv_SE" + case swissGerman = "gsw" + case swissGermanFrance = "gsw_FR" + case swissGermanLiechtenstein = "gsw_LI" + case swissGermanSwitzerland = "gsw_CH" + case tachelhit = "shi_Latn" + case tachelhitMorocco = "shi_Latn_MA" + case tachelhitTifinagh = "shi_Tfng" + case tachelhitTifinaghMorocco = "shi_Tfng_MA" + case taita = "dav" + case taitaKenya = "dav_KE" + case tajik = "tg_Cyrl" + case tajikTajikistan = "tg_Cyrl_TJ" + case tamil = "ta" + case tamilIndia = "ta_IN" + case tamilMalaysia = "ta_MY" + case tamilSingapore = "ta_SG" + case tamilSriLanka = "ta_LK" + case tasawaq = "twq" + case tasawaqNiger = "twq_NE" + case telugu = "te" + case teluguIndia = "te_IN" + case teso = "teo" + case tesoKenya = "teo_KE" + case tesoUganda = "teo_UG" + case thai = "th" + case thaiThailand = "th_TH" + case tibetan = "bo" + case tibetanChina = "bo_CN" + case tibetanIndia = "bo_IN" + case tigrinya = "ti" + case tigrinyaEritrea = "ti_ER" + case tigrinyaEthiopia = "ti_ET" + case tongan = "to" + case tonganTonga = "to_TO" + case turkish = "tr" + case turkishCyprus = "tr_CY" + case turkishTurkey = "tr_TR" + case turkmen = "tk_Latn" + case turkmenTurkmenistan = "tk_Latn_TM" + case ukrainian = "uk" + case ukrainianUkraine = "uk_UA" + case upperSorbian = "hsb" + case upperSorbianGermany = "hsb_DE" + case urdu = "ur" + case urduIndia = "ur_IN" + case urduPakistan = "ur_PK" + case uyghur = "ug" + case uyghurArabic = "ug_Arab" + case uyghurArabicChina = "ug_Arab_CN" + case uzbek = "uz_Cyrl" + case uzbekArabic = "uz_Arab" + case uzbekArabicAfghanistan = "uz_Arab_AF" + case uzbekLatin = "uz_Latn" + case uzbekLatinUzbekistan = "uz_Latn_UZ" + case uzbekUzbekistan = "uz_Cyrl_UZ" + case vai = "vai_Vaii" + case vaiLatin = "vai_Latn" + case vaiLatinLiberia = "vai_Latn_LR" + case vaiLiberia = "vai_Vaii_LR" + case vietnamese = "vi" + case vietnameseVietnam = "vi_VN" + case vunjo = "vun" + case vunjoTanzania = "vun_TZ" + case walser = "wae" + case walserSwitzerland = "wae_CH" + case welsh = "cy" + case welshUnitedKingdom = "cy_GB" + case westernFrisian = "fy" + case westernFrisianNetherlands = "fy_NL" + case yangben = "yav" + case yangbenCameroon = "yav_CM" + case yiddish = "yi" + case yiddishWorld = "yi_001" + case yoruba = "yo" + case yorubaBenin = "yo_BJ" + case yorubaNigeria = "yo_NG" + case zarma = "dje" + case zarmaNiger = "dje_NE" + case zulu = "zu" + case zuluSouthAfrica = "zu_ZA" + + /// Return a valid `Locale` instance from current selected locale enum + public func toLocale() -> Locale { + switch self { + case .current: return Locale.current + case .autoUpdating: return Locale.autoupdatingCurrent + default: return Locale(identifier: rawValue) + } + } +} diff --git a/Sources/App/Libraries/SwiftDate/Supports/TimeStructures.swift b/Sources/App/Libraries/SwiftDate/Supports/TimeStructures.swift new file mode 100644 index 0000000..448b611 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Supports/TimeStructures.swift @@ -0,0 +1,152 @@ +// +// SwiftDate +// Parse, validate, manipulate, and display dates, time and timezones in Swift +// +// Created by Daniele Margutti +// - Web: https://www.danielemargutti.com +// - Twitter: https://twitter.com/danielemargutti +// - Mail: hello@danielemargutti.com +// +// Copyright © 2019 Daniele Margutti. Licensed under MIT License. +// + +import Foundation + +// MARK: - Weekday + +/// This define the weekdays for some functions. +public enum WeekDay: Int { + case sunday = 1, monday, tuesday, wednesday, thursday, friday, saturday + + /// Returns the name of the day given a specific locale. + /// For example, for the `Friday` enum value, the en_AU locale would return "Friday" and fr_FR would return "samedi" + /// + /// - Parameter locale: locale of the output, omit to use the `defaultRegion`'s locale. + /// - Returns: display name + public func name(style: SymbolFormatStyle = .`default`, locale: LocaleConvertible = SwiftDate.defaultRegion.locale) -> String { + let region = Region(calendar: SwiftDate.defaultRegion.calendar, zone: SwiftDate.defaultRegion.timeZone, locale: locale) + let formatter = DateFormatter.sharedFormatter(forRegion: region, format: nil) + + let idx = (self.rawValue - 1) + switch style { + case .default: return formatter.weekdaySymbols[idx] + case .defaultStandalone: return formatter.standaloneWeekdaySymbols[idx] + case .short: return formatter.shortWeekdaySymbols[idx] + case .standaloneShort: return formatter.shortStandaloneWeekdaySymbols[idx] + case .veryShort: return formatter.veryShortWeekdaySymbols[idx] + case .standaloneVeryShort: return formatter.veryShortStandaloneWeekdaySymbols[idx] + } + } + + /// Adds a number of days to the current weekday and returns the new weekday. + /// + /// - Parameter months: number of months to add + /// - Returns: new month. + public func add(days: Int) -> WeekDay { + let normalized = days % 7 + return WeekDay(rawValue: ((self.rawValue + normalized + 7 - 1) % 7) + 1)! + } + + /// Subtracts a number of days from the current weekday and returns the new weekday. + /// + /// - Parameter months: number of days to subtract. May be negative, in which case it will be added + /// - Returns: new weekday. + public func subtract(days: Int) -> WeekDay { + return add(days: -(days % 7)) + } + +} + +// MARK: - Year + +public struct Year: CustomStringConvertible, Equatable { + let year: Int + + public var description: String { + return "\(self.year)" + } + + /// Constructs a `Year` from the passed value. + /// + /// - Parameter year: year value. Can be negative. + public init(_ year: Int) { + self.year = year + } + + /// Returns whether this year is a leap year + /// + /// - Returns: A boolean indicating whether this year is a leap year + public func isLeap() -> Bool { + return ((year & 3) == 0) && ((year % 100) != 0 || (year % 400) == 0) + } + + /// Returns the number of days in this year + /// + /// - Returns: The number of days in this year + public func numberOfDays() -> Int { + return self.isLeap() ? 366 : 365 + } + +} + +// MARK: - Month + +/// Defines months in a year +public enum Month: Int, CustomStringConvertible, Equatable { + case january = 0, february, march, april, may, june, july, august, september, october, november, december + + public var description: String { + return self.name() + } + + /// Returns the name of the month given a specific locale. + /// For example, for the `January` enum value, the en_AU locale would return "January" and fr_FR would return "janvier" + /// + /// - Parameter locale: locale of the output, omit to use the `defaultRegion`'s locale. + /// - Returns: display name + public func name(style: SymbolFormatStyle = .`default`, locale: LocaleConvertible = SwiftDate.defaultRegion.locale) -> String { + let region = Region(calendar: SwiftDate.defaultRegion.calendar, zone: SwiftDate.defaultRegion.timeZone, locale: locale) + let formatter = DateFormatter.sharedFormatter(forRegion: region, format: nil) + switch style { + case .default: return formatter.monthSymbols[self.rawValue] + case .defaultStandalone: return formatter.standaloneMonthSymbols[self.rawValue] + case .short: return formatter.shortMonthSymbols[self.rawValue] + case .standaloneShort: return formatter.shortStandaloneMonthSymbols[self.rawValue] + case .veryShort: return formatter.veryShortMonthSymbols[self.rawValue] + case .standaloneVeryShort: return formatter.veryShortStandaloneMonthSymbols[self.rawValue] + } + } + + /// Adds a number of months to the current month and returns the new month. + /// + /// - Parameter months: number of months to add + /// - Returns: new month. + public func add(months: Int) -> Month { + let normalized = months % 12 + return Month(rawValue: (self.rawValue + normalized + 12) % 12)! + } + + /// Subtracts a number of months from the current month and returns the new month. + /// + /// - Parameter months: number of months to subtract. May be negative, in which case it will be added + /// - Returns: new month. + public func subtract(months: Int) -> Month { + return add(months: -(months % 12)) + } + + /// Returns the number of days in a this month for a given year + /// + /// - Parameter year: reference year. + /// - Returns: The number of days in this month. + public func numberOfDays(year: Int) -> Int { + switch self { + case .february: + return Year(year).isLeap() ? 29 : 28 + case .april, .june, .september, .november: + return 30 + default: + return 31 + } + } + +} diff --git a/Sources/App/Libraries/SwiftDate/Supports/Zones.swift b/Sources/App/Libraries/SwiftDate/Supports/Zones.swift new file mode 100644 index 0000000..09f18bc --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/Supports/Zones.swift @@ -0,0 +1,465 @@ +// +// SwiftDate +// Parse, validate, manipulate, and display dates, time and timezones in Swift +// +// Created by Daniele Margutti +// - Web: https://www.danielemargutti.com +// - Twitter: https://twitter.com/danielemargutti +// - Mail: hello@danielemargutti.com +// +// Copyright © 2019 Daniele Margutti. Licensed under MIT License. +// + +import Foundation + +public protocol ZoneConvertible { + func toTimezone() -> TimeZone +} + +extension TimeZone: ZoneConvertible { + public func toTimezone() -> TimeZone { + return self + } +} + +// swiftlint:disable type_body_length +public enum Zones: String, ZoneConvertible { + case current = "Current" + case autoUpdating = "CurrentAutoUpdating" + case africaAbidjan = "Africa/Abidjan" + case africaAccra = "Africa/Accra" + case africaAddisAbaba = "Africa/Addis_Ababa" + case africaAlgiers = "Africa/Algiers" + case africaAsmara = "Africa/Asmara" + case africaBamako = "Africa/Bamako" + case africaBangui = "Africa/Bangui" + case africaBanjul = "Africa/Banjul" + case africaBissau = "Africa/Bissau" + case africaBlantyre = "Africa/Blantyre" + case africaBrazzaville = "Africa/Brazzaville" + case africaBujumbura = "Africa/Bujumbura" + case africaCairo = "Africa/Cairo" + case africaCasablanca = "Africa/Casablanca" + case africaCeuta = "Africa/Ceuta" + case africaConakry = "Africa/Conakry" + case africaDakar = "Africa/Dakar" + case africaDarEsSalaam = "Africa/Dar_es_Salaam" + case africaDjibouti = "Africa/Djibouti" + case africaDouala = "Africa/Douala" + case africaElAaiun = "Africa/El_Aaiun" + case africaFreetown = "Africa/Freetown" + case africaGaborone = "Africa/Gaborone" + case africaHarare = "Africa/Harare" + case africaJohannesburg = "Africa/Johannesburg" + case africaJuba = "Africa/Juba" + case africaKampala = "Africa/Kampala" + case africaKhartoum = "Africa/Khartoum" + case fricaKigali = "Africa/Kigali" + case africaKinshasa = "Africa/Kinshasa" + case africaLagos = "Africa/Lagos" + case africaLibreville = "Africa/Libreville" + case africaLome = "Africa/Lome" + case africaLuanda = "Africa/Luanda" + case africaLubumbashi = "Africa/Lubumbashi" + case africaLusaka = "Africa/Lusaka" + case africaMalabo = "Africa/Malabo" + case africaMaputo = "Africa/Maputo" + case africaMaseru = "Africa/Maseru" + case africaMbabane = "Africa/Mbabane" + case africaMogadishu = "Africa/Mogadishu" + case africaMonrovia = "Africa/Monrovia" + case africaNairobi = "Africa/Nairobi" + case africaNdjamena = "Africa/Ndjamena" + case africaNiamey = "Africa/Niamey" + case africaNouakchott = "Africa/Nouakchott" + case africaOuagadougou = "Africa/Ouagadougou" + case africaPortoNovo = "Africa/Porto-Novo" + case africaSaoTome = "Africa/Sao_Tome" + case africaTripoli = "Africa/Tripoli" + case africaTunis = "Africa/Tunis" + case africaWindhoek = "Africa/Windhoek" + case americaAdak = "America/Adak" + case americaAnchorage = "America/Anchorage" + case americaAnguilla = "America/Anguilla" + case americaAntigua = "America/Antigua" + case americaAraguaina = "America/Araguaina" + case americaArgentinaBuenosAires = "America/Argentina/Buenos_Aires" + case americaArgentinaCatamarca = "America/Argentina/Catamarca" + case americaArgentinaCordoba = "America/Argentina/Cordoba" + case americaArgentinaJujuy = "America/Argentina/Jujuy" + case americaArgentinaLaRioja = "America/Argentina/La_Rioja" + case americaArgentinaMendoza = "America/Argentina/Mendoza" + case americaArgentinaRioGallegos = "America/Argentina/Rio_Gallegos" + case americaArgentinaSalta = "America/Argentina/Salta" + case americaArgentinaSanJuan = "America/Argentina/San_Juan" + case americaArgentinaSanLuis = "America/Argentina/San_Luis" + case americaArgentinaTucuman = "America/Argentina/Tucuman" + case americaArgentinaUshuaia = "America/Argentina/Ushuaia" + case americaAruba = "America/Aruba" + case americaAsuncion = "America/Asuncion" + case americaAtikokan = "America/Atikokan" + case americaBahia = "America/Bahia" + case americaBahiaBanderas = "America/Bahia_Banderas" + case americaBarbados = "America/Barbados" + case americaBelem = "America/Belem" + case americaBelize = "America/Belize" + case americaBlancSablon = "America/Blanc-Sablon" + case americaBoaVista = "America/Boa_Vista" + case americaBogota = "America/Bogota" + case americaBoise = "America/Boise" + case americaCambridgeBay = "America/Cambridge_Bay" + case americaCampoGrande = "America/Campo_Grande" + case americaCancun = "America/Cancun" + case americaCaracas = "America/Caracas" + case americaCayenne = "America/Cayenne" + case americaCayman = "America/Cayman" + case americaChicago = "America/Chicago" + case americaChihuahua = "America/Chihuahua" + case americaCostaRica = "America/Costa_Rica" + case americaCreston = "America/Creston" + case americaCuiaba = "America/Cuiaba" + case americaCuracao = "America/Curacao" + case americaDanmarkshavn = "America/Danmarkshavn" + case americaDawson = "America/Dawson" + case americaDawsonCreek = "America/Dawson_Creek" + case americaDenver = "America/Denver" + case americaDetroit = "America/Detroit" + case americaDominica = "America/Dominica" + case americaEdmonton = "America/Edmonton" + case americaEirunepe = "America/Eirunepe" + case americaElSalvador = "America/El_Salvador" + case americaFortNelson = "America/Fort_Nelson" + case americaFortaleza = "America/Fortaleza" + case americaGlaceBay = "America/Glace_Bay" + case americaGodthab = "America/Godthab" + case americaGooseBay = "America/Goose_Bay" + case americaGrandTurk = "America/Grand_Turk" + case americaGrenada = "America/Grenada" + case americaGuadeloupe = "America/Guadeloupe" + case americaGuatemala = "America/Guatemala" + case americaGuayaquil = "America/Guayaquil" + case americaGuyana = "America/Guyana" + case americaHalifax = "America/Halifax" + case americaHavana = "America/Havana" + case americaHermosillo = "America/Hermosillo" + case americaIndianaIndianapolis = "America/Indiana/Indianapolis" + case americaIndianaKnox = "America/Indiana/Knox" + case americaIndianaMarengo = "America/Indiana/Marengo" + case americaIndianaPetersburg = "America/Indiana/Petersburg" + case americaIndianaTellCity = "America/Indiana/Tell_City" + case americaIndianaVevay = "America/Indiana/Vevay" + case americaIndianaVincennes = "America/Indiana/Vincennes" + case americaIndianaWinamac = "America/Indiana/Winamac" + case americaInuvik = "America/Inuvik" + case americaIqaluit = "America/Iqaluit" + case americaJamaica = "America/Jamaica" + case americaJuneau = "America/Juneau" + case americaKentuckyLouisville = "America/Kentucky/Louisville" + case americaKentuckyMonticello = "America/Kentucky/Monticello" + case americaKralendijk = "America/Kralendijk" + case americaLaPaz = "America/La_Paz" + case americaLima = "America/Lima" + case americaLosAngeles = "America/Los_Angeles" + case americaLowerPrinces = "America/Lower_Princes" + case americaMaceio = "America/Maceio" + case americaManagua = "America/Managua" + case americaManaus = "America/Manaus" + case americaMarigot = "America/Marigot" + case americaMartinique = "America/Martinique" + case americaMatamoros = "America/Matamoros" + case americaMazatlan = "America/Mazatlan" + case americaMenominee = "America/Menominee" + case americaMerida = "America/Merida" + case americaMetlakatla = "America/Metlakatla" + case americaMexicoCity = "America/Mexico_City" + case americaMiquelon = "America/Miquelon" + case americaMoncton = "America/Moncton" + case americaMonterrey = "America/Monterrey" + case americaMontevideo = "America/Montevideo" + case americaMontreal = "America/Montreal" + case americaMontserrat = "America/Montserrat" + case americaNassau = "America/Nassau" + case americaNewYork = "America/New_York" + case americaNipigon = "America/Nipigon" + case americaNome = "America/Nome" + case americaNoronha = "America/Noronha" + case americaNorthDakotaBeulah = "America/North_Dakota/Beulah" + case americaNorthDakotaCenter = "America/North_Dakota/Center" + case americaNorthDakotaNewSalem = "America/North_Dakota/New_Salem" + case americaOjinaga = "America/Ojinaga" + case americaPanama = "America/Panama" + case americaPangnirtung = "America/Pangnirtung" + case americaParamaribo = "America/Paramaribo" + case americaPhoenix = "America/Phoenix" + case americaPortAuPrince = "America/Port-au-Prince" + case americaPortOfSpain = "America/Port_of_Spain" + case americaPortoVelho = "America/Porto_Velho" + case americaPuertoRico = "America/Puerto_Rico" + case americaRainyRiver = "America/Rainy_River" + case americaRankinInlet = "America/Rankin_Inlet" + case americaRecife = "America/Recife" + case americaRegina = "America/Regina" + case americaResolute = "America/Resolute" + case americaRioBranco = "America/Rio_Branco" + case americaSantaIsabel = "America/Santa_Isabel" + case americaSantarem = "America/Santarem" + case americaSantiago = "America/Santiago" + case americaSantoDomingo = "America/Santo_Domingo" + case americaSaoPaulo = "America/Sao_Paulo" + case americaScoresbysund = "America/Scoresbysund" + case americaShiprock = "America/Shiprock" + case americaSitka = "America/Sitka" + case americaStBarthelemy = "America/St_Barthelemy" + case americaStJohns = "America/St_Johns" + case americaStKitts = "America/St_Kitts" + case americaStLucia = "America/St_Lucia" + case americaStThomas = "America/St_Thomas" + case americaStVincent = "America/St_Vincent" + case americaSwiftCurrent = "America/Swift_Current" + case americaTegucigalpa = "America/Tegucigalpa" + case americaThule = "America/Thule" + case americaThunderBay = "America/Thunder_Bay" + case americaTijuana = "America/Tijuana" + case americaToronto = "America/Toronto" + case americaTortola = "America/Tortola" + case americaVancouver = "America/Vancouver" + case americaWhitehorse = "America/Whitehorse" + case americaWinnipeg = "America/Winnipeg" + case americaYakutat = "America/Yakutat" + case americaYellowknife = "America/Yellowknife" + case antarcticaCasey = "Antarctica/Casey" + case antarcticaDavis = "Antarctica/Davis" + case antarcticaDumontdurville = "Antarctica/DumontDUrville" + case antarcticaMacquarie = "Antarctica/Macquarie" + case antarcticaMawson = "Antarctica/Mawson" + case antarcticaMcmurdo = "Antarctica/McMurdo" + case antarcticaPalmer = "Antarctica/Palmer" + case antarcticaRothera = "Antarctica/Rothera" + case antarcticaSouthPole = "Antarctica/South_Pole" + case antarcticaSyowa = "Antarctica/Syowa" + case antarcticaTroll = "Antarctica/Troll" + case antarcticaVostok = "Antarctica/Vostok" + case arcticLongyearbyen = "Arctic/Longyearbyen" + case asiaAden = "Asia/Aden" + case asiaAlmaty = "Asia/Almaty" + case asiaAmman = "Asia/Amman" + case asiaAnadyr = "Asia/Anadyr" + case asiaAqtau = "Asia/Aqtau" + case asiaAqtobe = "Asia/Aqtobe" + case asiaAshgabat = "Asia/Ashgabat" + case asiaBaghdad = "Asia/Baghdad" + case asiaBahrain = "Asia/Bahrain" + case asiaBaku = "Asia/Baku" + case asiaBangkok = "Asia/Bangkok" + case asiaBeirut = "Asia/Beirut" + case asiaBishkek = "Asia/Bishkek" + case asiaBrunei = "Asia/Brunei" + case asiaChita = "Asia/Chita" + case asiaChoibalsan = "Asia/Choibalsan" + case asiaChongqing = "Asia/Chongqing" + case asiaColombo = "Asia/Colombo" + case asiaDamascus = "Asia/Damascus" + case asiaDhaka = "Asia/Dhaka" + case asiaDili = "Asia/Dili" + case asiaDubai = "Asia/Dubai" + case asiaDushanbe = "Asia/Dushanbe" + case asiaGaza = "Asia/Gaza" + case asiaHarbin = "Asia/Harbin" + case asiaHebron = "Asia/Hebron" + case asiaHoChiMinh = "Asia/Ho_Chi_Minh" + case asiaSaigon = "Asia/Saigon" + case asiaHongKong = "Asia/Hong_Kong" + case asiaHovd = "Asia/Hovd" + case asiaIrkutsk = "Asia/Irkutsk" + case asiaJakarta = "Asia/Jakarta" + case asiaJayapura = "Asia/Jayapura" + case asiaJerusalem = "Asia/Jerusalem" + case asiaKabul = "Asia/Kabul" + case asiaKamchatka = "Asia/Kamchatka" + case asiaKarachi = "Asia/Karachi" + case asiaKashgar = "Asia/Kashgar" + case asiaKathmandu = "Asia/Kathmandu" + case asiaKatmandu = "Asia/Katmandu" + case asiaKhandyga = "Asia/Khandyga" + case asiaKolkata = "Asia/Kolkata" + case asiaKrasnoyarsk = "Asia/Krasnoyarsk" + case asiaKualaLumpur = "Asia/Kuala_Lumpur" + case asiaKuching = "Asia/Kuching" + case asiaKuwait = "Asia/Kuwait" + case asiaMacau = "Asia/Macau" + case asiaMagadan = "Asia/Magadan" + case asiaMakassar = "Asia/Makassar" + case asiaManila = "Asia/Manila" + case asiaMuscat = "Asia/Muscat" + case asiaNicosia = "Asia/Nicosia" + case asiaNovokuznetsk = "Asia/Novokuznetsk" + case asiaNovosibirsk = "Asia/Novosibirsk" + case asiaOmsk = "Asia/Omsk" + case asiaOral = "Asia/Oral" + case asiaPhnomPenh = "Asia/Phnom_Penh" + case asiaPontianak = "Asia/Pontianak" + case asiaPyongyang = "Asia/Pyongyang" + case asiaQatar = "Asia/Qatar" + case asiaQyzylorda = "Asia/Qyzylorda" + case asiaRangoon = "Asia/Rangoon" + case asiaRiyadh = "Asia/Riyadh" + case asiaSakhalin = "Asia/Sakhalin" + case asiaSamarkand = "Asia/Samarkand" + case asiaSeoul = "Asia/Seoul" + case asiaShanghai = "Asia/Shanghai" + case asiaSingapore = "Asia/Singapore" + case asiaSrednekolymsk = "Asia/Srednekolymsk" + case asiaTaipei = "Asia/Taipei" + case asiaTashkent = "Asia/Tashkent" + case asiaTbilisi = "Asia/Tbilisi" + case asiaTehran = "Asia/Tehran" + case asiaThimphu = "Asia/Thimphu" + case asiaTokyo = "Asia/Tokyo" + case asiaUlaanbaatar = "Asia/Ulaanbaatar" + case asiaUrumqi = "Asia/Urumqi" + case asiaUstNera = "Asia/Ust-Nera" + case asiaVientiane = "Asia/Vientiane" + case asiaVladivostok = "Asia/Vladivostok" + case asiaYakutsk = "Asia/Yakutsk" + case asiaYekaterinburg = "Asia/Yekaterinburg" + case asiaYerevan = "Asia/Yerevan" + case atlanticAzores = "Atlantic/Azores" + case atlanticBermuda = "Atlantic/Bermuda" + case atlanticCanary = "Atlantic/Canary" + case atlanticCapeVerde = "Atlantic/Cape_Verde" + case atlanticFaroe = "Atlantic/Faroe" + case atlanticMadeira = "Atlantic/Madeira" + case atlanticReykjavik = "Atlantic/Reykjavik" + case atlanticSouthGeorgia = "Atlantic/South_Georgia" + case atlanticStHelena = "Atlantic/St_Helena" + case atlanticStanley = "Atlantic/Stanley" + case australiaAdelaide = "Australia/Adelaide" + case australiaBrisbane = "Australia/Brisbane" + case australiaBrokenHill = "Australia/Broken_Hill" + case australiaCurrie = "Australia/Currie" + case australiaDarwin = "Australia/Darwin" + case australiaEucla = "Australia/Eucla" + case australiaHobart = "Australia/Hobart" + case australiaLindeman = "Australia/Lindeman" + case australiaLordHowe = "Australia/Lord_Howe" + case australiaMelbourne = "Australia/Melbourne" + case australiaPerth = "Australia/Perth" + case australiaSydney = "Australia/Sydney" + case europeAmsterdam = "Europe/Amsterdam" + case europeAndorra = "Europe/Andorra" + case europeAthens = "Europe/Athens" + case europeBelgrade = "Europe/Belgrade" + case europeBerlin = "Europe/Berlin" + case europeBratislava = "Europe/Bratislava" + case europeBrussels = "Europe/Brussels" + case europeBucharest = "Europe/Bucharest" + case europeBudapest = "Europe/Budapest" + case europeBusingen = "Europe/Busingen" + case europeChisinau = "Europe/Chisinau" + case europeCopenhagen = "Europe/Copenhagen" + case europeDublin = "Europe/Dublin" + case europeGibraltar = "Europe/Gibraltar" + case europeGuernsey = "Europe/Guernsey" + case europeHelsinki = "Europe/Helsinki" + case europeIsleOfMan = "Europe/Isle_of_Man" + case europeIstanbul = "Europe/Istanbul" + case europeJersey = "Europe/Jersey" + case europeKaliningrad = "Europe/Kaliningrad" + case europeKiev = "Europe/Kiev" + case europeLisbon = "Europe/Lisbon" + case europeLjubljana = "Europe/Ljubljana" + case europeLondon = "Europe/London" + case europeLuxembourg = "Europe/Luxembourg" + case europeMadrid = "Europe/Madrid" + case europeMalta = "Europe/Malta" + case europeMariehamn = "Europe/Mariehamn" + case europeMinsk = "Europe/Minsk" + case europeMonaco = "Europe/Monaco" + case europeMoscow = "Europe/Moscow" + case europeOslo = "Europe/Oslo" + case europeParis = "Europe/Paris" + case europePodgorica = "Europe/Podgorica" + case europePrague = "Europe/Prague" + case europeRiga = "Europe/Riga" + case europeRome = "Europe/Rome" + case europeSamara = "Europe/Samara" + case europeSanMarino = "Europe/San_Marino" + case europeSarajevo = "Europe/Sarajevo" + case europeSimferopol = "Europe/Simferopol" + case europeSkopje = "Europe/Skopje" + case europeSofia = "Europe/Sofia" + case europeStockholm = "Europe/Stockholm" + case europeTallinn = "Europe/Tallinn" + case europeTirane = "Europe/Tirane" + case europeUzhgorod = "Europe/Uzhgorod" + case europeVaduz = "Europe/Vaduz" + case europeVatican = "Europe/Vatican" + case europeVienna = "Europe/Vienna" + case europeVilnius = "Europe/Vilnius" + case europeVolgograd = "Europe/Volgograd" + case europeWarsaw = "Europe/Warsaw" + case europeZagreb = "Europe/Zagreb" + case europeZaporozhye = "Europe/Zaporozhye" + case europeZurich = "Europe/Zurich" + case gmt = "GMT" + case indianAntananarivo = "Indian/Antananarivo" + case indianChagos = "Indian/Chagos" + case indianChristmas = "Indian/Christmas" + case indianCocos = "Indian/Cocos" + case indianComoro = "Indian/Comoro" + case indianKerguelen = "Indian/Kerguelen" + case indianMahe = "Indian/Mahe" + case indianMaldives = "Indian/Maldives" + case indianMauritius = "Indian/Mauritius" + case indianMayotte = "Indian/Mayotte" + case indianReunion = "Indian/Reunion" + case pacificApia = "Pacific/Apia" + case pacificAuckland = "Pacific/Auckland" + case pacificBougainville = "Pacific/Bougainville" + case pacificChatham = "Pacific/Chatham" + case pacificChuuk = "Pacific/Chuuk" + case pacificEaster = "Pacific/Easter" + case pacificEfate = "Pacific/Efate" + case pacificEnderbury = "Pacific/Enderbury" + case pacificFakaofo = "Pacific/Fakaofo" + case pacificFiji = "Pacific/Fiji" + case pacificFunafuti = "Pacific/Funafuti" + case pacificGalapagos = "Pacific/Galapagos" + case pacificGambier = "Pacific/Gambier" + case pacificGuadalcanal = "Pacific/Guadalcanal" + case pacificGuam = "Pacific/Guam" + case pacificHonolulu = "Pacific/Honolulu" + case pacificJohnston = "Pacific/Johnston" + case pacificKiritimati = "Pacific/Kiritimati" + case pacificKosrae = "Pacific/Kosrae" + case pacificKwajalein = "Pacific/Kwajalein" + case pacificMajuro = "Pacific/Majuro" + case pacificMarquesas = "Pacific/Marquesas" + case pacificMidway = "Pacific/Midway" + case pacificNauru = "Pacific/Nauru" + case pacificNiue = "Pacific/Niue" + case pacificNorfolk = "Pacific/Norfolk" + case pacificNoumea = "Pacific/Noumea" + case pacificPagoPago = "Pacific/Pago_Pago" + case pacificPalau = "Pacific/Palau" + case pacificPitcairn = "Pacific/Pitcairn" + case pacificPohnpei = "Pacific/Pohnpei" + case pacificPonape = "Pacific/Ponape" + case pacificPortMoresby = "Pacific/Port_Moresby" + case pacificRarotonga = "Pacific/Rarotonga" + case pacificSaipan = "Pacific/Saipan" + case pacificTahiti = "Pacific/Tahiti" + case pacificTarawa = "Pacific/Tarawa" + case pacificTongatapu = "Pacific/Tongatapu" + case pacificTruk = "Pacific/Truk" + case pacificWake = "Pacific/Wake" + case pacificWallis = "Pacific/Wallis" + + public func toTimezone() -> TimeZone { + switch self { + case .current: return TimeZone.current + case .autoUpdating: return TimeZone.autoupdatingCurrent + default: return TimeZone(identifier: rawValue)! + } + } +} diff --git a/Sources/App/Libraries/SwiftDate/SwiftDate.swift b/Sources/App/Libraries/SwiftDate/SwiftDate.swift new file mode 100644 index 0000000..fba34e4 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/SwiftDate.swift @@ -0,0 +1,36 @@ +// +// SwiftDate +// Parse, validate, manipulate, and display dates, time and timezones in Swift +// +// Created by Daniele Margutti +// - Web: https://www.danielemargutti.com +// - Twitter: https://twitter.com/danielemargutti +// - Mail: hello@danielemargutti.com +// +// Copyright © 2019 Daniele Margutti. Licensed under MIT License. +// + +import Foundation + +public struct SwiftDate { + + private init() { } + + /// The default region is used to manipulate and work with plain `Date` object and + /// wherever a region parameter is optional. By default region is the to GMT timezone + /// along with the default device's locale and calendar (both autoupdating). + public static var defaultRegion = Region.UTC + + /// This is the ordered list of all formats SwiftDate can use in order to attempt parsing a passaed + /// date expressed as string. Evaluation is made in order; you can add or remove new formats as you wish. + /// In order to reset the list call `resetAutoFormats()` function. + public static var autoFormats: [String] { + set { DateFormats.autoFormats = newValue } + get { return DateFormats.autoFormats } + } + + /// Reset the list of all built-in auto formats patterns. + public static func resetAutoFormats() { + DateFormats.resetAutoFormats() + } +} diff --git a/Sources/App/Libraries/SwiftDate/TimePeriod/Groups/TimePeriodChain.swift b/Sources/App/Libraries/SwiftDate/TimePeriod/Groups/TimePeriodChain.swift new file mode 100644 index 0000000..225f329 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/TimePeriod/Groups/TimePeriodChain.swift @@ -0,0 +1,159 @@ +// +// SwiftDate +// Parse, validate, manipulate, and display dates, time and timezones in Swift +// +// Created by Daniele Margutti +// - Web: https://www.danielemargutti.com +// - Twitter: https://twitter.com/danielemargutti +// - Mail: hello@danielemargutti.com +// +// Copyright © 2019 Daniele Margutti. Licensed under MIT License. +// + +import Foundation + +/// Time period chains serve as a tightly coupled set of time periods. +/// They are always organized by start and end date, and have their own characteristics like +/// a StartDate and EndDate that are extrapolated from the time periods within. +/// Time period chains do not allow overlaps within their set of time periods. +/// This type of group is ideal for modeling schedules like sequential meetings or appointments. +open class TimePeriodChain: TimePeriodGroup { + + // MARK: - Chain Existence Manipulation + + /** + * Append a TimePeriodProtocol to the periods array and update the Chain's + * beginning and end. + * + * - parameter period: TimePeriodProtocol to add to the collection + */ + public func append(_ period: TimePeriodProtocol) { + let beginning = (periods.count > 0) ? periods.last!.end! : period.start + + let newPeriod = TimePeriod(start: beginning!, duration: period.duration) + periods.append(newPeriod) + + //Update updateExtremes + if periods.count == 1 { + start = period.start + end = period.end + } else { + end = end?.addingTimeInterval(period.duration) + } + } + + /** + * Append a TimePeriodProtocol array to the periods array and update the Chain's + * beginning and end. + * + * - parameter periodArray: TimePeriodProtocol list to add to the collection + */ + public func append(contentsOf group: G) { + for period in group.periods { + let beginning = (periods.count > 0) ? periods.last!.end! : period.start + + let newPeriod = TimePeriod(start: beginning!, duration: period.duration) + periods.append(newPeriod) + + //Update updateExtremes + if periods.count == 1 { + start = period.start + end = period.end + } else { + end = end?.addingTimeInterval(period.duration) + } + } + } + + /// Insert period into periods array at given index. + /// + /// - Parameters: + /// - period: The period to insert + /// - index: Index to insert period at + public func insert(_ period: TimePeriodProtocol, at index: Int) { + //Check for special zero case which takes the beginning date + if index == 0 && period.start != nil && period.end != nil { + //Insert new period + periods.insert(period, at: index) + } else if period.start != nil && period.end != nil { + //Insert new period + periods.insert(period, at: index) + } else { + print("All TimePeriods in a TimePeriodChain must contain a defined start and end date") + return + } + + //Shift all periods after inserted period + for i in 0.. index && i > 0 { + let currentPeriod = TimePeriod(start: period.start, end: period.end) + periods[i].start = periods[i - 1].end + periods[i].end = periods[i].start!.addingTimeInterval(currentPeriod.duration) + } + } + + updateExtremes() + } + + /// Remove from period array at the given index. + /// + /// - Parameter index: The index in the collection to remove + public func remove(at index: Int) { + //Retrieve duration of period to be removed + let duration = periods[index].duration + + //Remove period + periods.remove(at: index) + + //Shift all periods after inserted period + for i in index..(_ transform: (TimePeriodProtocol) throws -> T) rethrows -> [T] { + return try periods.map(transform) + } + + public override func filter(_ isIncluded: (TimePeriodProtocol) throws -> Bool) rethrows -> [TimePeriodProtocol] { + return try periods.filter(isIncluded) + } + + internal override func reduce(_ initialResult: Result, _ nextPartialResult: (Result, TimePeriodProtocol) throws -> Result) rethrows -> Result { + return try periods.reduce(initialResult, nextPartialResult) + } + + /// Removes the last object from the `TimePeriodChain` and returns it + public func pop() -> TimePeriodProtocol? { + let period = periods.popLast() + updateExtremes() + + return period + } + + internal func updateExtremes() { + start = periods.first?.start + end = periods.last?.end + } + +} diff --git a/Sources/App/Libraries/SwiftDate/TimePeriod/Groups/TimePeriodCollection.swift b/Sources/App/Libraries/SwiftDate/TimePeriod/Groups/TimePeriodCollection.swift new file mode 100644 index 0000000..a77c022 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/TimePeriod/Groups/TimePeriodCollection.swift @@ -0,0 +1,241 @@ +// +// SwiftDate +// Parse, validate, manipulate, and display dates, time and timezones in Swift +// +// Created by Daniele Margutti +// - Web: https://www.danielemargutti.com +// - Twitter: https://twitter.com/danielemargutti +// - Mail: hello@danielemargutti.com +// +// Copyright © 2019 Daniele Margutti. Licensed under MIT License. +// + +import Foundation + +/// Sort type +/// +/// - ascending: sort in ascending order +/// - descending: sort in descending order +public enum SortMode { + case ascending + case descending +} + +/// Sorting type +/// +/// - start: sort by start date +/// - end: sort by end date +/// - duration: sort by duration +/// - custom: sort using custom function +public enum SortType { + case start(_: SortMode) + case end(_: SortMode) + case duration(_: SortMode) + case custom(_: ((TimePeriodProtocol, TimePeriodProtocol) -> Bool)) +} + +/// Time period collections serve as loose sets of time periods. +/// They are unorganized unless you decide to sort them, and have their own characteristics +/// like a `start` and `end` that are extrapolated from the time periods within. +/// Time period collections allow overlaps within their set of time periods. +open class TimePeriodCollection: TimePeriodGroup { + + // MARK: - Collection Manipulation + + /// Append a TimePeriodProtocol to the periods array and check if the Collection's start and end should change. + /// + /// - Parameter period: TimePeriodProtocol to add to the collection + public func append(_ period: TimePeriodProtocol) { + periods.append(period) + updateExtremes(period: period) + } + + /// Append a TimePeriodProtocol array to the periods array and check if the Collection's + /// start and end should change. + /// + /// - Parameter periodArray: TimePeriodProtocol list to add to the collection + public func append(_ periodArray: [TimePeriodProtocol]) { + for period in periodArray { + periods.append(period) + updateExtremes(period: period) + } + } + + /// Append a TimePeriodGroup's periods array to the periods array of self and check if the Collection's + /// start and end should change. + /// + /// - Parameter newPeriods: TimePeriodGroup to merge periods arrays with + public func append(contentsOf newPeriods: C) { + for period in newPeriods as TimePeriodGroup { + periods.append(period) + updateExtremes(period: period) + } + } + + /// Insert period into periods array at given index. + /// + /// - Parameters: + /// - newElement: The period to insert + /// - index: Index to insert period at + public func insert(_ newElement: TimePeriodProtocol, at index: Int) { + periods.insert(newElement, at: index) + updateExtremes(period: newElement) + } + + /// Remove from period array at the given index. + /// + /// - Parameter at: The index in the collection to remove + public func remove(at: Int) { + periods.remove(at: at) + updateExtremes() + } + + /// Remove all periods from period array. + public func removeAll() { + periods.removeAll() + updateExtremes() + } + + // MARK: - Sorting + + /// Sort elements in place using given method. + /// + /// - Parameter type: sorting method + public func sort(by type: SortType) { + switch type { + case .duration(let mode): periods.sort(by: sortFuncDuration(mode)) + case .start(let mode): periods.sort(by: sortFunc(byStart: true, type: mode)) + case .end(let mode): periods.sort(by: sortFunc(byStart: false, type: mode)) + case .custom(let f): periods.sort(by: f) + } + } + + /// Generate a new `TimePeriodCollection` where items are sorted with specified method. + /// + /// - Parameters: + /// - type: sorting method + /// - Returns: collection ordered by given function + public func sorted(by type: SortType) -> TimePeriodCollection { + var sortedList: [TimePeriodProtocol]! + switch type { + case .duration(let mode): sortedList = periods.sorted(by: sortFuncDuration(mode)) + case .start(let mode): sortedList = periods.sorted(by: sortFunc(byStart: true, type: mode)) + case .end(let mode): sortedList = periods.sorted(by: sortFunc(byStart: false, type: mode)) + case .custom(let f): sortedList = periods.sorted(by: f) + } + return TimePeriodCollection(sortedList) + } + + // MARK: - Collection Relationship + + /// Returns from the `TimePeriodCollection` a sub-collection of `TimePeriod`s + /// whose start and end dates fall completely inside the interval of the given `TimePeriod`. + /// + /// - Parameter period: The period to compare each other period against + /// - Returns: Collection of periods inside the given period + public func periodsInside(period: TimePeriodProtocol) -> TimePeriodCollection { + return TimePeriodCollection(periods.filter({ $0.isInside(period) })) + } + + // Returns from the `TimePeriodCollection` a sub-collection of `TimePeriod`s containing the given date. + /// + /// - Parameter date: The date to compare each period to + /// - Returns: Collection of periods intersected by the given date + public func periodsIntersected(by date: DateInRegion) -> TimePeriodCollection { + return TimePeriodCollection(periods.filter({ $0.contains(date: date, interval: .closed) })) + } + + /// Returns from the `TimePeriodCollection` a sub-collection of `TimePeriod`s + /// containing either the start date or the end date--or both--of the given `TimePeriod`. + /// + /// - Parameter period: The period to compare each other period to + /// - Returns: Collection of periods intersected by the given period + public func periodsIntersected(by period: TimePeriodProtocol) -> TimePeriodCollection { + return TimePeriodCollection(periods.filter({ $0.intersects(with: period) })) + } + + /// Returns an instance of DTTimePeriodCollection with all the time periods in the receiver that overlap a given time period. + /// Overlap with the given time period does NOT include other time periods that simply touch it. + /// (i.e. one's start date is equal to another's end date) + /// + /// - Parameter period: The time period to check against the receiver's time periods. + /// - Returns: Collection of periods overlapped by the given period + public func periodsOverlappedBy(_ period: TimePeriodProtocol) -> TimePeriodCollection { + return TimePeriodCollection(periods.filter({ $0.overlaps(with: period) })) + } + + // MARK: - Map + + public func map(_ transform: (TimePeriodProtocol) throws -> TimePeriodProtocol) rethrows -> TimePeriodCollection { + var mappedArray = [TimePeriodProtocol]() + mappedArray = try periods.map(transform) + let mappedCollection = TimePeriodCollection() + for period in mappedArray { + mappedCollection.periods.append(period) + mappedCollection.updateExtremes(period: period) + } + return mappedCollection + } + + // MARK: - Helpers + + private func sortFuncDuration(_ type: SortMode) -> ((TimePeriodProtocol, TimePeriodProtocol) -> Bool) { + switch type { + case .ascending: return { $0.duration < $1.duration } + case .descending: return { $0.duration > $1.duration } + } + } + + private func sortFunc(byStart start: Bool = true, type: SortMode) -> ((TimePeriodProtocol, TimePeriodProtocol) -> Bool) { + return { + let date0 = (start ? $0.start : $0.end) + let date1 = (start ? $1.start : $1.end) + if date0 == nil && date1 == nil { + return false + } else if date0 == nil { + return true + } else if date1 == nil { + return false + } else { + return (type == .ascending ? date1! > date0! : date0! > date1!) + } + } + } + + private func updateExtremes(period: TimePeriodProtocol) { + //Check incoming period against previous start and end date + guard count != 1 else { + start = period.start + end = period.end + return + } + start = nilOrEarlier(date1: start, date2: period.start) + end = nilOrLater(date1: end, date2: period.end) + } + + private func updateExtremes() { + guard periods.count > 0 else { + start = nil + end = nil + return + } + + start = periods.first!.start + end = periods.first!.end + for i in 1.. DateInRegion? { + guard date1 != nil && date2 != nil else { return nil } + return date1!.earlierDate(date2!) + } + + private func nilOrLater(date1: DateInRegion?, date2: DateInRegion?) -> DateInRegion? { + guard date1 != nil && date2 != nil else { return nil } + return date1!.laterDate(date2!) + } + +} diff --git a/Sources/App/Libraries/SwiftDate/TimePeriod/Groups/TimePeriodGroup.swift b/Sources/App/Libraries/SwiftDate/TimePeriod/Groups/TimePeriodGroup.swift new file mode 100644 index 0000000..3320325 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/TimePeriod/Groups/TimePeriodGroup.swift @@ -0,0 +1,123 @@ +// +// SwiftDate +// Parse, validate, manipulate, and display dates, time and timezones in Swift +// +// Created by Daniele Margutti +// - Web: https://www.danielemargutti.com +// - Twitter: https://twitter.com/danielemargutti +// - Mail: hello@danielemargutti.com +// +// Copyright © 2019 Daniele Margutti. Licensed under MIT License. +// + +import Foundation + +/// Time period groups are the final abstraction of date and time in DateTools. +/// Here, time periods are gathered and organized into something useful. +/// There are two main types of time period groups, `TimePeriodCollection` and `TimePeriodChain`. +open class TimePeriodGroup: Sequence, Equatable { + + /// Array of periods that define the group. + internal var periods: [TimePeriodProtocol] = [] + + /// The earliest beginning date of a `TimePeriod` in the group. + /// `nil` if any `TimePeriod` in group has a nil beginning date (indefinite). + public internal(set) var start: DateInRegion? + + /// The latest end date of a `TimePeriod` in the group. + /// `nil` if any `TimePeriod` in group has a nil end date (indefinite). + public internal(set) var end: DateInRegion? + + /// The total amount of time between the earliest and latest dates stored in the periods array. + /// `nil` if any beginning or end date in any contained period is `nil`. + public var duration: TimeInterval? { + guard let start = start, let end = end else { return nil } + return end.timeIntervalSince(start) + } + + /// The number of periods in the periods array. + public var count: Int { + return periods.count + } + + // MARK: - Equatable + + public static func == (lhs: TimePeriodGroup, rhs: TimePeriodGroup) -> Bool { + return TimePeriodGroup.hasSameElements(array1: lhs.periods, rhs.periods) + } + + // MARK: - Initializers + + public init(_ periods: [TimePeriodProtocol]? = nil) { + self.periods = (periods ?? []) + } + + // MARK: - Sequence Protocol + + public func makeIterator() -> IndexingIterator<[TimePeriodProtocol]> { + return periods.makeIterator() + } + + public func map(_ transform: (TimePeriodProtocol) throws -> T) rethrows -> [T] { + return try periods.map(transform) + } + + public func filter(_ isIncluded: (TimePeriodProtocol) throws -> Bool) rethrows -> [TimePeriodProtocol] { + return try periods.filter(isIncluded) + } + + public func forEach(_ body: (TimePeriodProtocol) throws -> Void) rethrows { + return try periods.forEach(body) + } + + public func split(maxSplits: Int, omittingEmptySubsequences: Bool, whereSeparator isSeparator: (TimePeriodProtocol) throws -> Bool) rethrows -> [AnySequence] { + return try periods.split(maxSplits: maxSplits, omittingEmptySubsequences: omittingEmptySubsequences, whereSeparator: isSeparator).map(AnySequence.init) + } + + subscript(index: Int) -> TimePeriodProtocol { + get { + return periods[index] + } + } + + internal func reduce(_ initialResult: Result, _ nextPartialResult: (Result, TimePeriodProtocol) throws -> Result) rethrows -> Result { + return try periods.reduce(initialResult, nextPartialResult) + } + + // MARK: - Internal Helper Functions + + internal static func hasSameElements(array1: [TimePeriodProtocol], _ array2: [TimePeriodProtocol]) -> Bool { + guard array1.count == array2.count else { + return false // No need to sorting if they already have different counts + } + + let compArray1: [TimePeriodProtocol] = array1.sorted { (period1: TimePeriodProtocol, period2: TimePeriodProtocol) -> Bool in + if period1.start == nil && period2.start == nil { + return false + } else if period1.start == nil { + return true + } else if period2.start == nil { + return false + } else { + return period2.start! < period1.start! + } + } + let compArray2: [TimePeriodProtocol] = array2.sorted { (period1: TimePeriodProtocol, period2: TimePeriodProtocol) -> Bool in + if period1.start == nil && period2.start == nil { + return false + } else if period1.start == nil { + return true + } else if period2.start == nil { + return false + } else { + return period2.start! < period1.start! + } + } + for x in 0.. TimePeriod { + return TimePeriod(start: DateInRegion.past(), end: DateInRegion.future()) + } + + // MARK: - Shifted + + /// Shift the `TimePeriod` by a `TimeInterval` + /// + /// - Parameter timeInterval: The time interval to shift the period by + /// - Returns: The new, shifted `TimePeriod` + public func shifted(by timeInterval: TimeInterval) -> TimePeriod { + let timePeriod = TimePeriod() + timePeriod.start = start?.addingTimeInterval(timeInterval) + timePeriod.end = end?.addingTimeInterval(timeInterval) + return timePeriod + } + + /// Shift the `TimePeriod` by the specified components value. + /// ie. `let shifted = period.shifted(by: 3.days)` + /// + /// - Parameter components: components to shift + /// - Returns: new period + public func shifted(by components: DateComponents) -> TimePeriod { + let timePeriod = TimePeriod() + timePeriod.start = (hasStart ? (start! + components) : nil) + timePeriod.end = (hasEnd ? (end! + components) : nil) + return timePeriod + } + + // MARK: - Lengthen / Shorten + + /// Lengthen the `TimePeriod` by a `TimeInterval` + /// + /// - Parameters: + /// - timeInterval: The time interval to lengthen the period by + /// - anchor: The anchor point from which to make the change + /// - Returns: The new, lengthened `TimePeriod` + public func lengthened(by timeInterval: TimeInterval, at anchor: TimePeriodAnchor) -> TimePeriod { + let timePeriod = TimePeriod() + switch anchor { + case .beginning: + timePeriod.start = start + timePeriod.end = end?.addingTimeInterval(timeInterval) + case .center: + timePeriod.start = start?.addingTimeInterval(-timeInterval) + timePeriod.end = end?.addingTimeInterval(timeInterval) + case .end: + timePeriod.start = start?.addingTimeInterval(-timeInterval) + timePeriod.end = end + } + return timePeriod + } + + /// Shorten the `TimePeriod` by a `TimeInterval` + /// + /// - Parameters: + /// - timeInterval: The time interval to shorten the period by + /// - anchor: The anchor point from which to make the change + /// - Returns: The new, shortened `TimePeriod` + public func shortened(by timeInterval: TimeInterval, at anchor: TimePeriodAnchor) -> TimePeriod { + let timePeriod = TimePeriod() + switch anchor { + case .beginning: + timePeriod.start = start + timePeriod.end = end?.addingTimeInterval(-timeInterval) + case .center: + timePeriod.start = start?.addingTimeInterval(-timeInterval / 2) + timePeriod.end = end?.addingTimeInterval(timeInterval / 2) + case .end: + timePeriod.start = start?.addingTimeInterval(timeInterval) + timePeriod.end = end + } + return timePeriod + } + + // MARK: - Operator Overloads + + /// Default anchor = beginning + /// Operator overload for lengthening a `TimePeriod` by a `TimeInterval` + public static func + (leftAddend: TimePeriod, rightAddend: TimeInterval) -> TimePeriod { + return leftAddend.lengthened(by: rightAddend, at: .beginning) + } + + /// Default anchor = beginning + /// Operator overload for shortening a `TimePeriod` by a `TimeInterval` + public static func - (minuend: TimePeriod, subtrahend: TimeInterval) -> TimePeriod { + return minuend.shortened(by: subtrahend, at: .beginning) + } + + /// Operator overload for checking if a `TimePeriod` is equal to a `TimePeriodProtocol` + public static func == (left: TimePeriod, right: TimePeriodProtocol) -> Bool { + return left.equals(right) + } + +} + +public extension TimePeriod { + + /// The start date of the time period + var startDate: Date? { + return start?.date + } + + /// The end date of the time period + var endDate: Date? { + return end?.date + } + + /// Create a new time period with the given start date, end date and region (default is UTC) + convenience init(startDate: Date, endDate: Date, region: Region = Region.UTC) { + let start = DateInRegion(startDate, region: region) + let end = DateInRegion(endDate, region: region) + self.init(start: start, end: end) + } +} diff --git a/Sources/App/Libraries/SwiftDate/TimePeriod/TimePeriodProtocol.swift b/Sources/App/Libraries/SwiftDate/TimePeriod/TimePeriodProtocol.swift new file mode 100644 index 0000000..ed99c55 --- /dev/null +++ b/Sources/App/Libraries/SwiftDate/TimePeriod/TimePeriodProtocol.swift @@ -0,0 +1,328 @@ +// +// SwiftDate +// Parse, validate, manipulate, and display dates, time and timezones in Swift +// +// Created by Daniele Margutti +// - Web: https://www.danielemargutti.com +// - Twitter: https://twitter.com/danielemargutti +// - Mail: hello@danielemargutti.com +// +// Copyright © 2019 Daniele Margutti. Licensed under MIT License. +// + +import Foundation + +public protocol TimePeriodProtocol { + + /// The start date for a TimePeriod representing the starting boundary of the time period + var start: DateInRegion? { get set } + + /// The end date for a TimePeriod representing the ending boundary of the time period + var end: DateInRegion? { get set } + +} + +public extension TimePeriodProtocol { + + /// Return `true` if time period has both start and end dates + var hasFiniteRange: Bool { + guard start != nil && end != nil else { return false } + return true + } + + /// Return `true` if period has a start date + var hasStart: Bool { + return (start != nil) + } + + /// Return `true` if period has a end date + var hasEnd: Bool { + return (end != nil) + } + + /// Check if receiver is equal to given period (both start/end groups are equals) + /// + /// - Parameter period: period to compare against to. + /// - Returns: true if are equals + func equals(_ period: TimePeriodProtocol) -> Bool { + return (start == period.start && end == period.end) + } + + /// If the given `TimePeriod`'s beginning is before `beginning` and + /// if the given 'TimePeriod`'s end is after `end`. + /// + /// - Parameter period: The time period to compare to self + /// - Returns: True if self is inside of the given `TimePeriod` + func isInside(_ period: TimePeriodProtocol) -> Bool { + guard hasFiniteRange, period.hasFiniteRange else { return false } + return (period.start! <= start! && period.end! >= end!) + } + + /// If the given Date is after `beginning` and before `end`. + /// + /// - Parameters: + /// - date: The time period to compare to self + /// - interval: Whether the edge of the date is included in the calculation + /// - Returns: True if the given `TimePeriod` is inside of self + func contains(date: DateInRegion, interval: IntervalType = .closed) -> Bool { + guard hasFiniteRange else { return false } + switch interval { + case .closed: return (start! <= date && end! >= date) + case .open: return (start! < date && end! > date) + } + } + + /// If the given `TimePeriod`'s beginning is after `beginning` and + /// if the given 'TimePeriod`'s after is after `end`. + /// + /// - Parameter period: The time period to compare to self + /// - Returns: True if the given `TimePeriod` is inside of self + func contains(_ period: TimePeriodProtocol) -> Bool { + guard hasFiniteRange, period.hasFiniteRange else { return false } + if period.start! < start! && period.end! > start! { + return true // Outside -> Inside + } else if period.start! >= start! && period.end! <= end! { + return true // Enclosing + } else if period.start! < end! && period.end! > end! { + return true // Inside -> Out + } + return false + } + + /// If self and the given `TimePeriod` share any sub-`TimePeriod`. + /// + /// - Parameter period: The time period to compare to self + /// - Returns: True if there is a period of time that is shared by both `TimePeriod`s + func overlaps(with period: TimePeriodProtocol) -> Bool { + if period.start! < start! && period.end! > start! { + return true // Outside -> Inside + } else if period.start! >= start! && period.end! <= end! { + return true // Enclosing + } else if period.start! < end! && period.end! > end! { + return true // Inside -> Out + } + return false + } + + /// If self and the given `TimePeriod` overlap or the period's edges touch. + /// + /// - Parameter period: The time period to compare to self + /// - Returns: True if there is a period of time or moment that is shared by both `TimePeriod`s + func intersects(with period: TimePeriodProtocol) -> Bool { + let relation = self.relation(to: period) + return (relation != .after && relation != .before) + } + + /// If self is before the given `TimePeriod` chronologically. (A gap must exist between the two). + /// + /// - Parameter period: The time period to compare to self + /// - Returns: True if self is after the given `TimePeriod` + func isBefore(_ period: TimePeriodProtocol) -> Bool { + return (relation(to: period) == .before) + } + + /// If self is after the given `TimePeriod` chronologically. (A gap must exist between the two). + /// + /// - Parameter period: The time period to compare to self + /// - Returns: True if self is after the given `TimePeriod` + func isAfter(_ period: TimePeriodProtocol) -> Bool { + return (relation(to: period) == .after) + } + + /// The period of time between self and the given `TimePeriod` not contained by either. + /// + /// - Parameter period: The time period to compare to self + /// - Returns: The gap between the periods. Zero if there is no gap. + func hasGap(between period: TimePeriodProtocol) -> Bool { + return (isBefore(period) || isAfter(period)) + } + + /// The period of time between self and the given `TimePeriod` not contained by either. + /// + /// - Parameter period: The time period to compare to self + /// - Returns: The gap between the periods. Zero if there is no gap. + func gap(between period: TimePeriodProtocol) -> TimeInterval { + guard hasFiniteRange, period.hasFiniteRange else { return TimeInterval.greatestFiniteMagnitude } + if end! < period.start! { + return abs(end!.timeIntervalSince(period.start!)) + } else if period.end! < start! { + return abs(end!.timeIntervalSince(start!)) + } + return 0 + } + + /// In place, shift the `TimePeriod` by a `TimeInterval` + /// + /// - Parameter timeInterval: The time interval to shift the period by + mutating func shift(by timeInterval: TimeInterval) { + start?.addTimeInterval(timeInterval) + end?.addTimeInterval(timeInterval) + } + + /// In place, lengthen the `TimePeriod`, anchored at the beginning, end or center + /// + /// - Parameters: + /// - timeInterval: The time interval to lengthen the period by + /// - anchor: The anchor point from which to make the change + mutating func lengthen(by timeInterval: TimeInterval, at anchor: TimePeriodAnchor) { + switch anchor { + case .beginning: + end?.addTimeInterval(timeInterval) + case .end: + start?.addTimeInterval(timeInterval) + case .center: + start = start?.addingTimeInterval(-timeInterval / 2.0) + end = end?.addingTimeInterval(timeInterval / 2.0) + } + } + + /// In place, shorten the `TimePeriod`, anchored at the beginning, end or center + /// + /// - Parameters: + /// - timeInterval: The time interval to shorten the period by + /// - anchor: The anchor point from which to make the change + mutating func shorten(by timeInterval: TimeInterval, at anchor: TimePeriodAnchor) { + switch anchor { + case .beginning: + end?.addTimeInterval(-timeInterval) + case .end: + start?.addTimeInterval(timeInterval) + case .center: + start?.addTimeInterval(timeInterval / 2.0) + end?.addTimeInterval(-timeInterval / 2.0) + } + } + + /// The relationship of the self `TimePeriod` to the given `TimePeriod`. + /// Relations are stored in Enums.swift. Formal defnitions available in the provided + /// links: + /// [GitHub](https://github.com/MatthewYork/DateTools#relationships), + /// [CodeProject](http://www.codeproject.com/Articles/168662/Time-Period-Library-for-NET) + /// + /// - Parameter period: The time period to compare to self + /// - Returns: The relationship between self and the given time period + func relation(to period: TimePeriodProtocol) -> TimePeriodRelation { + //Make sure that all start and end points exist for comparison + guard hasFiniteRange, period.hasFiniteRange else { return .none } + //Make sure time periods are of positive durations + guard start! < end! && period.start! < period.end! else { return .none } + //Make comparisons + if period.start! < start! { + return .after + } else if period.end! == start! { + return .startTouching + } else if period.start! < start! && period.end! < end! { + return .startInside + } else if period.start! == start! && period.end! > end! { + return .insideStartTouching + } else if period.start! == start! && period.end! < end! { + return .enclosingStartTouching + } else if period.start! > start! && period.end! < end! { + return .enclosing + } else if period.start! > start! && period.end! == end! { + return .enclosingEndTouching + } else if period.start == start! && period.end! == end! { + return .exactMatch + } else if period.start! < start! && period.end! > end! { + return .inside + } else if period.start! < start! && period.end! == end! { + return .insideEndTouching + } else if period.start! < end! && period.end! > end! { + return .endInside + } else if period.start! == end! && period.end! > end! { + return .endTouching + } else if period.start! > end! { + return .before + } + return .none + } + + /// Return `true` if period is zero-seconds long or less than specified precision. + /// + /// - Parameter precision: precision in seconds; by default is 0. + /// - Returns: true if start/end has the same value or less than specified precision + func isMoment(precision: TimeInterval = 0) -> Bool { + guard hasFiniteRange else { return false } + return (abs(start!.date.timeIntervalSince1970 - end!.date.timeIntervalSince1970) <= precision) + } + + /// Returns the duration of the receiver expressed with given time unit. + /// If time period has not a finite range it returns `nil`. + /// + /// - Parameter unit: unit of the duration + /// - Returns: duration, `nil` if period has not a finite range + func durationIn(_ units: Set) -> DateComponents? { + guard hasFiniteRange else { return nil } + return start!.calendar.dateComponents(units, from: start!.date, to: end!.date) + } + + /// Returns the duration of the receiver expressed with given time unit. + /// If time period has not a finite range it returns `nil`. + /// + /// - Parameter unit: unit of the duration + /// - Returns: duration, `nil` if period has not a finite range + func durationIn(_ unit: Calendar.Component) -> Int? { + guard hasFiniteRange else { return nil } + return start!.calendar.dateComponents([unit], from: start!.date, to: end!.date).value(for: unit) + } + + /// The duration of the `TimePeriod` in years. + /// Returns the `Int.max` if beginning or end are `nil`. + var years: Int { + guard let b = start, let e = end else { return Int.max } + return b.toUnit(.year, to: e) + } + + /// The duration of the `TimePeriod` in months. + /// Returns the `Int.max` if beginning or end are `nil`. + var months: Int { + guard let b = start, let e = end else { return Int.max } + return b.toUnit(.month, to: e) + } + + /// The duration of the `TimePeriod` in weeks. + /// Returns the `Int.max` if beginning or end are `nil`. + var weeks: Int { + guard let b = start, let e = end else { return Int.max } + return b.toUnit(.weekOfMonth, to: e) + } + + /// The duration of the `TimePeriod` in days. + /// Returns the `Int.max` if beginning or end are `nil`. + var days: Int { + guard let b = start, let e = end else { return Int.max } + return b.toUnit(.day, to: e) + } + + /// The duration of the `TimePeriod` in hours. + /// Returns the `Int.max` if beginning or end are `nil`. + var hours: Int { + guard let b = start, let e = end else { return Int.max } + return b.toUnit(.hour, to: e) + } + + /// The duration of the `TimePeriod` in years. + /// Returns the `Int.max` if beginning or end are `nil`. + var minutes: Int { + guard let b = start, let e = end else { return Int.max } + return b.toUnit(.minute, to: e) + } + + /// The duration of the `TimePeriod` in seconds. + /// Returns the `Int.max` if beginning or end are `nil`. + var seconds: Int { + guard let b = start, let e = end else { return Int.max } + return b.toUnit(.second, to: e) + } + + /// The length of time between the beginning and end dates of the + /// `TimePeriod` as a `TimeInterval`. + /// If intervals are not nil returns `Double.greatestFiniteMagnitude` + var duration: TimeInterval { + guard let b = start, let e = end else { + return TimeInterval(Double.greatestFiniteMagnitude) + } + return abs(b.date.timeIntervalSince(e.date)) + } + +} diff --git a/Sources/App/Models/AllStats.swift b/Sources/App/Models/AllStats.swift new file mode 100644 index 0000000..c699154 --- /dev/null +++ b/Sources/App/Models/AllStats.swift @@ -0,0 +1,83 @@ +// +// Stats.swift +// App +// +// Created by Michael Simard on 5/29/20. +// + +import Foundation + + +import Fluent +import Vapor + +final class AllStats: Content { + var overall:Stats + var byMonth: [MonthStats] + + init( overall:Stats, byMonth:[MonthStats]) { + self.overall = overall + self.byMonth = byMonth + } +} + + +final class MonthStats: Content { + var stats:Stats + var month:String + var year: String + + init( month:Int, year:Int, stats:Stats) { + self.month = Utilities.monthToString(month: month) + self.year = String(year) + self.stats = stats + + } + +} + +final class Stats: Content { + var winLossRatio:String + var totalWins:Int + var totalLosses:Int + + init( winLoss:String, totalWins:Int, totalLosses:Int) { + self.winLossRatio = winLoss + self.totalWins = totalWins + self.totalLosses = totalLosses + + } +} + +class Utilities { + class func monthToString(month:Int) -> String { + switch month { + case 1 : + return "January" + case 2: + return "February" + case 3: + return "March" + case 4: + return "April" + case 5: + return "May" + case 6: + return "June" + case 7: + return "July" + case 8: + return "August" + case 9: + return "September" + case 10: + return "October" + case 11: + return "November" + case 12: + return "December" + default: + return "error" + } + } +} diff --git a/Sources/App/Models/Stats.swift b/Sources/App/Models/Stats.swift deleted file mode 100644 index 733b796..0000000 --- a/Sources/App/Models/Stats.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// Stats.swift -// App -// -// Created by Michael Simard on 5/29/20. -// - -import Foundation - - -import Fluent -import Vapor - -final class Stats: Content { - var winLossRatio:String - var totalWins:Int - var totalLosses:Int - - init( winLoss:String, totalWins:Int, totalLosses:Int) { - self.winLossRatio = winLoss - self.totalWins = totalWins - self.totalLosses = totalLosses - } -} diff --git a/Sources/App/configure.swift b/Sources/App/configure.swift index 04f25ed..b02eb91 100644 --- a/Sources/App/configure.swift +++ b/Sources/App/configure.swift @@ -6,7 +6,6 @@ import Vapor public func configure(_ app: Application) throws { // uncomment to serve files from /Public folder // app.middleware.use(FileMiddleware(publicDirectory: app.directory.publicDirectory)) - app.middleware.use(CORSMiddleware(configuration: .default())) // using custom configuration app.middleware.use(CORSMiddleware(configuration: .init( allowedOrigin: .all,