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.1, created at 2023-09-25 06:13 +0000
« prev ^ index » next coverage.py v7.3.1, created at 2023-09-25 06:13 +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 "month": {"past": "kuukausi", "future": "kuukauden"},
877 "months": {"past": "{0} kuukautta", "future": "{0} kuukauden"},
878 "year": {"past": "vuosi", "future": "vuoden"},
879 "years": {"past": "{0} vuotta", "future": "{0} vuoden"},
880 }
882 # Months and days are lowercase in Finnish
883 month_names = [
884 "",
885 "tammikuu",
886 "helmikuu",
887 "maaliskuu",
888 "huhtikuu",
889 "toukokuu",
890 "kesäkuu",
891 "heinäkuu",
892 "elokuu",
893 "syyskuu",
894 "lokakuu",
895 "marraskuu",
896 "joulukuu",
897 ]
899 month_abbreviations = [
900 "",
901 "tammi",
902 "helmi",
903 "maalis",
904 "huhti",
905 "touko",
906 "kesä",
907 "heinä",
908 "elo",
909 "syys",
910 "loka",
911 "marras",
912 "joulu",
913 ]
915 day_names = [
916 "",
917 "maanantai",
918 "tiistai",
919 "keskiviikko",
920 "torstai",
921 "perjantai",
922 "lauantai",
923 "sunnuntai",
924 ]
926 day_abbreviations = ["", "ma", "ti", "ke", "to", "pe", "la", "su"]
928 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
929 form = self.timeframes[timeframe]
931 if isinstance(form, Mapping):
932 if delta < 0:
933 form = form["past"]
934 else:
935 form = form["future"]
937 return form.format(abs(delta))
939 def _ordinal_number(self, n: int) -> str:
940 return f"{n}."
943class ChineseCNLocale(Locale):
944 names = ["zh", "zh-cn"]
946 past = "{0}前"
947 future = "{0}后"
949 timeframes = {
950 "now": "刚才",
951 "second": "1秒",
952 "seconds": "{0}秒",
953 "minute": "1分钟",
954 "minutes": "{0}分钟",
955 "hour": "1小时",
956 "hours": "{0}小时",
957 "day": "1天",
958 "days": "{0}天",
959 "week": "1周",
960 "weeks": "{0}周",
961 "month": "1个月",
962 "months": "{0}个月",
963 "year": "1年",
964 "years": "{0}年",
965 }
967 month_names = [
968 "",
969 "一月",
970 "二月",
971 "三月",
972 "四月",
973 "五月",
974 "六月",
975 "七月",
976 "八月",
977 "九月",
978 "十月",
979 "十一月",
980 "十二月",
981 ]
982 month_abbreviations = [
983 "",
984 " 1",
985 " 2",
986 " 3",
987 " 4",
988 " 5",
989 " 6",
990 " 7",
991 " 8",
992 " 9",
993 "10",
994 "11",
995 "12",
996 ]
998 day_names = ["", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"]
999 day_abbreviations = ["", "一", "二", "三", "四", "五", "六", "日"]
1002class ChineseTWLocale(Locale):
1003 names = ["zh-tw"]
1005 past = "{0}前"
1006 future = "{0}後"
1007 and_word = "和"
1009 timeframes = {
1010 "now": "剛才",
1011 "second": "1秒",
1012 "seconds": "{0}秒",
1013 "minute": "1分鐘",
1014 "minutes": "{0}分鐘",
1015 "hour": "1小時",
1016 "hours": "{0}小時",
1017 "day": "1天",
1018 "days": "{0}天",
1019 "week": "1週",
1020 "weeks": "{0}週",
1021 "month": "1個月",
1022 "months": "{0}個月",
1023 "year": "1年",
1024 "years": "{0}年",
1025 }
1027 month_names = [
1028 "",
1029 "1月",
1030 "2月",
1031 "3月",
1032 "4月",
1033 "5月",
1034 "6月",
1035 "7月",
1036 "8月",
1037 "9月",
1038 "10月",
1039 "11月",
1040 "12月",
1041 ]
1042 month_abbreviations = [
1043 "",
1044 " 1",
1045 " 2",
1046 " 3",
1047 " 4",
1048 " 5",
1049 " 6",
1050 " 7",
1051 " 8",
1052 " 9",
1053 "10",
1054 "11",
1055 "12",
1056 ]
1058 day_names = ["", "週一", "週二", "週三", "週四", "週五", "週六", "週日"]
1059 day_abbreviations = ["", "一", "二", "三", "四", "五", "六", "日"]
1062class HongKongLocale(Locale):
1063 names = ["zh-hk"]
1065 past = "{0}前"
1066 future = "{0}後"
1068 timeframes = {
1069 "now": "剛才",
1070 "second": "1秒",
1071 "seconds": "{0}秒",
1072 "minute": "1分鐘",
1073 "minutes": "{0}分鐘",
1074 "hour": "1小時",
1075 "hours": "{0}小時",
1076 "day": "1天",
1077 "days": "{0}天",
1078 "week": "1星期",
1079 "weeks": "{0}星期",
1080 "month": "1個月",
1081 "months": "{0}個月",
1082 "year": "1年",
1083 "years": "{0}年",
1084 }
1086 month_names = [
1087 "",
1088 "1月",
1089 "2月",
1090 "3月",
1091 "4月",
1092 "5月",
1093 "6月",
1094 "7月",
1095 "8月",
1096 "9月",
1097 "10月",
1098 "11月",
1099 "12月",
1100 ]
1101 month_abbreviations = [
1102 "",
1103 " 1",
1104 " 2",
1105 " 3",
1106 " 4",
1107 " 5",
1108 " 6",
1109 " 7",
1110 " 8",
1111 " 9",
1112 "10",
1113 "11",
1114 "12",
1115 ]
1117 day_names = ["", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"]
1118 day_abbreviations = ["", "一", "二", "三", "四", "五", "六", "日"]
1121class KoreanLocale(Locale):
1122 names = ["ko", "ko-kr"]
1124 past = "{0} 전"
1125 future = "{0} 후"
1127 timeframes = {
1128 "now": "지금",
1129 "second": "1초",
1130 "seconds": "{0}초",
1131 "minute": "1분",
1132 "minutes": "{0}분",
1133 "hour": "한시간",
1134 "hours": "{0}시간",
1135 "day": "하루",
1136 "days": "{0}일",
1137 "week": "1주",
1138 "weeks": "{0}주",
1139 "month": "한달",
1140 "months": "{0}개월",
1141 "year": "1년",
1142 "years": "{0}년",
1143 }
1145 special_dayframes = {
1146 -3: "그끄제",
1147 -2: "그제",
1148 -1: "어제",
1149 1: "내일",
1150 2: "모레",
1151 3: "글피",
1152 4: "그글피",
1153 }
1155 special_yearframes = {-2: "제작년", -1: "작년", 1: "내년", 2: "내후년"}
1157 month_names = [
1158 "",
1159 "1월",
1160 "2월",
1161 "3월",
1162 "4월",
1163 "5월",
1164 "6월",
1165 "7월",
1166 "8월",
1167 "9월",
1168 "10월",
1169 "11월",
1170 "12월",
1171 ]
1172 month_abbreviations = [
1173 "",
1174 " 1",
1175 " 2",
1176 " 3",
1177 " 4",
1178 " 5",
1179 " 6",
1180 " 7",
1181 " 8",
1182 " 9",
1183 "10",
1184 "11",
1185 "12",
1186 ]
1188 day_names = ["", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일", "일요일"]
1189 day_abbreviations = ["", "월", "화", "수", "목", "금", "토", "일"]
1191 def _ordinal_number(self, n: int) -> str:
1192 ordinals = ["0", "첫", "두", "세", "네", "다섯", "여섯", "일곱", "여덟", "아홉", "열"]
1193 if n < len(ordinals):
1194 return f"{ordinals[n]}번째"
1195 return f"{n}번째"
1197 def _format_relative(
1198 self,
1199 humanized: str,
1200 timeframe: TimeFrameLiteral,
1201 delta: Union[float, int],
1202 ) -> str:
1203 if timeframe in ("day", "days"):
1204 special = self.special_dayframes.get(int(delta))
1205 if special:
1206 return special
1207 elif timeframe in ("year", "years"):
1208 special = self.special_yearframes.get(int(delta))
1209 if special:
1210 return special
1212 return super()._format_relative(humanized, timeframe, delta)
1215# derived locale types & implementations.
1216class DutchLocale(Locale):
1217 names = ["nl", "nl-nl"]
1219 past = "{0} geleden"
1220 future = "over {0}"
1222 timeframes = {
1223 "now": "nu",
1224 "second": "een seconde",
1225 "seconds": "{0} seconden",
1226 "minute": "een minuut",
1227 "minutes": "{0} minuten",
1228 "hour": "een uur",
1229 "hours": "{0} uur",
1230 "day": "een dag",
1231 "days": "{0} dagen",
1232 "week": "een week",
1233 "weeks": "{0} weken",
1234 "month": "een maand",
1235 "months": "{0} maanden",
1236 "year": "een jaar",
1237 "years": "{0} jaar",
1238 }
1240 # In Dutch names of months and days are not starting with a capital letter
1241 # like in the English language.
1242 month_names = [
1243 "",
1244 "januari",
1245 "februari",
1246 "maart",
1247 "april",
1248 "mei",
1249 "juni",
1250 "juli",
1251 "augustus",
1252 "september",
1253 "oktober",
1254 "november",
1255 "december",
1256 ]
1257 month_abbreviations = [
1258 "",
1259 "jan",
1260 "feb",
1261 "mrt",
1262 "apr",
1263 "mei",
1264 "jun",
1265 "jul",
1266 "aug",
1267 "sep",
1268 "okt",
1269 "nov",
1270 "dec",
1271 ]
1273 day_names = [
1274 "",
1275 "maandag",
1276 "dinsdag",
1277 "woensdag",
1278 "donderdag",
1279 "vrijdag",
1280 "zaterdag",
1281 "zondag",
1282 ]
1283 day_abbreviations = ["", "ma", "di", "wo", "do", "vr", "za", "zo"]
1286class SlavicBaseLocale(Locale):
1287 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]]
1289 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
1290 form = self.timeframes[timeframe]
1291 delta = abs(delta)
1293 if isinstance(form, Mapping):
1294 if delta % 10 == 1 and delta % 100 != 11:
1295 form = form["singular"]
1296 elif 2 <= delta % 10 <= 4 and (delta % 100 < 10 or delta % 100 >= 20):
1297 form = form["dual"]
1298 else:
1299 form = form["plural"]
1301 return form.format(delta)
1304class BelarusianLocale(SlavicBaseLocale):
1305 names = ["be", "be-by"]
1307 past = "{0} таму"
1308 future = "праз {0}"
1310 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
1311 "now": "зараз",
1312 "second": "секунду",
1313 "seconds": "{0} некалькі секунд",
1314 "minute": "хвіліну",
1315 "minutes": {
1316 "singular": "{0} хвіліну",
1317 "dual": "{0} хвіліны",
1318 "plural": "{0} хвілін",
1319 },
1320 "hour": "гадзіну",
1321 "hours": {
1322 "singular": "{0} гадзіну",
1323 "dual": "{0} гадзіны",
1324 "plural": "{0} гадзін",
1325 },
1326 "day": "дзень",
1327 "days": {"singular": "{0} дзень", "dual": "{0} дні", "plural": "{0} дзён"},
1328 "month": "месяц",
1329 "months": {
1330 "singular": "{0} месяц",
1331 "dual": "{0} месяцы",
1332 "plural": "{0} месяцаў",
1333 },
1334 "year": "год",
1335 "years": {"singular": "{0} год", "dual": "{0} гады", "plural": "{0} гадоў"},
1336 }
1338 month_names = [
1339 "",
1340 "студзеня",
1341 "лютага",
1342 "сакавіка",
1343 "красавіка",
1344 "траўня",
1345 "чэрвеня",
1346 "ліпеня",
1347 "жніўня",
1348 "верасня",
1349 "кастрычніка",
1350 "лістапада",
1351 "снежня",
1352 ]
1353 month_abbreviations = [
1354 "",
1355 "студ",
1356 "лют",
1357 "сак",
1358 "крас",
1359 "трав",
1360 "чэрв",
1361 "ліп",
1362 "жнів",
1363 "вер",
1364 "каст",
1365 "ліст",
1366 "снеж",
1367 ]
1369 day_names = [
1370 "",
1371 "панядзелак",
1372 "аўторак",
1373 "серада",
1374 "чацвер",
1375 "пятніца",
1376 "субота",
1377 "нядзеля",
1378 ]
1379 day_abbreviations = ["", "пн", "ат", "ср", "чц", "пт", "сб", "нд"]
1382class PolishLocale(SlavicBaseLocale):
1383 names = ["pl", "pl-pl"]
1385 past = "{0} temu"
1386 future = "za {0}"
1388 # The nouns should be in genitive case (Polish: "dopełniacz")
1389 # in order to correctly form `past` & `future` expressions.
1390 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
1391 "now": "teraz",
1392 "second": "sekundę",
1393 "seconds": {
1394 "singular": "{0} sekund",
1395 "dual": "{0} sekundy",
1396 "plural": "{0} sekund",
1397 },
1398 "minute": "minutę",
1399 "minutes": {
1400 "singular": "{0} minut",
1401 "dual": "{0} minuty",
1402 "plural": "{0} minut",
1403 },
1404 "hour": "godzinę",
1405 "hours": {
1406 "singular": "{0} godzin",
1407 "dual": "{0} godziny",
1408 "plural": "{0} godzin",
1409 },
1410 "day": "dzień",
1411 "days": "{0} dni",
1412 "week": "tydzień",
1413 "weeks": {
1414 "singular": "{0} tygodni",
1415 "dual": "{0} tygodnie",
1416 "plural": "{0} tygodni",
1417 },
1418 "month": "miesiąc",
1419 "months": {
1420 "singular": "{0} miesięcy",
1421 "dual": "{0} miesiące",
1422 "plural": "{0} miesięcy",
1423 },
1424 "year": "rok",
1425 "years": {"singular": "{0} lat", "dual": "{0} lata", "plural": "{0} lat"},
1426 }
1428 month_names = [
1429 "",
1430 "styczeń",
1431 "luty",
1432 "marzec",
1433 "kwiecień",
1434 "maj",
1435 "czerwiec",
1436 "lipiec",
1437 "sierpień",
1438 "wrzesień",
1439 "październik",
1440 "listopad",
1441 "grudzień",
1442 ]
1443 month_abbreviations = [
1444 "",
1445 "sty",
1446 "lut",
1447 "mar",
1448 "kwi",
1449 "maj",
1450 "cze",
1451 "lip",
1452 "sie",
1453 "wrz",
1454 "paź",
1455 "lis",
1456 "gru",
1457 ]
1459 day_names = [
1460 "",
1461 "poniedziałek",
1462 "wtorek",
1463 "środa",
1464 "czwartek",
1465 "piątek",
1466 "sobota",
1467 "niedziela",
1468 ]
1469 day_abbreviations = ["", "Pn", "Wt", "Śr", "Czw", "Pt", "So", "Nd"]
1472class RussianLocale(SlavicBaseLocale):
1473 names = ["ru", "ru-ru"]
1475 past = "{0} назад"
1476 future = "через {0}"
1478 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
1479 "now": "сейчас",
1480 "second": "секунда",
1481 "seconds": {
1482 "singular": "{0} секунду",
1483 "dual": "{0} секунды",
1484 "plural": "{0} секунд",
1485 },
1486 "minute": "минуту",
1487 "minutes": {
1488 "singular": "{0} минуту",
1489 "dual": "{0} минуты",
1490 "plural": "{0} минут",
1491 },
1492 "hour": "час",
1493 "hours": {"singular": "{0} час", "dual": "{0} часа", "plural": "{0} часов"},
1494 "day": "день",
1495 "days": {"singular": "{0} день", "dual": "{0} дня", "plural": "{0} дней"},
1496 "week": "неделю",
1497 "weeks": {
1498 "singular": "{0} неделю",
1499 "dual": "{0} недели",
1500 "plural": "{0} недель",
1501 },
1502 "month": "месяц",
1503 "months": {
1504 "singular": "{0} месяц",
1505 "dual": "{0} месяца",
1506 "plural": "{0} месяцев",
1507 },
1508 "quarter": "квартал",
1509 "quarters": {
1510 "singular": "{0} квартал",
1511 "dual": "{0} квартала",
1512 "plural": "{0} кварталов",
1513 },
1514 "year": "год",
1515 "years": {"singular": "{0} год", "dual": "{0} года", "plural": "{0} лет"},
1516 }
1518 month_names = [
1519 "",
1520 "января",
1521 "февраля",
1522 "марта",
1523 "апреля",
1524 "мая",
1525 "июня",
1526 "июля",
1527 "августа",
1528 "сентября",
1529 "октября",
1530 "ноября",
1531 "декабря",
1532 ]
1533 month_abbreviations = [
1534 "",
1535 "янв",
1536 "фев",
1537 "мар",
1538 "апр",
1539 "май",
1540 "июн",
1541 "июл",
1542 "авг",
1543 "сен",
1544 "окт",
1545 "ноя",
1546 "дек",
1547 ]
1549 day_names = [
1550 "",
1551 "понедельник",
1552 "вторник",
1553 "среда",
1554 "четверг",
1555 "пятница",
1556 "суббота",
1557 "воскресенье",
1558 ]
1559 day_abbreviations = ["", "пн", "вт", "ср", "чт", "пт", "сб", "вс"]
1562class AfrikaansLocale(Locale):
1563 names = ["af", "af-nl"]
1565 past = "{0} gelede"
1566 future = "in {0}"
1568 timeframes = {
1569 "now": "nou",
1570 "second": "n sekonde",
1571 "seconds": "{0} sekondes",
1572 "minute": "minuut",
1573 "minutes": "{0} minute",
1574 "hour": "uur",
1575 "hours": "{0} ure",
1576 "day": "een dag",
1577 "days": "{0} dae",
1578 "month": "een maand",
1579 "months": "{0} maande",
1580 "year": "een jaar",
1581 "years": "{0} jaar",
1582 }
1584 month_names = [
1585 "",
1586 "Januarie",
1587 "Februarie",
1588 "Maart",
1589 "April",
1590 "Mei",
1591 "Junie",
1592 "Julie",
1593 "Augustus",
1594 "September",
1595 "Oktober",
1596 "November",
1597 "Desember",
1598 ]
1599 month_abbreviations = [
1600 "",
1601 "Jan",
1602 "Feb",
1603 "Mrt",
1604 "Apr",
1605 "Mei",
1606 "Jun",
1607 "Jul",
1608 "Aug",
1609 "Sep",
1610 "Okt",
1611 "Nov",
1612 "Des",
1613 ]
1615 day_names = [
1616 "",
1617 "Maandag",
1618 "Dinsdag",
1619 "Woensdag",
1620 "Donderdag",
1621 "Vrydag",
1622 "Saterdag",
1623 "Sondag",
1624 ]
1625 day_abbreviations = ["", "Ma", "Di", "Wo", "Do", "Vr", "Za", "So"]
1628class BulgarianLocale(SlavicBaseLocale):
1629 names = ["bg", "bg-bg"]
1631 past = "{0} назад"
1632 future = "напред {0}"
1634 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
1635 "now": "сега",
1636 "second": "секунда",
1637 "seconds": "{0} няколко секунди",
1638 "minute": "минута",
1639 "minutes": {
1640 "singular": "{0} минута",
1641 "dual": "{0} минути",
1642 "plural": "{0} минути",
1643 },
1644 "hour": "час",
1645 "hours": {"singular": "{0} час", "dual": "{0} часа", "plural": "{0} часа"},
1646 "day": "ден",
1647 "days": {"singular": "{0} ден", "dual": "{0} дни", "plural": "{0} дни"},
1648 "month": "месец",
1649 "months": {
1650 "singular": "{0} месец",
1651 "dual": "{0} месеца",
1652 "plural": "{0} месеца",
1653 },
1654 "year": "година",
1655 "years": {
1656 "singular": "{0} година",
1657 "dual": "{0} години",
1658 "plural": "{0} години",
1659 },
1660 }
1662 month_names = [
1663 "",
1664 "януари",
1665 "февруари",
1666 "март",
1667 "април",
1668 "май",
1669 "юни",
1670 "юли",
1671 "август",
1672 "септември",
1673 "октомври",
1674 "ноември",
1675 "декември",
1676 ]
1677 month_abbreviations = [
1678 "",
1679 "ян",
1680 "февр",
1681 "март",
1682 "апр",
1683 "май",
1684 "юни",
1685 "юли",
1686 "авг",
1687 "септ",
1688 "окт",
1689 "ноем",
1690 "дек",
1691 ]
1693 day_names = [
1694 "",
1695 "понеделник",
1696 "вторник",
1697 "сряда",
1698 "четвъртък",
1699 "петък",
1700 "събота",
1701 "неделя",
1702 ]
1703 day_abbreviations = ["", "пон", "вт", "ср", "четв", "пет", "съб", "нед"]
1706class UkrainianLocale(SlavicBaseLocale):
1707 names = ["ua", "uk", "uk-ua"]
1709 past = "{0} тому"
1710 future = "за {0}"
1712 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
1713 "now": "зараз",
1714 "second": "секунда",
1715 "seconds": "{0} кілька секунд",
1716 "minute": "хвилину",
1717 "minutes": {
1718 "singular": "{0} хвилину",
1719 "dual": "{0} хвилини",
1720 "plural": "{0} хвилин",
1721 },
1722 "hour": "годину",
1723 "hours": {
1724 "singular": "{0} годину",
1725 "dual": "{0} години",
1726 "plural": "{0} годин",
1727 },
1728 "day": "день",
1729 "days": {"singular": "{0} день", "dual": "{0} дні", "plural": "{0} днів"},
1730 "month": "місяць",
1731 "months": {
1732 "singular": "{0} місяць",
1733 "dual": "{0} місяці",
1734 "plural": "{0} місяців",
1735 },
1736 "year": "рік",
1737 "years": {"singular": "{0} рік", "dual": "{0} роки", "plural": "{0} років"},
1738 }
1740 month_names = [
1741 "",
1742 "січня",
1743 "лютого",
1744 "березня",
1745 "квітня",
1746 "травня",
1747 "червня",
1748 "липня",
1749 "серпня",
1750 "вересня",
1751 "жовтня",
1752 "листопада",
1753 "грудня",
1754 ]
1755 month_abbreviations = [
1756 "",
1757 "січ",
1758 "лют",
1759 "бер",
1760 "квіт",
1761 "трав",
1762 "черв",
1763 "лип",
1764 "серп",
1765 "вер",
1766 "жовт",
1767 "лист",
1768 "груд",
1769 ]
1771 day_names = [
1772 "",
1773 "понеділок",
1774 "вівторок",
1775 "середа",
1776 "четвер",
1777 "п’ятниця",
1778 "субота",
1779 "неділя",
1780 ]
1781 day_abbreviations = ["", "пн", "вт", "ср", "чт", "пт", "сб", "нд"]
1784class MacedonianLocale(SlavicBaseLocale):
1785 names = ["mk", "mk-mk"]
1787 past = "пред {0}"
1788 future = "за {0}"
1790 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
1791 "now": "сега",
1792 "second": "една секунда",
1793 "seconds": {
1794 "singular": "{0} секунда",
1795 "dual": "{0} секунди",
1796 "plural": "{0} секунди",
1797 },
1798 "minute": "една минута",
1799 "minutes": {
1800 "singular": "{0} минута",
1801 "dual": "{0} минути",
1802 "plural": "{0} минути",
1803 },
1804 "hour": "еден саат",
1805 "hours": {"singular": "{0} саат", "dual": "{0} саати", "plural": "{0} саати"},
1806 "day": "еден ден",
1807 "days": {"singular": "{0} ден", "dual": "{0} дена", "plural": "{0} дена"},
1808 "week": "една недела",
1809 "weeks": {
1810 "singular": "{0} недела",
1811 "dual": "{0} недели",
1812 "plural": "{0} недели",
1813 },
1814 "month": "еден месец",
1815 "months": {
1816 "singular": "{0} месец",
1817 "dual": "{0} месеци",
1818 "plural": "{0} месеци",
1819 },
1820 "year": "една година",
1821 "years": {
1822 "singular": "{0} година",
1823 "dual": "{0} години",
1824 "plural": "{0} години",
1825 },
1826 }
1828 meridians = {"am": "дп", "pm": "пп", "AM": "претпладне", "PM": "попладне"}
1830 month_names = [
1831 "",
1832 "Јануари",
1833 "Февруари",
1834 "Март",
1835 "Април",
1836 "Мај",
1837 "Јуни",
1838 "Јули",
1839 "Август",
1840 "Септември",
1841 "Октомври",
1842 "Ноември",
1843 "Декември",
1844 ]
1845 month_abbreviations = [
1846 "",
1847 "Јан",
1848 "Фев",
1849 "Мар",
1850 "Апр",
1851 "Мај",
1852 "Јун",
1853 "Јул",
1854 "Авг",
1855 "Септ",
1856 "Окт",
1857 "Ноем",
1858 "Декем",
1859 ]
1861 day_names = [
1862 "",
1863 "Понеделник",
1864 "Вторник",
1865 "Среда",
1866 "Четврток",
1867 "Петок",
1868 "Сабота",
1869 "Недела",
1870 ]
1871 day_abbreviations = [
1872 "",
1873 "Пон",
1874 "Вт",
1875 "Сре",
1876 "Чет",
1877 "Пет",
1878 "Саб",
1879 "Нед",
1880 ]
1883class GermanBaseLocale(Locale):
1884 past = "vor {0}"
1885 future = "in {0}"
1886 and_word = "und"
1888 timeframes: ClassVar[Dict[TimeFrameLiteral, str]] = {
1889 "now": "gerade eben",
1890 "second": "einer Sekunde",
1891 "seconds": "{0} Sekunden",
1892 "minute": "einer Minute",
1893 "minutes": "{0} Minuten",
1894 "hour": "einer Stunde",
1895 "hours": "{0} Stunden",
1896 "day": "einem Tag",
1897 "days": "{0} Tagen",
1898 "week": "einer Woche",
1899 "weeks": "{0} Wochen",
1900 "month": "einem Monat",
1901 "months": "{0} Monaten",
1902 "year": "einem Jahr",
1903 "years": "{0} Jahren",
1904 }
1906 timeframes_only_distance = timeframes.copy()
1907 timeframes_only_distance["second"] = "eine Sekunde"
1908 timeframes_only_distance["minute"] = "eine Minute"
1909 timeframes_only_distance["hour"] = "eine Stunde"
1910 timeframes_only_distance["day"] = "ein Tag"
1911 timeframes_only_distance["days"] = "{0} Tage"
1912 timeframes_only_distance["week"] = "eine Woche"
1913 timeframes_only_distance["month"] = "ein Monat"
1914 timeframes_only_distance["months"] = "{0} Monate"
1915 timeframes_only_distance["year"] = "ein Jahr"
1916 timeframes_only_distance["years"] = "{0} Jahre"
1918 month_names = [
1919 "",
1920 "Januar",
1921 "Februar",
1922 "März",
1923 "April",
1924 "Mai",
1925 "Juni",
1926 "Juli",
1927 "August",
1928 "September",
1929 "Oktober",
1930 "November",
1931 "Dezember",
1932 ]
1934 month_abbreviations = [
1935 "",
1936 "Jan",
1937 "Feb",
1938 "Mär",
1939 "Apr",
1940 "Mai",
1941 "Jun",
1942 "Jul",
1943 "Aug",
1944 "Sep",
1945 "Okt",
1946 "Nov",
1947 "Dez",
1948 ]
1950 day_names = [
1951 "",
1952 "Montag",
1953 "Dienstag",
1954 "Mittwoch",
1955 "Donnerstag",
1956 "Freitag",
1957 "Samstag",
1958 "Sonntag",
1959 ]
1961 day_abbreviations = ["", "Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"]
1963 def _ordinal_number(self, n: int) -> str:
1964 return f"{n}."
1966 def describe(
1967 self,
1968 timeframe: TimeFrameLiteral,
1969 delta: Union[int, float] = 0,
1970 only_distance: bool = False,
1971 ) -> str:
1972 """Describes a delta within a timeframe in plain language.
1974 :param timeframe: a string representing a timeframe.
1975 :param delta: a quantity representing a delta in a timeframe.
1976 :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords
1977 """
1979 if not only_distance:
1980 return super().describe(timeframe, delta, only_distance)
1982 # German uses a different case without 'in' or 'ago'
1983 humanized: str = self.timeframes_only_distance[timeframe].format(
1984 trunc(abs(delta))
1985 )
1987 return humanized
1990class GermanLocale(GermanBaseLocale, Locale):
1991 names = ["de", "de-de"]
1994class SwissLocale(GermanBaseLocale, Locale):
1995 names = ["de-ch"]
1998class AustrianLocale(GermanBaseLocale, Locale):
1999 names = ["de-at"]
2001 month_names = [
2002 "",
2003 "Jänner",
2004 "Februar",
2005 "März",
2006 "April",
2007 "Mai",
2008 "Juni",
2009 "Juli",
2010 "August",
2011 "September",
2012 "Oktober",
2013 "November",
2014 "Dezember",
2015 ]
2018class NorwegianLocale(Locale):
2019 names = ["nb", "nb-no"]
2021 past = "for {0} siden"
2022 future = "om {0}"
2024 timeframes = {
2025 "now": "nå nettopp",
2026 "second": "ett sekund",
2027 "seconds": "{0} sekunder",
2028 "minute": "ett minutt",
2029 "minutes": "{0} minutter",
2030 "hour": "en time",
2031 "hours": "{0} timer",
2032 "day": "en dag",
2033 "days": "{0} dager",
2034 "week": "en uke",
2035 "weeks": "{0} uker",
2036 "month": "en måned",
2037 "months": "{0} måneder",
2038 "year": "ett år",
2039 "years": "{0} år",
2040 }
2042 month_names = [
2043 "",
2044 "januar",
2045 "februar",
2046 "mars",
2047 "april",
2048 "mai",
2049 "juni",
2050 "juli",
2051 "august",
2052 "september",
2053 "oktober",
2054 "november",
2055 "desember",
2056 ]
2057 month_abbreviations = [
2058 "",
2059 "jan",
2060 "feb",
2061 "mar",
2062 "apr",
2063 "mai",
2064 "jun",
2065 "jul",
2066 "aug",
2067 "sep",
2068 "okt",
2069 "nov",
2070 "des",
2071 ]
2073 day_names = [
2074 "",
2075 "mandag",
2076 "tirsdag",
2077 "onsdag",
2078 "torsdag",
2079 "fredag",
2080 "lørdag",
2081 "søndag",
2082 ]
2083 day_abbreviations = ["", "ma", "ti", "on", "to", "fr", "lø", "sø"]
2085 def _ordinal_number(self, n: int) -> str:
2086 return f"{n}."
2089class NewNorwegianLocale(Locale):
2090 names = ["nn", "nn-no"]
2092 past = "for {0} sidan"
2093 future = "om {0}"
2095 timeframes = {
2096 "now": "no nettopp",
2097 "second": "eitt sekund",
2098 "seconds": "{0} sekund",
2099 "minute": "eitt minutt",
2100 "minutes": "{0} minutt",
2101 "hour": "ein time",
2102 "hours": "{0} timar",
2103 "day": "ein dag",
2104 "days": "{0} dagar",
2105 "week": "ei veke",
2106 "weeks": "{0} veker",
2107 "month": "ein månad",
2108 "months": "{0} månader",
2109 "year": "eitt år",
2110 "years": "{0} år",
2111 }
2113 month_names = [
2114 "",
2115 "januar",
2116 "februar",
2117 "mars",
2118 "april",
2119 "mai",
2120 "juni",
2121 "juli",
2122 "august",
2123 "september",
2124 "oktober",
2125 "november",
2126 "desember",
2127 ]
2128 month_abbreviations = [
2129 "",
2130 "jan",
2131 "feb",
2132 "mar",
2133 "apr",
2134 "mai",
2135 "jun",
2136 "jul",
2137 "aug",
2138 "sep",
2139 "okt",
2140 "nov",
2141 "des",
2142 ]
2144 day_names = [
2145 "",
2146 "måndag",
2147 "tysdag",
2148 "onsdag",
2149 "torsdag",
2150 "fredag",
2151 "laurdag",
2152 "sundag",
2153 ]
2154 day_abbreviations = ["", "må", "ty", "on", "to", "fr", "la", "su"]
2156 def _ordinal_number(self, n: int) -> str:
2157 return f"{n}."
2160class PortugueseLocale(Locale):
2161 names = ["pt", "pt-pt"]
2163 past = "há {0}"
2164 future = "em {0}"
2165 and_word = "e"
2167 timeframes = {
2168 "now": "agora",
2169 "second": "um segundo",
2170 "seconds": "{0} segundos",
2171 "minute": "um minuto",
2172 "minutes": "{0} minutos",
2173 "hour": "uma hora",
2174 "hours": "{0} horas",
2175 "day": "um dia",
2176 "days": "{0} dias",
2177 "week": "uma semana",
2178 "weeks": "{0} semanas",
2179 "month": "um mês",
2180 "months": "{0} meses",
2181 "year": "um ano",
2182 "years": "{0} anos",
2183 }
2185 month_names = [
2186 "",
2187 "Janeiro",
2188 "Fevereiro",
2189 "Março",
2190 "Abril",
2191 "Maio",
2192 "Junho",
2193 "Julho",
2194 "Agosto",
2195 "Setembro",
2196 "Outubro",
2197 "Novembro",
2198 "Dezembro",
2199 ]
2200 month_abbreviations = [
2201 "",
2202 "Jan",
2203 "Fev",
2204 "Mar",
2205 "Abr",
2206 "Mai",
2207 "Jun",
2208 "Jul",
2209 "Ago",
2210 "Set",
2211 "Out",
2212 "Nov",
2213 "Dez",
2214 ]
2216 day_names = [
2217 "",
2218 "Segunda-feira",
2219 "Terça-feira",
2220 "Quarta-feira",
2221 "Quinta-feira",
2222 "Sexta-feira",
2223 "Sábado",
2224 "Domingo",
2225 ]
2226 day_abbreviations = ["", "Seg", "Ter", "Qua", "Qui", "Sex", "Sab", "Dom"]
2229class BrazilianPortugueseLocale(PortugueseLocale):
2230 names = ["pt-br"]
2232 past = "faz {0}"
2235class TagalogLocale(Locale):
2236 names = ["tl", "tl-ph"]
2238 past = "nakaraang {0}"
2239 future = "{0} mula ngayon"
2241 timeframes = {
2242 "now": "ngayon lang",
2243 "second": "isang segundo",
2244 "seconds": "{0} segundo",
2245 "minute": "isang minuto",
2246 "minutes": "{0} minuto",
2247 "hour": "isang oras",
2248 "hours": "{0} oras",
2249 "day": "isang araw",
2250 "days": "{0} araw",
2251 "week": "isang linggo",
2252 "weeks": "{0} linggo",
2253 "month": "isang buwan",
2254 "months": "{0} buwan",
2255 "year": "isang taon",
2256 "years": "{0} taon",
2257 }
2259 month_names = [
2260 "",
2261 "Enero",
2262 "Pebrero",
2263 "Marso",
2264 "Abril",
2265 "Mayo",
2266 "Hunyo",
2267 "Hulyo",
2268 "Agosto",
2269 "Setyembre",
2270 "Oktubre",
2271 "Nobyembre",
2272 "Disyembre",
2273 ]
2274 month_abbreviations = [
2275 "",
2276 "Ene",
2277 "Peb",
2278 "Mar",
2279 "Abr",
2280 "May",
2281 "Hun",
2282 "Hul",
2283 "Ago",
2284 "Set",
2285 "Okt",
2286 "Nob",
2287 "Dis",
2288 ]
2290 day_names = [
2291 "",
2292 "Lunes",
2293 "Martes",
2294 "Miyerkules",
2295 "Huwebes",
2296 "Biyernes",
2297 "Sabado",
2298 "Linggo",
2299 ]
2300 day_abbreviations = ["", "Lun", "Mar", "Miy", "Huw", "Biy", "Sab", "Lin"]
2302 meridians = {"am": "nu", "pm": "nh", "AM": "ng umaga", "PM": "ng hapon"}
2304 def _ordinal_number(self, n: int) -> str:
2305 return f"ika-{n}"
2308class VietnameseLocale(Locale):
2309 names = ["vi", "vi-vn"]
2311 past = "{0} trước"
2312 future = "{0} nữa"
2314 timeframes = {
2315 "now": "hiện tại",
2316 "second": "một giây",
2317 "seconds": "{0} giây",
2318 "minute": "một phút",
2319 "minutes": "{0} phút",
2320 "hour": "một giờ",
2321 "hours": "{0} giờ",
2322 "day": "một ngày",
2323 "days": "{0} ngày",
2324 "week": "một tuần",
2325 "weeks": "{0} tuần",
2326 "month": "một tháng",
2327 "months": "{0} tháng",
2328 "year": "một năm",
2329 "years": "{0} năm",
2330 }
2332 month_names = [
2333 "",
2334 "Tháng Một",
2335 "Tháng Hai",
2336 "Tháng Ba",
2337 "Tháng Tư",
2338 "Tháng Năm",
2339 "Tháng Sáu",
2340 "Tháng Bảy",
2341 "Tháng Tám",
2342 "Tháng Chín",
2343 "Tháng Mười",
2344 "Tháng Mười Một",
2345 "Tháng Mười Hai",
2346 ]
2347 month_abbreviations = [
2348 "",
2349 "Tháng 1",
2350 "Tháng 2",
2351 "Tháng 3",
2352 "Tháng 4",
2353 "Tháng 5",
2354 "Tháng 6",
2355 "Tháng 7",
2356 "Tháng 8",
2357 "Tháng 9",
2358 "Tháng 10",
2359 "Tháng 11",
2360 "Tháng 12",
2361 ]
2363 day_names = [
2364 "",
2365 "Thứ Hai",
2366 "Thứ Ba",
2367 "Thứ Tư",
2368 "Thứ Năm",
2369 "Thứ Sáu",
2370 "Thứ Bảy",
2371 "Chủ Nhật",
2372 ]
2373 day_abbreviations = ["", "Thứ 2", "Thứ 3", "Thứ 4", "Thứ 5", "Thứ 6", "Thứ 7", "CN"]
2376class TurkishLocale(Locale):
2377 names = ["tr", "tr-tr"]
2379 past = "{0} önce"
2380 future = "{0} sonra"
2381 and_word = "ve"
2383 timeframes = {
2384 "now": "şimdi",
2385 "second": "bir saniye",
2386 "seconds": "{0} saniye",
2387 "minute": "bir dakika",
2388 "minutes": "{0} dakika",
2389 "hour": "bir saat",
2390 "hours": "{0} saat",
2391 "day": "bir gün",
2392 "days": "{0} gün",
2393 "week": "bir hafta",
2394 "weeks": "{0} hafta",
2395 "month": "bir ay",
2396 "months": "{0} ay",
2397 "year": "bir yıl",
2398 "years": "{0} yıl",
2399 }
2401 meridians = {"am": "öö", "pm": "ös", "AM": "ÖÖ", "PM": "ÖS"}
2403 month_names = [
2404 "",
2405 "Ocak",
2406 "Şubat",
2407 "Mart",
2408 "Nisan",
2409 "Mayıs",
2410 "Haziran",
2411 "Temmuz",
2412 "Ağustos",
2413 "Eylül",
2414 "Ekim",
2415 "Kasım",
2416 "Aralık",
2417 ]
2418 month_abbreviations = [
2419 "",
2420 "Oca",
2421 "Şub",
2422 "Mar",
2423 "Nis",
2424 "May",
2425 "Haz",
2426 "Tem",
2427 "Ağu",
2428 "Eyl",
2429 "Eki",
2430 "Kas",
2431 "Ara",
2432 ]
2434 day_names = [
2435 "",
2436 "Pazartesi",
2437 "Salı",
2438 "Çarşamba",
2439 "Perşembe",
2440 "Cuma",
2441 "Cumartesi",
2442 "Pazar",
2443 ]
2444 day_abbreviations = ["", "Pzt", "Sal", "Çar", "Per", "Cum", "Cmt", "Paz"]
2447class AzerbaijaniLocale(Locale):
2448 names = ["az", "az-az"]
2450 past = "{0} əvvəl"
2451 future = "{0} sonra"
2453 timeframes = {
2454 "now": "indi",
2455 "second": "bir saniyə",
2456 "seconds": "{0} saniyə",
2457 "minute": "bir dəqiqə",
2458 "minutes": "{0} dəqiqə",
2459 "hour": "bir saat",
2460 "hours": "{0} saat",
2461 "day": "bir gün",
2462 "days": "{0} gün",
2463 "week": "bir həftə",
2464 "weeks": "{0} həftə",
2465 "month": "bir ay",
2466 "months": "{0} ay",
2467 "year": "bir il",
2468 "years": "{0} il",
2469 }
2471 month_names = [
2472 "",
2473 "Yanvar",
2474 "Fevral",
2475 "Mart",
2476 "Aprel",
2477 "May",
2478 "İyun",
2479 "İyul",
2480 "Avqust",
2481 "Sentyabr",
2482 "Oktyabr",
2483 "Noyabr",
2484 "Dekabr",
2485 ]
2486 month_abbreviations = [
2487 "",
2488 "Yan",
2489 "Fev",
2490 "Mar",
2491 "Apr",
2492 "May",
2493 "İyn",
2494 "İyl",
2495 "Avq",
2496 "Sen",
2497 "Okt",
2498 "Noy",
2499 "Dek",
2500 ]
2502 day_names = [
2503 "",
2504 "Bazar ertəsi",
2505 "Çərşənbə axşamı",
2506 "Çərşənbə",
2507 "Cümə axşamı",
2508 "Cümə",
2509 "Şənbə",
2510 "Bazar",
2511 ]
2512 day_abbreviations = ["", "Ber", "Çax", "Çər", "Cax", "Cüm", "Şnb", "Bzr"]
2515class ArabicLocale(Locale):
2516 names = [
2517 "ar",
2518 "ar-ae",
2519 "ar-bh",
2520 "ar-dj",
2521 "ar-eg",
2522 "ar-eh",
2523 "ar-er",
2524 "ar-km",
2525 "ar-kw",
2526 "ar-ly",
2527 "ar-om",
2528 "ar-qa",
2529 "ar-sa",
2530 "ar-sd",
2531 "ar-so",
2532 "ar-ss",
2533 "ar-td",
2534 "ar-ye",
2535 ]
2537 past = "منذ {0}"
2538 future = "خلال {0}"
2540 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
2541 "now": "الآن",
2542 "second": "ثانية",
2543 "seconds": {"2": "ثانيتين", "ten": "{0} ثوان", "higher": "{0} ثانية"},
2544 "minute": "دقيقة",
2545 "minutes": {"2": "دقيقتين", "ten": "{0} دقائق", "higher": "{0} دقيقة"},
2546 "hour": "ساعة",
2547 "hours": {"2": "ساعتين", "ten": "{0} ساعات", "higher": "{0} ساعة"},
2548 "day": "يوم",
2549 "days": {"2": "يومين", "ten": "{0} أيام", "higher": "{0} يوم"},
2550 "month": "شهر",
2551 "months": {"2": "شهرين", "ten": "{0} أشهر", "higher": "{0} شهر"},
2552 "year": "سنة",
2553 "years": {"2": "سنتين", "ten": "{0} سنوات", "higher": "{0} سنة"},
2554 }
2556 month_names = [
2557 "",
2558 "يناير",
2559 "فبراير",
2560 "مارس",
2561 "أبريل",
2562 "مايو",
2563 "يونيو",
2564 "يوليو",
2565 "أغسطس",
2566 "سبتمبر",
2567 "أكتوبر",
2568 "نوفمبر",
2569 "ديسمبر",
2570 ]
2571 month_abbreviations = [
2572 "",
2573 "يناير",
2574 "فبراير",
2575 "مارس",
2576 "أبريل",
2577 "مايو",
2578 "يونيو",
2579 "يوليو",
2580 "أغسطس",
2581 "سبتمبر",
2582 "أكتوبر",
2583 "نوفمبر",
2584 "ديسمبر",
2585 ]
2587 day_names = [
2588 "",
2589 "الإثنين",
2590 "الثلاثاء",
2591 "الأربعاء",
2592 "الخميس",
2593 "الجمعة",
2594 "السبت",
2595 "الأحد",
2596 ]
2597 day_abbreviations = ["", "إثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت", "أحد"]
2599 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
2600 form = self.timeframes[timeframe]
2601 delta = abs(delta)
2602 if isinstance(form, Mapping):
2603 if delta == 2:
2604 form = form["2"]
2605 elif 2 < delta <= 10:
2606 form = form["ten"]
2607 else:
2608 form = form["higher"]
2610 return form.format(delta)
2613class LevantArabicLocale(ArabicLocale):
2614 names = ["ar-iq", "ar-jo", "ar-lb", "ar-ps", "ar-sy"]
2615 month_names = [
2616 "",
2617 "كانون الثاني",
2618 "شباط",
2619 "آذار",
2620 "نيسان",
2621 "أيار",
2622 "حزيران",
2623 "تموز",
2624 "آب",
2625 "أيلول",
2626 "تشرين الأول",
2627 "تشرين الثاني",
2628 "كانون الأول",
2629 ]
2630 month_abbreviations = [
2631 "",
2632 "كانون الثاني",
2633 "شباط",
2634 "آذار",
2635 "نيسان",
2636 "أيار",
2637 "حزيران",
2638 "تموز",
2639 "آب",
2640 "أيلول",
2641 "تشرين الأول",
2642 "تشرين الثاني",
2643 "كانون الأول",
2644 ]
2647class AlgeriaTunisiaArabicLocale(ArabicLocale):
2648 names = ["ar-tn", "ar-dz"]
2649 month_names = [
2650 "",
2651 "جانفي",
2652 "فيفري",
2653 "مارس",
2654 "أفريل",
2655 "ماي",
2656 "جوان",
2657 "جويلية",
2658 "أوت",
2659 "سبتمبر",
2660 "أكتوبر",
2661 "نوفمبر",
2662 "ديسمبر",
2663 ]
2664 month_abbreviations = [
2665 "",
2666 "جانفي",
2667 "فيفري",
2668 "مارس",
2669 "أفريل",
2670 "ماي",
2671 "جوان",
2672 "جويلية",
2673 "أوت",
2674 "سبتمبر",
2675 "أكتوبر",
2676 "نوفمبر",
2677 "ديسمبر",
2678 ]
2681class MauritaniaArabicLocale(ArabicLocale):
2682 names = ["ar-mr"]
2683 month_names = [
2684 "",
2685 "يناير",
2686 "فبراير",
2687 "مارس",
2688 "إبريل",
2689 "مايو",
2690 "يونيو",
2691 "يوليو",
2692 "أغشت",
2693 "شتمبر",
2694 "أكتوبر",
2695 "نوفمبر",
2696 "دجمبر",
2697 ]
2698 month_abbreviations = [
2699 "",
2700 "يناير",
2701 "فبراير",
2702 "مارس",
2703 "إبريل",
2704 "مايو",
2705 "يونيو",
2706 "يوليو",
2707 "أغشت",
2708 "شتمبر",
2709 "أكتوبر",
2710 "نوفمبر",
2711 "دجمبر",
2712 ]
2715class MoroccoArabicLocale(ArabicLocale):
2716 names = ["ar-ma"]
2717 month_names = [
2718 "",
2719 "يناير",
2720 "فبراير",
2721 "مارس",
2722 "أبريل",
2723 "ماي",
2724 "يونيو",
2725 "يوليوز",
2726 "غشت",
2727 "شتنبر",
2728 "أكتوبر",
2729 "نونبر",
2730 "دجنبر",
2731 ]
2732 month_abbreviations = [
2733 "",
2734 "يناير",
2735 "فبراير",
2736 "مارس",
2737 "أبريل",
2738 "ماي",
2739 "يونيو",
2740 "يوليوز",
2741 "غشت",
2742 "شتنبر",
2743 "أكتوبر",
2744 "نونبر",
2745 "دجنبر",
2746 ]
2749class IcelandicLocale(Locale):
2750 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
2751 form = self.timeframes[timeframe]
2753 if isinstance(form, Mapping):
2754 if delta < 0:
2755 form = form["past"]
2756 elif delta > 0:
2757 form = form["future"]
2758 else:
2759 raise ValueError(
2760 "Icelandic Locale does not support units with a delta of zero. "
2761 "Please consider making a contribution to fix this issue."
2762 )
2763 # FIXME: handle when delta is 0
2765 return form.format(abs(delta))
2767 names = ["is", "is-is"]
2769 past = "fyrir {0} síðan"
2770 future = "eftir {0}"
2772 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
2773 "now": "rétt í þessu",
2774 "second": {"past": "sekúndu", "future": "sekúndu"},
2775 "seconds": {"past": "{0} nokkrum sekúndum", "future": "nokkrar sekúndur"},
2776 "minute": {"past": "einni mínútu", "future": "eina mínútu"},
2777 "minutes": {"past": "{0} mínútum", "future": "{0} mínútur"},
2778 "hour": {"past": "einum tíma", "future": "einn tíma"},
2779 "hours": {"past": "{0} tímum", "future": "{0} tíma"},
2780 "day": {"past": "einum degi", "future": "einn dag"},
2781 "days": {"past": "{0} dögum", "future": "{0} daga"},
2782 "month": {"past": "einum mánuði", "future": "einn mánuð"},
2783 "months": {"past": "{0} mánuðum", "future": "{0} mánuði"},
2784 "year": {"past": "einu ári", "future": "eitt ár"},
2785 "years": {"past": "{0} árum", "future": "{0} ár"},
2786 }
2788 meridians = {"am": "f.h.", "pm": "e.h.", "AM": "f.h.", "PM": "e.h."}
2790 month_names = [
2791 "",
2792 "janúar",
2793 "febrúar",
2794 "mars",
2795 "apríl",
2796 "maí",
2797 "júní",
2798 "júlí",
2799 "ágúst",
2800 "september",
2801 "október",
2802 "nóvember",
2803 "desember",
2804 ]
2805 month_abbreviations = [
2806 "",
2807 "jan",
2808 "feb",
2809 "mar",
2810 "apr",
2811 "maí",
2812 "jún",
2813 "júl",
2814 "ágú",
2815 "sep",
2816 "okt",
2817 "nóv",
2818 "des",
2819 ]
2821 day_names = [
2822 "",
2823 "mánudagur",
2824 "þriðjudagur",
2825 "miðvikudagur",
2826 "fimmtudagur",
2827 "föstudagur",
2828 "laugardagur",
2829 "sunnudagur",
2830 ]
2831 day_abbreviations = ["", "mán", "þri", "mið", "fim", "fös", "lau", "sun"]
2834class DanishLocale(Locale):
2835 names = ["da", "da-dk"]
2837 past = "for {0} siden"
2838 future = "om {0}"
2839 and_word = "og"
2841 timeframes = {
2842 "now": "lige nu",
2843 "second": "et sekund",
2844 "seconds": "{0} sekunder",
2845 "minute": "et minut",
2846 "minutes": "{0} minutter",
2847 "hour": "en time",
2848 "hours": "{0} timer",
2849 "day": "en dag",
2850 "days": "{0} dage",
2851 "week": "en uge",
2852 "weeks": "{0} uger",
2853 "month": "en måned",
2854 "months": "{0} måneder",
2855 "year": "et år",
2856 "years": "{0} år",
2857 }
2859 month_names = [
2860 "",
2861 "januar",
2862 "februar",
2863 "marts",
2864 "april",
2865 "maj",
2866 "juni",
2867 "juli",
2868 "august",
2869 "september",
2870 "oktober",
2871 "november",
2872 "december",
2873 ]
2874 month_abbreviations = [
2875 "",
2876 "jan",
2877 "feb",
2878 "mar",
2879 "apr",
2880 "maj",
2881 "jun",
2882 "jul",
2883 "aug",
2884 "sep",
2885 "okt",
2886 "nov",
2887 "dec",
2888 ]
2890 day_names = [
2891 "",
2892 "mandag",
2893 "tirsdag",
2894 "onsdag",
2895 "torsdag",
2896 "fredag",
2897 "lørdag",
2898 "søndag",
2899 ]
2900 day_abbreviations = ["", "man", "tir", "ons", "tor", "fre", "lør", "søn"]
2902 def _ordinal_number(self, n: int) -> str:
2903 return f"{n}."
2906class MalayalamLocale(Locale):
2907 names = ["ml"]
2909 past = "{0} മുമ്പ്"
2910 future = "{0} ശേഷം"
2912 timeframes = {
2913 "now": "ഇപ്പോൾ",
2914 "second": "ഒരു നിമിഷം",
2915 "seconds": "{0} സെക്കന്റ്",
2916 "minute": "ഒരു മിനിറ്റ്",
2917 "minutes": "{0} മിനിറ്റ്",
2918 "hour": "ഒരു മണിക്കൂർ",
2919 "hours": "{0} മണിക്കൂർ",
2920 "day": "ഒരു ദിവസം ",
2921 "days": "{0} ദിവസം ",
2922 "month": "ഒരു മാസം ",
2923 "months": "{0} മാസം ",
2924 "year": "ഒരു വർഷം ",
2925 "years": "{0} വർഷം ",
2926 }
2928 meridians = {
2929 "am": "രാവിലെ",
2930 "pm": "ഉച്ചക്ക് ശേഷം",
2931 "AM": "രാവിലെ",
2932 "PM": "ഉച്ചക്ക് ശേഷം",
2933 }
2935 month_names = [
2936 "",
2937 "ജനുവരി",
2938 "ഫെബ്രുവരി",
2939 "മാർച്ച്",
2940 "ഏപ്രിൽ ",
2941 "മെയ് ",
2942 "ജൂണ്",
2943 "ജൂലൈ",
2944 "ഓഗസ്റ്റ്",
2945 "സെപ്റ്റംബർ",
2946 "ഒക്ടോബർ",
2947 "നവംബർ",
2948 "ഡിസംബർ",
2949 ]
2950 month_abbreviations = [
2951 "",
2952 "ജനു",
2953 "ഫെബ് ",
2954 "മാർ",
2955 "ഏപ്രിൽ",
2956 "മേയ്",
2957 "ജൂണ്",
2958 "ജൂലൈ",
2959 "ഓഗസ്റ",
2960 "സെപ്റ്റ",
2961 "ഒക്ടോ",
2962 "നവം",
2963 "ഡിസം",
2964 ]
2966 day_names = ["", "തിങ്കള്", "ചൊവ്വ", "ബുധന്", "വ്യാഴം", "വെള്ളി", "ശനി", "ഞായര്"]
2967 day_abbreviations = [
2968 "",
2969 "തിങ്കള്",
2970 "ചൊവ്വ",
2971 "ബുധന്",
2972 "വ്യാഴം",
2973 "വെള്ളി",
2974 "ശനി",
2975 "ഞായര്",
2976 ]
2979class HindiLocale(Locale):
2980 names = ["hi", "hi-in"]
2982 past = "{0} पहले"
2983 future = "{0} बाद"
2985 timeframes = {
2986 "now": "अभी",
2987 "second": "एक पल",
2988 "seconds": "{0} सेकंड्",
2989 "minute": "एक मिनट ",
2990 "minutes": "{0} मिनट ",
2991 "hour": "एक घंटा",
2992 "hours": "{0} घंटे",
2993 "day": "एक दिन",
2994 "days": "{0} दिन",
2995 "month": "एक माह ",
2996 "months": "{0} महीने ",
2997 "year": "एक वर्ष ",
2998 "years": "{0} साल ",
2999 }
3001 meridians = {"am": "सुबह", "pm": "शाम", "AM": "सुबह", "PM": "शाम"}
3003 month_names = [
3004 "",
3005 "जनवरी",
3006 "फरवरी",
3007 "मार्च",
3008 "अप्रैल ",
3009 "मई",
3010 "जून",
3011 "जुलाई",
3012 "अगस्त",
3013 "सितंबर",
3014 "अक्टूबर",
3015 "नवंबर",
3016 "दिसंबर",
3017 ]
3018 month_abbreviations = [
3019 "",
3020 "जन",
3021 "फ़र",
3022 "मार्च",
3023 "अप्रै",
3024 "मई",
3025 "जून",
3026 "जुलाई",
3027 "आग",
3028 "सित",
3029 "अकत",
3030 "नवे",
3031 "दिस",
3032 ]
3034 day_names = [
3035 "",
3036 "सोमवार",
3037 "मंगलवार",
3038 "बुधवार",
3039 "गुरुवार",
3040 "शुक्रवार",
3041 "शनिवार",
3042 "रविवार",
3043 ]
3044 day_abbreviations = ["", "सोम", "मंगल", "बुध", "गुरुवार", "शुक्र", "शनि", "रवि"]
3047class CzechLocale(Locale):
3048 names = ["cs", "cs-cz"]
3050 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
3051 "now": "Teď",
3052 "second": {"past": "vteřina", "future": "vteřina"},
3053 "seconds": {
3054 "zero": "vteřina",
3055 "past": "{0} sekundami",
3056 "future-singular": "{0} sekundy",
3057 "future-paucal": "{0} sekund",
3058 },
3059 "minute": {"past": "minutou", "future": "minutu"},
3060 "minutes": {
3061 "zero": "{0} minut",
3062 "past": "{0} minutami",
3063 "future-singular": "{0} minuty",
3064 "future-paucal": "{0} minut",
3065 },
3066 "hour": {"past": "hodinou", "future": "hodinu"},
3067 "hours": {
3068 "zero": "{0} hodin",
3069 "past": "{0} hodinami",
3070 "future-singular": "{0} hodiny",
3071 "future-paucal": "{0} hodin",
3072 },
3073 "day": {"past": "dnem", "future": "den"},
3074 "days": {
3075 "zero": "{0} dnů",
3076 "past": "{0} dny",
3077 "future-singular": "{0} dny",
3078 "future-paucal": "{0} dnů",
3079 },
3080 "week": {"past": "týdnem", "future": "týden"},
3081 "weeks": {
3082 "zero": "{0} týdnů",
3083 "past": "{0} týdny",
3084 "future-singular": "{0} týdny",
3085 "future-paucal": "{0} týdnů",
3086 },
3087 "month": {"past": "měsícem", "future": "měsíc"},
3088 "months": {
3089 "zero": "{0} měsíců",
3090 "past": "{0} měsíci",
3091 "future-singular": "{0} měsíce",
3092 "future-paucal": "{0} měsíců",
3093 },
3094 "year": {"past": "rokem", "future": "rok"},
3095 "years": {
3096 "zero": "{0} let",
3097 "past": "{0} lety",
3098 "future-singular": "{0} roky",
3099 "future-paucal": "{0} let",
3100 },
3101 }
3103 past = "Před {0}"
3104 future = "Za {0}"
3106 month_names = [
3107 "",
3108 "leden",
3109 "únor",
3110 "březen",
3111 "duben",
3112 "květen",
3113 "červen",
3114 "červenec",
3115 "srpen",
3116 "září",
3117 "říjen",
3118 "listopad",
3119 "prosinec",
3120 ]
3121 month_abbreviations = [
3122 "",
3123 "led",
3124 "úno",
3125 "bře",
3126 "dub",
3127 "kvě",
3128 "čvn",
3129 "čvc",
3130 "srp",
3131 "zář",
3132 "říj",
3133 "lis",
3134 "pro",
3135 ]
3137 day_names = [
3138 "",
3139 "pondělí",
3140 "úterý",
3141 "středa",
3142 "čtvrtek",
3143 "pátek",
3144 "sobota",
3145 "neděle",
3146 ]
3147 day_abbreviations = ["", "po", "út", "st", "čt", "pá", "so", "ne"]
3149 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
3150 """Czech aware time frame format function, takes into account
3151 the differences between past and future forms."""
3152 abs_delta = abs(delta)
3153 form = self.timeframes[timeframe]
3155 if isinstance(form, str):
3156 return form.format(abs_delta)
3158 if delta == 0:
3159 key = "zero" # And *never* use 0 in the singular!
3160 elif delta < 0:
3161 key = "past"
3162 else:
3163 # Needed since both regular future and future-singular and future-paucal cases
3164 if "future-singular" not in form:
3165 key = "future"
3166 elif 2 <= abs_delta % 10 <= 4 and (
3167 abs_delta % 100 < 10 or abs_delta % 100 >= 20
3168 ):
3169 key = "future-singular"
3170 else:
3171 key = "future-paucal"
3173 form: str = form[key]
3174 return form.format(abs_delta)
3177class SlovakLocale(Locale):
3178 names = ["sk", "sk-sk"]
3180 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
3181 "now": "Teraz",
3182 "second": {"past": "sekundou", "future": "sekundu"},
3183 "seconds": {
3184 "zero": "{0} sekúnd",
3185 "past": "{0} sekundami",
3186 "future-singular": "{0} sekundy",
3187 "future-paucal": "{0} sekúnd",
3188 },
3189 "minute": {"past": "minútou", "future": "minútu"},
3190 "minutes": {
3191 "zero": "{0} minút",
3192 "past": "{0} minútami",
3193 "future-singular": "{0} minúty",
3194 "future-paucal": "{0} minút",
3195 },
3196 "hour": {"past": "hodinou", "future": "hodinu"},
3197 "hours": {
3198 "zero": "{0} hodín",
3199 "past": "{0} hodinami",
3200 "future-singular": "{0} hodiny",
3201 "future-paucal": "{0} hodín",
3202 },
3203 "day": {"past": "dňom", "future": "deň"},
3204 "days": {
3205 "zero": "{0} dní",
3206 "past": "{0} dňami",
3207 "future-singular": "{0} dni",
3208 "future-paucal": "{0} dní",
3209 },
3210 "week": {"past": "týždňom", "future": "týždeň"},
3211 "weeks": {
3212 "zero": "{0} týždňov",
3213 "past": "{0} týždňami",
3214 "future-singular": "{0} týždne",
3215 "future-paucal": "{0} týždňov",
3216 },
3217 "month": {"past": "mesiacom", "future": "mesiac"},
3218 "months": {
3219 "zero": "{0} mesiacov",
3220 "past": "{0} mesiacmi",
3221 "future-singular": "{0} mesiace",
3222 "future-paucal": "{0} mesiacov",
3223 },
3224 "year": {"past": "rokom", "future": "rok"},
3225 "years": {
3226 "zero": "{0} rokov",
3227 "past": "{0} rokmi",
3228 "future-singular": "{0} roky",
3229 "future-paucal": "{0} rokov",
3230 },
3231 }
3233 past = "Pred {0}"
3234 future = "O {0}"
3235 and_word = "a"
3237 month_names = [
3238 "",
3239 "január",
3240 "február",
3241 "marec",
3242 "apríl",
3243 "máj",
3244 "jún",
3245 "júl",
3246 "august",
3247 "september",
3248 "október",
3249 "november",
3250 "december",
3251 ]
3252 month_abbreviations = [
3253 "",
3254 "jan",
3255 "feb",
3256 "mar",
3257 "apr",
3258 "máj",
3259 "jún",
3260 "júl",
3261 "aug",
3262 "sep",
3263 "okt",
3264 "nov",
3265 "dec",
3266 ]
3268 day_names = [
3269 "",
3270 "pondelok",
3271 "utorok",
3272 "streda",
3273 "štvrtok",
3274 "piatok",
3275 "sobota",
3276 "nedeľa",
3277 ]
3278 day_abbreviations = ["", "po", "ut", "st", "št", "pi", "so", "ne"]
3280 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
3281 """Slovak aware time frame format function, takes into account
3282 the differences between past and future forms."""
3283 abs_delta = abs(delta)
3284 form = self.timeframes[timeframe]
3286 if isinstance(form, str):
3287 return form.format(abs_delta)
3289 if delta == 0:
3290 key = "zero" # And *never* use 0 in the singular!
3291 elif delta < 0:
3292 key = "past"
3293 else:
3294 if "future-singular" not in form:
3295 key = "future"
3296 elif 2 <= abs_delta % 10 <= 4 and (
3297 abs_delta % 100 < 10 or abs_delta % 100 >= 20
3298 ):
3299 key = "future-singular"
3300 else:
3301 key = "future-paucal"
3303 form: str = form[key]
3304 return form.format(abs_delta)
3307class FarsiLocale(Locale):
3308 names = ["fa", "fa-ir"]
3310 past = "{0} قبل"
3311 future = "در {0}"
3313 timeframes = {
3314 "now": "اکنون",
3315 "second": "یک لحظه",
3316 "seconds": "{0} ثانیه",
3317 "minute": "یک دقیقه",
3318 "minutes": "{0} دقیقه",
3319 "hour": "یک ساعت",
3320 "hours": "{0} ساعت",
3321 "day": "یک روز",
3322 "days": "{0} روز",
3323 "month": "یک ماه",
3324 "months": "{0} ماه",
3325 "year": "یک سال",
3326 "years": "{0} سال",
3327 }
3329 meridians = {
3330 "am": "قبل از ظهر",
3331 "pm": "بعد از ظهر",
3332 "AM": "قبل از ظهر",
3333 "PM": "بعد از ظهر",
3334 }
3336 month_names = [
3337 "",
3338 "January",
3339 "February",
3340 "March",
3341 "April",
3342 "May",
3343 "June",
3344 "July",
3345 "August",
3346 "September",
3347 "October",
3348 "November",
3349 "December",
3350 ]
3351 month_abbreviations = [
3352 "",
3353 "Jan",
3354 "Feb",
3355 "Mar",
3356 "Apr",
3357 "May",
3358 "Jun",
3359 "Jul",
3360 "Aug",
3361 "Sep",
3362 "Oct",
3363 "Nov",
3364 "Dec",
3365 ]
3367 day_names = [
3368 "",
3369 "دو شنبه",
3370 "سه شنبه",
3371 "چهارشنبه",
3372 "پنجشنبه",
3373 "جمعه",
3374 "شنبه",
3375 "یکشنبه",
3376 ]
3377 day_abbreviations = ["", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
3380class HebrewLocale(Locale):
3381 names = ["he", "he-il"]
3383 past = "לפני {0}"
3384 future = "בעוד {0}"
3385 and_word = "ו"
3387 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
3388 "now": "הרגע",
3389 "second": "שנייה",
3390 "seconds": "{0} שניות",
3391 "minute": "דקה",
3392 "minutes": "{0} דקות",
3393 "hour": "שעה",
3394 "hours": {"2": "שעתיים", "ten": "{0} שעות", "higher": "{0} שעות"},
3395 "day": "יום",
3396 "days": {"2": "יומיים", "ten": "{0} ימים", "higher": "{0} יום"},
3397 "week": "שבוע",
3398 "weeks": {"2": "שבועיים", "ten": "{0} שבועות", "higher": "{0} שבועות"},
3399 "month": "חודש",
3400 "months": {"2": "חודשיים", "ten": "{0} חודשים", "higher": "{0} חודשים"},
3401 "year": "שנה",
3402 "years": {"2": "שנתיים", "ten": "{0} שנים", "higher": "{0} שנה"},
3403 }
3405 meridians = {
3406 "am": 'לפנ"צ',
3407 "pm": 'אחר"צ',
3408 "AM": "לפני הצהריים",
3409 "PM": "אחרי הצהריים",
3410 }
3412 month_names = [
3413 "",
3414 "ינואר",
3415 "פברואר",
3416 "מרץ",
3417 "אפריל",
3418 "מאי",
3419 "יוני",
3420 "יולי",
3421 "אוגוסט",
3422 "ספטמבר",
3423 "אוקטובר",
3424 "נובמבר",
3425 "דצמבר",
3426 ]
3427 month_abbreviations = [
3428 "",
3429 "ינו׳",
3430 "פבר׳",
3431 "מרץ",
3432 "אפר׳",
3433 "מאי",
3434 "יוני",
3435 "יולי",
3436 "אוג׳",
3437 "ספט׳",
3438 "אוק׳",
3439 "נוב׳",
3440 "דצמ׳",
3441 ]
3443 day_names = ["", "שני", "שלישי", "רביעי", "חמישי", "שישי", "שבת", "ראשון"]
3444 day_abbreviations = ["", "ב׳", "ג׳", "ד׳", "ה׳", "ו׳", "ש׳", "א׳"]
3446 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
3447 form = self.timeframes[timeframe]
3448 delta = abs(delta)
3449 if isinstance(form, Mapping):
3450 if delta == 2:
3451 form = form["2"]
3452 elif delta == 0 or 2 < delta <= 10:
3453 form = form["ten"]
3454 else:
3455 form = form["higher"]
3457 return form.format(delta)
3459 def describe_multi(
3460 self,
3461 timeframes: Sequence[Tuple[TimeFrameLiteral, Union[int, float]]],
3462 only_distance: bool = False,
3463 ) -> str:
3464 """Describes a delta within multiple timeframes in plain language.
3465 In Hebrew, the and word behaves a bit differently.
3467 :param timeframes: a list of string, quantity pairs each representing a timeframe and delta.
3468 :param only_distance: return only distance eg: "2 hours and 11 seconds" without "in" or "ago" keywords
3469 """
3471 humanized = ""
3472 for index, (timeframe, delta) in enumerate(timeframes):
3473 last_humanized = self._format_timeframe(timeframe, trunc(delta))
3474 if index == 0:
3475 humanized = last_humanized
3476 elif index == len(timeframes) - 1: # Must have at least 2 items
3477 humanized += " " + self.and_word
3478 if last_humanized[0].isdecimal():
3479 humanized += "־"
3480 humanized += last_humanized
3481 else: # Don't add for the last one
3482 humanized += ", " + last_humanized
3484 if not only_distance:
3485 humanized = self._format_relative(humanized, timeframe, trunc(delta))
3487 return humanized
3490class MarathiLocale(Locale):
3491 names = ["mr"]
3493 past = "{0} आधी"
3494 future = "{0} नंतर"
3496 timeframes = {
3497 "now": "सद्य",
3498 "second": "एक सेकंद",
3499 "seconds": "{0} सेकंद",
3500 "minute": "एक मिनिट ",
3501 "minutes": "{0} मिनिट ",
3502 "hour": "एक तास",
3503 "hours": "{0} तास",
3504 "day": "एक दिवस",
3505 "days": "{0} दिवस",
3506 "month": "एक महिना ",
3507 "months": "{0} महिने ",
3508 "year": "एक वर्ष ",
3509 "years": "{0} वर्ष ",
3510 }
3512 meridians = {"am": "सकाळ", "pm": "संध्याकाळ", "AM": "सकाळ", "PM": "संध्याकाळ"}
3514 month_names = [
3515 "",
3516 "जानेवारी",
3517 "फेब्रुवारी",
3518 "मार्च",
3519 "एप्रिल",
3520 "मे",
3521 "जून",
3522 "जुलै",
3523 "अॉगस्ट",
3524 "सप्टेंबर",
3525 "अॉक्टोबर",
3526 "नोव्हेंबर",
3527 "डिसेंबर",
3528 ]
3529 month_abbreviations = [
3530 "",
3531 "जान",
3532 "फेब्रु",
3533 "मार्च",
3534 "एप्रि",
3535 "मे",
3536 "जून",
3537 "जुलै",
3538 "अॉग",
3539 "सप्टें",
3540 "अॉक्टो",
3541 "नोव्हें",
3542 "डिसें",
3543 ]
3545 day_names = [
3546 "",
3547 "सोमवार",
3548 "मंगळवार",
3549 "बुधवार",
3550 "गुरुवार",
3551 "शुक्रवार",
3552 "शनिवार",
3553 "रविवार",
3554 ]
3555 day_abbreviations = ["", "सोम", "मंगळ", "बुध", "गुरु", "शुक्र", "शनि", "रवि"]
3558class CatalanLocale(Locale):
3559 names = ["ca", "ca-es", "ca-ad", "ca-fr", "ca-it"]
3560 past = "Fa {0}"
3561 future = "En {0}"
3562 and_word = "i"
3564 timeframes = {
3565 "now": "Ara mateix",
3566 "second": "un segon",
3567 "seconds": "{0} segons",
3568 "minute": "un minut",
3569 "minutes": "{0} minuts",
3570 "hour": "una hora",
3571 "hours": "{0} hores",
3572 "day": "un dia",
3573 "days": "{0} dies",
3574 "month": "un mes",
3575 "months": "{0} mesos",
3576 "year": "un any",
3577 "years": "{0} anys",
3578 }
3580 month_names = [
3581 "",
3582 "gener",
3583 "febrer",
3584 "març",
3585 "abril",
3586 "maig",
3587 "juny",
3588 "juliol",
3589 "agost",
3590 "setembre",
3591 "octubre",
3592 "novembre",
3593 "desembre",
3594 ]
3595 month_abbreviations = [
3596 "",
3597 "gen.",
3598 "febr.",
3599 "març",
3600 "abr.",
3601 "maig",
3602 "juny",
3603 "jul.",
3604 "ag.",
3605 "set.",
3606 "oct.",
3607 "nov.",
3608 "des.",
3609 ]
3610 day_names = [
3611 "",
3612 "dilluns",
3613 "dimarts",
3614 "dimecres",
3615 "dijous",
3616 "divendres",
3617 "dissabte",
3618 "diumenge",
3619 ]
3620 day_abbreviations = [
3621 "",
3622 "dl.",
3623 "dt.",
3624 "dc.",
3625 "dj.",
3626 "dv.",
3627 "ds.",
3628 "dg.",
3629 ]
3632class BasqueLocale(Locale):
3633 names = ["eu", "eu-eu"]
3634 past = "duela {0}"
3635 future = "{0}" # I don't know what's the right phrase in Basque for the future.
3637 timeframes = {
3638 "now": "Orain",
3639 "second": "segundo bat",
3640 "seconds": "{0} segundu",
3641 "minute": "minutu bat",
3642 "minutes": "{0} minutu",
3643 "hour": "ordu bat",
3644 "hours": "{0} ordu",
3645 "day": "egun bat",
3646 "days": "{0} egun",
3647 "month": "hilabete bat",
3648 "months": "{0} hilabet",
3649 "year": "urte bat",
3650 "years": "{0} urte",
3651 }
3653 month_names = [
3654 "",
3655 "urtarrilak",
3656 "otsailak",
3657 "martxoak",
3658 "apirilak",
3659 "maiatzak",
3660 "ekainak",
3661 "uztailak",
3662 "abuztuak",
3663 "irailak",
3664 "urriak",
3665 "azaroak",
3666 "abenduak",
3667 ]
3668 month_abbreviations = [
3669 "",
3670 "urt",
3671 "ots",
3672 "mar",
3673 "api",
3674 "mai",
3675 "eka",
3676 "uzt",
3677 "abu",
3678 "ira",
3679 "urr",
3680 "aza",
3681 "abe",
3682 ]
3683 day_names = [
3684 "",
3685 "astelehena",
3686 "asteartea",
3687 "asteazkena",
3688 "osteguna",
3689 "ostirala",
3690 "larunbata",
3691 "igandea",
3692 ]
3693 day_abbreviations = ["", "al", "ar", "az", "og", "ol", "lr", "ig"]
3696class HungarianLocale(Locale):
3697 names = ["hu", "hu-hu"]
3699 past = "{0} ezelőtt"
3700 future = "{0} múlva"
3702 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
3703 "now": "éppen most",
3704 "second": {"past": "egy második", "future": "egy második"},
3705 "seconds": {"past": "{0} másodpercekkel", "future": "{0} pár másodperc"},
3706 "minute": {"past": "egy perccel", "future": "egy perc"},
3707 "minutes": {"past": "{0} perccel", "future": "{0} perc"},
3708 "hour": {"past": "egy órával", "future": "egy óra"},
3709 "hours": {"past": "{0} órával", "future": "{0} óra"},
3710 "day": {"past": "egy nappal", "future": "egy nap"},
3711 "days": {"past": "{0} nappal", "future": "{0} nap"},
3712 "week": {"past": "egy héttel", "future": "egy hét"},
3713 "weeks": {"past": "{0} héttel", "future": "{0} hét"},
3714 "month": {"past": "egy hónappal", "future": "egy hónap"},
3715 "months": {"past": "{0} hónappal", "future": "{0} hónap"},
3716 "year": {"past": "egy évvel", "future": "egy év"},
3717 "years": {"past": "{0} évvel", "future": "{0} év"},
3718 }
3720 month_names = [
3721 "",
3722 "január",
3723 "február",
3724 "március",
3725 "április",
3726 "május",
3727 "június",
3728 "július",
3729 "augusztus",
3730 "szeptember",
3731 "október",
3732 "november",
3733 "december",
3734 ]
3735 month_abbreviations = [
3736 "",
3737 "jan",
3738 "febr",
3739 "márc",
3740 "ápr",
3741 "máj",
3742 "jún",
3743 "júl",
3744 "aug",
3745 "szept",
3746 "okt",
3747 "nov",
3748 "dec",
3749 ]
3751 day_names = [
3752 "",
3753 "hétfő",
3754 "kedd",
3755 "szerda",
3756 "csütörtök",
3757 "péntek",
3758 "szombat",
3759 "vasárnap",
3760 ]
3761 day_abbreviations = ["", "hét", "kedd", "szer", "csüt", "pént", "szom", "vas"]
3763 meridians = {"am": "de", "pm": "du", "AM": "DE", "PM": "DU"}
3765 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
3766 form = self.timeframes[timeframe]
3768 if isinstance(form, Mapping):
3769 if delta > 0:
3770 form = form["future"]
3771 else:
3772 form = form["past"]
3774 return form.format(abs(delta))
3777class EsperantoLocale(Locale):
3778 names = ["eo", "eo-xx"]
3779 past = "antaŭ {0}"
3780 future = "post {0}"
3782 timeframes = {
3783 "now": "nun",
3784 "second": "sekundo",
3785 "seconds": "{0} kelkaj sekundoj",
3786 "minute": "unu minuto",
3787 "minutes": "{0} minutoj",
3788 "hour": "un horo",
3789 "hours": "{0} horoj",
3790 "day": "unu tago",
3791 "days": "{0} tagoj",
3792 "month": "unu monato",
3793 "months": "{0} monatoj",
3794 "year": "unu jaro",
3795 "years": "{0} jaroj",
3796 }
3798 month_names = [
3799 "",
3800 "januaro",
3801 "februaro",
3802 "marto",
3803 "aprilo",
3804 "majo",
3805 "junio",
3806 "julio",
3807 "aŭgusto",
3808 "septembro",
3809 "oktobro",
3810 "novembro",
3811 "decembro",
3812 ]
3813 month_abbreviations = [
3814 "",
3815 "jan",
3816 "feb",
3817 "mar",
3818 "apr",
3819 "maj",
3820 "jun",
3821 "jul",
3822 "aŭg",
3823 "sep",
3824 "okt",
3825 "nov",
3826 "dec",
3827 ]
3829 day_names = [
3830 "",
3831 "lundo",
3832 "mardo",
3833 "merkredo",
3834 "ĵaŭdo",
3835 "vendredo",
3836 "sabato",
3837 "dimanĉo",
3838 ]
3839 day_abbreviations = ["", "lun", "mar", "mer", "ĵaŭ", "ven", "sab", "dim"]
3841 meridians = {"am": "atm", "pm": "ptm", "AM": "ATM", "PM": "PTM"}
3843 ordinal_day_re = r"((?P<value>[1-3]?[0-9](?=a))a)"
3845 def _ordinal_number(self, n: int) -> str:
3846 return f"{n}a"
3849class ThaiLocale(Locale):
3850 names = ["th", "th-th"]
3852 past = "{0} ที่ผ่านมา"
3853 future = "ในอีก {0}"
3855 timeframes = {
3856 "now": "ขณะนี้",
3857 "second": "วินาที",
3858 "seconds": "{0} ไม่กี่วินาที",
3859 "minute": "1 นาที",
3860 "minutes": "{0} นาที",
3861 "hour": "1 ชั่วโมง",
3862 "hours": "{0} ชั่วโมง",
3863 "day": "1 วัน",
3864 "days": "{0} วัน",
3865 "month": "1 เดือน",
3866 "months": "{0} เดือน",
3867 "year": "1 ปี",
3868 "years": "{0} ปี",
3869 }
3871 month_names = [
3872 "",
3873 "มกราคม",
3874 "กุมภาพันธ์",
3875 "มีนาคม",
3876 "เมษายน",
3877 "พฤษภาคม",
3878 "มิถุนายน",
3879 "กรกฎาคม",
3880 "สิงหาคม",
3881 "กันยายน",
3882 "ตุลาคม",
3883 "พฤศจิกายน",
3884 "ธันวาคม",
3885 ]
3886 month_abbreviations = [
3887 "",
3888 "ม.ค.",
3889 "ก.พ.",
3890 "มี.ค.",
3891 "เม.ย.",
3892 "พ.ค.",
3893 "มิ.ย.",
3894 "ก.ค.",
3895 "ส.ค.",
3896 "ก.ย.",
3897 "ต.ค.",
3898 "พ.ย.",
3899 "ธ.ค.",
3900 ]
3902 day_names = ["", "จันทร์", "อังคาร", "พุธ", "พฤหัสบดี", "ศุกร์", "เสาร์", "อาทิตย์"]
3903 day_abbreviations = ["", "จ", "อ", "พ", "พฤ", "ศ", "ส", "อา"]
3905 meridians = {"am": "am", "pm": "pm", "AM": "AM", "PM": "PM"}
3907 BE_OFFSET = 543
3909 def year_full(self, year: int) -> str:
3910 """Thai always use Buddhist Era (BE) which is CE + 543"""
3911 year += self.BE_OFFSET
3912 return f"{year:04d}"
3914 def year_abbreviation(self, year: int) -> str:
3915 """Thai always use Buddhist Era (BE) which is CE + 543"""
3916 year += self.BE_OFFSET
3917 return f"{year:04d}"[2:]
3919 def _format_relative(
3920 self,
3921 humanized: str,
3922 timeframe: TimeFrameLiteral,
3923 delta: Union[float, int],
3924 ) -> str:
3925 """Thai normally doesn't have any space between words"""
3926 if timeframe == "now":
3927 return humanized
3929 direction = self.past if delta < 0 else self.future
3930 relative_string = direction.format(humanized)
3932 if timeframe == "seconds":
3933 relative_string = relative_string.replace(" ", "")
3935 return relative_string
3938class LaotianLocale(Locale):
3939 names = ["lo", "lo-la"]
3941 past = "{0} ກ່ອນຫນ້ານີ້"
3942 future = "ໃນ {0}"
3944 timeframes = {
3945 "now": "ດຽວນີ້",
3946 "second": "ວິນາທີ",
3947 "seconds": "{0} ວິນາທີ",
3948 "minute": "ນາທີ",
3949 "minutes": "{0} ນາທີ",
3950 "hour": "ຊົ່ວໂມງ",
3951 "hours": "{0} ຊົ່ວໂມງ",
3952 "day": "ມື້",
3953 "days": "{0} ມື້",
3954 "week": "ອາທິດ",
3955 "weeks": "{0} ອາທິດ",
3956 "month": "ເດືອນ",
3957 "months": "{0} ເດືອນ",
3958 "year": "ປີ",
3959 "years": "{0} ປີ",
3960 }
3962 month_names = [
3963 "",
3964 "ມັງກອນ", # mangkon
3965 "ກຸມພາ", # kumpha
3966 "ມີນາ", # mina
3967 "ເມສາ", # mesa
3968 "ພຶດສະພາ", # phudsapha
3969 "ມິຖຸນາ", # mithuna
3970 "ກໍລະກົດ", # kolakod
3971 "ສິງຫາ", # singha
3972 "ກັນຍາ", # knaia
3973 "ຕຸລາ", # tula
3974 "ພະຈິກ", # phachik
3975 "ທັນວາ", # thanuaa
3976 ]
3977 month_abbreviations = [
3978 "",
3979 "ມັງກອນ",
3980 "ກຸມພາ",
3981 "ມີນາ",
3982 "ເມສາ",
3983 "ພຶດສະພາ",
3984 "ມິຖຸນາ",
3985 "ກໍລະກົດ",
3986 "ສິງຫາ",
3987 "ກັນຍາ",
3988 "ຕຸລາ",
3989 "ພະຈິກ",
3990 "ທັນວາ",
3991 ]
3993 day_names = [
3994 "",
3995 "ວັນຈັນ", # vanchan
3996 "ວັນອັງຄານ", # vnoangkhan
3997 "ວັນພຸດ", # vanphud
3998 "ວັນພະຫັດ", # vanphahad
3999 "ວັນສຸກ", # vansuk
4000 "ວັນເສົາ", # vansao
4001 "ວັນອາທິດ", # vnoathid
4002 ]
4003 day_abbreviations = [
4004 "",
4005 "ວັນຈັນ",
4006 "ວັນອັງຄານ",
4007 "ວັນພຸດ",
4008 "ວັນພະຫັດ",
4009 "ວັນສຸກ",
4010 "ວັນເສົາ",
4011 "ວັນອາທິດ",
4012 ]
4014 BE_OFFSET = 543
4016 def year_full(self, year: int) -> str:
4017 """Lao always use Buddhist Era (BE) which is CE + 543"""
4018 year += self.BE_OFFSET
4019 return f"{year:04d}"
4021 def year_abbreviation(self, year: int) -> str:
4022 """Lao always use Buddhist Era (BE) which is CE + 543"""
4023 year += self.BE_OFFSET
4024 return f"{year:04d}"[2:]
4026 def _format_relative(
4027 self,
4028 humanized: str,
4029 timeframe: TimeFrameLiteral,
4030 delta: Union[float, int],
4031 ) -> str:
4032 """Lao normally doesn't have any space between words"""
4033 if timeframe == "now":
4034 return humanized
4036 direction = self.past if delta < 0 else self.future
4037 relative_string = direction.format(humanized)
4039 if timeframe == "seconds":
4040 relative_string = relative_string.replace(" ", "")
4042 return relative_string
4045class BengaliLocale(Locale):
4046 names = ["bn", "bn-bd", "bn-in"]
4048 past = "{0} আগে"
4049 future = "{0} পরে"
4051 timeframes = {
4052 "now": "এখন",
4053 "second": "একটি দ্বিতীয়",
4054 "seconds": "{0} সেকেন্ড",
4055 "minute": "এক মিনিট",
4056 "minutes": "{0} মিনিট",
4057 "hour": "এক ঘণ্টা",
4058 "hours": "{0} ঘণ্টা",
4059 "day": "এক দিন",
4060 "days": "{0} দিন",
4061 "month": "এক মাস",
4062 "months": "{0} মাস ",
4063 "year": "এক বছর",
4064 "years": "{0} বছর",
4065 }
4067 meridians = {"am": "সকাল", "pm": "বিকাল", "AM": "সকাল", "PM": "বিকাল"}
4069 month_names = [
4070 "",
4071 "জানুয়ারি",
4072 "ফেব্রুয়ারি",
4073 "মার্চ",
4074 "এপ্রিল",
4075 "মে",
4076 "জুন",
4077 "জুলাই",
4078 "আগস্ট",
4079 "সেপ্টেম্বর",
4080 "অক্টোবর",
4081 "নভেম্বর",
4082 "ডিসেম্বর",
4083 ]
4084 month_abbreviations = [
4085 "",
4086 "জানু",
4087 "ফেব",
4088 "মার্চ",
4089 "এপ্রি",
4090 "মে",
4091 "জুন",
4092 "জুল",
4093 "অগা",
4094 "সেপ্ট",
4095 "অক্টো",
4096 "নভে",
4097 "ডিসে",
4098 ]
4100 day_names = [
4101 "",
4102 "সোমবার",
4103 "মঙ্গলবার",
4104 "বুধবার",
4105 "বৃহস্পতিবার",
4106 "শুক্রবার",
4107 "শনিবার",
4108 "রবিবার",
4109 ]
4110 day_abbreviations = ["", "সোম", "মঙ্গল", "বুধ", "বৃহঃ", "শুক্র", "শনি", "রবি"]
4112 def _ordinal_number(self, n: int) -> str:
4113 if n > 10 or n == 0:
4114 return f"{n}তম"
4115 if n in [1, 5, 7, 8, 9, 10]:
4116 return f"{n}ম"
4117 if n in [2, 3]:
4118 return f"{n}য়"
4119 if n == 4:
4120 return f"{n}র্থ"
4121 if n == 6:
4122 return f"{n}ষ্ঠ"
4123 return ""
4126class RomanshLocale(Locale):
4127 names = ["rm", "rm-ch"]
4129 past = "avant {0}"
4130 future = "en {0}"
4132 timeframes = {
4133 "now": "en quest mument",
4134 "second": "in secunda",
4135 "seconds": "{0} secundas",
4136 "minute": "ina minuta",
4137 "minutes": "{0} minutas",
4138 "hour": "in'ura",
4139 "hours": "{0} ura",
4140 "day": "in di",
4141 "days": "{0} dis",
4142 "week": "in'emna",
4143 "weeks": "{0} emnas",
4144 "month": "in mais",
4145 "months": "{0} mais",
4146 "year": "in onn",
4147 "years": "{0} onns",
4148 }
4150 month_names = [
4151 "",
4152 "schaner",
4153 "favrer",
4154 "mars",
4155 "avrigl",
4156 "matg",
4157 "zercladur",
4158 "fanadur",
4159 "avust",
4160 "settember",
4161 "october",
4162 "november",
4163 "december",
4164 ]
4166 month_abbreviations = [
4167 "",
4168 "schan",
4169 "fav",
4170 "mars",
4171 "avr",
4172 "matg",
4173 "zer",
4174 "fan",
4175 "avu",
4176 "set",
4177 "oct",
4178 "nov",
4179 "dec",
4180 ]
4182 day_names = [
4183 "",
4184 "glindesdi",
4185 "mardi",
4186 "mesemna",
4187 "gievgia",
4188 "venderdi",
4189 "sonda",
4190 "dumengia",
4191 ]
4193 day_abbreviations = ["", "gli", "ma", "me", "gie", "ve", "so", "du"]
4196class RomanianLocale(Locale):
4197 names = ["ro", "ro-ro"]
4199 past = "{0} în urmă"
4200 future = "peste {0}"
4201 and_word = "și"
4203 timeframes = {
4204 "now": "acum",
4205 "second": "o secunda",
4206 "seconds": "{0} câteva secunde",
4207 "minute": "un minut",
4208 "minutes": "{0} minute",
4209 "hour": "o oră",
4210 "hours": "{0} ore",
4211 "day": "o zi",
4212 "days": "{0} zile",
4213 "month": "o lună",
4214 "months": "{0} luni",
4215 "year": "un an",
4216 "years": "{0} ani",
4217 }
4219 month_names = [
4220 "",
4221 "ianuarie",
4222 "februarie",
4223 "martie",
4224 "aprilie",
4225 "mai",
4226 "iunie",
4227 "iulie",
4228 "august",
4229 "septembrie",
4230 "octombrie",
4231 "noiembrie",
4232 "decembrie",
4233 ]
4234 month_abbreviations = [
4235 "",
4236 "ian",
4237 "febr",
4238 "mart",
4239 "apr",
4240 "mai",
4241 "iun",
4242 "iul",
4243 "aug",
4244 "sept",
4245 "oct",
4246 "nov",
4247 "dec",
4248 ]
4250 day_names = [
4251 "",
4252 "luni",
4253 "marți",
4254 "miercuri",
4255 "joi",
4256 "vineri",
4257 "sâmbătă",
4258 "duminică",
4259 ]
4260 day_abbreviations = ["", "Lun", "Mar", "Mie", "Joi", "Vin", "Sâm", "Dum"]
4263class SlovenianLocale(Locale):
4264 names = ["sl", "sl-si"]
4266 past = "pred {0}"
4267 future = "čez {0}"
4268 and_word = "in"
4270 timeframes = {
4271 "now": "zdaj",
4272 "second": "sekundo",
4273 "seconds": "{0} sekund",
4274 "minute": "minuta",
4275 "minutes": "{0} minutami",
4276 "hour": "uro",
4277 "hours": "{0} ur",
4278 "day": "dan",
4279 "days": "{0} dni",
4280 "month": "mesec",
4281 "months": "{0} mesecev",
4282 "year": "leto",
4283 "years": "{0} let",
4284 }
4286 meridians = {"am": "", "pm": "", "AM": "", "PM": ""}
4288 month_names = [
4289 "",
4290 "Januar",
4291 "Februar",
4292 "Marec",
4293 "April",
4294 "Maj",
4295 "Junij",
4296 "Julij",
4297 "Avgust",
4298 "September",
4299 "Oktober",
4300 "November",
4301 "December",
4302 ]
4304 month_abbreviations = [
4305 "",
4306 "Jan",
4307 "Feb",
4308 "Mar",
4309 "Apr",
4310 "Maj",
4311 "Jun",
4312 "Jul",
4313 "Avg",
4314 "Sep",
4315 "Okt",
4316 "Nov",
4317 "Dec",
4318 ]
4320 day_names = [
4321 "",
4322 "Ponedeljek",
4323 "Torek",
4324 "Sreda",
4325 "Četrtek",
4326 "Petek",
4327 "Sobota",
4328 "Nedelja",
4329 ]
4331 day_abbreviations = ["", "Pon", "Tor", "Sre", "Čet", "Pet", "Sob", "Ned"]
4334class IndonesianLocale(Locale):
4335 names = ["id", "id-id"]
4337 past = "{0} yang lalu"
4338 future = "dalam {0}"
4339 and_word = "dan"
4341 timeframes = {
4342 "now": "baru saja",
4343 "second": "1 sebentar",
4344 "seconds": "{0} detik",
4345 "minute": "1 menit",
4346 "minutes": "{0} menit",
4347 "hour": "1 jam",
4348 "hours": "{0} jam",
4349 "day": "1 hari",
4350 "days": "{0} hari",
4351 "week": "1 minggu",
4352 "weeks": "{0} minggu",
4353 "month": "1 bulan",
4354 "months": "{0} bulan",
4355 "quarter": "1 kuartal",
4356 "quarters": "{0} kuartal",
4357 "year": "1 tahun",
4358 "years": "{0} tahun",
4359 }
4361 meridians = {"am": "", "pm": "", "AM": "", "PM": ""}
4363 month_names = [
4364 "",
4365 "Januari",
4366 "Februari",
4367 "Maret",
4368 "April",
4369 "Mei",
4370 "Juni",
4371 "Juli",
4372 "Agustus",
4373 "September",
4374 "Oktober",
4375 "November",
4376 "Desember",
4377 ]
4379 month_abbreviations = [
4380 "",
4381 "Jan",
4382 "Feb",
4383 "Mar",
4384 "Apr",
4385 "Mei",
4386 "Jun",
4387 "Jul",
4388 "Ags",
4389 "Sept",
4390 "Okt",
4391 "Nov",
4392 "Des",
4393 ]
4395 day_names = ["", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu", "Minggu"]
4397 day_abbreviations = [
4398 "",
4399 "Senin",
4400 "Selasa",
4401 "Rabu",
4402 "Kamis",
4403 "Jumat",
4404 "Sabtu",
4405 "Minggu",
4406 ]
4409class NepaliLocale(Locale):
4410 names = ["ne", "ne-np"]
4412 past = "{0} पहिले"
4413 future = "{0} पछी"
4415 timeframes = {
4416 "now": "अहिले",
4417 "second": "एक सेकेन्ड",
4418 "seconds": "{0} सेकण्ड",
4419 "minute": "मिनेट",
4420 "minutes": "{0} मिनेट",
4421 "hour": "एक घण्टा",
4422 "hours": "{0} घण्टा",
4423 "day": "एक दिन",
4424 "days": "{0} दिन",
4425 "month": "एक महिना",
4426 "months": "{0} महिना",
4427 "year": "एक बर्ष",
4428 "years": "{0} बर्ष",
4429 }
4431 meridians = {"am": "पूर्वाह्न", "pm": "अपरान्ह", "AM": "पूर्वाह्न", "PM": "अपरान्ह"}
4433 month_names = [
4434 "",
4435 "जनवरी",
4436 "फेब्रुअरी",
4437 "मार्च",
4438 "एप्रील",
4439 "मे",
4440 "जुन",
4441 "जुलाई",
4442 "अगष्ट",
4443 "सेप्टेम्बर",
4444 "अक्टोबर",
4445 "नोवेम्बर",
4446 "डिसेम्बर",
4447 ]
4448 month_abbreviations = [
4449 "",
4450 "जन",
4451 "फेब",
4452 "मार्च",
4453 "एप्रील",
4454 "मे",
4455 "जुन",
4456 "जुलाई",
4457 "अग",
4458 "सेप",
4459 "अक्ट",
4460 "नोव",
4461 "डिस",
4462 ]
4464 day_names = [
4465 "",
4466 "सोमवार",
4467 "मंगलवार",
4468 "बुधवार",
4469 "बिहिवार",
4470 "शुक्रवार",
4471 "शनिवार",
4472 "आइतवार",
4473 ]
4475 day_abbreviations = ["", "सोम", "मंगल", "बुध", "बिहि", "शुक्र", "शनि", "आइत"]
4478class EstonianLocale(Locale):
4479 names = ["ee", "et"]
4481 past = "{0} tagasi"
4482 future = "{0} pärast"
4483 and_word = "ja"
4485 timeframes: ClassVar[Mapping[TimeFrameLiteral, Mapping[str, str]]] = {
4486 "now": {"past": "just nüüd", "future": "just nüüd"},
4487 "second": {"past": "üks sekund", "future": "ühe sekundi"},
4488 "seconds": {"past": "{0} sekundit", "future": "{0} sekundi"},
4489 "minute": {"past": "üks minut", "future": "ühe minuti"},
4490 "minutes": {"past": "{0} minutit", "future": "{0} minuti"},
4491 "hour": {"past": "tund aega", "future": "tunni aja"},
4492 "hours": {"past": "{0} tundi", "future": "{0} tunni"},
4493 "day": {"past": "üks päev", "future": "ühe päeva"},
4494 "days": {"past": "{0} päeva", "future": "{0} päeva"},
4495 "month": {"past": "üks kuu", "future": "ühe kuu"},
4496 "months": {"past": "{0} kuud", "future": "{0} kuu"},
4497 "year": {"past": "üks aasta", "future": "ühe aasta"},
4498 "years": {"past": "{0} aastat", "future": "{0} aasta"},
4499 }
4501 month_names = [
4502 "",
4503 "Jaanuar",
4504 "Veebruar",
4505 "Märts",
4506 "Aprill",
4507 "Mai",
4508 "Juuni",
4509 "Juuli",
4510 "August",
4511 "September",
4512 "Oktoober",
4513 "November",
4514 "Detsember",
4515 ]
4516 month_abbreviations = [
4517 "",
4518 "Jan",
4519 "Veb",
4520 "Mär",
4521 "Apr",
4522 "Mai",
4523 "Jun",
4524 "Jul",
4525 "Aug",
4526 "Sep",
4527 "Okt",
4528 "Nov",
4529 "Dets",
4530 ]
4532 day_names = [
4533 "",
4534 "Esmaspäev",
4535 "Teisipäev",
4536 "Kolmapäev",
4537 "Neljapäev",
4538 "Reede",
4539 "Laupäev",
4540 "Pühapäev",
4541 ]
4542 day_abbreviations = ["", "Esm", "Teis", "Kolm", "Nelj", "Re", "Lau", "Püh"]
4544 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
4545 form = self.timeframes[timeframe]
4546 if delta > 0:
4547 _form = form["future"]
4548 else:
4549 _form = form["past"]
4550 return _form.format(abs(delta))
4553class LatvianLocale(Locale):
4554 names = ["lv", "lv-lv"]
4556 past = "pirms {0}"
4557 future = "pēc {0}"
4558 and_word = "un"
4560 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
4561 "now": "tagad",
4562 "second": "sekundes",
4563 "seconds": "{0} sekundēm",
4564 "minute": "minūtes",
4565 "minutes": "{0} minūtēm",
4566 "hour": "stundas",
4567 "hours": "{0} stundām",
4568 "day": "dienas",
4569 "days": "{0} dienām",
4570 "week": "nedēļas",
4571 "weeks": "{0} nedēļām",
4572 "month": "mēneša",
4573 "months": "{0} mēnešiem",
4574 "year": "gada",
4575 "years": "{0} gadiem",
4576 }
4578 month_names = [
4579 "",
4580 "janvāris",
4581 "februāris",
4582 "marts",
4583 "aprīlis",
4584 "maijs",
4585 "jūnijs",
4586 "jūlijs",
4587 "augusts",
4588 "septembris",
4589 "oktobris",
4590 "novembris",
4591 "decembris",
4592 ]
4594 month_abbreviations = [
4595 "",
4596 "jan",
4597 "feb",
4598 "marts",
4599 "apr",
4600 "maijs",
4601 "jūnijs",
4602 "jūlijs",
4603 "aug",
4604 "sept",
4605 "okt",
4606 "nov",
4607 "dec",
4608 ]
4610 day_names = [
4611 "",
4612 "pirmdiena",
4613 "otrdiena",
4614 "trešdiena",
4615 "ceturtdiena",
4616 "piektdiena",
4617 "sestdiena",
4618 "svētdiena",
4619 ]
4621 day_abbreviations = [
4622 "",
4623 "pi",
4624 "ot",
4625 "tr",
4626 "ce",
4627 "pi",
4628 "se",
4629 "sv",
4630 ]
4633class SwahiliLocale(Locale):
4634 names = [
4635 "sw",
4636 "sw-ke",
4637 "sw-tz",
4638 ]
4640 past = "{0} iliyopita"
4641 future = "muda wa {0}"
4642 and_word = "na"
4644 timeframes = {
4645 "now": "sasa hivi",
4646 "second": "sekunde",
4647 "seconds": "sekunde {0}",
4648 "minute": "dakika moja",
4649 "minutes": "dakika {0}",
4650 "hour": "saa moja",
4651 "hours": "saa {0}",
4652 "day": "siku moja",
4653 "days": "siku {0}",
4654 "week": "wiki moja",
4655 "weeks": "wiki {0}",
4656 "month": "mwezi moja",
4657 "months": "miezi {0}",
4658 "year": "mwaka moja",
4659 "years": "miaka {0}",
4660 }
4662 meridians = {"am": "asu", "pm": "mch", "AM": "ASU", "PM": "MCH"}
4664 month_names = [
4665 "",
4666 "Januari",
4667 "Februari",
4668 "Machi",
4669 "Aprili",
4670 "Mei",
4671 "Juni",
4672 "Julai",
4673 "Agosti",
4674 "Septemba",
4675 "Oktoba",
4676 "Novemba",
4677 "Desemba",
4678 ]
4679 month_abbreviations = [
4680 "",
4681 "Jan",
4682 "Feb",
4683 "Mac",
4684 "Apr",
4685 "Mei",
4686 "Jun",
4687 "Jul",
4688 "Ago",
4689 "Sep",
4690 "Okt",
4691 "Nov",
4692 "Des",
4693 ]
4695 day_names = [
4696 "",
4697 "Jumatatu",
4698 "Jumanne",
4699 "Jumatano",
4700 "Alhamisi",
4701 "Ijumaa",
4702 "Jumamosi",
4703 "Jumapili",
4704 ]
4705 day_abbreviations = [
4706 "",
4707 "Jumatatu",
4708 "Jumanne",
4709 "Jumatano",
4710 "Alhamisi",
4711 "Ijumaa",
4712 "Jumamosi",
4713 "Jumapili",
4714 ]
4717class CroatianLocale(Locale):
4718 names = ["hr", "hr-hr"]
4720 past = "prije {0}"
4721 future = "za {0}"
4722 and_word = "i"
4724 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
4725 "now": "upravo sad",
4726 "second": "sekundu",
4727 "seconds": {"double": "{0} sekunde", "higher": "{0} sekundi"},
4728 "minute": "minutu",
4729 "minutes": {"double": "{0} minute", "higher": "{0} minuta"},
4730 "hour": "sat",
4731 "hours": {"double": "{0} sata", "higher": "{0} sati"},
4732 "day": "jedan dan",
4733 "days": {"double": "{0} dana", "higher": "{0} dana"},
4734 "week": "tjedan",
4735 "weeks": {"double": "{0} tjedna", "higher": "{0} tjedana"},
4736 "month": "mjesec",
4737 "months": {"double": "{0} mjeseca", "higher": "{0} mjeseci"},
4738 "year": "godinu",
4739 "years": {"double": "{0} godine", "higher": "{0} godina"},
4740 }
4742 month_names = [
4743 "",
4744 "siječanj",
4745 "veljača",
4746 "ožujak",
4747 "travanj",
4748 "svibanj",
4749 "lipanj",
4750 "srpanj",
4751 "kolovoz",
4752 "rujan",
4753 "listopad",
4754 "studeni",
4755 "prosinac",
4756 ]
4758 month_abbreviations = [
4759 "",
4760 "siječ",
4761 "velj",
4762 "ožuj",
4763 "trav",
4764 "svib",
4765 "lip",
4766 "srp",
4767 "kol",
4768 "ruj",
4769 "list",
4770 "stud",
4771 "pros",
4772 ]
4774 day_names = [
4775 "",
4776 "ponedjeljak",
4777 "utorak",
4778 "srijeda",
4779 "četvrtak",
4780 "petak",
4781 "subota",
4782 "nedjelja",
4783 ]
4785 day_abbreviations = [
4786 "",
4787 "po",
4788 "ut",
4789 "sr",
4790 "če",
4791 "pe",
4792 "su",
4793 "ne",
4794 ]
4796 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
4797 form = self.timeframes[timeframe]
4798 delta = abs(delta)
4799 if isinstance(form, Mapping):
4800 if 1 < delta <= 4:
4801 form = form["double"]
4802 else:
4803 form = form["higher"]
4805 return form.format(delta)
4808class LatinLocale(Locale):
4809 names = ["la", "la-va"]
4811 past = "ante {0}"
4812 future = "in {0}"
4813 and_word = "et"
4815 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
4816 "now": "nunc",
4817 "second": "secundum",
4818 "seconds": "{0} secundis",
4819 "minute": "minutam",
4820 "minutes": "{0} minutis",
4821 "hour": "horam",
4822 "hours": "{0} horas",
4823 "day": "diem",
4824 "days": "{0} dies",
4825 "week": "hebdomadem",
4826 "weeks": "{0} hebdomades",
4827 "month": "mensem",
4828 "months": "{0} mensis",
4829 "year": "annum",
4830 "years": "{0} annos",
4831 }
4833 month_names = [
4834 "",
4835 "Ianuarius",
4836 "Februarius",
4837 "Martius",
4838 "Aprilis",
4839 "Maius",
4840 "Iunius",
4841 "Iulius",
4842 "Augustus",
4843 "September",
4844 "October",
4845 "November",
4846 "December",
4847 ]
4849 month_abbreviations = [
4850 "",
4851 "Ian",
4852 "Febr",
4853 "Mart",
4854 "Apr",
4855 "Mai",
4856 "Iun",
4857 "Iul",
4858 "Aug",
4859 "Sept",
4860 "Oct",
4861 "Nov",
4862 "Dec",
4863 ]
4865 day_names = [
4866 "",
4867 "dies Lunae",
4868 "dies Martis",
4869 "dies Mercurii",
4870 "dies Iovis",
4871 "dies Veneris",
4872 "dies Saturni",
4873 "dies Solis",
4874 ]
4876 day_abbreviations = [
4877 "",
4878 "dies Lunae",
4879 "dies Martis",
4880 "dies Mercurii",
4881 "dies Iovis",
4882 "dies Veneris",
4883 "dies Saturni",
4884 "dies Solis",
4885 ]
4888class LithuanianLocale(Locale):
4889 names = ["lt", "lt-lt"]
4891 past = "prieš {0}"
4892 future = "po {0}"
4893 and_word = "ir"
4895 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
4896 "now": "dabar",
4897 "second": "sekundės",
4898 "seconds": "{0} sekundžių",
4899 "minute": "minutės",
4900 "minutes": "{0} minučių",
4901 "hour": "valandos",
4902 "hours": "{0} valandų",
4903 "day": "dieną",
4904 "days": "{0} dienų",
4905 "week": "savaitės",
4906 "weeks": "{0} savaičių",
4907 "month": "mėnesio",
4908 "months": "{0} mėnesių",
4909 "year": "metų",
4910 "years": "{0} metų",
4911 }
4913 month_names = [
4914 "",
4915 "sausis",
4916 "vasaris",
4917 "kovas",
4918 "balandis",
4919 "gegužė",
4920 "birželis",
4921 "liepa",
4922 "rugpjūtis",
4923 "rugsėjis",
4924 "spalis",
4925 "lapkritis",
4926 "gruodis",
4927 ]
4929 month_abbreviations = [
4930 "",
4931 "saus",
4932 "vas",
4933 "kovas",
4934 "bal",
4935 "geg",
4936 "birž",
4937 "liepa",
4938 "rugp",
4939 "rugs",
4940 "spalis",
4941 "lapkr",
4942 "gr",
4943 ]
4945 day_names = [
4946 "",
4947 "pirmadienis",
4948 "antradienis",
4949 "trečiadienis",
4950 "ketvirtadienis",
4951 "penktadienis",
4952 "šeštadienis",
4953 "sekmadienis",
4954 ]
4956 day_abbreviations = [
4957 "",
4958 "pi",
4959 "an",
4960 "tr",
4961 "ke",
4962 "pe",
4963 "še",
4964 "se",
4965 ]
4968class MalayLocale(Locale):
4969 names = ["ms", "ms-my", "ms-bn"]
4971 past = "{0} yang lalu"
4972 future = "dalam {0}"
4973 and_word = "dan"
4975 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
4976 "now": "sekarang",
4977 "second": "saat",
4978 "seconds": "{0} saat",
4979 "minute": "minit",
4980 "minutes": "{0} minit",
4981 "hour": "jam",
4982 "hours": "{0} jam",
4983 "day": "hari",
4984 "days": "{0} hari",
4985 "week": "minggu",
4986 "weeks": "{0} minggu",
4987 "month": "bulan",
4988 "months": "{0} bulan",
4989 "year": "tahun",
4990 "years": "{0} tahun",
4991 }
4993 month_names = [
4994 "",
4995 "Januari",
4996 "Februari",
4997 "Mac",
4998 "April",
4999 "Mei",
5000 "Jun",
5001 "Julai",
5002 "Ogos",
5003 "September",
5004 "Oktober",
5005 "November",
5006 "Disember",
5007 ]
5009 month_abbreviations = [
5010 "",
5011 "Jan.",
5012 "Feb.",
5013 "Mac",
5014 "Apr.",
5015 "Mei",
5016 "Jun",
5017 "Julai",
5018 "Og.",
5019 "Sept.",
5020 "Okt.",
5021 "Nov.",
5022 "Dis.",
5023 ]
5025 day_names = [
5026 "",
5027 "Isnin",
5028 "Selasa",
5029 "Rabu",
5030 "Khamis",
5031 "Jumaat",
5032 "Sabtu",
5033 "Ahad",
5034 ]
5036 day_abbreviations = [
5037 "",
5038 "Isnin",
5039 "Selasa",
5040 "Rabu",
5041 "Khamis",
5042 "Jumaat",
5043 "Sabtu",
5044 "Ahad",
5045 ]
5048class MalteseLocale(Locale):
5049 names = ["mt", "mt-mt"]
5051 past = "{0} ilu"
5052 future = "fi {0}"
5053 and_word = "u"
5055 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
5056 "now": "issa",
5057 "second": "sekonda",
5058 "seconds": "{0} sekondi",
5059 "minute": "minuta",
5060 "minutes": "{0} minuti",
5061 "hour": "siegħa",
5062 "hours": {"dual": "{0} sagħtejn", "plural": "{0} sigħat"},
5063 "day": "jum",
5064 "days": {"dual": "{0} jumejn", "plural": "{0} ijiem"},
5065 "week": "ġimgħa",
5066 "weeks": {"dual": "{0} ġimagħtejn", "plural": "{0} ġimgħat"},
5067 "month": "xahar",
5068 "months": {"dual": "{0} xahrejn", "plural": "{0} xhur"},
5069 "year": "sena",
5070 "years": {"dual": "{0} sentejn", "plural": "{0} snin"},
5071 }
5073 month_names = [
5074 "",
5075 "Jannar",
5076 "Frar",
5077 "Marzu",
5078 "April",
5079 "Mejju",
5080 "Ġunju",
5081 "Lulju",
5082 "Awwissu",
5083 "Settembru",
5084 "Ottubru",
5085 "Novembru",
5086 "Diċembru",
5087 ]
5089 month_abbreviations = [
5090 "",
5091 "Jan",
5092 "Fr",
5093 "Mar",
5094 "Apr",
5095 "Mejju",
5096 "Ġun",
5097 "Lul",
5098 "Aw",
5099 "Sett",
5100 "Ott",
5101 "Nov",
5102 "Diċ",
5103 ]
5105 day_names = [
5106 "",
5107 "It-Tnejn",
5108 "It-Tlieta",
5109 "L-Erbgħa",
5110 "Il-Ħamis",
5111 "Il-Ġimgħa",
5112 "Is-Sibt",
5113 "Il-Ħadd",
5114 ]
5116 day_abbreviations = [
5117 "",
5118 "T",
5119 "TL",
5120 "E",
5121 "Ħ",
5122 "Ġ",
5123 "S",
5124 "Ħ",
5125 ]
5127 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
5128 form = self.timeframes[timeframe]
5129 delta = abs(delta)
5130 if isinstance(form, Mapping):
5131 if delta == 2:
5132 form = form["dual"]
5133 else:
5134 form = form["plural"]
5136 return form.format(delta)
5139class SamiLocale(Locale):
5140 names = ["se", "se-fi", "se-no", "se-se"]
5142 past = "{0} dassái"
5143 future = "{0} " # NOTE: couldn't find preposition for Sami here, none needed?
5145 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
5146 "now": "dál",
5147 "second": "sekunda",
5148 "seconds": "{0} sekundda",
5149 "minute": "minuhta",
5150 "minutes": "{0} minuhta",
5151 "hour": "diimmu",
5152 "hours": "{0} diimmu",
5153 "day": "beaivvi",
5154 "days": "{0} beaivvi",
5155 "week": "vahku",
5156 "weeks": "{0} vahku",
5157 "month": "mánu",
5158 "months": "{0} mánu",
5159 "year": "jagi",
5160 "years": "{0} jagi",
5161 }
5163 month_names = [
5164 "",
5165 "Ođđajagimánnu",
5166 "Guovvamánnu",
5167 "Njukčamánnu",
5168 "Cuoŋománnu",
5169 "Miessemánnu",
5170 "Geassemánnu",
5171 "Suoidnemánnu",
5172 "Borgemánnu",
5173 "Čakčamánnu",
5174 "Golggotmánnu",
5175 "Skábmamánnu",
5176 "Juovlamánnu",
5177 ]
5179 month_abbreviations = [
5180 "",
5181 "Ođđajagimánnu",
5182 "Guovvamánnu",
5183 "Njukčamánnu",
5184 "Cuoŋománnu",
5185 "Miessemánnu",
5186 "Geassemánnu",
5187 "Suoidnemánnu",
5188 "Borgemánnu",
5189 "Čakčamánnu",
5190 "Golggotmánnu",
5191 "Skábmamánnu",
5192 "Juovlamánnu",
5193 ]
5195 day_names = [
5196 "",
5197 "Mánnodat",
5198 "Disdat",
5199 "Gaskavahkku",
5200 "Duorastat",
5201 "Bearjadat",
5202 "Lávvordat",
5203 "Sotnabeaivi",
5204 ]
5206 day_abbreviations = [
5207 "",
5208 "Mánnodat",
5209 "Disdat",
5210 "Gaskavahkku",
5211 "Duorastat",
5212 "Bearjadat",
5213 "Lávvordat",
5214 "Sotnabeaivi",
5215 ]
5218class OdiaLocale(Locale):
5219 names = ["or", "or-in"]
5221 past = "{0} ପୂର୍ବେ"
5222 future = "{0} ପରେ"
5224 timeframes = {
5225 "now": "ବର୍ତ୍ତମାନ",
5226 "second": "ଏକ ସେକେଣ୍ଡ",
5227 "seconds": "{0} ସେକେଣ୍ଡ",
5228 "minute": "ଏକ ମିନଟ",
5229 "minutes": "{0} ମିନଟ",
5230 "hour": "ଏକ ଘଣ୍ଟା",
5231 "hours": "{0} ଘଣ୍ଟା",
5232 "day": "ଏକ ଦିନ",
5233 "days": "{0} ଦିନ",
5234 "month": "ଏକ ମାସ",
5235 "months": "{0} ମାସ ",
5236 "year": "ଏକ ବର୍ଷ",
5237 "years": "{0} ବର୍ଷ",
5238 }
5240 meridians = {"am": "ପୂର୍ବାହ୍ନ", "pm": "ଅପରାହ୍ନ", "AM": "ପୂର୍ବାହ୍ନ", "PM": "ଅପରାହ୍ନ"}
5242 month_names = [
5243 "",
5244 "ଜାନୁଆରୀ",
5245 "ଫେବୃଆରୀ",
5246 "ମାର୍ଚ୍ଚ୍",
5247 "ଅପ୍ରେଲ",
5248 "ମଇ",
5249 "ଜୁନ୍",
5250 "ଜୁଲାଇ",
5251 "ଅଗଷ୍ଟ",
5252 "ସେପ୍ଟେମ୍ବର",
5253 "ଅକ୍ଟୋବର୍",
5254 "ନଭେମ୍ବର୍",
5255 "ଡିସେମ୍ବର୍",
5256 ]
5257 month_abbreviations = [
5258 "",
5259 "ଜାନୁ",
5260 "ଫେବୃ",
5261 "ମାର୍ଚ୍ଚ୍",
5262 "ଅପ୍ରେ",
5263 "ମଇ",
5264 "ଜୁନ୍",
5265 "ଜୁଲା",
5266 "ଅଗ",
5267 "ସେପ୍ଟେ",
5268 "ଅକ୍ଟୋ",
5269 "ନଭେ",
5270 "ଡିସେ",
5271 ]
5273 day_names = [
5274 "",
5275 "ସୋମବାର",
5276 "ମଙ୍ଗଳବାର",
5277 "ବୁଧବାର",
5278 "ଗୁରୁବାର",
5279 "ଶୁକ୍ରବାର",
5280 "ଶନିବାର",
5281 "ରବିବାର",
5282 ]
5283 day_abbreviations = [
5284 "",
5285 "ସୋମ",
5286 "ମଙ୍ଗଳ",
5287 "ବୁଧ",
5288 "ଗୁରୁ",
5289 "ଶୁକ୍ର",
5290 "ଶନି",
5291 "ରବି",
5292 ]
5294 def _ordinal_number(self, n: int) -> str:
5295 if n > 10 or n == 0:
5296 return f"{n}ତମ"
5297 if n in [1, 5, 7, 8, 9, 10]:
5298 return f"{n}ମ"
5299 if n in [2, 3]:
5300 return f"{n}ୟ"
5301 if n == 4:
5302 return f"{n}ର୍ଥ"
5303 if n == 6:
5304 return f"{n}ଷ୍ଠ"
5305 return ""
5308class SerbianLocale(Locale):
5309 names = ["sr", "sr-rs", "sr-sp"]
5311 past = "pre {0}"
5312 future = "za {0}"
5313 and_word = "i"
5315 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
5316 "now": "sada",
5317 "second": "sekundu",
5318 "seconds": {"double": "{0} sekunde", "higher": "{0} sekundi"},
5319 "minute": "minutu",
5320 "minutes": {"double": "{0} minute", "higher": "{0} minuta"},
5321 "hour": "sat",
5322 "hours": {"double": "{0} sata", "higher": "{0} sati"},
5323 "day": "dan",
5324 "days": {"double": "{0} dana", "higher": "{0} dana"},
5325 "week": "nedelju",
5326 "weeks": {"double": "{0} nedelje", "higher": "{0} nedelja"},
5327 "month": "mesec",
5328 "months": {"double": "{0} meseca", "higher": "{0} meseci"},
5329 "year": "godinu",
5330 "years": {"double": "{0} godine", "higher": "{0} godina"},
5331 }
5333 month_names = [
5334 "",
5335 "januar", # јануар
5336 "februar", # фебруар
5337 "mart", # март
5338 "april", # април
5339 "maj", # мај
5340 "jun", # јун
5341 "jul", # јул
5342 "avgust", # август
5343 "septembar", # септембар
5344 "oktobar", # октобар
5345 "novembar", # новембар
5346 "decembar", # децембар
5347 ]
5349 month_abbreviations = [
5350 "",
5351 "jan",
5352 "feb",
5353 "mar",
5354 "apr",
5355 "maj",
5356 "jun",
5357 "jul",
5358 "avg",
5359 "sep",
5360 "okt",
5361 "nov",
5362 "dec",
5363 ]
5365 day_names = [
5366 "",
5367 "ponedeljak", # понедељак
5368 "utorak", # уторак
5369 "sreda", # среда
5370 "četvrtak", # четвртак
5371 "petak", # петак
5372 "subota", # субота
5373 "nedelja", # недеља
5374 ]
5376 day_abbreviations = [
5377 "",
5378 "po", # по
5379 "ut", # ут
5380 "sr", # ср
5381 "če", # че
5382 "pe", # пе
5383 "su", # су
5384 "ne", # не
5385 ]
5387 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
5388 form = self.timeframes[timeframe]
5389 delta = abs(delta)
5390 if isinstance(form, Mapping):
5391 if 1 < delta <= 4:
5392 form = form["double"]
5393 else:
5394 form = form["higher"]
5396 return form.format(delta)
5399class LuxembourgishLocale(Locale):
5400 names = ["lb", "lb-lu"]
5402 past = "virun {0}"
5403 future = "an {0}"
5404 and_word = "an"
5406 timeframes: ClassVar[Dict[TimeFrameLiteral, str]] = {
5407 "now": "just elo",
5408 "second": "enger Sekonn",
5409 "seconds": "{0} Sekonnen",
5410 "minute": "enger Minutt",
5411 "minutes": "{0} Minutten",
5412 "hour": "enger Stonn",
5413 "hours": "{0} Stonnen",
5414 "day": "engem Dag",
5415 "days": "{0} Deeg",
5416 "week": "enger Woch",
5417 "weeks": "{0} Wochen",
5418 "month": "engem Mount",
5419 "months": "{0} Méint",
5420 "year": "engem Joer",
5421 "years": "{0} Jahren",
5422 }
5424 timeframes_only_distance = timeframes.copy()
5425 timeframes_only_distance["second"] = "eng Sekonn"
5426 timeframes_only_distance["minute"] = "eng Minutt"
5427 timeframes_only_distance["hour"] = "eng Stonn"
5428 timeframes_only_distance["day"] = "een Dag"
5429 timeframes_only_distance["days"] = "{0} Deeg"
5430 timeframes_only_distance["week"] = "eng Woch"
5431 timeframes_only_distance["month"] = "ee Mount"
5432 timeframes_only_distance["months"] = "{0} Méint"
5433 timeframes_only_distance["year"] = "ee Joer"
5434 timeframes_only_distance["years"] = "{0} Joer"
5436 month_names = [
5437 "",
5438 "Januar",
5439 "Februar",
5440 "Mäerz",
5441 "Abrëll",
5442 "Mee",
5443 "Juni",
5444 "Juli",
5445 "August",
5446 "September",
5447 "Oktouber",
5448 "November",
5449 "Dezember",
5450 ]
5452 month_abbreviations = [
5453 "",
5454 "Jan",
5455 "Feb",
5456 "Mäe",
5457 "Abr",
5458 "Mee",
5459 "Jun",
5460 "Jul",
5461 "Aug",
5462 "Sep",
5463 "Okt",
5464 "Nov",
5465 "Dez",
5466 ]
5468 day_names = [
5469 "",
5470 "Méindeg",
5471 "Dënschdeg",
5472 "Mëttwoch",
5473 "Donneschdeg",
5474 "Freideg",
5475 "Samschdeg",
5476 "Sonndeg",
5477 ]
5479 day_abbreviations = ["", "Méi", "Dën", "Mët", "Don", "Fre", "Sam", "Son"]
5481 def _ordinal_number(self, n: int) -> str:
5482 return f"{n}."
5484 def describe(
5485 self,
5486 timeframe: TimeFrameLiteral,
5487 delta: Union[int, float] = 0,
5488 only_distance: bool = False,
5489 ) -> str:
5490 if not only_distance:
5491 return super().describe(timeframe, delta, only_distance)
5493 # Luxembourgish uses a different case without 'in' or 'ago'
5494 humanized: str = self.timeframes_only_distance[timeframe].format(
5495 trunc(abs(delta))
5496 )
5498 return humanized
5501class ZuluLocale(Locale):
5502 names = ["zu", "zu-za"]
5504 past = "{0} edlule"
5505 future = "{0} "
5506 and_word = "futhi"
5508 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[Mapping[str, str], str]]] = {
5509 "now": "manje",
5510 "second": {"past": "umzuzwana", "future": "ngomzuzwana"},
5511 "seconds": {"past": "{0} imizuzwana", "future": "{0} ngemizuzwana"},
5512 "minute": {"past": "umzuzu", "future": "ngomzuzu"},
5513 "minutes": {"past": "{0} imizuzu", "future": "{0} ngemizuzu"},
5514 "hour": {"past": "ihora", "future": "ngehora"},
5515 "hours": {"past": "{0} amahora", "future": "{0} emahoreni"},
5516 "day": {"past": "usuku", "future": "ngosuku"},
5517 "days": {"past": "{0} izinsuku", "future": "{0} ezinsukwini"},
5518 "week": {"past": "isonto", "future": "ngesonto"},
5519 "weeks": {"past": "{0} amasonto", "future": "{0} emasontweni"},
5520 "month": {"past": "inyanga", "future": "ngenyanga"},
5521 "months": {"past": "{0} izinyanga", "future": "{0} ezinyangeni"},
5522 "year": {"past": "unyaka", "future": "ngonyak"},
5523 "years": {"past": "{0} iminyaka", "future": "{0} eminyakeni"},
5524 }
5526 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
5527 """Zulu aware time frame format function, takes into account
5528 the differences between past and future forms."""
5529 abs_delta = abs(delta)
5530 form = self.timeframes[timeframe]
5532 if isinstance(form, str):
5533 return form.format(abs_delta)
5535 if delta > 0:
5536 key = "future"
5537 else:
5538 key = "past"
5539 form = form[key]
5541 return form.format(abs_delta)
5543 month_names = [
5544 "",
5545 "uMasingane",
5546 "uNhlolanja",
5547 "uNdasa",
5548 "UMbasa",
5549 "UNhlaba",
5550 "UNhlangulana",
5551 "uNtulikazi",
5552 "UNcwaba",
5553 "uMandulo",
5554 "uMfumfu",
5555 "uLwezi",
5556 "uZibandlela",
5557 ]
5559 month_abbreviations = [
5560 "",
5561 "uMasingane",
5562 "uNhlolanja",
5563 "uNdasa",
5564 "UMbasa",
5565 "UNhlaba",
5566 "UNhlangulana",
5567 "uNtulikazi",
5568 "UNcwaba",
5569 "uMandulo",
5570 "uMfumfu",
5571 "uLwezi",
5572 "uZibandlela",
5573 ]
5575 day_names = [
5576 "",
5577 "uMsombuluko",
5578 "uLwesibili",
5579 "uLwesithathu",
5580 "uLwesine",
5581 "uLwesihlanu",
5582 "uMgqibelo",
5583 "iSonto",
5584 ]
5586 day_abbreviations = [
5587 "",
5588 "uMsombuluko",
5589 "uLwesibili",
5590 "uLwesithathu",
5591 "uLwesine",
5592 "uLwesihlanu",
5593 "uMgqibelo",
5594 "iSonto",
5595 ]
5598class TamilLocale(Locale):
5599 names = ["ta", "ta-in", "ta-lk"]
5601 past = "{0} நேரத்திற்கு முன்பு"
5602 future = "இல் {0}"
5604 timeframes = {
5605 "now": "இப்போது",
5606 "second": "ஒரு இரண்டாவது",
5607 "seconds": "{0} விநாடிகள்",
5608 "minute": "ஒரு நிமிடம்",
5609 "minutes": "{0} நிமிடங்கள்",
5610 "hour": "ஒரு மணி",
5611 "hours": "{0} மணிநேரம்",
5612 "day": "ஒரு நாள்",
5613 "days": "{0} நாட்கள்",
5614 "week": "ஒரு வாரம்",
5615 "weeks": "{0} வாரங்கள்",
5616 "month": "ஒரு மாதம்",
5617 "months": "{0} மாதங்கள்",
5618 "year": "ஒரு ஆண்டு",
5619 "years": "{0} ஆண்டுகள்",
5620 }
5622 month_names = [
5623 "",
5624 "சித்திரை",
5625 "வைகாசி",
5626 "ஆனி",
5627 "ஆடி",
5628 "ஆவணி",
5629 "புரட்டாசி",
5630 "ஐப்பசி",
5631 "கார்த்திகை",
5632 "மார்கழி",
5633 "தை",
5634 "மாசி",
5635 "பங்குனி",
5636 ]
5638 month_abbreviations = [
5639 "",
5640 "ஜன",
5641 "பிப்",
5642 "மார்",
5643 "ஏப்",
5644 "மே",
5645 "ஜூன்",
5646 "ஜூலை",
5647 "ஆக",
5648 "செப்",
5649 "அக்",
5650 "நவ",
5651 "டிச",
5652 ]
5654 day_names = [
5655 "",
5656 "திங்கட்கிழமை",
5657 "செவ்வாய்க்கிழமை",
5658 "புதன்கிழமை",
5659 "வியாழக்கிழமை",
5660 "வெள்ளிக்கிழமை",
5661 "சனிக்கிழமை",
5662 "ஞாயிற்றுக்கிழமை",
5663 ]
5665 day_abbreviations = [
5666 "",
5667 "திங்கட்",
5668 "செவ்வாய்",
5669 "புதன்",
5670 "வியாழன்",
5671 "வெள்ளி",
5672 "சனி",
5673 "ஞாயிறு",
5674 ]
5676 def _ordinal_number(self, n: int) -> str:
5677 if n == 1:
5678 return f"{n}வது"
5679 elif n >= 0:
5680 return f"{n}ஆம்"
5681 else:
5682 return ""
5685class AlbanianLocale(Locale):
5686 names = ["sq", "sq-al"]
5688 past = "{0} më parë"
5689 future = "në {0}"
5690 and_word = "dhe"
5692 timeframes = {
5693 "now": "tani",
5694 "second": "sekondë",
5695 "seconds": "{0} sekonda",
5696 "minute": "minutë",
5697 "minutes": "{0} minuta",
5698 "hour": "orë",
5699 "hours": "{0} orë",
5700 "day": "ditë",
5701 "days": "{0} ditë",
5702 "week": "javë",
5703 "weeks": "{0} javë",
5704 "month": "muaj",
5705 "months": "{0} muaj",
5706 "year": "vit",
5707 "years": "{0} vjet",
5708 }
5710 month_names = [
5711 "",
5712 "janar",
5713 "shkurt",
5714 "mars",
5715 "prill",
5716 "maj",
5717 "qershor",
5718 "korrik",
5719 "gusht",
5720 "shtator",
5721 "tetor",
5722 "nëntor",
5723 "dhjetor",
5724 ]
5726 month_abbreviations = [
5727 "",
5728 "jan",
5729 "shk",
5730 "mar",
5731 "pri",
5732 "maj",
5733 "qer",
5734 "korr",
5735 "gush",
5736 "sht",
5737 "tet",
5738 "nën",
5739 "dhj",
5740 ]
5742 day_names = [
5743 "",
5744 "e hënë",
5745 "e martë",
5746 "e mërkurë",
5747 "e enjte",
5748 "e premte",
5749 "e shtunë",
5750 "e diel",
5751 ]
5753 day_abbreviations = [
5754 "",
5755 "hën",
5756 "mar",
5757 "mër",
5758 "enj",
5759 "pre",
5760 "sht",
5761 "die",
5762 ]
5765class GeorgianLocale(Locale):
5766 names = ["ka", "ka-ge"]
5768 past = "{0} წინ" # ts’in
5769 future = "{0} შემდეგ" # shemdeg
5770 and_word = "და" # da
5772 timeframes = {
5773 "now": "ახლა", # akhla
5774 # When a cardinal qualifies a noun, it stands in the singular
5775 "second": "წამის", # ts’amis
5776 "seconds": "{0} წამის",
5777 "minute": "წუთის", # ts’utis
5778 "minutes": "{0} წუთის",
5779 "hour": "საათის", # saatis
5780 "hours": "{0} საათის",
5781 "day": "დღის", # dghis
5782 "days": "{0} დღის",
5783 "week": "კვირის", # k’viris
5784 "weeks": "{0} კვირის",
5785 "month": "თვის", # tvis
5786 "months": "{0} თვის",
5787 "year": "წლის", # ts’lis
5788 "years": "{0} წლის",
5789 }
5791 month_names = [
5792 # modern month names
5793 "",
5794 "იანვარი", # Ianvari
5795 "თებერვალი", # Tebervali
5796 "მარტი", # Mart'i
5797 "აპრილი", # Ap'rili
5798 "მაისი", # Maisi
5799 "ივნისი", # Ivnisi
5800 "ივლისი", # Ivlisi
5801 "აგვისტო", # Agvist'o
5802 "სექტემბერი", # Sekt'emberi
5803 "ოქტომბერი", # Okt'omberi
5804 "ნოემბერი", # Noemberi
5805 "დეკემბერი", # Dek'emberi
5806 ]
5808 month_abbreviations = [
5809 # no abbr. found yet
5810 "",
5811 "იანვარი", # Ianvari
5812 "თებერვალი", # Tebervali
5813 "მარტი", # Mart'i
5814 "აპრილი", # Ap'rili
5815 "მაისი", # Maisi
5816 "ივნისი", # Ivnisi
5817 "ივლისი", # Ivlisi
5818 "აგვისტო", # Agvist'o
5819 "სექტემბერი", # Sekt'emberi
5820 "ოქტომბერი", # Okt'omberi
5821 "ნოემბერი", # Noemberi
5822 "დეკემბერი", # Dek'emberi
5823 ]
5825 day_names = [
5826 "",
5827 "ორშაბათი", # orshabati
5828 "სამშაბათი", # samshabati
5829 "ოთხშაბათი", # otkhshabati
5830 "ხუთშაბათი", # khutshabati
5831 "პარასკევი", # p’arask’evi
5832 "შაბათი", # shabati
5833 # "k’vira" also serves as week; to avoid confusion "k’vira-dge" can be used for Sunday
5834 "კვირა", # k’vira
5835 ]
5837 day_abbreviations = [
5838 "",
5839 "ორშაბათი", # orshabati
5840 "სამშაბათი", # samshabati
5841 "ოთხშაბათი", # otkhshabati
5842 "ხუთშაბათი", # khutshabati
5843 "პარასკევი", # p’arask’evi
5844 "შაბათი", # shabati
5845 "კვირა", # k’vira
5846 ]
5849class SinhalaLocale(Locale):
5850 names = ["si", "si-lk"]
5852 past = "{0}ට පෙර"
5853 future = "{0}"
5854 and_word = "සහ"
5856 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[Mapping[str, str], str]]] = {
5857 "now": "දැන්",
5858 "second": {
5859 "past": "තත්පරයක",
5860 "future": "තත්පරයකින්",
5861 }, # ක් is the article
5862 "seconds": {
5863 "past": "තත්පර {0} ක",
5864 "future": "තත්පර {0} කින්",
5865 },
5866 "minute": {
5867 "past": "විනාඩියක",
5868 "future": "විනාඩියකින්",
5869 },
5870 "minutes": {
5871 "past": "විනාඩි {0} ක",
5872 "future": "මිනිත්තු {0} කින්",
5873 },
5874 "hour": {"past": "පැයක", "future": "පැයකින්"},
5875 "hours": {
5876 "past": "පැය {0} ක",
5877 "future": "පැය {0} කින්",
5878 },
5879 "day": {"past": "දිනක", "future": "දිනකට"},
5880 "days": {
5881 "past": "දින {0} ක",
5882 "future": "දින {0} කින්",
5883 },
5884 "week": {"past": "සතියක", "future": "සතියකින්"},
5885 "weeks": {
5886 "past": "සති {0} ක",
5887 "future": "සති {0} කින්",
5888 },
5889 "month": {"past": "මාසයක", "future": "එය මාසය තුළ"},
5890 "months": {
5891 "past": "මාස {0} ක",
5892 "future": "මාස {0} කින්",
5893 },
5894 "year": {"past": "වසරක", "future": "වසරක් තුළ"},
5895 "years": {
5896 "past": "අවුරුදු {0} ක",
5897 "future": "අවුරුදු {0} තුළ",
5898 },
5899 }
5900 # Sinhala: the general format to describe timeframe is different from past and future,
5901 # so we do not copy the original timeframes dictionary
5902 timeframes_only_distance = {}
5903 timeframes_only_distance["second"] = "තත්පරයක්"
5904 timeframes_only_distance["seconds"] = "තත්පර {0}"
5905 timeframes_only_distance["minute"] = "මිනිත්තුවක්"
5906 timeframes_only_distance["minutes"] = "විනාඩි {0}"
5907 timeframes_only_distance["hour"] = "පැයක්"
5908 timeframes_only_distance["hours"] = "පැය {0}"
5909 timeframes_only_distance["day"] = "දවසක්"
5910 timeframes_only_distance["days"] = "දවස් {0}"
5911 timeframes_only_distance["week"] = "සතියක්"
5912 timeframes_only_distance["weeks"] = "සති {0}"
5913 timeframes_only_distance["month"] = "මාසයක්"
5914 timeframes_only_distance["months"] = "මාස {0}"
5915 timeframes_only_distance["year"] = "අවුරුද්දක්"
5916 timeframes_only_distance["years"] = "අවුරුදු {0}"
5918 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
5919 """
5920 Sinhala awares time frame format function, takes into account
5921 the differences between general, past, and future forms (three different suffixes).
5922 """
5923 abs_delta = abs(delta)
5924 form = self.timeframes[timeframe]
5926 if isinstance(form, str):
5927 return form.format(abs_delta)
5929 if delta > 0:
5930 key = "future"
5931 else:
5932 key = "past"
5933 form = form[key]
5935 return form.format(abs_delta)
5937 def describe(
5938 self,
5939 timeframe: TimeFrameLiteral,
5940 delta: Union[float, int] = 1, # key is always future when only_distance=False
5941 only_distance: bool = False,
5942 ) -> str:
5943 """Describes a delta within a timeframe in plain language.
5945 :param timeframe: a string representing a timeframe.
5946 :param delta: a quantity representing a delta in a timeframe.
5947 :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords
5948 """
5950 if not only_distance:
5951 return super().describe(timeframe, delta, only_distance)
5952 # Sinhala uses a different case without 'in' or 'ago'
5953 humanized = self.timeframes_only_distance[timeframe].format(trunc(abs(delta)))
5955 return humanized
5957 month_names = [
5958 "",
5959 "ජනවාරි",
5960 "පෙබරවාරි",
5961 "මාර්තු",
5962 "අප්රේල්",
5963 "මැයි",
5964 "ජූනි",
5965 "ජූලි",
5966 "අගෝස්තු",
5967 "සැප්තැම්බර්",
5968 "ඔක්තෝබර්",
5969 "නොවැම්බර්",
5970 "දෙසැම්බර්",
5971 ]
5973 month_abbreviations = [
5974 "",
5975 "ජන",
5976 "පෙබ",
5977 "මාර්",
5978 "අප්රේ",
5979 "මැයි",
5980 "ජුනි",
5981 "ජූලි",
5982 "අගෝ",
5983 "සැප්",
5984 "ඔක්",
5985 "නොවැ",
5986 "දෙසැ",
5987 ]
5989 day_names = [
5990 "",
5991 "සදුදා",
5992 "අඟහරැවදා",
5993 "බදාදා",
5994 "බ්රහස්පතින්දා",
5995 "සිකුරාදා",
5996 "සෙනසුරාදා",
5997 "ඉරිදා",
5998 ]
6000 day_abbreviations = [
6001 "",
6002 "සදුද",
6003 "බදා",
6004 "බදා",
6005 "සිකු",
6006 "සෙන",
6007 "අ",
6008 "ඉරිදා",
6009 ]
6012class UrduLocale(Locale):
6013 names = ["ur", "ur-pk"]
6015 past = "پہلے {0}"
6016 future = "میں {0}"
6017 and_word = "اور"
6019 timeframes = {
6020 "now": "ابھی",
6021 "second": "ایک سیکنڈ",
6022 "seconds": "{0} سیکنڈ",
6023 "minute": "ایک منٹ",
6024 "minutes": "{0} منٹ",
6025 "hour": "ایک گھنٹے",
6026 "hours": "{0} گھنٹے",
6027 "day": "ایک دن",
6028 "days": "{0} دن",
6029 "week": "ایک ہفتے",
6030 "weeks": "{0} ہفتے",
6031 "month": "ایک مہینہ",
6032 "months": "{0} ماہ",
6033 "year": "ایک سال",
6034 "years": "{0} سال",
6035 }
6037 month_names = [
6038 "",
6039 "جنوری",
6040 "فروری",
6041 "مارچ",
6042 "اپریل",
6043 "مئی",
6044 "جون",
6045 "جولائی",
6046 "اگست",
6047 "ستمبر",
6048 "اکتوبر",
6049 "نومبر",
6050 "دسمبر",
6051 ]
6053 month_abbreviations = [
6054 "",
6055 "جنوری",
6056 "فروری",
6057 "مارچ",
6058 "اپریل",
6059 "مئی",
6060 "جون",
6061 "جولائی",
6062 "اگست",
6063 "ستمبر",
6064 "اکتوبر",
6065 "نومبر",
6066 "دسمبر",
6067 ]
6069 day_names = [
6070 "",
6071 "سوموار",
6072 "منگل",
6073 "بدھ",
6074 "جمعرات",
6075 "جمعہ",
6076 "ہفتہ",
6077 "اتوار",
6078 ]
6080 day_abbreviations = [
6081 "",
6082 "سوموار",
6083 "منگل",
6084 "بدھ",
6085 "جمعرات",
6086 "جمعہ",
6087 "ہفتہ",
6088 "اتوار",
6089 ]
6092class KazakhLocale(Locale):
6093 names = ["kk", "kk-kz"]
6095 past = "{0} бұрын"
6096 future = "{0} кейін"
6097 timeframes = {
6098 "now": "қазір",
6099 "second": "бір секунд",
6100 "seconds": "{0} секунд",
6101 "minute": "бір минут",
6102 "minutes": "{0} минут",
6103 "hour": "бір сағат",
6104 "hours": "{0} сағат",
6105 "day": "бір күн",
6106 "days": "{0} күн",
6107 "week": "бір апта",
6108 "weeks": "{0} апта",
6109 "month": "бір ай",
6110 "months": "{0} ай",
6111 "year": "бір жыл",
6112 "years": "{0} жыл",
6113 }
6115 month_names = [
6116 "",
6117 "Қаңтар",
6118 "Ақпан",
6119 "Наурыз",
6120 "Сәуір",
6121 "Мамыр",
6122 "Маусым",
6123 "Шілде",
6124 "Тамыз",
6125 "Қыркүйек",
6126 "Қазан",
6127 "Қараша",
6128 "Желтоқсан",
6129 ]
6130 month_abbreviations = [
6131 "",
6132 "Қан",
6133 "Ақп",
6134 "Нау",
6135 "Сәу",
6136 "Мам",
6137 "Мау",
6138 "Шіл",
6139 "Там",
6140 "Қыр",
6141 "Қаз",
6142 "Қар",
6143 "Жел",
6144 ]
6146 day_names = [
6147 "",
6148 "Дүйсембі",
6149 "Сейсенбі",
6150 "Сәрсенбі",
6151 "Бейсенбі",
6152 "Жұма",
6153 "Сенбі",
6154 "Жексенбі",
6155 ]
6156 day_abbreviations = ["", "Дс", "Сс", "Ср", "Бс", "Жм", "Сб", "Жс"]
6159class AmharicLocale(Locale):
6160 names = ["am", "am-et"]
6162 past = "{0} በፊት"
6163 future = "{0} ውስጥ"
6164 and_word = "እና"
6166 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[Mapping[str, str], str]]] = {
6167 "now": "አሁን",
6168 "second": {
6169 "past": "ከአንድ ሰከንድ",
6170 "future": "በአንድ ሰከንድ",
6171 },
6172 "seconds": {
6173 "past": "ከ {0} ሰከንድ",
6174 "future": "በ {0} ሰከንድ",
6175 },
6176 "minute": {
6177 "past": "ከአንድ ደቂቃ",
6178 "future": "በአንድ ደቂቃ",
6179 },
6180 "minutes": {
6181 "past": "ከ {0} ደቂቃዎች",
6182 "future": "በ {0} ደቂቃዎች",
6183 },
6184 "hour": {
6185 "past": "ከአንድ ሰዓት",
6186 "future": "በአንድ ሰዓት",
6187 },
6188 "hours": {
6189 "past": "ከ {0} ሰዓታት",
6190 "future": "በ {0} ሰከንድ",
6191 },
6192 "day": {
6193 "past": "ከአንድ ቀን",
6194 "future": "በአንድ ቀን",
6195 },
6196 "days": {
6197 "past": "ከ {0} ቀናት",
6198 "future": "በ {0} ቀናት",
6199 },
6200 "week": {
6201 "past": "ከአንድ ሳምንት",
6202 "future": "በአንድ ሳምንት",
6203 },
6204 "weeks": {
6205 "past": "ከ {0} ሳምንታት",
6206 "future": "በ {0} ሳምንታት",
6207 },
6208 "month": {
6209 "past": "ከአንድ ወር",
6210 "future": "በአንድ ወር",
6211 },
6212 "months": {
6213 "past": "ከ {0} ወር",
6214 "future": "በ {0} ወራት",
6215 },
6216 "year": {
6217 "past": "ከአንድ አመት",
6218 "future": "በአንድ አመት",
6219 },
6220 "years": {
6221 "past": "ከ {0} ዓመታት",
6222 "future": "በ {0} ዓመታት",
6223 },
6224 }
6225 # Amharic: the general format to describe timeframe is different from past and future,
6226 # so we do not copy the original timeframes dictionary
6227 timeframes_only_distance = {
6228 "second": "አንድ ሰከንድ",
6229 "seconds": "{0} ሰከንድ",
6230 "minute": "አንድ ደቂቃ",
6231 "minutes": "{0} ደቂቃዎች",
6232 "hour": "አንድ ሰዓት",
6233 "hours": "{0} ሰዓት",
6234 "day": "አንድ ቀን",
6235 "days": "{0} ቀናት",
6236 "week": "አንድ ሳምንት",
6237 "weeks": "{0} ሳምንት",
6238 "month": "አንድ ወር",
6239 "months": "{0} ወራት",
6240 "year": "አንድ አመት",
6241 "years": "{0} ዓመታት",
6242 }
6244 month_names = [
6245 "",
6246 "ጃንዩወሪ",
6247 "ፌብሩወሪ",
6248 "ማርች",
6249 "ኤፕሪል",
6250 "ሜይ",
6251 "ጁን",
6252 "ጁላይ",
6253 "ኦገስት",
6254 "ሴፕቴምበር",
6255 "ኦክቶበር",
6256 "ኖቬምበር",
6257 "ዲሴምበር",
6258 ]
6260 month_abbreviations = [
6261 "",
6262 "ጃንዩ",
6263 "ፌብሩ",
6264 "ማርች",
6265 "ኤፕሪ",
6266 "ሜይ",
6267 "ጁን",
6268 "ጁላይ",
6269 "ኦገስ",
6270 "ሴፕቴ",
6271 "ኦክቶ",
6272 "ኖቬም",
6273 "ዲሴም",
6274 ]
6276 day_names = [
6277 "",
6278 "ሰኞ",
6279 "ማክሰኞ",
6280 "ረቡዕ",
6281 "ሐሙስ",
6282 "ዓርብ",
6283 "ቅዳሜ",
6284 "እሑድ",
6285 ]
6286 day_abbreviations = ["", "እ", "ሰ", "ማ", "ረ", "ሐ", "ዓ", "ቅ"]
6288 def _ordinal_number(self, n: int) -> str:
6289 return f"{n}ኛ"
6291 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
6292 """
6293 Amharic awares time frame format function, takes into account
6294 the differences between general, past, and future forms (three different suffixes).
6295 """
6296 abs_delta = abs(delta)
6297 form = self.timeframes[timeframe]
6299 if isinstance(form, str):
6300 return form.format(abs_delta)
6302 if delta > 0:
6303 key = "future"
6304 else:
6305 key = "past"
6306 form = form[key]
6308 return form.format(abs_delta)
6310 def describe(
6311 self,
6312 timeframe: TimeFrameLiteral,
6313 delta: Union[float, int] = 1, # key is always future when only_distance=False
6314 only_distance: bool = False,
6315 ) -> str:
6316 """Describes a delta within a timeframe in plain language.
6318 :param timeframe: a string representing a timeframe.
6319 :param delta: a quantity representing a delta in a timeframe.
6320 :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords
6321 """
6323 if not only_distance:
6324 return super().describe(timeframe, delta, only_distance)
6325 humanized = self.timeframes_only_distance[timeframe].format(trunc(abs(delta)))
6327 return humanized
6330class ArmenianLocale(Locale):
6331 names = ["hy", "hy-am"]
6332 past = "{0} առաջ"
6333 future = "{0}ից"
6334 and_word = "Եվ" # Yev
6336 timeframes = {
6337 "now": "հիմա",
6338 "second": "վայրկյան",
6339 "seconds": "{0} վայրկյան",
6340 "minute": "րոպե",
6341 "minutes": "{0} րոպե",
6342 "hour": "ժամ",
6343 "hours": "{0} ժամ",
6344 "day": "օր",
6345 "days": "{0} օր",
6346 "month": "ամիս",
6347 "months": "{0} ամիս",
6348 "year": "տարին",
6349 "years": "{0} տարին",
6350 "week": "շաբաթ",
6351 "weeks": "{0} շաբաթ",
6352 }
6354 meridians = {
6355 "am": "Ամ",
6356 "pm": "պ.մ.",
6357 "AM": "Ամ",
6358 "PM": "պ.մ.",
6359 }
6361 month_names = [
6362 "",
6363 "հունվար",
6364 "փետրվար",
6365 "մարտ",
6366 "ապրիլ",
6367 "մայիս",
6368 "հունիս",
6369 "հուլիս",
6370 "օգոստոս",
6371 "սեպտեմբեր",
6372 "հոկտեմբեր",
6373 "նոյեմբեր",
6374 "դեկտեմբեր",
6375 ]
6377 month_abbreviations = [
6378 "",
6379 "հունվար",
6380 "փետրվար",
6381 "մարտ",
6382 "ապրիլ",
6383 "մայիս",
6384 "հունիս",
6385 "հուլիս",
6386 "օգոստոս",
6387 "սեպտեմբեր",
6388 "հոկտեմբեր",
6389 "նոյեմբեր",
6390 "դեկտեմբեր",
6391 ]
6393 day_names = [
6394 "",
6395 "երկուշաբթի",
6396 "երեքշաբթի",
6397 "չորեքշաբթի",
6398 "հինգշաբթի",
6399 "ուրբաթ",
6400 "շաբաթ",
6401 "կիրակի",
6402 ]
6404 day_abbreviations = [
6405 "",
6406 "երկ.",
6407 "երեք.",
6408 "չորեք.",
6409 "հինգ.",
6410 "ուրբ.",
6411 "շաբ.",
6412 "կիր.",
6413 ]
6416class UzbekLocale(Locale):
6417 names = ["uz", "uz-uz"]
6418 past = "{0}dan avval"
6419 future = "{0}dan keyin"
6420 timeframes = {
6421 "now": "hozir",
6422 "second": "bir soniya",
6423 "seconds": "{0} soniya",
6424 "minute": "bir daqiqa",
6425 "minutes": "{0} daqiqa",
6426 "hour": "bir soat",
6427 "hours": "{0} soat",
6428 "day": "bir kun",
6429 "days": "{0} kun",
6430 "week": "bir hafta",
6431 "weeks": "{0} hafta",
6432 "month": "bir oy",
6433 "months": "{0} oy",
6434 "year": "bir yil",
6435 "years": "{0} yil",
6436 }
6438 month_names = [
6439 "",
6440 "Yanvar",
6441 "Fevral",
6442 "Mart",
6443 "Aprel",
6444 "May",
6445 "Iyun",
6446 "Iyul",
6447 "Avgust",
6448 "Sentyabr",
6449 "Oktyabr",
6450 "Noyabr",
6451 "Dekabr",
6452 ]
6454 month_abbreviations = [
6455 "",
6456 "Yan",
6457 "Fev",
6458 "Mar",
6459 "Apr",
6460 "May",
6461 "Iyn",
6462 "Iyl",
6463 "Avg",
6464 "Sen",
6465 "Okt",
6466 "Noy",
6467 "Dek",
6468 ]
6470 day_names = [
6471 "",
6472 "Dushanba",
6473 "Seshanba",
6474 "Chorshanba",
6475 "Payshanba",
6476 "Juma",
6477 "Shanba",
6478 "Yakshanba",
6479 ]
6481 day_abbreviations = ["", "Dush", "Sesh", "Chor", "Pay", "Jum", "Shan", "Yak"]