├── 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 |
--------------------------------------------------------------------------------