Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/arrow/locales.py: 75%
1167 statements
« prev ^ index » next coverage.py v7.2.7, created at 2023-06-07 06:17 +0000
« prev ^ index » next coverage.py v7.2.7, created at 2023-06-07 06:17 +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:
133 self._month_name_to_ordinal = None
135 def describe(
136 self,
137 timeframe: TimeFrameLiteral,
138 delta: Union[float, int] = 0,
139 only_distance: bool = False,
140 ) -> str:
141 """Describes a delta within a timeframe in plain language.
143 :param timeframe: a string representing a timeframe.
144 :param delta: a quantity representing a delta in a timeframe.
145 :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords
146 """
148 humanized = self._format_timeframe(timeframe, trunc(delta))
149 if not only_distance:
150 humanized = self._format_relative(humanized, timeframe, delta)
152 return humanized
154 def describe_multi(
155 self,
156 timeframes: Sequence[Tuple[TimeFrameLiteral, Union[int, float]]],
157 only_distance: bool = False,
158 ) -> str:
159 """Describes a delta within multiple timeframes in plain language.
161 :param timeframes: a list of string, quantity pairs each representing a timeframe and delta.
162 :param only_distance: return only distance eg: "2 hours and 11 seconds" without "in" or "ago" keywords
163 """
165 parts = [
166 self._format_timeframe(timeframe, trunc(delta))
167 for timeframe, delta in timeframes
168 ]
169 if self.and_word:
170 parts.insert(-1, self.and_word)
171 humanized = " ".join(parts)
173 if not only_distance:
174 # Needed to determine the correct relative string to use
175 timeframe_value = 0
177 for _unit_name, unit_value in timeframes:
178 if trunc(unit_value) != 0:
179 timeframe_value = trunc(unit_value)
180 break
182 # Note it doesn't matter the timeframe unit we use on the call, only the value
183 humanized = self._format_relative(humanized, "seconds", timeframe_value)
185 return humanized
187 def day_name(self, day: int) -> str:
188 """Returns the day name for a specified day of the week.
190 :param day: the ``int`` day of the week (1-7).
192 """
194 return self.day_names[day]
196 def day_abbreviation(self, day: int) -> str:
197 """Returns the day abbreviation for a specified day of the week.
199 :param day: the ``int`` day of the week (1-7).
201 """
203 return self.day_abbreviations[day]
205 def month_name(self, month: int) -> str:
206 """Returns the month name for a specified month of the year.
208 :param month: the ``int`` month of the year (1-12).
210 """
212 return self.month_names[month]
214 def month_abbreviation(self, month: int) -> str:
215 """Returns the month abbreviation for a specified month of the year.
217 :param month: the ``int`` month of the year (1-12).
219 """
221 return self.month_abbreviations[month]
223 def month_number(self, name: str) -> Optional[int]:
224 """Returns the month number for a month specified by name or abbreviation.
226 :param name: the month name or abbreviation.
228 """
230 if self._month_name_to_ordinal is None:
231 self._month_name_to_ordinal = self._name_to_ordinal(self.month_names)
232 self._month_name_to_ordinal.update(
233 self._name_to_ordinal(self.month_abbreviations)
234 )
236 return self._month_name_to_ordinal.get(name)
238 def year_full(self, year: int) -> str:
239 """Returns the year for specific locale if available
241 :param year: the ``int`` year (4-digit)
242 """
243 return f"{year:04d}"
245 def year_abbreviation(self, year: int) -> str:
246 """Returns the year for specific locale if available
248 :param year: the ``int`` year (4-digit)
249 """
250 return f"{year:04d}"[2:]
252 def meridian(self, hour: int, token: Any) -> Optional[str]:
253 """Returns the meridian indicator for a specified hour and format token.
255 :param hour: the ``int`` hour of the day.
256 :param token: the format token.
257 """
259 if token == "a":
260 return self.meridians["am"] if hour < 12 else self.meridians["pm"]
261 if token == "A":
262 return self.meridians["AM"] if hour < 12 else self.meridians["PM"]
263 return None
265 def ordinal_number(self, n: int) -> str:
266 """Returns the ordinal format of a given integer
268 :param n: an integer
269 """
270 return self._ordinal_number(n)
272 def _ordinal_number(self, n: int) -> str:
273 return f"{n}"
275 def _name_to_ordinal(self, lst: Sequence[str]) -> Dict[str, int]:
276 return {elem.lower(): i for i, elem in enumerate(lst[1:], 1)}
278 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
279 # TODO: remove cast
280 return cast(str, self.timeframes[timeframe]).format(trunc(abs(delta)))
282 def _format_relative(
283 self,
284 humanized: str,
285 timeframe: TimeFrameLiteral,
286 delta: Union[float, int],
287 ) -> str:
289 if timeframe == "now":
290 return humanized
292 direction = self.past if delta < 0 else self.future
294 return direction.format(humanized)
297class EnglishLocale(Locale):
298 names = [
299 "en",
300 "en-us",
301 "en-gb",
302 "en-au",
303 "en-be",
304 "en-jp",
305 "en-za",
306 "en-ca",
307 "en-ph",
308 ]
310 past = "{0} ago"
311 future = "in {0}"
312 and_word = "and"
314 timeframes = {
315 "now": "just now",
316 "second": "a second",
317 "seconds": "{0} seconds",
318 "minute": "a minute",
319 "minutes": "{0} minutes",
320 "hour": "an hour",
321 "hours": "{0} hours",
322 "day": "a day",
323 "days": "{0} days",
324 "week": "a week",
325 "weeks": "{0} weeks",
326 "month": "a month",
327 "months": "{0} months",
328 "quarter": "a quarter",
329 "quarters": "{0} quarters",
330 "year": "a year",
331 "years": "{0} years",
332 }
334 meridians = {"am": "am", "pm": "pm", "AM": "AM", "PM": "PM"}
336 month_names = [
337 "",
338 "January",
339 "February",
340 "March",
341 "April",
342 "May",
343 "June",
344 "July",
345 "August",
346 "September",
347 "October",
348 "November",
349 "December",
350 ]
351 month_abbreviations = [
352 "",
353 "Jan",
354 "Feb",
355 "Mar",
356 "Apr",
357 "May",
358 "Jun",
359 "Jul",
360 "Aug",
361 "Sep",
362 "Oct",
363 "Nov",
364 "Dec",
365 ]
367 day_names = [
368 "",
369 "Monday",
370 "Tuesday",
371 "Wednesday",
372 "Thursday",
373 "Friday",
374 "Saturday",
375 "Sunday",
376 ]
377 day_abbreviations = ["", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
379 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))"
381 def _ordinal_number(self, n: int) -> str:
382 if n % 100 not in (11, 12, 13):
383 remainder = abs(n) % 10
384 if remainder == 1:
385 return f"{n}st"
386 elif remainder == 2:
387 return f"{n}nd"
388 elif remainder == 3:
389 return f"{n}rd"
390 return f"{n}th"
392 def describe(
393 self,
394 timeframe: TimeFrameLiteral,
395 delta: Union[int, float] = 0,
396 only_distance: bool = False,
397 ) -> str:
398 """Describes a delta within a timeframe in plain language.
400 :param timeframe: a string representing a timeframe.
401 :param delta: a quantity representing a delta in a timeframe.
402 :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords
403 """
405 humanized = super().describe(timeframe, delta, only_distance)
406 if only_distance and timeframe == "now":
407 humanized = "instantly"
409 return humanized
412class ItalianLocale(Locale):
413 names = ["it", "it-it"]
414 past = "{0} fa"
415 future = "tra {0}"
416 and_word = "e"
418 timeframes = {
419 "now": "adesso",
420 "second": "un secondo",
421 "seconds": "{0} qualche secondo",
422 "minute": "un minuto",
423 "minutes": "{0} minuti",
424 "hour": "un'ora",
425 "hours": "{0} ore",
426 "day": "un giorno",
427 "days": "{0} giorni",
428 "week": "una settimana",
429 "weeks": "{0} settimane",
430 "month": "un mese",
431 "months": "{0} mesi",
432 "year": "un anno",
433 "years": "{0} anni",
434 }
436 month_names = [
437 "",
438 "gennaio",
439 "febbraio",
440 "marzo",
441 "aprile",
442 "maggio",
443 "giugno",
444 "luglio",
445 "agosto",
446 "settembre",
447 "ottobre",
448 "novembre",
449 "dicembre",
450 ]
451 month_abbreviations = [
452 "",
453 "gen",
454 "feb",
455 "mar",
456 "apr",
457 "mag",
458 "giu",
459 "lug",
460 "ago",
461 "set",
462 "ott",
463 "nov",
464 "dic",
465 ]
467 day_names = [
468 "",
469 "lunedì",
470 "martedì",
471 "mercoledì",
472 "giovedì",
473 "venerdì",
474 "sabato",
475 "domenica",
476 ]
477 day_abbreviations = ["", "lun", "mar", "mer", "gio", "ven", "sab", "dom"]
479 ordinal_day_re = r"((?P<value>[1-3]?[0-9](?=[ºª]))[ºª])"
481 def _ordinal_number(self, n: int) -> str:
482 return f"{n}º"
485class SpanishLocale(Locale):
486 names = ["es", "es-es"]
487 past = "hace {0}"
488 future = "en {0}"
489 and_word = "y"
491 timeframes = {
492 "now": "ahora",
493 "second": "un segundo",
494 "seconds": "{0} segundos",
495 "minute": "un minuto",
496 "minutes": "{0} minutos",
497 "hour": "una hora",
498 "hours": "{0} horas",
499 "day": "un día",
500 "days": "{0} días",
501 "week": "una semana",
502 "weeks": "{0} semanas",
503 "month": "un mes",
504 "months": "{0} meses",
505 "year": "un año",
506 "years": "{0} años",
507 }
509 meridians = {"am": "am", "pm": "pm", "AM": "AM", "PM": "PM"}
511 month_names = [
512 "",
513 "enero",
514 "febrero",
515 "marzo",
516 "abril",
517 "mayo",
518 "junio",
519 "julio",
520 "agosto",
521 "septiembre",
522 "octubre",
523 "noviembre",
524 "diciembre",
525 ]
526 month_abbreviations = [
527 "",
528 "ene",
529 "feb",
530 "mar",
531 "abr",
532 "may",
533 "jun",
534 "jul",
535 "ago",
536 "sep",
537 "oct",
538 "nov",
539 "dic",
540 ]
542 day_names = [
543 "",
544 "lunes",
545 "martes",
546 "miércoles",
547 "jueves",
548 "viernes",
549 "sábado",
550 "domingo",
551 ]
552 day_abbreviations = ["", "lun", "mar", "mie", "jue", "vie", "sab", "dom"]
554 ordinal_day_re = r"((?P<value>[1-3]?[0-9](?=[ºª]))[ºª])"
556 def _ordinal_number(self, n: int) -> str:
557 return f"{n}º"
560class FrenchBaseLocale(Locale):
561 past = "il y a {0}"
562 future = "dans {0}"
563 and_word = "et"
565 timeframes = {
566 "now": "maintenant",
567 "second": "une seconde",
568 "seconds": "{0} secondes",
569 "minute": "une minute",
570 "minutes": "{0} minutes",
571 "hour": "une heure",
572 "hours": "{0} heures",
573 "day": "un jour",
574 "days": "{0} jours",
575 "week": "une semaine",
576 "weeks": "{0} semaines",
577 "month": "un mois",
578 "months": "{0} mois",
579 "year": "un an",
580 "years": "{0} ans",
581 }
583 month_names = [
584 "",
585 "janvier",
586 "février",
587 "mars",
588 "avril",
589 "mai",
590 "juin",
591 "juillet",
592 "août",
593 "septembre",
594 "octobre",
595 "novembre",
596 "décembre",
597 ]
599 day_names = [
600 "",
601 "lundi",
602 "mardi",
603 "mercredi",
604 "jeudi",
605 "vendredi",
606 "samedi",
607 "dimanche",
608 ]
609 day_abbreviations = ["", "lun", "mar", "mer", "jeu", "ven", "sam", "dim"]
611 ordinal_day_re = (
612 r"((?P<value>\b1(?=er\b)|[1-3]?[02-9](?=e\b)|[1-3]1(?=e\b))(er|e)\b)"
613 )
615 def _ordinal_number(self, n: int) -> str:
616 if abs(n) == 1:
617 return f"{n}er"
618 return f"{n}e"
621class FrenchLocale(FrenchBaseLocale, Locale):
622 names = ["fr", "fr-fr"]
624 month_abbreviations = [
625 "",
626 "janv",
627 "févr",
628 "mars",
629 "avr",
630 "mai",
631 "juin",
632 "juil",
633 "août",
634 "sept",
635 "oct",
636 "nov",
637 "déc",
638 ]
641class FrenchCanadianLocale(FrenchBaseLocale, Locale):
642 names = ["fr-ca"]
644 month_abbreviations = [
645 "",
646 "janv",
647 "févr",
648 "mars",
649 "avr",
650 "mai",
651 "juin",
652 "juill",
653 "août",
654 "sept",
655 "oct",
656 "nov",
657 "déc",
658 ]
661class GreekLocale(Locale):
662 names = ["el", "el-gr"]
664 past = "{0} πριν"
665 future = "σε {0}"
666 and_word = "και"
668 timeframes = {
669 "now": "τώρα",
670 "second": "ένα δεύτερο",
671 "seconds": "{0} δευτερόλεπτα",
672 "minute": "ένα λεπτό",
673 "minutes": "{0} λεπτά",
674 "hour": "μία ώρα",
675 "hours": "{0} ώρες",
676 "day": "μία μέρα",
677 "days": "{0} μέρες",
678 "week": "μία εβδομάδα",
679 "weeks": "{0} εβδομάδες",
680 "month": "ένα μήνα",
681 "months": "{0} μήνες",
682 "year": "ένα χρόνο",
683 "years": "{0} χρόνια",
684 }
686 month_names = [
687 "",
688 "Ιανουαρίου",
689 "Φεβρουαρίου",
690 "Μαρτίου",
691 "Απριλίου",
692 "Μαΐου",
693 "Ιουνίου",
694 "Ιουλίου",
695 "Αυγούστου",
696 "Σεπτεμβρίου",
697 "Οκτωβρίου",
698 "Νοεμβρίου",
699 "Δεκεμβρίου",
700 ]
701 month_abbreviations = [
702 "",
703 "Ιαν",
704 "Φεβ",
705 "Μαρ",
706 "Απρ",
707 "Μαϊ",
708 "Ιον",
709 "Ιολ",
710 "Αυγ",
711 "Σεπ",
712 "Οκτ",
713 "Νοε",
714 "Δεκ",
715 ]
717 day_names = [
718 "",
719 "Δευτέρα",
720 "Τρίτη",
721 "Τετάρτη",
722 "Πέμπτη",
723 "Παρασκευή",
724 "Σάββατο",
725 "Κυριακή",
726 ]
727 day_abbreviations = ["", "Δευ", "Τρι", "Τετ", "Πεμ", "Παρ", "Σαβ", "Κυρ"]
730class JapaneseLocale(Locale):
731 names = ["ja", "ja-jp"]
733 past = "{0}前"
734 future = "{0}後"
735 and_word = ""
737 timeframes = {
738 "now": "現在",
739 "second": "1秒",
740 "seconds": "{0}秒",
741 "minute": "1分",
742 "minutes": "{0}分",
743 "hour": "1時間",
744 "hours": "{0}時間",
745 "day": "1日",
746 "days": "{0}日",
747 "week": "1週間",
748 "weeks": "{0}週間",
749 "month": "1ヶ月",
750 "months": "{0}ヶ月",
751 "year": "1年",
752 "years": "{0}年",
753 }
755 month_names = [
756 "",
757 "1月",
758 "2月",
759 "3月",
760 "4月",
761 "5月",
762 "6月",
763 "7月",
764 "8月",
765 "9月",
766 "10月",
767 "11月",
768 "12月",
769 ]
770 month_abbreviations = [
771 "",
772 " 1",
773 " 2",
774 " 3",
775 " 4",
776 " 5",
777 " 6",
778 " 7",
779 " 8",
780 " 9",
781 "10",
782 "11",
783 "12",
784 ]
786 day_names = ["", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日", "日曜日"]
787 day_abbreviations = ["", "月", "火", "水", "木", "金", "土", "日"]
790class SwedishLocale(Locale):
791 names = ["sv", "sv-se"]
793 past = "för {0} sen"
794 future = "om {0}"
795 and_word = "och"
797 timeframes = {
798 "now": "just nu",
799 "second": "en sekund",
800 "seconds": "{0} sekunder",
801 "minute": "en minut",
802 "minutes": "{0} minuter",
803 "hour": "en timme",
804 "hours": "{0} timmar",
805 "day": "en dag",
806 "days": "{0} dagar",
807 "week": "en vecka",
808 "weeks": "{0} veckor",
809 "month": "en månad",
810 "months": "{0} månader",
811 "year": "ett år",
812 "years": "{0} år",
813 }
815 month_names = [
816 "",
817 "januari",
818 "februari",
819 "mars",
820 "april",
821 "maj",
822 "juni",
823 "juli",
824 "augusti",
825 "september",
826 "oktober",
827 "november",
828 "december",
829 ]
830 month_abbreviations = [
831 "",
832 "jan",
833 "feb",
834 "mar",
835 "apr",
836 "maj",
837 "jun",
838 "jul",
839 "aug",
840 "sep",
841 "okt",
842 "nov",
843 "dec",
844 ]
846 day_names = [
847 "",
848 "måndag",
849 "tisdag",
850 "onsdag",
851 "torsdag",
852 "fredag",
853 "lördag",
854 "söndag",
855 ]
856 day_abbreviations = ["", "mån", "tis", "ons", "tor", "fre", "lör", "sön"]
859class FinnishLocale(Locale):
860 names = ["fi", "fi-fi"]
862 # The finnish grammar is very complex, and its hard to convert
863 # 1-to-1 to something like English.
865 past = "{0} sitten"
866 future = "{0} kuluttua"
868 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
869 "now": "juuri nyt",
870 "second": {"past": "sekunti", "future": "sekunnin"},
871 "seconds": {"past": "{0} sekuntia", "future": "{0} sekunnin"},
872 "minute": {"past": "minuutti", "future": "minuutin"},
873 "minutes": {"past": "{0} minuuttia", "future": "{0} minuutin"},
874 "hour": {"past": "tunti", "future": "tunnin"},
875 "hours": {"past": "{0} tuntia", "future": "{0} tunnin"},
876 "day": {"past": "päivä", "future": "päivän"},
877 "days": {"past": "{0} päivää", "future": "{0} päivän"},
878 "month": {"past": "kuukausi", "future": "kuukauden"},
879 "months": {"past": "{0} kuukautta", "future": "{0} kuukauden"},
880 "year": {"past": "vuosi", "future": "vuoden"},
881 "years": {"past": "{0} vuotta", "future": "{0} vuoden"},
882 }
884 # Months and days are lowercase in Finnish
885 month_names = [
886 "",
887 "tammikuu",
888 "helmikuu",
889 "maaliskuu",
890 "huhtikuu",
891 "toukokuu",
892 "kesäkuu",
893 "heinäkuu",
894 "elokuu",
895 "syyskuu",
896 "lokakuu",
897 "marraskuu",
898 "joulukuu",
899 ]
901 month_abbreviations = [
902 "",
903 "tammi",
904 "helmi",
905 "maalis",
906 "huhti",
907 "touko",
908 "kesä",
909 "heinä",
910 "elo",
911 "syys",
912 "loka",
913 "marras",
914 "joulu",
915 ]
917 day_names = [
918 "",
919 "maanantai",
920 "tiistai",
921 "keskiviikko",
922 "torstai",
923 "perjantai",
924 "lauantai",
925 "sunnuntai",
926 ]
928 day_abbreviations = ["", "ma", "ti", "ke", "to", "pe", "la", "su"]
930 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
931 form = self.timeframes[timeframe]
933 if isinstance(form, Mapping):
934 if delta < 0:
935 form = form["past"]
936 else:
937 form = form["future"]
939 return form.format(abs(delta))
941 def _ordinal_number(self, n: int) -> str:
942 return f"{n}."
945class ChineseCNLocale(Locale):
946 names = ["zh", "zh-cn"]
948 past = "{0}前"
949 future = "{0}后"
951 timeframes = {
952 "now": "刚才",
953 "second": "1秒",
954 "seconds": "{0}秒",
955 "minute": "1分钟",
956 "minutes": "{0}分钟",
957 "hour": "1小时",
958 "hours": "{0}小时",
959 "day": "1天",
960 "days": "{0}天",
961 "week": "1周",
962 "weeks": "{0}周",
963 "month": "1个月",
964 "months": "{0}个月",
965 "year": "1年",
966 "years": "{0}年",
967 }
969 month_names = [
970 "",
971 "一月",
972 "二月",
973 "三月",
974 "四月",
975 "五月",
976 "六月",
977 "七月",
978 "八月",
979 "九月",
980 "十月",
981 "十一月",
982 "十二月",
983 ]
984 month_abbreviations = [
985 "",
986 " 1",
987 " 2",
988 " 3",
989 " 4",
990 " 5",
991 " 6",
992 " 7",
993 " 8",
994 " 9",
995 "10",
996 "11",
997 "12",
998 ]
1000 day_names = ["", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"]
1001 day_abbreviations = ["", "一", "二", "三", "四", "五", "六", "日"]
1004class ChineseTWLocale(Locale):
1005 names = ["zh-tw"]
1007 past = "{0}前"
1008 future = "{0}後"
1009 and_word = "和"
1011 timeframes = {
1012 "now": "剛才",
1013 "second": "1秒",
1014 "seconds": "{0}秒",
1015 "minute": "1分鐘",
1016 "minutes": "{0}分鐘",
1017 "hour": "1小時",
1018 "hours": "{0}小時",
1019 "day": "1天",
1020 "days": "{0}天",
1021 "week": "1週",
1022 "weeks": "{0}週",
1023 "month": "1個月",
1024 "months": "{0}個月",
1025 "year": "1年",
1026 "years": "{0}年",
1027 }
1029 month_names = [
1030 "",
1031 "1月",
1032 "2月",
1033 "3月",
1034 "4月",
1035 "5月",
1036 "6月",
1037 "7月",
1038 "8月",
1039 "9月",
1040 "10月",
1041 "11月",
1042 "12月",
1043 ]
1044 month_abbreviations = [
1045 "",
1046 " 1",
1047 " 2",
1048 " 3",
1049 " 4",
1050 " 5",
1051 " 6",
1052 " 7",
1053 " 8",
1054 " 9",
1055 "10",
1056 "11",
1057 "12",
1058 ]
1060 day_names = ["", "週一", "週二", "週三", "週四", "週五", "週六", "週日"]
1061 day_abbreviations = ["", "一", "二", "三", "四", "五", "六", "日"]
1064class HongKongLocale(Locale):
1065 names = ["zh-hk"]
1067 past = "{0}前"
1068 future = "{0}後"
1070 timeframes = {
1071 "now": "剛才",
1072 "second": "1秒",
1073 "seconds": "{0}秒",
1074 "minute": "1分鐘",
1075 "minutes": "{0}分鐘",
1076 "hour": "1小時",
1077 "hours": "{0}小時",
1078 "day": "1天",
1079 "days": "{0}天",
1080 "week": "1星期",
1081 "weeks": "{0}星期",
1082 "month": "1個月",
1083 "months": "{0}個月",
1084 "year": "1年",
1085 "years": "{0}年",
1086 }
1088 month_names = [
1089 "",
1090 "1月",
1091 "2月",
1092 "3月",
1093 "4月",
1094 "5月",
1095 "6月",
1096 "7月",
1097 "8月",
1098 "9月",
1099 "10月",
1100 "11月",
1101 "12月",
1102 ]
1103 month_abbreviations = [
1104 "",
1105 " 1",
1106 " 2",
1107 " 3",
1108 " 4",
1109 " 5",
1110 " 6",
1111 " 7",
1112 " 8",
1113 " 9",
1114 "10",
1115 "11",
1116 "12",
1117 ]
1119 day_names = ["", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"]
1120 day_abbreviations = ["", "一", "二", "三", "四", "五", "六", "日"]
1123class KoreanLocale(Locale):
1124 names = ["ko", "ko-kr"]
1126 past = "{0} 전"
1127 future = "{0} 후"
1129 timeframes = {
1130 "now": "지금",
1131 "second": "1초",
1132 "seconds": "{0}초",
1133 "minute": "1분",
1134 "minutes": "{0}분",
1135 "hour": "한시간",
1136 "hours": "{0}시간",
1137 "day": "하루",
1138 "days": "{0}일",
1139 "week": "1주",
1140 "weeks": "{0}주",
1141 "month": "한달",
1142 "months": "{0}개월",
1143 "year": "1년",
1144 "years": "{0}년",
1145 }
1147 special_dayframes = {
1148 -3: "그끄제",
1149 -2: "그제",
1150 -1: "어제",
1151 1: "내일",
1152 2: "모레",
1153 3: "글피",
1154 4: "그글피",
1155 }
1157 special_yearframes = {-2: "제작년", -1: "작년", 1: "내년", 2: "내후년"}
1159 month_names = [
1160 "",
1161 "1월",
1162 "2월",
1163 "3월",
1164 "4월",
1165 "5월",
1166 "6월",
1167 "7월",
1168 "8월",
1169 "9월",
1170 "10월",
1171 "11월",
1172 "12월",
1173 ]
1174 month_abbreviations = [
1175 "",
1176 " 1",
1177 " 2",
1178 " 3",
1179 " 4",
1180 " 5",
1181 " 6",
1182 " 7",
1183 " 8",
1184 " 9",
1185 "10",
1186 "11",
1187 "12",
1188 ]
1190 day_names = ["", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일", "일요일"]
1191 day_abbreviations = ["", "월", "화", "수", "목", "금", "토", "일"]
1193 def _ordinal_number(self, n: int) -> str:
1194 ordinals = ["0", "첫", "두", "세", "네", "다섯", "여섯", "일곱", "여덟", "아홉", "열"]
1195 if n < len(ordinals):
1196 return f"{ordinals[n]}번째"
1197 return f"{n}번째"
1199 def _format_relative(
1200 self,
1201 humanized: str,
1202 timeframe: TimeFrameLiteral,
1203 delta: Union[float, int],
1204 ) -> str:
1205 if timeframe in ("day", "days"):
1206 special = self.special_dayframes.get(int(delta))
1207 if special:
1208 return special
1209 elif timeframe in ("year", "years"):
1210 special = self.special_yearframes.get(int(delta))
1211 if special:
1212 return special
1214 return super()._format_relative(humanized, timeframe, delta)
1217# derived locale types & implementations.
1218class DutchLocale(Locale):
1219 names = ["nl", "nl-nl"]
1221 past = "{0} geleden"
1222 future = "over {0}"
1224 timeframes = {
1225 "now": "nu",
1226 "second": "een seconde",
1227 "seconds": "{0} seconden",
1228 "minute": "een minuut",
1229 "minutes": "{0} minuten",
1230 "hour": "een uur",
1231 "hours": "{0} uur",
1232 "day": "een dag",
1233 "days": "{0} dagen",
1234 "week": "een week",
1235 "weeks": "{0} weken",
1236 "month": "een maand",
1237 "months": "{0} maanden",
1238 "year": "een jaar",
1239 "years": "{0} jaar",
1240 }
1242 # In Dutch names of months and days are not starting with a capital letter
1243 # like in the English language.
1244 month_names = [
1245 "",
1246 "januari",
1247 "februari",
1248 "maart",
1249 "april",
1250 "mei",
1251 "juni",
1252 "juli",
1253 "augustus",
1254 "september",
1255 "oktober",
1256 "november",
1257 "december",
1258 ]
1259 month_abbreviations = [
1260 "",
1261 "jan",
1262 "feb",
1263 "mrt",
1264 "apr",
1265 "mei",
1266 "jun",
1267 "jul",
1268 "aug",
1269 "sep",
1270 "okt",
1271 "nov",
1272 "dec",
1273 ]
1275 day_names = [
1276 "",
1277 "maandag",
1278 "dinsdag",
1279 "woensdag",
1280 "donderdag",
1281 "vrijdag",
1282 "zaterdag",
1283 "zondag",
1284 ]
1285 day_abbreviations = ["", "ma", "di", "wo", "do", "vr", "za", "zo"]
1288class SlavicBaseLocale(Locale):
1289 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]]
1291 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
1292 form = self.timeframes[timeframe]
1293 delta = abs(delta)
1295 if isinstance(form, Mapping):
1296 if delta % 10 == 1 and delta % 100 != 11:
1297 form = form["singular"]
1298 elif 2 <= delta % 10 <= 4 and (delta % 100 < 10 or delta % 100 >= 20):
1299 form = form["dual"]
1300 else:
1301 form = form["plural"]
1303 return form.format(delta)
1306class BelarusianLocale(SlavicBaseLocale):
1307 names = ["be", "be-by"]
1309 past = "{0} таму"
1310 future = "праз {0}"
1312 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
1313 "now": "зараз",
1314 "second": "секунду",
1315 "seconds": "{0} некалькі секунд",
1316 "minute": "хвіліну",
1317 "minutes": {
1318 "singular": "{0} хвіліну",
1319 "dual": "{0} хвіліны",
1320 "plural": "{0} хвілін",
1321 },
1322 "hour": "гадзіну",
1323 "hours": {
1324 "singular": "{0} гадзіну",
1325 "dual": "{0} гадзіны",
1326 "plural": "{0} гадзін",
1327 },
1328 "day": "дзень",
1329 "days": {"singular": "{0} дзень", "dual": "{0} дні", "plural": "{0} дзён"},
1330 "month": "месяц",
1331 "months": {
1332 "singular": "{0} месяц",
1333 "dual": "{0} месяцы",
1334 "plural": "{0} месяцаў",
1335 },
1336 "year": "год",
1337 "years": {"singular": "{0} год", "dual": "{0} гады", "plural": "{0} гадоў"},
1338 }
1340 month_names = [
1341 "",
1342 "студзеня",
1343 "лютага",
1344 "сакавіка",
1345 "красавіка",
1346 "траўня",
1347 "чэрвеня",
1348 "ліпеня",
1349 "жніўня",
1350 "верасня",
1351 "кастрычніка",
1352 "лістапада",
1353 "снежня",
1354 ]
1355 month_abbreviations = [
1356 "",
1357 "студ",
1358 "лют",
1359 "сак",
1360 "крас",
1361 "трав",
1362 "чэрв",
1363 "ліп",
1364 "жнів",
1365 "вер",
1366 "каст",
1367 "ліст",
1368 "снеж",
1369 ]
1371 day_names = [
1372 "",
1373 "панядзелак",
1374 "аўторак",
1375 "серада",
1376 "чацвер",
1377 "пятніца",
1378 "субота",
1379 "нядзеля",
1380 ]
1381 day_abbreviations = ["", "пн", "ат", "ср", "чц", "пт", "сб", "нд"]
1384class PolishLocale(SlavicBaseLocale):
1385 names = ["pl", "pl-pl"]
1387 past = "{0} temu"
1388 future = "za {0}"
1390 # The nouns should be in genitive case (Polish: "dopełniacz")
1391 # in order to correctly form `past` & `future` expressions.
1392 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
1393 "now": "teraz",
1394 "second": "sekundę",
1395 "seconds": {
1396 "singular": "{0} sekund",
1397 "dual": "{0} sekundy",
1398 "plural": "{0} sekund",
1399 },
1400 "minute": "minutę",
1401 "minutes": {
1402 "singular": "{0} minut",
1403 "dual": "{0} minuty",
1404 "plural": "{0} minut",
1405 },
1406 "hour": "godzinę",
1407 "hours": {
1408 "singular": "{0} godzin",
1409 "dual": "{0} godziny",
1410 "plural": "{0} godzin",
1411 },
1412 "day": "dzień",
1413 "days": "{0} dni",
1414 "week": "tydzień",
1415 "weeks": {
1416 "singular": "{0} tygodni",
1417 "dual": "{0} tygodnie",
1418 "plural": "{0} tygodni",
1419 },
1420 "month": "miesiąc",
1421 "months": {
1422 "singular": "{0} miesięcy",
1423 "dual": "{0} miesiące",
1424 "plural": "{0} miesięcy",
1425 },
1426 "year": "rok",
1427 "years": {"singular": "{0} lat", "dual": "{0} lata", "plural": "{0} lat"},
1428 }
1430 month_names = [
1431 "",
1432 "styczeń",
1433 "luty",
1434 "marzec",
1435 "kwiecień",
1436 "maj",
1437 "czerwiec",
1438 "lipiec",
1439 "sierpień",
1440 "wrzesień",
1441 "październik",
1442 "listopad",
1443 "grudzień",
1444 ]
1445 month_abbreviations = [
1446 "",
1447 "sty",
1448 "lut",
1449 "mar",
1450 "kwi",
1451 "maj",
1452 "cze",
1453 "lip",
1454 "sie",
1455 "wrz",
1456 "paź",
1457 "lis",
1458 "gru",
1459 ]
1461 day_names = [
1462 "",
1463 "poniedziałek",
1464 "wtorek",
1465 "środa",
1466 "czwartek",
1467 "piątek",
1468 "sobota",
1469 "niedziela",
1470 ]
1471 day_abbreviations = ["", "Pn", "Wt", "Śr", "Czw", "Pt", "So", "Nd"]
1474class RussianLocale(SlavicBaseLocale):
1475 names = ["ru", "ru-ru"]
1477 past = "{0} назад"
1478 future = "через {0}"
1480 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
1481 "now": "сейчас",
1482 "second": "секунда",
1483 "seconds": {
1484 "singular": "{0} секунду",
1485 "dual": "{0} секунды",
1486 "plural": "{0} секунд",
1487 },
1488 "minute": "минуту",
1489 "minutes": {
1490 "singular": "{0} минуту",
1491 "dual": "{0} минуты",
1492 "plural": "{0} минут",
1493 },
1494 "hour": "час",
1495 "hours": {"singular": "{0} час", "dual": "{0} часа", "plural": "{0} часов"},
1496 "day": "день",
1497 "days": {"singular": "{0} день", "dual": "{0} дня", "plural": "{0} дней"},
1498 "week": "неделю",
1499 "weeks": {
1500 "singular": "{0} неделю",
1501 "dual": "{0} недели",
1502 "plural": "{0} недель",
1503 },
1504 "month": "месяц",
1505 "months": {
1506 "singular": "{0} месяц",
1507 "dual": "{0} месяца",
1508 "plural": "{0} месяцев",
1509 },
1510 "quarter": "квартал",
1511 "quarters": {
1512 "singular": "{0} квартал",
1513 "dual": "{0} квартала",
1514 "plural": "{0} кварталов",
1515 },
1516 "year": "год",
1517 "years": {"singular": "{0} год", "dual": "{0} года", "plural": "{0} лет"},
1518 }
1520 month_names = [
1521 "",
1522 "января",
1523 "февраля",
1524 "марта",
1525 "апреля",
1526 "мая",
1527 "июня",
1528 "июля",
1529 "августа",
1530 "сентября",
1531 "октября",
1532 "ноября",
1533 "декабря",
1534 ]
1535 month_abbreviations = [
1536 "",
1537 "янв",
1538 "фев",
1539 "мар",
1540 "апр",
1541 "май",
1542 "июн",
1543 "июл",
1544 "авг",
1545 "сен",
1546 "окт",
1547 "ноя",
1548 "дек",
1549 ]
1551 day_names = [
1552 "",
1553 "понедельник",
1554 "вторник",
1555 "среда",
1556 "четверг",
1557 "пятница",
1558 "суббота",
1559 "воскресенье",
1560 ]
1561 day_abbreviations = ["", "пн", "вт", "ср", "чт", "пт", "сб", "вс"]
1564class AfrikaansLocale(Locale):
1565 names = ["af", "af-nl"]
1567 past = "{0} gelede"
1568 future = "in {0}"
1570 timeframes = {
1571 "now": "nou",
1572 "second": "n sekonde",
1573 "seconds": "{0} sekondes",
1574 "minute": "minuut",
1575 "minutes": "{0} minute",
1576 "hour": "uur",
1577 "hours": "{0} ure",
1578 "day": "een dag",
1579 "days": "{0} dae",
1580 "month": "een maand",
1581 "months": "{0} maande",
1582 "year": "een jaar",
1583 "years": "{0} jaar",
1584 }
1586 month_names = [
1587 "",
1588 "Januarie",
1589 "Februarie",
1590 "Maart",
1591 "April",
1592 "Mei",
1593 "Junie",
1594 "Julie",
1595 "Augustus",
1596 "September",
1597 "Oktober",
1598 "November",
1599 "Desember",
1600 ]
1601 month_abbreviations = [
1602 "",
1603 "Jan",
1604 "Feb",
1605 "Mrt",
1606 "Apr",
1607 "Mei",
1608 "Jun",
1609 "Jul",
1610 "Aug",
1611 "Sep",
1612 "Okt",
1613 "Nov",
1614 "Des",
1615 ]
1617 day_names = [
1618 "",
1619 "Maandag",
1620 "Dinsdag",
1621 "Woensdag",
1622 "Donderdag",
1623 "Vrydag",
1624 "Saterdag",
1625 "Sondag",
1626 ]
1627 day_abbreviations = ["", "Ma", "Di", "Wo", "Do", "Vr", "Za", "So"]
1630class BulgarianLocale(SlavicBaseLocale):
1631 names = ["bg", "bg-bg"]
1633 past = "{0} назад"
1634 future = "напред {0}"
1636 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
1637 "now": "сега",
1638 "second": "секунда",
1639 "seconds": "{0} няколко секунди",
1640 "minute": "минута",
1641 "minutes": {
1642 "singular": "{0} минута",
1643 "dual": "{0} минути",
1644 "plural": "{0} минути",
1645 },
1646 "hour": "час",
1647 "hours": {"singular": "{0} час", "dual": "{0} часа", "plural": "{0} часа"},
1648 "day": "ден",
1649 "days": {"singular": "{0} ден", "dual": "{0} дни", "plural": "{0} дни"},
1650 "month": "месец",
1651 "months": {
1652 "singular": "{0} месец",
1653 "dual": "{0} месеца",
1654 "plural": "{0} месеца",
1655 },
1656 "year": "година",
1657 "years": {
1658 "singular": "{0} година",
1659 "dual": "{0} години",
1660 "plural": "{0} години",
1661 },
1662 }
1664 month_names = [
1665 "",
1666 "януари",
1667 "февруари",
1668 "март",
1669 "април",
1670 "май",
1671 "юни",
1672 "юли",
1673 "август",
1674 "септември",
1675 "октомври",
1676 "ноември",
1677 "декември",
1678 ]
1679 month_abbreviations = [
1680 "",
1681 "ян",
1682 "февр",
1683 "март",
1684 "апр",
1685 "май",
1686 "юни",
1687 "юли",
1688 "авг",
1689 "септ",
1690 "окт",
1691 "ноем",
1692 "дек",
1693 ]
1695 day_names = [
1696 "",
1697 "понеделник",
1698 "вторник",
1699 "сряда",
1700 "четвъртък",
1701 "петък",
1702 "събота",
1703 "неделя",
1704 ]
1705 day_abbreviations = ["", "пон", "вт", "ср", "четв", "пет", "съб", "нед"]
1708class UkrainianLocale(SlavicBaseLocale):
1709 names = ["ua", "uk", "uk-ua"]
1711 past = "{0} тому"
1712 future = "за {0}"
1714 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
1715 "now": "зараз",
1716 "second": "секунда",
1717 "seconds": "{0} кілька секунд",
1718 "minute": "хвилину",
1719 "minutes": {
1720 "singular": "{0} хвилину",
1721 "dual": "{0} хвилини",
1722 "plural": "{0} хвилин",
1723 },
1724 "hour": "годину",
1725 "hours": {
1726 "singular": "{0} годину",
1727 "dual": "{0} години",
1728 "plural": "{0} годин",
1729 },
1730 "day": "день",
1731 "days": {"singular": "{0} день", "dual": "{0} дні", "plural": "{0} днів"},
1732 "month": "місяць",
1733 "months": {
1734 "singular": "{0} місяць",
1735 "dual": "{0} місяці",
1736 "plural": "{0} місяців",
1737 },
1738 "year": "рік",
1739 "years": {"singular": "{0} рік", "dual": "{0} роки", "plural": "{0} років"},
1740 }
1742 month_names = [
1743 "",
1744 "січня",
1745 "лютого",
1746 "березня",
1747 "квітня",
1748 "травня",
1749 "червня",
1750 "липня",
1751 "серпня",
1752 "вересня",
1753 "жовтня",
1754 "листопада",
1755 "грудня",
1756 ]
1757 month_abbreviations = [
1758 "",
1759 "січ",
1760 "лют",
1761 "бер",
1762 "квіт",
1763 "трав",
1764 "черв",
1765 "лип",
1766 "серп",
1767 "вер",
1768 "жовт",
1769 "лист",
1770 "груд",
1771 ]
1773 day_names = [
1774 "",
1775 "понеділок",
1776 "вівторок",
1777 "середа",
1778 "четвер",
1779 "п’ятниця",
1780 "субота",
1781 "неділя",
1782 ]
1783 day_abbreviations = ["", "пн", "вт", "ср", "чт", "пт", "сб", "нд"]
1786class MacedonianLocale(SlavicBaseLocale):
1787 names = ["mk", "mk-mk"]
1789 past = "пред {0}"
1790 future = "за {0}"
1792 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
1793 "now": "сега",
1794 "second": "една секунда",
1795 "seconds": {
1796 "singular": "{0} секунда",
1797 "dual": "{0} секунди",
1798 "plural": "{0} секунди",
1799 },
1800 "minute": "една минута",
1801 "minutes": {
1802 "singular": "{0} минута",
1803 "dual": "{0} минути",
1804 "plural": "{0} минути",
1805 },
1806 "hour": "еден саат",
1807 "hours": {"singular": "{0} саат", "dual": "{0} саати", "plural": "{0} саати"},
1808 "day": "еден ден",
1809 "days": {"singular": "{0} ден", "dual": "{0} дена", "plural": "{0} дена"},
1810 "week": "една недела",
1811 "weeks": {
1812 "singular": "{0} недела",
1813 "dual": "{0} недели",
1814 "plural": "{0} недели",
1815 },
1816 "month": "еден месец",
1817 "months": {
1818 "singular": "{0} месец",
1819 "dual": "{0} месеци",
1820 "plural": "{0} месеци",
1821 },
1822 "year": "една година",
1823 "years": {
1824 "singular": "{0} година",
1825 "dual": "{0} години",
1826 "plural": "{0} години",
1827 },
1828 }
1830 meridians = {"am": "дп", "pm": "пп", "AM": "претпладне", "PM": "попладне"}
1832 month_names = [
1833 "",
1834 "Јануари",
1835 "Февруари",
1836 "Март",
1837 "Април",
1838 "Мај",
1839 "Јуни",
1840 "Јули",
1841 "Август",
1842 "Септември",
1843 "Октомври",
1844 "Ноември",
1845 "Декември",
1846 ]
1847 month_abbreviations = [
1848 "",
1849 "Јан",
1850 "Фев",
1851 "Мар",
1852 "Апр",
1853 "Мај",
1854 "Јун",
1855 "Јул",
1856 "Авг",
1857 "Септ",
1858 "Окт",
1859 "Ноем",
1860 "Декем",
1861 ]
1863 day_names = [
1864 "",
1865 "Понеделник",
1866 "Вторник",
1867 "Среда",
1868 "Четврток",
1869 "Петок",
1870 "Сабота",
1871 "Недела",
1872 ]
1873 day_abbreviations = [
1874 "",
1875 "Пон",
1876 "Вт",
1877 "Сре",
1878 "Чет",
1879 "Пет",
1880 "Саб",
1881 "Нед",
1882 ]
1885class GermanBaseLocale(Locale):
1886 past = "vor {0}"
1887 future = "in {0}"
1888 and_word = "und"
1890 timeframes = {
1891 "now": "gerade eben",
1892 "second": "einer Sekunde",
1893 "seconds": "{0} Sekunden",
1894 "minute": "einer Minute",
1895 "minutes": "{0} Minuten",
1896 "hour": "einer Stunde",
1897 "hours": "{0} Stunden",
1898 "day": "einem Tag",
1899 "days": "{0} Tagen",
1900 "week": "einer Woche",
1901 "weeks": "{0} Wochen",
1902 "month": "einem Monat",
1903 "months": "{0} Monaten",
1904 "year": "einem Jahr",
1905 "years": "{0} Jahren",
1906 }
1908 timeframes_only_distance = timeframes.copy()
1909 timeframes_only_distance["second"] = "eine Sekunde"
1910 timeframes_only_distance["minute"] = "eine Minute"
1911 timeframes_only_distance["hour"] = "eine Stunde"
1912 timeframes_only_distance["day"] = "ein Tag"
1913 timeframes_only_distance["days"] = "{0} Tage"
1914 timeframes_only_distance["week"] = "eine Woche"
1915 timeframes_only_distance["month"] = "ein Monat"
1916 timeframes_only_distance["months"] = "{0} Monate"
1917 timeframes_only_distance["year"] = "ein Jahr"
1918 timeframes_only_distance["years"] = "{0} Jahre"
1920 month_names = [
1921 "",
1922 "Januar",
1923 "Februar",
1924 "März",
1925 "April",
1926 "Mai",
1927 "Juni",
1928 "Juli",
1929 "August",
1930 "September",
1931 "Oktober",
1932 "November",
1933 "Dezember",
1934 ]
1936 month_abbreviations = [
1937 "",
1938 "Jan",
1939 "Feb",
1940 "Mär",
1941 "Apr",
1942 "Mai",
1943 "Jun",
1944 "Jul",
1945 "Aug",
1946 "Sep",
1947 "Okt",
1948 "Nov",
1949 "Dez",
1950 ]
1952 day_names = [
1953 "",
1954 "Montag",
1955 "Dienstag",
1956 "Mittwoch",
1957 "Donnerstag",
1958 "Freitag",
1959 "Samstag",
1960 "Sonntag",
1961 ]
1963 day_abbreviations = ["", "Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"]
1965 def _ordinal_number(self, n: int) -> str:
1966 return f"{n}."
1968 def describe(
1969 self,
1970 timeframe: TimeFrameLiteral,
1971 delta: Union[int, float] = 0,
1972 only_distance: bool = False,
1973 ) -> str:
1974 """Describes a delta within a timeframe in plain language.
1976 :param timeframe: a string representing a timeframe.
1977 :param delta: a quantity representing a delta in a timeframe.
1978 :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords
1979 """
1981 if not only_distance:
1982 return super().describe(timeframe, delta, only_distance)
1984 # German uses a different case without 'in' or 'ago'
1985 humanized = self.timeframes_only_distance[timeframe].format(trunc(abs(delta)))
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):
3940 names = ["lo", "lo-la"]
3942 past = "{0} ກ່ອນຫນ້ານີ້"
3943 future = "ໃນ {0}"
3945 timeframes = {
3946 "now": "ດຽວນີ້",
3947 "second": "ວິນາທີ",
3948 "seconds": "{0} ວິນາທີ",
3949 "minute": "ນາທີ",
3950 "minutes": "{0} ນາທີ",
3951 "hour": "ຊົ່ວໂມງ",
3952 "hours": "{0} ຊົ່ວໂມງ",
3953 "day": "ມື້",
3954 "days": "{0} ມື້",
3955 "week": "ອາທິດ",
3956 "weeks": "{0} ອາທິດ",
3957 "month": "ເດືອນ",
3958 "months": "{0} ເດືອນ",
3959 "year": "ປີ",
3960 "years": "{0} ປີ",
3961 }
3963 month_names = [
3964 "",
3965 "ມັງກອນ", # mangkon
3966 "ກຸມພາ", # kumpha
3967 "ມີນາ", # mina
3968 "ເມສາ", # mesa
3969 "ພຶດສະພາ", # phudsapha
3970 "ມິຖຸນາ", # mithuna
3971 "ກໍລະກົດ", # kolakod
3972 "ສິງຫາ", # singha
3973 "ກັນຍາ", # knaia
3974 "ຕຸລາ", # tula
3975 "ພະຈິກ", # phachik
3976 "ທັນວາ", # thanuaa
3977 ]
3978 month_abbreviations = [
3979 "",
3980 "ມັງກອນ",
3981 "ກຸມພາ",
3982 "ມີນາ",
3983 "ເມສາ",
3984 "ພຶດສະພາ",
3985 "ມິຖຸນາ",
3986 "ກໍລະກົດ",
3987 "ສິງຫາ",
3988 "ກັນຍາ",
3989 "ຕຸລາ",
3990 "ພະຈິກ",
3991 "ທັນວາ",
3992 ]
3994 day_names = [
3995 "",
3996 "ວັນຈັນ", # vanchan
3997 "ວັນອັງຄານ", # vnoangkhan
3998 "ວັນພຸດ", # vanphud
3999 "ວັນພະຫັດ", # vanphahad
4000 "ວັນສຸກ", # vansuk
4001 "ວັນເສົາ", # vansao
4002 "ວັນອາທິດ", # vnoathid
4003 ]
4004 day_abbreviations = [
4005 "",
4006 "ວັນຈັນ",
4007 "ວັນອັງຄານ",
4008 "ວັນພຸດ",
4009 "ວັນພະຫັດ",
4010 "ວັນສຸກ",
4011 "ວັນເສົາ",
4012 "ວັນອາທິດ",
4013 ]
4015 BE_OFFSET = 543
4017 def year_full(self, year: int) -> str:
4018 """Lao always use Buddhist Era (BE) which is CE + 543"""
4019 year += self.BE_OFFSET
4020 return f"{year:04d}"
4022 def year_abbreviation(self, year: int) -> str:
4023 """Lao always use Buddhist Era (BE) which is CE + 543"""
4024 year += self.BE_OFFSET
4025 return f"{year:04d}"[2:]
4027 def _format_relative(
4028 self,
4029 humanized: str,
4030 timeframe: TimeFrameLiteral,
4031 delta: Union[float, int],
4032 ) -> str:
4033 """Lao normally doesn't have any space between words"""
4034 if timeframe == "now":
4035 return humanized
4037 direction = self.past if delta < 0 else self.future
4038 relative_string = direction.format(humanized)
4040 if timeframe == "seconds":
4041 relative_string = relative_string.replace(" ", "")
4043 return relative_string
4046class BengaliLocale(Locale):
4047 names = ["bn", "bn-bd", "bn-in"]
4049 past = "{0} আগে"
4050 future = "{0} পরে"
4052 timeframes = {
4053 "now": "এখন",
4054 "second": "একটি দ্বিতীয়",
4055 "seconds": "{0} সেকেন্ড",
4056 "minute": "এক মিনিট",
4057 "minutes": "{0} মিনিট",
4058 "hour": "এক ঘণ্টা",
4059 "hours": "{0} ঘণ্টা",
4060 "day": "এক দিন",
4061 "days": "{0} দিন",
4062 "month": "এক মাস",
4063 "months": "{0} মাস ",
4064 "year": "এক বছর",
4065 "years": "{0} বছর",
4066 }
4068 meridians = {"am": "সকাল", "pm": "বিকাল", "AM": "সকাল", "PM": "বিকাল"}
4070 month_names = [
4071 "",
4072 "জানুয়ারি",
4073 "ফেব্রুয়ারি",
4074 "মার্চ",
4075 "এপ্রিল",
4076 "মে",
4077 "জুন",
4078 "জুলাই",
4079 "আগস্ট",
4080 "সেপ্টেম্বর",
4081 "অক্টোবর",
4082 "নভেম্বর",
4083 "ডিসেম্বর",
4084 ]
4085 month_abbreviations = [
4086 "",
4087 "জানু",
4088 "ফেব",
4089 "মার্চ",
4090 "এপ্রি",
4091 "মে",
4092 "জুন",
4093 "জুল",
4094 "অগা",
4095 "সেপ্ট",
4096 "অক্টো",
4097 "নভে",
4098 "ডিসে",
4099 ]
4101 day_names = [
4102 "",
4103 "সোমবার",
4104 "মঙ্গলবার",
4105 "বুধবার",
4106 "বৃহস্পতিবার",
4107 "শুক্রবার",
4108 "শনিবার",
4109 "রবিবার",
4110 ]
4111 day_abbreviations = ["", "সোম", "মঙ্গল", "বুধ", "বৃহঃ", "শুক্র", "শনি", "রবি"]
4113 def _ordinal_number(self, n: int) -> str:
4114 if n > 10 or n == 0:
4115 return f"{n}তম"
4116 if n in [1, 5, 7, 8, 9, 10]:
4117 return f"{n}ম"
4118 if n in [2, 3]:
4119 return f"{n}য়"
4120 if n == 4:
4121 return f"{n}র্থ"
4122 if n == 6:
4123 return f"{n}ষ্ঠ"
4124 return ""
4127class RomanshLocale(Locale):
4128 names = ["rm", "rm-ch"]
4130 past = "avant {0}"
4131 future = "en {0}"
4133 timeframes = {
4134 "now": "en quest mument",
4135 "second": "in secunda",
4136 "seconds": "{0} secundas",
4137 "minute": "ina minuta",
4138 "minutes": "{0} minutas",
4139 "hour": "in'ura",
4140 "hours": "{0} ura",
4141 "day": "in di",
4142 "days": "{0} dis",
4143 "week": "in'emna",
4144 "weeks": "{0} emnas",
4145 "month": "in mais",
4146 "months": "{0} mais",
4147 "year": "in onn",
4148 "years": "{0} onns",
4149 }
4151 month_names = [
4152 "",
4153 "schaner",
4154 "favrer",
4155 "mars",
4156 "avrigl",
4157 "matg",
4158 "zercladur",
4159 "fanadur",
4160 "avust",
4161 "settember",
4162 "october",
4163 "november",
4164 "december",
4165 ]
4167 month_abbreviations = [
4168 "",
4169 "schan",
4170 "fav",
4171 "mars",
4172 "avr",
4173 "matg",
4174 "zer",
4175 "fan",
4176 "avu",
4177 "set",
4178 "oct",
4179 "nov",
4180 "dec",
4181 ]
4183 day_names = [
4184 "",
4185 "glindesdi",
4186 "mardi",
4187 "mesemna",
4188 "gievgia",
4189 "venderdi",
4190 "sonda",
4191 "dumengia",
4192 ]
4194 day_abbreviations = ["", "gli", "ma", "me", "gie", "ve", "so", "du"]
4197class RomanianLocale(Locale):
4198 names = ["ro", "ro-ro"]
4200 past = "{0} în urmă"
4201 future = "peste {0}"
4202 and_word = "și"
4204 timeframes = {
4205 "now": "acum",
4206 "second": "o secunda",
4207 "seconds": "{0} câteva secunde",
4208 "minute": "un minut",
4209 "minutes": "{0} minute",
4210 "hour": "o oră",
4211 "hours": "{0} ore",
4212 "day": "o zi",
4213 "days": "{0} zile",
4214 "month": "o lună",
4215 "months": "{0} luni",
4216 "year": "un an",
4217 "years": "{0} ani",
4218 }
4220 month_names = [
4221 "",
4222 "ianuarie",
4223 "februarie",
4224 "martie",
4225 "aprilie",
4226 "mai",
4227 "iunie",
4228 "iulie",
4229 "august",
4230 "septembrie",
4231 "octombrie",
4232 "noiembrie",
4233 "decembrie",
4234 ]
4235 month_abbreviations = [
4236 "",
4237 "ian",
4238 "febr",
4239 "mart",
4240 "apr",
4241 "mai",
4242 "iun",
4243 "iul",
4244 "aug",
4245 "sept",
4246 "oct",
4247 "nov",
4248 "dec",
4249 ]
4251 day_names = [
4252 "",
4253 "luni",
4254 "marți",
4255 "miercuri",
4256 "joi",
4257 "vineri",
4258 "sâmbătă",
4259 "duminică",
4260 ]
4261 day_abbreviations = ["", "Lun", "Mar", "Mie", "Joi", "Vin", "Sâm", "Dum"]
4264class SlovenianLocale(Locale):
4265 names = ["sl", "sl-si"]
4267 past = "pred {0}"
4268 future = "čez {0}"
4269 and_word = "in"
4271 timeframes = {
4272 "now": "zdaj",
4273 "second": "sekundo",
4274 "seconds": "{0} sekund",
4275 "minute": "minuta",
4276 "minutes": "{0} minutami",
4277 "hour": "uro",
4278 "hours": "{0} ur",
4279 "day": "dan",
4280 "days": "{0} dni",
4281 "month": "mesec",
4282 "months": "{0} mesecev",
4283 "year": "leto",
4284 "years": "{0} let",
4285 }
4287 meridians = {"am": "", "pm": "", "AM": "", "PM": ""}
4289 month_names = [
4290 "",
4291 "Januar",
4292 "Februar",
4293 "Marec",
4294 "April",
4295 "Maj",
4296 "Junij",
4297 "Julij",
4298 "Avgust",
4299 "September",
4300 "Oktober",
4301 "November",
4302 "December",
4303 ]
4305 month_abbreviations = [
4306 "",
4307 "Jan",
4308 "Feb",
4309 "Mar",
4310 "Apr",
4311 "Maj",
4312 "Jun",
4313 "Jul",
4314 "Avg",
4315 "Sep",
4316 "Okt",
4317 "Nov",
4318 "Dec",
4319 ]
4321 day_names = [
4322 "",
4323 "Ponedeljek",
4324 "Torek",
4325 "Sreda",
4326 "Četrtek",
4327 "Petek",
4328 "Sobota",
4329 "Nedelja",
4330 ]
4332 day_abbreviations = ["", "Pon", "Tor", "Sre", "Čet", "Pet", "Sob", "Ned"]
4335class IndonesianLocale(Locale):
4336 names = ["id", "id-id"]
4338 past = "{0} yang lalu"
4339 future = "dalam {0}"
4340 and_word = "dan"
4342 timeframes = {
4343 "now": "baru saja",
4344 "second": "1 sebentar",
4345 "seconds": "{0} detik",
4346 "minute": "1 menit",
4347 "minutes": "{0} menit",
4348 "hour": "1 jam",
4349 "hours": "{0} jam",
4350 "day": "1 hari",
4351 "days": "{0} hari",
4352 "week": "1 minggu",
4353 "weeks": "{0} minggu",
4354 "month": "1 bulan",
4355 "months": "{0} bulan",
4356 "quarter": "1 kuartal",
4357 "quarters": "{0} kuartal",
4358 "year": "1 tahun",
4359 "years": "{0} tahun",
4360 }
4362 meridians = {"am": "", "pm": "", "AM": "", "PM": ""}
4364 month_names = [
4365 "",
4366 "Januari",
4367 "Februari",
4368 "Maret",
4369 "April",
4370 "Mei",
4371 "Juni",
4372 "Juli",
4373 "Agustus",
4374 "September",
4375 "Oktober",
4376 "November",
4377 "Desember",
4378 ]
4380 month_abbreviations = [
4381 "",
4382 "Jan",
4383 "Feb",
4384 "Mar",
4385 "Apr",
4386 "Mei",
4387 "Jun",
4388 "Jul",
4389 "Ags",
4390 "Sept",
4391 "Okt",
4392 "Nov",
4393 "Des",
4394 ]
4396 day_names = ["", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu", "Minggu"]
4398 day_abbreviations = [
4399 "",
4400 "Senin",
4401 "Selasa",
4402 "Rabu",
4403 "Kamis",
4404 "Jumat",
4405 "Sabtu",
4406 "Minggu",
4407 ]
4410class NepaliLocale(Locale):
4411 names = ["ne", "ne-np"]
4413 past = "{0} पहिले"
4414 future = "{0} पछी"
4416 timeframes = {
4417 "now": "अहिले",
4418 "second": "एक सेकेन्ड",
4419 "seconds": "{0} सेकण्ड",
4420 "minute": "मिनेट",
4421 "minutes": "{0} मिनेट",
4422 "hour": "एक घण्टा",
4423 "hours": "{0} घण्टा",
4424 "day": "एक दिन",
4425 "days": "{0} दिन",
4426 "month": "एक महिना",
4427 "months": "{0} महिना",
4428 "year": "एक बर्ष",
4429 "years": "{0} बर्ष",
4430 }
4432 meridians = {"am": "पूर्वाह्न", "pm": "अपरान्ह", "AM": "पूर्वाह्न", "PM": "अपरान्ह"}
4434 month_names = [
4435 "",
4436 "जनवरी",
4437 "फेब्रुअरी",
4438 "मार्च",
4439 "एप्रील",
4440 "मे",
4441 "जुन",
4442 "जुलाई",
4443 "अगष्ट",
4444 "सेप्टेम्बर",
4445 "अक्टोबर",
4446 "नोवेम्बर",
4447 "डिसेम्बर",
4448 ]
4449 month_abbreviations = [
4450 "",
4451 "जन",
4452 "फेब",
4453 "मार्च",
4454 "एप्रील",
4455 "मे",
4456 "जुन",
4457 "जुलाई",
4458 "अग",
4459 "सेप",
4460 "अक्ट",
4461 "नोव",
4462 "डिस",
4463 ]
4465 day_names = [
4466 "",
4467 "सोमवार",
4468 "मंगलवार",
4469 "बुधवार",
4470 "बिहिवार",
4471 "शुक्रवार",
4472 "शनिवार",
4473 "आइतवार",
4474 ]
4476 day_abbreviations = ["", "सोम", "मंगल", "बुध", "बिहि", "शुक्र", "शनि", "आइत"]
4479class EstonianLocale(Locale):
4480 names = ["ee", "et"]
4482 past = "{0} tagasi"
4483 future = "{0} pärast"
4484 and_word = "ja"
4486 timeframes: ClassVar[Mapping[TimeFrameLiteral, Mapping[str, str]]] = {
4487 "now": {"past": "just nüüd", "future": "just nüüd"},
4488 "second": {"past": "üks sekund", "future": "ühe sekundi"},
4489 "seconds": {"past": "{0} sekundit", "future": "{0} sekundi"},
4490 "minute": {"past": "üks minut", "future": "ühe minuti"},
4491 "minutes": {"past": "{0} minutit", "future": "{0} minuti"},
4492 "hour": {"past": "tund aega", "future": "tunni aja"},
4493 "hours": {"past": "{0} tundi", "future": "{0} tunni"},
4494 "day": {"past": "üks päev", "future": "ühe päeva"},
4495 "days": {"past": "{0} päeva", "future": "{0} päeva"},
4496 "month": {"past": "üks kuu", "future": "ühe kuu"},
4497 "months": {"past": "{0} kuud", "future": "{0} kuu"},
4498 "year": {"past": "üks aasta", "future": "ühe aasta"},
4499 "years": {"past": "{0} aastat", "future": "{0} aasta"},
4500 }
4502 month_names = [
4503 "",
4504 "Jaanuar",
4505 "Veebruar",
4506 "Märts",
4507 "Aprill",
4508 "Mai",
4509 "Juuni",
4510 "Juuli",
4511 "August",
4512 "September",
4513 "Oktoober",
4514 "November",
4515 "Detsember",
4516 ]
4517 month_abbreviations = [
4518 "",
4519 "Jan",
4520 "Veb",
4521 "Mär",
4522 "Apr",
4523 "Mai",
4524 "Jun",
4525 "Jul",
4526 "Aug",
4527 "Sep",
4528 "Okt",
4529 "Nov",
4530 "Dets",
4531 ]
4533 day_names = [
4534 "",
4535 "Esmaspäev",
4536 "Teisipäev",
4537 "Kolmapäev",
4538 "Neljapäev",
4539 "Reede",
4540 "Laupäev",
4541 "Pühapäev",
4542 ]
4543 day_abbreviations = ["", "Esm", "Teis", "Kolm", "Nelj", "Re", "Lau", "Püh"]
4545 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
4546 form = self.timeframes[timeframe]
4547 if delta > 0:
4548 _form = form["future"]
4549 else:
4550 _form = form["past"]
4551 return _form.format(abs(delta))
4554class LatvianLocale(Locale):
4555 names = ["lv", "lv-lv"]
4557 past = "pirms {0}"
4558 future = "pēc {0}"
4559 and_word = "un"
4561 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
4562 "now": "tagad",
4563 "second": "sekundes",
4564 "seconds": "{0} sekundēm",
4565 "minute": "minūtes",
4566 "minutes": "{0} minūtēm",
4567 "hour": "stundas",
4568 "hours": "{0} stundām",
4569 "day": "dienas",
4570 "days": "{0} dienām",
4571 "week": "nedēļas",
4572 "weeks": "{0} nedēļām",
4573 "month": "mēneša",
4574 "months": "{0} mēnešiem",
4575 "year": "gada",
4576 "years": "{0} gadiem",
4577 }
4579 month_names = [
4580 "",
4581 "janvāris",
4582 "februāris",
4583 "marts",
4584 "aprīlis",
4585 "maijs",
4586 "jūnijs",
4587 "jūlijs",
4588 "augusts",
4589 "septembris",
4590 "oktobris",
4591 "novembris",
4592 "decembris",
4593 ]
4595 month_abbreviations = [
4596 "",
4597 "jan",
4598 "feb",
4599 "marts",
4600 "apr",
4601 "maijs",
4602 "jūnijs",
4603 "jūlijs",
4604 "aug",
4605 "sept",
4606 "okt",
4607 "nov",
4608 "dec",
4609 ]
4611 day_names = [
4612 "",
4613 "pirmdiena",
4614 "otrdiena",
4615 "trešdiena",
4616 "ceturtdiena",
4617 "piektdiena",
4618 "sestdiena",
4619 "svētdiena",
4620 ]
4622 day_abbreviations = [
4623 "",
4624 "pi",
4625 "ot",
4626 "tr",
4627 "ce",
4628 "pi",
4629 "se",
4630 "sv",
4631 ]
4634class SwahiliLocale(Locale):
4635 names = [
4636 "sw",
4637 "sw-ke",
4638 "sw-tz",
4639 ]
4641 past = "{0} iliyopita"
4642 future = "muda wa {0}"
4643 and_word = "na"
4645 timeframes = {
4646 "now": "sasa hivi",
4647 "second": "sekunde",
4648 "seconds": "sekunde {0}",
4649 "minute": "dakika moja",
4650 "minutes": "dakika {0}",
4651 "hour": "saa moja",
4652 "hours": "saa {0}",
4653 "day": "siku moja",
4654 "days": "siku {0}",
4655 "week": "wiki moja",
4656 "weeks": "wiki {0}",
4657 "month": "mwezi moja",
4658 "months": "miezi {0}",
4659 "year": "mwaka moja",
4660 "years": "miaka {0}",
4661 }
4663 meridians = {"am": "asu", "pm": "mch", "AM": "ASU", "PM": "MCH"}
4665 month_names = [
4666 "",
4667 "Januari",
4668 "Februari",
4669 "Machi",
4670 "Aprili",
4671 "Mei",
4672 "Juni",
4673 "Julai",
4674 "Agosti",
4675 "Septemba",
4676 "Oktoba",
4677 "Novemba",
4678 "Desemba",
4679 ]
4680 month_abbreviations = [
4681 "",
4682 "Jan",
4683 "Feb",
4684 "Mac",
4685 "Apr",
4686 "Mei",
4687 "Jun",
4688 "Jul",
4689 "Ago",
4690 "Sep",
4691 "Okt",
4692 "Nov",
4693 "Des",
4694 ]
4696 day_names = [
4697 "",
4698 "Jumatatu",
4699 "Jumanne",
4700 "Jumatano",
4701 "Alhamisi",
4702 "Ijumaa",
4703 "Jumamosi",
4704 "Jumapili",
4705 ]
4706 day_abbreviations = [
4707 "",
4708 "Jumatatu",
4709 "Jumanne",
4710 "Jumatano",
4711 "Alhamisi",
4712 "Ijumaa",
4713 "Jumamosi",
4714 "Jumapili",
4715 ]
4718class CroatianLocale(Locale):
4719 names = ["hr", "hr-hr"]
4721 past = "prije {0}"
4722 future = "za {0}"
4723 and_word = "i"
4725 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
4726 "now": "upravo sad",
4727 "second": "sekundu",
4728 "seconds": {"double": "{0} sekunde", "higher": "{0} sekundi"},
4729 "minute": "minutu",
4730 "minutes": {"double": "{0} minute", "higher": "{0} minuta"},
4731 "hour": "sat",
4732 "hours": {"double": "{0} sata", "higher": "{0} sati"},
4733 "day": "jedan dan",
4734 "days": {"double": "{0} dana", "higher": "{0} dana"},
4735 "week": "tjedan",
4736 "weeks": {"double": "{0} tjedna", "higher": "{0} tjedana"},
4737 "month": "mjesec",
4738 "months": {"double": "{0} mjeseca", "higher": "{0} mjeseci"},
4739 "year": "godinu",
4740 "years": {"double": "{0} godine", "higher": "{0} godina"},
4741 }
4743 month_names = [
4744 "",
4745 "siječanj",
4746 "veljača",
4747 "ožujak",
4748 "travanj",
4749 "svibanj",
4750 "lipanj",
4751 "srpanj",
4752 "kolovoz",
4753 "rujan",
4754 "listopad",
4755 "studeni",
4756 "prosinac",
4757 ]
4759 month_abbreviations = [
4760 "",
4761 "siječ",
4762 "velj",
4763 "ožuj",
4764 "trav",
4765 "svib",
4766 "lip",
4767 "srp",
4768 "kol",
4769 "ruj",
4770 "list",
4771 "stud",
4772 "pros",
4773 ]
4775 day_names = [
4776 "",
4777 "ponedjeljak",
4778 "utorak",
4779 "srijeda",
4780 "četvrtak",
4781 "petak",
4782 "subota",
4783 "nedjelja",
4784 ]
4786 day_abbreviations = [
4787 "",
4788 "po",
4789 "ut",
4790 "sr",
4791 "če",
4792 "pe",
4793 "su",
4794 "ne",
4795 ]
4797 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
4798 form = self.timeframes[timeframe]
4799 delta = abs(delta)
4800 if isinstance(form, Mapping):
4801 if 1 < delta <= 4:
4802 form = form["double"]
4803 else:
4804 form = form["higher"]
4806 return form.format(delta)
4809class LatinLocale(Locale):
4810 names = ["la", "la-va"]
4812 past = "ante {0}"
4813 future = "in {0}"
4814 and_word = "et"
4816 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
4817 "now": "nunc",
4818 "second": "secundum",
4819 "seconds": "{0} secundis",
4820 "minute": "minutam",
4821 "minutes": "{0} minutis",
4822 "hour": "horam",
4823 "hours": "{0} horas",
4824 "day": "diem",
4825 "days": "{0} dies",
4826 "week": "hebdomadem",
4827 "weeks": "{0} hebdomades",
4828 "month": "mensem",
4829 "months": "{0} mensis",
4830 "year": "annum",
4831 "years": "{0} annos",
4832 }
4834 month_names = [
4835 "",
4836 "Ianuarius",
4837 "Februarius",
4838 "Martius",
4839 "Aprilis",
4840 "Maius",
4841 "Iunius",
4842 "Iulius",
4843 "Augustus",
4844 "September",
4845 "October",
4846 "November",
4847 "December",
4848 ]
4850 month_abbreviations = [
4851 "",
4852 "Ian",
4853 "Febr",
4854 "Mart",
4855 "Apr",
4856 "Mai",
4857 "Iun",
4858 "Iul",
4859 "Aug",
4860 "Sept",
4861 "Oct",
4862 "Nov",
4863 "Dec",
4864 ]
4866 day_names = [
4867 "",
4868 "dies Lunae",
4869 "dies Martis",
4870 "dies Mercurii",
4871 "dies Iovis",
4872 "dies Veneris",
4873 "dies Saturni",
4874 "dies Solis",
4875 ]
4877 day_abbreviations = [
4878 "",
4879 "dies Lunae",
4880 "dies Martis",
4881 "dies Mercurii",
4882 "dies Iovis",
4883 "dies Veneris",
4884 "dies Saturni",
4885 "dies Solis",
4886 ]
4889class LithuanianLocale(Locale):
4890 names = ["lt", "lt-lt"]
4892 past = "prieš {0}"
4893 future = "po {0}"
4894 and_word = "ir"
4896 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
4897 "now": "dabar",
4898 "second": "sekundės",
4899 "seconds": "{0} sekundžių",
4900 "minute": "minutės",
4901 "minutes": "{0} minučių",
4902 "hour": "valandos",
4903 "hours": "{0} valandų",
4904 "day": "dieną",
4905 "days": "{0} dienų",
4906 "week": "savaitės",
4907 "weeks": "{0} savaičių",
4908 "month": "mėnesio",
4909 "months": "{0} mėnesių",
4910 "year": "metų",
4911 "years": "{0} metų",
4912 }
4914 month_names = [
4915 "",
4916 "sausis",
4917 "vasaris",
4918 "kovas",
4919 "balandis",
4920 "gegužė",
4921 "birželis",
4922 "liepa",
4923 "rugpjūtis",
4924 "rugsėjis",
4925 "spalis",
4926 "lapkritis",
4927 "gruodis",
4928 ]
4930 month_abbreviations = [
4931 "",
4932 "saus",
4933 "vas",
4934 "kovas",
4935 "bal",
4936 "geg",
4937 "birž",
4938 "liepa",
4939 "rugp",
4940 "rugs",
4941 "spalis",
4942 "lapkr",
4943 "gr",
4944 ]
4946 day_names = [
4947 "",
4948 "pirmadienis",
4949 "antradienis",
4950 "trečiadienis",
4951 "ketvirtadienis",
4952 "penktadienis",
4953 "šeštadienis",
4954 "sekmadienis",
4955 ]
4957 day_abbreviations = [
4958 "",
4959 "pi",
4960 "an",
4961 "tr",
4962 "ke",
4963 "pe",
4964 "še",
4965 "se",
4966 ]
4969class MalayLocale(Locale):
4970 names = ["ms", "ms-my", "ms-bn"]
4972 past = "{0} yang lalu"
4973 future = "dalam {0}"
4974 and_word = "dan"
4976 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
4977 "now": "sekarang",
4978 "second": "saat",
4979 "seconds": "{0} saat",
4980 "minute": "minit",
4981 "minutes": "{0} minit",
4982 "hour": "jam",
4983 "hours": "{0} jam",
4984 "day": "hari",
4985 "days": "{0} hari",
4986 "week": "minggu",
4987 "weeks": "{0} minggu",
4988 "month": "bulan",
4989 "months": "{0} bulan",
4990 "year": "tahun",
4991 "years": "{0} tahun",
4992 }
4994 month_names = [
4995 "",
4996 "Januari",
4997 "Februari",
4998 "Mac",
4999 "April",
5000 "Mei",
5001 "Jun",
5002 "Julai",
5003 "Ogos",
5004 "September",
5005 "Oktober",
5006 "November",
5007 "Disember",
5008 ]
5010 month_abbreviations = [
5011 "",
5012 "Jan.",
5013 "Feb.",
5014 "Mac",
5015 "Apr.",
5016 "Mei",
5017 "Jun",
5018 "Julai",
5019 "Og.",
5020 "Sept.",
5021 "Okt.",
5022 "Nov.",
5023 "Dis.",
5024 ]
5026 day_names = [
5027 "",
5028 "Isnin",
5029 "Selasa",
5030 "Rabu",
5031 "Khamis",
5032 "Jumaat",
5033 "Sabtu",
5034 "Ahad",
5035 ]
5037 day_abbreviations = [
5038 "",
5039 "Isnin",
5040 "Selasa",
5041 "Rabu",
5042 "Khamis",
5043 "Jumaat",
5044 "Sabtu",
5045 "Ahad",
5046 ]
5049class MalteseLocale(Locale):
5050 names = ["mt", "mt-mt"]
5052 past = "{0} ilu"
5053 future = "fi {0}"
5054 and_word = "u"
5056 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
5057 "now": "issa",
5058 "second": "sekonda",
5059 "seconds": "{0} sekondi",
5060 "minute": "minuta",
5061 "minutes": "{0} minuti",
5062 "hour": "siegħa",
5063 "hours": {"dual": "{0} sagħtejn", "plural": "{0} sigħat"},
5064 "day": "jum",
5065 "days": {"dual": "{0} jumejn", "plural": "{0} ijiem"},
5066 "week": "ġimgħa",
5067 "weeks": {"dual": "{0} ġimagħtejn", "plural": "{0} ġimgħat"},
5068 "month": "xahar",
5069 "months": {"dual": "{0} xahrejn", "plural": "{0} xhur"},
5070 "year": "sena",
5071 "years": {"dual": "{0} sentejn", "plural": "{0} snin"},
5072 }
5074 month_names = [
5075 "",
5076 "Jannar",
5077 "Frar",
5078 "Marzu",
5079 "April",
5080 "Mejju",
5081 "Ġunju",
5082 "Lulju",
5083 "Awwissu",
5084 "Settembru",
5085 "Ottubru",
5086 "Novembru",
5087 "Diċembru",
5088 ]
5090 month_abbreviations = [
5091 "",
5092 "Jan",
5093 "Fr",
5094 "Mar",
5095 "Apr",
5096 "Mejju",
5097 "Ġun",
5098 "Lul",
5099 "Aw",
5100 "Sett",
5101 "Ott",
5102 "Nov",
5103 "Diċ",
5104 ]
5106 day_names = [
5107 "",
5108 "It-Tnejn",
5109 "It-Tlieta",
5110 "L-Erbgħa",
5111 "Il-Ħamis",
5112 "Il-Ġimgħa",
5113 "Is-Sibt",
5114 "Il-Ħadd",
5115 ]
5117 day_abbreviations = [
5118 "",
5119 "T",
5120 "TL",
5121 "E",
5122 "Ħ",
5123 "Ġ",
5124 "S",
5125 "Ħ",
5126 ]
5128 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
5129 form = self.timeframes[timeframe]
5130 delta = abs(delta)
5131 if isinstance(form, Mapping):
5132 if delta == 2:
5133 form = form["dual"]
5134 else:
5135 form = form["plural"]
5137 return form.format(delta)
5140class SamiLocale(Locale):
5141 names = ["se", "se-fi", "se-no", "se-se"]
5143 past = "{0} dassái"
5144 future = "{0} " # NOTE: couldn't find preposition for Sami here, none needed?
5146 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
5147 "now": "dál",
5148 "second": "sekunda",
5149 "seconds": "{0} sekundda",
5150 "minute": "minuhta",
5151 "minutes": "{0} minuhta",
5152 "hour": "diimmu",
5153 "hours": "{0} diimmu",
5154 "day": "beaivvi",
5155 "days": "{0} beaivvi",
5156 "week": "vahku",
5157 "weeks": "{0} vahku",
5158 "month": "mánu",
5159 "months": "{0} mánu",
5160 "year": "jagi",
5161 "years": "{0} jagi",
5162 }
5164 month_names = [
5165 "",
5166 "Ođđajagimánnu",
5167 "Guovvamánnu",
5168 "Njukčamánnu",
5169 "Cuoŋománnu",
5170 "Miessemánnu",
5171 "Geassemánnu",
5172 "Suoidnemánnu",
5173 "Borgemánnu",
5174 "Čakčamánnu",
5175 "Golggotmánnu",
5176 "Skábmamánnu",
5177 "Juovlamánnu",
5178 ]
5180 month_abbreviations = [
5181 "",
5182 "Ođđajagimánnu",
5183 "Guovvamánnu",
5184 "Njukčamánnu",
5185 "Cuoŋománnu",
5186 "Miessemánnu",
5187 "Geassemánnu",
5188 "Suoidnemánnu",
5189 "Borgemánnu",
5190 "Čakčamánnu",
5191 "Golggotmánnu",
5192 "Skábmamánnu",
5193 "Juovlamánnu",
5194 ]
5196 day_names = [
5197 "",
5198 "Mánnodat",
5199 "Disdat",
5200 "Gaskavahkku",
5201 "Duorastat",
5202 "Bearjadat",
5203 "Lávvordat",
5204 "Sotnabeaivi",
5205 ]
5207 day_abbreviations = [
5208 "",
5209 "Mánnodat",
5210 "Disdat",
5211 "Gaskavahkku",
5212 "Duorastat",
5213 "Bearjadat",
5214 "Lávvordat",
5215 "Sotnabeaivi",
5216 ]
5219class OdiaLocale(Locale):
5220 names = ["or", "or-in"]
5222 past = "{0} ପୂର୍ବେ"
5223 future = "{0} ପରେ"
5225 timeframes = {
5226 "now": "ବର୍ତ୍ତମାନ",
5227 "second": "ଏକ ସେକେଣ୍ଡ",
5228 "seconds": "{0} ସେକେଣ୍ଡ",
5229 "minute": "ଏକ ମିନଟ",
5230 "minutes": "{0} ମିନଟ",
5231 "hour": "ଏକ ଘଣ୍ଟା",
5232 "hours": "{0} ଘଣ୍ଟା",
5233 "day": "ଏକ ଦିନ",
5234 "days": "{0} ଦିନ",
5235 "month": "ଏକ ମାସ",
5236 "months": "{0} ମାସ ",
5237 "year": "ଏକ ବର୍ଷ",
5238 "years": "{0} ବର୍ଷ",
5239 }
5241 meridians = {"am": "ପୂର୍ବାହ୍ନ", "pm": "ଅପରାହ୍ନ", "AM": "ପୂର୍ବାହ୍ନ", "PM": "ଅପରାହ୍ନ"}
5243 month_names = [
5244 "",
5245 "ଜାନୁଆରୀ",
5246 "ଫେବୃଆରୀ",
5247 "ମାର୍ଚ୍ଚ୍",
5248 "ଅପ୍ରେଲ",
5249 "ମଇ",
5250 "ଜୁନ୍",
5251 "ଜୁଲାଇ",
5252 "ଅଗଷ୍ଟ",
5253 "ସେପ୍ଟେମ୍ବର",
5254 "ଅକ୍ଟୋବର୍",
5255 "ନଭେମ୍ବର୍",
5256 "ଡିସେମ୍ବର୍",
5257 ]
5258 month_abbreviations = [
5259 "",
5260 "ଜାନୁ",
5261 "ଫେବୃ",
5262 "ମାର୍ଚ୍ଚ୍",
5263 "ଅପ୍ରେ",
5264 "ମଇ",
5265 "ଜୁନ୍",
5266 "ଜୁଲା",
5267 "ଅଗ",
5268 "ସେପ୍ଟେ",
5269 "ଅକ୍ଟୋ",
5270 "ନଭେ",
5271 "ଡିସେ",
5272 ]
5274 day_names = [
5275 "",
5276 "ସୋମବାର",
5277 "ମଙ୍ଗଳବାର",
5278 "ବୁଧବାର",
5279 "ଗୁରୁବାର",
5280 "ଶୁକ୍ରବାର",
5281 "ଶନିବାର",
5282 "ରବିବାର",
5283 ]
5284 day_abbreviations = [
5285 "",
5286 "ସୋମ",
5287 "ମଙ୍ଗଳ",
5288 "ବୁଧ",
5289 "ଗୁରୁ",
5290 "ଶୁକ୍ର",
5291 "ଶନି",
5292 "ରବି",
5293 ]
5295 def _ordinal_number(self, n: int) -> str:
5296 if n > 10 or n == 0:
5297 return f"{n}ତମ"
5298 if n in [1, 5, 7, 8, 9, 10]:
5299 return f"{n}ମ"
5300 if n in [2, 3]:
5301 return f"{n}ୟ"
5302 if n == 4:
5303 return f"{n}ର୍ଥ"
5304 if n == 6:
5305 return f"{n}ଷ୍ଠ"
5306 return ""
5309class SerbianLocale(Locale):
5310 names = ["sr", "sr-rs", "sr-sp"]
5312 past = "pre {0}"
5313 future = "za {0}"
5314 and_word = "i"
5316 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
5317 "now": "sada",
5318 "second": "sekundu",
5319 "seconds": {"double": "{0} sekunde", "higher": "{0} sekundi"},
5320 "minute": "minutu",
5321 "minutes": {"double": "{0} minute", "higher": "{0} minuta"},
5322 "hour": "sat",
5323 "hours": {"double": "{0} sata", "higher": "{0} sati"},
5324 "day": "dan",
5325 "days": {"double": "{0} dana", "higher": "{0} dana"},
5326 "week": "nedelju",
5327 "weeks": {"double": "{0} nedelje", "higher": "{0} nedelja"},
5328 "month": "mesec",
5329 "months": {"double": "{0} meseca", "higher": "{0} meseci"},
5330 "year": "godinu",
5331 "years": {"double": "{0} godine", "higher": "{0} godina"},
5332 }
5334 month_names = [
5335 "",
5336 "januar", # јануар
5337 "februar", # фебруар
5338 "mart", # март
5339 "april", # април
5340 "maj", # мај
5341 "jun", # јун
5342 "jul", # јул
5343 "avgust", # август
5344 "septembar", # септембар
5345 "oktobar", # октобар
5346 "novembar", # новембар
5347 "decembar", # децембар
5348 ]
5350 month_abbreviations = [
5351 "",
5352 "jan",
5353 "feb",
5354 "mar",
5355 "apr",
5356 "maj",
5357 "jun",
5358 "jul",
5359 "avg",
5360 "sep",
5361 "okt",
5362 "nov",
5363 "dec",
5364 ]
5366 day_names = [
5367 "",
5368 "ponedeljak", # понедељак
5369 "utorak", # уторак
5370 "sreda", # среда
5371 "četvrtak", # четвртак
5372 "petak", # петак
5373 "subota", # субота
5374 "nedelja", # недеља
5375 ]
5377 day_abbreviations = [
5378 "",
5379 "po", # по
5380 "ut", # ут
5381 "sr", # ср
5382 "če", # че
5383 "pe", # пе
5384 "su", # су
5385 "ne", # не
5386 ]
5388 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
5389 form = self.timeframes[timeframe]
5390 delta = abs(delta)
5391 if isinstance(form, Mapping):
5392 if 1 < delta <= 4:
5393 form = form["double"]
5394 else:
5395 form = form["higher"]
5397 return form.format(delta)
5400class LuxembourgishLocale(Locale):
5401 names = ["lb", "lb-lu"]
5403 past = "virun {0}"
5404 future = "an {0}"
5405 and_word = "an"
5407 timeframes = {
5408 "now": "just elo",
5409 "second": "enger Sekonn",
5410 "seconds": "{0} Sekonnen",
5411 "minute": "enger Minutt",
5412 "minutes": "{0} Minutten",
5413 "hour": "enger Stonn",
5414 "hours": "{0} Stonnen",
5415 "day": "engem Dag",
5416 "days": "{0} Deeg",
5417 "week": "enger Woch",
5418 "weeks": "{0} Wochen",
5419 "month": "engem Mount",
5420 "months": "{0} Méint",
5421 "year": "engem Joer",
5422 "years": "{0} Jahren",
5423 }
5425 timeframes_only_distance = timeframes.copy()
5426 timeframes_only_distance["second"] = "eng Sekonn"
5427 timeframes_only_distance["minute"] = "eng Minutt"
5428 timeframes_only_distance["hour"] = "eng Stonn"
5429 timeframes_only_distance["day"] = "een Dag"
5430 timeframes_only_distance["days"] = "{0} Deeg"
5431 timeframes_only_distance["week"] = "eng Woch"
5432 timeframes_only_distance["month"] = "ee Mount"
5433 timeframes_only_distance["months"] = "{0} Méint"
5434 timeframes_only_distance["year"] = "ee Joer"
5435 timeframes_only_distance["years"] = "{0} Joer"
5437 month_names = [
5438 "",
5439 "Januar",
5440 "Februar",
5441 "Mäerz",
5442 "Abrëll",
5443 "Mee",
5444 "Juni",
5445 "Juli",
5446 "August",
5447 "September",
5448 "Oktouber",
5449 "November",
5450 "Dezember",
5451 ]
5453 month_abbreviations = [
5454 "",
5455 "Jan",
5456 "Feb",
5457 "Mäe",
5458 "Abr",
5459 "Mee",
5460 "Jun",
5461 "Jul",
5462 "Aug",
5463 "Sep",
5464 "Okt",
5465 "Nov",
5466 "Dez",
5467 ]
5469 day_names = [
5470 "",
5471 "Méindeg",
5472 "Dënschdeg",
5473 "Mëttwoch",
5474 "Donneschdeg",
5475 "Freideg",
5476 "Samschdeg",
5477 "Sonndeg",
5478 ]
5480 day_abbreviations = ["", "Méi", "Dën", "Mët", "Don", "Fre", "Sam", "Son"]
5482 def _ordinal_number(self, n: int) -> str:
5483 return f"{n}."
5485 def describe(
5486 self,
5487 timeframe: TimeFrameLiteral,
5488 delta: Union[int, float] = 0,
5489 only_distance: bool = False,
5490 ) -> str:
5491 if not only_distance:
5492 return super().describe(timeframe, delta, only_distance)
5494 # Luxembourgish uses a different case without 'in' or 'ago'
5495 humanized = self.timeframes_only_distance[timeframe].format(trunc(abs(delta)))
5497 return humanized
5500class ZuluLocale(Locale):
5501 names = ["zu", "zu-za"]
5503 past = "{0} edlule"
5504 future = "{0} "
5505 and_word = "futhi"
5507 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[Mapping[str, str], str]]] = {
5508 "now": "manje",
5509 "second": {"past": "umzuzwana", "future": "ngomzuzwana"},
5510 "seconds": {"past": "{0} imizuzwana", "future": "{0} ngemizuzwana"},
5511 "minute": {"past": "umzuzu", "future": "ngomzuzu"},
5512 "minutes": {"past": "{0} imizuzu", "future": "{0} ngemizuzu"},
5513 "hour": {"past": "ihora", "future": "ngehora"},
5514 "hours": {"past": "{0} amahora", "future": "{0} emahoreni"},
5515 "day": {"past": "usuku", "future": "ngosuku"},
5516 "days": {"past": "{0} izinsuku", "future": "{0} ezinsukwini"},
5517 "week": {"past": "isonto", "future": "ngesonto"},
5518 "weeks": {"past": "{0} amasonto", "future": "{0} emasontweni"},
5519 "month": {"past": "inyanga", "future": "ngenyanga"},
5520 "months": {"past": "{0} izinyanga", "future": "{0} ezinyangeni"},
5521 "year": {"past": "unyaka", "future": "ngonyak"},
5522 "years": {"past": "{0} iminyaka", "future": "{0} eminyakeni"},
5523 }
5525 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
5526 """Zulu aware time frame format function, takes into account
5527 the differences between past and future forms."""
5528 abs_delta = abs(delta)
5529 form = self.timeframes[timeframe]
5531 if isinstance(form, str):
5532 return form.format(abs_delta)
5534 if delta > 0:
5535 key = "future"
5536 else:
5537 key = "past"
5538 form = form[key]
5540 return form.format(abs_delta)
5542 month_names = [
5543 "",
5544 "uMasingane",
5545 "uNhlolanja",
5546 "uNdasa",
5547 "UMbasa",
5548 "UNhlaba",
5549 "UNhlangulana",
5550 "uNtulikazi",
5551 "UNcwaba",
5552 "uMandulo",
5553 "uMfumfu",
5554 "uLwezi",
5555 "uZibandlela",
5556 ]
5558 month_abbreviations = [
5559 "",
5560 "uMasingane",
5561 "uNhlolanja",
5562 "uNdasa",
5563 "UMbasa",
5564 "UNhlaba",
5565 "UNhlangulana",
5566 "uNtulikazi",
5567 "UNcwaba",
5568 "uMandulo",
5569 "uMfumfu",
5570 "uLwezi",
5571 "uZibandlela",
5572 ]
5574 day_names = [
5575 "",
5576 "uMsombuluko",
5577 "uLwesibili",
5578 "uLwesithathu",
5579 "uLwesine",
5580 "uLwesihlanu",
5581 "uMgqibelo",
5582 "iSonto",
5583 ]
5585 day_abbreviations = [
5586 "",
5587 "uMsombuluko",
5588 "uLwesibili",
5589 "uLwesithathu",
5590 "uLwesine",
5591 "uLwesihlanu",
5592 "uMgqibelo",
5593 "iSonto",
5594 ]
5597class TamilLocale(Locale):
5598 names = ["ta", "ta-in", "ta-lk"]
5600 past = "{0} நேரத்திற்கு முன்பு"
5601 future = "இல் {0}"
5603 timeframes = {
5604 "now": "இப்போது",
5605 "second": "ஒரு இரண்டாவது",
5606 "seconds": "{0} விநாடிகள்",
5607 "minute": "ஒரு நிமிடம்",
5608 "minutes": "{0} நிமிடங்கள்",
5609 "hour": "ஒரு மணி",
5610 "hours": "{0} மணிநேரம்",
5611 "day": "ஒரு நாள்",
5612 "days": "{0} நாட்கள்",
5613 "week": "ஒரு வாரம்",
5614 "weeks": "{0} வாரங்கள்",
5615 "month": "ஒரு மாதம்",
5616 "months": "{0} மாதங்கள்",
5617 "year": "ஒரு ஆண்டு",
5618 "years": "{0} ஆண்டுகள்",
5619 }
5621 month_names = [
5622 "",
5623 "சித்திரை",
5624 "வைகாசி",
5625 "ஆனி",
5626 "ஆடி",
5627 "ஆவணி",
5628 "புரட்டாசி",
5629 "ஐப்பசி",
5630 "கார்த்திகை",
5631 "மார்கழி",
5632 "தை",
5633 "மாசி",
5634 "பங்குனி",
5635 ]
5637 month_abbreviations = [
5638 "",
5639 "ஜன",
5640 "பிப்",
5641 "மார்",
5642 "ஏப்",
5643 "மே",
5644 "ஜூன்",
5645 "ஜூலை",
5646 "ஆக",
5647 "செப்",
5648 "அக்",
5649 "நவ",
5650 "டிச",
5651 ]
5653 day_names = [
5654 "",
5655 "திங்கட்கிழமை",
5656 "செவ்வாய்க்கிழமை",
5657 "புதன்கிழமை",
5658 "வியாழக்கிழமை",
5659 "வெள்ளிக்கிழமை",
5660 "சனிக்கிழமை",
5661 "ஞாயிற்றுக்கிழமை",
5662 ]
5664 day_abbreviations = [
5665 "",
5666 "திங்கட்",
5667 "செவ்வாய்",
5668 "புதன்",
5669 "வியாழன்",
5670 "வெள்ளி",
5671 "சனி",
5672 "ஞாயிறு",
5673 ]
5675 def _ordinal_number(self, n: int) -> str:
5676 if n == 1:
5677 return f"{n}வது"
5678 elif n >= 0:
5679 return f"{n}ஆம்"
5680 else:
5681 return ""
5684class AlbanianLocale(Locale):
5685 names = ["sq", "sq-al"]
5687 past = "{0} më parë"
5688 future = "në {0}"
5689 and_word = "dhe"
5691 timeframes = {
5692 "now": "tani",
5693 "second": "sekondë",
5694 "seconds": "{0} sekonda",
5695 "minute": "minutë",
5696 "minutes": "{0} minuta",
5697 "hour": "orë",
5698 "hours": "{0} orë",
5699 "day": "ditë",
5700 "days": "{0} ditë",
5701 "week": "javë",
5702 "weeks": "{0} javë",
5703 "month": "muaj",
5704 "months": "{0} muaj",
5705 "year": "vit",
5706 "years": "{0} vjet",
5707 }
5709 month_names = [
5710 "",
5711 "janar",
5712 "shkurt",
5713 "mars",
5714 "prill",
5715 "maj",
5716 "qershor",
5717 "korrik",
5718 "gusht",
5719 "shtator",
5720 "tetor",
5721 "nëntor",
5722 "dhjetor",
5723 ]
5725 month_abbreviations = [
5726 "",
5727 "jan",
5728 "shk",
5729 "mar",
5730 "pri",
5731 "maj",
5732 "qer",
5733 "korr",
5734 "gush",
5735 "sht",
5736 "tet",
5737 "nën",
5738 "dhj",
5739 ]
5741 day_names = [
5742 "",
5743 "e hënë",
5744 "e martë",
5745 "e mërkurë",
5746 "e enjte",
5747 "e premte",
5748 "e shtunë",
5749 "e diel",
5750 ]
5752 day_abbreviations = [
5753 "",
5754 "hën",
5755 "mar",
5756 "mër",
5757 "enj",
5758 "pre",
5759 "sht",
5760 "die",
5761 ]
5764class GeorgianLocale(Locale):
5765 names = ["ka", "ka-ge"]
5767 past = "{0} წინ" # ts’in
5768 future = "{0} შემდეგ" # shemdeg
5769 and_word = "და" # da
5771 timeframes = {
5772 "now": "ახლა", # akhla
5773 # When a cardinal qualifies a noun, it stands in the singular
5774 "second": "წამის", # ts’amis
5775 "seconds": "{0} წამის",
5776 "minute": "წუთის", # ts’utis
5777 "minutes": "{0} წუთის",
5778 "hour": "საათის", # saatis
5779 "hours": "{0} საათის",
5780 "day": "დღის", # dghis
5781 "days": "{0} დღის",
5782 "week": "კვირის", # k’viris
5783 "weeks": "{0} კვირის",
5784 "month": "თვის", # tvis
5785 "months": "{0} თვის",
5786 "year": "წლის", # ts’lis
5787 "years": "{0} წლის",
5788 }
5790 month_names = [
5791 # modern month names
5792 "",
5793 "იანვარი", # Ianvari
5794 "თებერვალი", # Tebervali
5795 "მარტი", # Mart'i
5796 "აპრილი", # Ap'rili
5797 "მაისი", # Maisi
5798 "ივნისი", # Ivnisi
5799 "ივლისი", # Ivlisi
5800 "აგვისტო", # Agvist'o
5801 "სექტემბერი", # Sekt'emberi
5802 "ოქტომბერი", # Okt'omberi
5803 "ნოემბერი", # Noemberi
5804 "დეკემბერი", # Dek'emberi
5805 ]
5807 month_abbreviations = [
5808 # no abbr. found yet
5809 "",
5810 "იანვარი", # Ianvari
5811 "თებერვალი", # Tebervali
5812 "მარტი", # Mart'i
5813 "აპრილი", # Ap'rili
5814 "მაისი", # Maisi
5815 "ივნისი", # Ivnisi
5816 "ივლისი", # Ivlisi
5817 "აგვისტო", # Agvist'o
5818 "სექტემბერი", # Sekt'emberi
5819 "ოქტომბერი", # Okt'omberi
5820 "ნოემბერი", # Noemberi
5821 "დეკემბერი", # Dek'emberi
5822 ]
5824 day_names = [
5825 "",
5826 "ორშაბათი", # orshabati
5827 "სამშაბათი", # samshabati
5828 "ოთხშაბათი", # otkhshabati
5829 "ხუთშაბათი", # khutshabati
5830 "პარასკევი", # p’arask’evi
5831 "შაბათი", # shabati
5832 # "k’vira" also serves as week; to avoid confusion "k’vira-dge" can be used for Sunday
5833 "კვირა", # k’vira
5834 ]
5836 day_abbreviations = [
5837 "",
5838 "ორშაბათი", # orshabati
5839 "სამშაბათი", # samshabati
5840 "ოთხშაბათი", # otkhshabati
5841 "ხუთშაბათი", # khutshabati
5842 "პარასკევი", # p’arask’evi
5843 "შაბათი", # shabati
5844 "კვირა", # k’vira
5845 ]
5848class SinhalaLocale(Locale):
5849 names = ["si", "si-lk"]
5851 past = "{0}ට පෙර"
5852 future = "{0}"
5853 and_word = "සහ"
5855 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[Mapping[str, str], str]]] = {
5856 "now": "දැන්",
5857 "second": {
5858 "past": "තත්පරයක",
5859 "future": "තත්පරයකින්",
5860 }, # ක් is the article
5861 "seconds": {
5862 "past": "තත්පර {0} ක",
5863 "future": "තත්පර {0} කින්",
5864 },
5865 "minute": {
5866 "past": "විනාඩියක",
5867 "future": "විනාඩියකින්",
5868 },
5869 "minutes": {
5870 "past": "විනාඩි {0} ක",
5871 "future": "මිනිත්තු {0} කින්",
5872 },
5873 "hour": {"past": "පැයක", "future": "පැයකින්"},
5874 "hours": {
5875 "past": "පැය {0} ක",
5876 "future": "පැය {0} කින්",
5877 },
5878 "day": {"past": "දිනක", "future": "දිනකට"},
5879 "days": {
5880 "past": "දින {0} ක",
5881 "future": "දින {0} කින්",
5882 },
5883 "week": {"past": "සතියක", "future": "සතියකින්"},
5884 "weeks": {
5885 "past": "සති {0} ක",
5886 "future": "සති {0} කින්",
5887 },
5888 "month": {"past": "මාසයක", "future": "එය මාසය තුළ"},
5889 "months": {
5890 "past": "මාස {0} ක",
5891 "future": "මාස {0} කින්",
5892 },
5893 "year": {"past": "වසරක", "future": "වසරක් තුළ"},
5894 "years": {
5895 "past": "අවුරුදු {0} ක",
5896 "future": "අවුරුදු {0} තුළ",
5897 },
5898 }
5899 # Sinhala: the general format to describe timeframe is different from past and future,
5900 # so we do not copy the original timeframes dictionary
5901 timeframes_only_distance = {}
5902 timeframes_only_distance["second"] = "තත්පරයක්"
5903 timeframes_only_distance["seconds"] = "තත්පර {0}"
5904 timeframes_only_distance["minute"] = "මිනිත්තුවක්"
5905 timeframes_only_distance["minutes"] = "විනාඩි {0}"
5906 timeframes_only_distance["hour"] = "පැයක්"
5907 timeframes_only_distance["hours"] = "පැය {0}"
5908 timeframes_only_distance["day"] = "දවසක්"
5909 timeframes_only_distance["days"] = "දවස් {0}"
5910 timeframes_only_distance["week"] = "සතියක්"
5911 timeframes_only_distance["weeks"] = "සති {0}"
5912 timeframes_only_distance["month"] = "මාසයක්"
5913 timeframes_only_distance["months"] = "මාස {0}"
5914 timeframes_only_distance["year"] = "අවුරුද්දක්"
5915 timeframes_only_distance["years"] = "අවුරුදු {0}"
5917 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
5918 """
5919 Sinhala awares time frame format function, takes into account
5920 the differences between general, past, and future forms (three different suffixes).
5921 """
5922 abs_delta = abs(delta)
5923 form = self.timeframes[timeframe]
5925 if isinstance(form, str):
5926 return form.format(abs_delta)
5928 if delta > 0:
5929 key = "future"
5930 else:
5931 key = "past"
5932 form = form[key]
5934 return form.format(abs_delta)
5936 def describe(
5937 self,
5938 timeframe: TimeFrameLiteral,
5939 delta: Union[float, int] = 1, # key is always future when only_distance=False
5940 only_distance: bool = False,
5941 ) -> str:
5942 """Describes a delta within a timeframe in plain language.
5944 :param timeframe: a string representing a timeframe.
5945 :param delta: a quantity representing a delta in a timeframe.
5946 :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords
5947 """
5949 if not only_distance:
5950 return super().describe(timeframe, delta, only_distance)
5951 # Sinhala uses a different case without 'in' or 'ago'
5952 humanized = self.timeframes_only_distance[timeframe].format(trunc(abs(delta)))
5954 return humanized
5956 month_names = [
5957 "",
5958 "ජනවාරි",
5959 "පෙබරවාරි",
5960 "මාර්තු",
5961 "අප්රේල්",
5962 "මැයි",
5963 "ජූනි",
5964 "ජූලි",
5965 "අගෝස්තු",
5966 "සැප්තැම්බර්",
5967 "ඔක්තෝබර්",
5968 "නොවැම්බර්",
5969 "දෙසැම්බර්",
5970 ]
5972 month_abbreviations = [
5973 "",
5974 "ජන",
5975 "පෙබ",
5976 "මාර්",
5977 "අප්රේ",
5978 "මැයි",
5979 "ජුනි",
5980 "ජූලි",
5981 "අගෝ",
5982 "සැප්",
5983 "ඔක්",
5984 "නොවැ",
5985 "දෙසැ",
5986 ]
5988 day_names = [
5989 "",
5990 "සදුදා",
5991 "අඟහරැවදා",
5992 "බදාදා",
5993 "බ්රහස්පතින්දා",
5994 "සිකුරාදා",
5995 "සෙනසුරාදා",
5996 "ඉරිදා",
5997 ]
5999 day_abbreviations = [
6000 "",
6001 "සදුද",
6002 "බදා",
6003 "බදා",
6004 "සිකු",
6005 "සෙන",
6006 "අ",
6007 "ඉරිදා",
6008 ]
6011class UrduLocale(Locale):
6012 names = ["ur", "ur-pk"]
6014 past = "پہلے {0}"
6015 future = "میں {0}"
6016 and_word = "اور"
6018 timeframes = {
6019 "now": "ابھی",
6020 "second": "ایک سیکنڈ",
6021 "seconds": "{0} سیکنڈ",
6022 "minute": "ایک منٹ",
6023 "minutes": "{0} منٹ",
6024 "hour": "ایک گھنٹے",
6025 "hours": "{0} گھنٹے",
6026 "day": "ایک دن",
6027 "days": "{0} دن",
6028 "week": "ایک ہفتے",
6029 "weeks": "{0} ہفتے",
6030 "month": "ایک مہینہ",
6031 "months": "{0} ماہ",
6032 "year": "ایک سال",
6033 "years": "{0} سال",
6034 }
6036 month_names = [
6037 "",
6038 "جنوری",
6039 "فروری",
6040 "مارچ",
6041 "اپریل",
6042 "مئی",
6043 "جون",
6044 "جولائی",
6045 "اگست",
6046 "ستمبر",
6047 "اکتوبر",
6048 "نومبر",
6049 "دسمبر",
6050 ]
6052 month_abbreviations = [
6053 "",
6054 "جنوری",
6055 "فروری",
6056 "مارچ",
6057 "اپریل",
6058 "مئی",
6059 "جون",
6060 "جولائی",
6061 "اگست",
6062 "ستمبر",
6063 "اکتوبر",
6064 "نومبر",
6065 "دسمبر",
6066 ]
6068 day_names = [
6069 "",
6070 "سوموار",
6071 "منگل",
6072 "بدھ",
6073 "جمعرات",
6074 "جمعہ",
6075 "ہفتہ",
6076 "اتوار",
6077 ]
6079 day_abbreviations = [
6080 "",
6081 "سوموار",
6082 "منگل",
6083 "بدھ",
6084 "جمعرات",
6085 "جمعہ",
6086 "ہفتہ",
6087 "اتوار",
6088 ]
6091class KazakhLocale(Locale):
6092 names = ["kk", "kk-kz"]
6094 past = "{0} бұрын"
6095 future = "{0} кейін"
6096 timeframes = {
6097 "now": "қазір",
6098 "second": "бір секунд",
6099 "seconds": "{0} секунд",
6100 "minute": "бір минут",
6101 "minutes": "{0} минут",
6102 "hour": "бір сағат",
6103 "hours": "{0} сағат",
6104 "day": "бір күн",
6105 "days": "{0} күн",
6106 "week": "бір апта",
6107 "weeks": "{0} апта",
6108 "month": "бір ай",
6109 "months": "{0} ай",
6110 "year": "бір жыл",
6111 "years": "{0} жыл",
6112 }
6114 month_names = [
6115 "",
6116 "Қаңтар",
6117 "Ақпан",
6118 "Наурыз",
6119 "Сәуір",
6120 "Мамыр",
6121 "Маусым",
6122 "Шілде",
6123 "Тамыз",
6124 "Қыркүйек",
6125 "Қазан",
6126 "Қараша",
6127 "Желтоқсан",
6128 ]
6129 month_abbreviations = [
6130 "",
6131 "Қан",
6132 "Ақп",
6133 "Нау",
6134 "Сәу",
6135 "Мам",
6136 "Мау",
6137 "Шіл",
6138 "Там",
6139 "Қыр",
6140 "Қаз",
6141 "Қар",
6142 "Жел",
6143 ]
6145 day_names = [
6146 "",
6147 "Дүйсембі",
6148 "Сейсенбі",
6149 "Сәрсенбі",
6150 "Бейсенбі",
6151 "Жұма",
6152 "Сенбі",
6153 "Жексенбі",
6154 ]
6155 day_abbreviations = ["", "Дс", "Сс", "Ср", "Бс", "Жм", "Сб", "Жс"]
6158class AmharicLocale(Locale):
6159 names = ["am", "am-et"]
6161 past = "{0} በፊት"
6162 future = "{0} ውስጥ"
6163 and_word = "እና"
6165 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[Mapping[str, str], str]]] = {
6166 "now": "አሁን",
6167 "second": {
6168 "past": "ከአንድ ሰከንድ",
6169 "future": "በአንድ ሰከንድ",
6170 },
6171 "seconds": {
6172 "past": "ከ {0} ሰከንድ",
6173 "future": "በ {0} ሰከንድ",
6174 },
6175 "minute": {
6176 "past": "ከአንድ ደቂቃ",
6177 "future": "በአንድ ደቂቃ",
6178 },
6179 "minutes": {
6180 "past": "ከ {0} ደቂቃዎች",
6181 "future": "በ {0} ደቂቃዎች",
6182 },
6183 "hour": {
6184 "past": "ከአንድ ሰዓት",
6185 "future": "በአንድ ሰዓት",
6186 },
6187 "hours": {
6188 "past": "ከ {0} ሰዓታት",
6189 "future": "በ {0} ሰከንድ",
6190 },
6191 "day": {
6192 "past": "ከአንድ ቀን",
6193 "future": "በአንድ ቀን",
6194 },
6195 "days": {
6196 "past": "ከ {0} ቀናት",
6197 "future": "በ {0} ቀናት",
6198 },
6199 "week": {
6200 "past": "ከአንድ ሳምንት",
6201 "future": "በአንድ ሳምንት",
6202 },
6203 "weeks": {
6204 "past": "ከ {0} ሳምንታት",
6205 "future": "በ {0} ሳምንታት",
6206 },
6207 "month": {
6208 "past": "ከአንድ ወር",
6209 "future": "በአንድ ወር",
6210 },
6211 "months": {
6212 "past": "ከ {0} ወር",
6213 "future": "በ {0} ወራት",
6214 },
6215 "year": {
6216 "past": "ከአንድ አመት",
6217 "future": "በአንድ አመት",
6218 },
6219 "years": {
6220 "past": "ከ {0} ዓመታት",
6221 "future": "በ {0} ዓመታት",
6222 },
6223 }
6224 # Amharic: the general format to describe timeframe is different from past and future,
6225 # so we do not copy the original timeframes dictionary
6226 timeframes_only_distance = {
6227 "second": "አንድ ሰከንድ",
6228 "seconds": "{0} ሰከንድ",
6229 "minute": "አንድ ደቂቃ",
6230 "minutes": "{0} ደቂቃዎች",
6231 "hour": "አንድ ሰዓት",
6232 "hours": "{0} ሰዓት",
6233 "day": "አንድ ቀን",
6234 "days": "{0} ቀናት",
6235 "week": "አንድ ሳምንት",
6236 "weeks": "{0} ሳምንት",
6237 "month": "አንድ ወር",
6238 "months": "{0} ወራት",
6239 "year": "አንድ አመት",
6240 "years": "{0} ዓመታት",
6241 }
6243 month_names = [
6244 "",
6245 "ጃንዩወሪ",
6246 "ፌብሩወሪ",
6247 "ማርች",
6248 "ኤፕሪል",
6249 "ሜይ",
6250 "ጁን",
6251 "ጁላይ",
6252 "ኦገስት",
6253 "ሴፕቴምበር",
6254 "ኦክቶበር",
6255 "ኖቬምበር",
6256 "ዲሴምበር",
6257 ]
6259 month_abbreviations = [
6260 "",
6261 "ጃንዩ",
6262 "ፌብሩ",
6263 "ማርች",
6264 "ኤፕሪ",
6265 "ሜይ",
6266 "ጁን",
6267 "ጁላይ",
6268 "ኦገስ",
6269 "ሴፕቴ",
6270 "ኦክቶ",
6271 "ኖቬም",
6272 "ዲሴም",
6273 ]
6275 day_names = [
6276 "",
6277 "ሰኞ",
6278 "ማክሰኞ",
6279 "ረቡዕ",
6280 "ሐሙስ",
6281 "ዓርብ",
6282 "ቅዳሜ",
6283 "እሑድ",
6284 ]
6285 day_abbreviations = ["", "እ", "ሰ", "ማ", "ረ", "ሐ", "ዓ", "ቅ"]
6287 def _ordinal_number(self, n: int) -> str:
6288 return f"{n}ኛ"
6290 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
6291 """
6292 Amharic awares time frame format function, takes into account
6293 the differences between general, past, and future forms (three different suffixes).
6294 """
6295 abs_delta = abs(delta)
6296 form = self.timeframes[timeframe]
6298 if isinstance(form, str):
6299 return form.format(abs_delta)
6301 if delta > 0:
6302 key = "future"
6303 else:
6304 key = "past"
6305 form = form[key]
6307 return form.format(abs_delta)
6309 def describe(
6310 self,
6311 timeframe: TimeFrameLiteral,
6312 delta: Union[float, int] = 1, # key is always future when only_distance=False
6313 only_distance: bool = False,
6314 ) -> str:
6315 """Describes a delta within a timeframe in plain language.
6317 :param timeframe: a string representing a timeframe.
6318 :param delta: a quantity representing a delta in a timeframe.
6319 :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords
6320 """
6322 if not only_distance:
6323 return super().describe(timeframe, delta, only_distance)
6324 humanized = self.timeframes_only_distance[timeframe].format(trunc(abs(delta)))
6326 return humanized
6329class ArmenianLocale(Locale):
6330 names = ["hy", "hy-am"]
6331 past = "{0} առաջ"
6332 future = "{0}ից"
6333 and_word = "Եվ" # Yev
6335 timeframes = {
6336 "now": "հիմա",
6337 "second": "վայրկյան",
6338 "seconds": "{0} վայրկյան",
6339 "minute": "րոպե",
6340 "minutes": "{0} րոպե",
6341 "hour": "ժամ",
6342 "hours": "{0} ժամ",
6343 "day": "օր",
6344 "days": "{0} օր",
6345 "month": "ամիս",
6346 "months": "{0} ամիս",
6347 "year": "տարին",
6348 "years": "{0} տարին",
6349 "week": "շաբաթ",
6350 "weeks": "{0} շաբաթ",
6351 }
6353 meridians = {
6354 "am": "Ամ",
6355 "pm": "պ.մ.",
6356 "AM": "Ամ",
6357 "PM": "պ.մ.",
6358 }
6360 month_names = [
6361 "",
6362 "հունվար",
6363 "փետրվար",
6364 "մարտ",
6365 "ապրիլ",
6366 "մայիս",
6367 "հունիս",
6368 "հուլիս",
6369 "օգոստոս",
6370 "սեպտեմբեր",
6371 "հոկտեմբեր",
6372 "նոյեմբեր",
6373 "դեկտեմբեր",
6374 ]
6376 month_abbreviations = [
6377 "",
6378 "հունվար",
6379 "փետրվար",
6380 "մարտ",
6381 "ապրիլ",
6382 "մայիս",
6383 "հունիս",
6384 "հուլիս",
6385 "օգոստոս",
6386 "սեպտեմբեր",
6387 "հոկտեմբեր",
6388 "նոյեմբեր",
6389 "դեկտեմբեր",
6390 ]
6392 day_names = [
6393 "",
6394 "երկուշաբթի",
6395 "երեքշաբթի",
6396 "չորեքշաբթի",
6397 "հինգշաբթի",
6398 "ուրբաթ",
6399 "շաբաթ",
6400 "կիրակի",
6401 ]
6403 day_abbreviations = [
6404 "",
6405 "երկ.",
6406 "երեք.",
6407 "չորեք.",
6408 "հինգ.",
6409 "ուրբ.",
6410 "շաբ.",
6411 "կիր.",
6412 ]
6415class UzbekLocale(Locale):
6416 names = ["uz", "uz-uz"]
6417 past = "{0}dan avval"
6418 future = "{0}dan keyin"
6419 timeframes = {
6420 "now": "hozir",
6421 "second": "bir soniya",
6422 "seconds": "{0} soniya",
6423 "minute": "bir daqiqa",
6424 "minutes": "{0} daqiqa",
6425 "hour": "bir soat",
6426 "hours": "{0} soat",
6427 "day": "bir kun",
6428 "days": "{0} kun",
6429 "week": "bir hafta",
6430 "weeks": "{0} hafta",
6431 "month": "bir oy",
6432 "months": "{0} oy",
6433 "year": "bir yil",
6434 "years": "{0} yil",
6435 }
6437 month_names = [
6438 "",
6439 "Yanvar",
6440 "Fevral",
6441 "Mart",
6442 "Aprel",
6443 "May",
6444 "Iyun",
6445 "Iyul",
6446 "Avgust",
6447 "Sentyabr",
6448 "Oktyabr",
6449 "Noyabr",
6450 "Dekabr",
6451 ]
6453 month_abbreviations = [
6454 "",
6455 "Yan",
6456 "Fev",
6457 "Mar",
6458 "Apr",
6459 "May",
6460 "Iyn",
6461 "Iyl",
6462 "Avg",
6463 "Sen",
6464 "Okt",
6465 "Noy",
6466 "Dek",
6467 ]
6469 day_names = [
6470 "",
6471 "Dushanba",
6472 "Seshanba",
6473 "Chorshanba",
6474 "Payshanba",
6475 "Juma",
6476 "Shanba",
6477 "Yakshanba",
6478 ]
6480 day_abbreviations = ["", "Dush", "Sesh", "Chor", "Pay", "Jum", "Shan", "Yak"]