1
2 """
3 pdt_locales
4
5 All of the included locale classes shipped with pdt.
6 """
7
8 import datetime
9
10 try:
11 import PyICU as pyicu
12 except:
13 pyicu = None
14
15
18
19
21 """
22 default values for Locales
23 """
24 locale_keys = set([
25 'MonthOffsets', 'Months', 'WeekdayOffsets', 'Weekdays',
26 'dateFormats', 'dateSep', 'dayOffsets', 'dp_order',
27 'localeID', 'meridian', 'Modifiers', 're_sources', 're_values',
28 'shortMonths', 'shortWeekdays', 'timeFormats', 'timeSep', 'units',
29 'uses24', 'usesMeridian', 'numbers', 'small', 'magnitude', 'ignore'])
30
32 self.localeID = None
33 self.dateSep = [ '/', '.' ]
34 self.timeSep = [ ':' ]
35 self.meridian = [ 'AM', 'PM' ]
36 self.usesMeridian = True
37 self.uses24 = True
38
39 self.WeekdayOffsets = {}
40 self.MonthOffsets = {}
41
42
43 self.Weekdays = [ 'monday', 'tuesday', 'wednesday',
44 'thursday', 'friday', 'saturday', 'sunday',
45 ]
46 self.shortWeekdays = [ 'mon', 'tues', 'wed',
47 'thu', 'fri', 'sat', 'sun',
48 ]
49 self.Months = [ 'january', 'february', 'march',
50 'april', 'may', 'june',
51 'july', 'august', 'september',
52 'october', 'november', 'december',
53 ]
54 self.shortMonths = [ 'jan', 'feb', 'mar',
55 'apr', 'may', 'jun',
56 'jul', 'aug', 'sep',
57 'oct', 'nov', 'dec',
58 ]
59
60 self.dateFormats = { 'full': 'EEEE, MMMM d, yyyy',
61 'long': 'MMMM d, yyyy',
62 'medium': 'MMM d, yyyy',
63 'short': 'M/d/yy',
64 }
65 self.timeFormats = { 'full': 'h:mm:ss a z',
66 'long': 'h:mm:ss a z',
67 'medium': 'h:mm:ss a',
68 'short': 'h:mm a',
69 }
70
71 self.dp_order = [ 'm', 'd', 'y' ]
72
73
74 self.numbers = { 'zero': 0, 'one': 1, 'a': 1, 'an': 1, 'two': 2, 'three': 3,
75 'four': 4, 'five': 5, 'six': 6, 'seven': 7, 'eight': 8,
76 'nine': 9, 'ten': 10, 'eleven': 11, 'twelve': 12,
77 'thirteen': 13, 'fourteen': 14, 'fifteen': 15, 'sixteen': 16,
78 'seventeen': 17, 'eighteen': 18, 'nineteen': 19,
79 'twenty': 20 }
80
81
82
83 self.units = { 'seconds': [ 'second', 'seconds', 'sec', 's' ],
84 'minutes': [ 'minute', 'minutes', 'min', 'm' ],
85 'hours': [ 'hour', 'hours', 'hr', 'h' ],
86 'days': [ 'day', 'days', 'dy', 'd' ],
87 'weeks': [ 'week', 'weeks', 'wk', 'w' ],
88 'months': [ 'month', 'months', 'mth' ],
89 'years': [ 'year', 'years', 'yr', 'y' ],
90 }
91
92
93 self.re_values = { 'specials': 'in|on|of|at',
94 'timeseperator': ':',
95 'rangeseperator': '-',
96 'daysuffix': 'rd|st|nd|th',
97 'meridian': 'am|pm|a.m.|p.m.|a|p',
98 'qunits': 'h|m|s|d|w|y',
99 'now': [ 'now' ],
100 }
101
102
103 self.Modifiers = { 'from': 1,
104 'before': -1,
105 'after': 1,
106 'ago': -1,
107 'prior': -1,
108 'prev': -1,
109 'last': -1,
110 'next': 1,
111 'previous': -1,
112 'end of': 0,
113 'eod': 1,
114 'eom': 1,
115 'eoy': 1,
116 }
117
118 self.dayOffsets = { 'tomorrow': 1,
119 'today': 0,
120 'yesterday': -1,
121 }
122
123
124
125
126
127 self.re_sources = { 'noon': { 'hr': 12, 'mn': 0, 'sec': 0 },
128 'afternoon': { 'hr': 13, 'mn': 0, 'sec': 0 },
129 'lunch': { 'hr': 12, 'mn': 0, 'sec': 0 },
130 'morning': { 'hr': 6, 'mn': 0, 'sec': 0 },
131 'breakfast': { 'hr': 8, 'mn': 0, 'sec': 0 },
132 'dinner': { 'hr': 19, 'mn': 0, 'sec': 0 },
133 'evening': { 'hr': 18, 'mn': 0, 'sec': 0 },
134 'midnight': { 'hr': 0, 'mn': 0, 'sec': 0 },
135 'night': { 'hr': 21, 'mn': 0, 'sec': 0 },
136 'tonight': { 'hr': 21, 'mn': 0, 'sec': 0 },
137 'eod': { 'hr': 17, 'mn': 0, 'sec': 0 },
138 }
139
140 self.small = {'zero': 0,
141 'one': 1,
142 'a': 1,
143 'an': 1,
144 'two': 2,
145 'three': 3,
146 'four': 4,
147 'five': 5,
148 'six': 6,
149 'seven': 7,
150 'eight': 8,
151 'nine': 9,
152 'ten': 10,
153 'eleven': 11,
154 'twelve': 12,
155 'thirteen': 13,
156 'fourteen': 14,
157 'fifteen': 15,
158 'sixteen': 16,
159 'seventeen': 17,
160 'eighteen': 18,
161 'nineteen': 19,
162 'twenty': 20,
163 'thirty': 30,
164 'forty': 40,
165 'fifty': 50,
166 'sixty': 60,
167 'seventy': 70,
168 'eighty': 80,
169 'ninety': 90
170 }
171
172 self.magnitude = {'thousand': 1000,
173 'million': 1000000,
174 'billion': 1000000000,
175 'trillion': 1000000000000,
176 'quadrillion': 1000000000000000,
177 'quintillion': 1000000000000000000,
178 'sextillion': 1000000000000000000000,
179 'septillion': 1000000000000000000000000,
180 'octillion': 1000000000000000000000000000,
181 'nonillion': 1000000000000000000000000000000,
182 'decillion': 1000000000000000000000000000000000,
183 }
184
185 self.ignore = ('and', ',')
186
187
189 """
190 Create a locale from pyICU
191 """
193 super( pdtLocale_icu, self ).__init__()
194
195 self.icu = None
196
197 if pyicu is not None:
198 if localeID is None:
199 localeID = 'en_US'
200 self.icu = pyicu.Locale(localeID)
201
202 if self.icu is not None:
203
204 rbnf = pyicu.RuleBasedNumberFormat(pyicu.URBNFRuleSetTag.SPELLOUT, self.icu)
205 try:
206 self.numbers = dict([(rbnf.format(i), i) for i in xrange(0, 100)])
207 except NameError:
208 self.numbers = dict([(rbnf.format(i), i) for i in range(0, 100)])
209
210 self.symbols = pyicu.DateFormatSymbols(self.icu)
211
212
213
214 wd = list(map(lcase, self.symbols.getWeekdays()[1:]))
215 swd = list(map(lcase, self.symbols.getShortWeekdays()[1:]))
216
217
218 self.Weekdays = wd[1:] + wd[0:1]
219 self.shortWeekdays = swd[1:] + swd[0:1]
220 self.Months = list(map(lcase, self.symbols.getMonths()))
221 self.shortMonths = list(map(lcase, self.symbols.getShortMonths()))
222
223 self.icu_df = { 'full': pyicu.DateFormat.createDateInstance(pyicu.DateFormat.kFull, self.icu),
224 'long': pyicu.DateFormat.createDateInstance(pyicu.DateFormat.kLong, self.icu),
225 'medium': pyicu.DateFormat.createDateInstance(pyicu.DateFormat.kMedium, self.icu),
226 'short': pyicu.DateFormat.createDateInstance(pyicu.DateFormat.kShort, self.icu),
227 }
228 self.icu_tf = { 'full': pyicu.DateFormat.createTimeInstance(pyicu.DateFormat.kFull, self.icu),
229 'long': pyicu.DateFormat.createTimeInstance(pyicu.DateFormat.kLong, self.icu),
230 'medium': pyicu.DateFormat.createTimeInstance(pyicu.DateFormat.kMedium, self.icu),
231 'short': pyicu.DateFormat.createTimeInstance(pyicu.DateFormat.kShort, self.icu),
232 }
233 self.dateFormats = { 'full': self.icu_df['full'].toPattern(),
234 'long': self.icu_df['long'].toPattern(),
235 'medium': self.icu_df['medium'].toPattern(),
236 'short': self.icu_df['short'].toPattern(),
237 }
238 self.timeFormats = { 'full': self.icu_tf['full'].toPattern(),
239 'long': self.icu_tf['long'].toPattern(),
240 'medium': self.icu_tf['medium'].toPattern(),
241 'short': self.icu_tf['short'].toPattern(),
242 }
243
244 am = ''
245 pm = ''
246 ts = ''
247
248
249
250 o = self.icu_tf['short']
251 s = self.timeFormats['short']
252
253 self.usesMeridian = 'a' in s
254 self.uses24 = 'H' in s
255
256
257 s = o.format(datetime.datetime(2003, 10, 30, 11, 45))
258
259
260 s = s.replace('11', '').replace('45', '')
261
262 if len(s) > 0:
263 ts = s[0]
264
265 if self.usesMeridian:
266
267 am = s[1:].strip()
268 s = o.format(datetime.datetime(2003, 10, 30, 23, 45))
269
270 if self.uses24:
271 s = s.replace('23', '')
272 else:
273 s = s.replace('11', '')
274
275
276 pm = s.replace('45', '').replace(ts, '').strip()
277
278 self.timeSep = [ ts ]
279 self.meridian = [ am, pm ]
280
281 o = self.icu_df['short']
282 s = o.format(datetime.datetime(2003, 10, 30, 11, 45))
283 s = s.replace('10', '').replace('30', '').replace('03', '').replace('2003', '')
284
285 if len(s) > 0:
286 ds = s[0]
287 else:
288 ds = '/'
289
290 self.dateSep = [ ds ]
291 s = self.dateFormats['short']
292 l = s.lower().split(ds)
293 dp_order = []
294
295 for s in l:
296 if len(s) > 0:
297 dp_order.append(s[:1])
298
299 self.dp_order = dp_order
300
301
303 """
304 en_US Locale
305 """
311
312
314 """
315 en_AU Locale
316 """
318 super( pdtLocale_au, self ).__init__()
319
320 self.localeID = 'en_A'
321 self.dateSep = [ '-', '/' ]
322 self.uses24 = False
323
324 self.dateFormats['full'] = 'EEEE, d MMMM yyyy'
325 self.dateFormats['long'] = 'd MMMM yyyy'
326 self.dateFormats['medium'] = 'dd/MM/yyyy'
327 self.dateFormats['short'] = 'd/MM/yy'
328
329 self.timeFormats['long'] = self.timeFormats['full']
330
331 self.dp_order = [ 'd', 'm', 'y' ]
332
333
335 """
336 es Locale
337
338 Note that I don't speak Spanish so many of the items below are still in English
339 """
341 super( pdtLocale_es, self ).__init__()
342
343 self.localeID = 'es'
344 self.dateSep = [ '/' ]
345 self.usesMeridian = False
346 self.uses24 = True
347
348 self.Weekdays = [ 'lunes', 'martes', 'mi\xe9rcoles',
349 'jueves', 'viernes', 's\xe1bado', 'domingo',
350 ]
351 self.shortWeekdays = [ 'lun', 'mar', 'mi\xe9',
352 'jue', 'vie', 's\xe1b', 'dom',
353 ]
354 self.Months = [ 'enero', 'febrero', 'marzo',
355 'abril', 'mayo', 'junio',
356 'julio', 'agosto', 'septiembre',
357 'octubre', 'noviembre', 'diciembre'
358 ]
359 self.shortMonths = [ 'ene', 'feb', 'mar',
360 'abr', 'may', 'jun',
361 'jul', 'ago', 'sep',
362 'oct', 'nov', 'dic'
363 ]
364 self.dateFormats['full'] = "EEEE d' de 'MMMM' de 'yyyy"
365 self.dateFormats['long'] = "d' de 'MMMM' de 'yyyy"
366 self.dateFormats['medium'] = "dd-MMM-yy"
367 self.dateFormats['short'] = "d/MM/yy"
368
369 self.timeFormats['full'] = "HH'H'mm' 'ss z"
370 self.timeFormats['long'] = "HH:mm:ss z"
371 self.timeFormats['medium'] = "HH:mm:ss"
372 self.timeFormats['short'] = "HH:mm"
373
374 self.dp_order = [ 'd', 'm', 'y' ]
375
376
378 """
379 pt_BR Locale
380
381 """
383 super( pdtLocale_ptBR, self ).__init__()
384
385 self.localeID = 'pt_BR'
386 self.dateSep = [ '/' ]
387 self.usesMeridian = False
388 self.uses24 = True
389
390 self.Weekdays = [ 'segunda-feira', 'ter\xe7a-feira', 'quarta-feira',
391 'quinta-feira', 'sexta-feira', 's\xe1bado', 'domingo',
392 ]
393 self.shortWeekdays = [ 'seg', 'ter', 'qua',
394 'qui', 'sex', 's\xe1b', 'dom',
395 ]
396 self.Months = [ 'janeiro', 'fevereiro', 'mar\xe7o',
397 'abril', 'maio', 'junho',
398 'julho', 'agosto', 'setembro',
399 'outubro', 'novembro', 'dezembro'
400 ]
401 self.shortMonths = [ 'jan', 'fev', 'mar',
402 'abr', 'mai', 'jun',
403 'jul', 'ago', 'set',
404 'out', 'nov', 'dez'
405 ]
406 self.dateFormats['full'] = "EEEE, d' de 'MMMM' de 'yyyy"
407 self.dateFormats['long'] = "d' de 'MMMM' de 'yyyy"
408 self.dateFormats['medium'] = "dd-MM-yy"
409 self.dateFormats['short'] = "dd/MM/yyyy"
410
411 self.timeFormats['full'] = "HH'H'mm' 'ss z"
412 self.timeFormats['long'] = "HH:mm:ss z"
413 self.timeFormats['medium'] = "HH:mm:ss"
414 self.timeFormats['short'] = "HH:mm"
415
416 self.dp_order = [ 'd', 'm', 'y' ]
417
418 self.units['seconds'] = [ 'segundo', 'seg', 's']
419 self.units['minutes'] = [ 'minuto', 'min', 'm']
420 self.units['days'] = [ 'dia', 'dias', 'd']
421 self.units['months'] = [ 'm\xeas', 'meses']
422
423
425 """
426 de_DE Locale constants
427
428 Contributed by Debian parsedatetime package maintainer Bernd Zeimetz <bzed@debian.org>
429 """
431 super( pdtLocale_de, self ).__init__()
432
433 self.localeID = 'de_DE'
434 self.dateSep = [ '.' ]
435 self.timeSep = [ ':' ]
436 self.meridian = [ ]
437 self.usesMeridian = False
438 self.uses24 = True
439
440 self.Weekdays = [ 'montag', 'dienstag', 'mittwoch',
441 'donnerstag', 'freitag', 'samstag', 'sonntag',
442 ]
443 self.shortWeekdays = [ 'mo', 'di', 'mi',
444 'do', 'fr', 'sa', 'so',
445 ]
446 self.Months = [ 'januar', 'februar', 'm\xe4rz',
447 'april', 'mai', 'juni',
448 'juli', 'august', 'september',
449 'oktober', 'november', 'dezember',
450 ]
451 self.shortMonths = [ 'jan', 'feb', 'mrz',
452 'apr', 'mai', 'jun',
453 'jul', 'aug', 'sep',
454 'okt', 'nov', 'dez',
455 ]
456 self.dateFormats['full'] = 'EEEE, d. MMMM yyyy'
457 self.dateFormats['long'] = 'd. MMMM yyyy'
458 self.dateFormats['medium'] = 'dd.MM.yyyy'
459 self.dateFormats['short'] = 'dd.MM.yy'
460
461 self.timeFormats['full'] = 'HH:mm:ss v'
462 self.timeFormats['long'] = 'HH:mm:ss z'
463 self.timeFormats['medium'] = 'HH:mm:ss'
464 self.timeFormats['short'] = 'HH:mm'
465
466 self.dp_order = [ 'd', 'm', 'y' ]
467
468 self.units['seconds'] = [ 'sekunden', 'sek', 's' ]
469 self.units['minutes'] = [ 'minuten', 'min' , 'm' ]
470 self.units['hours'] = [ 'stunden', 'std', 'h' ]
471 self.units['days'] = [ 'tag', 'tage', 't' ]
472 self.units['weeks'] = [ 'wochen', 'w' ]
473 self.units['months'] = [ 'monat', 'monate' ]
474
475
476 self.units['years'] = [ 'jahr', 'jahre', 'j' ]
477
478 self.re_values['specials'] = 'am|dem|der|im|in|den|zum'
479 self.re_values['timeseperator'] = ':'
480 self.re_values['rangeseperator'] = '-'
481 self.re_values['daysuffix'] = ''
482 self.re_values['qunits'] = 'h|m|s|t|w|m|j'
483 self.re_values['now'] = [ 'jetzt' ]
484
485
486
487 self.Modifiers['from'] = 1
488 self.Modifiers['before'] = -1
489 self.Modifiers['after'] = 1
490 self.Modifiers['vergangener'] = -1
491 self.Modifiers['vorheriger'] = -1
492 self.Modifiers['prev'] = -1
493 self.Modifiers['letzter'] = -1
494 self.Modifiers['n\xe4chster'] = 1
495 self.Modifiers['dieser'] = 0
496 self.Modifiers['previous'] = -1
497 self.Modifiers['in a'] = 2
498 self.Modifiers['end of'] = 0
499 self.Modifiers['eod'] = 0
500 self.Modifiers['eo'] = 0
501
502
503 self.dayOffsets['morgen'] = 1
504 self.dayOffsets['heute'] = 0
505 self.dayOffsets['gestern'] = -1
506 self.dayOffsets['vorgestern'] = -2
507 self.dayOffsets['\xfcbermorgen'] = 2
508
509
510
511
512
513 self.re_sources['mittag'] = { 'hr': 12, 'mn': 0, 'sec': 0 }
514 self.re_sources['mittags'] = { 'hr': 12, 'mn': 0, 'sec': 0 }
515 self.re_sources['mittagessen'] = { 'hr': 12, 'mn': 0, 'sec': 0 }
516 self.re_sources['morgen'] = { 'hr': 6, 'mn': 0, 'sec': 0 }
517 self.re_sources['morgens'] = { 'hr': 6, 'mn': 0, 'sec': 0 }
518 self.re_sources[r'fr\e4hst\xe4ck'] = { 'hr': 8, 'mn': 0, 'sec': 0 }
519 self.re_sources['abendessen'] = { 'hr': 19, 'mn': 0, 'sec': 0 }
520 self.re_sources['abend'] = { 'hr': 18, 'mn': 0, 'sec': 0 }
521 self.re_sources['abends'] = { 'hr': 18, 'mn': 0, 'sec': 0 }
522 self.re_sources['mitternacht'] = { 'hr': 0, 'mn': 0, 'sec': 0 }
523 self.re_sources['nacht'] = { 'hr': 21, 'mn': 0, 'sec': 0 }
524 self.re_sources['nachts'] = { 'hr': 21, 'mn': 0, 'sec': 0 }
525 self.re_sources['heute abend'] = { 'hr': 21, 'mn': 0, 'sec': 0 }
526 self.re_sources['heute nacht'] = { 'hr': 21, 'mn': 0, 'sec': 0 }
527 self.re_sources['feierabend'] = { 'hr': 17, 'mn': 0, 'sec': 0 }
528
530 """
531 nl_NL Locale constants
532
533 Contributed by Dirkjan Krijnders <dirkjan@krijnders.net>
534 """
536 super( pdtLocale_nl, self ).__init__()
537
538 self.localeID = 'nl_NL'
539 self.dateSep = [ '-' , '/']
540 self.timeSep = [ ':' ]
541 self.meridian = [ ]
542 self.usesMeridian = False
543 self.uses24 = True
544
545 self.Weekdays = [ 'maandag', 'dinsdag', 'woensdag',
546 'donderdag', 'vrijdag', 'zaterdag', 'zondag',
547 ]
548 self.shortWeekdays = [ 'ma', 'di', 'wo',
549 'do', 'vr', 'za', 'zo',
550 ]
551 self.Months = [ 'januari', 'februari', 'maart',
552 'april', 'mei', 'juni',
553 'juli', 'augustus', 'september',
554 'oktober', 'november', 'december',
555 ]
556 self.shortMonths = [ 'jan', 'feb', 'mar',
557 'apr', 'mei', 'jun',
558 'jul', 'aug', 'sep',
559 'okt', 'nov', 'dec',
560 ]
561 self.dateFormats['full'] = 'EEEE, dd MMMM yyyy'
562 self.dateFormats['long'] = 'dd MMMM yyyy'
563 self.dateFormats['medium'] = 'dd-MM-yyyy'
564 self.dateFormats['short'] = 'dd-MM-yy'
565
566 self.timeFormats['full'] = 'HH:mm:ss v'
567 self.timeFormats['long'] = 'HH:mm:ss z'
568 self.timeFormats['medium'] = 'HH:mm:ss'
569 self.timeFormats['short'] = 'HH:mm'
570
571 self.dp_order = [ 'd', 'm', 'y' ]
572
573 self.units['seconds'] = [ 'secunden', 'sec', 's' ]
574 self.units['minutes'] = [ 'minuten', 'min' , 'm' ]
575 self.units['hours'] = [ 'uren', 'uur', 'h' ]
576 self.units['days'] = [ 'dagen', 'dag', 'd' ]
577 self.units['weeks'] = [ 'weken', 'w' ]
578 self.units['months'] = [ 'maanden', 'maand' ]
579
580
581 self.units['years'] = [ 'jaar', 'jaren', 'j' ]
582
583 self.re_values['specials'] = 'om'
584 self.re_values['timeseperator'] = ':'
585 self.re_values['rangeseperator'] = '-'
586 self.re_values['daysuffix'] = ' |de'
587 self.re_values['qunits'] = 'h|m|s|d|w|m|j'
588 self.re_values['now'] = [ 'nu' ]
589
590
591
592 self.Modifiers['vanaf'] = 1
593 self.Modifiers['voor'] = -1
594 self.Modifiers['na'] = 1
595 self.Modifiers['vorige'] = -1
596 self.Modifiers['eervorige'] = -1
597 self.Modifiers['prev'] = -1
598 self.Modifiers['laastste'] = -1
599 self.Modifiers['volgende'] = 1
600 self.Modifiers['deze'] = 0
601 self.Modifiers['vorige'] = -1
602 self.Modifiers['over'] = 2
603 self.Modifiers['eind van'] = 0
604
605
606 self.dayOffsets['morgen'] = 1
607 self.dayOffsets['vandaag'] = 0
608 self.dayOffsets['gisteren'] = -1
609 self.dayOffsets['eergisteren'] = -2
610 self.dayOffsets['overmorgen'] = 2
611
612
613
614
615
616 self.re_sources['middag'] = { 'hr': 12, 'mn': 0, 'sec': 0 }
617 self.re_sources['vanmiddag'] = { 'hr': 12, 'mn': 0, 'sec': 0 }
618 self.re_sources['lunch'] = { 'hr': 12, 'mn': 0, 'sec': 0 }
619 self.re_sources['morgen'] = { 'hr': 6, 'mn': 0, 'sec': 0 }
620 self.re_sources['\'s morgens'] = { 'hr': 6, 'mn': 0, 'sec': 0 }
621 self.re_sources['ontbijt'] = { 'hr': 8, 'mn': 0, 'sec': 0 }
622 self.re_sources['avondeten'] = { 'hr': 19, 'mn': 0, 'sec': 0 }
623 self.re_sources['avond'] = { 'hr': 18, 'mn': 0, 'sec': 0 }
624 self.re_sources['avonds'] = { 'hr': 18, 'mn': 0, 'sec': 0 }
625 self.re_sources['middernacht'] = { 'hr': 0, 'mn': 0, 'sec': 0 }
626 self.re_sources['nacht'] = { 'hr': 21, 'mn': 0, 'sec': 0 }
627 self.re_sources['nachts'] = { 'hr': 21, 'mn': 0, 'sec': 0 }
628 self.re_sources['vanavond'] = { 'hr': 21, 'mn': 0, 'sec': 0 }
629 self.re_sources['vannacht'] = { 'hr': 21, 'mn': 0, 'sec': 0 }
630