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