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