Skip to main content

whichtime_sys/dictionaries/
de.rs

1//! German (Deutsch) locale dictionaries
2
3use super::{CasualDateType, CasualTimeType, RelativeModifier, TimeUnit, Weekday};
4use phf::phf_map;
5
6/// Weekday dictionary
7pub static WEEKDAY_MAP: phf::Map<&'static str, Weekday> = phf_map! {
8    "sonntag" => Weekday::Sunday,
9    "so" => Weekday::Sunday,
10    "so." => Weekday::Sunday,
11    "montag" => Weekday::Monday,
12    "mo" => Weekday::Monday,
13    "mo." => Weekday::Monday,
14    "dienstag" => Weekday::Tuesday,
15    "di" => Weekday::Tuesday,
16    "di." => Weekday::Tuesday,
17    "mittwoch" => Weekday::Wednesday,
18    "mi" => Weekday::Wednesday,
19    "mi." => Weekday::Wednesday,
20    "donnerstag" => Weekday::Thursday,
21    "do" => Weekday::Thursday,
22    "do." => Weekday::Thursday,
23    "freitag" => Weekday::Friday,
24    "fr" => Weekday::Friday,
25    "fr." => Weekday::Friday,
26    "samstag" => Weekday::Saturday,
27    "sa" => Weekday::Saturday,
28    "sa." => Weekday::Saturday,
29};
30
31/// Month dictionary
32pub static MONTH_MAP: phf::Map<&'static str, u32> = phf_map! {
33    "januar" => 1,
34    "jänner" => 1,
35    "janner" => 1,
36    "jan" => 1,
37    "jan." => 1,
38    "februar" => 2,
39    "feber" => 2,
40    "feb" => 2,
41    "feb." => 2,
42    "märz" => 3,
43    "maerz" => 3,
44    "mär" => 3,
45    "mär." => 3,
46    "mrz" => 3,
47    "mrz." => 3,
48    "april" => 4,
49    "apr" => 4,
50    "apr." => 4,
51    "mai" => 5,
52    "juni" => 6,
53    "jun" => 6,
54    "jun." => 6,
55    "juli" => 7,
56    "jul" => 7,
57    "jul." => 7,
58    "august" => 8,
59    "aug" => 8,
60    "aug." => 8,
61    "september" => 9,
62    "sep" => 9,
63    "sep." => 9,
64    "sept" => 9,
65    "sept." => 9,
66    "oktober" => 10,
67    "okt" => 10,
68    "okt." => 10,
69    "november" => 11,
70    "nov" => 11,
71    "nov." => 11,
72    "dezember" => 12,
73    "dez" => 12,
74    "dez." => 12,
75};
76
77/// Integer words dictionary
78pub static INTEGER_WORD_MAP: phf::Map<&'static str, f64> = phf_map! {
79    "eins" => 1.0,
80    "eine" => 1.0,
81    "einem" => 1.0,
82    "einen" => 1.0,
83    "einer" => 1.0,
84    "ein" => 1.0,
85    "zwei" => 2.0,
86    "drei" => 3.0,
87    "vier" => 4.0,
88    "fünf" => 5.0,
89    "fuenf" => 5.0,
90    "sechs" => 6.0,
91    "sieben" => 7.0,
92    "acht" => 8.0,
93    "neun" => 9.0,
94    "zehn" => 10.0,
95    "elf" => 11.0,
96    "zwölf" => 12.0,
97    "zwoelf" => 12.0,
98};
99
100/// Time unit dictionary
101pub static TIME_UNIT_MAP: phf::Map<&'static str, TimeUnit> = phf_map! {
102    "sek" => TimeUnit::Second,
103    "sekunde" => TimeUnit::Second,
104    "sekunden" => TimeUnit::Second,
105    "min" => TimeUnit::Minute,
106    "minute" => TimeUnit::Minute,
107    "minuten" => TimeUnit::Minute,
108    "h" => TimeUnit::Hour,
109    "std" => TimeUnit::Hour,
110    "stunde" => TimeUnit::Hour,
111    "stunden" => TimeUnit::Hour,
112    "tag" => TimeUnit::Day,
113    "tage" => TimeUnit::Day,
114    "tagen" => TimeUnit::Day,
115    "woche" => TimeUnit::Week,
116    "wochen" => TimeUnit::Week,
117    "monat" => TimeUnit::Month,
118    "monate" => TimeUnit::Month,
119    "monaten" => TimeUnit::Month,
120    "monats" => TimeUnit::Month,
121    "quartal" => TimeUnit::Quarter,
122    "quartals" => TimeUnit::Quarter,
123    "quartale" => TimeUnit::Quarter,
124    "quartalen" => TimeUnit::Quarter,
125    "a" => TimeUnit::Year,
126    "j" => TimeUnit::Year,
127    "jr" => TimeUnit::Year,
128    "jahr" => TimeUnit::Year,
129    "jahre" => TimeUnit::Year,
130    "jahren" => TimeUnit::Year,
131    "jahres" => TimeUnit::Year,
132};
133
134/// Casual date keywords
135pub static CASUAL_DATE_MAP: phf::Map<&'static str, CasualDateType> = phf_map! {
136    "jetzt" => CasualDateType::Now,
137    "heute" => CasualDateType::Today,
138    "heute nacht" => CasualDateType::Tonight,
139    "morgen" => CasualDateType::Tomorrow,
140    "gestern" => CasualDateType::Yesterday,
141    "übermorgen" => CasualDateType::Overmorrow,
142    "uebermorgen" => CasualDateType::Overmorrow,
143    "vorgestern" => CasualDateType::DayBeforeYesterday,
144};
145
146/// Casual time keywords
147pub static CASUAL_TIME_MAP: phf::Map<&'static str, CasualTimeType> = phf_map! {
148    "mittag" => CasualTimeType::Noon,
149    "mitternacht" => CasualTimeType::Midnight,
150    "morgen" => CasualTimeType::Morning,
151    "morgens" => CasualTimeType::Morning,
152    "vormittag" => CasualTimeType::Morning,
153    "vormittags" => CasualTimeType::Morning,
154    "nachmittag" => CasualTimeType::Afternoon,
155    "nachmittags" => CasualTimeType::Afternoon,
156    "abend" => CasualTimeType::Evening,
157    "abends" => CasualTimeType::Evening,
158    "nacht" => CasualTimeType::Night,
159    "nachts" => CasualTimeType::Night,
160};
161
162/// Relative modifiers
163pub static RELATIVE_MODIFIER_MAP: phf::Map<&'static str, RelativeModifier> = phf_map! {
164    "dieser" => RelativeModifier::This,
165    "diese" => RelativeModifier::This,
166    "diesen" => RelativeModifier::This,
167    "dieses" => RelativeModifier::This,
168    "nächster" => RelativeModifier::Next,
169    "nächste" => RelativeModifier::Next,
170    "nächsten" => RelativeModifier::Next,
171    "nächstes" => RelativeModifier::Next,
172    "naechster" => RelativeModifier::Next,
173    "naechste" => RelativeModifier::Next,
174    "naechsten" => RelativeModifier::Next,
175    "naechstes" => RelativeModifier::Next,
176    "kommender" => RelativeModifier::Next,
177    "kommende" => RelativeModifier::Next,
178    "kommenden" => RelativeModifier::Next,
179    "kommendes" => RelativeModifier::Next,
180    "letzter" => RelativeModifier::Last,
181    "letzte" => RelativeModifier::Last,
182    "letzten" => RelativeModifier::Last,
183    "letztes" => RelativeModifier::Last,
184    "vergangener" => RelativeModifier::Last,
185    "vergangene" => RelativeModifier::Last,
186    "vergangenen" => RelativeModifier::Last,
187    "vergangenes" => RelativeModifier::Last,
188    "voriger" => RelativeModifier::Last,
189    "vorige" => RelativeModifier::Last,
190    "vorigen" => RelativeModifier::Last,
191    "voriges" => RelativeModifier::Last,
192};
193
194// ============================================================================
195// Lookup functions
196// ============================================================================
197
198#[inline]
199pub fn get_weekday(s: &str) -> Option<Weekday> {
200    WEEKDAY_MAP.get(s).copied()
201}
202
203#[inline]
204pub fn get_month(s: &str) -> Option<u32> {
205    MONTH_MAP.get(s).copied()
206}
207
208#[inline]
209pub fn get_integer_word(s: &str) -> Option<f64> {
210    INTEGER_WORD_MAP.get(s).copied()
211}
212
213#[inline]
214pub fn get_time_unit(s: &str) -> Option<TimeUnit> {
215    TIME_UNIT_MAP.get(s).copied()
216}
217
218#[inline]
219pub fn get_casual_date(s: &str) -> Option<CasualDateType> {
220    CASUAL_DATE_MAP.get(s).copied()
221}
222
223#[inline]
224pub fn get_casual_time(s: &str) -> Option<CasualTimeType> {
225    CASUAL_TIME_MAP.get(s).copied()
226}
227
228#[inline]
229pub fn get_relative_modifier(s: &str) -> Option<RelativeModifier> {
230    RELATIVE_MODIFIER_MAP.get(s).copied()
231}
232
233/// Parse a number pattern
234pub fn parse_number_pattern(text: &str) -> f64 {
235    let lower = text.to_lowercase();
236
237    if let Some(val) = get_integer_word(&lower) {
238        return val;
239    }
240
241    match lower.as_str() {
242        s if s.contains("wenige") => return 2.0,
243        s if s.contains("paar") => return 2.0,
244        s if s.contains("halb") || s.contains("halben") => return 0.5,
245        s if s.contains("einig") => return 3.0,
246        s if s.contains("mehre") => return 7.0,
247        _ => {}
248    }
249
250    text.parse::<f64>().unwrap_or(0.0)
251}