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