├── Brewfile ├── .gitignore ├── Resources ├── uncomment.sed ├── dayPeriods.xml └── dayPeriods-processed.xml ├── .travis.yml ├── Sources └── DayPeriodFormatter │ ├── DayPeriodRule.swift │ ├── DayPeriod.swift │ ├── DayPeriodRuleSet.swift │ ├── DayPeriodFormatter.swift │ ├── DayPeriodFormatter+RuleSets.swift.gyb │ └── DayPeriodFormatter+RuleSets.swift ├── Tests ├── LinuxMain.swift └── DayPeriodFormatterTests │ ├── XCTestManifests.swift │ └── DayPeriodFormatterTests.swift ├── .swiftpm └── xcode │ └── package.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ └── IDEWorkspaceChecks.plist ├── DayPeriodFormatter.playground ├── contents.xcplayground └── Contents.swift ├── DayPeriodFormatter.xcworkspace ├── xcshareddata │ ├── IDEWorkspaceChecks.plist │ └── WorkspaceSettings.xcsettings └── contents.xcworkspacedata ├── Makefile ├── README.md ├── LICENSE.md └── Package.swift /Brewfile: -------------------------------------------------------------------------------- 1 | tap 'nshipster/formulae' 2 | brew 'gyb' 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | /.build 3 | /Packages 4 | /*.xcodeproj 5 | /Vendor/gyb.pyc 6 | -------------------------------------------------------------------------------- /Resources/uncomment.sed: -------------------------------------------------------------------------------- 1 | s#/>[[:blank:]]*# string="\1"/>#g 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: objective-c 2 | xcode_project: Money.xcodeproj 3 | xcode_scheme: Money 4 | xcode_destination: platform=macOs 5 | -------------------------------------------------------------------------------- /Sources/DayPeriodFormatter/DayPeriodRule.swift: -------------------------------------------------------------------------------- 1 | enum DayPeriodRule { 2 | case at(time: Int) 3 | case range(from: Int) 4 | } 5 | -------------------------------------------------------------------------------- /Tests/LinuxMain.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | 3 | import DayPeriodFormatterTests 4 | 5 | var tests = [XCTestCaseEntry]() 6 | tests += DayPeriodFormatterTests.allTests() 7 | XCTMain(tests) 8 | -------------------------------------------------------------------------------- /.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /DayPeriodFormatter.playground/contents.xcplayground: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Tests/DayPeriodFormatterTests/XCTestManifests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | 3 | #if !os(macOS) 4 | public func allTests() -> [XCTestCaseEntry] { 5 | return [ 6 | testCase(DayPeriodFormatterTests.allTests), 7 | ] 8 | } 9 | #endif 10 | -------------------------------------------------------------------------------- /DayPeriodFormatter.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Sources/DayPeriodFormatter/DayPeriod.swift: -------------------------------------------------------------------------------- 1 | enum DayPeriod: Equatable, Hashable { 2 | case am 3 | case pm 4 | case midnight 5 | case noon 6 | case morning1 7 | case morning2 8 | case afternoon1 9 | case afternoon2 10 | case evening1 11 | case evening2 12 | case night1 13 | case night2 14 | } 15 | -------------------------------------------------------------------------------- /DayPeriodFormatter.playground/Contents.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import DayPeriodFormatter 3 | 4 | let formatter = DayPeriodFormatter() 5 | let dateComponents = DateComponents(hour: 9, minute: 41) 6 | formatter.string(from: dateComponents) 7 | 8 | formatter.locale = Locale(identifier: "ja_JP") 9 | formatter.string(from: dateComponents) 10 | -------------------------------------------------------------------------------- /DayPeriodFormatter.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /DayPeriodFormatter.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded 6 | 7 | 8 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | Sources/DayPeriodFormatter/DayPeriodFormatter+RuleSets.swift: Resources/dayPeriods-processed.xml 2 | 3 | Resources/dayPeriods.xml: 4 | @curl https://raw.githubusercontent.com/unicode-org/cldr/master/common/supplemental/dayPeriods.xml > $@ 5 | 6 | Resources/dayPeriods-processed.xml: Resources/dayPeriods.xml 7 | @sed -E -f Resources/uncomment.sed $< > $@ 8 | 9 | %.swift: %.swift.gyb 10 | @gyb --line-directive '' -o $@ $< 11 | 12 | .PHONY: 13 | clean: 14 | @rm Resources/dayPeriods-processed.xml 15 | @rm Sources/DayPeriodFormatter/DayPeriodFormatter+RuleSets.swift 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # DayPeriodFormatter 2 | 3 | ```swift 4 | import Foundation 5 | import DayPeriodFormatter 6 | 7 | let formatter = DayPeriodFormatter() 8 | let dateComponents = DateComponents(hour: 9, minute: 41) 9 | formatter.string(from: dateComponents) // "morning" 10 | 11 | // 150+ locales supported 12 | formatter.locale = Locale(identifier: "ja") 13 | formatter.string(from: dateComponents) // "朝" 14 | ``` 15 | 16 | ## Requirements 17 | 18 | - Swift 4.0+ 19 | 20 | ## Installation 21 | 22 | ### Swift Package Manager 23 | 24 | Add the DayPeriodFormatter package to your target dependencies in `Package.swift`: 25 | 26 | ```swift 27 | import PackageDescription 28 | 29 | let package = Package( 30 | name: "YourProject", 31 | dependencies: [ 32 | .package( 33 | url: "https://github.com/FormatterKit/DayPeriodFormatter", 34 | from: "0.0.2" 35 | ), 36 | ] 37 | ) 38 | ``` 39 | 40 | Then run the `swift build` command to build your project. 41 | 42 | ## License 43 | 44 | MIT 45 | 46 | ## Contact 47 | 48 | Mattt ([@mattt](https://twitter.com/mattt)) 49 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright 2019 Mattt (https://mat.tt) 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a 4 | copy of this software and associated documentation files (the "Software"), 5 | to deal in the Software without restriction, including without limitation 6 | the rights to use, copy, modify, merge, publish, distribute, sublicense, 7 | and/or sell copies of the Software, and to permit persons to whom the 8 | Software is furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 14 | OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 18 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 19 | DEALINGS IN THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:4.0 2 | // The swift-tools-version declares the minimum version of Swift required to build this package. 3 | 4 | import PackageDescription 5 | 6 | let package = Package( 7 | name: "DayPeriodFormatter", 8 | products: [ 9 | // Products define the executables and libraries produced by a package, and make them visible to other packages. 10 | .library( 11 | name: "DayPeriodFormatter", 12 | targets: ["DayPeriodFormatter"] 13 | ), 14 | ], 15 | dependencies: [ 16 | // Dependencies declare other packages that this package depends on. 17 | // .package(url: /* package url */, from: "1.0.0"), 18 | ], 19 | targets: [ 20 | // Targets are the basic building blocks of a package. A target can define a module or a test suite. 21 | // Targets can depend on other targets in this package, and on products in packages which this package depends on. 22 | .target( 23 | name: "DayPeriodFormatter", 24 | dependencies: [] 25 | ), 26 | .testTarget( 27 | name: "DayPeriodFormatterTests", 28 | dependencies: ["DayPeriodFormatter"] 29 | ), 30 | ] 31 | ) 32 | -------------------------------------------------------------------------------- /Sources/DayPeriodFormatter/DayPeriodRuleSet.swift: -------------------------------------------------------------------------------- 1 | struct DayPeriodRuleSet { 2 | 3 | /// https://unicode.org/reports/tr35/tr35-dates.html#Fixed_periods 4 | var fixedPeriodsByHour: [Int: DayPeriod] = [:] 5 | 6 | /// https://unicode.org/reports/tr35/tr35-dates.html#Variable_periods 7 | var sortedVariablePeriods: [(period: DayPeriod, startHour: Int)] = [] 8 | 9 | func period(for hour: Int) -> DayPeriod { 10 | 11 | // Prefer fixed period if it exists 12 | if let fixedPeriod = fixedPeriodsByHour[hour] { 13 | return fixedPeriod 14 | } 15 | 16 | // Find latest variable period starting not later than 'hour' 17 | let latestVariablePeriod = sortedVariablePeriods.last { $0.startHour <= hour } 18 | if let period = latestVariablePeriod { 19 | return period.period 20 | } 21 | 22 | // When all variable periods start after the hour use 23 | // period overlapping the day boundary – which is the last period 24 | let dayBoundaryOverlappingPeriod = sortedVariablePeriods.last! 25 | return dayBoundaryOverlappingPeriod.period 26 | } 27 | } 28 | 29 | // MARK: - ExpressibleByDictionaryLiteral 30 | 31 | extension DayPeriodRuleSet: ExpressibleByDictionaryLiteral { 32 | init(dictionaryLiteral elements: (DayPeriod, DayPeriodRule)...) { 33 | for (period, rule) in elements { 34 | switch rule { 35 | case .at(let time): 36 | fixedPeriodsByHour[time] = period 37 | case .range(let from): 38 | sortedVariablePeriods.append((period, from)) 39 | } 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /Sources/DayPeriodFormatter/DayPeriodFormatter.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | public final class DayPeriodFormatter: Formatter { 4 | @objc public var locale: Locale? 5 | 6 | // MARK: - 7 | 8 | public override init() { 9 | super.init() 10 | self.locale = nil 11 | } 12 | 13 | @objc public func string(from dateComponents: DateComponents) -> String? { 14 | guard let hour = dateComponents.hour else { 15 | return nil 16 | } 17 | 18 | let locale = self.locale ?? .current 19 | if let languageCode = locale.languageCode, 20 | let ruleSet = DayPeriodFormatter.ruleSetsByLanguageCode[languageCode] { 21 | return string(for: ruleSet.period(for: hour), languageCode: languageCode) 22 | } 23 | 24 | return nil 25 | } 26 | 27 | @objc public func string(from date: Date, in calendar: Calendar = .current) -> String? { 28 | return string(from: calendar.dateComponents([.hour, .minute], from: date)) 29 | } 30 | 31 | // MARK: Formatter 32 | 33 | public override func string(for object: Any?) -> String? { 34 | switch object { 35 | case let dateComponents as DateComponents: 36 | return string(from: dateComponents) 37 | case let date as Date: 38 | return string(from: date) 39 | case let timeZone as TimeZone: 40 | let dateComponents = Calendar.current.dateComponents(in: timeZone, from: Date()) 41 | return string(from: dateComponents) 42 | default: 43 | return nil 44 | } 45 | } 46 | 47 | public override func getObjectValue(_: AutoreleasingUnsafeMutablePointer?, for _: String, errorDescription _: AutoreleasingUnsafeMutablePointer?) -> Bool { 48 | return false 49 | } 50 | 51 | // MARK: NSCoding 52 | 53 | public required init?(coder: NSCoder) { 54 | super.init(coder: coder) 55 | self.locale = coder.decodeObject(forKey: #keyPath(locale)) as? Locale 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /Sources/DayPeriodFormatter/DayPeriodFormatter+RuleSets.swift.gyb: -------------------------------------------------------------------------------- 1 | % warning = "This file was automatically generated and should not be edited." 2 | // ${warning} 3 | %{ 4 | # encoding=utf8 5 | import sys 6 | reload(sys) 7 | sys.setdefaultencoding('utf8') 8 | }% 9 | 10 | %{ 11 | import os 12 | import re 13 | import xml.etree.ElementTree as ET 14 | 15 | tree = ET.parse(os.getcwd() + "/../../Resources/dayPeriods-processed.xml") 16 | }% 17 | extension DayPeriodFormatter { 18 | static let ruleSetsByLanguageCode: [String: DayPeriodRuleSet] = [ 19 | % for dayPeriodRules in sorted(tree.iterfind(".//dayPeriodRuleSet[1]//*[@string]/.."), key=lambda rule: rule.get('locales')): 20 | %{ locales = dayPeriodRules.get('locales') }% 21 | % if locales and locales != "root": 22 | % for locale in locales.split(): 23 | "${locale}": [ 24 | % for dayPeriodRule in sorted(dayPeriodRules.iterfind("./dayPeriodRule"), key=lambda rule: rule.get('from')): 25 | %{ 26 | type = dayPeriodRule.get('type') 27 | atTime = dayPeriodRule.get('at') 28 | fromTime = dayPeriodRule.get('from') }% 29 | % if type: 30 | % if atTime: 31 | .${type}: .at(time: ${re.sub(':00$', '', atTime)}), 32 | % elif fromTime: 33 | .${type}: .range(from: ${re.sub(':00$', '', fromTime)}), 34 | % end 35 | % end 36 | % end 37 | ], 38 | % end 39 | % end 40 | % end 41 | ] 42 | 43 | func string(for period: DayPeriod, languageCode: String) -> String? { 44 | switch languageCode { 45 | % for dayPeriodRules in sorted(tree.iterfind(".//dayPeriodRuleSet[1]//*[@string]/.."), key=lambda rule: rule.get('locales')): 46 | %{ locales = dayPeriodRules.get('locales') }% 47 | % if locales and locales != "root": 48 | % for locale in locales.split(): 49 | case "${locale}": 50 | switch period { 51 | % for dayPeriodRule in dayPeriodRules.iterfind("./dayPeriodRule"): 52 | %{ 53 | type = dayPeriodRule.get('type') 54 | string = dayPeriodRule.get('string') }% 55 | % if type and string: 56 | case .${type}: return "${string}" 57 | % end 58 | % end 59 | default: 60 | return nil 61 | } 62 | % end 63 | % end 64 | % end 65 | default: 66 | return nil 67 | } 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /Tests/DayPeriodFormatterTests/DayPeriodFormatterTests.swift: -------------------------------------------------------------------------------- 1 | @testable import DayPeriodFormatter 2 | import Foundation 3 | import XCTest 4 | 5 | final class DayPeriodFormatterTests: XCTestCase { 6 | var formatter = DayPeriodFormatter() 7 | 8 | func testStringForDateComponents() { 9 | formatter.locale = Locale(identifier: "en") 10 | 11 | let midnightDateComponents = DateComponents(hour: 0, minute: 0) 12 | let morningDateComponents = DateComponents(hour: 9, minute: 41) 13 | let noonDateComponents = DateComponents(hour: 12, minute: 00) 14 | let afternoonDateComponents = DateComponents(hour: 13, minute: 37) 15 | let eveningDateComponents = DateComponents(hour: 19, minute: 58) 16 | let nightDateComponents = DateComponents(hour: 23, minute: 11) 17 | 18 | XCTAssertEqual("midnight", formatter.string(from: midnightDateComponents)) 19 | XCTAssertEqual("morning", formatter.string(from: morningDateComponents)) 20 | XCTAssertEqual("noon", formatter.string(from: noonDateComponents)) 21 | XCTAssertEqual("afternoon", formatter.string(from: afternoonDateComponents)) 22 | XCTAssertEqual("evening", formatter.string(from: eveningDateComponents)) 23 | XCTAssertEqual("night", formatter.string(from: nightDateComponents)) 24 | } 25 | 26 | func testStringForNonEnglishLocale() { 27 | formatter.locale = Locale(identifier: "te") 28 | 29 | let morningDateComponents = DateComponents(hour: 9, minute: 41) 30 | let afternoonDateComponents = DateComponents(hour: 13, minute: 37) 31 | let eveningDateComponents = DateComponents(hour: 19, minute: 58) 32 | let nightDateComponents = DateComponents(hour: 23, minute: 11) 33 | 34 | XCTAssertEqual("ఉదయం", formatter.string(from: morningDateComponents)) 35 | XCTAssertEqual("మధ్యాహ్నం", formatter.string(from: afternoonDateComponents)) 36 | XCTAssertEqual("సాయంత్రం", formatter.string(from: eveningDateComponents)) 37 | XCTAssertEqual("రాత్రి", formatter.string(from: nightDateComponents)) 38 | } 39 | 40 | func testDayBoundaryCase() { 41 | let ruleSet = DayPeriodFormatter.ruleSetsByLanguageCode["hu"]! 42 | XCTAssertEqual(ruleSet.period(for: 21), .night1) 43 | XCTAssertEqual(ruleSet.period(for: 0), .midnight) 44 | XCTAssertEqual(ruleSet.period(for: 3), .night1) 45 | XCTAssertEqual(ruleSet.period(for: 4), .night2) 46 | XCTAssertEqual(ruleSet.period(for: 5), .night2) 47 | XCTAssertEqual(ruleSet.period(for: 6), .morning1) 48 | } 49 | 50 | func testAllSetsHavePeriodRules() { 51 | XCTAssertFalse(DayPeriodFormatter.ruleSetsByLanguageCode.values.contains { $0.sortedVariablePeriods.isEmpty }) 52 | } 53 | 54 | func testAllRuleSetsAreComplete() { 55 | for languageCode in DayPeriodFormatter.ruleSetsByLanguageCode.keys { 56 | let formatter = DayPeriodFormatter() 57 | formatter.locale = Locale(identifier: languageCode) 58 | 59 | for hour in 0..<24 { 60 | XCTAssertNotNil(formatter.string(from: DateComponents(hour: hour)), "Missing value for languageCode: \"\(languageCode)\", hour: \(hour)") 61 | } 62 | } 63 | } 64 | 65 | static var allTests = [ 66 | ("testStringForDateComponents", testStringForDateComponents), 67 | ("testStringForNonEnglishLocale", testStringForNonEnglishLocale), 68 | ("testDayBoundaryCase", testDayBoundaryCase), 69 | ("testAllSetsHavePeriodRules", testAllSetsHavePeriodRules) 70 | ] 71 | } 72 | -------------------------------------------------------------------------------- /Sources/DayPeriodFormatter/DayPeriodFormatter+RuleSets.swift: -------------------------------------------------------------------------------- 1 | // This file was automatically generated and should not be edited. 2 | 3 | extension DayPeriodFormatter { 4 | static let ruleSetsByLanguageCode: [String: DayPeriodRuleSet] = [ 5 | "af": [ 6 | .midnight: .at(time: 00), 7 | .night1: .range(from: 00), 8 | .morning1: .range(from: 05), 9 | .afternoon1: .range(from: 12), 10 | .evening1: .range(from: 18), 11 | ], 12 | "am": [ 13 | .midnight: .at(time: 00), 14 | .noon: .at(time: 12), 15 | .night1: .range(from: 00), 16 | .morning1: .range(from: 06), 17 | .afternoon1: .range(from: 12), 18 | .evening1: .range(from: 18), 19 | ], 20 | "ar": [ 21 | .night1: .range(from: 00), 22 | .night2: .range(from: 01), 23 | .morning1: .range(from: 03), 24 | .morning2: .range(from: 06), 25 | .afternoon1: .range(from: 12), 26 | .afternoon2: .range(from: 13), 27 | .evening1: .range(from: 18), 28 | ], 29 | "az": [ 30 | .midnight: .at(time: 00), 31 | .noon: .at(time: 12), 32 | .night2: .range(from: 00), 33 | .morning1: .range(from: 04), 34 | .morning2: .range(from: 06), 35 | .afternoon1: .range(from: 12), 36 | .evening1: .range(from: 17), 37 | .night1: .range(from: 19), 38 | ], 39 | "bg": [ 40 | .midnight: .at(time: 00), 41 | .morning1: .range(from: 04), 42 | .morning2: .range(from: 11), 43 | .afternoon1: .range(from: 14), 44 | .evening1: .range(from: 18), 45 | .night1: .range(from: 22), 46 | ], 47 | "bn": [ 48 | .morning1: .range(from: 04), 49 | .morning2: .range(from: 06), 50 | .afternoon1: .range(from: 12), 51 | .afternoon2: .range(from: 16), 52 | .evening1: .range(from: 18), 53 | .night1: .range(from: 20), 54 | ], 55 | "ccp": [ 56 | .morning1: .range(from: 04), 57 | .morning2: .range(from: 06), 58 | .afternoon1: .range(from: 12), 59 | .afternoon2: .range(from: 16), 60 | .evening1: .range(from: 18), 61 | .night1: .range(from: 20), 62 | ], 63 | "bs": [ 64 | .midnight: .at(time: 00), 65 | .noon: .at(time: 12), 66 | .morning1: .range(from: 04), 67 | .afternoon1: .range(from: 12), 68 | .evening1: .range(from: 18), 69 | .night1: .range(from: 21), 70 | ], 71 | "ca": [ 72 | .midnight: .at(time: 00), 73 | .morning1: .range(from: 00), 74 | .morning2: .range(from: 06), 75 | .afternoon1: .range(from: 12), 76 | .afternoon2: .range(from: 13), 77 | .evening1: .range(from: 19), 78 | .night1: .range(from: 21), 79 | ], 80 | "chr": [ 81 | .noon: .at(time: 12), 82 | .morning1: .range(from: 00), 83 | .afternoon1: .range(from: 12), 84 | ], 85 | "cs": [ 86 | .midnight: .at(time: 00), 87 | .noon: .at(time: 12), 88 | .morning1: .range(from: 04), 89 | .morning2: .range(from: 09), 90 | .afternoon1: .range(from: 12), 91 | .evening1: .range(from: 18), 92 | .night1: .range(from: 22), 93 | ], 94 | "cy": [ 95 | .midnight: .at(time: 00), 96 | .noon: .at(time: 12), 97 | .morning1: .range(from: 00), 98 | .afternoon1: .range(from: 12), 99 | .evening1: .range(from: 18), 100 | ], 101 | "da": [ 102 | .midnight: .at(time: 00), 103 | .night1: .range(from: 00), 104 | .morning1: .range(from: 05), 105 | .morning2: .range(from: 10), 106 | .afternoon1: .range(from: 12), 107 | .evening1: .range(from: 18), 108 | ], 109 | "de": [ 110 | .midnight: .at(time: 00), 111 | .night1: .range(from: 00), 112 | .morning1: .range(from: 05), 113 | .morning2: .range(from: 10), 114 | .afternoon1: .range(from: 12), 115 | .afternoon2: .range(from: 13), 116 | .evening1: .range(from: 18), 117 | ], 118 | "el": [ 119 | .morning1: .range(from: 04), 120 | .afternoon1: .range(from: 12), 121 | .evening1: .range(from: 17), 122 | .night1: .range(from: 20), 123 | ], 124 | "en": [ 125 | .midnight: .at(time: 00), 126 | .noon: .at(time: 12), 127 | .morning1: .range(from: 06), 128 | .afternoon1: .range(from: 12), 129 | .evening1: .range(from: 18), 130 | .night1: .range(from: 21), 131 | ], 132 | "es": [ 133 | .noon: .at(time: 12), 134 | .morning1: .range(from: 00), 135 | .morning2: .range(from: 06), 136 | .evening1: .range(from: 12), 137 | .night1: .range(from: 20), 138 | ], 139 | "es_CO": [ 140 | .noon: .at(time: 12), 141 | .morning2: .range(from: 00), 142 | .evening1: .range(from: 12), 143 | .night1: .range(from: 20), 144 | ], 145 | "et": [ 146 | .midnight: .at(time: 00), 147 | .noon: .at(time: 12), 148 | .morning1: .range(from: 05), 149 | .afternoon1: .range(from: 12), 150 | .evening1: .range(from: 18), 151 | .night1: .range(from: 23), 152 | ], 153 | "eu": [ 154 | .midnight: .at(time: 00), 155 | .morning1: .range(from: 00), 156 | .morning2: .range(from: 06), 157 | .afternoon1: .range(from: 12), 158 | .afternoon2: .range(from: 14), 159 | .evening1: .range(from: 19), 160 | .night1: .range(from: 21), 161 | ], 162 | "fa": [ 163 | .night2: .range(from: 00), 164 | .morning1: .range(from: 01), 165 | .morning2: .range(from: 04), 166 | .afternoon1: .range(from: 12), 167 | .afternoon2: .range(from: 13), 168 | .night1: .range(from: 19), 169 | ], 170 | "fi": [ 171 | .midnight: .at(time: 00), 172 | .noon: .at(time: 12), 173 | .morning1: .range(from: 05), 174 | .morning2: .range(from: 10), 175 | .afternoon1: .range(from: 12), 176 | .evening1: .range(from: 18), 177 | .night1: .range(from: 23), 178 | ], 179 | "fil": [ 180 | .midnight: .at(time: 00), 181 | .noon: .at(time: 12), 182 | .morning1: .range(from: 00), 183 | .morning2: .range(from: 06), 184 | .afternoon1: .range(from: 12), 185 | .evening1: .range(from: 16), 186 | .night1: .range(from: 18), 187 | ], 188 | "fr": [ 189 | .midnight: .at(time: 00), 190 | .noon: .at(time: 12), 191 | .night1: .range(from: 00), 192 | .morning1: .range(from: 04), 193 | .afternoon1: .range(from: 12), 194 | .evening1: .range(from: 18), 195 | ], 196 | "gl": [ 197 | .midnight: .at(time: 00), 198 | .morning1: .range(from: 00), 199 | .morning2: .range(from: 06), 200 | .afternoon1: .range(from: 12), 201 | .evening1: .range(from: 13), 202 | .night1: .range(from: 21), 203 | ], 204 | "gsw": [ 205 | .midnight: .at(time: 00), 206 | .night1: .range(from: 00), 207 | .morning1: .range(from: 05), 208 | .afternoon1: .range(from: 12), 209 | .afternoon2: .range(from: 14), 210 | .evening1: .range(from: 18), 211 | ], 212 | "gu": [ 213 | .midnight: .at(time: 00), 214 | .morning1: .range(from: 04), 215 | .afternoon1: .range(from: 12), 216 | .evening1: .range(from: 16), 217 | .night1: .range(from: 20), 218 | ], 219 | "he": [ 220 | .midnight: .at(time: 00), 221 | .night2: .range(from: 03), 222 | .morning1: .range(from: 06), 223 | .afternoon1: .range(from: 12), 224 | .afternoon2: .range(from: 16), 225 | .evening1: .range(from: 18), 226 | .night1: .range(from: 22), 227 | ], 228 | "hi": [ 229 | .midnight: .at(time: 00), 230 | .morning1: .range(from: 04), 231 | .afternoon1: .range(from: 12), 232 | .evening1: .range(from: 16), 233 | .night1: .range(from: 20), 234 | ], 235 | "hr": [ 236 | .midnight: .at(time: 00), 237 | .noon: .at(time: 12), 238 | .morning1: .range(from: 04), 239 | .afternoon1: .range(from: 12), 240 | .evening1: .range(from: 18), 241 | .night1: .range(from: 21), 242 | ], 243 | "hu": [ 244 | .midnight: .at(time: 00), 245 | .noon: .at(time: 12), 246 | .night2: .range(from: 04), 247 | .morning1: .range(from: 06), 248 | .morning2: .range(from: 09), 249 | .afternoon1: .range(from: 12), 250 | .evening1: .range(from: 18), 251 | .night1: .range(from: 21), 252 | ], 253 | "hy": [ 254 | .midnight: .at(time: 00), 255 | .noon: .at(time: 12), 256 | .night1: .range(from: 00), 257 | .morning1: .range(from: 06), 258 | .afternoon1: .range(from: 12), 259 | .evening1: .range(from: 18), 260 | ], 261 | "id": [ 262 | .midnight: .at(time: 00), 263 | .noon: .at(time: 12), 264 | .morning1: .range(from: 00), 265 | .afternoon1: .range(from: 10), 266 | .evening1: .range(from: 15), 267 | .night1: .range(from: 18), 268 | ], 269 | "is": [ 270 | .midnight: .at(time: 00), 271 | .noon: .at(time: 12), 272 | .night1: .range(from: 00), 273 | .morning1: .range(from: 06), 274 | .afternoon1: .range(from: 12), 275 | .evening1: .range(from: 18), 276 | ], 277 | "it": [ 278 | .midnight: .at(time: 00), 279 | .noon: .at(time: 12), 280 | .night1: .range(from: 00), 281 | .morning1: .range(from: 06), 282 | .afternoon1: .range(from: 12), 283 | .evening1: .range(from: 18), 284 | ], 285 | "ja": [ 286 | .midnight: .at(time: 00), 287 | .noon: .at(time: 12), 288 | .morning1: .range(from: 04), 289 | .afternoon1: .range(from: 12), 290 | .evening1: .range(from: 16), 291 | .night1: .range(from: 19), 292 | .night2: .range(from: 23), 293 | ], 294 | "ka": [ 295 | .midnight: .at(time: 00), 296 | .noon: .at(time: 12), 297 | .morning1: .range(from: 05), 298 | .afternoon1: .range(from: 12), 299 | .evening1: .range(from: 18), 300 | .night1: .range(from: 21), 301 | ], 302 | "kk": [ 303 | .midnight: .at(time: 00), 304 | .noon: .at(time: 12), 305 | .morning1: .range(from: 06), 306 | .afternoon1: .range(from: 12), 307 | .evening1: .range(from: 18), 308 | .night1: .range(from: 21), 309 | ], 310 | "km": [ 311 | .midnight: .at(time: 00), 312 | .noon: .at(time: 12), 313 | .morning1: .range(from: 00), 314 | .afternoon1: .range(from: 12), 315 | .evening1: .range(from: 18), 316 | .night1: .range(from: 21), 317 | ], 318 | "kn": [ 319 | .midnight: .at(time: 00), 320 | .morning1: .range(from: 06), 321 | .afternoon1: .range(from: 12), 322 | .evening1: .range(from: 18), 323 | .night1: .range(from: 21), 324 | ], 325 | "ko": [ 326 | .midnight: .at(time: 00), 327 | .noon: .at(time: 12), 328 | .morning1: .range(from: 03), 329 | .morning2: .range(from: 06), 330 | .afternoon1: .range(from: 12), 331 | .evening1: .range(from: 18), 332 | .night1: .range(from: 21), 333 | ], 334 | "ky": [ 335 | .midnight: .at(time: 00), 336 | .noon: .at(time: 12), 337 | .morning1: .range(from: 06), 338 | .afternoon1: .range(from: 12), 339 | .evening1: .range(from: 18), 340 | .night1: .range(from: 21), 341 | ], 342 | "lo": [ 343 | .midnight: .at(time: 00), 344 | .noon: .at(time: 12), 345 | .morning1: .range(from: 05), 346 | .afternoon1: .range(from: 12), 347 | .evening1: .range(from: 16), 348 | .night1: .range(from: 20), 349 | ], 350 | "lt": [ 351 | .midnight: .at(time: 00), 352 | .noon: .at(time: 12), 353 | .night1: .range(from: 00), 354 | .morning1: .range(from: 06), 355 | .afternoon1: .range(from: 12), 356 | .evening1: .range(from: 18), 357 | ], 358 | "lv": [ 359 | .midnight: .at(time: 00), 360 | .noon: .at(time: 12), 361 | .morning1: .range(from: 06), 362 | .afternoon1: .range(from: 12), 363 | .evening1: .range(from: 18), 364 | .night1: .range(from: 23), 365 | ], 366 | "mk": [ 367 | .midnight: .at(time: 00), 368 | .noon: .at(time: 12), 369 | .night1: .range(from: 00), 370 | .morning1: .range(from: 04), 371 | .morning2: .range(from: 10), 372 | .afternoon1: .range(from: 12), 373 | .evening1: .range(from: 18), 374 | ], 375 | "ml": [ 376 | .midnight: .at(time: 00), 377 | .noon: .at(time: 12), 378 | .morning1: .range(from: 03), 379 | .morning2: .range(from: 06), 380 | .afternoon1: .range(from: 12), 381 | .afternoon2: .range(from: 14), 382 | .evening1: .range(from: 15), 383 | .evening2: .range(from: 18), 384 | .night1: .range(from: 19), 385 | ], 386 | "mn": [ 387 | .midnight: .at(time: 00), 388 | .noon: .at(time: 12), 389 | .morning1: .range(from: 06), 390 | .afternoon1: .range(from: 12), 391 | .evening1: .range(from: 18), 392 | .night1: .range(from: 21), 393 | ], 394 | "mr": [ 395 | .midnight: .at(time: 00), 396 | .noon: .at(time: 12), 397 | .morning1: .range(from: 04), 398 | .morning2: .range(from: 06), 399 | .afternoon1: .range(from: 12), 400 | .evening1: .range(from: 16), 401 | .evening2: .range(from: 18), 402 | .night1: .range(from: 21), 403 | ], 404 | "ms": [ 405 | .morning1: .range(from: 00), 406 | .morning2: .range(from: 01), 407 | .afternoon1: .range(from: 12), 408 | .evening1: .range(from: 14), 409 | .night1: .range(from: 19), 410 | ], 411 | "my": [ 412 | .midnight: .at(time: 00), 413 | .noon: .at(time: 12), 414 | .morning1: .range(from: 00), 415 | .afternoon1: .range(from: 12), 416 | .evening1: .range(from: 16), 417 | .night1: .range(from: 19), 418 | ], 419 | "nb": [ 420 | .midnight: .at(time: 00), 421 | .night1: .range(from: 00), 422 | .morning1: .range(from: 06), 423 | .morning2: .range(from: 10), 424 | .afternoon1: .range(from: 12), 425 | .evening1: .range(from: 18), 426 | ], 427 | "ne": [ 428 | .midnight: .at(time: 00), 429 | .noon: .at(time: 12), 430 | .morning1: .range(from: 04), 431 | .afternoon1: .range(from: 12), 432 | .afternoon2: .range(from: 16), 433 | .evening1: .range(from: 19), 434 | .night1: .range(from: 22), 435 | ], 436 | "nl": [ 437 | .midnight: .at(time: 00), 438 | .night1: .range(from: 00), 439 | .morning1: .range(from: 06), 440 | .afternoon1: .range(from: 12), 441 | .evening1: .range(from: 18), 442 | ], 443 | "pa": [ 444 | .midnight: .at(time: 00), 445 | .morning1: .range(from: 04), 446 | .afternoon1: .range(from: 12), 447 | .evening1: .range(from: 16), 448 | .night1: .range(from: 21), 449 | ], 450 | "pl": [ 451 | .midnight: .at(time: 00), 452 | .noon: .at(time: 12), 453 | .morning1: .range(from: 06), 454 | .morning2: .range(from: 10), 455 | .afternoon1: .range(from: 12), 456 | .evening1: .range(from: 18), 457 | .night1: .range(from: 21), 458 | ], 459 | "pt": [ 460 | .midnight: .at(time: 00), 461 | .noon: .at(time: 12), 462 | .night1: .range(from: 00), 463 | .morning1: .range(from: 06), 464 | .afternoon1: .range(from: 12), 465 | .evening1: .range(from: 19), 466 | ], 467 | "ro": [ 468 | .midnight: .at(time: 00), 469 | .noon: .at(time: 12), 470 | .morning1: .range(from: 05), 471 | .afternoon1: .range(from: 12), 472 | .evening1: .range(from: 18), 473 | .night1: .range(from: 22), 474 | ], 475 | "ru": [ 476 | .midnight: .at(time: 00), 477 | .noon: .at(time: 12), 478 | .night1: .range(from: 00), 479 | .morning1: .range(from: 04), 480 | .afternoon1: .range(from: 12), 481 | .evening1: .range(from: 18), 482 | ], 483 | "si": [ 484 | .midnight: .at(time: 00), 485 | .noon: .at(time: 12), 486 | .night2: .range(from: 00), 487 | .morning1: .range(from: 01), 488 | .morning2: .range(from: 06), 489 | .afternoon1: .range(from: 12), 490 | .evening1: .range(from: 14), 491 | .night1: .range(from: 18), 492 | ], 493 | "sk": [ 494 | .midnight: .at(time: 00), 495 | .noon: .at(time: 12), 496 | .morning1: .range(from: 04), 497 | .morning2: .range(from: 09), 498 | .afternoon1: .range(from: 12), 499 | .evening1: .range(from: 18), 500 | .night1: .range(from: 22), 501 | ], 502 | "sl": [ 503 | .midnight: .at(time: 00), 504 | .noon: .at(time: 12), 505 | .morning1: .range(from: 06), 506 | .morning2: .range(from: 10), 507 | .afternoon1: .range(from: 12), 508 | .evening1: .range(from: 18), 509 | .night1: .range(from: 22), 510 | ], 511 | "sq": [ 512 | .midnight: .at(time: 00), 513 | .noon: .at(time: 12), 514 | .night1: .range(from: 00), 515 | .morning1: .range(from: 04), 516 | .morning2: .range(from: 09), 517 | .afternoon1: .range(from: 12), 518 | .evening1: .range(from: 18), 519 | ], 520 | "sr": [ 521 | .midnight: .at(time: 00), 522 | .noon: .at(time: 12), 523 | .morning1: .range(from: 06), 524 | .afternoon1: .range(from: 12), 525 | .evening1: .range(from: 18), 526 | .night1: .range(from: 21), 527 | ], 528 | "sv": [ 529 | .midnight: .at(time: 00), 530 | .night1: .range(from: 00), 531 | .morning1: .range(from: 05), 532 | .morning2: .range(from: 10), 533 | .afternoon1: .range(from: 12), 534 | .evening1: .range(from: 18), 535 | ], 536 | "sw": [ 537 | .midnight: .at(time: 00), 538 | .noon: .at(time: 12), 539 | .morning1: .range(from: 04), 540 | .morning2: .range(from: 07), 541 | .afternoon1: .range(from: 12), 542 | .evening1: .range(from: 16), 543 | .night1: .range(from: 19), 544 | ], 545 | "ta": [ 546 | .midnight: .at(time: 00), 547 | .noon: .at(time: 12), 548 | .morning1: .range(from: 03), 549 | .morning2: .range(from: 05), 550 | .afternoon1: .range(from: 12), 551 | .afternoon2: .range(from: 14), 552 | .evening1: .range(from: 16), 553 | .evening2: .range(from: 18), 554 | .night1: .range(from: 21), 555 | ], 556 | "te": [ 557 | .midnight: .at(time: 00), 558 | .morning1: .range(from: 06), 559 | .afternoon1: .range(from: 12), 560 | .evening1: .range(from: 18), 561 | .night1: .range(from: 21), 562 | ], 563 | "th": [ 564 | .midnight: .at(time: 00), 565 | .noon: .at(time: 12), 566 | .morning1: .range(from: 06), 567 | .afternoon1: .range(from: 12), 568 | .afternoon2: .range(from: 13), 569 | .evening1: .range(from: 16), 570 | .evening2: .range(from: 18), 571 | .night1: .range(from: 21), 572 | ], 573 | "tr": [ 574 | .midnight: .at(time: 00), 575 | .noon: .at(time: 12), 576 | .morning1: .range(from: 06), 577 | .morning2: .range(from: 11), 578 | .afternoon1: .range(from: 12), 579 | .afternoon2: .range(from: 18), 580 | .evening1: .range(from: 19), 581 | .night1: .range(from: 21), 582 | ], 583 | "uk": [ 584 | .midnight: .at(time: 00), 585 | .noon: .at(time: 12), 586 | .night1: .range(from: 00), 587 | .morning1: .range(from: 04), 588 | .afternoon1: .range(from: 12), 589 | .evening1: .range(from: 18), 590 | ], 591 | "ur": [ 592 | .midnight: .at(time: 00), 593 | .morning1: .range(from: 04), 594 | .afternoon1: .range(from: 12), 595 | .afternoon2: .range(from: 16), 596 | .evening1: .range(from: 18), 597 | .night1: .range(from: 20), 598 | ], 599 | "uz": [ 600 | .midnight: .at(time: 00), 601 | .noon: .at(time: 12), 602 | .morning1: .range(from: 06), 603 | .afternoon1: .range(from: 11), 604 | .evening1: .range(from: 18), 605 | .night1: .range(from: 22), 606 | ], 607 | "vi": [ 608 | .midnight: .at(time: 00), 609 | .noon: .at(time: 12), 610 | .morning1: .range(from: 04), 611 | .afternoon1: .range(from: 12), 612 | .evening1: .range(from: 18), 613 | .night1: .range(from: 21), 614 | ], 615 | "yue": [ 616 | .midnight: .at(time: 00), 617 | .night1: .range(from: 00), 618 | .morning1: .range(from: 05), 619 | .morning2: .range(from: 08), 620 | .afternoon1: .range(from: 12), 621 | .afternoon2: .range(from: 13), 622 | .evening1: .range(from: 19), 623 | ], 624 | "zh": [ 625 | .midnight: .at(time: 00), 626 | .night1: .range(from: 00), 627 | .morning1: .range(from: 05), 628 | .morning2: .range(from: 08), 629 | .afternoon1: .range(from: 12), 630 | .afternoon2: .range(from: 13), 631 | .evening1: .range(from: 19), 632 | ], 633 | "zu": [ 634 | .morning1: .range(from: 00), 635 | .morning2: .range(from: 06), 636 | .afternoon1: .range(from: 10), 637 | .evening1: .range(from: 13), 638 | .night1: .range(from: 19), 639 | ], 640 | ] 641 | 642 | func string(for period: DayPeriod, languageCode: String) -> String? { 643 | switch languageCode { 644 | case "af": 645 | switch period { 646 | case .midnight: return "middernag" 647 | case .morning1: return "oggend" 648 | case .afternoon1: return "middag" 649 | case .evening1: return "aand" 650 | case .night1: return "nag" 651 | default: 652 | return nil 653 | } 654 | case "am": 655 | switch period { 656 | case .midnight: return "እኩለ ሌሊት" 657 | case .noon: return "ቀትር" 658 | case .morning1: return "ጥዋት1" 659 | case .afternoon1: return "ከሰዓት በኋላ" 660 | case .evening1: return "ማታ" 661 | case .night1: return "ሌሊት" 662 | default: 663 | return nil 664 | } 665 | case "ar": 666 | switch period { 667 | case .morning1: return "فجرا" 668 | case .morning2: return "صباحًا" 669 | case .afternoon1: return "ظهرًا" 670 | case .afternoon2: return "بعد الظهر" 671 | case .evening1: return "مساءً" 672 | case .night1: return "منتصف الليل" 673 | case .night2: return "ليلاً" 674 | default: 675 | return nil 676 | } 677 | case "az": 678 | switch period { 679 | case .midnight: return "gecəyarı" 680 | case .noon: return "günorta" 681 | case .morning1: return "sübh" 682 | case .morning2: return "səhər" 683 | case .afternoon1: return "gündüz" 684 | case .evening1: return "axşamüstü" 685 | case .night1: return "axşam" 686 | case .night2: return "gecə" 687 | default: 688 | return nil 689 | } 690 | case "bg": 691 | switch period { 692 | case .midnight: return "полунощ" 693 | case .morning1: return "сутринта" 694 | case .morning2: return "на обед" 695 | case .afternoon1: return "следобед" 696 | case .evening1: return "вечерта" 697 | case .night1: return "нощ" 698 | default: 699 | return nil 700 | } 701 | case "bn": 702 | switch period { 703 | case .morning1: return "ভোর" 704 | case .morning2: return "সকাল" 705 | case .afternoon1: return "দুপুর" 706 | case .afternoon2: return "বিকাল" 707 | case .evening1: return "সন্ধ্যা" 708 | case .night1: return "রাত্রি" 709 | default: 710 | return nil 711 | } 712 | case "ccp": 713 | switch period { 714 | case .morning1: return "ভোর" 715 | case .morning2: return "সকাল" 716 | case .afternoon1: return "দুপুর" 717 | case .afternoon2: return "বিকাল" 718 | case .evening1: return "সন্ধ্যা" 719 | case .night1: return "রাত্রি" 720 | default: 721 | return nil 722 | } 723 | case "bs": 724 | switch period { 725 | case .midnight: return "u ponoć" 726 | case .noon: return "podne" 727 | case .morning1: return "jutro" 728 | case .afternoon1: return "poslijepodne" 729 | case .evening1: return "veče" 730 | case .night1: return "noć" 731 | default: 732 | return nil 733 | } 734 | case "ca": 735 | switch period { 736 | case .midnight: return "mitjanit" 737 | case .morning1: return "matinada" 738 | case .morning2: return "matí" 739 | case .afternoon1: return "migdia" 740 | case .afternoon2: return "tarda" 741 | case .evening1: return "vespre" 742 | case .night1: return "nit" 743 | default: 744 | return nil 745 | } 746 | case "chr": 747 | switch period { 748 | case .noon: return "ᎢᎦ" 749 | case .morning1: return "ᏌᎾᎴ" 750 | case .afternoon1: return "ᏒᎯᏱᎢᏗᏢ" 751 | default: 752 | return nil 753 | } 754 | case "cs": 755 | switch period { 756 | case .midnight: return "půlnoc" 757 | case .noon: return "poledne" 758 | case .morning1: return "ráno" 759 | case .morning2: return "dopoledne" 760 | case .afternoon1: return "odpoledne" 761 | case .evening1: return "večer" 762 | case .night1: return "noc" 763 | default: 764 | return nil 765 | } 766 | case "cy": 767 | switch period { 768 | case .midnight: return "midnight" 769 | case .noon: return "noon" 770 | case .morning1: return "morning" 771 | case .afternoon1: return "afternoon" 772 | case .evening1: return "evening" 773 | default: 774 | return nil 775 | } 776 | case "da": 777 | switch period { 778 | case .midnight: return "midnat" 779 | case .morning1: return "morgen" 780 | case .morning2: return "formiddag" 781 | case .afternoon1: return "eftermiddag" 782 | case .evening1: return "aften" 783 | case .night1: return "nat" 784 | default: 785 | return nil 786 | } 787 | case "de": 788 | switch period { 789 | case .midnight: return "Mitternacht" 790 | case .morning1: return "Morgen" 791 | case .morning2: return "Vormittag" 792 | case .afternoon1: return "Mittag" 793 | case .afternoon2: return "Nachmittag" 794 | case .evening1: return "Abend" 795 | case .night1: return "Nacht" 796 | default: 797 | return nil 798 | } 799 | case "el": 800 | switch period { 801 | case .morning1: return "πρωί" 802 | case .afternoon1: return "μεσημέρι" 803 | case .evening1: return "απόγευμα" 804 | case .night1: return "βράδυ" 805 | default: 806 | return nil 807 | } 808 | case "en": 809 | switch period { 810 | case .midnight: return "midnight" 811 | case .noon: return "noon" 812 | case .morning1: return "morning" 813 | case .afternoon1: return "afternoon" 814 | case .evening1: return "evening" 815 | case .night1: return "night" 816 | default: 817 | return nil 818 | } 819 | case "es": 820 | switch period { 821 | case .noon: return "mediodía" 822 | case .morning1: return "madrugada" 823 | case .morning2: return "mañana" 824 | case .evening1: return "tarde" 825 | case .night1: return "noche" 826 | default: 827 | return nil 828 | } 829 | case "es_CO": 830 | switch period { 831 | case .noon: return "mediodía" 832 | case .morning2: return "mañana" 833 | case .evening1: return "tarde" 834 | case .night1: return "noche" 835 | default: 836 | return nil 837 | } 838 | case "et": 839 | switch period { 840 | case .midnight: return "kesköö" 841 | case .noon: return "keskpäev" 842 | case .morning1: return "hommik" 843 | case .afternoon1: return "pärastlõuna" 844 | case .evening1: return "õhtu" 845 | case .night1: return "öö" 846 | default: 847 | return nil 848 | } 849 | case "eu": 850 | switch period { 851 | case .midnight: return "gauerdia" 852 | case .morning1: return "goizaldea" 853 | case .morning2: return "goiza" 854 | case .afternoon1: return "eguerdia" 855 | case .afternoon2: return "arratsaldea" 856 | case .evening1: return "iluntzea" 857 | case .night1: return "gaua" 858 | default: 859 | return nil 860 | } 861 | case "fa": 862 | switch period { 863 | case .morning1: return "بامداد" 864 | case .morning2: return "صبح" 865 | case .afternoon1: return "ظهر" 866 | case .afternoon2: return "عصر" 867 | case .night1: return "شب" 868 | case .night2: return "نیمه‌شب" 869 | default: 870 | return nil 871 | } 872 | case "fi": 873 | switch period { 874 | case .midnight: return "keskiyö" 875 | case .noon: return "keskipäivä" 876 | case .morning1: return "aamu" 877 | case .morning2: return "aamupäivä" 878 | case .afternoon1: return "iltapäivä" 879 | case .evening1: return "ilta" 880 | case .night1: return "yö" 881 | default: 882 | return nil 883 | } 884 | case "fil": 885 | switch period { 886 | case .midnight: return "hatinggabi" 887 | case .noon: return "tanghaling-tapat" 888 | case .morning1: return "umaga" 889 | case .morning2: return "madaling-araw" 890 | case .afternoon1: return "tanghali" 891 | case .evening1: return "hapon" 892 | case .night1: return "gabi" 893 | default: 894 | return nil 895 | } 896 | case "fr": 897 | switch period { 898 | case .midnight: return "minuit" 899 | case .noon: return "midi" 900 | case .morning1: return "matin" 901 | case .afternoon1: return "après-midi" 902 | case .evening1: return "soir" 903 | case .night1: return "nuit" 904 | default: 905 | return nil 906 | } 907 | case "gl": 908 | switch period { 909 | case .midnight: return "medianoite" 910 | case .morning1: return "madrugada" 911 | case .morning2: return "mañá" 912 | case .afternoon1: return "mediodía" 913 | case .evening1: return "tarde" 914 | case .night1: return "noite" 915 | default: 916 | return nil 917 | } 918 | case "gsw": 919 | switch period { 920 | case .midnight: return "Mitternacht" 921 | case .morning1: return "Morge" 922 | case .afternoon1: return "Mittag" 923 | case .afternoon2: return "Namittag" 924 | case .evening1: return "Aabig" 925 | case .night1: return "Nacht" 926 | default: 927 | return nil 928 | } 929 | case "gu": 930 | switch period { 931 | case .midnight: return "મધ્યરાત્રિ" 932 | case .morning1: return "સવાર" 933 | case .afternoon1: return "બપોર" 934 | case .evening1: return "સાંજ" 935 | case .night1: return "રાત્રિ" 936 | default: 937 | return nil 938 | } 939 | case "he": 940 | switch period { 941 | case .midnight: return "חצות" 942 | case .morning1: return "בוקר" 943 | case .afternoon1: return "צהריים" 944 | case .afternoon2: return "אחר הצהריים" 945 | case .evening1: return "ערב" 946 | case .night1: return "לילה" 947 | case .night2: return "לפנות בוקר" 948 | default: 949 | return nil 950 | } 951 | case "hi": 952 | switch period { 953 | case .midnight: return "आधी रात" 954 | case .morning1: return "सुबह" 955 | case .afternoon1: return "दोपहर" 956 | case .evening1: return "शाम" 957 | case .night1: return "रात" 958 | default: 959 | return nil 960 | } 961 | case "hr": 962 | switch period { 963 | case .midnight: return "ponoć" 964 | case .noon: return "podne" 965 | case .morning1: return "jutro" 966 | case .afternoon1: return "popodne" 967 | case .evening1: return "večer" 968 | case .night1: return "noć" 969 | default: 970 | return nil 971 | } 972 | case "hu": 973 | switch period { 974 | case .midnight: return "éjfél" 975 | case .noon: return "dél" 976 | case .morning1: return "reggel" 977 | case .morning2: return "délelőtt" 978 | case .afternoon1: return "délután" 979 | case .evening1: return "este" 980 | case .night1: return "éjjel" 981 | case .night2: return "hajnal" 982 | default: 983 | return nil 984 | } 985 | case "hy": 986 | switch period { 987 | case .midnight: return "կեսգիշեր" 988 | case .noon: return "կեսօր" 989 | case .morning1: return "առավոտ" 990 | case .afternoon1: return "ցերեկ" 991 | case .evening1: return "երեկո" 992 | case .night1: return "գիշեր" 993 | default: 994 | return nil 995 | } 996 | case "id": 997 | switch period { 998 | case .midnight: return "tengah malam" 999 | case .noon: return "tengah hari" 1000 | case .morning1: return "pagi" 1001 | case .afternoon1: return "siang" 1002 | case .evening1: return "sore" 1003 | case .night1: return "malam" 1004 | default: 1005 | return nil 1006 | } 1007 | case "is": 1008 | switch period { 1009 | case .midnight: return "miðnætti" 1010 | case .noon: return "hádegi" 1011 | case .morning1: return "morgunn" 1012 | case .afternoon1: return "eftir hádegi" 1013 | case .evening1: return "kvöld" 1014 | case .night1: return "nótt" 1015 | default: 1016 | return nil 1017 | } 1018 | case "it": 1019 | switch period { 1020 | case .midnight: return "mezzanotte" 1021 | case .noon: return "mezzogiorno" 1022 | case .morning1: return "mattina" 1023 | case .afternoon1: return "pomeriggio" 1024 | case .evening1: return "sera" 1025 | case .night1: return "notte" 1026 | default: 1027 | return nil 1028 | } 1029 | case "ja": 1030 | switch period { 1031 | case .midnight: return "真夜中" 1032 | case .noon: return "正午" 1033 | case .morning1: return "朝" 1034 | case .afternoon1: return "昼" 1035 | case .evening1: return "夕方" 1036 | case .night1: return "夜" 1037 | case .night2: return "夜中" 1038 | default: 1039 | return nil 1040 | } 1041 | case "ka": 1042 | switch period { 1043 | case .midnight: return "შუაღამე" 1044 | case .noon: return "შუადღე" 1045 | case .morning1: return "დილა" 1046 | case .afternoon1: return "ნაშუადღევი" 1047 | case .evening1: return "საღამო" 1048 | case .night1: return "ღამე" 1049 | default: 1050 | return nil 1051 | } 1052 | case "kk": 1053 | switch period { 1054 | case .midnight: return "түн жарымы" 1055 | case .noon: return "талтүс" 1056 | case .morning1: return "таң" 1057 | case .afternoon1: return "түстен кейін" 1058 | case .evening1: return "кеш" 1059 | case .night1: return "түн" 1060 | default: 1061 | return nil 1062 | } 1063 | case "km": 1064 | switch period { 1065 | case .midnight: return "កណ្តាលអាធ្រាត្រ" 1066 | case .noon: return "ថ្ងៃ​ត្រង់" 1067 | case .morning1: return "ព្រឹក" 1068 | case .afternoon1: return "រសៀល" 1069 | case .evening1: return "ល្ងាច" 1070 | case .night1: return "យប់" 1071 | default: 1072 | return nil 1073 | } 1074 | case "kn": 1075 | switch period { 1076 | case .midnight: return "ಮಧ್ಯರಾತ್ರಿ" 1077 | case .morning1: return "ಬೆಳಗ್ಗೆ" 1078 | case .afternoon1: return "ಮಧ್ಯಾಹ್ನ" 1079 | case .evening1: return "ಸಂಜೆ" 1080 | case .night1: return "ರಾತ್ರಿ" 1081 | default: 1082 | return nil 1083 | } 1084 | case "ko": 1085 | switch period { 1086 | case .midnight: return "자정" 1087 | case .noon: return "정오" 1088 | case .morning1: return "새벽" 1089 | case .morning2: return "오전" 1090 | case .afternoon1: return "오후" 1091 | case .evening1: return "저녁" 1092 | case .night1: return "밤" 1093 | default: 1094 | return nil 1095 | } 1096 | case "ky": 1097 | switch period { 1098 | case .midnight: return "түн ортосу" 1099 | case .noon: return "чак түш" 1100 | case .morning1: return "эртең менен" 1101 | case .afternoon1: return "түштөн кийин" 1102 | case .evening1: return "кечкурун" 1103 | case .night1: return "түн" 1104 | default: 1105 | return nil 1106 | } 1107 | case "lo": 1108 | switch period { 1109 | case .midnight: return "ທ່ຽງ​ຄືນ" 1110 | case .noon: return "ຕອນທ່ຽງ" 1111 | case .morning1: return "​ເຊົ້າ" 1112 | case .afternoon1: return "ສວຍ" 1113 | case .evening1: return "ແລງ" 1114 | case .night1: return "​ກາງ​ຄືນ" 1115 | default: 1116 | return nil 1117 | } 1118 | case "lt": 1119 | switch period { 1120 | case .midnight: return "vidurnaktis" 1121 | case .noon: return "vidurdienis" 1122 | case .morning1: return "rytas" 1123 | case .afternoon1: return "diena" 1124 | case .evening1: return "vakaras" 1125 | case .night1: return "naktis" 1126 | default: 1127 | return nil 1128 | } 1129 | case "lv": 1130 | switch period { 1131 | case .midnight: return "pusnakts" 1132 | case .noon: return "pusdienlaiks" 1133 | case .morning1: return "rīts" 1134 | case .afternoon1: return "pēcpusdiena" 1135 | case .evening1: return "vakars" 1136 | case .night1: return "nakts" 1137 | default: 1138 | return nil 1139 | } 1140 | case "mk": 1141 | switch period { 1142 | case .midnight: return "на полноќ" 1143 | case .noon: return "напладне" 1144 | case .morning1: return "наутро" 1145 | case .morning2: return "претпладне" 1146 | case .afternoon1: return "попладне" 1147 | case .evening1: return "навечер" 1148 | case .night1: return "по полноќ" 1149 | default: 1150 | return nil 1151 | } 1152 | case "ml": 1153 | switch period { 1154 | case .midnight: return "അർദ്ധരാത്രി" 1155 | case .noon: return "ഉച്ച" 1156 | case .morning1: return "പുലർച്ചെ" 1157 | case .morning2: return "രാവിലെ" 1158 | case .afternoon1: return "ഉച്ചയ്ക്ക്" 1159 | case .afternoon2: return "ഉച്ചതിരിഞ്ഞ്" 1160 | case .evening1: return "വൈകുന്നേരം" 1161 | case .evening2: return "സന്ധ്യ" 1162 | case .night1: return "രാത്രി" 1163 | default: 1164 | return nil 1165 | } 1166 | case "mn": 1167 | switch period { 1168 | case .midnight: return "шөнө дунд" 1169 | case .noon: return "үд дунд" 1170 | case .morning1: return "өглөө" 1171 | case .afternoon1: return "өдөр" 1172 | case .evening1: return "орой" 1173 | case .night1: return "шөнө" 1174 | default: 1175 | return nil 1176 | } 1177 | case "mr": 1178 | switch period { 1179 | case .midnight: return "मध्यरात्र" 1180 | case .noon: return "मध्यान्ह" 1181 | case .morning1: return "पहाट" 1182 | case .morning2: return "सकाळ" 1183 | case .afternoon1: return "दुपार" 1184 | case .evening1: return "संध्याकाळ" 1185 | case .evening2: return "सायंकाळ" 1186 | case .night1: return "रात्र" 1187 | default: 1188 | return nil 1189 | } 1190 | case "ms": 1191 | switch period { 1192 | case .morning1: return "tengah malam" 1193 | case .morning2: return "pagi" 1194 | case .afternoon1: return "tengah hari" 1195 | case .evening1: return "petang" 1196 | case .night1: return "malam" 1197 | default: 1198 | return nil 1199 | } 1200 | case "my": 1201 | switch period { 1202 | case .midnight: return "သန်းခေါင်ယံ" 1203 | case .noon: return "မွန်းတည့်" 1204 | case .morning1: return "နံနက်" 1205 | case .afternoon1: return "နေ့လည်" 1206 | case .evening1: return "ညနေ" 1207 | case .night1: return "ည" 1208 | default: 1209 | return nil 1210 | } 1211 | case "nb": 1212 | switch period { 1213 | case .midnight: return "midnatt" 1214 | case .morning1: return "morgen" 1215 | case .morning2: return "formiddag" 1216 | case .afternoon1: return "ettermiddag" 1217 | case .evening1: return "kveld" 1218 | case .night1: return "natt" 1219 | default: 1220 | return nil 1221 | } 1222 | case "ne": 1223 | switch period { 1224 | case .midnight: return "मध्यरात" 1225 | case .noon: return "मध्यान्ह" 1226 | case .morning1: return "विहान" 1227 | case .afternoon1: return "अपरान्ह" 1228 | case .afternoon2: return "साँझ" 1229 | case .evening1: return "बेलुका" 1230 | case .night1: return "रात" 1231 | default: 1232 | return nil 1233 | } 1234 | case "nl": 1235 | switch period { 1236 | case .midnight: return "middernacht" 1237 | case .morning1: return "ochtend" 1238 | case .afternoon1: return "middag" 1239 | case .evening1: return "avond" 1240 | case .night1: return "nacht" 1241 | default: 1242 | return nil 1243 | } 1244 | case "pa": 1245 | switch period { 1246 | case .midnight: return "ਅੱਧੀ ਰਾਤ" 1247 | case .morning1: return "ਸਵੇਰ" 1248 | case .afternoon1: return "ਦੁਪਹਿਰ" 1249 | case .evening1: return "ਸ਼ਾਮ" 1250 | case .night1: return "ਰਾਤ" 1251 | default: 1252 | return nil 1253 | } 1254 | case "pl": 1255 | switch period { 1256 | case .midnight: return "północ" 1257 | case .noon: return "południe" 1258 | case .morning1: return "rano" 1259 | case .morning2: return "przedpołudnie" 1260 | case .afternoon1: return "popołudnie" 1261 | case .evening1: return "wieczór" 1262 | case .night1: return "noc" 1263 | default: 1264 | return nil 1265 | } 1266 | case "pt": 1267 | switch period { 1268 | case .midnight: return "meia-noite" 1269 | case .noon: return "meio-dia" 1270 | case .morning1: return "manhã" 1271 | case .afternoon1: return "tarde" 1272 | case .evening1: return "noite" 1273 | case .night1: return "madrugada" 1274 | default: 1275 | return nil 1276 | } 1277 | case "ro": 1278 | switch period { 1279 | case .midnight: return "la miezul nopții" 1280 | case .noon: return "la amiază" 1281 | case .morning1: return "dimineață" 1282 | case .afternoon1: return "după-amiază" 1283 | case .evening1: return "seară" 1284 | case .night1: return "noapte" 1285 | default: 1286 | return nil 1287 | } 1288 | case "ru": 1289 | switch period { 1290 | case .midnight: return "полночь" 1291 | case .noon: return "полдень" 1292 | case .morning1: return "утро" 1293 | case .afternoon1: return "день" 1294 | case .evening1: return "вечер" 1295 | case .night1: return "ночь" 1296 | default: 1297 | return nil 1298 | } 1299 | case "si": 1300 | switch period { 1301 | case .midnight: return "මැදියම" 1302 | case .noon: return "මධ්‍යාහ්නය" 1303 | case .morning1: return "පාන්දර" 1304 | case .morning2: return "උදේ" 1305 | case .afternoon1: return "දවල්" 1306 | case .evening1: return "හවස" 1307 | case .night1: return "රෑ" 1308 | case .night2: return "මැදියමට පසු" 1309 | default: 1310 | return nil 1311 | } 1312 | case "sk": 1313 | switch period { 1314 | case .midnight: return "polnoc" 1315 | case .noon: return "poludnie" 1316 | case .morning1: return "ráno" 1317 | case .morning2: return "dopoludnie" 1318 | case .afternoon1: return "popoludnie" 1319 | case .evening1: return "večer" 1320 | case .night1: return "noc" 1321 | default: 1322 | return nil 1323 | } 1324 | case "sl": 1325 | switch period { 1326 | case .midnight: return "polnoč" 1327 | case .noon: return "poldne" 1328 | case .morning1: return "zjutraj" 1329 | case .morning2: return "dopoldne" 1330 | case .afternoon1: return "popoldne" 1331 | case .evening1: return "zvečer" 1332 | case .night1: return "ponoči" 1333 | default: 1334 | return nil 1335 | } 1336 | case "sq": 1337 | switch period { 1338 | case .midnight: return "mesnatë" 1339 | case .noon: return "mesditë" 1340 | case .morning1: return "mëngjes" 1341 | case .morning2: return "paradite" 1342 | case .afternoon1: return "pasdite" 1343 | case .evening1: return "mbrëmje" 1344 | case .night1: return "natë" 1345 | default: 1346 | return nil 1347 | } 1348 | case "sr": 1349 | switch period { 1350 | case .midnight: return "поноћ" 1351 | case .noon: return "подне" 1352 | case .morning1: return "јутро" 1353 | case .afternoon1: return "поподне" 1354 | case .evening1: return "вече" 1355 | case .night1: return "ноћ" 1356 | default: 1357 | return nil 1358 | } 1359 | case "sv": 1360 | switch period { 1361 | case .midnight: return "midnatt" 1362 | case .morning1: return "morgon" 1363 | case .morning2: return "förmiddag" 1364 | case .afternoon1: return "eftermiddag" 1365 | case .evening1: return "kväll" 1366 | case .night1: return "natt" 1367 | default: 1368 | return nil 1369 | } 1370 | case "sw": 1371 | switch period { 1372 | case .midnight: return "saa sita za usiku" 1373 | case .noon: return "saa sita za mchana" 1374 | case .morning1: return "alfajiri" 1375 | case .morning2: return "asubuhi" 1376 | case .afternoon1: return "mchana" 1377 | case .evening1: return "jioni" 1378 | case .night1: return "usiku" 1379 | default: 1380 | return nil 1381 | } 1382 | case "ta": 1383 | switch period { 1384 | case .midnight: return "நள்ளிரவு" 1385 | case .noon: return "நண்பகல்" 1386 | case .morning1: return "அதிகாலை" 1387 | case .morning2: return "காலை" 1388 | case .afternoon1: return "மதியம்" 1389 | case .afternoon2: return "பிற்பகல்" 1390 | case .evening1: return "மாலை" 1391 | case .evening2: return "அந்தி மாலை" 1392 | case .night1: return "இரவு" 1393 | default: 1394 | return nil 1395 | } 1396 | case "te": 1397 | switch period { 1398 | case .midnight: return "అర్థరాత్రి" 1399 | case .morning1: return "ఉదయం" 1400 | case .afternoon1: return "మధ్యాహ్నం" 1401 | case .evening1: return "సాయంత్రం" 1402 | case .night1: return "రాత్రి" 1403 | default: 1404 | return nil 1405 | } 1406 | case "th": 1407 | switch period { 1408 | case .midnight: return "เที่ยงคืน" 1409 | case .noon: return "เที่ยง" 1410 | case .morning1: return "เช้า" 1411 | case .afternoon1: return "ช่วงเที่ยง" 1412 | case .afternoon2: return "บ่าย" 1413 | case .evening1: return "เย็น" 1414 | case .evening2: return "ค่ำ" 1415 | case .night1: return "กลางคืน" 1416 | default: 1417 | return nil 1418 | } 1419 | case "tr": 1420 | switch period { 1421 | case .midnight: return "gece yarısı" 1422 | case .noon: return "öğle" 1423 | case .morning1: return "sabah" 1424 | case .morning2: return "öğleden önce" 1425 | case .afternoon1: return "öğleden sonra" 1426 | case .afternoon2: return "akşamüstü" 1427 | case .evening1: return "akşam" 1428 | case .night1: return "gece" 1429 | default: 1430 | return nil 1431 | } 1432 | case "uk": 1433 | switch period { 1434 | case .midnight: return "північ" 1435 | case .noon: return "полудень" 1436 | case .morning1: return "ранок" 1437 | case .afternoon1: return "день" 1438 | case .evening1: return "вечір" 1439 | case .night1: return "ніч" 1440 | default: 1441 | return nil 1442 | } 1443 | case "ur": 1444 | switch period { 1445 | case .midnight: return "آدھی رات" 1446 | case .morning1: return "صبح" 1447 | case .afternoon1: return "دوپہر" 1448 | case .afternoon2: return "سہ پہر" 1449 | case .evening1: return "شام" 1450 | case .night1: return "رات" 1451 | default: 1452 | return nil 1453 | } 1454 | case "uz": 1455 | switch period { 1456 | case .midnight: return "yarim kechasi" 1457 | case .noon: return "tush payti" 1458 | case .morning1: return "ertalab" 1459 | case .afternoon1: return "kunduzi" 1460 | case .evening1: return "kechqurun" 1461 | case .night1: return "kechasi" 1462 | default: 1463 | return nil 1464 | } 1465 | case "vi": 1466 | switch period { 1467 | case .midnight: return "nửa đêm" 1468 | case .noon: return "trưa" 1469 | case .morning1: return "sáng" 1470 | case .afternoon1: return "chiều" 1471 | case .evening1: return "tối" 1472 | case .night1: return "đêm" 1473 | default: 1474 | return nil 1475 | } 1476 | case "yue": 1477 | switch period { 1478 | case .midnight: return "午夜" 1479 | case .morning1: return "清晨" 1480 | case .morning2: return "朝早" 1481 | case .afternoon1: return "中午" 1482 | case .afternoon2: return "下晝" 1483 | case .evening1: return "夜晚" 1484 | case .night1: return "凌晨" 1485 | default: 1486 | return nil 1487 | } 1488 | case "zh": 1489 | switch period { 1490 | case .midnight: return "午夜" 1491 | case .morning1: return "早上" 1492 | case .morning2: return "上午" 1493 | case .afternoon1: return "中午" 1494 | case .afternoon2: return "下午" 1495 | case .evening1: return "晚上" 1496 | case .night1: return "凌晨" 1497 | default: 1498 | return nil 1499 | } 1500 | case "zu": 1501 | switch period { 1502 | case .morning1: return "entathakusa" 1503 | case .morning2: return "ekuseni2" 1504 | case .afternoon1: return "emini" 1505 | case .evening1: return "ebusuku1" 1506 | case .night1: return "ebusuku" 1507 | default: 1508 | return nil 1509 | } 1510 | default: 1511 | return nil 1512 | } 1513 | } 1514 | } 1515 | -------------------------------------------------------------------------------- /Resources/dayPeriods.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 539 | 540 | 541 | 542 | 543 | 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 | 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 638 | 639 | 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | 663 | 664 | 665 | 666 | 667 | 668 | 669 | 670 | 671 | 672 | 673 | 674 | 675 | 676 | 677 | 678 | 679 | 680 | 681 | 682 | 683 | 684 | 685 | 686 | 687 | 688 | 689 | 690 | 691 | 692 | 693 | 694 | 695 | 696 | 697 | 698 | 699 | 700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 723 | 724 | 725 | 726 | 727 | 728 | 729 | 730 | 731 | 732 | 733 | 734 | 735 | 736 | 737 | 738 | 739 | 740 | 741 | 742 | 743 | 744 | 745 | 746 | 747 | 748 | 749 | 750 | 751 | 752 | 753 | 754 | 755 | 756 | 757 | 758 | 759 | 760 | 761 | 762 | 763 | 764 | 765 | 766 | 767 | 768 | 769 | 770 | 771 | 772 | 773 | 774 | 775 | 776 | 777 | 778 | 779 | 780 | 781 | 782 | 783 | 784 | 785 | 786 | 787 | 788 | 789 | 790 | 791 | 792 | 793 | 794 | 795 | 796 | 797 | 798 | 799 | 800 | 801 | 802 | 803 | 804 | 805 | 806 | 807 | 808 | 809 | 810 | 811 | 812 | 813 | 814 | 815 | 816 | 817 | 818 | 819 | 820 | 821 | 822 | 823 | 824 | 825 | 826 | 827 | 828 | 829 | 830 | 831 | 832 | 833 | 834 | 835 | 836 | 837 | 838 | 839 | 840 | 841 | 842 | 843 | 844 | 845 | 846 | 847 | 848 | 849 | 850 | 851 | 852 | 853 | 854 | 855 | 856 | 857 | 858 | 859 | 860 | 861 | 862 | 863 | 864 | 865 | 866 | 867 | 868 | 869 | 870 | 871 | 872 | 873 | 874 | 875 | 876 | 877 | 878 | 879 | 880 | 881 | 882 | 883 | 884 | 885 | 886 | 887 | 888 | 889 | 890 | 891 | 892 | 893 | 894 | 895 | 896 | 897 | 898 | 899 | 900 | 901 | 902 | 903 | 904 | 905 | 906 | 907 | 908 | 909 | 910 | 911 | 912 | 913 | 914 | 915 | 916 | 917 | 918 | 919 | 920 | 921 | 922 | 923 | 924 | 925 | 926 | 927 | 928 | 929 | 930 | 931 | 932 | 933 | 934 | 935 | 936 | 937 | 938 | 939 | 940 | 941 | 942 | 943 | 944 | 945 | 946 | 947 | 948 | 949 | 950 | 951 | 952 | 953 | 954 | 955 | 956 | 957 | 958 | 959 | 960 | 961 | 962 | 963 | 964 | 965 | 966 | 967 | 968 | 969 | 970 | 971 | 972 | 973 | 974 | 975 | 976 | 977 | 978 | 979 | 980 | 981 | 982 | 983 | 984 | 985 | 986 | 987 | 988 | 989 | 990 | 991 | 992 | 993 | 994 | 995 | 996 | 997 | 998 | 999 | 1000 | 1001 | 1002 | 1003 | 1004 | 1005 | 1006 | 1007 | 1008 | 1009 | 1010 | 1011 | 1012 | 1013 | 1014 | 1015 | 1016 | 1017 | 1018 | 1019 | 1020 | 1021 | 1022 | 1023 | 1024 | 1025 | 1026 | 1027 | 1028 | 1029 | 1030 | 1031 | 1032 | 1033 | 1034 | 1035 | 1036 | 1037 | 1038 | 1039 | 1040 | 1041 | 1042 | 1043 | 1044 | 1045 | 1046 | 1047 | 1048 | 1049 | 1050 | 1051 | 1052 | 1053 | 1054 | 1055 | 1056 | 1057 | 1058 | 1059 | 1060 | 1061 | 1062 | 1063 | 1064 | 1065 | 1066 | 1067 | 1068 | 1069 | 1070 | 1071 | 1072 | 1073 | 1074 | 1075 | 1076 | 1077 | 1078 | 1079 | 1080 | 1081 | 1082 | 1083 | 1084 | 1085 | 1086 | 1087 | 1088 | 1089 | 1090 | 1091 | 1092 | 1093 | 1094 | 1095 | 1096 | 1097 | 1098 | 1099 | 1100 | 1101 | 1102 | 1103 | 1104 | 1105 | 1106 | 1107 | 1108 | 1109 | 1110 | 1111 | 1112 | 1113 | 1114 | 1115 | 1116 | 1117 | 1118 | 1119 | 1120 | 1121 | 1122 | 1123 | 1124 | 1125 | 1126 | 1127 | 1128 | 1129 | 1130 | 1131 | 1132 | 1133 | 1134 | 1135 | 1136 | 1137 | 1138 | 1139 | 1140 | 1141 | 1142 | 1143 | 1144 | 1145 | 1146 | 1147 | 1148 | 1149 | 1150 | 1151 | 1152 | 1153 | 1154 | 1155 | 1156 | 1157 | 1158 | 1159 | 1160 | 1161 | 1162 | 1163 | 1164 | 1165 | 1166 | 1167 | 1168 | 1169 | 1170 | 1171 | 1172 | 1173 | 1174 | 1175 | 1176 | 1177 | -------------------------------------------------------------------------------- /Resources/dayPeriods-processed.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 539 | 540 | 541 | 542 | 543 | 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 | 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 638 | 639 | 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | 663 | 664 | 665 | 666 | 667 | 668 | 669 | 670 | 671 | 672 | 673 | 674 | 675 | 676 | 677 | 678 | 679 | 680 | 681 | 682 | 683 | 684 | 685 | 686 | 687 | 688 | 689 | 690 | 691 | 692 | 693 | 694 | 695 | 696 | 697 | 698 | 699 | 700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 723 | 724 | 725 | 726 | 727 | 728 | 729 | 730 | 731 | 732 | 733 | 734 | 735 | 736 | 737 | 738 | 739 | 740 | 741 | 742 | 743 | 744 | 745 | 746 | 747 | 748 | 749 | 750 | 751 | 752 | 753 | 754 | 755 | 756 | 757 | 758 | 759 | 760 | 761 | 762 | 763 | 764 | 765 | 766 | 767 | 768 | 769 | 770 | 771 | 772 | 773 | 774 | 775 | 776 | 777 | 778 | 779 | 780 | 781 | 782 | 783 | 784 | 785 | 786 | 787 | 788 | 789 | 790 | 791 | 792 | 793 | 794 | 795 | 796 | 797 | 798 | 799 | 800 | 801 | 802 | 803 | 804 | 805 | 806 | 807 | 808 | 809 | 810 | 811 | 812 | 813 | 814 | 815 | 816 | 817 | 818 | 819 | 820 | 821 | 822 | 823 | 824 | 825 | 826 | 827 | 828 | 829 | 830 | 831 | 832 | 833 | 834 | 835 | 836 | 837 | 838 | 839 | 840 | 841 | 842 | 843 | 844 | 845 | 846 | 847 | 848 | 849 | 850 | 851 | 852 | 853 | 854 | 855 | 856 | 857 | 858 | 859 | 860 | 861 | 862 | 863 | 864 | 865 | 866 | 867 | 868 | 869 | 870 | 871 | 872 | 873 | 874 | 875 | 876 | 877 | 878 | 879 | 880 | 881 | 882 | 883 | 884 | 885 | 886 | 887 | 888 | 889 | 890 | 891 | 892 | 893 | 894 | 895 | 896 | 897 | 898 | 899 | 900 | 901 | 902 | 903 | 904 | 905 | 906 | 907 | 908 | 909 | 910 | 911 | 912 | 913 | 914 | 915 | 916 | 917 | 918 | 919 | 920 | 921 | 922 | 923 | 924 | 925 | 926 | 927 | 928 | 929 | 930 | 931 | 932 | 933 | 934 | 935 | 936 | 937 | 938 | 939 | 940 | 941 | 942 | 943 | 944 | 945 | 946 | 947 | 948 | 949 | 950 | 951 | 952 | 953 | 954 | 955 | 956 | 957 | 958 | 959 | 960 | 961 | 962 | 963 | 964 | 965 | 966 | 967 | 968 | 969 | 970 | 971 | 972 | 973 | 974 | 975 | 976 | 977 | 978 | 979 | 980 | 981 | 982 | 983 | 984 | 985 | 986 | 987 | 988 | 989 | 990 | 991 | 992 | 993 | 994 | 995 | 996 | 997 | 998 | 999 | 1000 | 1001 | 1002 | 1003 | 1004 | 1005 | 1006 | 1007 | 1008 | 1009 | 1010 | 1011 | 1012 | 1013 | 1014 | 1015 | 1016 | 1017 | 1018 | 1019 | 1020 | 1021 | 1022 | 1023 | 1024 | 1025 | 1026 | 1027 | 1028 | 1029 | 1030 | 1031 | 1032 | 1033 | 1034 | 1035 | 1036 | 1037 | 1038 | 1039 | 1040 | 1041 | 1042 | 1043 | 1044 | 1045 | 1046 | 1047 | 1048 | 1049 | 1050 | 1051 | 1052 | 1053 | 1054 | 1055 | 1056 | 1057 | 1058 | 1059 | 1060 | 1061 | 1062 | 1063 | 1064 | 1065 | 1066 | 1067 | 1068 | 1069 | 1070 | 1071 | 1072 | 1073 | 1074 | 1075 | 1076 | 1077 | 1078 | 1079 | 1080 | 1081 | 1082 | 1083 | 1084 | 1085 | 1086 | 1087 | 1088 | 1089 | 1090 | 1091 | 1092 | 1093 | 1094 | 1095 | 1096 | 1097 | 1098 | 1099 | 1100 | 1101 | 1102 | 1103 | 1104 | 1105 | 1106 | 1107 | 1108 | 1109 | 1110 | 1111 | 1112 | 1113 | 1114 | 1115 | 1116 | 1117 | 1118 | 1119 | 1120 | 1121 | 1122 | 1123 | 1124 | 1125 | 1126 | 1127 | 1128 | 1129 | 1130 | 1131 | 1132 | 1133 | 1134 | 1135 | 1136 | 1137 | 1138 | 1139 | 1140 | 1141 | 1142 | 1143 | 1144 | 1145 | 1146 | 1147 | 1148 | 1149 | 1150 | 1151 | 1152 | 1153 | 1154 | 1155 | 1156 | 1157 | 1158 | 1159 | 1160 | 1161 | 1162 | 1163 | 1164 | 1165 | 1166 | 1167 | 1168 | 1169 | 1170 | 1171 | 1172 | 1173 | 1174 | 1175 | 1176 | 1177 | --------------------------------------------------------------------------------