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 "week": "een week",
1623 "weeks": "{0} weke",
1624 "month": "een maand",
1625 "months": "{0} maande",
1626 "year": "een jaar",
1627 "years": "{0} jaar",
1628 }
1630 month_names = [
1631 "",
1632 "Januarie",
1633 "Februarie",
1634 "Maart",
1635 "April",
1636 "Mei",
1637 "Junie",
1638 "Julie",
1639 "Augustus",
1640 "September",
1641 "Oktober",
1642 "November",
1643 "Desember",
1644 ]
1645 month_abbreviations = [
1646 "",
1647 "Jan",
1648 "Feb",
1649 "Mrt",
1650 "Apr",
1651 "Mei",
1652 "Jun",
1653 "Jul",
1654 "Aug",
1655 "Sep",
1656 "Okt",
1657 "Nov",
1658 "Des",
1659 ]
1661 day_names = [
1662 "",
1663 "Maandag",
1664 "Dinsdag",
1665 "Woensdag",
1666 "Donderdag",
1667 "Vrydag",
1668 "Saterdag",
1669 "Sondag",
1670 ]
1671 day_abbreviations = ["", "Ma", "Di", "Wo", "Do", "Vr", "Za", "So"]
1674class BulgarianLocale(SlavicBaseLocale):
1675 names = ["bg", "bg-bg"]
1677 past = "{0} назад"
1678 future = "напред {0}"
1680 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
1681 "now": "сега",
1682 "second": "секунда",
1683 "seconds": "{0} няколко секунди",
1684 "minute": "минута",
1685 "minutes": {
1686 "singular": "{0} минута",
1687 "dual": "{0} минути",
1688 "plural": "{0} минути",
1689 },
1690 "hour": "час",
1691 "hours": {"singular": "{0} час", "dual": "{0} часа", "plural": "{0} часа"},
1692 "day": "ден",
1693 "days": {"singular": "{0} ден", "dual": "{0} дни", "plural": "{0} дни"},
1694 "month": "месец",
1695 "months": {
1696 "singular": "{0} месец",
1697 "dual": "{0} месеца",
1698 "plural": "{0} месеца",
1699 },
1700 "year": "година",
1701 "years": {
1702 "singular": "{0} година",
1703 "dual": "{0} години",
1704 "plural": "{0} години",
1705 },
1706 }
1708 month_names = [
1709 "",
1710 "януари",
1711 "февруари",
1712 "март",
1713 "април",
1714 "май",
1715 "юни",
1716 "юли",
1717 "август",
1718 "септември",
1719 "октомври",
1720 "ноември",
1721 "декември",
1722 ]
1723 month_abbreviations = [
1724 "",
1725 "ян",
1726 "февр",
1727 "март",
1728 "апр",
1729 "май",
1730 "юни",
1731 "юли",
1732 "авг",
1733 "септ",
1734 "окт",
1735 "ноем",
1736 "дек",
1737 ]
1739 day_names = [
1740 "",
1741 "понеделник",
1742 "вторник",
1743 "сряда",
1744 "четвъртък",
1745 "петък",
1746 "събота",
1747 "неделя",
1748 ]
1749 day_abbreviations = ["", "пон", "вт", "ср", "четв", "пет", "съб", "нед"]
1752class UkrainianLocale(SlavicBaseLocale):
1753 names = ["ua", "uk", "uk-ua"]
1755 past = "{0} тому"
1756 future = "за {0}"
1758 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
1759 "now": "зараз",
1760 "second": "секунда",
1761 "seconds": "{0} кілька секунд",
1762 "minute": "хвилину",
1763 "minutes": {
1764 "singular": "{0} хвилину",
1765 "dual": "{0} хвилини",
1766 "plural": "{0} хвилин",
1767 },
1768 "hour": "годину",
1769 "hours": {
1770 "singular": "{0} годину",
1771 "dual": "{0} години",
1772 "plural": "{0} годин",
1773 },
1774 "day": "день",
1775 "days": {"singular": "{0} день", "dual": "{0} дні", "plural": "{0} днів"},
1776 "month": "місяць",
1777 "months": {
1778 "singular": "{0} місяць",
1779 "dual": "{0} місяці",
1780 "plural": "{0} місяців",
1781 },
1782 "year": "рік",
1783 "years": {"singular": "{0} рік", "dual": "{0} роки", "plural": "{0} років"},
1784 }
1786 month_names = [
1787 "",
1788 "січня",
1789 "лютого",
1790 "березня",
1791 "квітня",
1792 "травня",
1793 "червня",
1794 "липня",
1795 "серпня",
1796 "вересня",
1797 "жовтня",
1798 "листопада",
1799 "грудня",
1800 ]
1801 month_abbreviations = [
1802 "",
1803 "січ",
1804 "лют",
1805 "бер",
1806 "квіт",
1807 "трав",
1808 "черв",
1809 "лип",
1810 "серп",
1811 "вер",
1812 "жовт",
1813 "лист",
1814 "груд",
1815 ]
1817 day_names = [
1818 "",
1819 "понеділок",
1820 "вівторок",
1821 "середа",
1822 "четвер",
1823 "п’ятниця",
1824 "субота",
1825 "неділя",
1826 ]
1827 day_abbreviations = ["", "пн", "вт", "ср", "чт", "пт", "сб", "нд"]
1830class MacedonianLocale(SlavicBaseLocale):
1831 names = ["mk", "mk-mk"]
1833 past = "пред {0}"
1834 future = "за {0}"
1836 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
1837 "now": "сега",
1838 "second": "една секунда",
1839 "seconds": {
1840 "singular": "{0} секунда",
1841 "dual": "{0} секунди",
1842 "plural": "{0} секунди",
1843 },
1844 "minute": "една минута",
1845 "minutes": {
1846 "singular": "{0} минута",
1847 "dual": "{0} минути",
1848 "plural": "{0} минути",
1849 },
1850 "hour": "еден саат",
1851 "hours": {"singular": "{0} саат", "dual": "{0} саати", "plural": "{0} саати"},
1852 "day": "еден ден",
1853 "days": {"singular": "{0} ден", "dual": "{0} дена", "plural": "{0} дена"},
1854 "week": "една недела",
1855 "weeks": {
1856 "singular": "{0} недела",
1857 "dual": "{0} недели",
1858 "plural": "{0} недели",
1859 },
1860 "month": "еден месец",
1861 "months": {
1862 "singular": "{0} месец",
1863 "dual": "{0} месеци",
1864 "plural": "{0} месеци",
1865 },
1866 "year": "една година",
1867 "years": {
1868 "singular": "{0} година",
1869 "dual": "{0} години",
1870 "plural": "{0} години",
1871 },
1872 }
1874 meridians = {"am": "дп", "pm": "пп", "AM": "претпладне", "PM": "попладне"}
1876 month_names = [
1877 "",
1878 "Јануари",
1879 "Февруари",
1880 "Март",
1881 "Април",
1882 "Мај",
1883 "Јуни",
1884 "Јули",
1885 "Август",
1886 "Септември",
1887 "Октомври",
1888 "Ноември",
1889 "Декември",
1890 ]
1891 month_abbreviations = [
1892 "",
1893 "Јан",
1894 "Фев",
1895 "Мар",
1896 "Апр",
1897 "Мај",
1898 "Јун",
1899 "Јул",
1900 "Авг",
1901 "Септ",
1902 "Окт",
1903 "Ноем",
1904 "Декем",
1905 ]
1907 day_names = [
1908 "",
1909 "Понеделник",
1910 "Вторник",
1911 "Среда",
1912 "Четврток",
1913 "Петок",
1914 "Сабота",
1915 "Недела",
1916 ]
1917 day_abbreviations = [
1918 "",
1919 "Пон",
1920 "Вт",
1921 "Сре",
1922 "Чет",
1923 "Пет",
1924 "Саб",
1925 "Нед",
1926 ]
1929class MacedonianLatinLocale(SlavicBaseLocale):
1930 names = ["mk-latn", "mk-mk-latn"]
1932 past = "pred {0}"
1933 future = "za {0}"
1935 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
1936 "now": "sega",
1937 "second": "edna sekunda",
1938 "seconds": {
1939 "singular": "{0} sekunda",
1940 "dual": "{0} sekundi",
1941 "plural": "{0} sekundi",
1942 },
1943 "minute": "edna minuta",
1944 "minutes": {
1945 "singular": "{0} minuta",
1946 "dual": "{0} minuti",
1947 "plural": "{0} minuti",
1948 },
1949 "hour": "eden saat",
1950 "hours": {"singular": "{0} saat", "dual": "{0} saati", "plural": "{0} saati"},
1951 "day": "eden den",
1952 "days": {"singular": "{0} den", "dual": "{0} dena", "plural": "{0} dena"},
1953 "week": "edna nedela",
1954 "weeks": {
1955 "singular": "{0} nedela",
1956 "dual": "{0} nedeli",
1957 "plural": "{0} nedeli",
1958 },
1959 "month": "eden mesec",
1960 "months": {
1961 "singular": "{0} mesec",
1962 "dual": "{0} meseci",
1963 "plural": "{0} meseci",
1964 },
1965 "year": "edna godina",
1966 "years": {
1967 "singular": "{0} godina",
1968 "dual": "{0} godini",
1969 "plural": "{0} godini",
1970 },
1971 }
1973 meridians = {"am": "dp", "pm": "pp", "AM": "pretpladne", "PM": "popladne"}
1975 month_names = [
1976 "",
1977 "Januari",
1978 "Fevruari",
1979 "Mart",
1980 "April",
1981 "Maj",
1982 "Juni",
1983 "Juli",
1984 "Avgust",
1985 "Septemvri",
1986 "Oktomvri",
1987 "Noemvri",
1988 "Dekemvri",
1989 ]
1990 month_abbreviations = [
1991 "",
1992 "Jan",
1993 "Fev",
1994 "Mar",
1995 "Apr",
1996 "Maj",
1997 "Jun",
1998 "Jul",
1999 "Avg",
2000 "Sep",
2001 "Okt",
2002 "Noe",
2003 "Dek",
2004 ]
2006 day_names = [
2007 "",
2008 "Ponedelnik",
2009 "Vtornik",
2010 "Sreda",
2011 "Chetvrtok",
2012 "Petok",
2013 "Sabota",
2014 "Nedela",
2015 ]
2016 day_abbreviations = [
2017 "",
2018 "Pon",
2019 "Vt",
2020 "Sre",
2021 "Chet",
2022 "Pet",
2023 "Sab",
2024 "Ned",
2025 ]
2028class GermanBaseLocale(Locale):
2029 past = "vor {0}"
2030 future = "in {0}"
2031 and_word = "und"
2033 timeframes: ClassVar[Dict[TimeFrameLiteral, str]] = {
2034 "now": "gerade eben",
2035 "second": "einer Sekunde",
2036 "seconds": "{0} Sekunden",
2037 "minute": "einer Minute",
2038 "minutes": "{0} Minuten",
2039 "hour": "einer Stunde",
2040 "hours": "{0} Stunden",
2041 "day": "einem Tag",
2042 "days": "{0} Tagen",
2043 "week": "einer Woche",
2044 "weeks": "{0} Wochen",
2045 "month": "einem Monat",
2046 "months": "{0} Monaten",
2047 "year": "einem Jahr",
2048 "years": "{0} Jahren",
2049 }
2051 timeframes_only_distance = timeframes.copy()
2052 timeframes_only_distance["second"] = "eine Sekunde"
2053 timeframes_only_distance["minute"] = "eine Minute"
2054 timeframes_only_distance["hour"] = "eine Stunde"
2055 timeframes_only_distance["day"] = "ein Tag"
2056 timeframes_only_distance["days"] = "{0} Tage"
2057 timeframes_only_distance["week"] = "eine Woche"
2058 timeframes_only_distance["month"] = "ein Monat"
2059 timeframes_only_distance["months"] = "{0} Monate"
2060 timeframes_only_distance["year"] = "ein Jahr"
2061 timeframes_only_distance["years"] = "{0} Jahre"
2063 month_names = [
2064 "",
2065 "Januar",
2066 "Februar",
2067 "März",
2068 "April",
2069 "Mai",
2070 "Juni",
2071 "Juli",
2072 "August",
2073 "September",
2074 "Oktober",
2075 "November",
2076 "Dezember",
2077 ]
2079 month_abbreviations = [
2080 "",
2081 "Jan",
2082 "Feb",
2083 "Mär",
2084 "Apr",
2085 "Mai",
2086 "Jun",
2087 "Jul",
2088 "Aug",
2089 "Sep",
2090 "Okt",
2091 "Nov",
2092 "Dez",
2093 ]
2095 day_names = [
2096 "",
2097 "Montag",
2098 "Dienstag",
2099 "Mittwoch",
2100 "Donnerstag",
2101 "Freitag",
2102 "Samstag",
2103 "Sonntag",
2104 ]
2106 day_abbreviations = ["", "Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"]
2108 def _ordinal_number(self, n: int) -> str:
2109 return f"{n}."
2111 def describe(
2112 self,
2113 timeframe: TimeFrameLiteral,
2114 delta: Union[int, float] = 0,
2115 only_distance: bool = False,
2116 ) -> str:
2117 """Describes a delta within a timeframe in plain language.
2119 :param timeframe: a string representing a timeframe.
2120 :param delta: a quantity representing a delta in a timeframe.
2121 :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords
2122 """
2124 if not only_distance:
2125 return super().describe(timeframe, delta, only_distance)
2127 # German uses a different case without 'in' or 'ago'
2128 humanized: str = self.timeframes_only_distance[timeframe].format(
2129 trunc(abs(delta))
2130 )
2132 return humanized
2135class GermanLocale(GermanBaseLocale, Locale):
2136 names = ["de", "de-de"]
2139class SwissLocale(GermanBaseLocale, Locale):
2140 names = ["de-ch"]
2143class AustrianLocale(GermanBaseLocale, Locale):
2144 names = ["de-at"]
2146 month_names = [
2147 "",
2148 "Jänner",
2149 "Februar",
2150 "März",
2151 "April",
2152 "Mai",
2153 "Juni",
2154 "Juli",
2155 "August",
2156 "September",
2157 "Oktober",
2158 "November",
2159 "Dezember",
2160 ]
2163class NorwegianLocale(Locale):
2164 names = ["nb", "nb-no"]
2166 past = "for {0} siden"
2167 future = "om {0}"
2169 timeframes = {
2170 "now": "nå nettopp",
2171 "second": "ett sekund",
2172 "seconds": "{0} sekunder",
2173 "minute": "ett minutt",
2174 "minutes": "{0} minutter",
2175 "hour": "en time",
2176 "hours": "{0} timer",
2177 "day": "en dag",
2178 "days": "{0} dager",
2179 "week": "en uke",
2180 "weeks": "{0} uker",
2181 "month": "en måned",
2182 "months": "{0} måneder",
2183 "year": "ett år",
2184 "years": "{0} år",
2185 }
2187 month_names = [
2188 "",
2189 "januar",
2190 "februar",
2191 "mars",
2192 "april",
2193 "mai",
2194 "juni",
2195 "juli",
2196 "august",
2197 "september",
2198 "oktober",
2199 "november",
2200 "desember",
2201 ]
2202 month_abbreviations = [
2203 "",
2204 "jan",
2205 "feb",
2206 "mar",
2207 "apr",
2208 "mai",
2209 "jun",
2210 "jul",
2211 "aug",
2212 "sep",
2213 "okt",
2214 "nov",
2215 "des",
2216 ]
2218 day_names = [
2219 "",
2220 "mandag",
2221 "tirsdag",
2222 "onsdag",
2223 "torsdag",
2224 "fredag",
2225 "lørdag",
2226 "søndag",
2227 ]
2228 day_abbreviations = ["", "ma", "ti", "on", "to", "fr", "lø", "sø"]
2230 def _ordinal_number(self, n: int) -> str:
2231 return f"{n}."
2234class NewNorwegianLocale(Locale):
2235 names = ["nn", "nn-no"]
2237 past = "for {0} sidan"
2238 future = "om {0}"
2240 timeframes = {
2241 "now": "no nettopp",
2242 "second": "eitt sekund",
2243 "seconds": "{0} sekund",
2244 "minute": "eitt minutt",
2245 "minutes": "{0} minutt",
2246 "hour": "ein time",
2247 "hours": "{0} timar",
2248 "day": "ein dag",
2249 "days": "{0} dagar",
2250 "week": "ei veke",
2251 "weeks": "{0} veker",
2252 "month": "ein månad",
2253 "months": "{0} månader",
2254 "year": "eitt år",
2255 "years": "{0} år",
2256 }
2258 month_names = [
2259 "",
2260 "januar",
2261 "februar",
2262 "mars",
2263 "april",
2264 "mai",
2265 "juni",
2266 "juli",
2267 "august",
2268 "september",
2269 "oktober",
2270 "november",
2271 "desember",
2272 ]
2273 month_abbreviations = [
2274 "",
2275 "jan",
2276 "feb",
2277 "mar",
2278 "apr",
2279 "mai",
2280 "jun",
2281 "jul",
2282 "aug",
2283 "sep",
2284 "okt",
2285 "nov",
2286 "des",
2287 ]
2289 day_names = [
2290 "",
2291 "måndag",
2292 "tysdag",
2293 "onsdag",
2294 "torsdag",
2295 "fredag",
2296 "laurdag",
2297 "sundag",
2298 ]
2299 day_abbreviations = ["", "må", "ty", "on", "to", "fr", "la", "su"]
2301 def _ordinal_number(self, n: int) -> str:
2302 return f"{n}."
2305class PortugueseLocale(Locale):
2306 names = ["pt", "pt-pt"]
2308 past = "há {0}"
2309 future = "em {0}"
2310 and_word = "e"
2312 timeframes = {
2313 "now": "agora",
2314 "second": "um segundo",
2315 "seconds": "{0} segundos",
2316 "minute": "um minuto",
2317 "minutes": "{0} minutos",
2318 "hour": "uma hora",
2319 "hours": "{0} horas",
2320 "day": "um dia",
2321 "days": "{0} dias",
2322 "week": "uma semana",
2323 "weeks": "{0} semanas",
2324 "month": "um mês",
2325 "months": "{0} meses",
2326 "year": "um ano",
2327 "years": "{0} anos",
2328 }
2330 month_names = [
2331 "",
2332 "Janeiro",
2333 "Fevereiro",
2334 "Março",
2335 "Abril",
2336 "Maio",
2337 "Junho",
2338 "Julho",
2339 "Agosto",
2340 "Setembro",
2341 "Outubro",
2342 "Novembro",
2343 "Dezembro",
2344 ]
2345 month_abbreviations = [
2346 "",
2347 "Jan",
2348 "Fev",
2349 "Mar",
2350 "Abr",
2351 "Mai",
2352 "Jun",
2353 "Jul",
2354 "Ago",
2355 "Set",
2356 "Out",
2357 "Nov",
2358 "Dez",
2359 ]
2361 day_names = [
2362 "",
2363 "Segunda-feira",
2364 "Terça-feira",
2365 "Quarta-feira",
2366 "Quinta-feira",
2367 "Sexta-feira",
2368 "Sábado",
2369 "Domingo",
2370 ]
2371 day_abbreviations = ["", "Seg", "Ter", "Qua", "Qui", "Sex", "Sab", "Dom"]
2374class BrazilianPortugueseLocale(PortugueseLocale):
2375 names = ["pt-br"]
2377 past = "faz {0}"
2380class TagalogLocale(Locale):
2381 names = ["tl", "tl-ph"]
2383 past = "nakaraang {0}"
2384 future = "{0} mula ngayon"
2386 timeframes = {
2387 "now": "ngayon lang",
2388 "second": "isang segundo",
2389 "seconds": "{0} segundo",
2390 "minute": "isang minuto",
2391 "minutes": "{0} minuto",
2392 "hour": "isang oras",
2393 "hours": "{0} oras",
2394 "day": "isang araw",
2395 "days": "{0} araw",
2396 "week": "isang linggo",
2397 "weeks": "{0} linggo",
2398 "month": "isang buwan",
2399 "months": "{0} buwan",
2400 "year": "isang taon",
2401 "years": "{0} taon",
2402 }
2404 month_names = [
2405 "",
2406 "Enero",
2407 "Pebrero",
2408 "Marso",
2409 "Abril",
2410 "Mayo",
2411 "Hunyo",
2412 "Hulyo",
2413 "Agosto",
2414 "Setyembre",
2415 "Oktubre",
2416 "Nobyembre",
2417 "Disyembre",
2418 ]
2419 month_abbreviations = [
2420 "",
2421 "Ene",
2422 "Peb",
2423 "Mar",
2424 "Abr",
2425 "May",
2426 "Hun",
2427 "Hul",
2428 "Ago",
2429 "Set",
2430 "Okt",
2431 "Nob",
2432 "Dis",
2433 ]
2435 day_names = [
2436 "",
2437 "Lunes",
2438 "Martes",
2439 "Miyerkules",
2440 "Huwebes",
2441 "Biyernes",
2442 "Sabado",
2443 "Linggo",
2444 ]
2445 day_abbreviations = ["", "Lun", "Mar", "Miy", "Huw", "Biy", "Sab", "Lin"]
2447 meridians = {"am": "nu", "pm": "nh", "AM": "ng umaga", "PM": "ng hapon"}
2449 def _ordinal_number(self, n: int) -> str:
2450 return f"ika-{n}"
2453class VietnameseLocale(Locale):
2454 names = ["vi", "vi-vn"]
2456 past = "{0} trước"
2457 future = "{0} nữa"
2459 timeframes = {
2460 "now": "hiện tại",
2461 "second": "một giây",
2462 "seconds": "{0} giây",
2463 "minute": "một phút",
2464 "minutes": "{0} phút",
2465 "hour": "một giờ",
2466 "hours": "{0} giờ",
2467 "day": "một ngày",
2468 "days": "{0} ngày",
2469 "week": "một tuần",
2470 "weeks": "{0} tuần",
2471 "month": "một tháng",
2472 "months": "{0} tháng",
2473 "year": "một năm",
2474 "years": "{0} năm",
2475 }
2477 month_names = [
2478 "",
2479 "Tháng Một",
2480 "Tháng Hai",
2481 "Tháng Ba",
2482 "Tháng Tư",
2483 "Tháng Năm",
2484 "Tháng Sáu",
2485 "Tháng Bảy",
2486 "Tháng Tám",
2487 "Tháng Chín",
2488 "Tháng Mười",
2489 "Tháng Mười Một",
2490 "Tháng Mười Hai",
2491 ]
2492 month_abbreviations = [
2493 "",
2494 "Tháng 1",
2495 "Tháng 2",
2496 "Tháng 3",
2497 "Tháng 4",
2498 "Tháng 5",
2499 "Tháng 6",
2500 "Tháng 7",
2501 "Tháng 8",
2502 "Tháng 9",
2503 "Tháng 10",
2504 "Tháng 11",
2505 "Tháng 12",
2506 ]
2508 day_names = [
2509 "",
2510 "Thứ Hai",
2511 "Thứ Ba",
2512 "Thứ Tư",
2513 "Thứ Năm",
2514 "Thứ Sáu",
2515 "Thứ Bảy",
2516 "Chủ Nhật",
2517 ]
2518 day_abbreviations = ["", "Thứ 2", "Thứ 3", "Thứ 4", "Thứ 5", "Thứ 6", "Thứ 7", "CN"]
2521class TurkishLocale(Locale):
2522 names = ["tr", "tr-tr"]
2524 past = "{0} önce"
2525 future = "{0} sonra"
2526 and_word = "ve"
2528 timeframes = {
2529 "now": "şimdi",
2530 "second": "bir saniye",
2531 "seconds": "{0} saniye",
2532 "minute": "bir dakika",
2533 "minutes": "{0} dakika",
2534 "hour": "bir saat",
2535 "hours": "{0} saat",
2536 "day": "bir gün",
2537 "days": "{0} gün",
2538 "week": "bir hafta",
2539 "weeks": "{0} hafta",
2540 "month": "bir ay",
2541 "months": "{0} ay",
2542 "year": "bir yıl",
2543 "years": "{0} yıl",
2544 }
2546 meridians = {"am": "öö", "pm": "ös", "AM": "ÖÖ", "PM": "ÖS"}
2548 month_names = [
2549 "",
2550 "Ocak",
2551 "Şubat",
2552 "Mart",
2553 "Nisan",
2554 "Mayıs",
2555 "Haziran",
2556 "Temmuz",
2557 "Ağustos",
2558 "Eylül",
2559 "Ekim",
2560 "Kasım",
2561 "Aralık",
2562 ]
2563 month_abbreviations = [
2564 "",
2565 "Oca",
2566 "Şub",
2567 "Mar",
2568 "Nis",
2569 "May",
2570 "Haz",
2571 "Tem",
2572 "Ağu",
2573 "Eyl",
2574 "Eki",
2575 "Kas",
2576 "Ara",
2577 ]
2579 day_names = [
2580 "",
2581 "Pazartesi",
2582 "Salı",
2583 "Çarşamba",
2584 "Perşembe",
2585 "Cuma",
2586 "Cumartesi",
2587 "Pazar",
2588 ]
2589 day_abbreviations = ["", "Pzt", "Sal", "Çar", "Per", "Cum", "Cmt", "Paz"]
2592class AzerbaijaniLocale(Locale):
2593 names = ["az", "az-az"]
2595 past = "{0} əvvəl"
2596 future = "{0} sonra"
2598 timeframes = {
2599 "now": "indi",
2600 "second": "bir saniyə",
2601 "seconds": "{0} saniyə",
2602 "minute": "bir dəqiqə",
2603 "minutes": "{0} dəqiqə",
2604 "hour": "bir saat",
2605 "hours": "{0} saat",
2606 "day": "bir gün",
2607 "days": "{0} gün",
2608 "week": "bir həftə",
2609 "weeks": "{0} həftə",
2610 "month": "bir ay",
2611 "months": "{0} ay",
2612 "year": "bir il",
2613 "years": "{0} il",
2614 }
2616 month_names = [
2617 "",
2618 "Yanvar",
2619 "Fevral",
2620 "Mart",
2621 "Aprel",
2622 "May",
2623 "İyun",
2624 "İyul",
2625 "Avqust",
2626 "Sentyabr",
2627 "Oktyabr",
2628 "Noyabr",
2629 "Dekabr",
2630 ]
2631 month_abbreviations = [
2632 "",
2633 "Yan",
2634 "Fev",
2635 "Mar",
2636 "Apr",
2637 "May",
2638 "İyn",
2639 "İyl",
2640 "Avq",
2641 "Sen",
2642 "Okt",
2643 "Noy",
2644 "Dek",
2645 ]
2647 day_names = [
2648 "",
2649 "Bazar ertəsi",
2650 "Çərşənbə axşamı",
2651 "Çərşənbə",
2652 "Cümə axşamı",
2653 "Cümə",
2654 "Şənbə",
2655 "Bazar",
2656 ]
2657 day_abbreviations = ["", "Ber", "Çax", "Çər", "Cax", "Cüm", "Şnb", "Bzr"]
2660class ArabicLocale(Locale):
2661 names = [
2662 "ar",
2663 "ar-ae",
2664 "ar-bh",
2665 "ar-dj",
2666 "ar-eg",
2667 "ar-eh",
2668 "ar-er",
2669 "ar-km",
2670 "ar-kw",
2671 "ar-ly",
2672 "ar-om",
2673 "ar-qa",
2674 "ar-sa",
2675 "ar-sd",
2676 "ar-so",
2677 "ar-ss",
2678 "ar-td",
2679 "ar-ye",
2680 ]
2682 past = "منذ {0}"
2683 future = "خلال {0}"
2685 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
2686 "now": "الآن",
2687 "second": "ثانية",
2688 "seconds": {"2": "ثانيتين", "ten": "{0} ثوان", "higher": "{0} ثانية"},
2689 "minute": "دقيقة",
2690 "minutes": {"2": "دقيقتين", "ten": "{0} دقائق", "higher": "{0} دقيقة"},
2691 "hour": "ساعة",
2692 "hours": {"2": "ساعتين", "ten": "{0} ساعات", "higher": "{0} ساعة"},
2693 "day": "يوم",
2694 "days": {"2": "يومين", "ten": "{0} أيام", "higher": "{0} يوم"},
2695 "week": "اسبوع",
2696 "weeks": {"2": "اسبوعين", "ten": "{0} أسابيع", "higher": "{0} اسبوع"},
2697 "month": "شهر",
2698 "months": {"2": "شهرين", "ten": "{0} أشهر", "higher": "{0} شهر"},
2699 "year": "سنة",
2700 "years": {"2": "سنتين", "ten": "{0} سنوات", "higher": "{0} سنة"},
2701 }
2703 month_names = [
2704 "",
2705 "يناير",
2706 "فبراير",
2707 "مارس",
2708 "أبريل",
2709 "مايو",
2710 "يونيو",
2711 "يوليو",
2712 "أغسطس",
2713 "سبتمبر",
2714 "أكتوبر",
2715 "نوفمبر",
2716 "ديسمبر",
2717 ]
2718 month_abbreviations = [
2719 "",
2720 "يناير",
2721 "فبراير",
2722 "مارس",
2723 "أبريل",
2724 "مايو",
2725 "يونيو",
2726 "يوليو",
2727 "أغسطس",
2728 "سبتمبر",
2729 "أكتوبر",
2730 "نوفمبر",
2731 "ديسمبر",
2732 ]
2734 day_names = [
2735 "",
2736 "الإثنين",
2737 "الثلاثاء",
2738 "الأربعاء",
2739 "الخميس",
2740 "الجمعة",
2741 "السبت",
2742 "الأحد",
2743 ]
2744 day_abbreviations = ["", "إثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت", "أحد"]
2746 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
2747 form = self.timeframes[timeframe]
2748 delta = abs(delta)
2749 if isinstance(form, Mapping):
2750 if delta == 2:
2751 form = form["2"]
2752 elif 2 < delta <= 10:
2753 form = form["ten"]
2754 else:
2755 form = form["higher"]
2757 return form.format(delta)
2760class LevantArabicLocale(ArabicLocale):
2761 names = ["ar-iq", "ar-jo", "ar-lb", "ar-ps", "ar-sy"]
2762 month_names = [
2763 "",
2764 "كانون الثاني",
2765 "شباط",
2766 "آذار",
2767 "نيسان",
2768 "أيار",
2769 "حزيران",
2770 "تموز",
2771 "آب",
2772 "أيلول",
2773 "تشرين الأول",
2774 "تشرين الثاني",
2775 "كانون الأول",
2776 ]
2777 month_abbreviations = [
2778 "",
2779 "كانون الثاني",
2780 "شباط",
2781 "آذار",
2782 "نيسان",
2783 "أيار",
2784 "حزيران",
2785 "تموز",
2786 "آب",
2787 "أيلول",
2788 "تشرين الأول",
2789 "تشرين الثاني",
2790 "كانون الأول",
2791 ]
2794class AlgeriaTunisiaArabicLocale(ArabicLocale):
2795 names = ["ar-tn", "ar-dz"]
2796 month_names = [
2797 "",
2798 "جانفي",
2799 "فيفري",
2800 "مارس",
2801 "أفريل",
2802 "ماي",
2803 "جوان",
2804 "جويلية",
2805 "أوت",
2806 "سبتمبر",
2807 "أكتوبر",
2808 "نوفمبر",
2809 "ديسمبر",
2810 ]
2811 month_abbreviations = [
2812 "",
2813 "جانفي",
2814 "فيفري",
2815 "مارس",
2816 "أفريل",
2817 "ماي",
2818 "جوان",
2819 "جويلية",
2820 "أوت",
2821 "سبتمبر",
2822 "أكتوبر",
2823 "نوفمبر",
2824 "ديسمبر",
2825 ]
2828class MauritaniaArabicLocale(ArabicLocale):
2829 names = ["ar-mr"]
2830 month_names = [
2831 "",
2832 "يناير",
2833 "فبراير",
2834 "مارس",
2835 "إبريل",
2836 "مايو",
2837 "يونيو",
2838 "يوليو",
2839 "أغشت",
2840 "شتمبر",
2841 "أكتوبر",
2842 "نوفمبر",
2843 "دجمبر",
2844 ]
2845 month_abbreviations = [
2846 "",
2847 "يناير",
2848 "فبراير",
2849 "مارس",
2850 "إبريل",
2851 "مايو",
2852 "يونيو",
2853 "يوليو",
2854 "أغشت",
2855 "شتمبر",
2856 "أكتوبر",
2857 "نوفمبر",
2858 "دجمبر",
2859 ]
2862class MoroccoArabicLocale(ArabicLocale):
2863 names = ["ar-ma"]
2864 month_names = [
2865 "",
2866 "يناير",
2867 "فبراير",
2868 "مارس",
2869 "أبريل",
2870 "ماي",
2871 "يونيو",
2872 "يوليوز",
2873 "غشت",
2874 "شتنبر",
2875 "أكتوبر",
2876 "نونبر",
2877 "دجنبر",
2878 ]
2879 month_abbreviations = [
2880 "",
2881 "يناير",
2882 "فبراير",
2883 "مارس",
2884 "أبريل",
2885 "ماي",
2886 "يونيو",
2887 "يوليوز",
2888 "غشت",
2889 "شتنبر",
2890 "أكتوبر",
2891 "نونبر",
2892 "دجنبر",
2893 ]
2896class IcelandicLocale(Locale):
2897 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
2898 form = self.timeframes[timeframe]
2900 if isinstance(form, Mapping):
2901 if delta < 0:
2902 form = form["past"]
2903 elif delta > 0:
2904 form = form["future"]
2905 else:
2906 raise ValueError(
2907 "Icelandic Locale does not support units with a delta of zero. "
2908 "Please consider making a contribution to fix this issue."
2909 )
2910 # FIXME: handle when delta is 0
2912 return form.format(abs(delta))
2914 names = ["is", "is-is"]
2916 past = "fyrir {0} síðan"
2917 future = "eftir {0}"
2919 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
2920 "now": "rétt í þessu",
2921 "second": {"past": "sekúndu", "future": "sekúndu"},
2922 "seconds": {"past": "{0} nokkrum sekúndum", "future": "nokkrar sekúndur"},
2923 "minute": {"past": "einni mínútu", "future": "eina mínútu"},
2924 "minutes": {"past": "{0} mínútum", "future": "{0} mínútur"},
2925 "hour": {"past": "einum tíma", "future": "einn tíma"},
2926 "hours": {"past": "{0} tímum", "future": "{0} tíma"},
2927 "day": {"past": "einum degi", "future": "einn dag"},
2928 "days": {"past": "{0} dögum", "future": "{0} daga"},
2929 "month": {"past": "einum mánuði", "future": "einn mánuð"},
2930 "months": {"past": "{0} mánuðum", "future": "{0} mánuði"},
2931 "year": {"past": "einu ári", "future": "eitt ár"},
2932 "years": {"past": "{0} árum", "future": "{0} ár"},
2933 }
2935 meridians = {"am": "f.h.", "pm": "e.h.", "AM": "f.h.", "PM": "e.h."}
2937 month_names = [
2938 "",
2939 "janúar",
2940 "febrúar",
2941 "mars",
2942 "apríl",
2943 "maí",
2944 "júní",
2945 "júlí",
2946 "ágúst",
2947 "september",
2948 "október",
2949 "nóvember",
2950 "desember",
2951 ]
2952 month_abbreviations = [
2953 "",
2954 "jan",
2955 "feb",
2956 "mar",
2957 "apr",
2958 "maí",
2959 "jún",
2960 "júl",
2961 "ágú",
2962 "sep",
2963 "okt",
2964 "nóv",
2965 "des",
2966 ]
2968 day_names = [
2969 "",
2970 "mánudagur",
2971 "þriðjudagur",
2972 "miðvikudagur",
2973 "fimmtudagur",
2974 "föstudagur",
2975 "laugardagur",
2976 "sunnudagur",
2977 ]
2978 day_abbreviations = ["", "mán", "þri", "mið", "fim", "fös", "lau", "sun"]
2981class DanishLocale(Locale):
2982 names = ["da", "da-dk"]
2984 past = "for {0} siden"
2985 future = "om {0}"
2986 and_word = "og"
2988 timeframes = {
2989 "now": "lige nu",
2990 "second": "et sekund",
2991 "seconds": "{0} sekunder",
2992 "minute": "et minut",
2993 "minutes": "{0} minutter",
2994 "hour": "en time",
2995 "hours": "{0} timer",
2996 "day": "en dag",
2997 "days": "{0} dage",
2998 "week": "en uge",
2999 "weeks": "{0} uger",
3000 "month": "en måned",
3001 "months": "{0} måneder",
3002 "year": "et år",
3003 "years": "{0} år",
3004 }
3006 month_names = [
3007 "",
3008 "januar",
3009 "februar",
3010 "marts",
3011 "april",
3012 "maj",
3013 "juni",
3014 "juli",
3015 "august",
3016 "september",
3017 "oktober",
3018 "november",
3019 "december",
3020 ]
3021 month_abbreviations = [
3022 "",
3023 "jan",
3024 "feb",
3025 "mar",
3026 "apr",
3027 "maj",
3028 "jun",
3029 "jul",
3030 "aug",
3031 "sep",
3032 "okt",
3033 "nov",
3034 "dec",
3035 ]
3037 day_names = [
3038 "",
3039 "mandag",
3040 "tirsdag",
3041 "onsdag",
3042 "torsdag",
3043 "fredag",
3044 "lørdag",
3045 "søndag",
3046 ]
3047 day_abbreviations = ["", "man", "tir", "ons", "tor", "fre", "lør", "søn"]
3049 def _ordinal_number(self, n: int) -> str:
3050 return f"{n}."
3053class MalayalamLocale(Locale):
3054 names = ["ml"]
3056 past = "{0} മുമ്പ്"
3057 future = "{0} ശേഷം"
3059 timeframes = {
3060 "now": "ഇപ്പോൾ",
3061 "second": "ഒരു നിമിഷം",
3062 "seconds": "{0} സെക്കന്റ്",
3063 "minute": "ഒരു മിനിറ്റ്",
3064 "minutes": "{0} മിനിറ്റ്",
3065 "hour": "ഒരു മണിക്കൂർ",
3066 "hours": "{0} മണിക്കൂർ",
3067 "day": "ഒരു ദിവസം ",
3068 "days": "{0} ദിവസം ",
3069 "month": "ഒരു മാസം ",
3070 "months": "{0} മാസം ",
3071 "year": "ഒരു വർഷം ",
3072 "years": "{0} വർഷം ",
3073 }
3075 meridians = {
3076 "am": "രാവിലെ",
3077 "pm": "ഉച്ചക്ക് ശേഷം",
3078 "AM": "രാവിലെ",
3079 "PM": "ഉച്ചക്ക് ശേഷം",
3080 }
3082 month_names = [
3083 "",
3084 "ജനുവരി",
3085 "ഫെബ്രുവരി",
3086 "മാർച്ച്",
3087 "ഏപ്രിൽ ",
3088 "മെയ് ",
3089 "ജൂണ്",
3090 "ജൂലൈ",
3091 "ഓഗസ്റ്റ്",
3092 "സെപ്റ്റംബർ",
3093 "ഒക്ടോബർ",
3094 "നവംബർ",
3095 "ഡിസംബർ",
3096 ]
3097 month_abbreviations = [
3098 "",
3099 "ജനു",
3100 "ഫെബ് ",
3101 "മാർ",
3102 "ഏപ്രിൽ",
3103 "മേയ്",
3104 "ജൂണ്",
3105 "ജൂലൈ",
3106 "ഓഗസ്റ",
3107 "സെപ്റ്റ",
3108 "ഒക്ടോ",
3109 "നവം",
3110 "ഡിസം",
3111 ]
3113 day_names = ["", "തിങ്കള്", "ചൊവ്വ", "ബുധന്", "വ്യാഴം", "വെള്ളി", "ശനി", "ഞായര്"]
3114 day_abbreviations = [
3115 "",
3116 "തിങ്കള്",
3117 "ചൊവ്വ",
3118 "ബുധന്",
3119 "വ്യാഴം",
3120 "വെള്ളി",
3121 "ശനി",
3122 "ഞായര്",
3123 ]
3126class HindiLocale(Locale):
3127 names = ["hi", "hi-in"]
3129 past = "{0} पहले"
3130 future = "{0} बाद"
3132 timeframes = {
3133 "now": "अभी",
3134 "second": "एक पल",
3135 "seconds": "{0} सेकंड्",
3136 "minute": "एक मिनट ",
3137 "minutes": "{0} मिनट ",
3138 "hour": "एक घंटा",
3139 "hours": "{0} घंटे",
3140 "day": "एक दिन",
3141 "days": "{0} दिन",
3142 "month": "एक माह ",
3143 "months": "{0} महीने ",
3144 "year": "एक वर्ष ",
3145 "years": "{0} साल ",
3146 }
3148 meridians = {"am": "सुबह", "pm": "शाम", "AM": "सुबह", "PM": "शाम"}
3150 month_names = [
3151 "",
3152 "जनवरी",
3153 "फरवरी",
3154 "मार्च",
3155 "अप्रैल ",
3156 "मई",
3157 "जून",
3158 "जुलाई",
3159 "अगस्त",
3160 "सितंबर",
3161 "अक्टूबर",
3162 "नवंबर",
3163 "दिसंबर",
3164 ]
3165 month_abbreviations = [
3166 "",
3167 "जन",
3168 "फ़र",
3169 "मार्च",
3170 "अप्रै",
3171 "मई",
3172 "जून",
3173 "जुलाई",
3174 "आग",
3175 "सित",
3176 "अकत",
3177 "नवे",
3178 "दिस",
3179 ]
3181 day_names = [
3182 "",
3183 "सोमवार",
3184 "मंगलवार",
3185 "बुधवार",
3186 "गुरुवार",
3187 "शुक्रवार",
3188 "शनिवार",
3189 "रविवार",
3190 ]
3191 day_abbreviations = ["", "सोम", "मंगल", "बुध", "गुरुवार", "शुक्र", "शनि", "रवि"]
3194class CzechLocale(Locale):
3195 names = ["cs", "cs-cz"]
3197 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
3198 "now": "Teď",
3199 "second": {"past": "vteřina", "future": "vteřina"},
3200 "seconds": {
3201 "zero": "vteřina",
3202 "past": "{0} sekundami",
3203 "future-singular": "{0} sekundy",
3204 "future-paucal": "{0} sekund",
3205 },
3206 "minute": {"past": "minutou", "future": "minutu"},
3207 "minutes": {
3208 "zero": "{0} minut",
3209 "past": "{0} minutami",
3210 "future-singular": "{0} minuty",
3211 "future-paucal": "{0} minut",
3212 },
3213 "hour": {"past": "hodinou", "future": "hodinu"},
3214 "hours": {
3215 "zero": "{0} hodin",
3216 "past": "{0} hodinami",
3217 "future-singular": "{0} hodiny",
3218 "future-paucal": "{0} hodin",
3219 },
3220 "day": {"past": "dnem", "future": "den"},
3221 "days": {
3222 "zero": "{0} dnů",
3223 "past": "{0} dny",
3224 "future-singular": "{0} dny",
3225 "future-paucal": "{0} dnů",
3226 },
3227 "week": {"past": "týdnem", "future": "týden"},
3228 "weeks": {
3229 "zero": "{0} týdnů",
3230 "past": "{0} týdny",
3231 "future-singular": "{0} týdny",
3232 "future-paucal": "{0} týdnů",
3233 },
3234 "month": {"past": "měsícem", "future": "měsíc"},
3235 "months": {
3236 "zero": "{0} měsíců",
3237 "past": "{0} měsíci",
3238 "future-singular": "{0} měsíce",
3239 "future-paucal": "{0} měsíců",
3240 },
3241 "year": {"past": "rokem", "future": "rok"},
3242 "years": {
3243 "zero": "{0} let",
3244 "past": "{0} lety",
3245 "future-singular": "{0} roky",
3246 "future-paucal": "{0} let",
3247 },
3248 }
3250 past = "Před {0}"
3251 future = "Za {0}"
3253 month_names = [
3254 "",
3255 "leden",
3256 "únor",
3257 "březen",
3258 "duben",
3259 "květen",
3260 "červen",
3261 "červenec",
3262 "srpen",
3263 "září",
3264 "říjen",
3265 "listopad",
3266 "prosinec",
3267 ]
3268 month_abbreviations = [
3269 "",
3270 "led",
3271 "úno",
3272 "bře",
3273 "dub",
3274 "kvě",
3275 "čvn",
3276 "čvc",
3277 "srp",
3278 "zář",
3279 "říj",
3280 "lis",
3281 "pro",
3282 ]
3284 day_names = [
3285 "",
3286 "pondělí",
3287 "úterý",
3288 "středa",
3289 "čtvrtek",
3290 "pátek",
3291 "sobota",
3292 "neděle",
3293 ]
3294 day_abbreviations = ["", "po", "út", "st", "čt", "pá", "so", "ne"]
3296 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
3297 """Czech aware time frame format function, takes into account
3298 the differences between past and future forms."""
3299 abs_delta = abs(delta)
3300 form = self.timeframes[timeframe]
3302 if isinstance(form, str):
3303 return form.format(abs_delta)
3305 if delta == 0:
3306 key = "zero" # And *never* use 0 in the singular!
3307 elif delta < 0:
3308 key = "past"
3309 else:
3310 # Needed since both regular future and future-singular and future-paucal cases
3311 if "future-singular" not in form:
3312 key = "future"
3313 elif 2 <= abs_delta % 10 <= 4 and (
3314 abs_delta % 100 < 10 or abs_delta % 100 >= 20
3315 ):
3316 key = "future-singular"
3317 else:
3318 key = "future-paucal"
3320 form: str = form[key]
3321 return form.format(abs_delta)
3324class SlovakLocale(Locale):
3325 names = ["sk", "sk-sk"]
3327 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
3328 "now": "Teraz",
3329 "second": {"past": "sekundou", "future": "sekundu"},
3330 "seconds": {
3331 "zero": "{0} sekúnd",
3332 "past": "{0} sekundami",
3333 "future-singular": "{0} sekundy",
3334 "future-paucal": "{0} sekúnd",
3335 },
3336 "minute": {"past": "minútou", "future": "minútu"},
3337 "minutes": {
3338 "zero": "{0} minút",
3339 "past": "{0} minútami",
3340 "future-singular": "{0} minúty",
3341 "future-paucal": "{0} minút",
3342 },
3343 "hour": {"past": "hodinou", "future": "hodinu"},
3344 "hours": {
3345 "zero": "{0} hodín",
3346 "past": "{0} hodinami",
3347 "future-singular": "{0} hodiny",
3348 "future-paucal": "{0} hodín",
3349 },
3350 "day": {"past": "dňom", "future": "deň"},
3351 "days": {
3352 "zero": "{0} dní",
3353 "past": "{0} dňami",
3354 "future-singular": "{0} dni",
3355 "future-paucal": "{0} dní",
3356 },
3357 "week": {"past": "týždňom", "future": "týždeň"},
3358 "weeks": {
3359 "zero": "{0} týždňov",
3360 "past": "{0} týždňami",
3361 "future-singular": "{0} týždne",
3362 "future-paucal": "{0} týždňov",
3363 },
3364 "month": {"past": "mesiacom", "future": "mesiac"},
3365 "months": {
3366 "zero": "{0} mesiacov",
3367 "past": "{0} mesiacmi",
3368 "future-singular": "{0} mesiace",
3369 "future-paucal": "{0} mesiacov",
3370 },
3371 "year": {"past": "rokom", "future": "rok"},
3372 "years": {
3373 "zero": "{0} rokov",
3374 "past": "{0} rokmi",
3375 "future-singular": "{0} roky",
3376 "future-paucal": "{0} rokov",
3377 },
3378 }
3380 past = "Pred {0}"
3381 future = "O {0}"
3382 and_word = "a"
3384 month_names = [
3385 "",
3386 "január",
3387 "február",
3388 "marec",
3389 "apríl",
3390 "máj",
3391 "jún",
3392 "júl",
3393 "august",
3394 "september",
3395 "október",
3396 "november",
3397 "december",
3398 ]
3399 month_abbreviations = [
3400 "",
3401 "jan",
3402 "feb",
3403 "mar",
3404 "apr",
3405 "máj",
3406 "jún",
3407 "júl",
3408 "aug",
3409 "sep",
3410 "okt",
3411 "nov",
3412 "dec",
3413 ]
3415 day_names = [
3416 "",
3417 "pondelok",
3418 "utorok",
3419 "streda",
3420 "štvrtok",
3421 "piatok",
3422 "sobota",
3423 "nedeľa",
3424 ]
3425 day_abbreviations = ["", "po", "ut", "st", "št", "pi", "so", "ne"]
3427 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
3428 """Slovak aware time frame format function, takes into account
3429 the differences between past and future forms."""
3430 abs_delta = abs(delta)
3431 form = self.timeframes[timeframe]
3433 if isinstance(form, str):
3434 return form.format(abs_delta)
3436 if delta == 0:
3437 key = "zero" # And *never* use 0 in the singular!
3438 elif delta < 0:
3439 key = "past"
3440 else:
3441 if "future-singular" not in form:
3442 key = "future"
3443 elif 2 <= abs_delta % 10 <= 4 and (
3444 abs_delta % 100 < 10 or abs_delta % 100 >= 20
3445 ):
3446 key = "future-singular"
3447 else:
3448 key = "future-paucal"
3450 form: str = form[key]
3451 return form.format(abs_delta)
3454class FarsiLocale(Locale):
3455 names = ["fa", "fa-ir"]
3457 past = "{0} قبل"
3458 future = "در {0}"
3460 timeframes = {
3461 "now": "اکنون",
3462 "second": "یک لحظه",
3463 "seconds": "{0} ثانیه",
3464 "minute": "یک دقیقه",
3465 "minutes": "{0} دقیقه",
3466 "hour": "یک ساعت",
3467 "hours": "{0} ساعت",
3468 "day": "یک روز",
3469 "days": "{0} روز",
3470 "week": "یک هفته",
3471 "weeks": "{0} هفته",
3472 "quarter": "یک فصل",
3473 "quarters": "{0} فصل",
3474 "month": "یک ماه",
3475 "months": "{0} ماه",
3476 "year": "یک سال",
3477 "years": "{0} سال",
3478 }
3480 meridians = {
3481 "am": "قبل از ظهر",
3482 "pm": "بعد از ظهر",
3483 "AM": "قبل از ظهر",
3484 "PM": "بعد از ظهر",
3485 }
3487 month_names = [
3488 "",
3489 "ژانویه",
3490 "فوریه",
3491 "مارس",
3492 "آوریل",
3493 "مه",
3494 "ژوئن",
3495 "ژوئیه",
3496 "اوت",
3497 "سپتامبر",
3498 "اکتبر",
3499 "نوامبر",
3500 "دسامبر",
3501 ]
3502 month_abbreviations = [
3503 "",
3504 "ژانویه",
3505 "فوریه",
3506 "مارس",
3507 "آوریل",
3508 "مه",
3509 "ژوئن",
3510 "ژوئیه",
3511 "اوت",
3512 "سپتامبر",
3513 "اکتبر",
3514 "نوامبر",
3515 "دسامبر",
3516 ]
3518 day_names = [
3519 "",
3520 "دو شنبه",
3521 "سه شنبه",
3522 "چهارشنبه",
3523 "پنجشنبه",
3524 "جمعه",
3525 "شنبه",
3526 "یکشنبه",
3527 ]
3528 day_abbreviations = [
3529 "",
3530 "دو شنبه",
3531 "سه شنبه",
3532 "چهارشنبه",
3533 "پنجشنبه",
3534 "جمعه",
3535 "شنبه",
3536 "یکشنبه",
3537 ]
3540class HebrewLocale(Locale):
3541 names = ["he", "he-il"]
3543 past = "לפני {0}"
3544 future = "בעוד {0}"
3545 and_word = "ו"
3547 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
3548 "now": "הרגע",
3549 "second": "שנייה",
3550 "seconds": "{0} שניות",
3551 "minute": "דקה",
3552 "minutes": "{0} דקות",
3553 "hour": "שעה",
3554 "hours": {"2": "שעתיים", "ten": "{0} שעות", "higher": "{0} שעות"},
3555 "day": "יום",
3556 "days": {"2": "יומיים", "ten": "{0} ימים", "higher": "{0} יום"},
3557 "week": "שבוע",
3558 "weeks": {"2": "שבועיים", "ten": "{0} שבועות", "higher": "{0} שבועות"},
3559 "month": "חודש",
3560 "months": {"2": "חודשיים", "ten": "{0} חודשים", "higher": "{0} חודשים"},
3561 "year": "שנה",
3562 "years": {"2": "שנתיים", "ten": "{0} שנים", "higher": "{0} שנה"},
3563 }
3565 meridians = {
3566 "am": 'לפנ"צ',
3567 "pm": 'אחר"צ',
3568 "AM": "לפני הצהריים",
3569 "PM": "אחרי הצהריים",
3570 }
3572 month_names = [
3573 "",
3574 "ינואר",
3575 "פברואר",
3576 "מרץ",
3577 "אפריל",
3578 "מאי",
3579 "יוני",
3580 "יולי",
3581 "אוגוסט",
3582 "ספטמבר",
3583 "אוקטובר",
3584 "נובמבר",
3585 "דצמבר",
3586 ]
3587 month_abbreviations = [
3588 "",
3589 "ינו׳",
3590 "פבר׳",
3591 "מרץ",
3592 "אפר׳",
3593 "מאי",
3594 "יוני",
3595 "יולי",
3596 "אוג׳",
3597 "ספט׳",
3598 "אוק׳",
3599 "נוב׳",
3600 "דצמ׳",
3601 ]
3603 day_names = ["", "שני", "שלישי", "רביעי", "חמישי", "שישי", "שבת", "ראשון"]
3604 day_abbreviations = ["", "ב׳", "ג׳", "ד׳", "ה׳", "ו׳", "ש׳", "א׳"]
3606 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
3607 form = self.timeframes[timeframe]
3608 delta = abs(delta)
3609 if isinstance(form, Mapping):
3610 if delta == 2:
3611 form = form["2"]
3612 elif delta == 0 or 2 < delta <= 10:
3613 form = form["ten"]
3614 else:
3615 form = form["higher"]
3617 return form.format(delta)
3619 def describe_multi(
3620 self,
3621 timeframes: Sequence[Tuple[TimeFrameLiteral, Union[int, float]]],
3622 only_distance: bool = False,
3623 ) -> str:
3624 """Describes a delta within multiple timeframes in plain language.
3625 In Hebrew, the and word behaves a bit differently.
3627 :param timeframes: a list of string, quantity pairs each representing a timeframe and delta.
3628 :param only_distance: return only distance eg: "2 hours and 11 seconds" without "in" or "ago" keywords
3629 """
3631 humanized = ""
3632 for index, (timeframe, delta) in enumerate(timeframes):
3633 last_humanized = self._format_timeframe(timeframe, trunc(delta))
3634 if index == 0:
3635 humanized = last_humanized
3636 elif index == len(timeframes) - 1: # Must have at least 2 items
3637 humanized += " " + self.and_word
3638 if last_humanized[0].isdecimal():
3639 humanized += "־"
3640 humanized += last_humanized
3641 else: # Don't add for the last one
3642 humanized += ", " + last_humanized
3644 if not only_distance:
3645 humanized = self._format_relative(humanized, timeframe, trunc(delta))
3647 return humanized
3650class MarathiLocale(Locale):
3651 names = ["mr"]
3653 past = "{0} आधी"
3654 future = "{0} नंतर"
3656 timeframes = {
3657 "now": "सद्य",
3658 "second": "एक सेकंद",
3659 "seconds": "{0} सेकंद",
3660 "minute": "एक मिनिट ",
3661 "minutes": "{0} मिनिट ",
3662 "hour": "एक तास",
3663 "hours": "{0} तास",
3664 "day": "एक दिवस",
3665 "days": "{0} दिवस",
3666 "month": "एक महिना ",
3667 "months": "{0} महिने ",
3668 "year": "एक वर्ष ",
3669 "years": "{0} वर्ष ",
3670 }
3672 meridians = {"am": "सकाळ", "pm": "संध्याकाळ", "AM": "सकाळ", "PM": "संध्याकाळ"}
3674 month_names = [
3675 "",
3676 "जानेवारी",
3677 "फेब्रुवारी",
3678 "मार्च",
3679 "एप्रिल",
3680 "मे",
3681 "जून",
3682 "जुलै",
3683 "अॉगस्ट",
3684 "सप्टेंबर",
3685 "अॉक्टोबर",
3686 "नोव्हेंबर",
3687 "डिसेंबर",
3688 ]
3689 month_abbreviations = [
3690 "",
3691 "जान",
3692 "फेब्रु",
3693 "मार्च",
3694 "एप्रि",
3695 "मे",
3696 "जून",
3697 "जुलै",
3698 "अॉग",
3699 "सप्टें",
3700 "अॉक्टो",
3701 "नोव्हें",
3702 "डिसें",
3703 ]
3705 day_names = [
3706 "",
3707 "सोमवार",
3708 "मंगळवार",
3709 "बुधवार",
3710 "गुरुवार",
3711 "शुक्रवार",
3712 "शनिवार",
3713 "रविवार",
3714 ]
3715 day_abbreviations = ["", "सोम", "मंगळ", "बुध", "गुरु", "शुक्र", "शनि", "रवि"]
3718class CatalanLocale(Locale):
3719 names = ["ca", "ca-es", "ca-ad", "ca-fr", "ca-it"]
3720 past = "Fa {0}"
3721 future = "En {0}"
3722 and_word = "i"
3724 timeframes = {
3725 "now": "Ara mateix",
3726 "second": "un segon",
3727 "seconds": "{0} segons",
3728 "minute": "un minut",
3729 "minutes": "{0} minuts",
3730 "hour": "una hora",
3731 "hours": "{0} hores",
3732 "day": "un dia",
3733 "days": "{0} dies",
3734 "week": "una setmana",
3735 "weeks": "{0} setmanes",
3736 "month": "un mes",
3737 "months": "{0} mesos",
3738 "year": "un any",
3739 "years": "{0} anys",
3740 }
3742 month_names = [
3743 "",
3744 "gener",
3745 "febrer",
3746 "març",
3747 "abril",
3748 "maig",
3749 "juny",
3750 "juliol",
3751 "agost",
3752 "setembre",
3753 "octubre",
3754 "novembre",
3755 "desembre",
3756 ]
3757 month_abbreviations = [
3758 "",
3759 "gen.",
3760 "febr.",
3761 "març",
3762 "abr.",
3763 "maig",
3764 "juny",
3765 "jul.",
3766 "ag.",
3767 "set.",
3768 "oct.",
3769 "nov.",
3770 "des.",
3771 ]
3772 day_names = [
3773 "",
3774 "dilluns",
3775 "dimarts",
3776 "dimecres",
3777 "dijous",
3778 "divendres",
3779 "dissabte",
3780 "diumenge",
3781 ]
3782 day_abbreviations = [
3783 "",
3784 "dl.",
3785 "dt.",
3786 "dc.",
3787 "dj.",
3788 "dv.",
3789 "ds.",
3790 "dg.",
3791 ]
3794class BasqueLocale(Locale):
3795 names = ["eu", "eu-eu"]
3796 past = "duela {0}"
3797 future = "{0}" # I don't know what's the right phrase in Basque for the future.
3799 timeframes = {
3800 "now": "Orain",
3801 "second": "segundo bat",
3802 "seconds": "{0} segundu",
3803 "minute": "minutu bat",
3804 "minutes": "{0} minutu",
3805 "hour": "ordu bat",
3806 "hours": "{0} ordu",
3807 "day": "egun bat",
3808 "days": "{0} egun",
3809 "month": "hilabete bat",
3810 "months": "{0} hilabet",
3811 "year": "urte bat",
3812 "years": "{0} urte",
3813 }
3815 month_names = [
3816 "",
3817 "urtarrilak",
3818 "otsailak",
3819 "martxoak",
3820 "apirilak",
3821 "maiatzak",
3822 "ekainak",
3823 "uztailak",
3824 "abuztuak",
3825 "irailak",
3826 "urriak",
3827 "azaroak",
3828 "abenduak",
3829 ]
3830 month_abbreviations = [
3831 "",
3832 "urt",
3833 "ots",
3834 "mar",
3835 "api",
3836 "mai",
3837 "eka",
3838 "uzt",
3839 "abu",
3840 "ira",
3841 "urr",
3842 "aza",
3843 "abe",
3844 ]
3845 day_names = [
3846 "",
3847 "astelehena",
3848 "asteartea",
3849 "asteazkena",
3850 "osteguna",
3851 "ostirala",
3852 "larunbata",
3853 "igandea",
3854 ]
3855 day_abbreviations = ["", "al", "ar", "az", "og", "ol", "lr", "ig"]
3858class HungarianLocale(Locale):
3859 names = ["hu", "hu-hu"]
3861 past = "{0} ezelőtt"
3862 future = "{0} múlva"
3864 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
3865 "now": "éppen most",
3866 "second": {"past": "egy második", "future": "egy második"},
3867 "seconds": {"past": "{0} másodpercekkel", "future": "{0} pár másodperc"},
3868 "minute": {"past": "egy perccel", "future": "egy perc"},
3869 "minutes": {"past": "{0} perccel", "future": "{0} perc"},
3870 "hour": {"past": "egy órával", "future": "egy óra"},
3871 "hours": {"past": "{0} órával", "future": "{0} óra"},
3872 "day": {"past": "egy nappal", "future": "egy nap"},
3873 "days": {"past": "{0} nappal", "future": "{0} nap"},
3874 "week": {"past": "egy héttel", "future": "egy hét"},
3875 "weeks": {"past": "{0} héttel", "future": "{0} hét"},
3876 "month": {"past": "egy hónappal", "future": "egy hónap"},
3877 "months": {"past": "{0} hónappal", "future": "{0} hónap"},
3878 "year": {"past": "egy évvel", "future": "egy év"},
3879 "years": {"past": "{0} évvel", "future": "{0} év"},
3880 }
3882 month_names = [
3883 "",
3884 "január",
3885 "február",
3886 "március",
3887 "április",
3888 "május",
3889 "június",
3890 "július",
3891 "augusztus",
3892 "szeptember",
3893 "október",
3894 "november",
3895 "december",
3896 ]
3897 month_abbreviations = [
3898 "",
3899 "jan",
3900 "febr",
3901 "márc",
3902 "ápr",
3903 "máj",
3904 "jún",
3905 "júl",
3906 "aug",
3907 "szept",
3908 "okt",
3909 "nov",
3910 "dec",
3911 ]
3913 day_names = [
3914 "",
3915 "hétfő",
3916 "kedd",
3917 "szerda",
3918 "csütörtök",
3919 "péntek",
3920 "szombat",
3921 "vasárnap",
3922 ]
3923 day_abbreviations = ["", "hét", "kedd", "szer", "csüt", "pént", "szom", "vas"]
3925 meridians = {"am": "de", "pm": "du", "AM": "DE", "PM": "DU"}
3927 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
3928 form = self.timeframes[timeframe]
3930 if isinstance(form, Mapping):
3931 if delta > 0:
3932 form = form["future"]
3933 else:
3934 form = form["past"]
3936 return form.format(abs(delta))
3939class EsperantoLocale(Locale):
3940 names = ["eo", "eo-xx"]
3941 past = "antaŭ {0}"
3942 future = "post {0}"
3944 timeframes = {
3945 "now": "nun",
3946 "second": "sekundo",
3947 "seconds": "{0} kelkaj sekundoj",
3948 "minute": "unu minuto",
3949 "minutes": "{0} minutoj",
3950 "hour": "un horo",
3951 "hours": "{0} horoj",
3952 "day": "unu tago",
3953 "days": "{0} tagoj",
3954 "month": "unu monato",
3955 "months": "{0} monatoj",
3956 "year": "unu jaro",
3957 "years": "{0} jaroj",
3958 }
3960 month_names = [
3961 "",
3962 "januaro",
3963 "februaro",
3964 "marto",
3965 "aprilo",
3966 "majo",
3967 "junio",
3968 "julio",
3969 "aŭgusto",
3970 "septembro",
3971 "oktobro",
3972 "novembro",
3973 "decembro",
3974 ]
3975 month_abbreviations = [
3976 "",
3977 "jan",
3978 "feb",
3979 "mar",
3980 "apr",
3981 "maj",
3982 "jun",
3983 "jul",
3984 "aŭg",
3985 "sep",
3986 "okt",
3987 "nov",
3988 "dec",
3989 ]
3991 day_names = [
3992 "",
3993 "lundo",
3994 "mardo",
3995 "merkredo",
3996 "ĵaŭdo",
3997 "vendredo",
3998 "sabato",
3999 "dimanĉo",
4000 ]
4001 day_abbreviations = ["", "lun", "mar", "mer", "ĵaŭ", "ven", "sab", "dim"]
4003 meridians = {"am": "atm", "pm": "ptm", "AM": "ATM", "PM": "PTM"}
4005 ordinal_day_re = r"((?P<value>[1-3]?[0-9](?=a))a)"
4007 def _ordinal_number(self, n: int) -> str:
4008 return f"{n}a"
4011class ThaiLocale(Locale):
4012 names = ["th", "th-th"]
4014 past = "{0} ที่ผ่านมา"
4015 future = "ในอีก {0}"
4017 timeframes = {
4018 "now": "ขณะนี้",
4019 "second": "วินาที",
4020 "seconds": "{0} วินาที",
4021 "minute": "นาที",
4022 "minutes": "{0} นาที",
4023 "hour": "ชั่วโมง",
4024 "hours": "{0} ชั่วโมง",
4025 "day": "วัน",
4026 "days": "{0} วัน",
4027 "week": "สัปดาห์",
4028 "weeks": "{0} สัปดาห์",
4029 "month": "เดือน",
4030 "months": "{0} เดือน",
4031 "year": "ปี",
4032 "years": "{0} ปี",
4033 }
4035 month_names = [
4036 "",
4037 "มกราคม",
4038 "กุมภาพันธ์",
4039 "มีนาคม",
4040 "เมษายน",
4041 "พฤษภาคม",
4042 "มิถุนายน",
4043 "กรกฎาคม",
4044 "สิงหาคม",
4045 "กันยายน",
4046 "ตุลาคม",
4047 "พฤศจิกายน",
4048 "ธันวาคม",
4049 ]
4050 month_abbreviations = [
4051 "",
4052 "ม.ค.",
4053 "ก.พ.",
4054 "มี.ค.",
4055 "เม.ย.",
4056 "พ.ค.",
4057 "มิ.ย.",
4058 "ก.ค.",
4059 "ส.ค.",
4060 "ก.ย.",
4061 "ต.ค.",
4062 "พ.ย.",
4063 "ธ.ค.",
4064 ]
4066 day_names = [
4067 "",
4068 "วันจันทร์",
4069 "วันอังคาร",
4070 "วันพุธ",
4071 "วันพฤหัสบดี",
4072 "วันศุกร์",
4073 "วันเสาร์",
4074 "วันอาทิตย์",
4075 ]
4076 day_abbreviations = ["", "จ.", "อ.", "พ.", "พฤ.", "ศ.", "ส.", "อา."]
4078 meridians = {"am": "am", "pm": "pm", "AM": "AM", "PM": "PM"}
4080 BE_OFFSET = 543
4082 def year_full(self, year: int) -> str:
4083 """Thai always use Buddhist Era (BE) which is CE + 543"""
4084 year += self.BE_OFFSET
4085 return f"{year:04d}"
4087 def year_abbreviation(self, year: int) -> str:
4088 """Thai always use Buddhist Era (BE) which is CE + 543"""
4089 year += self.BE_OFFSET
4090 return f"{year:04d}"[2:]
4092 def _format_relative(
4093 self,
4094 humanized: str,
4095 timeframe: TimeFrameLiteral,
4096 delta: Union[float, int],
4097 ) -> str:
4098 """Thai normally doesn't have any space between words"""
4099 if timeframe == "now":
4100 return humanized
4102 direction = self.past if delta < 0 else self.future
4103 relative_string = direction.format(humanized)
4105 if timeframe == "seconds":
4106 relative_string = relative_string.replace(" ", "")
4108 return relative_string
4111class LaotianLocale(Locale):
4112 names = ["lo", "lo-la"]
4114 past = "{0} ກ່ອນຫນ້ານີ້"
4115 future = "ໃນ {0}"
4117 timeframes = {
4118 "now": "ດຽວນີ້",
4119 "second": "ວິນາທີ",
4120 "seconds": "{0} ວິນາທີ",
4121 "minute": "ນາທີ",
4122 "minutes": "{0} ນາທີ",
4123 "hour": "ຊົ່ວໂມງ",
4124 "hours": "{0} ຊົ່ວໂມງ",
4125 "day": "ມື້",
4126 "days": "{0} ມື້",
4127 "week": "ອາທິດ",
4128 "weeks": "{0} ອາທິດ",
4129 "month": "ເດືອນ",
4130 "months": "{0} ເດືອນ",
4131 "year": "ປີ",
4132 "years": "{0} ປີ",
4133 }
4135 month_names = [
4136 "",
4137 "ມັງກອນ", # mangkon
4138 "ກຸມພາ", # kumpha
4139 "ມີນາ", # mina
4140 "ເມສາ", # mesa
4141 "ພຶດສະພາ", # phudsapha
4142 "ມິຖຸນາ", # mithuna
4143 "ກໍລະກົດ", # kolakod
4144 "ສິງຫາ", # singha
4145 "ກັນຍາ", # knaia
4146 "ຕຸລາ", # tula
4147 "ພະຈິກ", # phachik
4148 "ທັນວາ", # thanuaa
4149 ]
4150 month_abbreviations = [
4151 "",
4152 "ມັງກອນ",
4153 "ກຸມພາ",
4154 "ມີນາ",
4155 "ເມສາ",
4156 "ພຶດສະພາ",
4157 "ມິຖຸນາ",
4158 "ກໍລະກົດ",
4159 "ສິງຫາ",
4160 "ກັນຍາ",
4161 "ຕຸລາ",
4162 "ພະຈິກ",
4163 "ທັນວາ",
4164 ]
4166 day_names = [
4167 "",
4168 "ວັນຈັນ", # vanchan
4169 "ວັນອັງຄານ", # vnoangkhan
4170 "ວັນພຸດ", # vanphud
4171 "ວັນພະຫັດ", # vanphahad
4172 "ວັນສຸກ", # vansuk
4173 "ວັນເສົາ", # vansao
4174 "ວັນອາທິດ", # vnoathid
4175 ]
4176 day_abbreviations = [
4177 "",
4178 "ວັນຈັນ",
4179 "ວັນອັງຄານ",
4180 "ວັນພຸດ",
4181 "ວັນພະຫັດ",
4182 "ວັນສຸກ",
4183 "ວັນເສົາ",
4184 "ວັນອາທິດ",
4185 ]
4187 BE_OFFSET = 543
4189 def year_full(self, year: int) -> str:
4190 """Lao always use Buddhist Era (BE) which is CE + 543"""
4191 year += self.BE_OFFSET
4192 return f"{year:04d}"
4194 def year_abbreviation(self, year: int) -> str:
4195 """Lao always use Buddhist Era (BE) which is CE + 543"""
4196 year += self.BE_OFFSET
4197 return f"{year:04d}"[2:]
4199 def _format_relative(
4200 self,
4201 humanized: str,
4202 timeframe: TimeFrameLiteral,
4203 delta: Union[float, int],
4204 ) -> str:
4205 """Lao normally doesn't have any space between words"""
4206 if timeframe == "now":
4207 return humanized
4209 direction = self.past if delta < 0 else self.future
4210 relative_string = direction.format(humanized)
4212 if timeframe == "seconds":
4213 relative_string = relative_string.replace(" ", "")
4215 return relative_string
4218class BengaliLocale(Locale):
4219 names = ["bn", "bn-bd", "bn-in"]
4221 past = "{0} আগে"
4222 future = "{0} পরে"
4224 timeframes = {
4225 "now": "এখন",
4226 "second": "একটি দ্বিতীয়",
4227 "seconds": "{0} সেকেন্ড",
4228 "minute": "এক মিনিট",
4229 "minutes": "{0} মিনিট",
4230 "hour": "এক ঘণ্টা",
4231 "hours": "{0} ঘণ্টা",
4232 "day": "এক দিন",
4233 "days": "{0} দিন",
4234 "month": "এক মাস",
4235 "months": "{0} মাস ",
4236 "year": "এক বছর",
4237 "years": "{0} বছর",
4238 }
4240 meridians = {"am": "সকাল", "pm": "বিকাল", "AM": "সকাল", "PM": "বিকাল"}
4242 month_names = [
4243 "",
4244 "জানুয়ারি",
4245 "ফেব্রুয়ারি",
4246 "মার্চ",
4247 "এপ্রিল",
4248 "মে",
4249 "জুন",
4250 "জুলাই",
4251 "আগস্ট",
4252 "সেপ্টেম্বর",
4253 "অক্টোবর",
4254 "নভেম্বর",
4255 "ডিসেম্বর",
4256 ]
4257 month_abbreviations = [
4258 "",
4259 "জানু",
4260 "ফেব",
4261 "মার্চ",
4262 "এপ্রি",
4263 "মে",
4264 "জুন",
4265 "জুল",
4266 "অগা",
4267 "সেপ্ট",
4268 "অক্টো",
4269 "নভে",
4270 "ডিসে",
4271 ]
4273 day_names = [
4274 "",
4275 "সোমবার",
4276 "মঙ্গলবার",
4277 "বুধবার",
4278 "বৃহস্পতিবার",
4279 "শুক্রবার",
4280 "শনিবার",
4281 "রবিবার",
4282 ]
4283 day_abbreviations = ["", "সোম", "মঙ্গল", "বুধ", "বৃহঃ", "শুক্র", "শনি", "রবি"]
4285 def _ordinal_number(self, n: int) -> str:
4286 if n > 10 or n == 0:
4287 return f"{n}তম"
4288 if n in [1, 5, 7, 8, 9, 10]:
4289 return f"{n}ম"
4290 if n in [2, 3]:
4291 return f"{n}য়"
4292 if n == 4:
4293 return f"{n}র্থ"
4294 if n == 6:
4295 return f"{n}ষ্ঠ"
4296 return ""
4299class RomanshLocale(Locale):
4300 names = ["rm", "rm-ch"]
4302 past = "avant {0}"
4303 future = "en {0}"
4305 timeframes = {
4306 "now": "en quest mument",
4307 "second": "in secunda",
4308 "seconds": "{0} secundas",
4309 "minute": "ina minuta",
4310 "minutes": "{0} minutas",
4311 "hour": "in'ura",
4312 "hours": "{0} ura",
4313 "day": "in di",
4314 "days": "{0} dis",
4315 "week": "in'emna",
4316 "weeks": "{0} emnas",
4317 "month": "in mais",
4318 "months": "{0} mais",
4319 "year": "in onn",
4320 "years": "{0} onns",
4321 }
4323 month_names = [
4324 "",
4325 "schaner",
4326 "favrer",
4327 "mars",
4328 "avrigl",
4329 "matg",
4330 "zercladur",
4331 "fanadur",
4332 "avust",
4333 "settember",
4334 "october",
4335 "november",
4336 "december",
4337 ]
4339 month_abbreviations = [
4340 "",
4341 "schan",
4342 "fav",
4343 "mars",
4344 "avr",
4345 "matg",
4346 "zer",
4347 "fan",
4348 "avu",
4349 "set",
4350 "oct",
4351 "nov",
4352 "dec",
4353 ]
4355 day_names = [
4356 "",
4357 "glindesdi",
4358 "mardi",
4359 "mesemna",
4360 "gievgia",
4361 "venderdi",
4362 "sonda",
4363 "dumengia",
4364 ]
4366 day_abbreviations = ["", "gli", "ma", "me", "gie", "ve", "so", "du"]
4369class RomanianLocale(Locale):
4370 names = ["ro", "ro-ro"]
4372 past = "{0} în urmă"
4373 future = "peste {0}"
4374 and_word = "și"
4376 timeframes = {
4377 "now": "acum",
4378 "second": "o secunda",
4379 "seconds": "{0} câteva secunde",
4380 "minute": "un minut",
4381 "minutes": "{0} minute",
4382 "hour": "o oră",
4383 "hours": "{0} ore",
4384 "day": "o zi",
4385 "days": "{0} zile",
4386 "month": "o lună",
4387 "months": "{0} luni",
4388 "year": "un an",
4389 "years": "{0} ani",
4390 }
4392 month_names = [
4393 "",
4394 "ianuarie",
4395 "februarie",
4396 "martie",
4397 "aprilie",
4398 "mai",
4399 "iunie",
4400 "iulie",
4401 "august",
4402 "septembrie",
4403 "octombrie",
4404 "noiembrie",
4405 "decembrie",
4406 ]
4407 month_abbreviations = [
4408 "",
4409 "ian",
4410 "febr",
4411 "mart",
4412 "apr",
4413 "mai",
4414 "iun",
4415 "iul",
4416 "aug",
4417 "sept",
4418 "oct",
4419 "nov",
4420 "dec",
4421 ]
4423 day_names = [
4424 "",
4425 "luni",
4426 "marți",
4427 "miercuri",
4428 "joi",
4429 "vineri",
4430 "sâmbătă",
4431 "duminică",
4432 ]
4433 day_abbreviations = ["", "Lun", "Mar", "Mie", "Joi", "Vin", "Sâm", "Dum"]
4436class SlovenianLocale(Locale):
4437 names = ["sl", "sl-si"]
4439 past = "pred {0}"
4440 future = "čez {0}"
4441 and_word = "in"
4443 timeframes = {
4444 "now": "zdaj",
4445 "second": "sekundo",
4446 "seconds": "{0} sekund",
4447 "minute": "minuta",
4448 "minutes": "{0} minutami",
4449 "hour": "uro",
4450 "hours": "{0} ur",
4451 "day": "dan",
4452 "days": "{0} dni",
4453 "month": "mesec",
4454 "months": "{0} mesecev",
4455 "year": "leto",
4456 "years": "{0} let",
4457 }
4459 meridians = {"am": "", "pm": "", "AM": "", "PM": ""}
4461 month_names = [
4462 "",
4463 "Januar",
4464 "Februar",
4465 "Marec",
4466 "April",
4467 "Maj",
4468 "Junij",
4469 "Julij",
4470 "Avgust",
4471 "September",
4472 "Oktober",
4473 "November",
4474 "December",
4475 ]
4477 month_abbreviations = [
4478 "",
4479 "Jan",
4480 "Feb",
4481 "Mar",
4482 "Apr",
4483 "Maj",
4484 "Jun",
4485 "Jul",
4486 "Avg",
4487 "Sep",
4488 "Okt",
4489 "Nov",
4490 "Dec",
4491 ]
4493 day_names = [
4494 "",
4495 "Ponedeljek",
4496 "Torek",
4497 "Sreda",
4498 "Četrtek",
4499 "Petek",
4500 "Sobota",
4501 "Nedelja",
4502 ]
4504 day_abbreviations = ["", "Pon", "Tor", "Sre", "Čet", "Pet", "Sob", "Ned"]
4507class IndonesianLocale(Locale):
4508 names = ["id", "id-id"]
4510 past = "{0} yang lalu"
4511 future = "dalam {0}"
4512 and_word = "dan"
4514 timeframes = {
4515 "now": "baru saja",
4516 "second": "1 sebentar",
4517 "seconds": "{0} detik",
4518 "minute": "1 menit",
4519 "minutes": "{0} menit",
4520 "hour": "1 jam",
4521 "hours": "{0} jam",
4522 "day": "1 hari",
4523 "days": "{0} hari",
4524 "week": "1 minggu",
4525 "weeks": "{0} minggu",
4526 "month": "1 bulan",
4527 "months": "{0} bulan",
4528 "quarter": "1 kuartal",
4529 "quarters": "{0} kuartal",
4530 "year": "1 tahun",
4531 "years": "{0} tahun",
4532 }
4534 meridians = {"am": "", "pm": "", "AM": "", "PM": ""}
4536 month_names = [
4537 "",
4538 "Januari",
4539 "Februari",
4540 "Maret",
4541 "April",
4542 "Mei",
4543 "Juni",
4544 "Juli",
4545 "Agustus",
4546 "September",
4547 "Oktober",
4548 "November",
4549 "Desember",
4550 ]
4552 month_abbreviations = [
4553 "",
4554 "Jan",
4555 "Feb",
4556 "Mar",
4557 "Apr",
4558 "Mei",
4559 "Jun",
4560 "Jul",
4561 "Ags",
4562 "Sept",
4563 "Okt",
4564 "Nov",
4565 "Des",
4566 ]
4568 day_names = ["", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu", "Minggu"]
4570 day_abbreviations = [
4571 "",
4572 "Senin",
4573 "Selasa",
4574 "Rabu",
4575 "Kamis",
4576 "Jumat",
4577 "Sabtu",
4578 "Minggu",
4579 ]
4582class NepaliLocale(Locale):
4583 names = ["ne", "ne-np"]
4585 past = "{0} पहिले"
4586 future = "{0} पछी"
4588 timeframes = {
4589 "now": "अहिले",
4590 "second": "एक सेकेन्ड",
4591 "seconds": "{0} सेकण्ड",
4592 "minute": "मिनेट",
4593 "minutes": "{0} मिनेट",
4594 "hour": "एक घण्टा",
4595 "hours": "{0} घण्टा",
4596 "day": "एक दिन",
4597 "days": "{0} दिन",
4598 "month": "एक महिना",
4599 "months": "{0} महिना",
4600 "year": "एक बर्ष",
4601 "years": "{0} बर्ष",
4602 }
4604 meridians = {"am": "पूर्वाह्न", "pm": "अपरान्ह", "AM": "पूर्वाह्न", "PM": "अपरान्ह"}
4606 month_names = [
4607 "",
4608 "जनवरी",
4609 "फेब्रुअरी",
4610 "मार्च",
4611 "एप्रील",
4612 "मे",
4613 "जुन",
4614 "जुलाई",
4615 "अगष्ट",
4616 "सेप्टेम्बर",
4617 "अक्टोबर",
4618 "नोवेम्बर",
4619 "डिसेम्बर",
4620 ]
4621 month_abbreviations = [
4622 "",
4623 "जन",
4624 "फेब",
4625 "मार्च",
4626 "एप्रील",
4627 "मे",
4628 "जुन",
4629 "जुलाई",
4630 "अग",
4631 "सेप",
4632 "अक्ट",
4633 "नोव",
4634 "डिस",
4635 ]
4637 day_names = [
4638 "",
4639 "सोमवार",
4640 "मंगलवार",
4641 "बुधवार",
4642 "बिहिवार",
4643 "शुक्रवार",
4644 "शनिवार",
4645 "आइतवार",
4646 ]
4648 day_abbreviations = ["", "सोम", "मंगल", "बुध", "बिहि", "शुक्र", "शनि", "आइत"]
4651class EstonianLocale(Locale):
4652 names = ["ee", "et"]
4654 past = "{0} tagasi"
4655 future = "{0} pärast"
4656 and_word = "ja"
4658 timeframes: ClassVar[Mapping[TimeFrameLiteral, Mapping[str, str]]] = {
4659 "now": {"past": "just nüüd", "future": "just nüüd"},
4660 "second": {"past": "üks sekund", "future": "ühe sekundi"},
4661 "seconds": {"past": "{0} sekundit", "future": "{0} sekundi"},
4662 "minute": {"past": "üks minut", "future": "ühe minuti"},
4663 "minutes": {"past": "{0} minutit", "future": "{0} minuti"},
4664 "hour": {"past": "tund aega", "future": "tunni aja"},
4665 "hours": {"past": "{0} tundi", "future": "{0} tunni"},
4666 "day": {"past": "üks päev", "future": "ühe päeva"},
4667 "days": {"past": "{0} päeva", "future": "{0} päeva"},
4668 "month": {"past": "üks kuu", "future": "ühe kuu"},
4669 "months": {"past": "{0} kuud", "future": "{0} kuu"},
4670 "year": {"past": "üks aasta", "future": "ühe aasta"},
4671 "years": {"past": "{0} aastat", "future": "{0} aasta"},
4672 }
4674 month_names = [
4675 "",
4676 "Jaanuar",
4677 "Veebruar",
4678 "Märts",
4679 "Aprill",
4680 "Mai",
4681 "Juuni",
4682 "Juuli",
4683 "August",
4684 "September",
4685 "Oktoober",
4686 "November",
4687 "Detsember",
4688 ]
4689 month_abbreviations = [
4690 "",
4691 "Jan",
4692 "Veb",
4693 "Mär",
4694 "Apr",
4695 "Mai",
4696 "Jun",
4697 "Jul",
4698 "Aug",
4699 "Sep",
4700 "Okt",
4701 "Nov",
4702 "Dets",
4703 ]
4705 day_names = [
4706 "",
4707 "Esmaspäev",
4708 "Teisipäev",
4709 "Kolmapäev",
4710 "Neljapäev",
4711 "Reede",
4712 "Laupäev",
4713 "Pühapäev",
4714 ]
4715 day_abbreviations = ["", "Esm", "Teis", "Kolm", "Nelj", "Re", "Lau", "Püh"]
4717 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
4718 form = self.timeframes[timeframe]
4719 if delta > 0:
4720 _form = form["future"]
4721 else:
4722 _form = form["past"]
4723 return _form.format(abs(delta))
4726class LatvianLocale(Locale):
4727 names = ["lv", "lv-lv"]
4729 past = "pirms {0}"
4730 future = "pēc {0}"
4731 and_word = "un"
4733 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
4734 "now": "tagad",
4735 "second": "sekundes",
4736 "seconds": "{0} sekundēm",
4737 "minute": "minūtes",
4738 "minutes": "{0} minūtēm",
4739 "hour": "stundas",
4740 "hours": "{0} stundām",
4741 "day": "dienas",
4742 "days": "{0} dienām",
4743 "week": "nedēļas",
4744 "weeks": "{0} nedēļām",
4745 "month": "mēneša",
4746 "months": "{0} mēnešiem",
4747 "year": "gada",
4748 "years": "{0} gadiem",
4749 }
4751 month_names = [
4752 "",
4753 "janvāris",
4754 "februāris",
4755 "marts",
4756 "aprīlis",
4757 "maijs",
4758 "jūnijs",
4759 "jūlijs",
4760 "augusts",
4761 "septembris",
4762 "oktobris",
4763 "novembris",
4764 "decembris",
4765 ]
4767 month_abbreviations = [
4768 "",
4769 "jan",
4770 "feb",
4771 "marts",
4772 "apr",
4773 "maijs",
4774 "jūnijs",
4775 "jūlijs",
4776 "aug",
4777 "sept",
4778 "okt",
4779 "nov",
4780 "dec",
4781 ]
4783 day_names = [
4784 "",
4785 "pirmdiena",
4786 "otrdiena",
4787 "trešdiena",
4788 "ceturtdiena",
4789 "piektdiena",
4790 "sestdiena",
4791 "svētdiena",
4792 ]
4794 day_abbreviations = [
4795 "",
4796 "pi",
4797 "ot",
4798 "tr",
4799 "ce",
4800 "pi",
4801 "se",
4802 "sv",
4803 ]
4806class SwahiliLocale(Locale):
4807 names = [
4808 "sw",
4809 "sw-ke",
4810 "sw-tz",
4811 ]
4813 past = "{0} iliyopita"
4814 future = "muda wa {0}"
4815 and_word = "na"
4817 timeframes = {
4818 "now": "sasa hivi",
4819 "second": "sekunde",
4820 "seconds": "sekunde {0}",
4821 "minute": "dakika moja",
4822 "minutes": "dakika {0}",
4823 "hour": "saa moja",
4824 "hours": "saa {0}",
4825 "day": "siku moja",
4826 "days": "siku {0}",
4827 "week": "wiki moja",
4828 "weeks": "wiki {0}",
4829 "month": "mwezi moja",
4830 "months": "miezi {0}",
4831 "year": "mwaka moja",
4832 "years": "miaka {0}",
4833 }
4835 meridians = {"am": "asu", "pm": "mch", "AM": "ASU", "PM": "MCH"}
4837 month_names = [
4838 "",
4839 "Januari",
4840 "Februari",
4841 "Machi",
4842 "Aprili",
4843 "Mei",
4844 "Juni",
4845 "Julai",
4846 "Agosti",
4847 "Septemba",
4848 "Oktoba",
4849 "Novemba",
4850 "Desemba",
4851 ]
4852 month_abbreviations = [
4853 "",
4854 "Jan",
4855 "Feb",
4856 "Mac",
4857 "Apr",
4858 "Mei",
4859 "Jun",
4860 "Jul",
4861 "Ago",
4862 "Sep",
4863 "Okt",
4864 "Nov",
4865 "Des",
4866 ]
4868 day_names = [
4869 "",
4870 "Jumatatu",
4871 "Jumanne",
4872 "Jumatano",
4873 "Alhamisi",
4874 "Ijumaa",
4875 "Jumamosi",
4876 "Jumapili",
4877 ]
4878 day_abbreviations = [
4879 "",
4880 "Jumatatu",
4881 "Jumanne",
4882 "Jumatano",
4883 "Alhamisi",
4884 "Ijumaa",
4885 "Jumamosi",
4886 "Jumapili",
4887 ]
4890class CroatianLocale(Locale):
4891 names = ["hr", "hr-hr"]
4893 past = "prije {0}"
4894 future = "za {0}"
4895 and_word = "i"
4897 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
4898 "now": "upravo sad",
4899 "second": "sekundu",
4900 "seconds": {"double": "{0} sekunde", "higher": "{0} sekundi"},
4901 "minute": "minutu",
4902 "minutes": {"double": "{0} minute", "higher": "{0} minuta"},
4903 "hour": "sat",
4904 "hours": {"double": "{0} sata", "higher": "{0} sati"},
4905 "day": "jedan dan",
4906 "days": {"double": "{0} dana", "higher": "{0} dana"},
4907 "week": "tjedan",
4908 "weeks": {"double": "{0} tjedna", "higher": "{0} tjedana"},
4909 "month": "mjesec",
4910 "months": {"double": "{0} mjeseca", "higher": "{0} mjeseci"},
4911 "year": "godinu",
4912 "years": {"double": "{0} godine", "higher": "{0} godina"},
4913 }
4915 month_names = [
4916 "",
4917 "siječanj",
4918 "veljača",
4919 "ožujak",
4920 "travanj",
4921 "svibanj",
4922 "lipanj",
4923 "srpanj",
4924 "kolovoz",
4925 "rujan",
4926 "listopad",
4927 "studeni",
4928 "prosinac",
4929 ]
4931 month_abbreviations = [
4932 "",
4933 "siječ",
4934 "velj",
4935 "ožuj",
4936 "trav",
4937 "svib",
4938 "lip",
4939 "srp",
4940 "kol",
4941 "ruj",
4942 "list",
4943 "stud",
4944 "pros",
4945 ]
4947 day_names = [
4948 "",
4949 "ponedjeljak",
4950 "utorak",
4951 "srijeda",
4952 "četvrtak",
4953 "petak",
4954 "subota",
4955 "nedjelja",
4956 ]
4958 day_abbreviations = [
4959 "",
4960 "po",
4961 "ut",
4962 "sr",
4963 "če",
4964 "pe",
4965 "su",
4966 "ne",
4967 ]
4969 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
4970 form = self.timeframes[timeframe]
4971 delta = abs(delta)
4972 if isinstance(form, Mapping):
4973 if 1 < delta <= 4:
4974 form = form["double"]
4975 else:
4976 form = form["higher"]
4978 return form.format(delta)
4981class LatinLocale(Locale):
4982 names = ["la", "la-va"]
4984 past = "ante {0}"
4985 future = "in {0}"
4986 and_word = "et"
4988 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
4989 "now": "nunc",
4990 "second": "secundum",
4991 "seconds": "{0} secundis",
4992 "minute": "minutam",
4993 "minutes": "{0} minutis",
4994 "hour": "horam",
4995 "hours": "{0} horas",
4996 "day": "diem",
4997 "days": "{0} dies",
4998 "week": "hebdomadem",
4999 "weeks": "{0} hebdomades",
5000 "month": "mensem",
5001 "months": "{0} mensis",
5002 "year": "annum",
5003 "years": "{0} annos",
5004 }
5006 month_names = [
5007 "",
5008 "Ianuarius",
5009 "Februarius",
5010 "Martius",
5011 "Aprilis",
5012 "Maius",
5013 "Iunius",
5014 "Iulius",
5015 "Augustus",
5016 "September",
5017 "October",
5018 "November",
5019 "December",
5020 ]
5022 month_abbreviations = [
5023 "",
5024 "Ian",
5025 "Febr",
5026 "Mart",
5027 "Apr",
5028 "Mai",
5029 "Iun",
5030 "Iul",
5031 "Aug",
5032 "Sept",
5033 "Oct",
5034 "Nov",
5035 "Dec",
5036 ]
5038 day_names = [
5039 "",
5040 "dies Lunae",
5041 "dies Martis",
5042 "dies Mercurii",
5043 "dies Iovis",
5044 "dies Veneris",
5045 "dies Saturni",
5046 "dies Solis",
5047 ]
5049 day_abbreviations = [
5050 "",
5051 "dies Lunae",
5052 "dies Martis",
5053 "dies Mercurii",
5054 "dies Iovis",
5055 "dies Veneris",
5056 "dies Saturni",
5057 "dies Solis",
5058 ]
5061class LithuanianLocale(Locale):
5062 names = ["lt", "lt-lt"]
5064 past = "prieš {0}"
5065 future = "po {0}"
5066 and_word = "ir"
5068 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
5069 "now": "dabar",
5070 "second": "sekundės",
5071 "seconds": "{0} sekundžių",
5072 "minute": "minutės",
5073 "minutes": "{0} minučių",
5074 "hour": "valandos",
5075 "hours": "{0} valandų",
5076 "day": "dieną",
5077 "days": "{0} dienų",
5078 "week": "savaitės",
5079 "weeks": "{0} savaičių",
5080 "month": "mėnesio",
5081 "months": "{0} mėnesių",
5082 "year": "metų",
5083 "years": "{0} metų",
5084 }
5086 month_names = [
5087 "",
5088 "sausis",
5089 "vasaris",
5090 "kovas",
5091 "balandis",
5092 "gegužė",
5093 "birželis",
5094 "liepa",
5095 "rugpjūtis",
5096 "rugsėjis",
5097 "spalis",
5098 "lapkritis",
5099 "gruodis",
5100 ]
5102 month_abbreviations = [
5103 "",
5104 "saus",
5105 "vas",
5106 "kovas",
5107 "bal",
5108 "geg",
5109 "birž",
5110 "liepa",
5111 "rugp",
5112 "rugs",
5113 "spalis",
5114 "lapkr",
5115 "gr",
5116 ]
5118 day_names = [
5119 "",
5120 "pirmadienis",
5121 "antradienis",
5122 "trečiadienis",
5123 "ketvirtadienis",
5124 "penktadienis",
5125 "šeštadienis",
5126 "sekmadienis",
5127 ]
5129 day_abbreviations = [
5130 "",
5131 "pi",
5132 "an",
5133 "tr",
5134 "ke",
5135 "pe",
5136 "še",
5137 "se",
5138 ]
5141class MalayLocale(Locale):
5142 names = ["ms", "ms-my", "ms-bn"]
5144 past = "{0} yang lalu"
5145 future = "dalam {0}"
5146 and_word = "dan"
5148 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
5149 "now": "sekarang",
5150 "second": "saat",
5151 "seconds": "{0} saat",
5152 "minute": "minit",
5153 "minutes": "{0} minit",
5154 "hour": "jam",
5155 "hours": "{0} jam",
5156 "day": "hari",
5157 "days": "{0} hari",
5158 "week": "minggu",
5159 "weeks": "{0} minggu",
5160 "month": "bulan",
5161 "months": "{0} bulan",
5162 "year": "tahun",
5163 "years": "{0} tahun",
5164 }
5166 month_names = [
5167 "",
5168 "Januari",
5169 "Februari",
5170 "Mac",
5171 "April",
5172 "Mei",
5173 "Jun",
5174 "Julai",
5175 "Ogos",
5176 "September",
5177 "Oktober",
5178 "November",
5179 "Disember",
5180 ]
5182 month_abbreviations = [
5183 "",
5184 "Jan.",
5185 "Feb.",
5186 "Mac",
5187 "Apr.",
5188 "Mei",
5189 "Jun",
5190 "Julai",
5191 "Og.",
5192 "Sept.",
5193 "Okt.",
5194 "Nov.",
5195 "Dis.",
5196 ]
5198 day_names = [
5199 "",
5200 "Isnin",
5201 "Selasa",
5202 "Rabu",
5203 "Khamis",
5204 "Jumaat",
5205 "Sabtu",
5206 "Ahad",
5207 ]
5209 day_abbreviations = [
5210 "",
5211 "Isnin",
5212 "Selasa",
5213 "Rabu",
5214 "Khamis",
5215 "Jumaat",
5216 "Sabtu",
5217 "Ahad",
5218 ]
5221class MalteseLocale(Locale):
5222 names = ["mt", "mt-mt"]
5224 past = "{0} ilu"
5225 future = "fi {0}"
5226 and_word = "u"
5228 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
5229 "now": "issa",
5230 "second": "sekonda",
5231 "seconds": "{0} sekondi",
5232 "minute": "minuta",
5233 "minutes": "{0} minuti",
5234 "hour": "siegħa",
5235 "hours": {"dual": "{0} sagħtejn", "plural": "{0} sigħat"},
5236 "day": "jum",
5237 "days": {"dual": "{0} jumejn", "plural": "{0} ijiem"},
5238 "week": "ġimgħa",
5239 "weeks": {"dual": "{0} ġimagħtejn", "plural": "{0} ġimgħat"},
5240 "month": "xahar",
5241 "months": {"dual": "{0} xahrejn", "plural": "{0} xhur"},
5242 "year": "sena",
5243 "years": {"dual": "{0} sentejn", "plural": "{0} snin"},
5244 }
5246 month_names = [
5247 "",
5248 "Jannar",
5249 "Frar",
5250 "Marzu",
5251 "April",
5252 "Mejju",
5253 "Ġunju",
5254 "Lulju",
5255 "Awwissu",
5256 "Settembru",
5257 "Ottubru",
5258 "Novembru",
5259 "Diċembru",
5260 ]
5262 month_abbreviations = [
5263 "",
5264 "Jan",
5265 "Fr",
5266 "Mar",
5267 "Apr",
5268 "Mejju",
5269 "Ġun",
5270 "Lul",
5271 "Aw",
5272 "Sett",
5273 "Ott",
5274 "Nov",
5275 "Diċ",
5276 ]
5278 day_names = [
5279 "",
5280 "It-Tnejn",
5281 "It-Tlieta",
5282 "L-Erbgħa",
5283 "Il-Ħamis",
5284 "Il-Ġimgħa",
5285 "Is-Sibt",
5286 "Il-Ħadd",
5287 ]
5289 day_abbreviations = [
5290 "",
5291 "T",
5292 "TL",
5293 "E",
5294 "Ħ",
5295 "Ġ",
5296 "S",
5297 "Ħ",
5298 ]
5300 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
5301 form = self.timeframes[timeframe]
5302 delta = abs(delta)
5303 if isinstance(form, Mapping):
5304 if delta == 2:
5305 form = form["dual"]
5306 else:
5307 form = form["plural"]
5309 return form.format(delta)
5312class SamiLocale(Locale):
5313 names = ["se", "se-fi", "se-no", "se-se"]
5315 past = "{0} dassái"
5316 future = "{0} " # NOTE: couldn't find preposition for Sami here, none needed?
5318 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
5319 "now": "dál",
5320 "second": "sekunda",
5321 "seconds": "{0} sekundda",
5322 "minute": "minuhta",
5323 "minutes": "{0} minuhta",
5324 "hour": "diimmu",
5325 "hours": "{0} diimmu",
5326 "day": "beaivvi",
5327 "days": "{0} beaivvi",
5328 "week": "vahku",
5329 "weeks": "{0} vahku",
5330 "month": "mánu",
5331 "months": "{0} mánu",
5332 "year": "jagi",
5333 "years": "{0} jagi",
5334 }
5336 month_names = [
5337 "",
5338 "Ođđajagimánnu",
5339 "Guovvamánnu",
5340 "Njukčamánnu",
5341 "Cuoŋománnu",
5342 "Miessemánnu",
5343 "Geassemánnu",
5344 "Suoidnemánnu",
5345 "Borgemánnu",
5346 "Čakčamánnu",
5347 "Golggotmánnu",
5348 "Skábmamánnu",
5349 "Juovlamánnu",
5350 ]
5352 month_abbreviations = [
5353 "",
5354 "Ođđajagimánnu",
5355 "Guovvamánnu",
5356 "Njukčamánnu",
5357 "Cuoŋománnu",
5358 "Miessemánnu",
5359 "Geassemánnu",
5360 "Suoidnemánnu",
5361 "Borgemánnu",
5362 "Čakčamánnu",
5363 "Golggotmánnu",
5364 "Skábmamánnu",
5365 "Juovlamánnu",
5366 ]
5368 day_names = [
5369 "",
5370 "Mánnodat",
5371 "Disdat",
5372 "Gaskavahkku",
5373 "Duorastat",
5374 "Bearjadat",
5375 "Lávvordat",
5376 "Sotnabeaivi",
5377 ]
5379 day_abbreviations = [
5380 "",
5381 "Mánnodat",
5382 "Disdat",
5383 "Gaskavahkku",
5384 "Duorastat",
5385 "Bearjadat",
5386 "Lávvordat",
5387 "Sotnabeaivi",
5388 ]
5391class OdiaLocale(Locale):
5392 names = ["or", "or-in"]
5394 past = "{0} ପୂର୍ବେ"
5395 future = "{0} ପରେ"
5397 timeframes = {
5398 "now": "ବର୍ତ୍ତମାନ",
5399 "second": "ଏକ ସେକେଣ୍ଡ",
5400 "seconds": "{0} ସେକେଣ୍ଡ",
5401 "minute": "ଏକ ମିନଟ",
5402 "minutes": "{0} ମିନଟ",
5403 "hour": "ଏକ ଘଣ୍ଟା",
5404 "hours": "{0} ଘଣ୍ଟା",
5405 "day": "ଏକ ଦିନ",
5406 "days": "{0} ଦିନ",
5407 "month": "ଏକ ମାସ",
5408 "months": "{0} ମାସ ",
5409 "year": "ଏକ ବର୍ଷ",
5410 "years": "{0} ବର୍ଷ",
5411 }
5413 meridians = {"am": "ପୂର୍ବାହ୍ନ", "pm": "ଅପରାହ୍ନ", "AM": "ପୂର୍ବାହ୍ନ", "PM": "ଅପରାହ୍ନ"}
5415 month_names = [
5416 "",
5417 "ଜାନୁଆରୀ",
5418 "ଫେବୃଆରୀ",
5419 "ମାର୍ଚ୍ଚ୍",
5420 "ଅପ୍ରେଲ",
5421 "ମଇ",
5422 "ଜୁନ୍",
5423 "ଜୁଲାଇ",
5424 "ଅଗଷ୍ଟ",
5425 "ସେପ୍ଟେମ୍ବର",
5426 "ଅକ୍ଟୋବର୍",
5427 "ନଭେମ୍ବର୍",
5428 "ଡିସେମ୍ବର୍",
5429 ]
5430 month_abbreviations = [
5431 "",
5432 "ଜାନୁ",
5433 "ଫେବୃ",
5434 "ମାର୍ଚ୍ଚ୍",
5435 "ଅପ୍ରେ",
5436 "ମଇ",
5437 "ଜୁନ୍",
5438 "ଜୁଲା",
5439 "ଅଗ",
5440 "ସେପ୍ଟେ",
5441 "ଅକ୍ଟୋ",
5442 "ନଭେ",
5443 "ଡିସେ",
5444 ]
5446 day_names = [
5447 "",
5448 "ସୋମବାର",
5449 "ମଙ୍ଗଳବାର",
5450 "ବୁଧବାର",
5451 "ଗୁରୁବାର",
5452 "ଶୁକ୍ରବାର",
5453 "ଶନିବାର",
5454 "ରବିବାର",
5455 ]
5456 day_abbreviations = [
5457 "",
5458 "ସୋମ",
5459 "ମଙ୍ଗଳ",
5460 "ବୁଧ",
5461 "ଗୁରୁ",
5462 "ଶୁକ୍ର",
5463 "ଶନି",
5464 "ରବି",
5465 ]
5467 def _ordinal_number(self, n: int) -> str:
5468 if n > 10 or n == 0:
5469 return f"{n}ତମ"
5470 if n in [1, 5, 7, 8, 9, 10]:
5471 return f"{n}ମ"
5472 if n in [2, 3]:
5473 return f"{n}ୟ"
5474 if n == 4:
5475 return f"{n}ର୍ଥ"
5476 if n == 6:
5477 return f"{n}ଷ୍ଠ"
5478 return ""
5481class SerbianLocale(Locale):
5482 names = ["sr", "sr-rs", "sr-sp"]
5484 past = "pre {0}"
5485 future = "za {0}"
5486 and_word = "i"
5488 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
5489 "now": "sada",
5490 "second": "sekundu",
5491 "seconds": {"double": "{0} sekunde", "higher": "{0} sekundi"},
5492 "minute": "minutu",
5493 "minutes": {"double": "{0} minute", "higher": "{0} minuta"},
5494 "hour": "sat",
5495 "hours": {"double": "{0} sata", "higher": "{0} sati"},
5496 "day": "dan",
5497 "days": {"double": "{0} dana", "higher": "{0} dana"},
5498 "week": "nedelju",
5499 "weeks": {"double": "{0} nedelje", "higher": "{0} nedelja"},
5500 "month": "mesec",
5501 "months": {"double": "{0} meseca", "higher": "{0} meseci"},
5502 "year": "godinu",
5503 "years": {"double": "{0} godine", "higher": "{0} godina"},
5504 }
5506 month_names = [
5507 "",
5508 "januar", # јануар
5509 "februar", # фебруар
5510 "mart", # март
5511 "april", # април
5512 "maj", # мај
5513 "jun", # јун
5514 "jul", # јул
5515 "avgust", # август
5516 "septembar", # септембар
5517 "oktobar", # октобар
5518 "novembar", # новембар
5519 "decembar", # децембар
5520 ]
5522 month_abbreviations = [
5523 "",
5524 "jan",
5525 "feb",
5526 "mar",
5527 "apr",
5528 "maj",
5529 "jun",
5530 "jul",
5531 "avg",
5532 "sep",
5533 "okt",
5534 "nov",
5535 "dec",
5536 ]
5538 day_names = [
5539 "",
5540 "ponedeljak", # понедељак
5541 "utorak", # уторак
5542 "sreda", # среда
5543 "četvrtak", # четвртак
5544 "petak", # петак
5545 "subota", # субота
5546 "nedelja", # недеља
5547 ]
5549 day_abbreviations = [
5550 "",
5551 "po", # по
5552 "ut", # ут
5553 "sr", # ср
5554 "če", # че
5555 "pe", # пе
5556 "su", # су
5557 "ne", # не
5558 ]
5560 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
5561 form = self.timeframes[timeframe]
5562 delta = abs(delta)
5563 if isinstance(form, Mapping):
5564 if 1 < delta <= 4:
5565 form = form["double"]
5566 else:
5567 form = form["higher"]
5569 return form.format(delta)
5572class LuxembourgishLocale(Locale):
5573 names = ["lb", "lb-lu"]
5575 past = "virun {0}"
5576 future = "an {0}"
5577 and_word = "an"
5579 timeframes: ClassVar[Dict[TimeFrameLiteral, str]] = {
5580 "now": "just elo",
5581 "second": "enger Sekonn",
5582 "seconds": "{0} Sekonnen",
5583 "minute": "enger Minutt",
5584 "minutes": "{0} Minutten",
5585 "hour": "enger Stonn",
5586 "hours": "{0} Stonnen",
5587 "day": "engem Dag",
5588 "days": "{0} Deeg",
5589 "week": "enger Woch",
5590 "weeks": "{0} Wochen",
5591 "month": "engem Mount",
5592 "months": "{0} Méint",
5593 "year": "engem Joer",
5594 "years": "{0} Jahren",
5595 }
5597 timeframes_only_distance = timeframes.copy()
5598 timeframes_only_distance["second"] = "eng Sekonn"
5599 timeframes_only_distance["minute"] = "eng Minutt"
5600 timeframes_only_distance["hour"] = "eng Stonn"
5601 timeframes_only_distance["day"] = "een Dag"
5602 timeframes_only_distance["days"] = "{0} Deeg"
5603 timeframes_only_distance["week"] = "eng Woch"
5604 timeframes_only_distance["month"] = "ee Mount"
5605 timeframes_only_distance["months"] = "{0} Méint"
5606 timeframes_only_distance["year"] = "ee Joer"
5607 timeframes_only_distance["years"] = "{0} Joer"
5609 month_names = [
5610 "",
5611 "Januar",
5612 "Februar",
5613 "Mäerz",
5614 "Abrëll",
5615 "Mee",
5616 "Juni",
5617 "Juli",
5618 "August",
5619 "September",
5620 "Oktouber",
5621 "November",
5622 "Dezember",
5623 ]
5625 month_abbreviations = [
5626 "",
5627 "Jan",
5628 "Feb",
5629 "Mäe",
5630 "Abr",
5631 "Mee",
5632 "Jun",
5633 "Jul",
5634 "Aug",
5635 "Sep",
5636 "Okt",
5637 "Nov",
5638 "Dez",
5639 ]
5641 day_names = [
5642 "",
5643 "Méindeg",
5644 "Dënschdeg",
5645 "Mëttwoch",
5646 "Donneschdeg",
5647 "Freideg",
5648 "Samschdeg",
5649 "Sonndeg",
5650 ]
5652 day_abbreviations = ["", "Méi", "Dën", "Mët", "Don", "Fre", "Sam", "Son"]
5654 def _ordinal_number(self, n: int) -> str:
5655 return f"{n}."
5657 def describe(
5658 self,
5659 timeframe: TimeFrameLiteral,
5660 delta: Union[int, float] = 0,
5661 only_distance: bool = False,
5662 ) -> str:
5663 if not only_distance:
5664 return super().describe(timeframe, delta, only_distance)
5666 # Luxembourgish uses a different case without 'in' or 'ago'
5667 humanized: str = self.timeframes_only_distance[timeframe].format(
5668 trunc(abs(delta))
5669 )
5671 return humanized
5674class ZuluLocale(Locale):
5675 names = ["zu", "zu-za"]
5677 past = "{0} edlule"
5678 future = "{0} "
5679 and_word = "futhi"
5681 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[Mapping[str, str], str]]] = {
5682 "now": "manje",
5683 "second": {"past": "umzuzwana", "future": "ngomzuzwana"},
5684 "seconds": {"past": "{0} imizuzwana", "future": "{0} ngemizuzwana"},
5685 "minute": {"past": "umzuzu", "future": "ngomzuzu"},
5686 "minutes": {"past": "{0} imizuzu", "future": "{0} ngemizuzu"},
5687 "hour": {"past": "ihora", "future": "ngehora"},
5688 "hours": {"past": "{0} amahora", "future": "{0} emahoreni"},
5689 "day": {"past": "usuku", "future": "ngosuku"},
5690 "days": {"past": "{0} izinsuku", "future": "{0} ezinsukwini"},
5691 "week": {"past": "isonto", "future": "ngesonto"},
5692 "weeks": {"past": "{0} amasonto", "future": "{0} emasontweni"},
5693 "month": {"past": "inyanga", "future": "ngenyanga"},
5694 "months": {"past": "{0} izinyanga", "future": "{0} ezinyangeni"},
5695 "year": {"past": "unyaka", "future": "ngonyak"},
5696 "years": {"past": "{0} iminyaka", "future": "{0} eminyakeni"},
5697 }
5699 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
5700 """Zulu aware time frame format function, takes into account
5701 the differences between past and future forms."""
5702 abs_delta = abs(delta)
5703 form = self.timeframes[timeframe]
5705 if isinstance(form, str):
5706 return form.format(abs_delta)
5708 if delta > 0:
5709 key = "future"
5710 else:
5711 key = "past"
5712 form = form[key]
5714 return form.format(abs_delta)
5716 month_names = [
5717 "",
5718 "uMasingane",
5719 "uNhlolanja",
5720 "uNdasa",
5721 "UMbasa",
5722 "UNhlaba",
5723 "UNhlangulana",
5724 "uNtulikazi",
5725 "UNcwaba",
5726 "uMandulo",
5727 "uMfumfu",
5728 "uLwezi",
5729 "uZibandlela",
5730 ]
5732 month_abbreviations = [
5733 "",
5734 "uMasingane",
5735 "uNhlolanja",
5736 "uNdasa",
5737 "UMbasa",
5738 "UNhlaba",
5739 "UNhlangulana",
5740 "uNtulikazi",
5741 "UNcwaba",
5742 "uMandulo",
5743 "uMfumfu",
5744 "uLwezi",
5745 "uZibandlela",
5746 ]
5748 day_names = [
5749 "",
5750 "uMsombuluko",
5751 "uLwesibili",
5752 "uLwesithathu",
5753 "uLwesine",
5754 "uLwesihlanu",
5755 "uMgqibelo",
5756 "iSonto",
5757 ]
5759 day_abbreviations = [
5760 "",
5761 "uMsombuluko",
5762 "uLwesibili",
5763 "uLwesithathu",
5764 "uLwesine",
5765 "uLwesihlanu",
5766 "uMgqibelo",
5767 "iSonto",
5768 ]
5771class TamilLocale(Locale):
5772 names = ["ta", "ta-in", "ta-lk"]
5774 past = "{0} நேரத்திற்கு முன்பு"
5775 future = "இல் {0}"
5777 timeframes = {
5778 "now": "இப்போது",
5779 "second": "ஒரு இரண்டாவது",
5780 "seconds": "{0} விநாடிகள்",
5781 "minute": "ஒரு நிமிடம்",
5782 "minutes": "{0} நிமிடங்கள்",
5783 "hour": "ஒரு மணி",
5784 "hours": "{0} மணிநேரம்",
5785 "day": "ஒரு நாள்",
5786 "days": "{0} நாட்கள்",
5787 "week": "ஒரு வாரம்",
5788 "weeks": "{0} வாரங்கள்",
5789 "month": "ஒரு மாதம்",
5790 "months": "{0} மாதங்கள்",
5791 "year": "ஒரு ஆண்டு",
5792 "years": "{0} ஆண்டுகள்",
5793 }
5795 month_names = [
5796 "",
5797 "சித்திரை",
5798 "வைகாசி",
5799 "ஆனி",
5800 "ஆடி",
5801 "ஆவணி",
5802 "புரட்டாசி",
5803 "ஐப்பசி",
5804 "கார்த்திகை",
5805 "மார்கழி",
5806 "தை",
5807 "மாசி",
5808 "பங்குனி",
5809 ]
5811 month_abbreviations = [
5812 "",
5813 "ஜன",
5814 "பிப்",
5815 "மார்",
5816 "ஏப்",
5817 "மே",
5818 "ஜூன்",
5819 "ஜூலை",
5820 "ஆக",
5821 "செப்",
5822 "அக்",
5823 "நவ",
5824 "டிச",
5825 ]
5827 day_names = [
5828 "",
5829 "திங்கட்கிழமை",
5830 "செவ்வாய்க்கிழமை",
5831 "புதன்கிழமை",
5832 "வியாழக்கிழமை",
5833 "வெள்ளிக்கிழமை",
5834 "சனிக்கிழமை",
5835 "ஞாயிற்றுக்கிழமை",
5836 ]
5838 day_abbreviations = [
5839 "",
5840 "திங்கட்",
5841 "செவ்வாய்",
5842 "புதன்",
5843 "வியாழன்",
5844 "வெள்ளி",
5845 "சனி",
5846 "ஞாயிறு",
5847 ]
5849 def _ordinal_number(self, n: int) -> str:
5850 if n == 1:
5851 return f"{n}வது"
5852 elif n >= 0:
5853 return f"{n}ஆம்"
5854 else:
5855 return ""
5858class AlbanianLocale(Locale):
5859 names = ["sq", "sq-al"]
5861 past = "{0} më parë"
5862 future = "në {0}"
5863 and_word = "dhe"
5865 timeframes = {
5866 "now": "tani",
5867 "second": "sekondë",
5868 "seconds": "{0} sekonda",
5869 "minute": "minutë",
5870 "minutes": "{0} minuta",
5871 "hour": "orë",
5872 "hours": "{0} orë",
5873 "day": "ditë",
5874 "days": "{0} ditë",
5875 "week": "javë",
5876 "weeks": "{0} javë",
5877 "month": "muaj",
5878 "months": "{0} muaj",
5879 "year": "vit",
5880 "years": "{0} vjet",
5881 }
5883 month_names = [
5884 "",
5885 "janar",
5886 "shkurt",
5887 "mars",
5888 "prill",
5889 "maj",
5890 "qershor",
5891 "korrik",
5892 "gusht",
5893 "shtator",
5894 "tetor",
5895 "nëntor",
5896 "dhjetor",
5897 ]
5899 month_abbreviations = [
5900 "",
5901 "jan",
5902 "shk",
5903 "mar",
5904 "pri",
5905 "maj",
5906 "qer",
5907 "korr",
5908 "gush",
5909 "sht",
5910 "tet",
5911 "nën",
5912 "dhj",
5913 ]
5915 day_names = [
5916 "",
5917 "e hënë",
5918 "e martë",
5919 "e mërkurë",
5920 "e enjte",
5921 "e premte",
5922 "e shtunë",
5923 "e diel",
5924 ]
5926 day_abbreviations = [
5927 "",
5928 "hën",
5929 "mar",
5930 "mër",
5931 "enj",
5932 "pre",
5933 "sht",
5934 "die",
5935 ]
5938class GeorgianLocale(Locale):
5939 names = ["ka", "ka-ge"]
5941 past = "{0} წინ" # ts’in
5942 future = "{0} შემდეგ" # shemdeg
5943 and_word = "და" # da
5945 timeframes = {
5946 "now": "ახლა", # akhla
5947 # When a cardinal qualifies a noun, it stands in the singular
5948 "second": "წამის", # ts’amis
5949 "seconds": "{0} წამის",
5950 "minute": "წუთის", # ts’utis
5951 "minutes": "{0} წუთის",
5952 "hour": "საათის", # saatis
5953 "hours": "{0} საათის",
5954 "day": "დღის", # dghis
5955 "days": "{0} დღის",
5956 "week": "კვირის", # k’viris
5957 "weeks": "{0} კვირის",
5958 "month": "თვის", # tvis
5959 "months": "{0} თვის",
5960 "year": "წლის", # ts’lis
5961 "years": "{0} წლის",
5962 }
5964 month_names = [
5965 # modern month names
5966 "",
5967 "იანვარი", # Ianvari
5968 "თებერვალი", # Tebervali
5969 "მარტი", # Mart'i
5970 "აპრილი", # Ap'rili
5971 "მაისი", # Maisi
5972 "ივნისი", # Ivnisi
5973 "ივლისი", # Ivlisi
5974 "აგვისტო", # Agvist'o
5975 "სექტემბერი", # Sekt'emberi
5976 "ოქტომბერი", # Okt'omberi
5977 "ნოემბერი", # Noemberi
5978 "დეკემბერი", # Dek'emberi
5979 ]
5981 month_abbreviations = [
5982 # no abbr. found yet
5983 "",
5984 "იანვარი", # Ianvari
5985 "თებერვალი", # Tebervali
5986 "მარტი", # Mart'i
5987 "აპრილი", # Ap'rili
5988 "მაისი", # Maisi
5989 "ივნისი", # Ivnisi
5990 "ივლისი", # Ivlisi
5991 "აგვისტო", # Agvist'o
5992 "სექტემბერი", # Sekt'emberi
5993 "ოქტომბერი", # Okt'omberi
5994 "ნოემბერი", # Noemberi
5995 "დეკემბერი", # Dek'emberi
5996 ]
5998 day_names = [
5999 "",
6000 "ორშაბათი", # orshabati
6001 "სამშაბათი", # samshabati
6002 "ოთხშაბათი", # otkhshabati
6003 "ხუთშაბათი", # khutshabati
6004 "პარასკევი", # p’arask’evi
6005 "შაბათი", # shabati
6006 # "k’vira" also serves as week; to avoid confusion "k’vira-dge" can be used for Sunday
6007 "კვირა", # k’vira
6008 ]
6010 day_abbreviations = [
6011 "",
6012 "ორშაბათი", # orshabati
6013 "სამშაბათი", # samshabati
6014 "ოთხშაბათი", # otkhshabati
6015 "ხუთშაბათი", # khutshabati
6016 "პარასკევი", # p’arask’evi
6017 "შაბათი", # shabati
6018 "კვირა", # k’vira
6019 ]
6022class SinhalaLocale(Locale):
6023 names = ["si", "si-lk"]
6025 past = "{0}ට පෙර"
6026 future = "{0}"
6027 and_word = "සහ"
6029 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[Mapping[str, str], str]]] = {
6030 "now": "දැන්",
6031 "second": {
6032 "past": "තත්පරයක",
6033 "future": "තත්පරයකින්",
6034 }, # ක් is the article
6035 "seconds": {
6036 "past": "තත්පර {0} ක",
6037 "future": "තත්පර {0} කින්",
6038 },
6039 "minute": {
6040 "past": "විනාඩියක",
6041 "future": "විනාඩියකින්",
6042 },
6043 "minutes": {
6044 "past": "විනාඩි {0} ක",
6045 "future": "මිනිත්තු {0} කින්",
6046 },
6047 "hour": {"past": "පැයක", "future": "පැයකින්"},
6048 "hours": {
6049 "past": "පැය {0} ක",
6050 "future": "පැය {0} කින්",
6051 },
6052 "day": {"past": "දිනක", "future": "දිනකට"},
6053 "days": {
6054 "past": "දින {0} ක",
6055 "future": "දින {0} කින්",
6056 },
6057 "week": {"past": "සතියක", "future": "සතියකින්"},
6058 "weeks": {
6059 "past": "සති {0} ක",
6060 "future": "සති {0} කින්",
6061 },
6062 "month": {"past": "මාසයක", "future": "එය මාසය තුළ"},
6063 "months": {
6064 "past": "මාස {0} ක",
6065 "future": "මාස {0} කින්",
6066 },
6067 "year": {"past": "වසරක", "future": "වසරක් තුළ"},
6068 "years": {
6069 "past": "අවුරුදු {0} ක",
6070 "future": "අවුරුදු {0} තුළ",
6071 },
6072 }
6073 # Sinhala: the general format to describe timeframe is different from past and future,
6074 # so we do not copy the original timeframes dictionary
6075 timeframes_only_distance = {}
6076 timeframes_only_distance["second"] = "තත්පරයක්"
6077 timeframes_only_distance["seconds"] = "තත්පර {0}"
6078 timeframes_only_distance["minute"] = "මිනිත්තුවක්"
6079 timeframes_only_distance["minutes"] = "විනාඩි {0}"
6080 timeframes_only_distance["hour"] = "පැයක්"
6081 timeframes_only_distance["hours"] = "පැය {0}"
6082 timeframes_only_distance["day"] = "දවසක්"
6083 timeframes_only_distance["days"] = "දවස් {0}"
6084 timeframes_only_distance["week"] = "සතියක්"
6085 timeframes_only_distance["weeks"] = "සති {0}"
6086 timeframes_only_distance["month"] = "මාසයක්"
6087 timeframes_only_distance["months"] = "මාස {0}"
6088 timeframes_only_distance["year"] = "අවුරුද්දක්"
6089 timeframes_only_distance["years"] = "අවුරුදු {0}"
6091 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
6092 """
6093 Sinhala awares time frame format function, takes into account
6094 the differences between general, past, and future forms (three different suffixes).
6095 """
6096 abs_delta = abs(delta)
6097 form = self.timeframes[timeframe]
6099 if isinstance(form, str):
6100 return form.format(abs_delta)
6102 if delta > 0:
6103 key = "future"
6104 else:
6105 key = "past"
6106 form = form[key]
6108 return form.format(abs_delta)
6110 def describe(
6111 self,
6112 timeframe: TimeFrameLiteral,
6113 delta: Union[float, int] = 1, # key is always future when only_distance=False
6114 only_distance: bool = False,
6115 ) -> str:
6116 """Describes a delta within a timeframe in plain language.
6118 :param timeframe: a string representing a timeframe.
6119 :param delta: a quantity representing a delta in a timeframe.
6120 :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords
6121 """
6123 if not only_distance:
6124 return super().describe(timeframe, delta, only_distance)
6125 # Sinhala uses a different case without 'in' or 'ago'
6126 humanized = self.timeframes_only_distance[timeframe].format(trunc(abs(delta)))
6128 return humanized
6130 month_names = [
6131 "",
6132 "ජනවාරි",
6133 "පෙබරවාරි",
6134 "මාර්තු",
6135 "අප්රේල්",
6136 "මැයි",
6137 "ජූනි",
6138 "ජූලි",
6139 "අගෝස්තු",
6140 "සැප්තැම්බර්",
6141 "ඔක්තෝබර්",
6142 "නොවැම්බර්",
6143 "දෙසැම්බර්",
6144 ]
6146 month_abbreviations = [
6147 "",
6148 "ජන",
6149 "පෙබ",
6150 "මාර්",
6151 "අප්රේ",
6152 "මැයි",
6153 "ජුනි",
6154 "ජූලි",
6155 "අගෝ",
6156 "සැප්",
6157 "ඔක්",
6158 "නොවැ",
6159 "දෙසැ",
6160 ]
6162 day_names = [
6163 "",
6164 "සදුදා",
6165 "අඟහරැවදා",
6166 "බදාදා",
6167 "බ්රහස්පතින්දා",
6168 "සිකුරාදා",
6169 "සෙනසුරාදා",
6170 "ඉරිදා",
6171 ]
6173 day_abbreviations = [
6174 "",
6175 "සදුද",
6176 "බදා",
6177 "බදා",
6178 "සිකු",
6179 "සෙන",
6180 "අ",
6181 "ඉරිදා",
6182 ]
6185class UrduLocale(Locale):
6186 names = ["ur", "ur-pk"]
6188 past = "پہلے {0}"
6189 future = "میں {0}"
6190 and_word = "اور"
6192 timeframes = {
6193 "now": "ابھی",
6194 "second": "ایک سیکنڈ",
6195 "seconds": "{0} سیکنڈ",
6196 "minute": "ایک منٹ",
6197 "minutes": "{0} منٹ",
6198 "hour": "ایک گھنٹے",
6199 "hours": "{0} گھنٹے",
6200 "day": "ایک دن",
6201 "days": "{0} دن",
6202 "week": "ایک ہفتے",
6203 "weeks": "{0} ہفتے",
6204 "month": "ایک مہینہ",
6205 "months": "{0} ماہ",
6206 "year": "ایک سال",
6207 "years": "{0} سال",
6208 }
6210 month_names = [
6211 "",
6212 "جنوری",
6213 "فروری",
6214 "مارچ",
6215 "اپریل",
6216 "مئی",
6217 "جون",
6218 "جولائی",
6219 "اگست",
6220 "ستمبر",
6221 "اکتوبر",
6222 "نومبر",
6223 "دسمبر",
6224 ]
6226 month_abbreviations = [
6227 "",
6228 "جنوری",
6229 "فروری",
6230 "مارچ",
6231 "اپریل",
6232 "مئی",
6233 "جون",
6234 "جولائی",
6235 "اگست",
6236 "ستمبر",
6237 "اکتوبر",
6238 "نومبر",
6239 "دسمبر",
6240 ]
6242 day_names = [
6243 "",
6244 "سوموار",
6245 "منگل",
6246 "بدھ",
6247 "جمعرات",
6248 "جمعہ",
6249 "ہفتہ",
6250 "اتوار",
6251 ]
6253 day_abbreviations = [
6254 "",
6255 "سوموار",
6256 "منگل",
6257 "بدھ",
6258 "جمعرات",
6259 "جمعہ",
6260 "ہفتہ",
6261 "اتوار",
6262 ]
6265class KazakhLocale(Locale):
6266 names = ["kk", "kk-kz"]
6268 past = "{0} бұрын"
6269 future = "{0} кейін"
6270 timeframes = {
6271 "now": "қазір",
6272 "second": "бір секунд",
6273 "seconds": "{0} секунд",
6274 "minute": "бір минут",
6275 "minutes": "{0} минут",
6276 "hour": "бір сағат",
6277 "hours": "{0} сағат",
6278 "day": "бір күн",
6279 "days": "{0} күн",
6280 "week": "бір апта",
6281 "weeks": "{0} апта",
6282 "month": "бір ай",
6283 "months": "{0} ай",
6284 "year": "бір жыл",
6285 "years": "{0} жыл",
6286 }
6288 month_names = [
6289 "",
6290 "Қаңтар",
6291 "Ақпан",
6292 "Наурыз",
6293 "Сәуір",
6294 "Мамыр",
6295 "Маусым",
6296 "Шілде",
6297 "Тамыз",
6298 "Қыркүйек",
6299 "Қазан",
6300 "Қараша",
6301 "Желтоқсан",
6302 ]
6303 month_abbreviations = [
6304 "",
6305 "Қан",
6306 "Ақп",
6307 "Нау",
6308 "Сәу",
6309 "Мам",
6310 "Мау",
6311 "Шіл",
6312 "Там",
6313 "Қыр",
6314 "Қаз",
6315 "Қар",
6316 "Жел",
6317 ]
6319 day_names = [
6320 "",
6321 "Дүйсембі",
6322 "Сейсенбі",
6323 "Сәрсенбі",
6324 "Бейсенбі",
6325 "Жұма",
6326 "Сенбі",
6327 "Жексенбі",
6328 ]
6329 day_abbreviations = ["", "Дс", "Сс", "Ср", "Бс", "Жм", "Сб", "Жс"]
6332class AmharicLocale(Locale):
6333 names = ["am", "am-et"]
6335 past = "{0} በፊት"
6336 future = "{0} ውስጥ"
6337 and_word = "እና"
6339 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[Mapping[str, str], str]]] = {
6340 "now": "አሁን",
6341 "second": {
6342 "past": "ከአንድ ሰከንድ",
6343 "future": "በአንድ ሰከንድ",
6344 },
6345 "seconds": {
6346 "past": "ከ {0} ሰከንድ",
6347 "future": "በ {0} ሰከንድ",
6348 },
6349 "minute": {
6350 "past": "ከአንድ ደቂቃ",
6351 "future": "በአንድ ደቂቃ",
6352 },
6353 "minutes": {
6354 "past": "ከ {0} ደቂቃዎች",
6355 "future": "በ {0} ደቂቃዎች",
6356 },
6357 "hour": {
6358 "past": "ከአንድ ሰዓት",
6359 "future": "በአንድ ሰዓት",
6360 },
6361 "hours": {
6362 "past": "ከ {0} ሰዓታት",
6363 "future": "በ {0} ሰከንድ",
6364 },
6365 "day": {
6366 "past": "ከአንድ ቀን",
6367 "future": "በአንድ ቀን",
6368 },
6369 "days": {
6370 "past": "ከ {0} ቀናት",
6371 "future": "በ {0} ቀናት",
6372 },
6373 "week": {
6374 "past": "ከአንድ ሳምንት",
6375 "future": "በአንድ ሳምንት",
6376 },
6377 "weeks": {
6378 "past": "ከ {0} ሳምንታት",
6379 "future": "በ {0} ሳምንታት",
6380 },
6381 "month": {
6382 "past": "ከአንድ ወር",
6383 "future": "በአንድ ወር",
6384 },
6385 "months": {
6386 "past": "ከ {0} ወር",
6387 "future": "በ {0} ወራት",
6388 },
6389 "year": {
6390 "past": "ከአንድ አመት",
6391 "future": "በአንድ አመት",
6392 },
6393 "years": {
6394 "past": "ከ {0} ዓመታት",
6395 "future": "በ {0} ዓመታት",
6396 },
6397 }
6398 # Amharic: the general format to describe timeframe is different from past and future,
6399 # so we do not copy the original timeframes dictionary
6400 timeframes_only_distance = {
6401 "second": "አንድ ሰከንድ",
6402 "seconds": "{0} ሰከንድ",
6403 "minute": "አንድ ደቂቃ",
6404 "minutes": "{0} ደቂቃዎች",
6405 "hour": "አንድ ሰዓት",
6406 "hours": "{0} ሰዓት",
6407 "day": "አንድ ቀን",
6408 "days": "{0} ቀናት",
6409 "week": "አንድ ሳምንት",
6410 "weeks": "{0} ሳምንት",
6411 "month": "አንድ ወር",
6412 "months": "{0} ወራት",
6413 "year": "አንድ አመት",
6414 "years": "{0} ዓመታት",
6415 }
6417 month_names = [
6418 "",
6419 "ጃንዩወሪ",
6420 "ፌብሩወሪ",
6421 "ማርች",
6422 "ኤፕሪል",
6423 "ሜይ",
6424 "ጁን",
6425 "ጁላይ",
6426 "ኦገስት",
6427 "ሴፕቴምበር",
6428 "ኦክቶበር",
6429 "ኖቬምበር",
6430 "ዲሴምበር",
6431 ]
6433 month_abbreviations = [
6434 "",
6435 "ጃንዩ",
6436 "ፌብሩ",
6437 "ማርች",
6438 "ኤፕሪ",
6439 "ሜይ",
6440 "ጁን",
6441 "ጁላይ",
6442 "ኦገስ",
6443 "ሴፕቴ",
6444 "ኦክቶ",
6445 "ኖቬም",
6446 "ዲሴም",
6447 ]
6449 day_names = [
6450 "",
6451 "ሰኞ",
6452 "ማክሰኞ",
6453 "ረቡዕ",
6454 "ሐሙስ",
6455 "ዓርብ",
6456 "ቅዳሜ",
6457 "እሑድ",
6458 ]
6459 day_abbreviations = ["", "እ", "ሰ", "ማ", "ረ", "ሐ", "ዓ", "ቅ"]
6461 def _ordinal_number(self, n: int) -> str:
6462 return f"{n}ኛ"
6464 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
6465 """
6466 Amharic awares time frame format function, takes into account
6467 the differences between general, past, and future forms (three different suffixes).
6468 """
6469 abs_delta = abs(delta)
6470 form = self.timeframes[timeframe]
6472 if isinstance(form, str):
6473 return form.format(abs_delta)
6475 if delta > 0:
6476 key = "future"
6477 else:
6478 key = "past"
6479 form = form[key]
6481 return form.format(abs_delta)
6483 def describe(
6484 self,
6485 timeframe: TimeFrameLiteral,
6486 delta: Union[float, int] = 1, # key is always future when only_distance=False
6487 only_distance: bool = False,
6488 ) -> str:
6489 """Describes a delta within a timeframe in plain language.
6491 :param timeframe: a string representing a timeframe.
6492 :param delta: a quantity representing a delta in a timeframe.
6493 :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords
6494 """
6496 if not only_distance:
6497 return super().describe(timeframe, delta, only_distance)
6498 humanized = self.timeframes_only_distance[timeframe].format(trunc(abs(delta)))
6500 return humanized
6503class ArmenianLocale(Locale):
6504 names = ["hy", "hy-am"]
6505 past = "{0} առաջ"
6506 future = "{0}ից"
6507 and_word = "Եվ" # Yev
6509 timeframes = {
6510 "now": "հիմա",
6511 "second": "վայրկյան",
6512 "seconds": "{0} վայրկյան",
6513 "minute": "րոպե",
6514 "minutes": "{0} րոպե",
6515 "hour": "ժամ",
6516 "hours": "{0} ժամ",
6517 "day": "օր",
6518 "days": "{0} օր",
6519 "month": "ամիս",
6520 "months": "{0} ամիս",
6521 "year": "տարին",
6522 "years": "{0} տարին",
6523 "week": "շաբաթ",
6524 "weeks": "{0} շաբաթ",
6525 }
6527 meridians = {
6528 "am": "Ամ",
6529 "pm": "պ.մ.",
6530 "AM": "Ամ",
6531 "PM": "պ.մ.",
6532 }
6534 month_names = [
6535 "",
6536 "հունվար",
6537 "փետրվար",
6538 "մարտ",
6539 "ապրիլ",
6540 "մայիս",
6541 "հունիս",
6542 "հուլիս",
6543 "օգոստոս",
6544 "սեպտեմբեր",
6545 "հոկտեմբեր",
6546 "նոյեմբեր",
6547 "դեկտեմբեր",
6548 ]
6550 month_abbreviations = [
6551 "",
6552 "հունվար",
6553 "փետրվար",
6554 "մարտ",
6555 "ապրիլ",
6556 "մայիս",
6557 "հունիս",
6558 "հուլիս",
6559 "օգոստոս",
6560 "սեպտեմբեր",
6561 "հոկտեմբեր",
6562 "նոյեմբեր",
6563 "դեկտեմբեր",
6564 ]
6566 day_names = [
6567 "",
6568 "երկուշաբթի",
6569 "երեքշաբթի",
6570 "չորեքշաբթի",
6571 "հինգշաբթի",
6572 "ուրբաթ",
6573 "շաբաթ",
6574 "կիրակի",
6575 ]
6577 day_abbreviations = [
6578 "",
6579 "երկ.",
6580 "երեք.",
6581 "չորեք.",
6582 "հինգ.",
6583 "ուրբ.",
6584 "շաբ.",
6585 "կիր.",
6586 ]
6589class UzbekLocale(Locale):
6590 names = ["uz", "uz-uz"]
6591 past = "{0}dan avval"
6592 future = "{0}dan keyin"
6593 timeframes = {
6594 "now": "hozir",
6595 "second": "bir soniya",
6596 "seconds": "{0} soniya",
6597 "minute": "bir daqiqa",
6598 "minutes": "{0} daqiqa",
6599 "hour": "bir soat",
6600 "hours": "{0} soat",
6601 "day": "bir kun",
6602 "days": "{0} kun",
6603 "week": "bir hafta",
6604 "weeks": "{0} hafta",
6605 "month": "bir oy",
6606 "months": "{0} oy",
6607 "year": "bir yil",
6608 "years": "{0} yil",
6609 }
6611 month_names = [
6612 "",
6613 "Yanvar",
6614 "Fevral",
6615 "Mart",
6616 "Aprel",
6617 "May",
6618 "Iyun",
6619 "Iyul",
6620 "Avgust",
6621 "Sentyabr",
6622 "Oktyabr",
6623 "Noyabr",
6624 "Dekabr",
6625 ]
6627 month_abbreviations = [
6628 "",
6629 "Yan",
6630 "Fev",
6631 "Mar",
6632 "Apr",
6633 "May",
6634 "Iyn",
6635 "Iyl",
6636 "Avg",
6637 "Sen",
6638 "Okt",
6639 "Noy",
6640 "Dek",
6641 ]
6643 day_names = [
6644 "",
6645 "Dushanba",
6646 "Seshanba",
6647 "Chorshanba",
6648 "Payshanba",
6649 "Juma",
6650 "Shanba",
6651 "Yakshanba",
6652 ]
6654 day_abbreviations = ["", "Dush", "Sesh", "Chor", "Pay", "Jum", "Shan", "Yak"]