Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/arrow/locales.py: 75%
1167 statements
« prev ^ index » next coverage.py v7.3.2, created at 2023-12-08 06:26 +0000
« prev ^ index » next coverage.py v7.3.2, created at 2023-12-08 06:26 +0000
1"""Provides internationalization for arrow in over 60 languages and dialects."""
3import sys
4from math import trunc
5from typing import (
6 Any,
7 ClassVar,
8 Dict,
9 List,
10 Mapping,
11 Optional,
12 Sequence,
13 Tuple,
14 Type,
15 Union,
16 cast,
17)
19if sys.version_info < (3, 8): # pragma: no cover
20 from typing_extensions import Literal
21else:
22 from typing import Literal # pragma: no cover
24TimeFrameLiteral = Literal[
25 "now",
26 "second",
27 "seconds",
28 "minute",
29 "minutes",
30 "hour",
31 "hours",
32 "day",
33 "days",
34 "week",
35 "weeks",
36 "month",
37 "months",
38 "quarter",
39 "quarters",
40 "year",
41 "years",
42]
44_TimeFrameElements = Union[
45 str, Sequence[str], Mapping[str, str], Mapping[str, Sequence[str]]
46]
48_locale_map: Dict[str, Type["Locale"]] = {}
51def get_locale(name: str) -> "Locale":
52 """Returns an appropriate :class:`Locale <arrow.locales.Locale>`
53 corresponding to an input locale name.
55 :param name: the name of the locale.
57 """
59 normalized_locale_name = name.lower().replace("_", "-")
60 locale_cls = _locale_map.get(normalized_locale_name)
62 if locale_cls is None:
63 raise ValueError(f"Unsupported locale {normalized_locale_name!r}.")
65 return locale_cls()
68def get_locale_by_class_name(name: str) -> "Locale":
69 """Returns an appropriate :class:`Locale <arrow.locales.Locale>`
70 corresponding to an locale class name.
72 :param name: the name of the locale class.
74 """
75 locale_cls: Optional[Type[Locale]] = globals().get(name)
77 if locale_cls is None:
78 raise ValueError(f"Unsupported locale {name!r}.")
80 return locale_cls()
83class Locale:
84 """Represents locale-specific data and functionality."""
86 names: ClassVar[List[str]] = []
88 timeframes: ClassVar[Mapping[TimeFrameLiteral, _TimeFrameElements]] = {
89 "now": "",
90 "second": "",
91 "seconds": "",
92 "minute": "",
93 "minutes": "",
94 "hour": "",
95 "hours": "",
96 "day": "",
97 "days": "",
98 "week": "",
99 "weeks": "",
100 "month": "",
101 "months": "",
102 "quarter": "",
103 "quarters": "",
104 "year": "",
105 "years": "",
106 }
108 meridians: ClassVar[Dict[str, str]] = {"am": "", "pm": "", "AM": "", "PM": ""}
110 past: ClassVar[str]
111 future: ClassVar[str]
112 and_word: ClassVar[Optional[str]] = None
114 month_names: ClassVar[List[str]] = []
115 month_abbreviations: ClassVar[List[str]] = []
117 day_names: ClassVar[List[str]] = []
118 day_abbreviations: ClassVar[List[str]] = []
120 ordinal_day_re: ClassVar[str] = r"(\d+)"
122 _month_name_to_ordinal: Optional[Dict[str, int]]
124 def __init_subclass__(cls, **kwargs: Any) -> None:
125 for locale_name in cls.names:
126 if locale_name in _locale_map:
127 raise LookupError(f"Duplicated locale name: {locale_name}")
129 _locale_map[locale_name.lower().replace("_", "-")] = cls
131 def __init__(self) -> None:
132 self._month_name_to_ordinal = None
134 def describe(
135 self,
136 timeframe: TimeFrameLiteral,
137 delta: Union[float, int] = 0,
138 only_distance: bool = False,
139 ) -> str:
140 """Describes a delta within a timeframe in plain language.
142 :param timeframe: a string representing a timeframe.
143 :param delta: a quantity representing a delta in a timeframe.
144 :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords
145 """
147 humanized = self._format_timeframe(timeframe, trunc(delta))
148 if not only_distance:
149 humanized = self._format_relative(humanized, timeframe, delta)
151 return humanized
153 def describe_multi(
154 self,
155 timeframes: Sequence[Tuple[TimeFrameLiteral, Union[int, float]]],
156 only_distance: bool = False,
157 ) -> str:
158 """Describes a delta within multiple timeframes in plain language.
160 :param timeframes: a list of string, quantity pairs each representing a timeframe and delta.
161 :param only_distance: return only distance eg: "2 hours and 11 seconds" without "in" or "ago" keywords
162 """
164 parts = [
165 self._format_timeframe(timeframe, trunc(delta))
166 for timeframe, delta in timeframes
167 ]
168 if self.and_word:
169 parts.insert(-1, self.and_word)
170 humanized = " ".join(parts)
172 if not only_distance:
173 # Needed to determine the correct relative string to use
174 timeframe_value = 0
176 for _, unit_value in timeframes:
177 if trunc(unit_value) != 0:
178 timeframe_value = trunc(unit_value)
179 break
181 # Note it doesn't matter the timeframe unit we use on the call, only the value
182 humanized = self._format_relative(humanized, "seconds", timeframe_value)
184 return humanized
186 def day_name(self, day: int) -> str:
187 """Returns the day name for a specified day of the week.
189 :param day: the ``int`` day of the week (1-7).
191 """
193 return self.day_names[day]
195 def day_abbreviation(self, day: int) -> str:
196 """Returns the day abbreviation for a specified day of the week.
198 :param day: the ``int`` day of the week (1-7).
200 """
202 return self.day_abbreviations[day]
204 def month_name(self, month: int) -> str:
205 """Returns the month name for a specified month of the year.
207 :param month: the ``int`` month of the year (1-12).
209 """
211 return self.month_names[month]
213 def month_abbreviation(self, month: int) -> str:
214 """Returns the month abbreviation for a specified month of the year.
216 :param month: the ``int`` month of the year (1-12).
218 """
220 return self.month_abbreviations[month]
222 def month_number(self, name: str) -> Optional[int]:
223 """Returns the month number for a month specified by name or abbreviation.
225 :param name: the month name or abbreviation.
227 """
229 if self._month_name_to_ordinal is None:
230 self._month_name_to_ordinal = self._name_to_ordinal(self.month_names)
231 self._month_name_to_ordinal.update(
232 self._name_to_ordinal(self.month_abbreviations)
233 )
235 return self._month_name_to_ordinal.get(name)
237 def year_full(self, year: int) -> str:
238 """Returns the year for specific locale if available
240 :param year: the ``int`` year (4-digit)
241 """
242 return f"{year:04d}"
244 def year_abbreviation(self, year: int) -> str:
245 """Returns the year for specific locale if available
247 :param year: the ``int`` year (4-digit)
248 """
249 return f"{year:04d}"[2:]
251 def meridian(self, hour: int, token: Any) -> Optional[str]:
252 """Returns the meridian indicator for a specified hour and format token.
254 :param hour: the ``int`` hour of the day.
255 :param token: the format token.
256 """
258 if token == "a":
259 return self.meridians["am"] if hour < 12 else self.meridians["pm"]
260 if token == "A":
261 return self.meridians["AM"] if hour < 12 else self.meridians["PM"]
262 return None
264 def ordinal_number(self, n: int) -> str:
265 """Returns the ordinal format of a given integer
267 :param n: an integer
268 """
269 return self._ordinal_number(n)
271 def _ordinal_number(self, n: int) -> str:
272 return f"{n}"
274 def _name_to_ordinal(self, lst: Sequence[str]) -> Dict[str, int]:
275 return {elem.lower(): i for i, elem in enumerate(lst[1:], 1)}
277 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
278 # TODO: remove cast
279 return cast(str, self.timeframes[timeframe]).format(trunc(abs(delta)))
281 def _format_relative(
282 self,
283 humanized: str,
284 timeframe: TimeFrameLiteral,
285 delta: Union[float, int],
286 ) -> str:
287 if timeframe == "now":
288 return humanized
290 direction = self.past if delta < 0 else self.future
292 return direction.format(humanized)
295class EnglishLocale(Locale):
296 names = [
297 "en",
298 "en-us",
299 "en-gb",
300 "en-au",
301 "en-be",
302 "en-jp",
303 "en-za",
304 "en-ca",
305 "en-ph",
306 ]
308 past = "{0} ago"
309 future = "in {0}"
310 and_word = "and"
312 timeframes = {
313 "now": "just now",
314 "second": "a second",
315 "seconds": "{0} seconds",
316 "minute": "a minute",
317 "minutes": "{0} minutes",
318 "hour": "an hour",
319 "hours": "{0} hours",
320 "day": "a day",
321 "days": "{0} days",
322 "week": "a week",
323 "weeks": "{0} weeks",
324 "month": "a month",
325 "months": "{0} months",
326 "quarter": "a quarter",
327 "quarters": "{0} quarters",
328 "year": "a year",
329 "years": "{0} years",
330 }
332 meridians = {"am": "am", "pm": "pm", "AM": "AM", "PM": "PM"}
334 month_names = [
335 "",
336 "January",
337 "February",
338 "March",
339 "April",
340 "May",
341 "June",
342 "July",
343 "August",
344 "September",
345 "October",
346 "November",
347 "December",
348 ]
349 month_abbreviations = [
350 "",
351 "Jan",
352 "Feb",
353 "Mar",
354 "Apr",
355 "May",
356 "Jun",
357 "Jul",
358 "Aug",
359 "Sep",
360 "Oct",
361 "Nov",
362 "Dec",
363 ]
365 day_names = [
366 "",
367 "Monday",
368 "Tuesday",
369 "Wednesday",
370 "Thursday",
371 "Friday",
372 "Saturday",
373 "Sunday",
374 ]
375 day_abbreviations = ["", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
377 ordinal_day_re = r"((?P<value>[2-3]?1(?=st)|[2-3]?2(?=nd)|[2-3]?3(?=rd)|[1-3]?[04-9](?=th)|1[1-3](?=th))(st|nd|rd|th))"
379 def _ordinal_number(self, n: int) -> str:
380 if n % 100 not in (11, 12, 13):
381 remainder = abs(n) % 10
382 if remainder == 1:
383 return f"{n}st"
384 elif remainder == 2:
385 return f"{n}nd"
386 elif remainder == 3:
387 return f"{n}rd"
388 return f"{n}th"
390 def describe(
391 self,
392 timeframe: TimeFrameLiteral,
393 delta: Union[int, float] = 0,
394 only_distance: bool = False,
395 ) -> str:
396 """Describes a delta within a timeframe in plain language.
398 :param timeframe: a string representing a timeframe.
399 :param delta: a quantity representing a delta in a timeframe.
400 :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords
401 """
403 humanized = super().describe(timeframe, delta, only_distance)
404 if only_distance and timeframe == "now":
405 humanized = "instantly"
407 return humanized
410class ItalianLocale(Locale):
411 names = ["it", "it-it"]
412 past = "{0} fa"
413 future = "tra {0}"
414 and_word = "e"
416 timeframes = {
417 "now": "adesso",
418 "second": "un secondo",
419 "seconds": "{0} qualche secondo",
420 "minute": "un minuto",
421 "minutes": "{0} minuti",
422 "hour": "un'ora",
423 "hours": "{0} ore",
424 "day": "un giorno",
425 "days": "{0} giorni",
426 "week": "una settimana",
427 "weeks": "{0} settimane",
428 "month": "un mese",
429 "months": "{0} mesi",
430 "year": "un anno",
431 "years": "{0} anni",
432 }
434 month_names = [
435 "",
436 "gennaio",
437 "febbraio",
438 "marzo",
439 "aprile",
440 "maggio",
441 "giugno",
442 "luglio",
443 "agosto",
444 "settembre",
445 "ottobre",
446 "novembre",
447 "dicembre",
448 ]
449 month_abbreviations = [
450 "",
451 "gen",
452 "feb",
453 "mar",
454 "apr",
455 "mag",
456 "giu",
457 "lug",
458 "ago",
459 "set",
460 "ott",
461 "nov",
462 "dic",
463 ]
465 day_names = [
466 "",
467 "lunedì",
468 "martedì",
469 "mercoledì",
470 "giovedì",
471 "venerdì",
472 "sabato",
473 "domenica",
474 ]
475 day_abbreviations = ["", "lun", "mar", "mer", "gio", "ven", "sab", "dom"]
477 ordinal_day_re = r"((?P<value>[1-3]?[0-9](?=[ºª]))[ºª])"
479 def _ordinal_number(self, n: int) -> str:
480 return f"{n}º"
483class SpanishLocale(Locale):
484 names = ["es", "es-es"]
485 past = "hace {0}"
486 future = "en {0}"
487 and_word = "y"
489 timeframes = {
490 "now": "ahora",
491 "second": "un segundo",
492 "seconds": "{0} segundos",
493 "minute": "un minuto",
494 "minutes": "{0} minutos",
495 "hour": "una hora",
496 "hours": "{0} horas",
497 "day": "un día",
498 "days": "{0} días",
499 "week": "una semana",
500 "weeks": "{0} semanas",
501 "month": "un mes",
502 "months": "{0} meses",
503 "year": "un año",
504 "years": "{0} años",
505 }
507 meridians = {"am": "am", "pm": "pm", "AM": "AM", "PM": "PM"}
509 month_names = [
510 "",
511 "enero",
512 "febrero",
513 "marzo",
514 "abril",
515 "mayo",
516 "junio",
517 "julio",
518 "agosto",
519 "septiembre",
520 "octubre",
521 "noviembre",
522 "diciembre",
523 ]
524 month_abbreviations = [
525 "",
526 "ene",
527 "feb",
528 "mar",
529 "abr",
530 "may",
531 "jun",
532 "jul",
533 "ago",
534 "sep",
535 "oct",
536 "nov",
537 "dic",
538 ]
540 day_names = [
541 "",
542 "lunes",
543 "martes",
544 "miércoles",
545 "jueves",
546 "viernes",
547 "sábado",
548 "domingo",
549 ]
550 day_abbreviations = ["", "lun", "mar", "mie", "jue", "vie", "sab", "dom"]
552 ordinal_day_re = r"((?P<value>[1-3]?[0-9](?=[ºª]))[ºª])"
554 def _ordinal_number(self, n: int) -> str:
555 return f"{n}º"
558class FrenchBaseLocale(Locale):
559 past = "il y a {0}"
560 future = "dans {0}"
561 and_word = "et"
563 timeframes = {
564 "now": "maintenant",
565 "second": "une seconde",
566 "seconds": "{0} secondes",
567 "minute": "une minute",
568 "minutes": "{0} minutes",
569 "hour": "une heure",
570 "hours": "{0} heures",
571 "day": "un jour",
572 "days": "{0} jours",
573 "week": "une semaine",
574 "weeks": "{0} semaines",
575 "month": "un mois",
576 "months": "{0} mois",
577 "year": "un an",
578 "years": "{0} ans",
579 }
581 month_names = [
582 "",
583 "janvier",
584 "février",
585 "mars",
586 "avril",
587 "mai",
588 "juin",
589 "juillet",
590 "août",
591 "septembre",
592 "octobre",
593 "novembre",
594 "décembre",
595 ]
597 day_names = [
598 "",
599 "lundi",
600 "mardi",
601 "mercredi",
602 "jeudi",
603 "vendredi",
604 "samedi",
605 "dimanche",
606 ]
607 day_abbreviations = ["", "lun", "mar", "mer", "jeu", "ven", "sam", "dim"]
609 ordinal_day_re = (
610 r"((?P<value>\b1(?=er\b)|[1-3]?[02-9](?=e\b)|[1-3]1(?=e\b))(er|e)\b)"
611 )
613 def _ordinal_number(self, n: int) -> str:
614 if abs(n) == 1:
615 return f"{n}er"
616 return f"{n}e"
619class FrenchLocale(FrenchBaseLocale, Locale):
620 names = ["fr", "fr-fr"]
622 month_abbreviations = [
623 "",
624 "janv",
625 "févr",
626 "mars",
627 "avr",
628 "mai",
629 "juin",
630 "juil",
631 "août",
632 "sept",
633 "oct",
634 "nov",
635 "déc",
636 ]
639class FrenchCanadianLocale(FrenchBaseLocale, Locale):
640 names = ["fr-ca"]
642 month_abbreviations = [
643 "",
644 "janv",
645 "févr",
646 "mars",
647 "avr",
648 "mai",
649 "juin",
650 "juill",
651 "août",
652 "sept",
653 "oct",
654 "nov",
655 "déc",
656 ]
659class GreekLocale(Locale):
660 names = ["el", "el-gr"]
662 past = "{0} πριν"
663 future = "σε {0}"
664 and_word = "και"
666 timeframes = {
667 "now": "τώρα",
668 "second": "ένα δεύτερο",
669 "seconds": "{0} δευτερόλεπτα",
670 "minute": "ένα λεπτό",
671 "minutes": "{0} λεπτά",
672 "hour": "μία ώρα",
673 "hours": "{0} ώρες",
674 "day": "μία μέρα",
675 "days": "{0} μέρες",
676 "week": "μία εβδομάδα",
677 "weeks": "{0} εβδομάδες",
678 "month": "ένα μήνα",
679 "months": "{0} μήνες",
680 "year": "ένα χρόνο",
681 "years": "{0} χρόνια",
682 }
684 month_names = [
685 "",
686 "Ιανουαρίου",
687 "Φεβρουαρίου",
688 "Μαρτίου",
689 "Απριλίου",
690 "Μαΐου",
691 "Ιουνίου",
692 "Ιουλίου",
693 "Αυγούστου",
694 "Σεπτεμβρίου",
695 "Οκτωβρίου",
696 "Νοεμβρίου",
697 "Δεκεμβρίου",
698 ]
699 month_abbreviations = [
700 "",
701 "Ιαν",
702 "Φεβ",
703 "Μαρ",
704 "Απρ",
705 "Μαϊ",
706 "Ιον",
707 "Ιολ",
708 "Αυγ",
709 "Σεπ",
710 "Οκτ",
711 "Νοε",
712 "Δεκ",
713 ]
715 day_names = [
716 "",
717 "Δευτέρα",
718 "Τρίτη",
719 "Τετάρτη",
720 "Πέμπτη",
721 "Παρασκευή",
722 "Σάββατο",
723 "Κυριακή",
724 ]
725 day_abbreviations = ["", "Δευ", "Τρι", "Τετ", "Πεμ", "Παρ", "Σαβ", "Κυρ"]
728class JapaneseLocale(Locale):
729 names = ["ja", "ja-jp"]
731 past = "{0}前"
732 future = "{0}後"
733 and_word = ""
735 timeframes = {
736 "now": "現在",
737 "second": "1秒",
738 "seconds": "{0}秒",
739 "minute": "1分",
740 "minutes": "{0}分",
741 "hour": "1時間",
742 "hours": "{0}時間",
743 "day": "1日",
744 "days": "{0}日",
745 "week": "1週間",
746 "weeks": "{0}週間",
747 "month": "1ヶ月",
748 "months": "{0}ヶ月",
749 "year": "1年",
750 "years": "{0}年",
751 }
753 month_names = [
754 "",
755 "1月",
756 "2月",
757 "3月",
758 "4月",
759 "5月",
760 "6月",
761 "7月",
762 "8月",
763 "9月",
764 "10月",
765 "11月",
766 "12月",
767 ]
768 month_abbreviations = [
769 "",
770 " 1",
771 " 2",
772 " 3",
773 " 4",
774 " 5",
775 " 6",
776 " 7",
777 " 8",
778 " 9",
779 "10",
780 "11",
781 "12",
782 ]
784 day_names = ["", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日", "日曜日"]
785 day_abbreviations = ["", "月", "火", "水", "木", "金", "土", "日"]
788class SwedishLocale(Locale):
789 names = ["sv", "sv-se"]
791 past = "för {0} sen"
792 future = "om {0}"
793 and_word = "och"
795 timeframes = {
796 "now": "just nu",
797 "second": "en sekund",
798 "seconds": "{0} sekunder",
799 "minute": "en minut",
800 "minutes": "{0} minuter",
801 "hour": "en timme",
802 "hours": "{0} timmar",
803 "day": "en dag",
804 "days": "{0} dagar",
805 "week": "en vecka",
806 "weeks": "{0} veckor",
807 "month": "en månad",
808 "months": "{0} månader",
809 "year": "ett år",
810 "years": "{0} år",
811 }
813 month_names = [
814 "",
815 "januari",
816 "februari",
817 "mars",
818 "april",
819 "maj",
820 "juni",
821 "juli",
822 "augusti",
823 "september",
824 "oktober",
825 "november",
826 "december",
827 ]
828 month_abbreviations = [
829 "",
830 "jan",
831 "feb",
832 "mar",
833 "apr",
834 "maj",
835 "jun",
836 "jul",
837 "aug",
838 "sep",
839 "okt",
840 "nov",
841 "dec",
842 ]
844 day_names = [
845 "",
846 "måndag",
847 "tisdag",
848 "onsdag",
849 "torsdag",
850 "fredag",
851 "lördag",
852 "söndag",
853 ]
854 day_abbreviations = ["", "mån", "tis", "ons", "tor", "fre", "lör", "sön"]
857class FinnishLocale(Locale):
858 names = ["fi", "fi-fi"]
860 # The finnish grammar is very complex, and its hard to convert
861 # 1-to-1 to something like English.
863 past = "{0} sitten"
864 future = "{0} kuluttua"
866 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
867 "now": "juuri nyt",
868 "second": {"past": "sekunti", "future": "sekunnin"},
869 "seconds": {"past": "{0} sekuntia", "future": "{0} sekunnin"},
870 "minute": {"past": "minuutti", "future": "minuutin"},
871 "minutes": {"past": "{0} minuuttia", "future": "{0} minuutin"},
872 "hour": {"past": "tunti", "future": "tunnin"},
873 "hours": {"past": "{0} tuntia", "future": "{0} tunnin"},
874 "day": {"past": "päivä", "future": "päivän"},
875 "days": {"past": "{0} päivää", "future": "{0} päivän"},
876 "week": {"past": "viikko", "future": "viikon"},
877 "weeks": {"past": "{0} viikkoa", "future": "{0} viikon"},
878 "month": {"past": "kuukausi", "future": "kuukauden"},
879 "months": {"past": "{0} kuukautta", "future": "{0} kuukauden"},
880 "year": {"past": "vuosi", "future": "vuoden"},
881 "years": {"past": "{0} vuotta", "future": "{0} vuoden"},
882 }
884 # Months and days are lowercase in Finnish
885 month_names = [
886 "",
887 "tammikuu",
888 "helmikuu",
889 "maaliskuu",
890 "huhtikuu",
891 "toukokuu",
892 "kesäkuu",
893 "heinäkuu",
894 "elokuu",
895 "syyskuu",
896 "lokakuu",
897 "marraskuu",
898 "joulukuu",
899 ]
901 month_abbreviations = [
902 "",
903 "tammi",
904 "helmi",
905 "maalis",
906 "huhti",
907 "touko",
908 "kesä",
909 "heinä",
910 "elo",
911 "syys",
912 "loka",
913 "marras",
914 "joulu",
915 ]
917 day_names = [
918 "",
919 "maanantai",
920 "tiistai",
921 "keskiviikko",
922 "torstai",
923 "perjantai",
924 "lauantai",
925 "sunnuntai",
926 ]
928 day_abbreviations = ["", "ma", "ti", "ke", "to", "pe", "la", "su"]
930 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
931 form = self.timeframes[timeframe]
933 if isinstance(form, Mapping):
934 if delta < 0:
935 form = form["past"]
936 else:
937 form = form["future"]
939 return form.format(abs(delta))
941 def _ordinal_number(self, n: int) -> str:
942 return f"{n}."
945class ChineseCNLocale(Locale):
946 names = ["zh", "zh-cn"]
948 past = "{0}前"
949 future = "{0}后"
951 timeframes = {
952 "now": "刚才",
953 "second": "1秒",
954 "seconds": "{0}秒",
955 "minute": "1分钟",
956 "minutes": "{0}分钟",
957 "hour": "1小时",
958 "hours": "{0}小时",
959 "day": "1天",
960 "days": "{0}天",
961 "week": "1周",
962 "weeks": "{0}周",
963 "month": "1个月",
964 "months": "{0}个月",
965 "year": "1年",
966 "years": "{0}年",
967 }
969 month_names = [
970 "",
971 "一月",
972 "二月",
973 "三月",
974 "四月",
975 "五月",
976 "六月",
977 "七月",
978 "八月",
979 "九月",
980 "十月",
981 "十一月",
982 "十二月",
983 ]
984 month_abbreviations = [
985 "",
986 " 1",
987 " 2",
988 " 3",
989 " 4",
990 " 5",
991 " 6",
992 " 7",
993 " 8",
994 " 9",
995 "10",
996 "11",
997 "12",
998 ]
1000 day_names = ["", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"]
1001 day_abbreviations = ["", "一", "二", "三", "四", "五", "六", "日"]
1004class ChineseTWLocale(Locale):
1005 names = ["zh-tw"]
1007 past = "{0}前"
1008 future = "{0}後"
1009 and_word = "和"
1011 timeframes = {
1012 "now": "剛才",
1013 "second": "1秒",
1014 "seconds": "{0}秒",
1015 "minute": "1分鐘",
1016 "minutes": "{0}分鐘",
1017 "hour": "1小時",
1018 "hours": "{0}小時",
1019 "day": "1天",
1020 "days": "{0}天",
1021 "week": "1週",
1022 "weeks": "{0}週",
1023 "month": "1個月",
1024 "months": "{0}個月",
1025 "year": "1年",
1026 "years": "{0}年",
1027 }
1029 month_names = [
1030 "",
1031 "1月",
1032 "2月",
1033 "3月",
1034 "4月",
1035 "5月",
1036 "6月",
1037 "7月",
1038 "8月",
1039 "9月",
1040 "10月",
1041 "11月",
1042 "12月",
1043 ]
1044 month_abbreviations = [
1045 "",
1046 " 1",
1047 " 2",
1048 " 3",
1049 " 4",
1050 " 5",
1051 " 6",
1052 " 7",
1053 " 8",
1054 " 9",
1055 "10",
1056 "11",
1057 "12",
1058 ]
1060 day_names = ["", "週一", "週二", "週三", "週四", "週五", "週六", "週日"]
1061 day_abbreviations = ["", "一", "二", "三", "四", "五", "六", "日"]
1064class HongKongLocale(Locale):
1065 names = ["zh-hk"]
1067 past = "{0}前"
1068 future = "{0}後"
1070 timeframes = {
1071 "now": "剛才",
1072 "second": "1秒",
1073 "seconds": "{0}秒",
1074 "minute": "1分鐘",
1075 "minutes": "{0}分鐘",
1076 "hour": "1小時",
1077 "hours": "{0}小時",
1078 "day": "1天",
1079 "days": "{0}天",
1080 "week": "1星期",
1081 "weeks": "{0}星期",
1082 "month": "1個月",
1083 "months": "{0}個月",
1084 "year": "1年",
1085 "years": "{0}年",
1086 }
1088 month_names = [
1089 "",
1090 "1月",
1091 "2月",
1092 "3月",
1093 "4月",
1094 "5月",
1095 "6月",
1096 "7月",
1097 "8月",
1098 "9月",
1099 "10月",
1100 "11月",
1101 "12月",
1102 ]
1103 month_abbreviations = [
1104 "",
1105 " 1",
1106 " 2",
1107 " 3",
1108 " 4",
1109 " 5",
1110 " 6",
1111 " 7",
1112 " 8",
1113 " 9",
1114 "10",
1115 "11",
1116 "12",
1117 ]
1119 day_names = ["", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"]
1120 day_abbreviations = ["", "一", "二", "三", "四", "五", "六", "日"]
1123class KoreanLocale(Locale):
1124 names = ["ko", "ko-kr"]
1126 past = "{0} 전"
1127 future = "{0} 후"
1129 timeframes = {
1130 "now": "지금",
1131 "second": "1초",
1132 "seconds": "{0}초",
1133 "minute": "1분",
1134 "minutes": "{0}분",
1135 "hour": "한시간",
1136 "hours": "{0}시간",
1137 "day": "하루",
1138 "days": "{0}일",
1139 "week": "1주",
1140 "weeks": "{0}주",
1141 "month": "한달",
1142 "months": "{0}개월",
1143 "year": "1년",
1144 "years": "{0}년",
1145 }
1147 special_dayframes = {
1148 -3: "그끄제",
1149 -2: "그제",
1150 -1: "어제",
1151 1: "내일",
1152 2: "모레",
1153 3: "글피",
1154 4: "그글피",
1155 }
1157 special_yearframes = {-2: "제작년", -1: "작년", 1: "내년", 2: "내후년"}
1159 month_names = [
1160 "",
1161 "1월",
1162 "2월",
1163 "3월",
1164 "4월",
1165 "5월",
1166 "6월",
1167 "7월",
1168 "8월",
1169 "9월",
1170 "10월",
1171 "11월",
1172 "12월",
1173 ]
1174 month_abbreviations = [
1175 "",
1176 " 1",
1177 " 2",
1178 " 3",
1179 " 4",
1180 " 5",
1181 " 6",
1182 " 7",
1183 " 8",
1184 " 9",
1185 "10",
1186 "11",
1187 "12",
1188 ]
1190 day_names = ["", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일", "일요일"]
1191 day_abbreviations = ["", "월", "화", "수", "목", "금", "토", "일"]
1193 def _ordinal_number(self, n: int) -> str:
1194 ordinals = ["0", "첫", "두", "세", "네", "다섯", "여섯", "일곱", "여덟", "아홉", "열"]
1195 if n < len(ordinals):
1196 return f"{ordinals[n]}번째"
1197 return f"{n}번째"
1199 def _format_relative(
1200 self,
1201 humanized: str,
1202 timeframe: TimeFrameLiteral,
1203 delta: Union[float, int],
1204 ) -> str:
1205 if timeframe in ("day", "days"):
1206 special = self.special_dayframes.get(int(delta))
1207 if special:
1208 return special
1209 elif timeframe in ("year", "years"):
1210 special = self.special_yearframes.get(int(delta))
1211 if special:
1212 return special
1214 return super()._format_relative(humanized, timeframe, delta)
1217# derived locale types & implementations.
1218class DutchLocale(Locale):
1219 names = ["nl", "nl-nl"]
1221 past = "{0} geleden"
1222 future = "over {0}"
1224 timeframes = {
1225 "now": "nu",
1226 "second": "een seconde",
1227 "seconds": "{0} seconden",
1228 "minute": "een minuut",
1229 "minutes": "{0} minuten",
1230 "hour": "een uur",
1231 "hours": "{0} uur",
1232 "day": "een dag",
1233 "days": "{0} dagen",
1234 "week": "een week",
1235 "weeks": "{0} weken",
1236 "month": "een maand",
1237 "months": "{0} maanden",
1238 "year": "een jaar",
1239 "years": "{0} jaar",
1240 }
1242 # In Dutch names of months and days are not starting with a capital letter
1243 # like in the English language.
1244 month_names = [
1245 "",
1246 "januari",
1247 "februari",
1248 "maart",
1249 "april",
1250 "mei",
1251 "juni",
1252 "juli",
1253 "augustus",
1254 "september",
1255 "oktober",
1256 "november",
1257 "december",
1258 ]
1259 month_abbreviations = [
1260 "",
1261 "jan",
1262 "feb",
1263 "mrt",
1264 "apr",
1265 "mei",
1266 "jun",
1267 "jul",
1268 "aug",
1269 "sep",
1270 "okt",
1271 "nov",
1272 "dec",
1273 ]
1275 day_names = [
1276 "",
1277 "maandag",
1278 "dinsdag",
1279 "woensdag",
1280 "donderdag",
1281 "vrijdag",
1282 "zaterdag",
1283 "zondag",
1284 ]
1285 day_abbreviations = ["", "ma", "di", "wo", "do", "vr", "za", "zo"]
1288class SlavicBaseLocale(Locale):
1289 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]]
1291 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
1292 form = self.timeframes[timeframe]
1293 delta = abs(delta)
1295 if isinstance(form, Mapping):
1296 if delta % 10 == 1 and delta % 100 != 11:
1297 form = form["singular"]
1298 elif 2 <= delta % 10 <= 4 and (delta % 100 < 10 or delta % 100 >= 20):
1299 form = form["dual"]
1300 else:
1301 form = form["plural"]
1303 return form.format(delta)
1306class BelarusianLocale(SlavicBaseLocale):
1307 names = ["be", "be-by"]
1309 past = "{0} таму"
1310 future = "праз {0}"
1312 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
1313 "now": "зараз",
1314 "second": "секунду",
1315 "seconds": "{0} некалькі секунд",
1316 "minute": "хвіліну",
1317 "minutes": {
1318 "singular": "{0} хвіліну",
1319 "dual": "{0} хвіліны",
1320 "plural": "{0} хвілін",
1321 },
1322 "hour": "гадзіну",
1323 "hours": {
1324 "singular": "{0} гадзіну",
1325 "dual": "{0} гадзіны",
1326 "plural": "{0} гадзін",
1327 },
1328 "day": "дзень",
1329 "days": {"singular": "{0} дзень", "dual": "{0} дні", "plural": "{0} дзён"},
1330 "month": "месяц",
1331 "months": {
1332 "singular": "{0} месяц",
1333 "dual": "{0} месяцы",
1334 "plural": "{0} месяцаў",
1335 },
1336 "year": "год",
1337 "years": {"singular": "{0} год", "dual": "{0} гады", "plural": "{0} гадоў"},
1338 }
1340 month_names = [
1341 "",
1342 "студзеня",
1343 "лютага",
1344 "сакавіка",
1345 "красавіка",
1346 "траўня",
1347 "чэрвеня",
1348 "ліпеня",
1349 "жніўня",
1350 "верасня",
1351 "кастрычніка",
1352 "лістапада",
1353 "снежня",
1354 ]
1355 month_abbreviations = [
1356 "",
1357 "студ",
1358 "лют",
1359 "сак",
1360 "крас",
1361 "трав",
1362 "чэрв",
1363 "ліп",
1364 "жнів",
1365 "вер",
1366 "каст",
1367 "ліст",
1368 "снеж",
1369 ]
1371 day_names = [
1372 "",
1373 "панядзелак",
1374 "аўторак",
1375 "серада",
1376 "чацвер",
1377 "пятніца",
1378 "субота",
1379 "нядзеля",
1380 ]
1381 day_abbreviations = ["", "пн", "ат", "ср", "чц", "пт", "сб", "нд"]
1384class PolishLocale(SlavicBaseLocale):
1385 names = ["pl", "pl-pl"]
1387 past = "{0} temu"
1388 future = "za {0}"
1390 # The nouns should be in genitive case (Polish: "dopełniacz")
1391 # in order to correctly form `past` & `future` expressions.
1392 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
1393 "now": "teraz",
1394 "second": "sekundę",
1395 "seconds": {
1396 "singular": "{0} sekund",
1397 "dual": "{0} sekundy",
1398 "plural": "{0} sekund",
1399 },
1400 "minute": "minutę",
1401 "minutes": {
1402 "singular": "{0} minut",
1403 "dual": "{0} minuty",
1404 "plural": "{0} minut",
1405 },
1406 "hour": "godzinę",
1407 "hours": {
1408 "singular": "{0} godzin",
1409 "dual": "{0} godziny",
1410 "plural": "{0} godzin",
1411 },
1412 "day": "dzień",
1413 "days": "{0} dni",
1414 "week": "tydzień",
1415 "weeks": {
1416 "singular": "{0} tygodni",
1417 "dual": "{0} tygodnie",
1418 "plural": "{0} tygodni",
1419 },
1420 "month": "miesiąc",
1421 "months": {
1422 "singular": "{0} miesięcy",
1423 "dual": "{0} miesiące",
1424 "plural": "{0} miesięcy",
1425 },
1426 "year": "rok",
1427 "years": {"singular": "{0} lat", "dual": "{0} lata", "plural": "{0} lat"},
1428 }
1430 month_names = [
1431 "",
1432 "styczeń",
1433 "luty",
1434 "marzec",
1435 "kwiecień",
1436 "maj",
1437 "czerwiec",
1438 "lipiec",
1439 "sierpień",
1440 "wrzesień",
1441 "październik",
1442 "listopad",
1443 "grudzień",
1444 ]
1445 month_abbreviations = [
1446 "",
1447 "sty",
1448 "lut",
1449 "mar",
1450 "kwi",
1451 "maj",
1452 "cze",
1453 "lip",
1454 "sie",
1455 "wrz",
1456 "paź",
1457 "lis",
1458 "gru",
1459 ]
1461 day_names = [
1462 "",
1463 "poniedziałek",
1464 "wtorek",
1465 "środa",
1466 "czwartek",
1467 "piątek",
1468 "sobota",
1469 "niedziela",
1470 ]
1471 day_abbreviations = ["", "Pn", "Wt", "Śr", "Czw", "Pt", "So", "Nd"]
1474class RussianLocale(SlavicBaseLocale):
1475 names = ["ru", "ru-ru"]
1477 past = "{0} назад"
1478 future = "через {0}"
1480 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
1481 "now": "сейчас",
1482 "second": "секунда",
1483 "seconds": {
1484 "singular": "{0} секунду",
1485 "dual": "{0} секунды",
1486 "plural": "{0} секунд",
1487 },
1488 "minute": "минуту",
1489 "minutes": {
1490 "singular": "{0} минуту",
1491 "dual": "{0} минуты",
1492 "plural": "{0} минут",
1493 },
1494 "hour": "час",
1495 "hours": {"singular": "{0} час", "dual": "{0} часа", "plural": "{0} часов"},
1496 "day": "день",
1497 "days": {"singular": "{0} день", "dual": "{0} дня", "plural": "{0} дней"},
1498 "week": "неделю",
1499 "weeks": {
1500 "singular": "{0} неделю",
1501 "dual": "{0} недели",
1502 "plural": "{0} недель",
1503 },
1504 "month": "месяц",
1505 "months": {
1506 "singular": "{0} месяц",
1507 "dual": "{0} месяца",
1508 "plural": "{0} месяцев",
1509 },
1510 "quarter": "квартал",
1511 "quarters": {
1512 "singular": "{0} квартал",
1513 "dual": "{0} квартала",
1514 "plural": "{0} кварталов",
1515 },
1516 "year": "год",
1517 "years": {"singular": "{0} год", "dual": "{0} года", "plural": "{0} лет"},
1518 }
1520 month_names = [
1521 "",
1522 "января",
1523 "февраля",
1524 "марта",
1525 "апреля",
1526 "мая",
1527 "июня",
1528 "июля",
1529 "августа",
1530 "сентября",
1531 "октября",
1532 "ноября",
1533 "декабря",
1534 ]
1535 month_abbreviations = [
1536 "",
1537 "янв",
1538 "фев",
1539 "мар",
1540 "апр",
1541 "май",
1542 "июн",
1543 "июл",
1544 "авг",
1545 "сен",
1546 "окт",
1547 "ноя",
1548 "дек",
1549 ]
1551 day_names = [
1552 "",
1553 "понедельник",
1554 "вторник",
1555 "среда",
1556 "четверг",
1557 "пятница",
1558 "суббота",
1559 "воскресенье",
1560 ]
1561 day_abbreviations = ["", "пн", "вт", "ср", "чт", "пт", "сб", "вс"]
1564class AfrikaansLocale(Locale):
1565 names = ["af", "af-nl"]
1567 past = "{0} gelede"
1568 future = "in {0}"
1570 timeframes = {
1571 "now": "nou",
1572 "second": "n sekonde",
1573 "seconds": "{0} sekondes",
1574 "minute": "minuut",
1575 "minutes": "{0} minute",
1576 "hour": "uur",
1577 "hours": "{0} ure",
1578 "day": "een dag",
1579 "days": "{0} dae",
1580 "month": "een maand",
1581 "months": "{0} maande",
1582 "year": "een jaar",
1583 "years": "{0} jaar",
1584 }
1586 month_names = [
1587 "",
1588 "Januarie",
1589 "Februarie",
1590 "Maart",
1591 "April",
1592 "Mei",
1593 "Junie",
1594 "Julie",
1595 "Augustus",
1596 "September",
1597 "Oktober",
1598 "November",
1599 "Desember",
1600 ]
1601 month_abbreviations = [
1602 "",
1603 "Jan",
1604 "Feb",
1605 "Mrt",
1606 "Apr",
1607 "Mei",
1608 "Jun",
1609 "Jul",
1610 "Aug",
1611 "Sep",
1612 "Okt",
1613 "Nov",
1614 "Des",
1615 ]
1617 day_names = [
1618 "",
1619 "Maandag",
1620 "Dinsdag",
1621 "Woensdag",
1622 "Donderdag",
1623 "Vrydag",
1624 "Saterdag",
1625 "Sondag",
1626 ]
1627 day_abbreviations = ["", "Ma", "Di", "Wo", "Do", "Vr", "Za", "So"]
1630class BulgarianLocale(SlavicBaseLocale):
1631 names = ["bg", "bg-bg"]
1633 past = "{0} назад"
1634 future = "напред {0}"
1636 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
1637 "now": "сега",
1638 "second": "секунда",
1639 "seconds": "{0} няколко секунди",
1640 "minute": "минута",
1641 "minutes": {
1642 "singular": "{0} минута",
1643 "dual": "{0} минути",
1644 "plural": "{0} минути",
1645 },
1646 "hour": "час",
1647 "hours": {"singular": "{0} час", "dual": "{0} часа", "plural": "{0} часа"},
1648 "day": "ден",
1649 "days": {"singular": "{0} ден", "dual": "{0} дни", "plural": "{0} дни"},
1650 "month": "месец",
1651 "months": {
1652 "singular": "{0} месец",
1653 "dual": "{0} месеца",
1654 "plural": "{0} месеца",
1655 },
1656 "year": "година",
1657 "years": {
1658 "singular": "{0} година",
1659 "dual": "{0} години",
1660 "plural": "{0} години",
1661 },
1662 }
1664 month_names = [
1665 "",
1666 "януари",
1667 "февруари",
1668 "март",
1669 "април",
1670 "май",
1671 "юни",
1672 "юли",
1673 "август",
1674 "септември",
1675 "октомври",
1676 "ноември",
1677 "декември",
1678 ]
1679 month_abbreviations = [
1680 "",
1681 "ян",
1682 "февр",
1683 "март",
1684 "апр",
1685 "май",
1686 "юни",
1687 "юли",
1688 "авг",
1689 "септ",
1690 "окт",
1691 "ноем",
1692 "дек",
1693 ]
1695 day_names = [
1696 "",
1697 "понеделник",
1698 "вторник",
1699 "сряда",
1700 "четвъртък",
1701 "петък",
1702 "събота",
1703 "неделя",
1704 ]
1705 day_abbreviations = ["", "пон", "вт", "ср", "четв", "пет", "съб", "нед"]
1708class UkrainianLocale(SlavicBaseLocale):
1709 names = ["ua", "uk", "uk-ua"]
1711 past = "{0} тому"
1712 future = "за {0}"
1714 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
1715 "now": "зараз",
1716 "second": "секунда",
1717 "seconds": "{0} кілька секунд",
1718 "minute": "хвилину",
1719 "minutes": {
1720 "singular": "{0} хвилину",
1721 "dual": "{0} хвилини",
1722 "plural": "{0} хвилин",
1723 },
1724 "hour": "годину",
1725 "hours": {
1726 "singular": "{0} годину",
1727 "dual": "{0} години",
1728 "plural": "{0} годин",
1729 },
1730 "day": "день",
1731 "days": {"singular": "{0} день", "dual": "{0} дні", "plural": "{0} днів"},
1732 "month": "місяць",
1733 "months": {
1734 "singular": "{0} місяць",
1735 "dual": "{0} місяці",
1736 "plural": "{0} місяців",
1737 },
1738 "year": "рік",
1739 "years": {"singular": "{0} рік", "dual": "{0} роки", "plural": "{0} років"},
1740 }
1742 month_names = [
1743 "",
1744 "січня",
1745 "лютого",
1746 "березня",
1747 "квітня",
1748 "травня",
1749 "червня",
1750 "липня",
1751 "серпня",
1752 "вересня",
1753 "жовтня",
1754 "листопада",
1755 "грудня",
1756 ]
1757 month_abbreviations = [
1758 "",
1759 "січ",
1760 "лют",
1761 "бер",
1762 "квіт",
1763 "трав",
1764 "черв",
1765 "лип",
1766 "серп",
1767 "вер",
1768 "жовт",
1769 "лист",
1770 "груд",
1771 ]
1773 day_names = [
1774 "",
1775 "понеділок",
1776 "вівторок",
1777 "середа",
1778 "четвер",
1779 "п’ятниця",
1780 "субота",
1781 "неділя",
1782 ]
1783 day_abbreviations = ["", "пн", "вт", "ср", "чт", "пт", "сб", "нд"]
1786class MacedonianLocale(SlavicBaseLocale):
1787 names = ["mk", "mk-mk"]
1789 past = "пред {0}"
1790 future = "за {0}"
1792 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
1793 "now": "сега",
1794 "second": "една секунда",
1795 "seconds": {
1796 "singular": "{0} секунда",
1797 "dual": "{0} секунди",
1798 "plural": "{0} секунди",
1799 },
1800 "minute": "една минута",
1801 "minutes": {
1802 "singular": "{0} минута",
1803 "dual": "{0} минути",
1804 "plural": "{0} минути",
1805 },
1806 "hour": "еден саат",
1807 "hours": {"singular": "{0} саат", "dual": "{0} саати", "plural": "{0} саати"},
1808 "day": "еден ден",
1809 "days": {"singular": "{0} ден", "dual": "{0} дена", "plural": "{0} дена"},
1810 "week": "една недела",
1811 "weeks": {
1812 "singular": "{0} недела",
1813 "dual": "{0} недели",
1814 "plural": "{0} недели",
1815 },
1816 "month": "еден месец",
1817 "months": {
1818 "singular": "{0} месец",
1819 "dual": "{0} месеци",
1820 "plural": "{0} месеци",
1821 },
1822 "year": "една година",
1823 "years": {
1824 "singular": "{0} година",
1825 "dual": "{0} години",
1826 "plural": "{0} години",
1827 },
1828 }
1830 meridians = {"am": "дп", "pm": "пп", "AM": "претпладне", "PM": "попладне"}
1832 month_names = [
1833 "",
1834 "Јануари",
1835 "Февруари",
1836 "Март",
1837 "Април",
1838 "Мај",
1839 "Јуни",
1840 "Јули",
1841 "Август",
1842 "Септември",
1843 "Октомври",
1844 "Ноември",
1845 "Декември",
1846 ]
1847 month_abbreviations = [
1848 "",
1849 "Јан",
1850 "Фев",
1851 "Мар",
1852 "Апр",
1853 "Мај",
1854 "Јун",
1855 "Јул",
1856 "Авг",
1857 "Септ",
1858 "Окт",
1859 "Ноем",
1860 "Декем",
1861 ]
1863 day_names = [
1864 "",
1865 "Понеделник",
1866 "Вторник",
1867 "Среда",
1868 "Четврток",
1869 "Петок",
1870 "Сабота",
1871 "Недела",
1872 ]
1873 day_abbreviations = [
1874 "",
1875 "Пон",
1876 "Вт",
1877 "Сре",
1878 "Чет",
1879 "Пет",
1880 "Саб",
1881 "Нед",
1882 ]
1885class GermanBaseLocale(Locale):
1886 past = "vor {0}"
1887 future = "in {0}"
1888 and_word = "und"
1890 timeframes: ClassVar[Dict[TimeFrameLiteral, str]] = {
1891 "now": "gerade eben",
1892 "second": "einer Sekunde",
1893 "seconds": "{0} Sekunden",
1894 "minute": "einer Minute",
1895 "minutes": "{0} Minuten",
1896 "hour": "einer Stunde",
1897 "hours": "{0} Stunden",
1898 "day": "einem Tag",
1899 "days": "{0} Tagen",
1900 "week": "einer Woche",
1901 "weeks": "{0} Wochen",
1902 "month": "einem Monat",
1903 "months": "{0} Monaten",
1904 "year": "einem Jahr",
1905 "years": "{0} Jahren",
1906 }
1908 timeframes_only_distance = timeframes.copy()
1909 timeframes_only_distance["second"] = "eine Sekunde"
1910 timeframes_only_distance["minute"] = "eine Minute"
1911 timeframes_only_distance["hour"] = "eine Stunde"
1912 timeframes_only_distance["day"] = "ein Tag"
1913 timeframes_only_distance["days"] = "{0} Tage"
1914 timeframes_only_distance["week"] = "eine Woche"
1915 timeframes_only_distance["month"] = "ein Monat"
1916 timeframes_only_distance["months"] = "{0} Monate"
1917 timeframes_only_distance["year"] = "ein Jahr"
1918 timeframes_only_distance["years"] = "{0} Jahre"
1920 month_names = [
1921 "",
1922 "Januar",
1923 "Februar",
1924 "März",
1925 "April",
1926 "Mai",
1927 "Juni",
1928 "Juli",
1929 "August",
1930 "September",
1931 "Oktober",
1932 "November",
1933 "Dezember",
1934 ]
1936 month_abbreviations = [
1937 "",
1938 "Jan",
1939 "Feb",
1940 "Mär",
1941 "Apr",
1942 "Mai",
1943 "Jun",
1944 "Jul",
1945 "Aug",
1946 "Sep",
1947 "Okt",
1948 "Nov",
1949 "Dez",
1950 ]
1952 day_names = [
1953 "",
1954 "Montag",
1955 "Dienstag",
1956 "Mittwoch",
1957 "Donnerstag",
1958 "Freitag",
1959 "Samstag",
1960 "Sonntag",
1961 ]
1963 day_abbreviations = ["", "Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"]
1965 def _ordinal_number(self, n: int) -> str:
1966 return f"{n}."
1968 def describe(
1969 self,
1970 timeframe: TimeFrameLiteral,
1971 delta: Union[int, float] = 0,
1972 only_distance: bool = False,
1973 ) -> str:
1974 """Describes a delta within a timeframe in plain language.
1976 :param timeframe: a string representing a timeframe.
1977 :param delta: a quantity representing a delta in a timeframe.
1978 :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords
1979 """
1981 if not only_distance:
1982 return super().describe(timeframe, delta, only_distance)
1984 # German uses a different case without 'in' or 'ago'
1985 humanized: str = self.timeframes_only_distance[timeframe].format(
1986 trunc(abs(delta))
1987 )
1989 return humanized
1992class GermanLocale(GermanBaseLocale, Locale):
1993 names = ["de", "de-de"]
1996class SwissLocale(GermanBaseLocale, Locale):
1997 names = ["de-ch"]
2000class AustrianLocale(GermanBaseLocale, Locale):
2001 names = ["de-at"]
2003 month_names = [
2004 "",
2005 "Jänner",
2006 "Februar",
2007 "März",
2008 "April",
2009 "Mai",
2010 "Juni",
2011 "Juli",
2012 "August",
2013 "September",
2014 "Oktober",
2015 "November",
2016 "Dezember",
2017 ]
2020class NorwegianLocale(Locale):
2021 names = ["nb", "nb-no"]
2023 past = "for {0} siden"
2024 future = "om {0}"
2026 timeframes = {
2027 "now": "nå nettopp",
2028 "second": "ett sekund",
2029 "seconds": "{0} sekunder",
2030 "minute": "ett minutt",
2031 "minutes": "{0} minutter",
2032 "hour": "en time",
2033 "hours": "{0} timer",
2034 "day": "en dag",
2035 "days": "{0} dager",
2036 "week": "en uke",
2037 "weeks": "{0} uker",
2038 "month": "en måned",
2039 "months": "{0} måneder",
2040 "year": "ett år",
2041 "years": "{0} år",
2042 }
2044 month_names = [
2045 "",
2046 "januar",
2047 "februar",
2048 "mars",
2049 "april",
2050 "mai",
2051 "juni",
2052 "juli",
2053 "august",
2054 "september",
2055 "oktober",
2056 "november",
2057 "desember",
2058 ]
2059 month_abbreviations = [
2060 "",
2061 "jan",
2062 "feb",
2063 "mar",
2064 "apr",
2065 "mai",
2066 "jun",
2067 "jul",
2068 "aug",
2069 "sep",
2070 "okt",
2071 "nov",
2072 "des",
2073 ]
2075 day_names = [
2076 "",
2077 "mandag",
2078 "tirsdag",
2079 "onsdag",
2080 "torsdag",
2081 "fredag",
2082 "lørdag",
2083 "søndag",
2084 ]
2085 day_abbreviations = ["", "ma", "ti", "on", "to", "fr", "lø", "sø"]
2087 def _ordinal_number(self, n: int) -> str:
2088 return f"{n}."
2091class NewNorwegianLocale(Locale):
2092 names = ["nn", "nn-no"]
2094 past = "for {0} sidan"
2095 future = "om {0}"
2097 timeframes = {
2098 "now": "no nettopp",
2099 "second": "eitt sekund",
2100 "seconds": "{0} sekund",
2101 "minute": "eitt minutt",
2102 "minutes": "{0} minutt",
2103 "hour": "ein time",
2104 "hours": "{0} timar",
2105 "day": "ein dag",
2106 "days": "{0} dagar",
2107 "week": "ei veke",
2108 "weeks": "{0} veker",
2109 "month": "ein månad",
2110 "months": "{0} månader",
2111 "year": "eitt år",
2112 "years": "{0} år",
2113 }
2115 month_names = [
2116 "",
2117 "januar",
2118 "februar",
2119 "mars",
2120 "april",
2121 "mai",
2122 "juni",
2123 "juli",
2124 "august",
2125 "september",
2126 "oktober",
2127 "november",
2128 "desember",
2129 ]
2130 month_abbreviations = [
2131 "",
2132 "jan",
2133 "feb",
2134 "mar",
2135 "apr",
2136 "mai",
2137 "jun",
2138 "jul",
2139 "aug",
2140 "sep",
2141 "okt",
2142 "nov",
2143 "des",
2144 ]
2146 day_names = [
2147 "",
2148 "måndag",
2149 "tysdag",
2150 "onsdag",
2151 "torsdag",
2152 "fredag",
2153 "laurdag",
2154 "sundag",
2155 ]
2156 day_abbreviations = ["", "må", "ty", "on", "to", "fr", "la", "su"]
2158 def _ordinal_number(self, n: int) -> str:
2159 return f"{n}."
2162class PortugueseLocale(Locale):
2163 names = ["pt", "pt-pt"]
2165 past = "há {0}"
2166 future = "em {0}"
2167 and_word = "e"
2169 timeframes = {
2170 "now": "agora",
2171 "second": "um segundo",
2172 "seconds": "{0} segundos",
2173 "minute": "um minuto",
2174 "minutes": "{0} minutos",
2175 "hour": "uma hora",
2176 "hours": "{0} horas",
2177 "day": "um dia",
2178 "days": "{0} dias",
2179 "week": "uma semana",
2180 "weeks": "{0} semanas",
2181 "month": "um mês",
2182 "months": "{0} meses",
2183 "year": "um ano",
2184 "years": "{0} anos",
2185 }
2187 month_names = [
2188 "",
2189 "Janeiro",
2190 "Fevereiro",
2191 "Março",
2192 "Abril",
2193 "Maio",
2194 "Junho",
2195 "Julho",
2196 "Agosto",
2197 "Setembro",
2198 "Outubro",
2199 "Novembro",
2200 "Dezembro",
2201 ]
2202 month_abbreviations = [
2203 "",
2204 "Jan",
2205 "Fev",
2206 "Mar",
2207 "Abr",
2208 "Mai",
2209 "Jun",
2210 "Jul",
2211 "Ago",
2212 "Set",
2213 "Out",
2214 "Nov",
2215 "Dez",
2216 ]
2218 day_names = [
2219 "",
2220 "Segunda-feira",
2221 "Terça-feira",
2222 "Quarta-feira",
2223 "Quinta-feira",
2224 "Sexta-feira",
2225 "Sábado",
2226 "Domingo",
2227 ]
2228 day_abbreviations = ["", "Seg", "Ter", "Qua", "Qui", "Sex", "Sab", "Dom"]
2231class BrazilianPortugueseLocale(PortugueseLocale):
2232 names = ["pt-br"]
2234 past = "faz {0}"
2237class TagalogLocale(Locale):
2238 names = ["tl", "tl-ph"]
2240 past = "nakaraang {0}"
2241 future = "{0} mula ngayon"
2243 timeframes = {
2244 "now": "ngayon lang",
2245 "second": "isang segundo",
2246 "seconds": "{0} segundo",
2247 "minute": "isang minuto",
2248 "minutes": "{0} minuto",
2249 "hour": "isang oras",
2250 "hours": "{0} oras",
2251 "day": "isang araw",
2252 "days": "{0} araw",
2253 "week": "isang linggo",
2254 "weeks": "{0} linggo",
2255 "month": "isang buwan",
2256 "months": "{0} buwan",
2257 "year": "isang taon",
2258 "years": "{0} taon",
2259 }
2261 month_names = [
2262 "",
2263 "Enero",
2264 "Pebrero",
2265 "Marso",
2266 "Abril",
2267 "Mayo",
2268 "Hunyo",
2269 "Hulyo",
2270 "Agosto",
2271 "Setyembre",
2272 "Oktubre",
2273 "Nobyembre",
2274 "Disyembre",
2275 ]
2276 month_abbreviations = [
2277 "",
2278 "Ene",
2279 "Peb",
2280 "Mar",
2281 "Abr",
2282 "May",
2283 "Hun",
2284 "Hul",
2285 "Ago",
2286 "Set",
2287 "Okt",
2288 "Nob",
2289 "Dis",
2290 ]
2292 day_names = [
2293 "",
2294 "Lunes",
2295 "Martes",
2296 "Miyerkules",
2297 "Huwebes",
2298 "Biyernes",
2299 "Sabado",
2300 "Linggo",
2301 ]
2302 day_abbreviations = ["", "Lun", "Mar", "Miy", "Huw", "Biy", "Sab", "Lin"]
2304 meridians = {"am": "nu", "pm": "nh", "AM": "ng umaga", "PM": "ng hapon"}
2306 def _ordinal_number(self, n: int) -> str:
2307 return f"ika-{n}"
2310class VietnameseLocale(Locale):
2311 names = ["vi", "vi-vn"]
2313 past = "{0} trước"
2314 future = "{0} nữa"
2316 timeframes = {
2317 "now": "hiện tại",
2318 "second": "một giây",
2319 "seconds": "{0} giây",
2320 "minute": "một phút",
2321 "minutes": "{0} phút",
2322 "hour": "một giờ",
2323 "hours": "{0} giờ",
2324 "day": "một ngày",
2325 "days": "{0} ngày",
2326 "week": "một tuần",
2327 "weeks": "{0} tuần",
2328 "month": "một tháng",
2329 "months": "{0} tháng",
2330 "year": "một năm",
2331 "years": "{0} năm",
2332 }
2334 month_names = [
2335 "",
2336 "Tháng Một",
2337 "Tháng Hai",
2338 "Tháng Ba",
2339 "Tháng Tư",
2340 "Tháng Năm",
2341 "Tháng Sáu",
2342 "Tháng Bảy",
2343 "Tháng Tám",
2344 "Tháng Chín",
2345 "Tháng Mười",
2346 "Tháng Mười Một",
2347 "Tháng Mười Hai",
2348 ]
2349 month_abbreviations = [
2350 "",
2351 "Tháng 1",
2352 "Tháng 2",
2353 "Tháng 3",
2354 "Tháng 4",
2355 "Tháng 5",
2356 "Tháng 6",
2357 "Tháng 7",
2358 "Tháng 8",
2359 "Tháng 9",
2360 "Tháng 10",
2361 "Tháng 11",
2362 "Tháng 12",
2363 ]
2365 day_names = [
2366 "",
2367 "Thứ Hai",
2368 "Thứ Ba",
2369 "Thứ Tư",
2370 "Thứ Năm",
2371 "Thứ Sáu",
2372 "Thứ Bảy",
2373 "Chủ Nhật",
2374 ]
2375 day_abbreviations = ["", "Thứ 2", "Thứ 3", "Thứ 4", "Thứ 5", "Thứ 6", "Thứ 7", "CN"]
2378class TurkishLocale(Locale):
2379 names = ["tr", "tr-tr"]
2381 past = "{0} önce"
2382 future = "{0} sonra"
2383 and_word = "ve"
2385 timeframes = {
2386 "now": "şimdi",
2387 "second": "bir saniye",
2388 "seconds": "{0} saniye",
2389 "minute": "bir dakika",
2390 "minutes": "{0} dakika",
2391 "hour": "bir saat",
2392 "hours": "{0} saat",
2393 "day": "bir gün",
2394 "days": "{0} gün",
2395 "week": "bir hafta",
2396 "weeks": "{0} hafta",
2397 "month": "bir ay",
2398 "months": "{0} ay",
2399 "year": "bir yıl",
2400 "years": "{0} yıl",
2401 }
2403 meridians = {"am": "öö", "pm": "ös", "AM": "ÖÖ", "PM": "ÖS"}
2405 month_names = [
2406 "",
2407 "Ocak",
2408 "Şubat",
2409 "Mart",
2410 "Nisan",
2411 "Mayıs",
2412 "Haziran",
2413 "Temmuz",
2414 "Ağustos",
2415 "Eylül",
2416 "Ekim",
2417 "Kasım",
2418 "Aralık",
2419 ]
2420 month_abbreviations = [
2421 "",
2422 "Oca",
2423 "Şub",
2424 "Mar",
2425 "Nis",
2426 "May",
2427 "Haz",
2428 "Tem",
2429 "Ağu",
2430 "Eyl",
2431 "Eki",
2432 "Kas",
2433 "Ara",
2434 ]
2436 day_names = [
2437 "",
2438 "Pazartesi",
2439 "Salı",
2440 "Çarşamba",
2441 "Perşembe",
2442 "Cuma",
2443 "Cumartesi",
2444 "Pazar",
2445 ]
2446 day_abbreviations = ["", "Pzt", "Sal", "Çar", "Per", "Cum", "Cmt", "Paz"]
2449class AzerbaijaniLocale(Locale):
2450 names = ["az", "az-az"]
2452 past = "{0} əvvəl"
2453 future = "{0} sonra"
2455 timeframes = {
2456 "now": "indi",
2457 "second": "bir saniyə",
2458 "seconds": "{0} saniyə",
2459 "minute": "bir dəqiqə",
2460 "minutes": "{0} dəqiqə",
2461 "hour": "bir saat",
2462 "hours": "{0} saat",
2463 "day": "bir gün",
2464 "days": "{0} gün",
2465 "week": "bir həftə",
2466 "weeks": "{0} həftə",
2467 "month": "bir ay",
2468 "months": "{0} ay",
2469 "year": "bir il",
2470 "years": "{0} il",
2471 }
2473 month_names = [
2474 "",
2475 "Yanvar",
2476 "Fevral",
2477 "Mart",
2478 "Aprel",
2479 "May",
2480 "İyun",
2481 "İyul",
2482 "Avqust",
2483 "Sentyabr",
2484 "Oktyabr",
2485 "Noyabr",
2486 "Dekabr",
2487 ]
2488 month_abbreviations = [
2489 "",
2490 "Yan",
2491 "Fev",
2492 "Mar",
2493 "Apr",
2494 "May",
2495 "İyn",
2496 "İyl",
2497 "Avq",
2498 "Sen",
2499 "Okt",
2500 "Noy",
2501 "Dek",
2502 ]
2504 day_names = [
2505 "",
2506 "Bazar ertəsi",
2507 "Çərşənbə axşamı",
2508 "Çərşənbə",
2509 "Cümə axşamı",
2510 "Cümə",
2511 "Şənbə",
2512 "Bazar",
2513 ]
2514 day_abbreviations = ["", "Ber", "Çax", "Çər", "Cax", "Cüm", "Şnb", "Bzr"]
2517class ArabicLocale(Locale):
2518 names = [
2519 "ar",
2520 "ar-ae",
2521 "ar-bh",
2522 "ar-dj",
2523 "ar-eg",
2524 "ar-eh",
2525 "ar-er",
2526 "ar-km",
2527 "ar-kw",
2528 "ar-ly",
2529 "ar-om",
2530 "ar-qa",
2531 "ar-sa",
2532 "ar-sd",
2533 "ar-so",
2534 "ar-ss",
2535 "ar-td",
2536 "ar-ye",
2537 ]
2539 past = "منذ {0}"
2540 future = "خلال {0}"
2542 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
2543 "now": "الآن",
2544 "second": "ثانية",
2545 "seconds": {"2": "ثانيتين", "ten": "{0} ثوان", "higher": "{0} ثانية"},
2546 "minute": "دقيقة",
2547 "minutes": {"2": "دقيقتين", "ten": "{0} دقائق", "higher": "{0} دقيقة"},
2548 "hour": "ساعة",
2549 "hours": {"2": "ساعتين", "ten": "{0} ساعات", "higher": "{0} ساعة"},
2550 "day": "يوم",
2551 "days": {"2": "يومين", "ten": "{0} أيام", "higher": "{0} يوم"},
2552 "week": "اسبوع",
2553 "weeks": {"2": "اسبوعين", "ten": "{0} أسابيع", "higher": "{0} اسبوع"},
2554 "month": "شهر",
2555 "months": {"2": "شهرين", "ten": "{0} أشهر", "higher": "{0} شهر"},
2556 "year": "سنة",
2557 "years": {"2": "سنتين", "ten": "{0} سنوات", "higher": "{0} سنة"},
2558 }
2560 month_names = [
2561 "",
2562 "يناير",
2563 "فبراير",
2564 "مارس",
2565 "أبريل",
2566 "مايو",
2567 "يونيو",
2568 "يوليو",
2569 "أغسطس",
2570 "سبتمبر",
2571 "أكتوبر",
2572 "نوفمبر",
2573 "ديسمبر",
2574 ]
2575 month_abbreviations = [
2576 "",
2577 "يناير",
2578 "فبراير",
2579 "مارس",
2580 "أبريل",
2581 "مايو",
2582 "يونيو",
2583 "يوليو",
2584 "أغسطس",
2585 "سبتمبر",
2586 "أكتوبر",
2587 "نوفمبر",
2588 "ديسمبر",
2589 ]
2591 day_names = [
2592 "",
2593 "الإثنين",
2594 "الثلاثاء",
2595 "الأربعاء",
2596 "الخميس",
2597 "الجمعة",
2598 "السبت",
2599 "الأحد",
2600 ]
2601 day_abbreviations = ["", "إثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت", "أحد"]
2603 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
2604 form = self.timeframes[timeframe]
2605 delta = abs(delta)
2606 if isinstance(form, Mapping):
2607 if delta == 2:
2608 form = form["2"]
2609 elif 2 < delta <= 10:
2610 form = form["ten"]
2611 else:
2612 form = form["higher"]
2614 return form.format(delta)
2617class LevantArabicLocale(ArabicLocale):
2618 names = ["ar-iq", "ar-jo", "ar-lb", "ar-ps", "ar-sy"]
2619 month_names = [
2620 "",
2621 "كانون الثاني",
2622 "شباط",
2623 "آذار",
2624 "نيسان",
2625 "أيار",
2626 "حزيران",
2627 "تموز",
2628 "آب",
2629 "أيلول",
2630 "تشرين الأول",
2631 "تشرين الثاني",
2632 "كانون الأول",
2633 ]
2634 month_abbreviations = [
2635 "",
2636 "كانون الثاني",
2637 "شباط",
2638 "آذار",
2639 "نيسان",
2640 "أيار",
2641 "حزيران",
2642 "تموز",
2643 "آب",
2644 "أيلول",
2645 "تشرين الأول",
2646 "تشرين الثاني",
2647 "كانون الأول",
2648 ]
2651class AlgeriaTunisiaArabicLocale(ArabicLocale):
2652 names = ["ar-tn", "ar-dz"]
2653 month_names = [
2654 "",
2655 "جانفي",
2656 "فيفري",
2657 "مارس",
2658 "أفريل",
2659 "ماي",
2660 "جوان",
2661 "جويلية",
2662 "أوت",
2663 "سبتمبر",
2664 "أكتوبر",
2665 "نوفمبر",
2666 "ديسمبر",
2667 ]
2668 month_abbreviations = [
2669 "",
2670 "جانفي",
2671 "فيفري",
2672 "مارس",
2673 "أفريل",
2674 "ماي",
2675 "جوان",
2676 "جويلية",
2677 "أوت",
2678 "سبتمبر",
2679 "أكتوبر",
2680 "نوفمبر",
2681 "ديسمبر",
2682 ]
2685class MauritaniaArabicLocale(ArabicLocale):
2686 names = ["ar-mr"]
2687 month_names = [
2688 "",
2689 "يناير",
2690 "فبراير",
2691 "مارس",
2692 "إبريل",
2693 "مايو",
2694 "يونيو",
2695 "يوليو",
2696 "أغشت",
2697 "شتمبر",
2698 "أكتوبر",
2699 "نوفمبر",
2700 "دجمبر",
2701 ]
2702 month_abbreviations = [
2703 "",
2704 "يناير",
2705 "فبراير",
2706 "مارس",
2707 "إبريل",
2708 "مايو",
2709 "يونيو",
2710 "يوليو",
2711 "أغشت",
2712 "شتمبر",
2713 "أكتوبر",
2714 "نوفمبر",
2715 "دجمبر",
2716 ]
2719class MoroccoArabicLocale(ArabicLocale):
2720 names = ["ar-ma"]
2721 month_names = [
2722 "",
2723 "يناير",
2724 "فبراير",
2725 "مارس",
2726 "أبريل",
2727 "ماي",
2728 "يونيو",
2729 "يوليوز",
2730 "غشت",
2731 "شتنبر",
2732 "أكتوبر",
2733 "نونبر",
2734 "دجنبر",
2735 ]
2736 month_abbreviations = [
2737 "",
2738 "يناير",
2739 "فبراير",
2740 "مارس",
2741 "أبريل",
2742 "ماي",
2743 "يونيو",
2744 "يوليوز",
2745 "غشت",
2746 "شتنبر",
2747 "أكتوبر",
2748 "نونبر",
2749 "دجنبر",
2750 ]
2753class IcelandicLocale(Locale):
2754 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
2755 form = self.timeframes[timeframe]
2757 if isinstance(form, Mapping):
2758 if delta < 0:
2759 form = form["past"]
2760 elif delta > 0:
2761 form = form["future"]
2762 else:
2763 raise ValueError(
2764 "Icelandic Locale does not support units with a delta of zero. "
2765 "Please consider making a contribution to fix this issue."
2766 )
2767 # FIXME: handle when delta is 0
2769 return form.format(abs(delta))
2771 names = ["is", "is-is"]
2773 past = "fyrir {0} síðan"
2774 future = "eftir {0}"
2776 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
2777 "now": "rétt í þessu",
2778 "second": {"past": "sekúndu", "future": "sekúndu"},
2779 "seconds": {"past": "{0} nokkrum sekúndum", "future": "nokkrar sekúndur"},
2780 "minute": {"past": "einni mínútu", "future": "eina mínútu"},
2781 "minutes": {"past": "{0} mínútum", "future": "{0} mínútur"},
2782 "hour": {"past": "einum tíma", "future": "einn tíma"},
2783 "hours": {"past": "{0} tímum", "future": "{0} tíma"},
2784 "day": {"past": "einum degi", "future": "einn dag"},
2785 "days": {"past": "{0} dögum", "future": "{0} daga"},
2786 "month": {"past": "einum mánuði", "future": "einn mánuð"},
2787 "months": {"past": "{0} mánuðum", "future": "{0} mánuði"},
2788 "year": {"past": "einu ári", "future": "eitt ár"},
2789 "years": {"past": "{0} árum", "future": "{0} ár"},
2790 }
2792 meridians = {"am": "f.h.", "pm": "e.h.", "AM": "f.h.", "PM": "e.h."}
2794 month_names = [
2795 "",
2796 "janúar",
2797 "febrúar",
2798 "mars",
2799 "apríl",
2800 "maí",
2801 "júní",
2802 "júlí",
2803 "ágúst",
2804 "september",
2805 "október",
2806 "nóvember",
2807 "desember",
2808 ]
2809 month_abbreviations = [
2810 "",
2811 "jan",
2812 "feb",
2813 "mar",
2814 "apr",
2815 "maí",
2816 "jún",
2817 "júl",
2818 "ágú",
2819 "sep",
2820 "okt",
2821 "nóv",
2822 "des",
2823 ]
2825 day_names = [
2826 "",
2827 "mánudagur",
2828 "þriðjudagur",
2829 "miðvikudagur",
2830 "fimmtudagur",
2831 "föstudagur",
2832 "laugardagur",
2833 "sunnudagur",
2834 ]
2835 day_abbreviations = ["", "mán", "þri", "mið", "fim", "fös", "lau", "sun"]
2838class DanishLocale(Locale):
2839 names = ["da", "da-dk"]
2841 past = "for {0} siden"
2842 future = "om {0}"
2843 and_word = "og"
2845 timeframes = {
2846 "now": "lige nu",
2847 "second": "et sekund",
2848 "seconds": "{0} sekunder",
2849 "minute": "et minut",
2850 "minutes": "{0} minutter",
2851 "hour": "en time",
2852 "hours": "{0} timer",
2853 "day": "en dag",
2854 "days": "{0} dage",
2855 "week": "en uge",
2856 "weeks": "{0} uger",
2857 "month": "en måned",
2858 "months": "{0} måneder",
2859 "year": "et år",
2860 "years": "{0} år",
2861 }
2863 month_names = [
2864 "",
2865 "januar",
2866 "februar",
2867 "marts",
2868 "april",
2869 "maj",
2870 "juni",
2871 "juli",
2872 "august",
2873 "september",
2874 "oktober",
2875 "november",
2876 "december",
2877 ]
2878 month_abbreviations = [
2879 "",
2880 "jan",
2881 "feb",
2882 "mar",
2883 "apr",
2884 "maj",
2885 "jun",
2886 "jul",
2887 "aug",
2888 "sep",
2889 "okt",
2890 "nov",
2891 "dec",
2892 ]
2894 day_names = [
2895 "",
2896 "mandag",
2897 "tirsdag",
2898 "onsdag",
2899 "torsdag",
2900 "fredag",
2901 "lørdag",
2902 "søndag",
2903 ]
2904 day_abbreviations = ["", "man", "tir", "ons", "tor", "fre", "lør", "søn"]
2906 def _ordinal_number(self, n: int) -> str:
2907 return f"{n}."
2910class MalayalamLocale(Locale):
2911 names = ["ml"]
2913 past = "{0} മുമ്പ്"
2914 future = "{0} ശേഷം"
2916 timeframes = {
2917 "now": "ഇപ്പോൾ",
2918 "second": "ഒരു നിമിഷം",
2919 "seconds": "{0} സെക്കന്റ്",
2920 "minute": "ഒരു മിനിറ്റ്",
2921 "minutes": "{0} മിനിറ്റ്",
2922 "hour": "ഒരു മണിക്കൂർ",
2923 "hours": "{0} മണിക്കൂർ",
2924 "day": "ഒരു ദിവസം ",
2925 "days": "{0} ദിവസം ",
2926 "month": "ഒരു മാസം ",
2927 "months": "{0} മാസം ",
2928 "year": "ഒരു വർഷം ",
2929 "years": "{0} വർഷം ",
2930 }
2932 meridians = {
2933 "am": "രാവിലെ",
2934 "pm": "ഉച്ചക്ക് ശേഷം",
2935 "AM": "രാവിലെ",
2936 "PM": "ഉച്ചക്ക് ശേഷം",
2937 }
2939 month_names = [
2940 "",
2941 "ജനുവരി",
2942 "ഫെബ്രുവരി",
2943 "മാർച്ച്",
2944 "ഏപ്രിൽ ",
2945 "മെയ് ",
2946 "ജൂണ്",
2947 "ജൂലൈ",
2948 "ഓഗസ്റ്റ്",
2949 "സെപ്റ്റംബർ",
2950 "ഒക്ടോബർ",
2951 "നവംബർ",
2952 "ഡിസംബർ",
2953 ]
2954 month_abbreviations = [
2955 "",
2956 "ജനു",
2957 "ഫെബ് ",
2958 "മാർ",
2959 "ഏപ്രിൽ",
2960 "മേയ്",
2961 "ജൂണ്",
2962 "ജൂലൈ",
2963 "ഓഗസ്റ",
2964 "സെപ്റ്റ",
2965 "ഒക്ടോ",
2966 "നവം",
2967 "ഡിസം",
2968 ]
2970 day_names = ["", "തിങ്കള്", "ചൊവ്വ", "ബുധന്", "വ്യാഴം", "വെള്ളി", "ശനി", "ഞായര്"]
2971 day_abbreviations = [
2972 "",
2973 "തിങ്കള്",
2974 "ചൊവ്വ",
2975 "ബുധന്",
2976 "വ്യാഴം",
2977 "വെള്ളി",
2978 "ശനി",
2979 "ഞായര്",
2980 ]
2983class HindiLocale(Locale):
2984 names = ["hi", "hi-in"]
2986 past = "{0} पहले"
2987 future = "{0} बाद"
2989 timeframes = {
2990 "now": "अभी",
2991 "second": "एक पल",
2992 "seconds": "{0} सेकंड्",
2993 "minute": "एक मिनट ",
2994 "minutes": "{0} मिनट ",
2995 "hour": "एक घंटा",
2996 "hours": "{0} घंटे",
2997 "day": "एक दिन",
2998 "days": "{0} दिन",
2999 "month": "एक माह ",
3000 "months": "{0} महीने ",
3001 "year": "एक वर्ष ",
3002 "years": "{0} साल ",
3003 }
3005 meridians = {"am": "सुबह", "pm": "शाम", "AM": "सुबह", "PM": "शाम"}
3007 month_names = [
3008 "",
3009 "जनवरी",
3010 "फरवरी",
3011 "मार्च",
3012 "अप्रैल ",
3013 "मई",
3014 "जून",
3015 "जुलाई",
3016 "अगस्त",
3017 "सितंबर",
3018 "अक्टूबर",
3019 "नवंबर",
3020 "दिसंबर",
3021 ]
3022 month_abbreviations = [
3023 "",
3024 "जन",
3025 "फ़र",
3026 "मार्च",
3027 "अप्रै",
3028 "मई",
3029 "जून",
3030 "जुलाई",
3031 "आग",
3032 "सित",
3033 "अकत",
3034 "नवे",
3035 "दिस",
3036 ]
3038 day_names = [
3039 "",
3040 "सोमवार",
3041 "मंगलवार",
3042 "बुधवार",
3043 "गुरुवार",
3044 "शुक्रवार",
3045 "शनिवार",
3046 "रविवार",
3047 ]
3048 day_abbreviations = ["", "सोम", "मंगल", "बुध", "गुरुवार", "शुक्र", "शनि", "रवि"]
3051class CzechLocale(Locale):
3052 names = ["cs", "cs-cz"]
3054 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
3055 "now": "Teď",
3056 "second": {"past": "vteřina", "future": "vteřina"},
3057 "seconds": {
3058 "zero": "vteřina",
3059 "past": "{0} sekundami",
3060 "future-singular": "{0} sekundy",
3061 "future-paucal": "{0} sekund",
3062 },
3063 "minute": {"past": "minutou", "future": "minutu"},
3064 "minutes": {
3065 "zero": "{0} minut",
3066 "past": "{0} minutami",
3067 "future-singular": "{0} minuty",
3068 "future-paucal": "{0} minut",
3069 },
3070 "hour": {"past": "hodinou", "future": "hodinu"},
3071 "hours": {
3072 "zero": "{0} hodin",
3073 "past": "{0} hodinami",
3074 "future-singular": "{0} hodiny",
3075 "future-paucal": "{0} hodin",
3076 },
3077 "day": {"past": "dnem", "future": "den"},
3078 "days": {
3079 "zero": "{0} dnů",
3080 "past": "{0} dny",
3081 "future-singular": "{0} dny",
3082 "future-paucal": "{0} dnů",
3083 },
3084 "week": {"past": "týdnem", "future": "týden"},
3085 "weeks": {
3086 "zero": "{0} týdnů",
3087 "past": "{0} týdny",
3088 "future-singular": "{0} týdny",
3089 "future-paucal": "{0} týdnů",
3090 },
3091 "month": {"past": "měsícem", "future": "měsíc"},
3092 "months": {
3093 "zero": "{0} měsíců",
3094 "past": "{0} měsíci",
3095 "future-singular": "{0} měsíce",
3096 "future-paucal": "{0} měsíců",
3097 },
3098 "year": {"past": "rokem", "future": "rok"},
3099 "years": {
3100 "zero": "{0} let",
3101 "past": "{0} lety",
3102 "future-singular": "{0} roky",
3103 "future-paucal": "{0} let",
3104 },
3105 }
3107 past = "Před {0}"
3108 future = "Za {0}"
3110 month_names = [
3111 "",
3112 "leden",
3113 "únor",
3114 "březen",
3115 "duben",
3116 "květen",
3117 "červen",
3118 "červenec",
3119 "srpen",
3120 "září",
3121 "říjen",
3122 "listopad",
3123 "prosinec",
3124 ]
3125 month_abbreviations = [
3126 "",
3127 "led",
3128 "úno",
3129 "bře",
3130 "dub",
3131 "kvě",
3132 "čvn",
3133 "čvc",
3134 "srp",
3135 "zář",
3136 "říj",
3137 "lis",
3138 "pro",
3139 ]
3141 day_names = [
3142 "",
3143 "pondělí",
3144 "úterý",
3145 "středa",
3146 "čtvrtek",
3147 "pátek",
3148 "sobota",
3149 "neděle",
3150 ]
3151 day_abbreviations = ["", "po", "út", "st", "čt", "pá", "so", "ne"]
3153 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
3154 """Czech aware time frame format function, takes into account
3155 the differences between past and future forms."""
3156 abs_delta = abs(delta)
3157 form = self.timeframes[timeframe]
3159 if isinstance(form, str):
3160 return form.format(abs_delta)
3162 if delta == 0:
3163 key = "zero" # And *never* use 0 in the singular!
3164 elif delta < 0:
3165 key = "past"
3166 else:
3167 # Needed since both regular future and future-singular and future-paucal cases
3168 if "future-singular" not in form:
3169 key = "future"
3170 elif 2 <= abs_delta % 10 <= 4 and (
3171 abs_delta % 100 < 10 or abs_delta % 100 >= 20
3172 ):
3173 key = "future-singular"
3174 else:
3175 key = "future-paucal"
3177 form: str = form[key]
3178 return form.format(abs_delta)
3181class SlovakLocale(Locale):
3182 names = ["sk", "sk-sk"]
3184 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
3185 "now": "Teraz",
3186 "second": {"past": "sekundou", "future": "sekundu"},
3187 "seconds": {
3188 "zero": "{0} sekúnd",
3189 "past": "{0} sekundami",
3190 "future-singular": "{0} sekundy",
3191 "future-paucal": "{0} sekúnd",
3192 },
3193 "minute": {"past": "minútou", "future": "minútu"},
3194 "minutes": {
3195 "zero": "{0} minút",
3196 "past": "{0} minútami",
3197 "future-singular": "{0} minúty",
3198 "future-paucal": "{0} minút",
3199 },
3200 "hour": {"past": "hodinou", "future": "hodinu"},
3201 "hours": {
3202 "zero": "{0} hodín",
3203 "past": "{0} hodinami",
3204 "future-singular": "{0} hodiny",
3205 "future-paucal": "{0} hodín",
3206 },
3207 "day": {"past": "dňom", "future": "deň"},
3208 "days": {
3209 "zero": "{0} dní",
3210 "past": "{0} dňami",
3211 "future-singular": "{0} dni",
3212 "future-paucal": "{0} dní",
3213 },
3214 "week": {"past": "týždňom", "future": "týždeň"},
3215 "weeks": {
3216 "zero": "{0} týždňov",
3217 "past": "{0} týždňami",
3218 "future-singular": "{0} týždne",
3219 "future-paucal": "{0} týždňov",
3220 },
3221 "month": {"past": "mesiacom", "future": "mesiac"},
3222 "months": {
3223 "zero": "{0} mesiacov",
3224 "past": "{0} mesiacmi",
3225 "future-singular": "{0} mesiace",
3226 "future-paucal": "{0} mesiacov",
3227 },
3228 "year": {"past": "rokom", "future": "rok"},
3229 "years": {
3230 "zero": "{0} rokov",
3231 "past": "{0} rokmi",
3232 "future-singular": "{0} roky",
3233 "future-paucal": "{0} rokov",
3234 },
3235 }
3237 past = "Pred {0}"
3238 future = "O {0}"
3239 and_word = "a"
3241 month_names = [
3242 "",
3243 "január",
3244 "február",
3245 "marec",
3246 "apríl",
3247 "máj",
3248 "jún",
3249 "júl",
3250 "august",
3251 "september",
3252 "október",
3253 "november",
3254 "december",
3255 ]
3256 month_abbreviations = [
3257 "",
3258 "jan",
3259 "feb",
3260 "mar",
3261 "apr",
3262 "máj",
3263 "jún",
3264 "júl",
3265 "aug",
3266 "sep",
3267 "okt",
3268 "nov",
3269 "dec",
3270 ]
3272 day_names = [
3273 "",
3274 "pondelok",
3275 "utorok",
3276 "streda",
3277 "štvrtok",
3278 "piatok",
3279 "sobota",
3280 "nedeľa",
3281 ]
3282 day_abbreviations = ["", "po", "ut", "st", "št", "pi", "so", "ne"]
3284 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
3285 """Slovak aware time frame format function, takes into account
3286 the differences between past and future forms."""
3287 abs_delta = abs(delta)
3288 form = self.timeframes[timeframe]
3290 if isinstance(form, str):
3291 return form.format(abs_delta)
3293 if delta == 0:
3294 key = "zero" # And *never* use 0 in the singular!
3295 elif delta < 0:
3296 key = "past"
3297 else:
3298 if "future-singular" not in form:
3299 key = "future"
3300 elif 2 <= abs_delta % 10 <= 4 and (
3301 abs_delta % 100 < 10 or abs_delta % 100 >= 20
3302 ):
3303 key = "future-singular"
3304 else:
3305 key = "future-paucal"
3307 form: str = form[key]
3308 return form.format(abs_delta)
3311class FarsiLocale(Locale):
3312 names = ["fa", "fa-ir"]
3314 past = "{0} قبل"
3315 future = "در {0}"
3317 timeframes = {
3318 "now": "اکنون",
3319 "second": "یک لحظه",
3320 "seconds": "{0} ثانیه",
3321 "minute": "یک دقیقه",
3322 "minutes": "{0} دقیقه",
3323 "hour": "یک ساعت",
3324 "hours": "{0} ساعت",
3325 "day": "یک روز",
3326 "days": "{0} روز",
3327 "month": "یک ماه",
3328 "months": "{0} ماه",
3329 "year": "یک سال",
3330 "years": "{0} سال",
3331 }
3333 meridians = {
3334 "am": "قبل از ظهر",
3335 "pm": "بعد از ظهر",
3336 "AM": "قبل از ظهر",
3337 "PM": "بعد از ظهر",
3338 }
3340 month_names = [
3341 "",
3342 "January",
3343 "February",
3344 "March",
3345 "April",
3346 "May",
3347 "June",
3348 "July",
3349 "August",
3350 "September",
3351 "October",
3352 "November",
3353 "December",
3354 ]
3355 month_abbreviations = [
3356 "",
3357 "Jan",
3358 "Feb",
3359 "Mar",
3360 "Apr",
3361 "May",
3362 "Jun",
3363 "Jul",
3364 "Aug",
3365 "Sep",
3366 "Oct",
3367 "Nov",
3368 "Dec",
3369 ]
3371 day_names = [
3372 "",
3373 "دو شنبه",
3374 "سه شنبه",
3375 "چهارشنبه",
3376 "پنجشنبه",
3377 "جمعه",
3378 "شنبه",
3379 "یکشنبه",
3380 ]
3381 day_abbreviations = ["", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
3384class HebrewLocale(Locale):
3385 names = ["he", "he-il"]
3387 past = "לפני {0}"
3388 future = "בעוד {0}"
3389 and_word = "ו"
3391 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
3392 "now": "הרגע",
3393 "second": "שנייה",
3394 "seconds": "{0} שניות",
3395 "minute": "דקה",
3396 "minutes": "{0} דקות",
3397 "hour": "שעה",
3398 "hours": {"2": "שעתיים", "ten": "{0} שעות", "higher": "{0} שעות"},
3399 "day": "יום",
3400 "days": {"2": "יומיים", "ten": "{0} ימים", "higher": "{0} יום"},
3401 "week": "שבוע",
3402 "weeks": {"2": "שבועיים", "ten": "{0} שבועות", "higher": "{0} שבועות"},
3403 "month": "חודש",
3404 "months": {"2": "חודשיים", "ten": "{0} חודשים", "higher": "{0} חודשים"},
3405 "year": "שנה",
3406 "years": {"2": "שנתיים", "ten": "{0} שנים", "higher": "{0} שנה"},
3407 }
3409 meridians = {
3410 "am": 'לפנ"צ',
3411 "pm": 'אחר"צ',
3412 "AM": "לפני הצהריים",
3413 "PM": "אחרי הצהריים",
3414 }
3416 month_names = [
3417 "",
3418 "ינואר",
3419 "פברואר",
3420 "מרץ",
3421 "אפריל",
3422 "מאי",
3423 "יוני",
3424 "יולי",
3425 "אוגוסט",
3426 "ספטמבר",
3427 "אוקטובר",
3428 "נובמבר",
3429 "דצמבר",
3430 ]
3431 month_abbreviations = [
3432 "",
3433 "ינו׳",
3434 "פבר׳",
3435 "מרץ",
3436 "אפר׳",
3437 "מאי",
3438 "יוני",
3439 "יולי",
3440 "אוג׳",
3441 "ספט׳",
3442 "אוק׳",
3443 "נוב׳",
3444 "דצמ׳",
3445 ]
3447 day_names = ["", "שני", "שלישי", "רביעי", "חמישי", "שישי", "שבת", "ראשון"]
3448 day_abbreviations = ["", "ב׳", "ג׳", "ד׳", "ה׳", "ו׳", "ש׳", "א׳"]
3450 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
3451 form = self.timeframes[timeframe]
3452 delta = abs(delta)
3453 if isinstance(form, Mapping):
3454 if delta == 2:
3455 form = form["2"]
3456 elif delta == 0 or 2 < delta <= 10:
3457 form = form["ten"]
3458 else:
3459 form = form["higher"]
3461 return form.format(delta)
3463 def describe_multi(
3464 self,
3465 timeframes: Sequence[Tuple[TimeFrameLiteral, Union[int, float]]],
3466 only_distance: bool = False,
3467 ) -> str:
3468 """Describes a delta within multiple timeframes in plain language.
3469 In Hebrew, the and word behaves a bit differently.
3471 :param timeframes: a list of string, quantity pairs each representing a timeframe and delta.
3472 :param only_distance: return only distance eg: "2 hours and 11 seconds" without "in" or "ago" keywords
3473 """
3475 humanized = ""
3476 for index, (timeframe, delta) in enumerate(timeframes):
3477 last_humanized = self._format_timeframe(timeframe, trunc(delta))
3478 if index == 0:
3479 humanized = last_humanized
3480 elif index == len(timeframes) - 1: # Must have at least 2 items
3481 humanized += " " + self.and_word
3482 if last_humanized[0].isdecimal():
3483 humanized += "־"
3484 humanized += last_humanized
3485 else: # Don't add for the last one
3486 humanized += ", " + last_humanized
3488 if not only_distance:
3489 humanized = self._format_relative(humanized, timeframe, trunc(delta))
3491 return humanized
3494class MarathiLocale(Locale):
3495 names = ["mr"]
3497 past = "{0} आधी"
3498 future = "{0} नंतर"
3500 timeframes = {
3501 "now": "सद्य",
3502 "second": "एक सेकंद",
3503 "seconds": "{0} सेकंद",
3504 "minute": "एक मिनिट ",
3505 "minutes": "{0} मिनिट ",
3506 "hour": "एक तास",
3507 "hours": "{0} तास",
3508 "day": "एक दिवस",
3509 "days": "{0} दिवस",
3510 "month": "एक महिना ",
3511 "months": "{0} महिने ",
3512 "year": "एक वर्ष ",
3513 "years": "{0} वर्ष ",
3514 }
3516 meridians = {"am": "सकाळ", "pm": "संध्याकाळ", "AM": "सकाळ", "PM": "संध्याकाळ"}
3518 month_names = [
3519 "",
3520 "जानेवारी",
3521 "फेब्रुवारी",
3522 "मार्च",
3523 "एप्रिल",
3524 "मे",
3525 "जून",
3526 "जुलै",
3527 "अॉगस्ट",
3528 "सप्टेंबर",
3529 "अॉक्टोबर",
3530 "नोव्हेंबर",
3531 "डिसेंबर",
3532 ]
3533 month_abbreviations = [
3534 "",
3535 "जान",
3536 "फेब्रु",
3537 "मार्च",
3538 "एप्रि",
3539 "मे",
3540 "जून",
3541 "जुलै",
3542 "अॉग",
3543 "सप्टें",
3544 "अॉक्टो",
3545 "नोव्हें",
3546 "डिसें",
3547 ]
3549 day_names = [
3550 "",
3551 "सोमवार",
3552 "मंगळवार",
3553 "बुधवार",
3554 "गुरुवार",
3555 "शुक्रवार",
3556 "शनिवार",
3557 "रविवार",
3558 ]
3559 day_abbreviations = ["", "सोम", "मंगळ", "बुध", "गुरु", "शुक्र", "शनि", "रवि"]
3562class CatalanLocale(Locale):
3563 names = ["ca", "ca-es", "ca-ad", "ca-fr", "ca-it"]
3564 past = "Fa {0}"
3565 future = "En {0}"
3566 and_word = "i"
3568 timeframes = {
3569 "now": "Ara mateix",
3570 "second": "un segon",
3571 "seconds": "{0} segons",
3572 "minute": "un minut",
3573 "minutes": "{0} minuts",
3574 "hour": "una hora",
3575 "hours": "{0} hores",
3576 "day": "un dia",
3577 "days": "{0} dies",
3578 "month": "un mes",
3579 "months": "{0} mesos",
3580 "year": "un any",
3581 "years": "{0} anys",
3582 }
3584 month_names = [
3585 "",
3586 "gener",
3587 "febrer",
3588 "març",
3589 "abril",
3590 "maig",
3591 "juny",
3592 "juliol",
3593 "agost",
3594 "setembre",
3595 "octubre",
3596 "novembre",
3597 "desembre",
3598 ]
3599 month_abbreviations = [
3600 "",
3601 "gen.",
3602 "febr.",
3603 "març",
3604 "abr.",
3605 "maig",
3606 "juny",
3607 "jul.",
3608 "ag.",
3609 "set.",
3610 "oct.",
3611 "nov.",
3612 "des.",
3613 ]
3614 day_names = [
3615 "",
3616 "dilluns",
3617 "dimarts",
3618 "dimecres",
3619 "dijous",
3620 "divendres",
3621 "dissabte",
3622 "diumenge",
3623 ]
3624 day_abbreviations = [
3625 "",
3626 "dl.",
3627 "dt.",
3628 "dc.",
3629 "dj.",
3630 "dv.",
3631 "ds.",
3632 "dg.",
3633 ]
3636class BasqueLocale(Locale):
3637 names = ["eu", "eu-eu"]
3638 past = "duela {0}"
3639 future = "{0}" # I don't know what's the right phrase in Basque for the future.
3641 timeframes = {
3642 "now": "Orain",
3643 "second": "segundo bat",
3644 "seconds": "{0} segundu",
3645 "minute": "minutu bat",
3646 "minutes": "{0} minutu",
3647 "hour": "ordu bat",
3648 "hours": "{0} ordu",
3649 "day": "egun bat",
3650 "days": "{0} egun",
3651 "month": "hilabete bat",
3652 "months": "{0} hilabet",
3653 "year": "urte bat",
3654 "years": "{0} urte",
3655 }
3657 month_names = [
3658 "",
3659 "urtarrilak",
3660 "otsailak",
3661 "martxoak",
3662 "apirilak",
3663 "maiatzak",
3664 "ekainak",
3665 "uztailak",
3666 "abuztuak",
3667 "irailak",
3668 "urriak",
3669 "azaroak",
3670 "abenduak",
3671 ]
3672 month_abbreviations = [
3673 "",
3674 "urt",
3675 "ots",
3676 "mar",
3677 "api",
3678 "mai",
3679 "eka",
3680 "uzt",
3681 "abu",
3682 "ira",
3683 "urr",
3684 "aza",
3685 "abe",
3686 ]
3687 day_names = [
3688 "",
3689 "astelehena",
3690 "asteartea",
3691 "asteazkena",
3692 "osteguna",
3693 "ostirala",
3694 "larunbata",
3695 "igandea",
3696 ]
3697 day_abbreviations = ["", "al", "ar", "az", "og", "ol", "lr", "ig"]
3700class HungarianLocale(Locale):
3701 names = ["hu", "hu-hu"]
3703 past = "{0} ezelőtt"
3704 future = "{0} múlva"
3706 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
3707 "now": "éppen most",
3708 "second": {"past": "egy második", "future": "egy második"},
3709 "seconds": {"past": "{0} másodpercekkel", "future": "{0} pár másodperc"},
3710 "minute": {"past": "egy perccel", "future": "egy perc"},
3711 "minutes": {"past": "{0} perccel", "future": "{0} perc"},
3712 "hour": {"past": "egy órával", "future": "egy óra"},
3713 "hours": {"past": "{0} órával", "future": "{0} óra"},
3714 "day": {"past": "egy nappal", "future": "egy nap"},
3715 "days": {"past": "{0} nappal", "future": "{0} nap"},
3716 "week": {"past": "egy héttel", "future": "egy hét"},
3717 "weeks": {"past": "{0} héttel", "future": "{0} hét"},
3718 "month": {"past": "egy hónappal", "future": "egy hónap"},
3719 "months": {"past": "{0} hónappal", "future": "{0} hónap"},
3720 "year": {"past": "egy évvel", "future": "egy év"},
3721 "years": {"past": "{0} évvel", "future": "{0} év"},
3722 }
3724 month_names = [
3725 "",
3726 "január",
3727 "február",
3728 "március",
3729 "április",
3730 "május",
3731 "június",
3732 "július",
3733 "augusztus",
3734 "szeptember",
3735 "október",
3736 "november",
3737 "december",
3738 ]
3739 month_abbreviations = [
3740 "",
3741 "jan",
3742 "febr",
3743 "márc",
3744 "ápr",
3745 "máj",
3746 "jún",
3747 "júl",
3748 "aug",
3749 "szept",
3750 "okt",
3751 "nov",
3752 "dec",
3753 ]
3755 day_names = [
3756 "",
3757 "hétfő",
3758 "kedd",
3759 "szerda",
3760 "csütörtök",
3761 "péntek",
3762 "szombat",
3763 "vasárnap",
3764 ]
3765 day_abbreviations = ["", "hét", "kedd", "szer", "csüt", "pént", "szom", "vas"]
3767 meridians = {"am": "de", "pm": "du", "AM": "DE", "PM": "DU"}
3769 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
3770 form = self.timeframes[timeframe]
3772 if isinstance(form, Mapping):
3773 if delta > 0:
3774 form = form["future"]
3775 else:
3776 form = form["past"]
3778 return form.format(abs(delta))
3781class EsperantoLocale(Locale):
3782 names = ["eo", "eo-xx"]
3783 past = "antaŭ {0}"
3784 future = "post {0}"
3786 timeframes = {
3787 "now": "nun",
3788 "second": "sekundo",
3789 "seconds": "{0} kelkaj sekundoj",
3790 "minute": "unu minuto",
3791 "minutes": "{0} minutoj",
3792 "hour": "un horo",
3793 "hours": "{0} horoj",
3794 "day": "unu tago",
3795 "days": "{0} tagoj",
3796 "month": "unu monato",
3797 "months": "{0} monatoj",
3798 "year": "unu jaro",
3799 "years": "{0} jaroj",
3800 }
3802 month_names = [
3803 "",
3804 "januaro",
3805 "februaro",
3806 "marto",
3807 "aprilo",
3808 "majo",
3809 "junio",
3810 "julio",
3811 "aŭgusto",
3812 "septembro",
3813 "oktobro",
3814 "novembro",
3815 "decembro",
3816 ]
3817 month_abbreviations = [
3818 "",
3819 "jan",
3820 "feb",
3821 "mar",
3822 "apr",
3823 "maj",
3824 "jun",
3825 "jul",
3826 "aŭg",
3827 "sep",
3828 "okt",
3829 "nov",
3830 "dec",
3831 ]
3833 day_names = [
3834 "",
3835 "lundo",
3836 "mardo",
3837 "merkredo",
3838 "ĵaŭdo",
3839 "vendredo",
3840 "sabato",
3841 "dimanĉo",
3842 ]
3843 day_abbreviations = ["", "lun", "mar", "mer", "ĵaŭ", "ven", "sab", "dim"]
3845 meridians = {"am": "atm", "pm": "ptm", "AM": "ATM", "PM": "PTM"}
3847 ordinal_day_re = r"((?P<value>[1-3]?[0-9](?=a))a)"
3849 def _ordinal_number(self, n: int) -> str:
3850 return f"{n}a"
3853class ThaiLocale(Locale):
3854 names = ["th", "th-th"]
3856 past = "{0} ที่ผ่านมา"
3857 future = "ในอีก {0}"
3859 timeframes = {
3860 "now": "ขณะนี้",
3861 "second": "วินาที",
3862 "seconds": "{0} ไม่กี่วินาที",
3863 "minute": "1 นาที",
3864 "minutes": "{0} นาที",
3865 "hour": "1 ชั่วโมง",
3866 "hours": "{0} ชั่วโมง",
3867 "day": "1 วัน",
3868 "days": "{0} วัน",
3869 "month": "1 เดือน",
3870 "months": "{0} เดือน",
3871 "year": "1 ปี",
3872 "years": "{0} ปี",
3873 }
3875 month_names = [
3876 "",
3877 "มกราคม",
3878 "กุมภาพันธ์",
3879 "มีนาคม",
3880 "เมษายน",
3881 "พฤษภาคม",
3882 "มิถุนายน",
3883 "กรกฎาคม",
3884 "สิงหาคม",
3885 "กันยายน",
3886 "ตุลาคม",
3887 "พฤศจิกายน",
3888 "ธันวาคม",
3889 ]
3890 month_abbreviations = [
3891 "",
3892 "ม.ค.",
3893 "ก.พ.",
3894 "มี.ค.",
3895 "เม.ย.",
3896 "พ.ค.",
3897 "มิ.ย.",
3898 "ก.ค.",
3899 "ส.ค.",
3900 "ก.ย.",
3901 "ต.ค.",
3902 "พ.ย.",
3903 "ธ.ค.",
3904 ]
3906 day_names = ["", "จันทร์", "อังคาร", "พุธ", "พฤหัสบดี", "ศุกร์", "เสาร์", "อาทิตย์"]
3907 day_abbreviations = ["", "จ", "อ", "พ", "พฤ", "ศ", "ส", "อา"]
3909 meridians = {"am": "am", "pm": "pm", "AM": "AM", "PM": "PM"}
3911 BE_OFFSET = 543
3913 def year_full(self, year: int) -> str:
3914 """Thai always use Buddhist Era (BE) which is CE + 543"""
3915 year += self.BE_OFFSET
3916 return f"{year:04d}"
3918 def year_abbreviation(self, year: int) -> str:
3919 """Thai always use Buddhist Era (BE) which is CE + 543"""
3920 year += self.BE_OFFSET
3921 return f"{year:04d}"[2:]
3923 def _format_relative(
3924 self,
3925 humanized: str,
3926 timeframe: TimeFrameLiteral,
3927 delta: Union[float, int],
3928 ) -> str:
3929 """Thai normally doesn't have any space between words"""
3930 if timeframe == "now":
3931 return humanized
3933 direction = self.past if delta < 0 else self.future
3934 relative_string = direction.format(humanized)
3936 if timeframe == "seconds":
3937 relative_string = relative_string.replace(" ", "")
3939 return relative_string
3942class LaotianLocale(Locale):
3943 names = ["lo", "lo-la"]
3945 past = "{0} ກ່ອນຫນ້ານີ້"
3946 future = "ໃນ {0}"
3948 timeframes = {
3949 "now": "ດຽວນີ້",
3950 "second": "ວິນາທີ",
3951 "seconds": "{0} ວິນາທີ",
3952 "minute": "ນາທີ",
3953 "minutes": "{0} ນາທີ",
3954 "hour": "ຊົ່ວໂມງ",
3955 "hours": "{0} ຊົ່ວໂມງ",
3956 "day": "ມື້",
3957 "days": "{0} ມື້",
3958 "week": "ອາທິດ",
3959 "weeks": "{0} ອາທິດ",
3960 "month": "ເດືອນ",
3961 "months": "{0} ເດືອນ",
3962 "year": "ປີ",
3963 "years": "{0} ປີ",
3964 }
3966 month_names = [
3967 "",
3968 "ມັງກອນ", # mangkon
3969 "ກຸມພາ", # kumpha
3970 "ມີນາ", # mina
3971 "ເມສາ", # mesa
3972 "ພຶດສະພາ", # phudsapha
3973 "ມິຖຸນາ", # mithuna
3974 "ກໍລະກົດ", # kolakod
3975 "ສິງຫາ", # singha
3976 "ກັນຍາ", # knaia
3977 "ຕຸລາ", # tula
3978 "ພະຈິກ", # phachik
3979 "ທັນວາ", # thanuaa
3980 ]
3981 month_abbreviations = [
3982 "",
3983 "ມັງກອນ",
3984 "ກຸມພາ",
3985 "ມີນາ",
3986 "ເມສາ",
3987 "ພຶດສະພາ",
3988 "ມິຖຸນາ",
3989 "ກໍລະກົດ",
3990 "ສິງຫາ",
3991 "ກັນຍາ",
3992 "ຕຸລາ",
3993 "ພະຈິກ",
3994 "ທັນວາ",
3995 ]
3997 day_names = [
3998 "",
3999 "ວັນຈັນ", # vanchan
4000 "ວັນອັງຄານ", # vnoangkhan
4001 "ວັນພຸດ", # vanphud
4002 "ວັນພະຫັດ", # vanphahad
4003 "ວັນສຸກ", # vansuk
4004 "ວັນເສົາ", # vansao
4005 "ວັນອາທິດ", # vnoathid
4006 ]
4007 day_abbreviations = [
4008 "",
4009 "ວັນຈັນ",
4010 "ວັນອັງຄານ",
4011 "ວັນພຸດ",
4012 "ວັນພະຫັດ",
4013 "ວັນສຸກ",
4014 "ວັນເສົາ",
4015 "ວັນອາທິດ",
4016 ]
4018 BE_OFFSET = 543
4020 def year_full(self, year: int) -> str:
4021 """Lao always use Buddhist Era (BE) which is CE + 543"""
4022 year += self.BE_OFFSET
4023 return f"{year:04d}"
4025 def year_abbreviation(self, year: int) -> str:
4026 """Lao always use Buddhist Era (BE) which is CE + 543"""
4027 year += self.BE_OFFSET
4028 return f"{year:04d}"[2:]
4030 def _format_relative(
4031 self,
4032 humanized: str,
4033 timeframe: TimeFrameLiteral,
4034 delta: Union[float, int],
4035 ) -> str:
4036 """Lao normally doesn't have any space between words"""
4037 if timeframe == "now":
4038 return humanized
4040 direction = self.past if delta < 0 else self.future
4041 relative_string = direction.format(humanized)
4043 if timeframe == "seconds":
4044 relative_string = relative_string.replace(" ", "")
4046 return relative_string
4049class BengaliLocale(Locale):
4050 names = ["bn", "bn-bd", "bn-in"]
4052 past = "{0} আগে"
4053 future = "{0} পরে"
4055 timeframes = {
4056 "now": "এখন",
4057 "second": "একটি দ্বিতীয়",
4058 "seconds": "{0} সেকেন্ড",
4059 "minute": "এক মিনিট",
4060 "minutes": "{0} মিনিট",
4061 "hour": "এক ঘণ্টা",
4062 "hours": "{0} ঘণ্টা",
4063 "day": "এক দিন",
4064 "days": "{0} দিন",
4065 "month": "এক মাস",
4066 "months": "{0} মাস ",
4067 "year": "এক বছর",
4068 "years": "{0} বছর",
4069 }
4071 meridians = {"am": "সকাল", "pm": "বিকাল", "AM": "সকাল", "PM": "বিকাল"}
4073 month_names = [
4074 "",
4075 "জানুয়ারি",
4076 "ফেব্রুয়ারি",
4077 "মার্চ",
4078 "এপ্রিল",
4079 "মে",
4080 "জুন",
4081 "জুলাই",
4082 "আগস্ট",
4083 "সেপ্টেম্বর",
4084 "অক্টোবর",
4085 "নভেম্বর",
4086 "ডিসেম্বর",
4087 ]
4088 month_abbreviations = [
4089 "",
4090 "জানু",
4091 "ফেব",
4092 "মার্চ",
4093 "এপ্রি",
4094 "মে",
4095 "জুন",
4096 "জুল",
4097 "অগা",
4098 "সেপ্ট",
4099 "অক্টো",
4100 "নভে",
4101 "ডিসে",
4102 ]
4104 day_names = [
4105 "",
4106 "সোমবার",
4107 "মঙ্গলবার",
4108 "বুধবার",
4109 "বৃহস্পতিবার",
4110 "শুক্রবার",
4111 "শনিবার",
4112 "রবিবার",
4113 ]
4114 day_abbreviations = ["", "সোম", "মঙ্গল", "বুধ", "বৃহঃ", "শুক্র", "শনি", "রবি"]
4116 def _ordinal_number(self, n: int) -> str:
4117 if n > 10 or n == 0:
4118 return f"{n}তম"
4119 if n in [1, 5, 7, 8, 9, 10]:
4120 return f"{n}ম"
4121 if n in [2, 3]:
4122 return f"{n}য়"
4123 if n == 4:
4124 return f"{n}র্থ"
4125 if n == 6:
4126 return f"{n}ষ্ঠ"
4127 return ""
4130class RomanshLocale(Locale):
4131 names = ["rm", "rm-ch"]
4133 past = "avant {0}"
4134 future = "en {0}"
4136 timeframes = {
4137 "now": "en quest mument",
4138 "second": "in secunda",
4139 "seconds": "{0} secundas",
4140 "minute": "ina minuta",
4141 "minutes": "{0} minutas",
4142 "hour": "in'ura",
4143 "hours": "{0} ura",
4144 "day": "in di",
4145 "days": "{0} dis",
4146 "week": "in'emna",
4147 "weeks": "{0} emnas",
4148 "month": "in mais",
4149 "months": "{0} mais",
4150 "year": "in onn",
4151 "years": "{0} onns",
4152 }
4154 month_names = [
4155 "",
4156 "schaner",
4157 "favrer",
4158 "mars",
4159 "avrigl",
4160 "matg",
4161 "zercladur",
4162 "fanadur",
4163 "avust",
4164 "settember",
4165 "october",
4166 "november",
4167 "december",
4168 ]
4170 month_abbreviations = [
4171 "",
4172 "schan",
4173 "fav",
4174 "mars",
4175 "avr",
4176 "matg",
4177 "zer",
4178 "fan",
4179 "avu",
4180 "set",
4181 "oct",
4182 "nov",
4183 "dec",
4184 ]
4186 day_names = [
4187 "",
4188 "glindesdi",
4189 "mardi",
4190 "mesemna",
4191 "gievgia",
4192 "venderdi",
4193 "sonda",
4194 "dumengia",
4195 ]
4197 day_abbreviations = ["", "gli", "ma", "me", "gie", "ve", "so", "du"]
4200class RomanianLocale(Locale):
4201 names = ["ro", "ro-ro"]
4203 past = "{0} în urmă"
4204 future = "peste {0}"
4205 and_word = "și"
4207 timeframes = {
4208 "now": "acum",
4209 "second": "o secunda",
4210 "seconds": "{0} câteva secunde",
4211 "minute": "un minut",
4212 "minutes": "{0} minute",
4213 "hour": "o oră",
4214 "hours": "{0} ore",
4215 "day": "o zi",
4216 "days": "{0} zile",
4217 "month": "o lună",
4218 "months": "{0} luni",
4219 "year": "un an",
4220 "years": "{0} ani",
4221 }
4223 month_names = [
4224 "",
4225 "ianuarie",
4226 "februarie",
4227 "martie",
4228 "aprilie",
4229 "mai",
4230 "iunie",
4231 "iulie",
4232 "august",
4233 "septembrie",
4234 "octombrie",
4235 "noiembrie",
4236 "decembrie",
4237 ]
4238 month_abbreviations = [
4239 "",
4240 "ian",
4241 "febr",
4242 "mart",
4243 "apr",
4244 "mai",
4245 "iun",
4246 "iul",
4247 "aug",
4248 "sept",
4249 "oct",
4250 "nov",
4251 "dec",
4252 ]
4254 day_names = [
4255 "",
4256 "luni",
4257 "marți",
4258 "miercuri",
4259 "joi",
4260 "vineri",
4261 "sâmbătă",
4262 "duminică",
4263 ]
4264 day_abbreviations = ["", "Lun", "Mar", "Mie", "Joi", "Vin", "Sâm", "Dum"]
4267class SlovenianLocale(Locale):
4268 names = ["sl", "sl-si"]
4270 past = "pred {0}"
4271 future = "čez {0}"
4272 and_word = "in"
4274 timeframes = {
4275 "now": "zdaj",
4276 "second": "sekundo",
4277 "seconds": "{0} sekund",
4278 "minute": "minuta",
4279 "minutes": "{0} minutami",
4280 "hour": "uro",
4281 "hours": "{0} ur",
4282 "day": "dan",
4283 "days": "{0} dni",
4284 "month": "mesec",
4285 "months": "{0} mesecev",
4286 "year": "leto",
4287 "years": "{0} let",
4288 }
4290 meridians = {"am": "", "pm": "", "AM": "", "PM": ""}
4292 month_names = [
4293 "",
4294 "Januar",
4295 "Februar",
4296 "Marec",
4297 "April",
4298 "Maj",
4299 "Junij",
4300 "Julij",
4301 "Avgust",
4302 "September",
4303 "Oktober",
4304 "November",
4305 "December",
4306 ]
4308 month_abbreviations = [
4309 "",
4310 "Jan",
4311 "Feb",
4312 "Mar",
4313 "Apr",
4314 "Maj",
4315 "Jun",
4316 "Jul",
4317 "Avg",
4318 "Sep",
4319 "Okt",
4320 "Nov",
4321 "Dec",
4322 ]
4324 day_names = [
4325 "",
4326 "Ponedeljek",
4327 "Torek",
4328 "Sreda",
4329 "Četrtek",
4330 "Petek",
4331 "Sobota",
4332 "Nedelja",
4333 ]
4335 day_abbreviations = ["", "Pon", "Tor", "Sre", "Čet", "Pet", "Sob", "Ned"]
4338class IndonesianLocale(Locale):
4339 names = ["id", "id-id"]
4341 past = "{0} yang lalu"
4342 future = "dalam {0}"
4343 and_word = "dan"
4345 timeframes = {
4346 "now": "baru saja",
4347 "second": "1 sebentar",
4348 "seconds": "{0} detik",
4349 "minute": "1 menit",
4350 "minutes": "{0} menit",
4351 "hour": "1 jam",
4352 "hours": "{0} jam",
4353 "day": "1 hari",
4354 "days": "{0} hari",
4355 "week": "1 minggu",
4356 "weeks": "{0} minggu",
4357 "month": "1 bulan",
4358 "months": "{0} bulan",
4359 "quarter": "1 kuartal",
4360 "quarters": "{0} kuartal",
4361 "year": "1 tahun",
4362 "years": "{0} tahun",
4363 }
4365 meridians = {"am": "", "pm": "", "AM": "", "PM": ""}
4367 month_names = [
4368 "",
4369 "Januari",
4370 "Februari",
4371 "Maret",
4372 "April",
4373 "Mei",
4374 "Juni",
4375 "Juli",
4376 "Agustus",
4377 "September",
4378 "Oktober",
4379 "November",
4380 "Desember",
4381 ]
4383 month_abbreviations = [
4384 "",
4385 "Jan",
4386 "Feb",
4387 "Mar",
4388 "Apr",
4389 "Mei",
4390 "Jun",
4391 "Jul",
4392 "Ags",
4393 "Sept",
4394 "Okt",
4395 "Nov",
4396 "Des",
4397 ]
4399 day_names = ["", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu", "Minggu"]
4401 day_abbreviations = [
4402 "",
4403 "Senin",
4404 "Selasa",
4405 "Rabu",
4406 "Kamis",
4407 "Jumat",
4408 "Sabtu",
4409 "Minggu",
4410 ]
4413class NepaliLocale(Locale):
4414 names = ["ne", "ne-np"]
4416 past = "{0} पहिले"
4417 future = "{0} पछी"
4419 timeframes = {
4420 "now": "अहिले",
4421 "second": "एक सेकेन्ड",
4422 "seconds": "{0} सेकण्ड",
4423 "minute": "मिनेट",
4424 "minutes": "{0} मिनेट",
4425 "hour": "एक घण्टा",
4426 "hours": "{0} घण्टा",
4427 "day": "एक दिन",
4428 "days": "{0} दिन",
4429 "month": "एक महिना",
4430 "months": "{0} महिना",
4431 "year": "एक बर्ष",
4432 "years": "{0} बर्ष",
4433 }
4435 meridians = {"am": "पूर्वाह्न", "pm": "अपरान्ह", "AM": "पूर्वाह्न", "PM": "अपरान्ह"}
4437 month_names = [
4438 "",
4439 "जनवरी",
4440 "फेब्रुअरी",
4441 "मार्च",
4442 "एप्रील",
4443 "मे",
4444 "जुन",
4445 "जुलाई",
4446 "अगष्ट",
4447 "सेप्टेम्बर",
4448 "अक्टोबर",
4449 "नोवेम्बर",
4450 "डिसेम्बर",
4451 ]
4452 month_abbreviations = [
4453 "",
4454 "जन",
4455 "फेब",
4456 "मार्च",
4457 "एप्रील",
4458 "मे",
4459 "जुन",
4460 "जुलाई",
4461 "अग",
4462 "सेप",
4463 "अक्ट",
4464 "नोव",
4465 "डिस",
4466 ]
4468 day_names = [
4469 "",
4470 "सोमवार",
4471 "मंगलवार",
4472 "बुधवार",
4473 "बिहिवार",
4474 "शुक्रवार",
4475 "शनिवार",
4476 "आइतवार",
4477 ]
4479 day_abbreviations = ["", "सोम", "मंगल", "बुध", "बिहि", "शुक्र", "शनि", "आइत"]
4482class EstonianLocale(Locale):
4483 names = ["ee", "et"]
4485 past = "{0} tagasi"
4486 future = "{0} pärast"
4487 and_word = "ja"
4489 timeframes: ClassVar[Mapping[TimeFrameLiteral, Mapping[str, str]]] = {
4490 "now": {"past": "just nüüd", "future": "just nüüd"},
4491 "second": {"past": "üks sekund", "future": "ühe sekundi"},
4492 "seconds": {"past": "{0} sekundit", "future": "{0} sekundi"},
4493 "minute": {"past": "üks minut", "future": "ühe minuti"},
4494 "minutes": {"past": "{0} minutit", "future": "{0} minuti"},
4495 "hour": {"past": "tund aega", "future": "tunni aja"},
4496 "hours": {"past": "{0} tundi", "future": "{0} tunni"},
4497 "day": {"past": "üks päev", "future": "ühe päeva"},
4498 "days": {"past": "{0} päeva", "future": "{0} päeva"},
4499 "month": {"past": "üks kuu", "future": "ühe kuu"},
4500 "months": {"past": "{0} kuud", "future": "{0} kuu"},
4501 "year": {"past": "üks aasta", "future": "ühe aasta"},
4502 "years": {"past": "{0} aastat", "future": "{0} aasta"},
4503 }
4505 month_names = [
4506 "",
4507 "Jaanuar",
4508 "Veebruar",
4509 "Märts",
4510 "Aprill",
4511 "Mai",
4512 "Juuni",
4513 "Juuli",
4514 "August",
4515 "September",
4516 "Oktoober",
4517 "November",
4518 "Detsember",
4519 ]
4520 month_abbreviations = [
4521 "",
4522 "Jan",
4523 "Veb",
4524 "Mär",
4525 "Apr",
4526 "Mai",
4527 "Jun",
4528 "Jul",
4529 "Aug",
4530 "Sep",
4531 "Okt",
4532 "Nov",
4533 "Dets",
4534 ]
4536 day_names = [
4537 "",
4538 "Esmaspäev",
4539 "Teisipäev",
4540 "Kolmapäev",
4541 "Neljapäev",
4542 "Reede",
4543 "Laupäev",
4544 "Pühapäev",
4545 ]
4546 day_abbreviations = ["", "Esm", "Teis", "Kolm", "Nelj", "Re", "Lau", "Püh"]
4548 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
4549 form = self.timeframes[timeframe]
4550 if delta > 0:
4551 _form = form["future"]
4552 else:
4553 _form = form["past"]
4554 return _form.format(abs(delta))
4557class LatvianLocale(Locale):
4558 names = ["lv", "lv-lv"]
4560 past = "pirms {0}"
4561 future = "pēc {0}"
4562 and_word = "un"
4564 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
4565 "now": "tagad",
4566 "second": "sekundes",
4567 "seconds": "{0} sekundēm",
4568 "minute": "minūtes",
4569 "minutes": "{0} minūtēm",
4570 "hour": "stundas",
4571 "hours": "{0} stundām",
4572 "day": "dienas",
4573 "days": "{0} dienām",
4574 "week": "nedēļas",
4575 "weeks": "{0} nedēļām",
4576 "month": "mēneša",
4577 "months": "{0} mēnešiem",
4578 "year": "gada",
4579 "years": "{0} gadiem",
4580 }
4582 month_names = [
4583 "",
4584 "janvāris",
4585 "februāris",
4586 "marts",
4587 "aprīlis",
4588 "maijs",
4589 "jūnijs",
4590 "jūlijs",
4591 "augusts",
4592 "septembris",
4593 "oktobris",
4594 "novembris",
4595 "decembris",
4596 ]
4598 month_abbreviations = [
4599 "",
4600 "jan",
4601 "feb",
4602 "marts",
4603 "apr",
4604 "maijs",
4605 "jūnijs",
4606 "jūlijs",
4607 "aug",
4608 "sept",
4609 "okt",
4610 "nov",
4611 "dec",
4612 ]
4614 day_names = [
4615 "",
4616 "pirmdiena",
4617 "otrdiena",
4618 "trešdiena",
4619 "ceturtdiena",
4620 "piektdiena",
4621 "sestdiena",
4622 "svētdiena",
4623 ]
4625 day_abbreviations = [
4626 "",
4627 "pi",
4628 "ot",
4629 "tr",
4630 "ce",
4631 "pi",
4632 "se",
4633 "sv",
4634 ]
4637class SwahiliLocale(Locale):
4638 names = [
4639 "sw",
4640 "sw-ke",
4641 "sw-tz",
4642 ]
4644 past = "{0} iliyopita"
4645 future = "muda wa {0}"
4646 and_word = "na"
4648 timeframes = {
4649 "now": "sasa hivi",
4650 "second": "sekunde",
4651 "seconds": "sekunde {0}",
4652 "minute": "dakika moja",
4653 "minutes": "dakika {0}",
4654 "hour": "saa moja",
4655 "hours": "saa {0}",
4656 "day": "siku moja",
4657 "days": "siku {0}",
4658 "week": "wiki moja",
4659 "weeks": "wiki {0}",
4660 "month": "mwezi moja",
4661 "months": "miezi {0}",
4662 "year": "mwaka moja",
4663 "years": "miaka {0}",
4664 }
4666 meridians = {"am": "asu", "pm": "mch", "AM": "ASU", "PM": "MCH"}
4668 month_names = [
4669 "",
4670 "Januari",
4671 "Februari",
4672 "Machi",
4673 "Aprili",
4674 "Mei",
4675 "Juni",
4676 "Julai",
4677 "Agosti",
4678 "Septemba",
4679 "Oktoba",
4680 "Novemba",
4681 "Desemba",
4682 ]
4683 month_abbreviations = [
4684 "",
4685 "Jan",
4686 "Feb",
4687 "Mac",
4688 "Apr",
4689 "Mei",
4690 "Jun",
4691 "Jul",
4692 "Ago",
4693 "Sep",
4694 "Okt",
4695 "Nov",
4696 "Des",
4697 ]
4699 day_names = [
4700 "",
4701 "Jumatatu",
4702 "Jumanne",
4703 "Jumatano",
4704 "Alhamisi",
4705 "Ijumaa",
4706 "Jumamosi",
4707 "Jumapili",
4708 ]
4709 day_abbreviations = [
4710 "",
4711 "Jumatatu",
4712 "Jumanne",
4713 "Jumatano",
4714 "Alhamisi",
4715 "Ijumaa",
4716 "Jumamosi",
4717 "Jumapili",
4718 ]
4721class CroatianLocale(Locale):
4722 names = ["hr", "hr-hr"]
4724 past = "prije {0}"
4725 future = "za {0}"
4726 and_word = "i"
4728 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
4729 "now": "upravo sad",
4730 "second": "sekundu",
4731 "seconds": {"double": "{0} sekunde", "higher": "{0} sekundi"},
4732 "minute": "minutu",
4733 "minutes": {"double": "{0} minute", "higher": "{0} minuta"},
4734 "hour": "sat",
4735 "hours": {"double": "{0} sata", "higher": "{0} sati"},
4736 "day": "jedan dan",
4737 "days": {"double": "{0} dana", "higher": "{0} dana"},
4738 "week": "tjedan",
4739 "weeks": {"double": "{0} tjedna", "higher": "{0} tjedana"},
4740 "month": "mjesec",
4741 "months": {"double": "{0} mjeseca", "higher": "{0} mjeseci"},
4742 "year": "godinu",
4743 "years": {"double": "{0} godine", "higher": "{0} godina"},
4744 }
4746 month_names = [
4747 "",
4748 "siječanj",
4749 "veljača",
4750 "ožujak",
4751 "travanj",
4752 "svibanj",
4753 "lipanj",
4754 "srpanj",
4755 "kolovoz",
4756 "rujan",
4757 "listopad",
4758 "studeni",
4759 "prosinac",
4760 ]
4762 month_abbreviations = [
4763 "",
4764 "siječ",
4765 "velj",
4766 "ožuj",
4767 "trav",
4768 "svib",
4769 "lip",
4770 "srp",
4771 "kol",
4772 "ruj",
4773 "list",
4774 "stud",
4775 "pros",
4776 ]
4778 day_names = [
4779 "",
4780 "ponedjeljak",
4781 "utorak",
4782 "srijeda",
4783 "četvrtak",
4784 "petak",
4785 "subota",
4786 "nedjelja",
4787 ]
4789 day_abbreviations = [
4790 "",
4791 "po",
4792 "ut",
4793 "sr",
4794 "če",
4795 "pe",
4796 "su",
4797 "ne",
4798 ]
4800 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
4801 form = self.timeframes[timeframe]
4802 delta = abs(delta)
4803 if isinstance(form, Mapping):
4804 if 1 < delta <= 4:
4805 form = form["double"]
4806 else:
4807 form = form["higher"]
4809 return form.format(delta)
4812class LatinLocale(Locale):
4813 names = ["la", "la-va"]
4815 past = "ante {0}"
4816 future = "in {0}"
4817 and_word = "et"
4819 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
4820 "now": "nunc",
4821 "second": "secundum",
4822 "seconds": "{0} secundis",
4823 "minute": "minutam",
4824 "minutes": "{0} minutis",
4825 "hour": "horam",
4826 "hours": "{0} horas",
4827 "day": "diem",
4828 "days": "{0} dies",
4829 "week": "hebdomadem",
4830 "weeks": "{0} hebdomades",
4831 "month": "mensem",
4832 "months": "{0} mensis",
4833 "year": "annum",
4834 "years": "{0} annos",
4835 }
4837 month_names = [
4838 "",
4839 "Ianuarius",
4840 "Februarius",
4841 "Martius",
4842 "Aprilis",
4843 "Maius",
4844 "Iunius",
4845 "Iulius",
4846 "Augustus",
4847 "September",
4848 "October",
4849 "November",
4850 "December",
4851 ]
4853 month_abbreviations = [
4854 "",
4855 "Ian",
4856 "Febr",
4857 "Mart",
4858 "Apr",
4859 "Mai",
4860 "Iun",
4861 "Iul",
4862 "Aug",
4863 "Sept",
4864 "Oct",
4865 "Nov",
4866 "Dec",
4867 ]
4869 day_names = [
4870 "",
4871 "dies Lunae",
4872 "dies Martis",
4873 "dies Mercurii",
4874 "dies Iovis",
4875 "dies Veneris",
4876 "dies Saturni",
4877 "dies Solis",
4878 ]
4880 day_abbreviations = [
4881 "",
4882 "dies Lunae",
4883 "dies Martis",
4884 "dies Mercurii",
4885 "dies Iovis",
4886 "dies Veneris",
4887 "dies Saturni",
4888 "dies Solis",
4889 ]
4892class LithuanianLocale(Locale):
4893 names = ["lt", "lt-lt"]
4895 past = "prieš {0}"
4896 future = "po {0}"
4897 and_word = "ir"
4899 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
4900 "now": "dabar",
4901 "second": "sekundės",
4902 "seconds": "{0} sekundžių",
4903 "minute": "minutės",
4904 "minutes": "{0} minučių",
4905 "hour": "valandos",
4906 "hours": "{0} valandų",
4907 "day": "dieną",
4908 "days": "{0} dienų",
4909 "week": "savaitės",
4910 "weeks": "{0} savaičių",
4911 "month": "mėnesio",
4912 "months": "{0} mėnesių",
4913 "year": "metų",
4914 "years": "{0} metų",
4915 }
4917 month_names = [
4918 "",
4919 "sausis",
4920 "vasaris",
4921 "kovas",
4922 "balandis",
4923 "gegužė",
4924 "birželis",
4925 "liepa",
4926 "rugpjūtis",
4927 "rugsėjis",
4928 "spalis",
4929 "lapkritis",
4930 "gruodis",
4931 ]
4933 month_abbreviations = [
4934 "",
4935 "saus",
4936 "vas",
4937 "kovas",
4938 "bal",
4939 "geg",
4940 "birž",
4941 "liepa",
4942 "rugp",
4943 "rugs",
4944 "spalis",
4945 "lapkr",
4946 "gr",
4947 ]
4949 day_names = [
4950 "",
4951 "pirmadienis",
4952 "antradienis",
4953 "trečiadienis",
4954 "ketvirtadienis",
4955 "penktadienis",
4956 "šeštadienis",
4957 "sekmadienis",
4958 ]
4960 day_abbreviations = [
4961 "",
4962 "pi",
4963 "an",
4964 "tr",
4965 "ke",
4966 "pe",
4967 "še",
4968 "se",
4969 ]
4972class MalayLocale(Locale):
4973 names = ["ms", "ms-my", "ms-bn"]
4975 past = "{0} yang lalu"
4976 future = "dalam {0}"
4977 and_word = "dan"
4979 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
4980 "now": "sekarang",
4981 "second": "saat",
4982 "seconds": "{0} saat",
4983 "minute": "minit",
4984 "minutes": "{0} minit",
4985 "hour": "jam",
4986 "hours": "{0} jam",
4987 "day": "hari",
4988 "days": "{0} hari",
4989 "week": "minggu",
4990 "weeks": "{0} minggu",
4991 "month": "bulan",
4992 "months": "{0} bulan",
4993 "year": "tahun",
4994 "years": "{0} tahun",
4995 }
4997 month_names = [
4998 "",
4999 "Januari",
5000 "Februari",
5001 "Mac",
5002 "April",
5003 "Mei",
5004 "Jun",
5005 "Julai",
5006 "Ogos",
5007 "September",
5008 "Oktober",
5009 "November",
5010 "Disember",
5011 ]
5013 month_abbreviations = [
5014 "",
5015 "Jan.",
5016 "Feb.",
5017 "Mac",
5018 "Apr.",
5019 "Mei",
5020 "Jun",
5021 "Julai",
5022 "Og.",
5023 "Sept.",
5024 "Okt.",
5025 "Nov.",
5026 "Dis.",
5027 ]
5029 day_names = [
5030 "",
5031 "Isnin",
5032 "Selasa",
5033 "Rabu",
5034 "Khamis",
5035 "Jumaat",
5036 "Sabtu",
5037 "Ahad",
5038 ]
5040 day_abbreviations = [
5041 "",
5042 "Isnin",
5043 "Selasa",
5044 "Rabu",
5045 "Khamis",
5046 "Jumaat",
5047 "Sabtu",
5048 "Ahad",
5049 ]
5052class MalteseLocale(Locale):
5053 names = ["mt", "mt-mt"]
5055 past = "{0} ilu"
5056 future = "fi {0}"
5057 and_word = "u"
5059 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
5060 "now": "issa",
5061 "second": "sekonda",
5062 "seconds": "{0} sekondi",
5063 "minute": "minuta",
5064 "minutes": "{0} minuti",
5065 "hour": "siegħa",
5066 "hours": {"dual": "{0} sagħtejn", "plural": "{0} sigħat"},
5067 "day": "jum",
5068 "days": {"dual": "{0} jumejn", "plural": "{0} ijiem"},
5069 "week": "ġimgħa",
5070 "weeks": {"dual": "{0} ġimagħtejn", "plural": "{0} ġimgħat"},
5071 "month": "xahar",
5072 "months": {"dual": "{0} xahrejn", "plural": "{0} xhur"},
5073 "year": "sena",
5074 "years": {"dual": "{0} sentejn", "plural": "{0} snin"},
5075 }
5077 month_names = [
5078 "",
5079 "Jannar",
5080 "Frar",
5081 "Marzu",
5082 "April",
5083 "Mejju",
5084 "Ġunju",
5085 "Lulju",
5086 "Awwissu",
5087 "Settembru",
5088 "Ottubru",
5089 "Novembru",
5090 "Diċembru",
5091 ]
5093 month_abbreviations = [
5094 "",
5095 "Jan",
5096 "Fr",
5097 "Mar",
5098 "Apr",
5099 "Mejju",
5100 "Ġun",
5101 "Lul",
5102 "Aw",
5103 "Sett",
5104 "Ott",
5105 "Nov",
5106 "Diċ",
5107 ]
5109 day_names = [
5110 "",
5111 "It-Tnejn",
5112 "It-Tlieta",
5113 "L-Erbgħa",
5114 "Il-Ħamis",
5115 "Il-Ġimgħa",
5116 "Is-Sibt",
5117 "Il-Ħadd",
5118 ]
5120 day_abbreviations = [
5121 "",
5122 "T",
5123 "TL",
5124 "E",
5125 "Ħ",
5126 "Ġ",
5127 "S",
5128 "Ħ",
5129 ]
5131 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
5132 form = self.timeframes[timeframe]
5133 delta = abs(delta)
5134 if isinstance(form, Mapping):
5135 if delta == 2:
5136 form = form["dual"]
5137 else:
5138 form = form["plural"]
5140 return form.format(delta)
5143class SamiLocale(Locale):
5144 names = ["se", "se-fi", "se-no", "se-se"]
5146 past = "{0} dassái"
5147 future = "{0} " # NOTE: couldn't find preposition for Sami here, none needed?
5149 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
5150 "now": "dál",
5151 "second": "sekunda",
5152 "seconds": "{0} sekundda",
5153 "minute": "minuhta",
5154 "minutes": "{0} minuhta",
5155 "hour": "diimmu",
5156 "hours": "{0} diimmu",
5157 "day": "beaivvi",
5158 "days": "{0} beaivvi",
5159 "week": "vahku",
5160 "weeks": "{0} vahku",
5161 "month": "mánu",
5162 "months": "{0} mánu",
5163 "year": "jagi",
5164 "years": "{0} jagi",
5165 }
5167 month_names = [
5168 "",
5169 "Ođđajagimánnu",
5170 "Guovvamánnu",
5171 "Njukčamánnu",
5172 "Cuoŋománnu",
5173 "Miessemánnu",
5174 "Geassemánnu",
5175 "Suoidnemánnu",
5176 "Borgemánnu",
5177 "Čakčamánnu",
5178 "Golggotmánnu",
5179 "Skábmamánnu",
5180 "Juovlamánnu",
5181 ]
5183 month_abbreviations = [
5184 "",
5185 "Ođđajagimánnu",
5186 "Guovvamánnu",
5187 "Njukčamánnu",
5188 "Cuoŋománnu",
5189 "Miessemánnu",
5190 "Geassemánnu",
5191 "Suoidnemánnu",
5192 "Borgemánnu",
5193 "Čakčamánnu",
5194 "Golggotmánnu",
5195 "Skábmamánnu",
5196 "Juovlamánnu",
5197 ]
5199 day_names = [
5200 "",
5201 "Mánnodat",
5202 "Disdat",
5203 "Gaskavahkku",
5204 "Duorastat",
5205 "Bearjadat",
5206 "Lávvordat",
5207 "Sotnabeaivi",
5208 ]
5210 day_abbreviations = [
5211 "",
5212 "Mánnodat",
5213 "Disdat",
5214 "Gaskavahkku",
5215 "Duorastat",
5216 "Bearjadat",
5217 "Lávvordat",
5218 "Sotnabeaivi",
5219 ]
5222class OdiaLocale(Locale):
5223 names = ["or", "or-in"]
5225 past = "{0} ପୂର୍ବେ"
5226 future = "{0} ପରେ"
5228 timeframes = {
5229 "now": "ବର୍ତ୍ତମାନ",
5230 "second": "ଏକ ସେକେଣ୍ଡ",
5231 "seconds": "{0} ସେକେଣ୍ଡ",
5232 "minute": "ଏକ ମିନଟ",
5233 "minutes": "{0} ମିନଟ",
5234 "hour": "ଏକ ଘଣ୍ଟା",
5235 "hours": "{0} ଘଣ୍ଟା",
5236 "day": "ଏକ ଦିନ",
5237 "days": "{0} ଦିନ",
5238 "month": "ଏକ ମାସ",
5239 "months": "{0} ମାସ ",
5240 "year": "ଏକ ବର୍ଷ",
5241 "years": "{0} ବର୍ଷ",
5242 }
5244 meridians = {"am": "ପୂର୍ବାହ୍ନ", "pm": "ଅପରାହ୍ନ", "AM": "ପୂର୍ବାହ୍ନ", "PM": "ଅପରାହ୍ନ"}
5246 month_names = [
5247 "",
5248 "ଜାନୁଆରୀ",
5249 "ଫେବୃଆରୀ",
5250 "ମାର୍ଚ୍ଚ୍",
5251 "ଅପ୍ରେଲ",
5252 "ମଇ",
5253 "ଜୁନ୍",
5254 "ଜୁଲାଇ",
5255 "ଅଗଷ୍ଟ",
5256 "ସେପ୍ଟେମ୍ବର",
5257 "ଅକ୍ଟୋବର୍",
5258 "ନଭେମ୍ବର୍",
5259 "ଡିସେମ୍ବର୍",
5260 ]
5261 month_abbreviations = [
5262 "",
5263 "ଜାନୁ",
5264 "ଫେବୃ",
5265 "ମାର୍ଚ୍ଚ୍",
5266 "ଅପ୍ରେ",
5267 "ମଇ",
5268 "ଜୁନ୍",
5269 "ଜୁଲା",
5270 "ଅଗ",
5271 "ସେପ୍ଟେ",
5272 "ଅକ୍ଟୋ",
5273 "ନଭେ",
5274 "ଡିସେ",
5275 ]
5277 day_names = [
5278 "",
5279 "ସୋମବାର",
5280 "ମଙ୍ଗଳବାର",
5281 "ବୁଧବାର",
5282 "ଗୁରୁବାର",
5283 "ଶୁକ୍ରବାର",
5284 "ଶନିବାର",
5285 "ରବିବାର",
5286 ]
5287 day_abbreviations = [
5288 "",
5289 "ସୋମ",
5290 "ମଙ୍ଗଳ",
5291 "ବୁଧ",
5292 "ଗୁରୁ",
5293 "ଶୁକ୍ର",
5294 "ଶନି",
5295 "ରବି",
5296 ]
5298 def _ordinal_number(self, n: int) -> str:
5299 if n > 10 or n == 0:
5300 return f"{n}ତମ"
5301 if n in [1, 5, 7, 8, 9, 10]:
5302 return f"{n}ମ"
5303 if n in [2, 3]:
5304 return f"{n}ୟ"
5305 if n == 4:
5306 return f"{n}ର୍ଥ"
5307 if n == 6:
5308 return f"{n}ଷ୍ଠ"
5309 return ""
5312class SerbianLocale(Locale):
5313 names = ["sr", "sr-rs", "sr-sp"]
5315 past = "pre {0}"
5316 future = "za {0}"
5317 and_word = "i"
5319 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
5320 "now": "sada",
5321 "second": "sekundu",
5322 "seconds": {"double": "{0} sekunde", "higher": "{0} sekundi"},
5323 "minute": "minutu",
5324 "minutes": {"double": "{0} minute", "higher": "{0} minuta"},
5325 "hour": "sat",
5326 "hours": {"double": "{0} sata", "higher": "{0} sati"},
5327 "day": "dan",
5328 "days": {"double": "{0} dana", "higher": "{0} dana"},
5329 "week": "nedelju",
5330 "weeks": {"double": "{0} nedelje", "higher": "{0} nedelja"},
5331 "month": "mesec",
5332 "months": {"double": "{0} meseca", "higher": "{0} meseci"},
5333 "year": "godinu",
5334 "years": {"double": "{0} godine", "higher": "{0} godina"},
5335 }
5337 month_names = [
5338 "",
5339 "januar", # јануар
5340 "februar", # фебруар
5341 "mart", # март
5342 "april", # април
5343 "maj", # мај
5344 "jun", # јун
5345 "jul", # јул
5346 "avgust", # август
5347 "septembar", # септембар
5348 "oktobar", # октобар
5349 "novembar", # новембар
5350 "decembar", # децембар
5351 ]
5353 month_abbreviations = [
5354 "",
5355 "jan",
5356 "feb",
5357 "mar",
5358 "apr",
5359 "maj",
5360 "jun",
5361 "jul",
5362 "avg",
5363 "sep",
5364 "okt",
5365 "nov",
5366 "dec",
5367 ]
5369 day_names = [
5370 "",
5371 "ponedeljak", # понедељак
5372 "utorak", # уторак
5373 "sreda", # среда
5374 "četvrtak", # четвртак
5375 "petak", # петак
5376 "subota", # субота
5377 "nedelja", # недеља
5378 ]
5380 day_abbreviations = [
5381 "",
5382 "po", # по
5383 "ut", # ут
5384 "sr", # ср
5385 "če", # че
5386 "pe", # пе
5387 "su", # су
5388 "ne", # не
5389 ]
5391 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
5392 form = self.timeframes[timeframe]
5393 delta = abs(delta)
5394 if isinstance(form, Mapping):
5395 if 1 < delta <= 4:
5396 form = form["double"]
5397 else:
5398 form = form["higher"]
5400 return form.format(delta)
5403class LuxembourgishLocale(Locale):
5404 names = ["lb", "lb-lu"]
5406 past = "virun {0}"
5407 future = "an {0}"
5408 and_word = "an"
5410 timeframes: ClassVar[Dict[TimeFrameLiteral, str]] = {
5411 "now": "just elo",
5412 "second": "enger Sekonn",
5413 "seconds": "{0} Sekonnen",
5414 "minute": "enger Minutt",
5415 "minutes": "{0} Minutten",
5416 "hour": "enger Stonn",
5417 "hours": "{0} Stonnen",
5418 "day": "engem Dag",
5419 "days": "{0} Deeg",
5420 "week": "enger Woch",
5421 "weeks": "{0} Wochen",
5422 "month": "engem Mount",
5423 "months": "{0} Méint",
5424 "year": "engem Joer",
5425 "years": "{0} Jahren",
5426 }
5428 timeframes_only_distance = timeframes.copy()
5429 timeframes_only_distance["second"] = "eng Sekonn"
5430 timeframes_only_distance["minute"] = "eng Minutt"
5431 timeframes_only_distance["hour"] = "eng Stonn"
5432 timeframes_only_distance["day"] = "een Dag"
5433 timeframes_only_distance["days"] = "{0} Deeg"
5434 timeframes_only_distance["week"] = "eng Woch"
5435 timeframes_only_distance["month"] = "ee Mount"
5436 timeframes_only_distance["months"] = "{0} Méint"
5437 timeframes_only_distance["year"] = "ee Joer"
5438 timeframes_only_distance["years"] = "{0} Joer"
5440 month_names = [
5441 "",
5442 "Januar",
5443 "Februar",
5444 "Mäerz",
5445 "Abrëll",
5446 "Mee",
5447 "Juni",
5448 "Juli",
5449 "August",
5450 "September",
5451 "Oktouber",
5452 "November",
5453 "Dezember",
5454 ]
5456 month_abbreviations = [
5457 "",
5458 "Jan",
5459 "Feb",
5460 "Mäe",
5461 "Abr",
5462 "Mee",
5463 "Jun",
5464 "Jul",
5465 "Aug",
5466 "Sep",
5467 "Okt",
5468 "Nov",
5469 "Dez",
5470 ]
5472 day_names = [
5473 "",
5474 "Méindeg",
5475 "Dënschdeg",
5476 "Mëttwoch",
5477 "Donneschdeg",
5478 "Freideg",
5479 "Samschdeg",
5480 "Sonndeg",
5481 ]
5483 day_abbreviations = ["", "Méi", "Dën", "Mët", "Don", "Fre", "Sam", "Son"]
5485 def _ordinal_number(self, n: int) -> str:
5486 return f"{n}."
5488 def describe(
5489 self,
5490 timeframe: TimeFrameLiteral,
5491 delta: Union[int, float] = 0,
5492 only_distance: bool = False,
5493 ) -> str:
5494 if not only_distance:
5495 return super().describe(timeframe, delta, only_distance)
5497 # Luxembourgish uses a different case without 'in' or 'ago'
5498 humanized: str = self.timeframes_only_distance[timeframe].format(
5499 trunc(abs(delta))
5500 )
5502 return humanized
5505class ZuluLocale(Locale):
5506 names = ["zu", "zu-za"]
5508 past = "{0} edlule"
5509 future = "{0} "
5510 and_word = "futhi"
5512 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[Mapping[str, str], str]]] = {
5513 "now": "manje",
5514 "second": {"past": "umzuzwana", "future": "ngomzuzwana"},
5515 "seconds": {"past": "{0} imizuzwana", "future": "{0} ngemizuzwana"},
5516 "minute": {"past": "umzuzu", "future": "ngomzuzu"},
5517 "minutes": {"past": "{0} imizuzu", "future": "{0} ngemizuzu"},
5518 "hour": {"past": "ihora", "future": "ngehora"},
5519 "hours": {"past": "{0} amahora", "future": "{0} emahoreni"},
5520 "day": {"past": "usuku", "future": "ngosuku"},
5521 "days": {"past": "{0} izinsuku", "future": "{0} ezinsukwini"},
5522 "week": {"past": "isonto", "future": "ngesonto"},
5523 "weeks": {"past": "{0} amasonto", "future": "{0} emasontweni"},
5524 "month": {"past": "inyanga", "future": "ngenyanga"},
5525 "months": {"past": "{0} izinyanga", "future": "{0} ezinyangeni"},
5526 "year": {"past": "unyaka", "future": "ngonyak"},
5527 "years": {"past": "{0} iminyaka", "future": "{0} eminyakeni"},
5528 }
5530 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
5531 """Zulu aware time frame format function, takes into account
5532 the differences between past and future forms."""
5533 abs_delta = abs(delta)
5534 form = self.timeframes[timeframe]
5536 if isinstance(form, str):
5537 return form.format(abs_delta)
5539 if delta > 0:
5540 key = "future"
5541 else:
5542 key = "past"
5543 form = form[key]
5545 return form.format(abs_delta)
5547 month_names = [
5548 "",
5549 "uMasingane",
5550 "uNhlolanja",
5551 "uNdasa",
5552 "UMbasa",
5553 "UNhlaba",
5554 "UNhlangulana",
5555 "uNtulikazi",
5556 "UNcwaba",
5557 "uMandulo",
5558 "uMfumfu",
5559 "uLwezi",
5560 "uZibandlela",
5561 ]
5563 month_abbreviations = [
5564 "",
5565 "uMasingane",
5566 "uNhlolanja",
5567 "uNdasa",
5568 "UMbasa",
5569 "UNhlaba",
5570 "UNhlangulana",
5571 "uNtulikazi",
5572 "UNcwaba",
5573 "uMandulo",
5574 "uMfumfu",
5575 "uLwezi",
5576 "uZibandlela",
5577 ]
5579 day_names = [
5580 "",
5581 "uMsombuluko",
5582 "uLwesibili",
5583 "uLwesithathu",
5584 "uLwesine",
5585 "uLwesihlanu",
5586 "uMgqibelo",
5587 "iSonto",
5588 ]
5590 day_abbreviations = [
5591 "",
5592 "uMsombuluko",
5593 "uLwesibili",
5594 "uLwesithathu",
5595 "uLwesine",
5596 "uLwesihlanu",
5597 "uMgqibelo",
5598 "iSonto",
5599 ]
5602class TamilLocale(Locale):
5603 names = ["ta", "ta-in", "ta-lk"]
5605 past = "{0} நேரத்திற்கு முன்பு"
5606 future = "இல் {0}"
5608 timeframes = {
5609 "now": "இப்போது",
5610 "second": "ஒரு இரண்டாவது",
5611 "seconds": "{0} விநாடிகள்",
5612 "minute": "ஒரு நிமிடம்",
5613 "minutes": "{0} நிமிடங்கள்",
5614 "hour": "ஒரு மணி",
5615 "hours": "{0} மணிநேரம்",
5616 "day": "ஒரு நாள்",
5617 "days": "{0} நாட்கள்",
5618 "week": "ஒரு வாரம்",
5619 "weeks": "{0} வாரங்கள்",
5620 "month": "ஒரு மாதம்",
5621 "months": "{0} மாதங்கள்",
5622 "year": "ஒரு ஆண்டு",
5623 "years": "{0} ஆண்டுகள்",
5624 }
5626 month_names = [
5627 "",
5628 "சித்திரை",
5629 "வைகாசி",
5630 "ஆனி",
5631 "ஆடி",
5632 "ஆவணி",
5633 "புரட்டாசி",
5634 "ஐப்பசி",
5635 "கார்த்திகை",
5636 "மார்கழி",
5637 "தை",
5638 "மாசி",
5639 "பங்குனி",
5640 ]
5642 month_abbreviations = [
5643 "",
5644 "ஜன",
5645 "பிப்",
5646 "மார்",
5647 "ஏப்",
5648 "மே",
5649 "ஜூன்",
5650 "ஜூலை",
5651 "ஆக",
5652 "செப்",
5653 "அக்",
5654 "நவ",
5655 "டிச",
5656 ]
5658 day_names = [
5659 "",
5660 "திங்கட்கிழமை",
5661 "செவ்வாய்க்கிழமை",
5662 "புதன்கிழமை",
5663 "வியாழக்கிழமை",
5664 "வெள்ளிக்கிழமை",
5665 "சனிக்கிழமை",
5666 "ஞாயிற்றுக்கிழமை",
5667 ]
5669 day_abbreviations = [
5670 "",
5671 "திங்கட்",
5672 "செவ்வாய்",
5673 "புதன்",
5674 "வியாழன்",
5675 "வெள்ளி",
5676 "சனி",
5677 "ஞாயிறு",
5678 ]
5680 def _ordinal_number(self, n: int) -> str:
5681 if n == 1:
5682 return f"{n}வது"
5683 elif n >= 0:
5684 return f"{n}ஆம்"
5685 else:
5686 return ""
5689class AlbanianLocale(Locale):
5690 names = ["sq", "sq-al"]
5692 past = "{0} më parë"
5693 future = "në {0}"
5694 and_word = "dhe"
5696 timeframes = {
5697 "now": "tani",
5698 "second": "sekondë",
5699 "seconds": "{0} sekonda",
5700 "minute": "minutë",
5701 "minutes": "{0} minuta",
5702 "hour": "orë",
5703 "hours": "{0} orë",
5704 "day": "ditë",
5705 "days": "{0} ditë",
5706 "week": "javë",
5707 "weeks": "{0} javë",
5708 "month": "muaj",
5709 "months": "{0} muaj",
5710 "year": "vit",
5711 "years": "{0} vjet",
5712 }
5714 month_names = [
5715 "",
5716 "janar",
5717 "shkurt",
5718 "mars",
5719 "prill",
5720 "maj",
5721 "qershor",
5722 "korrik",
5723 "gusht",
5724 "shtator",
5725 "tetor",
5726 "nëntor",
5727 "dhjetor",
5728 ]
5730 month_abbreviations = [
5731 "",
5732 "jan",
5733 "shk",
5734 "mar",
5735 "pri",
5736 "maj",
5737 "qer",
5738 "korr",
5739 "gush",
5740 "sht",
5741 "tet",
5742 "nën",
5743 "dhj",
5744 ]
5746 day_names = [
5747 "",
5748 "e hënë",
5749 "e martë",
5750 "e mërkurë",
5751 "e enjte",
5752 "e premte",
5753 "e shtunë",
5754 "e diel",
5755 ]
5757 day_abbreviations = [
5758 "",
5759 "hën",
5760 "mar",
5761 "mër",
5762 "enj",
5763 "pre",
5764 "sht",
5765 "die",
5766 ]
5769class GeorgianLocale(Locale):
5770 names = ["ka", "ka-ge"]
5772 past = "{0} წინ" # ts’in
5773 future = "{0} შემდეგ" # shemdeg
5774 and_word = "და" # da
5776 timeframes = {
5777 "now": "ახლა", # akhla
5778 # When a cardinal qualifies a noun, it stands in the singular
5779 "second": "წამის", # ts’amis
5780 "seconds": "{0} წამის",
5781 "minute": "წუთის", # ts’utis
5782 "minutes": "{0} წუთის",
5783 "hour": "საათის", # saatis
5784 "hours": "{0} საათის",
5785 "day": "დღის", # dghis
5786 "days": "{0} დღის",
5787 "week": "კვირის", # k’viris
5788 "weeks": "{0} კვირის",
5789 "month": "თვის", # tvis
5790 "months": "{0} თვის",
5791 "year": "წლის", # ts’lis
5792 "years": "{0} წლის",
5793 }
5795 month_names = [
5796 # modern month names
5797 "",
5798 "იანვარი", # Ianvari
5799 "თებერვალი", # Tebervali
5800 "მარტი", # Mart'i
5801 "აპრილი", # Ap'rili
5802 "მაისი", # Maisi
5803 "ივნისი", # Ivnisi
5804 "ივლისი", # Ivlisi
5805 "აგვისტო", # Agvist'o
5806 "სექტემბერი", # Sekt'emberi
5807 "ოქტომბერი", # Okt'omberi
5808 "ნოემბერი", # Noemberi
5809 "დეკემბერი", # Dek'emberi
5810 ]
5812 month_abbreviations = [
5813 # no abbr. found yet
5814 "",
5815 "იანვარი", # Ianvari
5816 "თებერვალი", # Tebervali
5817 "მარტი", # Mart'i
5818 "აპრილი", # Ap'rili
5819 "მაისი", # Maisi
5820 "ივნისი", # Ivnisi
5821 "ივლისი", # Ivlisi
5822 "აგვისტო", # Agvist'o
5823 "სექტემბერი", # Sekt'emberi
5824 "ოქტომბერი", # Okt'omberi
5825 "ნოემბერი", # Noemberi
5826 "დეკემბერი", # Dek'emberi
5827 ]
5829 day_names = [
5830 "",
5831 "ორშაბათი", # orshabati
5832 "სამშაბათი", # samshabati
5833 "ოთხშაბათი", # otkhshabati
5834 "ხუთშაბათი", # khutshabati
5835 "პარასკევი", # p’arask’evi
5836 "შაბათი", # shabati
5837 # "k’vira" also serves as week; to avoid confusion "k’vira-dge" can be used for Sunday
5838 "კვირა", # k’vira
5839 ]
5841 day_abbreviations = [
5842 "",
5843 "ორშაბათი", # orshabati
5844 "სამშაბათი", # samshabati
5845 "ოთხშაბათი", # otkhshabati
5846 "ხუთშაბათი", # khutshabati
5847 "პარასკევი", # p’arask’evi
5848 "შაბათი", # shabati
5849 "კვირა", # k’vira
5850 ]
5853class SinhalaLocale(Locale):
5854 names = ["si", "si-lk"]
5856 past = "{0}ට පෙර"
5857 future = "{0}"
5858 and_word = "සහ"
5860 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[Mapping[str, str], str]]] = {
5861 "now": "දැන්",
5862 "second": {
5863 "past": "තත්පරයක",
5864 "future": "තත්පරයකින්",
5865 }, # ක් is the article
5866 "seconds": {
5867 "past": "තත්පර {0} ක",
5868 "future": "තත්පර {0} කින්",
5869 },
5870 "minute": {
5871 "past": "විනාඩියක",
5872 "future": "විනාඩියකින්",
5873 },
5874 "minutes": {
5875 "past": "විනාඩි {0} ක",
5876 "future": "මිනිත්තු {0} කින්",
5877 },
5878 "hour": {"past": "පැයක", "future": "පැයකින්"},
5879 "hours": {
5880 "past": "පැය {0} ක",
5881 "future": "පැය {0} කින්",
5882 },
5883 "day": {"past": "දිනක", "future": "දිනකට"},
5884 "days": {
5885 "past": "දින {0} ක",
5886 "future": "දින {0} කින්",
5887 },
5888 "week": {"past": "සතියක", "future": "සතියකින්"},
5889 "weeks": {
5890 "past": "සති {0} ක",
5891 "future": "සති {0} කින්",
5892 },
5893 "month": {"past": "මාසයක", "future": "එය මාසය තුළ"},
5894 "months": {
5895 "past": "මාස {0} ක",
5896 "future": "මාස {0} කින්",
5897 },
5898 "year": {"past": "වසරක", "future": "වසරක් තුළ"},
5899 "years": {
5900 "past": "අවුරුදු {0} ක",
5901 "future": "අවුරුදු {0} තුළ",
5902 },
5903 }
5904 # Sinhala: the general format to describe timeframe is different from past and future,
5905 # so we do not copy the original timeframes dictionary
5906 timeframes_only_distance = {}
5907 timeframes_only_distance["second"] = "තත්පරයක්"
5908 timeframes_only_distance["seconds"] = "තත්පර {0}"
5909 timeframes_only_distance["minute"] = "මිනිත්තුවක්"
5910 timeframes_only_distance["minutes"] = "විනාඩි {0}"
5911 timeframes_only_distance["hour"] = "පැයක්"
5912 timeframes_only_distance["hours"] = "පැය {0}"
5913 timeframes_only_distance["day"] = "දවසක්"
5914 timeframes_only_distance["days"] = "දවස් {0}"
5915 timeframes_only_distance["week"] = "සතියක්"
5916 timeframes_only_distance["weeks"] = "සති {0}"
5917 timeframes_only_distance["month"] = "මාසයක්"
5918 timeframes_only_distance["months"] = "මාස {0}"
5919 timeframes_only_distance["year"] = "අවුරුද්දක්"
5920 timeframes_only_distance["years"] = "අවුරුදු {0}"
5922 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
5923 """
5924 Sinhala awares time frame format function, takes into account
5925 the differences between general, past, and future forms (three different suffixes).
5926 """
5927 abs_delta = abs(delta)
5928 form = self.timeframes[timeframe]
5930 if isinstance(form, str):
5931 return form.format(abs_delta)
5933 if delta > 0:
5934 key = "future"
5935 else:
5936 key = "past"
5937 form = form[key]
5939 return form.format(abs_delta)
5941 def describe(
5942 self,
5943 timeframe: TimeFrameLiteral,
5944 delta: Union[float, int] = 1, # key is always future when only_distance=False
5945 only_distance: bool = False,
5946 ) -> str:
5947 """Describes a delta within a timeframe in plain language.
5949 :param timeframe: a string representing a timeframe.
5950 :param delta: a quantity representing a delta in a timeframe.
5951 :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords
5952 """
5954 if not only_distance:
5955 return super().describe(timeframe, delta, only_distance)
5956 # Sinhala uses a different case without 'in' or 'ago'
5957 humanized = self.timeframes_only_distance[timeframe].format(trunc(abs(delta)))
5959 return humanized
5961 month_names = [
5962 "",
5963 "ජනවාරි",
5964 "පෙබරවාරි",
5965 "මාර්තු",
5966 "අප්රේල්",
5967 "මැයි",
5968 "ජූනි",
5969 "ජූලි",
5970 "අගෝස්තු",
5971 "සැප්තැම්බර්",
5972 "ඔක්තෝබර්",
5973 "නොවැම්බර්",
5974 "දෙසැම්බර්",
5975 ]
5977 month_abbreviations = [
5978 "",
5979 "ජන",
5980 "පෙබ",
5981 "මාර්",
5982 "අප්රේ",
5983 "මැයි",
5984 "ජුනි",
5985 "ජූලි",
5986 "අගෝ",
5987 "සැප්",
5988 "ඔක්",
5989 "නොවැ",
5990 "දෙසැ",
5991 ]
5993 day_names = [
5994 "",
5995 "සදුදා",
5996 "අඟහරැවදා",
5997 "බදාදා",
5998 "බ්රහස්පතින්දා",
5999 "සිකුරාදා",
6000 "සෙනසුරාදා",
6001 "ඉරිදා",
6002 ]
6004 day_abbreviations = [
6005 "",
6006 "සදුද",
6007 "බදා",
6008 "බදා",
6009 "සිකු",
6010 "සෙන",
6011 "අ",
6012 "ඉරිදා",
6013 ]
6016class UrduLocale(Locale):
6017 names = ["ur", "ur-pk"]
6019 past = "پہلے {0}"
6020 future = "میں {0}"
6021 and_word = "اور"
6023 timeframes = {
6024 "now": "ابھی",
6025 "second": "ایک سیکنڈ",
6026 "seconds": "{0} سیکنڈ",
6027 "minute": "ایک منٹ",
6028 "minutes": "{0} منٹ",
6029 "hour": "ایک گھنٹے",
6030 "hours": "{0} گھنٹے",
6031 "day": "ایک دن",
6032 "days": "{0} دن",
6033 "week": "ایک ہفتے",
6034 "weeks": "{0} ہفتے",
6035 "month": "ایک مہینہ",
6036 "months": "{0} ماہ",
6037 "year": "ایک سال",
6038 "years": "{0} سال",
6039 }
6041 month_names = [
6042 "",
6043 "جنوری",
6044 "فروری",
6045 "مارچ",
6046 "اپریل",
6047 "مئی",
6048 "جون",
6049 "جولائی",
6050 "اگست",
6051 "ستمبر",
6052 "اکتوبر",
6053 "نومبر",
6054 "دسمبر",
6055 ]
6057 month_abbreviations = [
6058 "",
6059 "جنوری",
6060 "فروری",
6061 "مارچ",
6062 "اپریل",
6063 "مئی",
6064 "جون",
6065 "جولائی",
6066 "اگست",
6067 "ستمبر",
6068 "اکتوبر",
6069 "نومبر",
6070 "دسمبر",
6071 ]
6073 day_names = [
6074 "",
6075 "سوموار",
6076 "منگل",
6077 "بدھ",
6078 "جمعرات",
6079 "جمعہ",
6080 "ہفتہ",
6081 "اتوار",
6082 ]
6084 day_abbreviations = [
6085 "",
6086 "سوموار",
6087 "منگل",
6088 "بدھ",
6089 "جمعرات",
6090 "جمعہ",
6091 "ہفتہ",
6092 "اتوار",
6093 ]
6096class KazakhLocale(Locale):
6097 names = ["kk", "kk-kz"]
6099 past = "{0} бұрын"
6100 future = "{0} кейін"
6101 timeframes = {
6102 "now": "қазір",
6103 "second": "бір секунд",
6104 "seconds": "{0} секунд",
6105 "minute": "бір минут",
6106 "minutes": "{0} минут",
6107 "hour": "бір сағат",
6108 "hours": "{0} сағат",
6109 "day": "бір күн",
6110 "days": "{0} күн",
6111 "week": "бір апта",
6112 "weeks": "{0} апта",
6113 "month": "бір ай",
6114 "months": "{0} ай",
6115 "year": "бір жыл",
6116 "years": "{0} жыл",
6117 }
6119 month_names = [
6120 "",
6121 "Қаңтар",
6122 "Ақпан",
6123 "Наурыз",
6124 "Сәуір",
6125 "Мамыр",
6126 "Маусым",
6127 "Шілде",
6128 "Тамыз",
6129 "Қыркүйек",
6130 "Қазан",
6131 "Қараша",
6132 "Желтоқсан",
6133 ]
6134 month_abbreviations = [
6135 "",
6136 "Қан",
6137 "Ақп",
6138 "Нау",
6139 "Сәу",
6140 "Мам",
6141 "Мау",
6142 "Шіл",
6143 "Там",
6144 "Қыр",
6145 "Қаз",
6146 "Қар",
6147 "Жел",
6148 ]
6150 day_names = [
6151 "",
6152 "Дүйсембі",
6153 "Сейсенбі",
6154 "Сәрсенбі",
6155 "Бейсенбі",
6156 "Жұма",
6157 "Сенбі",
6158 "Жексенбі",
6159 ]
6160 day_abbreviations = ["", "Дс", "Сс", "Ср", "Бс", "Жм", "Сб", "Жс"]
6163class AmharicLocale(Locale):
6164 names = ["am", "am-et"]
6166 past = "{0} በፊት"
6167 future = "{0} ውስጥ"
6168 and_word = "እና"
6170 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[Mapping[str, str], str]]] = {
6171 "now": "አሁን",
6172 "second": {
6173 "past": "ከአንድ ሰከንድ",
6174 "future": "በአንድ ሰከንድ",
6175 },
6176 "seconds": {
6177 "past": "ከ {0} ሰከንድ",
6178 "future": "በ {0} ሰከንድ",
6179 },
6180 "minute": {
6181 "past": "ከአንድ ደቂቃ",
6182 "future": "በአንድ ደቂቃ",
6183 },
6184 "minutes": {
6185 "past": "ከ {0} ደቂቃዎች",
6186 "future": "በ {0} ደቂቃዎች",
6187 },
6188 "hour": {
6189 "past": "ከአንድ ሰዓት",
6190 "future": "በአንድ ሰዓት",
6191 },
6192 "hours": {
6193 "past": "ከ {0} ሰዓታት",
6194 "future": "በ {0} ሰከንድ",
6195 },
6196 "day": {
6197 "past": "ከአንድ ቀን",
6198 "future": "በአንድ ቀን",
6199 },
6200 "days": {
6201 "past": "ከ {0} ቀናት",
6202 "future": "በ {0} ቀናት",
6203 },
6204 "week": {
6205 "past": "ከአንድ ሳምንት",
6206 "future": "በአንድ ሳምንት",
6207 },
6208 "weeks": {
6209 "past": "ከ {0} ሳምንታት",
6210 "future": "በ {0} ሳምንታት",
6211 },
6212 "month": {
6213 "past": "ከአንድ ወር",
6214 "future": "በአንድ ወር",
6215 },
6216 "months": {
6217 "past": "ከ {0} ወር",
6218 "future": "በ {0} ወራት",
6219 },
6220 "year": {
6221 "past": "ከአንድ አመት",
6222 "future": "በአንድ አመት",
6223 },
6224 "years": {
6225 "past": "ከ {0} ዓመታት",
6226 "future": "በ {0} ዓመታት",
6227 },
6228 }
6229 # Amharic: the general format to describe timeframe is different from past and future,
6230 # so we do not copy the original timeframes dictionary
6231 timeframes_only_distance = {
6232 "second": "አንድ ሰከንድ",
6233 "seconds": "{0} ሰከንድ",
6234 "minute": "አንድ ደቂቃ",
6235 "minutes": "{0} ደቂቃዎች",
6236 "hour": "አንድ ሰዓት",
6237 "hours": "{0} ሰዓት",
6238 "day": "አንድ ቀን",
6239 "days": "{0} ቀናት",
6240 "week": "አንድ ሳምንት",
6241 "weeks": "{0} ሳምንት",
6242 "month": "አንድ ወር",
6243 "months": "{0} ወራት",
6244 "year": "አንድ አመት",
6245 "years": "{0} ዓመታት",
6246 }
6248 month_names = [
6249 "",
6250 "ጃንዩወሪ",
6251 "ፌብሩወሪ",
6252 "ማርች",
6253 "ኤፕሪል",
6254 "ሜይ",
6255 "ጁን",
6256 "ጁላይ",
6257 "ኦገስት",
6258 "ሴፕቴምበር",
6259 "ኦክቶበር",
6260 "ኖቬምበር",
6261 "ዲሴምበር",
6262 ]
6264 month_abbreviations = [
6265 "",
6266 "ጃንዩ",
6267 "ፌብሩ",
6268 "ማርች",
6269 "ኤፕሪ",
6270 "ሜይ",
6271 "ጁን",
6272 "ጁላይ",
6273 "ኦገስ",
6274 "ሴፕቴ",
6275 "ኦክቶ",
6276 "ኖቬም",
6277 "ዲሴም",
6278 ]
6280 day_names = [
6281 "",
6282 "ሰኞ",
6283 "ማክሰኞ",
6284 "ረቡዕ",
6285 "ሐሙስ",
6286 "ዓርብ",
6287 "ቅዳሜ",
6288 "እሑድ",
6289 ]
6290 day_abbreviations = ["", "እ", "ሰ", "ማ", "ረ", "ሐ", "ዓ", "ቅ"]
6292 def _ordinal_number(self, n: int) -> str:
6293 return f"{n}ኛ"
6295 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
6296 """
6297 Amharic awares time frame format function, takes into account
6298 the differences between general, past, and future forms (three different suffixes).
6299 """
6300 abs_delta = abs(delta)
6301 form = self.timeframes[timeframe]
6303 if isinstance(form, str):
6304 return form.format(abs_delta)
6306 if delta > 0:
6307 key = "future"
6308 else:
6309 key = "past"
6310 form = form[key]
6312 return form.format(abs_delta)
6314 def describe(
6315 self,
6316 timeframe: TimeFrameLiteral,
6317 delta: Union[float, int] = 1, # key is always future when only_distance=False
6318 only_distance: bool = False,
6319 ) -> str:
6320 """Describes a delta within a timeframe in plain language.
6322 :param timeframe: a string representing a timeframe.
6323 :param delta: a quantity representing a delta in a timeframe.
6324 :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords
6325 """
6327 if not only_distance:
6328 return super().describe(timeframe, delta, only_distance)
6329 humanized = self.timeframes_only_distance[timeframe].format(trunc(abs(delta)))
6331 return humanized
6334class ArmenianLocale(Locale):
6335 names = ["hy", "hy-am"]
6336 past = "{0} առաջ"
6337 future = "{0}ից"
6338 and_word = "Եվ" # Yev
6340 timeframes = {
6341 "now": "հիմա",
6342 "second": "վայրկյան",
6343 "seconds": "{0} վայրկյան",
6344 "minute": "րոպե",
6345 "minutes": "{0} րոպե",
6346 "hour": "ժամ",
6347 "hours": "{0} ժամ",
6348 "day": "օր",
6349 "days": "{0} օր",
6350 "month": "ամիս",
6351 "months": "{0} ամիս",
6352 "year": "տարին",
6353 "years": "{0} տարին",
6354 "week": "շաբաթ",
6355 "weeks": "{0} շաբաթ",
6356 }
6358 meridians = {
6359 "am": "Ամ",
6360 "pm": "պ.մ.",
6361 "AM": "Ամ",
6362 "PM": "պ.մ.",
6363 }
6365 month_names = [
6366 "",
6367 "հունվար",
6368 "փետրվար",
6369 "մարտ",
6370 "ապրիլ",
6371 "մայիս",
6372 "հունիս",
6373 "հուլիս",
6374 "օգոստոս",
6375 "սեպտեմբեր",
6376 "հոկտեմբեր",
6377 "նոյեմբեր",
6378 "դեկտեմբեր",
6379 ]
6381 month_abbreviations = [
6382 "",
6383 "հունվար",
6384 "փետրվար",
6385 "մարտ",
6386 "ապրիլ",
6387 "մայիս",
6388 "հունիս",
6389 "հուլիս",
6390 "օգոստոս",
6391 "սեպտեմբեր",
6392 "հոկտեմբեր",
6393 "նոյեմբեր",
6394 "դեկտեմբեր",
6395 ]
6397 day_names = [
6398 "",
6399 "երկուշաբթի",
6400 "երեքշաբթի",
6401 "չորեքշաբթի",
6402 "հինգշաբթի",
6403 "ուրբաթ",
6404 "շաբաթ",
6405 "կիրակի",
6406 ]
6408 day_abbreviations = [
6409 "",
6410 "երկ.",
6411 "երեք.",
6412 "չորեք.",
6413 "հինգ.",
6414 "ուրբ.",
6415 "շաբ.",
6416 "կիր.",
6417 ]
6420class UzbekLocale(Locale):
6421 names = ["uz", "uz-uz"]
6422 past = "{0}dan avval"
6423 future = "{0}dan keyin"
6424 timeframes = {
6425 "now": "hozir",
6426 "second": "bir soniya",
6427 "seconds": "{0} soniya",
6428 "minute": "bir daqiqa",
6429 "minutes": "{0} daqiqa",
6430 "hour": "bir soat",
6431 "hours": "{0} soat",
6432 "day": "bir kun",
6433 "days": "{0} kun",
6434 "week": "bir hafta",
6435 "weeks": "{0} hafta",
6436 "month": "bir oy",
6437 "months": "{0} oy",
6438 "year": "bir yil",
6439 "years": "{0} yil",
6440 }
6442 month_names = [
6443 "",
6444 "Yanvar",
6445 "Fevral",
6446 "Mart",
6447 "Aprel",
6448 "May",
6449 "Iyun",
6450 "Iyul",
6451 "Avgust",
6452 "Sentyabr",
6453 "Oktyabr",
6454 "Noyabr",
6455 "Dekabr",
6456 ]
6458 month_abbreviations = [
6459 "",
6460 "Yan",
6461 "Fev",
6462 "Mar",
6463 "Apr",
6464 "May",
6465 "Iyn",
6466 "Iyl",
6467 "Avg",
6468 "Sen",
6469 "Okt",
6470 "Noy",
6471 "Dek",
6472 ]
6474 day_names = [
6475 "",
6476 "Dushanba",
6477 "Seshanba",
6478 "Chorshanba",
6479 "Payshanba",
6480 "Juma",
6481 "Shanba",
6482 "Yakshanba",
6483 ]
6485 day_abbreviations = ["", "Dush", "Sesh", "Chor", "Pay", "Jum", "Shan", "Yak"]