Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Firefox/third_party/python/arrow/arrow/   (Browser von der Mozilla Stiftung Version 136.0.1©)  Datei vom 10.2.2025 mit Größe 153 kB image not shown  

Quelle  locales.py

  Sprache: Python
 

"""Provides internationalization for arrow in over 60 languages and dialects."""

import sys
from math import trunc
from typing import (
    Any,
    ClassVar,
    Dict,
    List,
    Mapping,
    Optional,
    Sequence,
    Tuple,
    Type,
    Union,
    cast,
)

if sys.version_info < (38):  # pragma: no cover
    from typing_extensions import Literal
else:
    from typing import Literal  # pragma: no cover

TimeFrameLiteral = Literal[
    "now",
    "second",
    "seconds",
    "minute",
    "minutes",
    "hour",
    "hours",
    "day",
    "days",
    "week",
    "weeks",
    "month",
    "months",
    "quarter",
    "quarters",
    "year",
    "years",
]

_TimeFrameElements = Union[
    str, Sequence[str], Mapping[str, str], Mapping[str, Sequence[str]]
]

_locale_map: Dict[str, Type["Locale"]] = {}


def get_locale(name: str) -> "Locale":
    """Returns an appropriate :class:`Locale <arrow.locales.Locale>`
    corresponding to an input locale name.

    :param name: the name of the locale.

    """

    normalized_locale_name = name.lower().replace("_""-")
    locale_cls = _locale_map.get(normalized_locale_name)

    if locale_cls is None:
        raise ValueError(f"Unsupported locale {normalized_locale_name!r}.")

    return locale_cls()


def get_locale_by_class_name(name: str) -> "Locale":
    """Returns an appropriate :class:`Locale <arrow.locales.Locale>`
    corresponding to an locale class name.

    :param name: the name of the locale class.

    """
    locale_cls: Optional[Type[Locale]] = globals().get(name)

    if locale_cls is None:
        raise ValueError(f"Unsupported locale {name!r}.")

    return locale_cls()


class Locale:
    """Represents locale-specific data and functionality."""

    names: ClassVar[List[str]] = []

    timeframes: ClassVar[Mapping[TimeFrameLiteral, _TimeFrameElements]] = {
        "now""",
        "second""",
        "seconds""",
        "minute""",
        "minutes""",
        "hour""",
        "hours""",
        "day""",
        "days""",
        "week""",
        "weeks""",
        "month""",
        "months""",
        "quarter""",
        "quarters""",
        "year""",
        "years""",
    }

    meridians: ClassVar[Dict[str, str]] = {"am""""pm""""AM""""PM"""}

    past: ClassVar[str]
    future: ClassVar[str]
    and_word: ClassVar[Optional[str]] = None

    month_names: ClassVar[List[str]] = []
    month_abbreviations: ClassVar[List[str]] = []

    day_names: ClassVar[List[str]] = []
    day_abbreviations: ClassVar[List[str]] = []

    ordinal_day_re: ClassVar[str] = r"(\d+)"

    _month_name_to_ordinal: Optional[Dict[str, int]]

    def __init_subclass__(cls, **kwargs: Any) -> None:
        for locale_name in cls.names:
            if locale_name in _locale_map:
                raise LookupError(f"Duplicated locale name: {locale_name}")

            _locale_map[locale_name.lower().replace("_""-")] = cls

    def __init__(self) -> None:
        self._month_name_to_ordinal = None

    def describe(
        self,
        timeframe: TimeFrameLiteral,
        delta: Union[float, int] = 0,
        only_distance: bool = False,
    ) -> str:
        """Describes a delta within a timeframe in plain language.

        :param timeframe: a string representing a timeframe.
        :param delta: a quantity representing a delta in a timeframe.
        :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords
        """

        humanized = self._format_timeframe(timeframe, trunc(delta))
        if not only_distance:
            humanized = self._format_relative(humanized, timeframe, delta)

        return humanized

    def describe_multi(
        self,
        timeframes: Sequence[Tuple[TimeFrameLiteral, Union[int, float]]],
        only_distance: bool = False,
    ) -> str:
        """Describes a delta within multiple timeframes in plain language.

        :param timeframes: a list of string, quantity pairs each representing a timeframe and delta.
        :param only_distance: return only distance eg: "2 hours and 11 seconds" without "in" or "ago" keywords
        """

        parts = [
            self._format_timeframe(timeframe, trunc(delta))
            for timeframe, delta in timeframes
        ]
        if self.and_word:
            parts.insert(-1, self.and_word)
        humanized = " ".join(parts)

        if not only_distance:
            # Needed to determine the correct relative string to use
            timeframe_value = 0

            for _, unit_value in timeframes:
                if trunc(unit_value) != 0:
                    timeframe_value = trunc(unit_value)
                    break

            # Note it doesn't matter the timeframe unit we use on the call, only the value
            humanized = self._format_relative(humanized, "seconds", timeframe_value)

        return humanized

    def day_name(self, day: int) -> str:
        """Returns the day name for a specified day of the week.

        :param day: the ``int`` day of the week (1-7).

        """

        return self.day_names[day]

    def day_abbreviation(self, day: int) -> str:
        """Returns the day abbreviation for a specified day of the week.

        :param day: the ``int`` day of the week (1-7).

        """

        return self.day_abbreviations[day]

    def month_name(self, month: int) -> str:
        """Returns the month name for a specified month of the year.

        :param month: the ``int`` month of the year (1-12).

        """

        return self.month_names[month]

    def month_abbreviation(self, month: int) -> str:
        """Returns the month abbreviation for a specified month of the year.

        :param month: the ``int`` month of the year (1-12).

        """

        return self.month_abbreviations[month]

    def month_number(self, name: str) -> Optional[int]:
        """Returns the month number for a month specified by name or abbreviation.

        :param name: the month name or abbreviation.

        """

        if self._month_name_to_ordinal is None:
            self._month_name_to_ordinal = self._name_to_ordinal(self.month_names)
            self._month_name_to_ordinal.update(
                self._name_to_ordinal(self.month_abbreviations)
            )

        return self._month_name_to_ordinal.get(name)

    def year_full(self, year: int) -> str:
        """Returns the year for specific locale if available

        :param year: the ``int`` year (4-digit)
        """
        return f"{year:04d}"

    def year_abbreviation(self, year: int) -> str:
        """Returns the year for specific locale if available

        :param year: the ``int`` year (4-digit)
        """
        return f"{year:04d}"[2:]

    def meridian(self, hour: int, token: Any) -> Optional[str]:
        """Returns the meridian indicator for a specified hour and format token.

        :param hour: the ``int`` hour of the day.
        :param token: the format token.
        """

        if token == "a":
            return self.meridians["am"if hour < 12 else self.meridians["pm"]
        if token == "A":
            return self.meridians["AM"if hour < 12 else self.meridians["PM"]
        return None

    def ordinal_number(self, n: int) -> str:
        """Returns the ordinal format of a given integer

        :param n: an integer
        """
        return self._ordinal_number(n)

    def _ordinal_number(self, n: int) -> str:
        return f"{n}"

    def _name_to_ordinal(self, lst: Sequence[str]) -> Dict[str, int]:
        return {elem.lower(): i for i, elem in enumerate(lst[1:], 1)}

    def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
        # TODO: remove cast
        return cast(str, self.timeframes[timeframe]).format(trunc(abs(delta)))

    def _format_relative(
        self,
        humanized: str,
        timeframe: TimeFrameLiteral,
        delta: Union[float, int],
    ) -> str:
        if timeframe == "now":
            return humanized

        direction = self.past if delta < 0 else self.future

        return direction.format(humanized)


class EnglishLocale(Locale):
    names = [
        "en",
        "en-us",
        "en-gb",
        "en-au",
        "en-be",
        "en-jp",
        "en-za",
        "en-ca",
        "en-ph",
    ]

    past = "{0} ago"
    future = "in {0}"
    and_word = "and"

    timeframes = {
        "now""just now",
        "second""a second",
        "seconds""{0} seconds",
        "minute""a minute",
        "minutes""{0} minutes",
        "hour""an hour",
        "hours""{0} hours",
        "day""a day",
        "days""{0} days",
        "week""a week",
        "weeks""{0} weeks",
        "month""a month",
        "months""{0} months",
        "quarter""a quarter",
        "quarters""{0} quarters",
        "year""a year",
        "years""{0} years",
    }

    meridians = {"am""am""pm""pm""AM""AM""PM""PM"}

    month_names = [
        "",
        "January",
        "February",
        "March",
        "April",
        "May",
        "June",
        "July",
        "August",
        "September",
        "October",
        "November",
        "December",
    ]
    month_abbreviations = [
        "",
        "Jan",
        "Feb",
        "Mar",
        "Apr",
        "May",
        "Jun",
        "Jul",
        "Aug",
        "Sep",
        "Oct",
        "Nov",
        "Dec",
    ]

    day_names = [
        "",
        "Monday",
        "Tuesday",
        "Wednesday",
        "Thursday",
        "Friday",
        "Saturday",
        "Sunday",
    ]
    day_abbreviations = ["""Mon""Tue""Wed""Thu""Fri""Sat""Sun"]

    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))"

    def _ordinal_number(self, n: int) -> str:
        if n % 100 not in (111213):
            remainder = abs(n) % 10
            if remainder == 1:
                return f"{n}st"
            elif remainder == 2:
                return f"{n}nd"
            elif remainder == 3:
                return f"{n}rd"
        return f"{n}th"

    def describe(
        self,
        timeframe: TimeFrameLiteral,
        delta: Union[int, float] = 0,
        only_distance: bool = False,
    ) -> str:
        """Describes a delta within a timeframe in plain language.

        :param timeframe: a string representing a timeframe.
        :param delta: a quantity representing a delta in a timeframe.
        :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords
        """

        humanized = super().describe(timeframe, delta, only_distance)
        if only_distance and timeframe == "now":
            humanized = "instantly"

        return humanized


class ItalianLocale(Locale):
    names = ["it""it-it"]
    past = "{0} fa"
    future = "tra {0}"
    and_word = "e"

    timeframes = {
        "now""adesso",
        "second""un secondo",
        "seconds""{0} qualche secondo",
        "minute""un minuto",
        "minutes""{0} minuti",
        "hour""un'ora",
        "hours""{0} ore",
        "day""un giorno",
        "days""{0} giorni",
        "week""una settimana",
        "weeks""{0} settimane",
        "month""un mese",
        "months""{0} mesi",
        "year""un anno",
        "years""{0} anni",
    }

    month_names = [
        "",
        "gennaio",
        "febbraio",
        "marzo",
        "aprile",
        "maggio",
        "giugno",
        "luglio",
        "agosto",
        "settembre",
        "ottobre",
        "novembre",
        "dicembre",
    ]
    month_abbreviations = [
        "",
        "gen",
        "feb",
        "mar",
        "apr",
        "mag",
        "giu",
        "lug",
        "ago",
        "set",
        "ott",
        "nov",
        "dic",
    ]

    day_names = [
        "",
        "lunedì",
        "martedì",
        "mercoledì",
        "giovedì",
        "venerdì",
        "sabato",
        "domenica",
    ]
    day_abbreviations = ["""lun""mar""mer""gio""ven""sab""dom"]

    ordinal_day_re = r"((?P<value>[1-3]?[0-9](?=[ºª]))[ºª])"

    def _ordinal_number(self, n: int) -> str:
        return f"{n}º"


class SpanishLocale(Locale):
    names = ["es""es-es"]
    past = "hace {0}"
    future = "en {0}"
    and_word = "y"

    timeframes = {
        "now""ahora",
        "second""un segundo",
        "seconds""{0} segundos",
        "minute""un minuto",
        "minutes""{0} minutos",
        "hour""una hora",
        "hours""{0} horas",
        "day""un día",
        "days""{0} días",
        "week""una semana",
        "weeks""{0} semanas",
        "month""un mes",
        "months""{0} meses",
        "year""un año",
        "years""{0} años",
    }

    meridians = {"am""am""pm""pm""AM""AM""PM""PM"}

    month_names = [
        "",
        "enero",
        "febrero",
        "marzo",
        "abril",
        "mayo",
        "junio",
        "julio",
        "agosto",
        "septiembre",
        "octubre",
        "noviembre",
        "diciembre",
    ]
    month_abbreviations = [
        "",
        "ene",
        "feb",
        "mar",
        "abr",
        "may",
        "jun",
        "jul",
        "ago",
        "sep",
        "oct",
        "nov",
        "dic",
    ]

    day_names = [
        "",
        "lunes",
        "martes",
        "miércoles",
        "jueves",
        "viernes",
        "sábado",
        "domingo",
    ]
    day_abbreviations = ["""lun""mar""mie""jue""vie""sab""dom"]

    ordinal_day_re = r"((?P<value>[1-3]?[0-9](?=[ºª]))[ºª])"

    def _ordinal_number(self, n: int) -> str:
        return f"{n}º"


class FrenchBaseLocale(Locale):
    past = "il y a {0}"
    future = "dans {0}"
    and_word = "et"

    timeframes = {
        "now""maintenant",
        "second""une seconde",
        "seconds""{0} secondes",
        "minute""une minute",
        "minutes""{0} minutes",
        "hour""une heure",
        "hours""{0} heures",
        "day""un jour",
        "days""{0} jours",
        "week""une semaine",
        "weeks""{0} semaines",
        "month""un mois",
        "months""{0} mois",
        "year""un an",
        "years""{0} ans",
    }

    month_names = [
        "",
        "janvier",
        "février",
        "mars",
        "avril",
        "mai",
        "juin",
        "juillet",
        "août",
        "septembre",
        "octobre",
        "novembre",
        "décembre",
    ]

    day_names = [
        "",
        "lundi",
        "mardi",
        "mercredi",
        "jeudi",
        "vendredi",
        "samedi",
        "dimanche",
    ]
    day_abbreviations = ["""lun""mar""mer""jeu""ven""sam""dim"]

    ordinal_day_re = (
        r"((?P<value>\b1(?=er\b)|[1-3]?[02-9](?=e\b)|[1-3]1(?=e\b))(er|e)\b)"
    )

    def _ordinal_number(self, n: int) -> str:
        if abs(n) == 1:
            return f"{n}er"
        return f"{n}e"


class FrenchLocale(FrenchBaseLocale, Locale):
    names = ["fr""fr-fr"]

    month_abbreviations = [
        "",
        "janv",
        "févr",
        "mars",
        "avr",
        "mai",
        "juin",
        "juil",
        "août",
        "sept",
        "oct",
        "nov",
        "déc",
    ]


class FrenchCanadianLocale(FrenchBaseLocale, Locale):
    names = ["fr-ca"]

    month_abbreviations = [
        "",
        "janv",
        "févr",
        "mars",
        "avr",
        "mai",
        "juin",
        "juill",
        "août",
        "sept",
        "oct",
        "nov",
        "déc",
    ]


class GreekLocale(Locale):
    names = ["el""el-gr"]

    past = "{0} πριν"
    future = "σε {0}"
    and_word = "και"

    timeframes = {
        "now""τώρα",
        "second""ένα δεύτερο",
        "seconds""{0} δευτερόλεπτα",
        "minute""ένα λεπτό",
        "minutes""{0} λεπτά",
        "hour""μία ώρα",
        "hours""{0} ώρες",
        "day""μία μέρα",
        "days""{0} μέρες",
        "week""μία εβδομάδα",
        "weeks""{0} εβδομάδες",
        "month""ένα μήνα",
        "months""{0} μήνες",
        "year""ένα χρόνο",
        "years""{0} χρόνια",
    }

    month_names = [
        "",
        "Ιανουαρίου",
        "Φεβρουαρίου",
        "Μαρτίου",
        "Απριλίου",
        "Μαΐου",
        "Ιουνίου",
        "Ιουλίου",
        "Αυγούστου",
        "Σεπτεμβρίου",
        "Οκτωβρίου",
        "Νοεμβρίου",
        "Δεκεμβρίου",
    ]
    month_abbreviations = [
        "",
        "Ιαν",
        "Φεβ",
        "Μαρ",
        "Απρ",
        "Μαϊ",
        "Ιον",
        "Ιολ",
        "Αυγ",
        "Σεπ",
        "Οκτ",
        "Νοε",
        "Δεκ",
    ]

    day_names = [
        "",
        "Δευτέρα",
        "Τρίτη",
        "Τετάρτη",
        "Πέμπτη",
        "Παρασκευή",
        "Σάββατο",
        "Κυριακή",
    ]
    day_abbreviations = ["""Δευ""Τρι""Τετ""Πεμ""Παρ""Σαβ""Κυρ"]


class JapaneseLocale(Locale):
    names = ["ja""ja-jp"]

    past = "{0}前"
    future = "{0}後"
    and_word = ""

    timeframes = {
        "now""現在",
        "second""1秒",
        "seconds""{0}秒",
        "minute""1分",
        "minutes""{0}分",
        "hour""1時間",
        "hours""{0}時間",
        "day""1日",
        "days""{0}日",
        "week""1週間",
        "weeks""{0}週間",
        "month""1ヶ月",
        "months""{0}ヶ月",
        "year""1年",
        "years""{0}年",
    }

    month_names = [
        "",
        "1月",
        "2月",
        "3月",
        "4月",
        "5月",
        "6月",
        "7月",
        "8月",
        "9月",
        "10月",
        "11月",
        "12月",
    ]
    month_abbreviations = [
        "",
        " 1",
        " 2",
        " 3",
        " 4",
        " 5",
        " 6",
        " 7",
        " 8",
        " 9",
        "10",
        "11",
        "12",
    ]

    day_names = ["""月曜日""火曜日""水曜日""木曜日""金曜日""土曜日""日曜日"]
    day_abbreviations = ["""月""火""水""木""金""土""日"]


class SwedishLocale(Locale):
    names = ["sv""sv-se"]

    past = "för {0} sen"
    future = "om {0}"
    and_word = "och"

    timeframes = {
        "now""just nu",
        "second""en sekund",
        "seconds""{0} sekunder",
        "minute""en minut",
        "minutes""{0} minuter",
        "hour""en timme",
        "hours""{0} timmar",
        "day""en dag",
        "days""{0} dagar",
        "week""en vecka",
        "weeks""{0} veckor",
        "month""en månad",
        "months""{0} månader",
        "year""ett år",
        "years""{0} år",
    }

    month_names = [
        "",
        "januari",
        "februari",
        "mars",
        "april",
        "maj",
        "juni",
        "juli",
        "augusti",
        "september",
        "oktober",
        "november",
        "december",
    ]
    month_abbreviations = [
        "",
        "jan",
        "feb",
        "mar",
        "apr",
        "maj",
        "jun",
        "jul",
        "aug",
        "sep",
        "okt",
        "nov",
        "dec",
    ]

    day_names = [
        "",
        "måndag",
        "tisdag",
        "onsdag",
        "torsdag",
        "fredag",
        "lördag",
        "söndag",
    ]
    day_abbreviations = ["""mån""tis""ons""tor""fre""lör""sön"]


class FinnishLocale(Locale):
    names = ["fi""fi-fi"]

    # The finnish grammar is very complex, and its hard to convert
    # 1-to-1 to something like English.

    past = "{0} sitten"
    future = "{0} kuluttua"

    timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
        "now""juuri nyt",
        "second": {"past""sekunti""future""sekunnin"},
        "seconds": {"past""{0} sekuntia""future""{0} sekunnin"},
        "minute": {"past""minuutti""future""minuutin"},
        "minutes": {"past""{0} minuuttia""future""{0} minuutin"},
        "hour": {"past""tunti""future""tunnin"},
        "hours": {"past""{0} tuntia""future""{0} tunnin"},
        "day": {"past""päivä""future""päivän"},
        "days": {"past""{0} päivää""future""{0} päivän"},
        "week": {"past""viikko""future""viikon"},
        "weeks": {"past""{0} viikkoa""future""{0} viikon"},
        "month": {"past""kuukausi""future""kuukauden"},
        "months": {"past""{0} kuukautta""future""{0} kuukauden"},
        "year": {"past""vuosi""future""vuoden"},
        "years": {"past""{0} vuotta""future""{0} vuoden"},
    }

    # Months and days are lowercase in Finnish
    month_names = [
        "",
        "tammikuu",
        "helmikuu",
        "maaliskuu",
        "huhtikuu",
        "toukokuu",
        "kesäkuu",
        "heinäkuu",
        "elokuu",
        "syyskuu",
        "lokakuu",
        "marraskuu",
        "joulukuu",
    ]

    month_abbreviations = [
        "",
        "tammi",
        "helmi",
        "maalis",
        "huhti",
        "touko",
        "kesä",
        "heinä",
        "elo",
        "syys",
        "loka",
        "marras",
        "joulu",
    ]

    day_names = [
        "",
        "maanantai",
        "tiistai",
        "keskiviikko",
        "torstai",
        "perjantai",
        "lauantai",
        "sunnuntai",
    ]

    day_abbreviations = ["""ma""ti""ke""to""pe""la""su"]

    def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
        form = self.timeframes[timeframe]

        if isinstance(form, Mapping):
            if delta < 0:
                form = form["past"]
            else:
                form = form["future"]

        return form.format(abs(delta))

    def _ordinal_number(self, n: int) -> str:
        return f"{n}."


class ChineseCNLocale(Locale):
    names = ["zh""zh-cn"]

    past = "{0}前"
    future = "{0}后"

    timeframes = {
        "now""刚才",
        "second""1秒",
        "seconds""{0}秒",
        "minute""1分钟",
        "minutes""{0}分钟",
        "hour""1小时",
        "hours""{0}小时",
        "day""1天",
        "days""{0}天",
        "week""1周",
        "weeks""{0}周",
        "month""1个月",
        "months""{0}个月",
        "year""1年",
        "years""{0}年",
    }

    month_names = [
        "",
        "一月",
        "二月",
        "三月",
        "四月",
        "五月",
        "六月",
        "七月",
        "八月",
        "九月",
        "十月",
        "十一月",
        "十二月",
    ]
    month_abbreviations = [
        "",
        " 1",
        " 2",
        " 3",
        " 4",
        " 5",
        " 6",
        " 7",
        " 8",
        " 9",
        "10",
        "11",
        "12",
    ]

    day_names = ["""星期一""星期二""星期三""星期四""星期五""星期六""星期日"]
    day_abbreviations = ["""一""二""三""四""五""六""日"]


class ChineseTWLocale(Locale):
    names = ["zh-tw"]

    past = "{0}前"
    future = "{0}後"
    and_word = "和"

    timeframes = {
        "now""剛才",
        "second""1秒",
        "seconds""{0}秒",
        "minute""1分鐘",
        "minutes""{0}分鐘",
        "hour""1小時",
        "hours""{0}小時",
        "day""1天",
        "days""{0}天",
        "week""1週",
        "weeks""{0}週",
        "month""1個月",
        "months""{0}個月",
        "year""1年",
        "years""{0}年",
    }

    month_names = [
        "",
        "1月",
        "2月",
        "3月",
        "4月",
        "5月",
        "6月",
        "7月",
        "8月",
        "9月",
        "10月",
        "11月",
        "12月",
    ]
    month_abbreviations = [
        "",
        " 1",
        " 2",
        " 3",
        " 4",
        " 5",
        " 6",
        " 7",
        " 8",
        " 9",
        "10",
        "11",
        "12",
    ]

    day_names = ["""週一""週二""週三""週四""週五""週六""週日"]
    day_abbreviations = ["""一""二""三""四""五""六""日"]


class HongKongLocale(Locale):
    names = ["zh-hk"]

    past = "{0}前"
    future = "{0}後"

    timeframes = {
        "now""剛才",
        "second""1秒",
        "seconds""{0}秒",
        "minute""1分鐘",
        "minutes""{0}分鐘",
        "hour""1小時",
        "hours""{0}小時",
        "day""1天",
        "days""{0}天",
        "week""1星期",
        "weeks""{0}星期",
        "month""1個月",
        "months""{0}個月",
        "year""1年",
        "years""{0}年",
    }

    month_names = [
        "",
        "1月",
        "2月",
        "3月",
        "4月",
        "5月",
        "6月",
        "7月",
        "8月",
        "9月",
        "10月",
        "11月",
        "12月",
    ]
    month_abbreviations = [
        "",
        " 1",
        " 2",
        " 3",
        " 4",
        " 5",
        " 6",
        " 7",
        " 8",
        " 9",
        "10",
        "11",
        "12",
    ]

    day_names = ["""星期一""星期二""星期三""星期四""星期五""星期六""星期日"]
    day_abbreviations = ["""一""二""三""四""五""六""日"]


class KoreanLocale(Locale):
    names = ["ko""ko-kr"]

    past = "{0} 전"
    future = "{0} 후"

    timeframes = {
        "now""지금",
        "second""1초",
        "seconds""{0}초",
        "minute""1분",
        "minutes""{0}분",
        "hour""한시간",
        "hours""{0}시간",
        "day""하루",
        "days""{0}일",
        "week""1주",
        "weeks""{0}주",
        "month""한달",
        "months""{0}개월",
        "year""1년",
        "years""{0}년",
    }

    special_dayframes = {
        -3"그끄제",
        -2"그제",
        -1"어제",
        1"내일",
        2"모레",
        3"글피",
        4"그글피",
    }

    special_yearframes = {-2"제작년", -1"작년"1"내년"2"내후년"}

    month_names = [
        "",
        "1월",
        "2월",
        "3월",
        "4월",
        "5월",
        "6월",
        "7월",
        "8월",
        "9월",
        "10월",
        "11월",
        "12월",
    ]
    month_abbreviations = [
        "",
        " 1",
        " 2",
        " 3",
        " 4",
        " 5",
        " 6",
        " 7",
        " 8",
        " 9",
        "10",
        "11",
        "12",
    ]

    day_names = ["""월요일""화요일""수요일""목요일""금요일""토요일""일요일"]
    day_abbreviations = ["""월""화""수""목""금""토""일"]

    def _ordinal_number(self, n: int) -> str:
        ordinals = ["0""첫""두""세""네""다섯""여섯""일곱""여덟""아홉""열"]
        if n < len(ordinals):
            return f"{ordinals[n]}번째"
        return f"{n}번째"

    def _format_relative(
        self,
        humanized: str,
        timeframe: TimeFrameLiteral,
        delta: Union[float, int],
    ) -> str:
        if timeframe in ("day""days"):
            special = self.special_dayframes.get(int(delta))
            if special:
                return special
        elif timeframe in ("year""years"):
            special = self.special_yearframes.get(int(delta))
            if special:
                return special

        return super()._format_relative(humanized, timeframe, delta)


# derived locale types & implementations.
class DutchLocale(Locale):
    names = ["nl""nl-nl"]

    past = "{0} geleden"
    future = "over {0}"

    timeframes = {
        "now""nu",
        "second""een seconde",
        "seconds""{0} seconden",
        "minute""een minuut",
        "minutes""{0} minuten",
        "hour""een uur",
        "hours""{0} uur",
        "day""een dag",
        "days""{0} dagen",
        "week""een week",
        "weeks""{0} weken",
        "month""een maand",
        "months""{0} maanden",
        "year""een jaar",
        "years""{0} jaar",
    }

    # In Dutch names of months and days are not starting with a capital letter
    # like in the English language.
    month_names = [
        "",
        "januari",
        "februari",
        "maart",
        "april",
        "mei",
        "juni",
        "juli",
        "augustus",
        "september",
        "oktober",
        "november",
        "december",
    ]
    month_abbreviations = [
        "",
        "jan",
        "feb",
        "mrt",
        "apr",
        "mei",
        "jun",
        "jul",
        "aug",
        "sep",
        "okt",
        "nov",
        "dec",
    ]

    day_names = [
        "",
        "maandag",
        "dinsdag",
        "woensdag",
        "donderdag",
        "vrijdag",
        "zaterdag",
        "zondag",
    ]
    day_abbreviations = ["""ma""di""wo""do""vr""za""zo"]


class SlavicBaseLocale(Locale):
    timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]]

    def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
        form = self.timeframes[timeframe]
        delta = abs(delta)

        if isinstance(form, Mapping):
            if delta % 10 == 1 and delta % 100 != 11:
                form = form["singular"]
            elif 2 <= delta % 10 <= 4 and (delta % 100 < 10 or delta % 100 >= 20):
                form = form["dual"]
            else:
                form = form["plural"]

        return form.format(delta)


class BelarusianLocale(SlavicBaseLocale):
    names = ["be""be-by"]

    past = "{0} таму"
    future = "праз {0}"

    timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
        "now""зараз",
        "second""секунду",
        "seconds""{0} некалькі секунд",
        "minute""хвіліну",
        "minutes": {
            "singular""{0} хвіліну",
            "dual""{0} хвіліны",
            "plural""{0} хвілін",
        },
        "hour""гадзіну",
        "hours": {
            "singular""{0} гадзіну",
            "dual""{0} гадзіны",
            "plural""{0} гадзін",
        },
        "day""дзень",
        "days": {"singular""{0} дзень""dual""{0} дні""plural""{0} дзён"},
        "month""месяц",
        "months": {
            "singular""{0} месяц",
            "dual""{0} месяцы",
            "plural""{0} месяцаў",
        },
        "year""год",
        "years": {"singular""{0} год""dual""{0} гады""plural""{0} гадоў"},
    }

    month_names = [
        "",
        "студзеня",
        "лютага",
        "сакавіка",
        "красавіка",
        "траўня",
        "чэрвеня",
        "ліпеня",
        "жніўня",
        "верасня",
        "кастрычніка",
        "лістапада",
        "снежня",
    ]
    month_abbreviations = [
        "",
        "студ",
        "лют",
        "сак",
        "крас",
        "трав",
        "чэрв",
        "ліп",
        "жнів",
        "вер",
        "каст",
        "ліст",
        "снеж",
    ]

    day_names = [
        "",
        "панядзелак",
        "аўторак",
        "серада",
        "чацвер",
        "пятніца",
        "субота",
        "нядзеля",
    ]
    day_abbreviations = ["""пн""ат""ср""чц""пт""сб""нд"]


class PolishLocale(SlavicBaseLocale):
    names = ["pl""pl-pl"]

    past = "{0} temu"
    future = "za {0}"

    # The nouns should be in genitive case (Polish: "dopełniacz")
    # in order to correctly form `past` & `future` expressions.
    timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
        "now""teraz",
        "second""sekundę",
        "seconds": {
            "singular""{0} sekund",
            "dual""{0} sekundy",
            "plural""{0} sekund",
        },
        "minute""minutę",
        "minutes": {
            "singular""{0} minut",
            "dual""{0} minuty",
            "plural""{0} minut",
        },
        "hour""godzinę",
        "hours": {
            "singular""{0} godzin",
            "dual""{0} godziny",
            "plural""{0} godzin",
        },
        "day""dzień",
        "days""{0} dni",
        "week""tydzień",
        "weeks": {
            "singular""{0} tygodni",
            "dual""{0} tygodnie",
            "plural""{0} tygodni",
        },
        "month""miesiąc",
        "months": {
            "singular""{0} miesięcy",
            "dual""{0} miesiące",
            "plural""{0} miesięcy",
        },
        "year""rok",
        "years": {"singular""{0} lat""dual""{0} lata""plural""{0} lat"},
    }

    month_names = [
        "",
        "styczeń",
        "luty",
        "marzec",
        "kwiecień",
        "maj",
        "czerwiec",
        "lipiec",
        "sierpień",
        "wrzesień",
        "październik",
        "listopad",
        "grudzień",
    ]
    month_abbreviations = [
        "",
        "sty",
        "lut",
        "mar",
        "kwi",
        "maj",
        "cze",
        "lip",
        "sie",
        "wrz",
        "paź",
        "lis",
        "gru",
    ]

    day_names = [
        "",
        "poniedziałek",
        "wtorek",
        "środa",
        "czwartek",
        "piątek",
        "sobota",
        "niedziela",
    ]
    day_abbreviations = ["""Pn""Wt""Śr""Czw""Pt""So""Nd"]


class RussianLocale(SlavicBaseLocale):
    names = ["ru""ru-ru"]

    past = "{0} назад"
    future = "через {0}"

    timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
        "now""сейчас",
        "second""секунда",
        "seconds": {
            "singular""{0} секунду",
            "dual""{0} секунды",
            "plural""{0} секунд",
        },
        "minute""минуту",
        "minutes": {
            "singular""{0} минуту",
            "dual""{0} минуты",
            "plural""{0} минут",
        },
        "hour""час",
        "hours": {"singular""{0} час""dual""{0} часа""plural""{0} часов"},
        "day""день",
        "days": {"singular""{0} день""dual""{0} дня""plural""{0} дней"},
        "week""неделю",
        "weeks": {
            "singular""{0} неделю",
            "dual""{0} недели",
            "plural""{0} недель",
        },
        "month""месяц",
        "months": {
            "singular""{0} месяц",
            "dual""{0} месяца",
            "plural""{0} месяцев",
        },
        "quarter""квартал",
        "quarters": {
            "singular""{0} квартал",
            "dual""{0} квартала",
            "plural""{0} кварталов",
        },
        "year""год",
        "years": {"singular""{0} год""dual""{0} года""plural""{0} лет"},
    }

    month_names = [
        "",
        "января",
        "февраля",
        "марта",
        "апреля",
        "мая",
        "июня",
        "июля",
        "августа",
        "сентября",
        "октября",
        "ноября",
        "декабря",
    ]
    month_abbreviations = [
        "",
        "янв",
        "фев",
        "мар",
        "апр",
        "май",
        "июн",
        "июл",
        "авг",
        "сен",
        "окт",
        "ноя",
        "дек",
    ]

    day_names = [
        "",
        "понедельник",
        "вторник",
        "среда",
        "четверг",
        "пятница",
        "суббота",
        "воскресенье",
    ]
    day_abbreviations = ["""пн""вт""ср""чт""пт""сб""вс"]


class AfrikaansLocale(Locale):
    names = ["af""af-nl"]

    past = "{0} gelede"
    future = "in {0}"

    timeframes = {
        "now""nou",
        "second""n sekonde",
        "seconds""{0} sekondes",
        "minute""minuut",
        "minutes""{0} minute",
        "hour""uur",
        "hours""{0} ure",
        "day""een dag",
        "days""{0} dae",
        "month""een maand",
        "months""{0} maande",
        "year""een jaar",
        "years""{0} jaar",
    }

    month_names = [
        "",
        "Januarie",
        "Februarie",
        "Maart",
        "April",
        "Mei",
        "Junie",
        "Julie",
        "Augustus",
        "September",
        "Oktober",
        "November",
        "Desember",
    ]
    month_abbreviations = [
        "",
        "Jan",
        "Feb",
        "Mrt",
        "Apr",
        "Mei",
        "Jun",
        "Jul",
        "Aug",
        "Sep",
        "Okt",
        "Nov",
        "Des",
    ]

    day_names = [
        "",
        "Maandag",
        "Dinsdag",
        "Woensdag",
        "Donderdag",
        "Vrydag",
        "Saterdag",
        "Sondag",
    ]
    day_abbreviations = ["""Ma""Di""Wo""Do""Vr""Za""So"]


class BulgarianLocale(SlavicBaseLocale):
    names = ["bg""bg-bg"]

    past = "{0} назад"
    future = "напред {0}"

    timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
        "now""сега",
        "second""секунда",
        "seconds""{0} няколко секунди",
        "minute""минута",
        "minutes": {
            "singular""{0} минута",
            "dual""{0} минути",
            "plural""{0} минути",
        },
        "hour""час",
        "hours": {"singular""{0} час""dual""{0} часа""plural""{0} часа"},
        "day""ден",
        "days": {"singular""{0} ден""dual""{0} дни""plural""{0} дни"},
        "month""месец",
        "months": {
            "singular""{0} месец",
            "dual""{0} месеца",
            "plural""{0} месеца",
        },
        "year""година",
        "years": {
            "singular""{0} година",
            "dual""{0} години",
            "plural""{0} години",
        },
    }

    month_names = [
        "",
        "януари",
        "февруари",
        "март",
        "април",
        "май",
        "юни",
        "юли",
        "август",
        "септември",
        "октомври",
        "ноември",
        "декември",
    ]
    month_abbreviations = [
        "",
        "ян",
        "февр",
        "март",
        "апр",
        "май",
        "юни",
        "юли",
        "авг",
        "септ",
        "окт",
        "ноем",
        "дек",
    ]

    day_names = [
        "",
        "понеделник",
        "вторник",
        "сряда",
        "четвъртък",
        "петък",
        "събота",
        "неделя",
    ]
    day_abbreviations = ["""пон""вт""ср""четв""пет""съб""нед"]


class UkrainianLocale(SlavicBaseLocale):
    names = ["ua""uk""uk-ua"]

    past = "{0} тому"
    future = "за {0}"

    timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
        "now""зараз",
        "second""секунда",
        "seconds""{0} кілька секунд",
        "minute""хвилину",
        "minutes": {
            "singular""{0} хвилину",
            "dual""{0} хвилини",
            "plural""{0} хвилин",
        },
        "hour""годину",
        "hours": {
            "singular""{0} годину",
            "dual""{0} години",
            "plural""{0} годин",
        },
        "day""день",
        "days": {"singular""{0} день""dual""{0} дні""plural""{0} днів"},
        "month""місяць",
        "months": {
            "singular""{0} місяць",
            "dual""{0} місяці",
            "plural""{0} місяців",
        },
        "year""рік",
        "years": {"singular""{0} рік""dual""{0} роки""plural""{0} років"},
    }

    month_names = [
        "",
        "січня",
        "лютого",
        "березня",
        "квітня",
        "травня",
        "червня",
        "липня",
        "серпня",
        "вересня",
        "жовтня",
        "листопада",
        "грудня",
    ]
    month_abbreviations = [
        "",
        "січ",
        "лют",
        "бер",
        "квіт",
        "трав",
        "черв",
        "лип",
        "серп",
        "вер",
        "жовт",
        "лист",
        "груд",
    ]

    day_names = [
        "",
        "понеділок",
        "вівторок",
        "середа",
        "четвер",
        "п’ятниця",
        "субота",
        "неділя",
    ]
    day_abbreviations = ["""пн""вт""ср""чт""пт""сб""нд"]


class MacedonianLocale(SlavicBaseLocale):
    names = ["mk""mk-mk"]

    past = "пред {0}"
    future = "за {0}"

    timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
        "now""сега",
        "second""една секунда",
        "seconds": {
            "singular""{0} секунда",
            "dual""{0} секунди",
            "plural""{0} секунди",
        },
        "minute""една минута",
        "minutes": {
            "singular""{0} минута",
            "dual""{0} минути",
            "plural""{0} минути",
        },
        "hour""еден саат",
        "hours": {"singular""{0} саат""dual""{0} саати""plural""{0} саати"},
        "day""еден ден",
        "days": {"singular""{0} ден""dual""{0} дена""plural""{0} дена"},
        "week""една недела",
        "weeks": {
            "singular""{0} недела",
            "dual""{0} недели",
            "plural""{0} недели",
        },
        "month""еден месец",
        "months": {
            "singular""{0} месец",
            "dual""{0} месеци",
            "plural""{0} месеци",
        },
        "year""една година",
        "years": {
            "singular""{0} година",
            "dual""{0} години",
            "plural""{0} години",
        },
    }

    meridians = {"am""дп""pm""пп""AM""претпладне""PM""попладне"}

    month_names = [
        "",
        "Јануари",
        "Февруари",
        "Март",
        "Април",
        "Мај",
        "Јуни",
        "Јули",
        "Август",
        "Септември",
        "Октомври",
        "Ноември",
        "Декември",
    ]
    month_abbreviations = [
        "",
        "Јан",
        "Фев",
        "Мар",
        "Апр",
        "Мај",
        "Јун",
        "Јул",
        "Авг",
        "Септ",
        "Окт",
        "Ноем",
        "Декем",
    ]

    day_names = [
        "",
        "Понеделник",
        "Вторник",
        "Среда",
        "Четврток",
        "Петок",
        "Сабота",
        "Недела",
    ]
    day_abbreviations = [
        "",
        "Пон",
        "Вт",
        "Сре",
        "Чет",
        "Пет",
        "Саб",
        "Нед",
    ]


class GermanBaseLocale(Locale):
    past = "vor {0}"
    future = "in {0}"
    and_word = "und"

    timeframes: ClassVar[Dict[TimeFrameLiteral, str]] = {
        "now""gerade eben",
        "second""einer Sekunde",
        "seconds""{0} Sekunden",
        "minute""einer Minute",
        "minutes""{0} Minuten",
        "hour""einer Stunde",
        "hours""{0} Stunden",
        "day""einem Tag",
        "days""{0} Tagen",
        "week""einer Woche",
        "weeks""{0} Wochen",
        "month""einem Monat",
        "months""{0} Monaten",
        "year""einem Jahr",
        "years""{0} Jahren",
    }

    timeframes_only_distance = timeframes.copy()
    timeframes_only_distance["second"] = "eine Sekunde"
    timeframes_only_distance["minute"] = "eine Minute"
    timeframes_only_distance["hour"] = "eine Stunde"
    timeframes_only_distance["day"] = "ein Tag"
    timeframes_only_distance["days"] = "{0} Tage"
    timeframes_only_distance["week"] = "eine Woche"
    timeframes_only_distance["month"] = "ein Monat"
    timeframes_only_distance["months"] = "{0} Monate"
    timeframes_only_distance["year"] = "ein Jahr"
    timeframes_only_distance["years"] = "{0} Jahre"

    month_names = [
        "",
        "Januar",
        "Februar",
        "März",
        "April",
        "Mai",
        "Juni",
        "Juli",
        "August",
        "September",
        "Oktober",
        "November",
        "Dezember",
    ]

    month_abbreviations = [
        "",
        "Jan",
        "Feb",
        "Mär",
        "Apr",
        "Mai",
        "Jun",
        "Jul",
        "Aug",
        "Sep",
        "Okt",
        "Nov",
        "Dez",
    ]

    day_names = [
        "",
        "Montag",
        "Dienstag",
        "Mittwoch",
        "Donnerstag",
        "Freitag",
        "Samstag",
        "Sonntag",
    ]

    day_abbreviations = ["""Mo""Di""Mi""Do""Fr""Sa""So"]

    def _ordinal_number(self, n: int) -> str:
        return f"{n}."

    def describe(
        self,
        timeframe: TimeFrameLiteral,
        delta: Union[int, float] = 0,
        only_distance: bool = False,
    ) -> str:
        """Describes a delta within a timeframe in plain language.

        :param timeframe: a string representing a timeframe.
        :param delta: a quantity representing a delta in a timeframe.
        :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords
        """

        if not only_distance:
            return super().describe(timeframe, delta, only_distance)

        # German uses a different case without 'in' or 'ago'
        humanized: str = self.timeframes_only_distance[timeframe].format(
            trunc(abs(delta))
        )

        return humanized


class GermanLocale(GermanBaseLocale, Locale):
    names = ["de""de-de"]


class SwissLocale(GermanBaseLocale, Locale):
    names = ["de-ch"]


class AustrianLocale(GermanBaseLocale, Locale):
    names = ["de-at"]

    month_names = [
        "",
        "Jänner",
        "Februar",
        "März",
        "April",
        "Mai",
        "Juni",
        "Juli",
        "August",
        "September",
        "Oktober",
        "November",
        "Dezember",
    ]


class NorwegianLocale(Locale):
    names = ["nb""nb-no"]

    past = "for {0} siden"
    future = "om {0}"

    timeframes = {
        "now""nå nettopp",
        "second""ett sekund",
        "seconds""{0} sekunder",
        "minute""ett minutt",
        "minutes""{0} minutter",
        "hour""en time",
        "hours""{0} timer",
        "day""en dag",
        "days""{0} dager",
        "week""en uke",
        "weeks""{0} uker",
        "month""en måned",
        "months""{0} måneder",
        "year""ett år",
        "years""{0} år",
    }

    month_names = [
        "",
        "januar",
        "februar",
        "mars",
        "april",
        "mai",
        "juni",
        "juli",
        "august",
        "september",
        "oktober",
        "november",
        "desember",
    ]
    month_abbreviations = [
        "",
        "jan",
        "feb",
        "mar",
        "apr",
        "mai",
        "jun",
        "jul",
        "aug",
        "sep",
        "okt",
        "nov",
        "des",
    ]

    day_names = [
        "",
        "mandag",
        "tirsdag",
        "onsdag",
        "torsdag",
        "fredag",
        "lørdag",
        "søndag",
    ]
    day_abbreviations = ["""ma""ti""on""to""fr""lø""sø"]

    def _ordinal_number(self, n: int) -> str:
        return f"{n}."


class NewNorwegianLocale(Locale):
    names = ["nn""nn-no"]

    past = "for {0} sidan"
    future = "om {0}"

    timeframes = {
        "now""no nettopp",
        "second""eitt sekund",
        "seconds""{0} sekund",
        "minute""eitt minutt",
        "minutes""{0} minutt",
        "hour""ein time",
        "hours""{0} timar",
        "day""ein dag",
        "days""{0} dagar",
        "week""ei veke",
        "weeks""{0} veker",
        "month""ein månad",
        "months""{0} månader",
        "year""eitt år",
        "years""{0} år",
    }

    month_names = [
        "",
        "januar",
        "februar",
        "mars",
        "april",
        "mai",
        "juni",
        "juli",
        "august",
        "september",
        "oktober",
        "november",
        "desember",
    ]
    month_abbreviations = [
        "",
        "jan",
        "feb",
        "mar",
        "apr",
        "mai",
        "jun",
        "jul",
        "aug",
        "sep",
        "okt",
        "nov",
        "des",
    ]

    day_names = [
        "",
        "måndag",
        "tysdag",
        "onsdag",
        "torsdag",
        "fredag",
        "laurdag",
        "sundag",
    ]
    day_abbreviations = ["""må""ty""on""to""fr""la""su"]

    def _ordinal_number(self, n: int) -> str:
        return f"{n}."


class PortugueseLocale(Locale):
    names = ["pt""pt-pt"]

    past = "há {0}"
    future = "em {0}"
    and_word = "e"

    timeframes = {
        "now""agora",
        "second""um segundo",
        "seconds""{0} segundos",
        "minute""um minuto",
        "minutes""{0} minutos",
        "hour""uma hora",
        "hours""{0} horas",
        "day""um dia",
        "days""{0} dias",
        "week""uma semana",
        "weeks""{0} semanas",
        "month""um mês",
        "months""{0} meses",
        "year""um ano",
        "years""{0} anos",
    }

    month_names = [
        "",
        "Janeiro",
        "Fevereiro",
        "Março",
        "Abril",
        "Maio",
        "Junho",
        "Julho",
        "Agosto",
        "Setembro",
        "Outubro",
        "Novembro",
        "Dezembro",
    ]
    month_abbreviations = [
        "",
        "Jan",
        "Fev",
        "Mar",
        "Abr",
        "Mai",
        "Jun",
        "Jul",
        "Ago",
        "Set",
        "Out",
        "Nov",
        "Dez",
    ]

    day_names = [
        "",
        "Segunda-feira",
        "Terça-feira",
        "Quarta-feira",
        "Quinta-feira",
        "Sexta-feira",
        "Sábado",
        "Domingo",
    ]
    day_abbreviations = ["""Seg""Ter""Qua""Qui""Sex""Sab""Dom"]


class BrazilianPortugueseLocale(PortugueseLocale):
    names = ["pt-br"]

    past = "faz {0}"


class TagalogLocale(Locale):
    names = ["tl""tl-ph"]

    past = "nakaraang {0}"
    future = "{0} mula ngayon"

    timeframes = {
        "now""ngayon lang",
        "second""isang segundo",
        "seconds""{0} segundo",
        "minute""isang minuto",
        "minutes""{0} minuto",
        "hour""isang oras",
        "hours""{0} oras",
        "day""isang araw",
        "days""{0} araw",
        "week""isang linggo",
        "weeks""{0} linggo",
        "month""isang buwan",
        "months""{0} buwan",
        "year""isang taon",
        "years""{0} taon",
    }

    month_names = [
        "",
        "Enero",
        "Pebrero",
        "Marso",
        "Abril",
        "Mayo",
        "Hunyo",
        "Hulyo",
        "Agosto",
        "Setyembre",
        "Oktubre",
        "Nobyembre",
        "Disyembre",
    ]
    month_abbreviations = [
        "",
        "Ene",
        "Peb",
        "Mar",
        "Abr",
        "May",
        "Hun",
        "Hul",
        "Ago",
        "Set",
        "Okt",
        "Nob",
        "Dis",
    ]

    day_names = [
        "",
        "Lunes",
        "Martes",
        "Miyerkules",
        "Huwebes",
        "Biyernes",
        "Sabado",
        "Linggo",
    ]
    day_abbreviations = ["""Lun""Mar""Miy""Huw""Biy""Sab""Lin"]

    meridians = {"am""nu""pm""nh""AM""ng umaga""PM""ng hapon"}

    def _ordinal_number(self, n: int) -> str:
        return f"ika-{n}"


class VietnameseLocale(Locale):
    names = ["vi""vi-vn"]

    past = "{0} trước"
    future = "{0} nữa"

    timeframes = {
        "now""hiện tại",
        "second""một giây",
        "seconds""{0} giây",
        "minute""một phút",
        "minutes""{0} phút",
        "hour""một giờ",
        "hours""{0} giờ",
        "day""một ngày",
        "days""{0} ngày",
        "week""một tuần",
        "weeks""{0} tuần",
        "month""một tháng",
        "months""{0} tháng",
        "year""một năm",
        "years""{0} năm",
    }

    month_names = [
        "",
        "Tháng Một",
        "Tháng Hai",
        "Tháng Ba",
        "Tháng Tư",
        "Tháng Năm",
        "Tháng Sáu",
        "Tháng Bảy",
        "Tháng Tám",
        "Tháng Chín",
        "Tháng Mười",
        "Tháng Mười Một",
        "Tháng Mười Hai",
    ]
    month_abbreviations = [
        "",
        "Tháng 1",
        "Tháng 2",
        "Tháng 3",
        "Tháng 4",
        "Tháng 5",
        "Tháng 6",
        "Tháng 7",
        "Tháng 8",
        "Tháng 9",
        "Tháng 10",
        "Tháng 11",
        "Tháng 12",
    ]

    day_names = [
        "",
        "Thứ Hai",
        "Thứ Ba",
        "Thứ Tư",
        "Thứ Năm",
        "Thứ Sáu",
        "Thứ Bảy",
        "Chủ Nhật",
    ]
    day_abbreviations = ["""Thứ 2""Thứ 3""Thứ 4""Thứ 5""Thứ 6""Thứ 7""CN"]


class TurkishLocale(Locale):
    names = ["tr""tr-tr"]

    past = "{0} önce"
    future = "{0} sonra"
    and_word = "ve"

    timeframes = {
        "now""şimdi",
        "second""bir saniye",
        "seconds""{0} saniye",
        "minute""bir dakika",
        "minutes""{0} dakika",
        "hour""bir saat",
        "hours""{0} saat",
        "day""bir gün",
        "days""{0} gün",
        "week""bir hafta",
        "weeks""{0} hafta",
        "month""bir ay",
        "months""{0} ay",
        "year""bir yıl",
        "years""{0} yıl",
    }

    meridians = {"am""öö""pm""ös""AM""ÖÖ""PM""ÖS"}

    month_names = [
        "",
        "Ocak",
        "Şubat",
        "Mart",
        "Nisan",
        "Mayıs",
        "Haziran",
        "Temmuz",
        "Ağustos",
        "Eylül",
        "Ekim",
        "Kasım",
        "Aralık",
    ]
    month_abbreviations = [
        "",
        "Oca",
        "Şub",
        "Mar",
        "Nis",
        "May",
        "Haz",
        "Tem",
        "Ağu",
        "Eyl",
        "Eki",
        "Kas",
        "Ara",
    ]

    day_names = [
        "",
        "Pazartesi",
        "Salı",
        "Çarşamba",
        "Perşembe",
        "Cuma",
        "Cumartesi",
        "Pazar",
    ]
    day_abbreviations = ["""Pzt""Sal""Çar""Per""Cum""Cmt""Paz"]


class AzerbaijaniLocale(Locale):
    names = ["az""az-az"]

    past = "{0} əvvəl"
    future = "{0} sonra"

    timeframes = {
        "now""indi",
        "second""bir saniyə",
        "seconds""{0} saniyə",
        "minute""bir dəqiqə",
        "minutes""{0} dəqiqə",
        "hour""bir saat",
        "hours""{0} saat",
        "day""bir gün",
        "days""{0} gün",
        "week""bir həftə",
        "weeks""{0} həftə",
        "month""bir ay",
        "months""{0} ay",
        "year""bir il",
        "years""{0} il",
    }

    month_names = [
        "",
        "Yanvar",
        "Fevral",
        "Mart",
        "Aprel",
        "May",
        "İyun",
        "İyul",
        "Avqust",
        "Sentyabr",
        "Oktyabr",
        "Noyabr",
        "Dekabr",
    ]
    month_abbreviations = [
        "",
        "Yan",
        "Fev",
        "Mar",
        "Apr",
        "May",
        "İyn",
        "İyl",
        "Avq",
        "Sen",
        "Okt",
        "Noy",
        "Dek",
    ]

    day_names = [
        "",
        "Bazar ertəsi",
        "Çərşənbə axşamı",
        "Çərşənbə",
        "Cümə axşamı",
        "Cümə",
        "Şənbə",
        "Bazar",
    ]
    day_abbreviations = ["""Ber""Çax""Çər""Cax""Cüm""Şnb""Bzr"]


class ArabicLocale(Locale):
    names = [
        "ar",
        "ar-ae",
        "ar-bh",
        "ar-dj",
        "ar-eg",
        "ar-eh",
        "ar-er",
        "ar-km",
        "ar-kw",
        "ar-ly",
        "ar-om",
        "ar-qa",
        "ar-sa",
        "ar-sd",
        "ar-so",
        "ar-ss",
        "ar-td",
        "ar-ye",
    ]

    past = "منذ {0}"
    future = "خلال {0}"

    timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
        "now""الآن",
        "second""ثانية",
        "seconds": {"2""ثانيتين""ten""{0} ثوان""higher""{0} ثانية"},
        "minute""دقيقة",
        "minutes": {"2""دقيقتين""ten""{0} دقائق""higher""{0} دقيقة"},
        "hour""ساعة",
        "hours": {"2""ساعتين""ten""{0} ساعات""higher""{0} ساعة"},
        "day""يوم",
        "days": {"2""يومين""ten""{0} أيام""higher""{0} يوم"},
        "week""اسبوع",
        "weeks": {"2""اسبوعين""ten""{0} أسابيع""higher""{0} اسبوع"},
        "month""شهر",
        "months": {"2""شهرين""ten""{0} أشهر""higher""{0} شهر"},
        "year""سنة",
        "years": {"2""سنتين""ten""{0} سنوات""higher""{0} سنة"},
    }

    month_names = [
        "",
        "يناير",
        "فبراير",
        "مارس",
        "أبريل",
        "مايو",
        "يونيو",
        "يوليو",
        "أغسطس",
        "سبتمبر",
        "أكتوبر",
        "نوفمبر",
        "ديسمبر",
    ]
    month_abbreviations = [
        "",
        "يناير",
        "فبراير",
        "مارس",
        "أبريل",
        "مايو",
        "يونيو",
        "يوليو",
        "أغسطس",
        "سبتمبر",
        "أكتوبر",
        "نوفمبر",
        "ديسمبر",
    ]

    day_names = [
        "",
        "الإثنين",
        "الثلاثاء",
        "الأربعاء",
        "الخميس",
        "الجمعة",
        "السبت",
        "الأحد",
    ]
    day_abbreviations = ["""إثنين""ثلاثاء""أربعاء""خميس""جمعة""سبت""أحد"]

    def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
        form = self.timeframes[timeframe]
        delta = abs(delta)
        if isinstance(form, Mapping):
            if delta == 2:
                form = form["2"]
            elif 2 < delta <= 10:
                form = form["ten"]
            else:
                form = form["higher"]

        return form.format(delta)


class LevantArabicLocale(ArabicLocale):
    names = ["ar-iq""ar-jo""ar-lb""ar-ps""ar-sy"]
    month_names = [
        "",
        "كانون الثاني",
        "شباط",
        "آذار",
        "نيسان",
        "أيار",
        "حزيران",
        "تموز",
        "آب",
        "أيلول",
        "تشرين الأول",
        "تشرين الثاني",
        "كانون الأول",
    ]
    month_abbreviations = [
        "",
        "كانون الثاني",
        "شباط",
        "آذار",
        "نيسان",
        "أيار",
        "حزيران",
        "تموز",
        "آب",
        "أيلول",
        "تشرين الأول",
        "تشرين الثاني",
        "كانون الأول",
    ]


class AlgeriaTunisiaArabicLocale(ArabicLocale):
    names = ["ar-tn""ar-dz"]
    month_names = [
        "",
        "جانفي",
        "فيفري",
        "مارس",
        "أفريل",
        "ماي",
        "جوان",
        "جويلية",
        "أوت",
        "سبتمبر",
        "أكتوبر",
        "نوفمبر",
        "ديسمبر",
    ]
    month_abbreviations = [
        "",
        "جانفي",
        "فيفري",
        "مارس",
        "أفريل",
        "ماي",
        "جوان",
        "جويلية",
        "أوت",
        "سبتمبر",
        "أكتوبر",
        "نوفمبر",
        "ديسمبر",
    ]


class MauritaniaArabicLocale(ArabicLocale):
    names = ["ar-mr"]
    month_names = [
        "",
        "يناير",
        "فبراير",
        "مارس",
        "إبريل",
        "مايو",
        "يونيو",
        "يوليو",
        "أغشت",
        "شتمبر",
        "أكتوبر",
        "نوفمبر",
        "دجمبر",
    ]
    month_abbreviations = [
        "",
        "يناير",
        "فبراير",
        "مارس",
        "إبريل",
        "مايو",
        "يونيو",
        "يوليو",
        "أغشت",
        "شتمبر",
        "أكتوبر",
        "نوفمبر",
        "دجمبر",
    ]


class MoroccoArabicLocale(ArabicLocale):
    names = ["ar-ma"]
    month_names = [
        "",
        "يناير",
        "فبراير",
        "مارس",
        "أبريل",
        "ماي",
        "يونيو",
        "يوليوز",
        "غشت",
        "شتنبر",
        "أكتوبر",
        "نونبر",
        "دجنبر",
    ]
    month_abbreviations = [
        "",
        "يناير",
        "فبراير",
        "مارس",
        "أبريل",
        "ماي",
        "يونيو",
        "يوليوز",
        "غشت",
        "شتنبر",
        "أكتوبر",
        "نونبر",
        "دجنبر",
    ]


class IcelandicLocale(Locale):
    def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
        form = self.timeframes[timeframe]

        if isinstance(form, Mapping):
            if delta < 0:
                form = form["past"]
            elif delta > 0:
                form = form["future"]
            else:
                raise ValueError(
                    "Icelandic Locale does not support units with a delta of zero. "
                    "Please consider making a contribution to fix this issue."
                )
                # FIXME: handle when delta is 0

        return form.format(abs(delta))

    names = ["is""is-is"]

    past = "fyrir {0} síðan"
    future = "eftir {0}"

    timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
        "now""rétt í þessu",
        "second": {"past""sekúndu""future""sekúndu"},
        "seconds": {"past""{0} nokkrum sekúndum""future""nokkrar sekúndur"},
        "minute": {"past""einni mínútu""future""eina mínútu"},
        "minutes": {"past""{0} mínútum""future""{0} mínútur"},
        "hour": {"past""einum tíma""future""einn tíma"},
        "hours": {"past""{0} tímum""future""{0} tíma"},
        "day": {"past""einum degi""future""einn dag"},
        "days": {"past""{0} dögum""future""{0} daga"},
        "month": {"past""einum mánuði""future""einn mánuð"},
        "months": {"past""{0} mánuðum""future""{0} mánuði"},
        "year": {"past""einu ári""future""eitt ár"},
        "years": {"past""{0} árum""future""{0} ár"},
    }

    meridians = {"am""f.h.""pm""e.h.""AM""f.h.""PM""e.h."}

    month_names = [
        "",
        "janúar",
        "febrúar",
        "mars",
        "apríl",
        "maí",
        "júní",
        "júlí",
        "ágúst",
        "september",
        "október",
        "nóvember",
        "desember",
    ]
    month_abbreviations = [
        "",
        "jan",
        "feb",
        "mar",
        "apr",
        "maí",
        "jún",
        "júl",
        "ágú",
        "sep",
        "okt",
        "nóv",
        "des",
    ]

    day_names = [
        "",
        "mánudagur",
        "þriðjudagur",
        "miðvikudagur",
        "fimmtudagur",
        "föstudagur",
        "laugardagur",
        "sunnudagur",
    ]
    day_abbreviations = ["""mán""þri""mið""fim""fös""lau""sun"]


class DanishLocale(Locale):
    names = ["da""da-dk"]

    past = "for {0} siden"
    future = "om {0}"
    and_word = "og"

    timeframes = {
        "now""lige nu",
        "second""et sekund",
        "seconds""{0} sekunder",
        "minute""et minut",
        "minutes""{0} minutter",
        "hour""en time",
        "hours""{0} timer",
        "day""en dag",
        "days""{0} dage",
        "week""en uge",
        "weeks""{0} uger",
        "month""en måned",
        "months""{0} måneder",
        "year""et år",
        "years""{0} år",
    }

    month_names = [
        "",
        "januar",
        "februar",
        "marts",
        "april",
        "maj",
        "juni",
        "juli",
        "august",
        "september",
        "oktober",
        "november",
        "december",
    ]
    month_abbreviations = [
        "",
        "jan",
        "feb",
        "mar",
        "apr",
        "maj",
        "jun",
        "jul",
        "aug",
        "sep",
        "okt",
        "nov",
        "dec",
    ]

    day_names = [
        "",
        "mandag",
        "tirsdag",
        "onsdag",
        "torsdag",
        "fredag",
        "lørdag",
        "søndag",
    ]
    day_abbreviations = ["""man""tir""ons""tor""fre""lør""søn"]

    def _ordinal_number(self, n: int) -> str:
        return f"{n}."


class MalayalamLocale(Locale):
    names = ["ml"]

    past = "{0} മുമ്പ്"
    future = "{0} ശേഷം"

    timeframes = {
        "now""ഇപ്പോൾ",
        "second""ഒരു നിമിഷം",
        "seconds""{0} സെക്കന്റ്‌",
        "minute""ഒരു മിനിറ്റ്",
        "minutes""{0} മിനിറ്റ്",
        "hour""ഒരു മണിക്കൂർ",
        "hours""{0} മണിക്കൂർ",
        "day""ഒരു ദിവസം ",
        "days""{0} ദിവസം ",
        "month""ഒരു മാസം ",
        "months""{0} മാസം ",
        "year""ഒരു വർഷം ",
        "years""{0} വർഷം ",
    }

    meridians = {
        "am""രാവിലെ",
        "pm""ഉച്ചക്ക് ശേഷം",
        "AM""രാവിലെ",
        "PM""ഉച്ചക്ക് ശേഷം",
    }

    month_names = [
        "",
        "ജനുവരി",
        "ഫെബ്രുവരി",
        "മാർച്ച്‌",
        "ഏപ്രിൽ ",
        "മെയ്‌ ",
        "ജൂണ്‍",
        "ജൂലൈ",
        "ഓഗസ്റ്റ്‌",
        "സെപ്റ്റംബർ",
        "ഒക്ടോബർ",
        "നവംബർ",
        "ഡിസംബർ",
    ]
    month_abbreviations = [
        "",
        "ജനു",
        "ഫെബ് ",
        "മാർ",
        "ഏപ്രിൽ",
        "മേയ്",
        "ജൂണ്‍",
        "ജൂലൈ",
        "ഓഗസ്റ",
        "സെപ്റ്റ",
        "ഒക്ടോ",
        "നവം",
        "ഡിസം",
    ]

    day_names = ["""തിങ്കള്‍""ചൊവ്വ""ബുധന്‍""വ്യാഴം""വെള്ളി""ശനി""ഞായര്‍"]
    day_abbreviations = [
        "",
        "തിങ്കള്‍",
        "ചൊവ്വ",
        "ബുധന്‍",
        "വ്യാഴം",
        "വെള്ളി",
        "ശനി",
        "ഞായര്‍",
    ]


class HindiLocale(Locale):
    names = ["hi""hi-in"]

    past = "{0} पहले"
    future = "{0} बाद"

    timeframes = {
        "now""अभी",
        "second""एक पल",
        "seconds""{0} सेकंड्",
        "minute""एक मिनट ",
        "minutes""{0} मिनट ",
        "hour""एक घंटा",
        "hours""{0} घंटे",
        "day""एक दिन",
        "days""{0} दिन",
        "month""एक माह ",
        "months""{0} महीने ",
        "year""एक वर्ष ",
        "years""{0} साल ",
    }

    meridians = {"am""सुबह""pm""शाम""AM""सुबह""PM""शाम"}

    month_names = [
        "",
        "जनवरी",
        "फरवरी",
        "मार्च",
        "अप्रैल ",
        "मई",
        "जून",
        "जुलाई",
        "अगस्त",
        "सितंबर",
        "अक्टूबर",
        "नवंबर",
        "दिसंबर",
    ]
    month_abbreviations = [
        "",
        "जन",
        "फ़र",
        "मार्च",
        "अप्रै",
        "मई",
        "जून",
        "जुलाई",
        "आग",
        "सित",
        "अकत",
        "नवे",
        "दिस",
    ]

    day_names = [
        "",
        "सोमवार",
        "मंगलवार",
        "बुधवार",
        "गुरुवार",
        "शुक्रवार",
        "शनिवार",
        "रविवार",
    ]
    day_abbreviations = ["""सोम""मंगल""बुध""गुरुवार""शुक्र""शनि""रवि"]


class CzechLocale(Locale):
    names = ["cs""cs-cz"]

    timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
        "now""Teď",
        "second": {"past""vteřina""future""vteřina"},
        "seconds": {
            "zero""vteřina",
            "past""{0} sekundami",
            "future-singular""{0} sekundy",
            "future-paucal""{0} sekund",
        },
        "minute": {"past""minutou""future""minutu"},
        "minutes": {
            "zero""{0} minut",
            "past""{0} minutami",
            "future-singular""{0} minuty",
            "future-paucal""{0} minut",
        },
        "hour": {"past""hodinou""future""hodinu"},
        "hours": {
            "zero""{0} hodin",
            "past""{0} hodinami",
            "future-singular""{0} hodiny",
            "future-paucal""{0} hodin",
        },
        "day": {"past""dnem""future""den"},
        "days": {
            "zero""{0} dnů",
            "past""{0} dny",
            "future-singular""{0} dny",
            "future-paucal""{0} dnů",
        },
        "week": {"past""týdnem""future""týden"},
        "weeks": {
            "zero""{0} týdnů",
            "past""{0} týdny",
            "future-singular""{0} týdny",
            "future-paucal""{0} týdnů",
        },
        "month": {"past""měsícem""future""měsíc"},
        "months": {
            "zero""{0} měsíců",
            "past""{0} měsíci",
            "future-singular""{0} měsíce",
            "future-paucal""{0} měsíců",
        },
        "year": {"past""rokem""future""rok"},
        "years": {
            "zero""{0} let",
            "past""{0} lety",
            "future-singular""{0} roky",
            "future-paucal""{0} let",
        },
    }

    past = "Před {0}"
    future = "Za {0}"

    month_names = [
        "",
        "leden",
        "únor",
        "březen",
        "duben",
        "květen",
        "červen",
        "červenec",
        "srpen",
        "září",
        "říjen",
        "listopad",
        "prosinec",
    ]
    month_abbreviations = [
        "",
        "led",
        "úno",
        "bře",
        "dub",
        "kvě",
        "čvn",
        "čvc",
        "srp",
        "zář",
        "říj",
        "lis",
        "pro",
    ]

    day_names = [
        "",
        "pondělí",
        "úterý",
        "středa",
        "čtvrtek",
        "pátek",
        "sobota",
        "neděle",
    ]
    day_abbreviations = ["""po""út""st""čt""pá""so""ne"]

    def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
        """Czech aware time frame format function, takes into account
        the differences between past and future forms."""
        abs_delta = abs(delta)
        form = self.timeframes[timeframe]

        if isinstance(form, str):
            return form.format(abs_delta)

        if delta == 0:
            key = "zero"  # And *never* use 0 in the singular!
        elif delta < 0:
            key = "past"
        else:
            # Needed since both regular future and future-singular and future-paucal cases
            if "future-singular" not in form:
                key = "future"
            elif 2 <= abs_delta % 10 <= 4 and (
                abs_delta % 100 < 10 or abs_delta % 100 >= 20
            ):
                key = "future-singular"
            else:
                key = "future-paucal"

        form: str = form[key]
        return form.format(abs_delta)


class SlovakLocale(Locale):
    names = ["sk""sk-sk"]

    timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
        "now""Teraz",
        "second": {"past""sekundou""future""sekundu"},
        "seconds": {
            "zero""{0} sekúnd",
            "past""{0} sekundami",
            "future-singular""{0} sekundy",
            "future-paucal""{0} sekúnd",
        },
        "minute": {"past""minútou""future""minútu"},
        "minutes": {
            "zero""{0} minút",
            "past""{0} minútami",
            "future-singular""{0} minúty",
            "future-paucal""{0} minút",
        },
        "hour": {"past""hodinou""future""hodinu"},
        "hours": {
            "zero""{0} hodín",
            "past""{0} hodinami",
            "future-singular""{0} hodiny",
            "future-paucal""{0} hodín",
        },
        "day": {"past""dňom""future""deň"},
        "days": {
            "zero""{0} dní",
            "past""{0} dňami",
            "future-singular""{0} dni",
            "future-paucal""{0} dní",
        },
        "week": {"past""týždňom""future""týždeň"},
        "weeks": {
            "zero""{0} týždňov",
            "past""{0} týždňami",
            "future-singular""{0} týždne",
            "future-paucal""{0} týždňov",
        },
        "month": {"past""mesiacom""future""mesiac"},
        "months": {
            "zero""{0} mesiacov",
            "past""{0} mesiacmi",
            "future-singular""{0} mesiace",
            "future-paucal""{0} mesiacov",
        },
        "year": {"past""rokom""future""rok"},
        "years": {
            "zero""{0} rokov",
            "past""{0} rokmi",
            "future-singular""{0} roky",
            "future-paucal""{0} rokov",
        },
    }

    past = "Pred {0}"
    future = "O {0}"
    and_word = "a"

    month_names = [
        "",
        "január",
        "február",
        "marec",
        "apríl",
        "máj",
        "jún",
        "júl",
        "august",
        "september",
        "október",
        "november",
        "december",
    ]
    month_abbreviations = [
        "",
        "jan",
        "feb",
        "mar",
        "apr",
        "máj",
        "jún",
        "júl",
        "aug",
        "sep",
        "okt",
        "nov",
        "dec",
    ]

    day_names = [
        "",
        "pondelok",
        "utorok",
        "streda",
        "štvrtok",
        "piatok",
        "sobota",
        "nedeľa",
    ]
    day_abbreviations = ["""po""ut""st""št""pi""so""ne"]

    def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
        """Slovak aware time frame format function, takes into account
        the differences between past and future forms."""
        abs_delta = abs(delta)
        form = self.timeframes[timeframe]

        if isinstance(form, str):
            return form.format(abs_delta)

        if delta == 0:
            key = "zero"  # And *never* use 0 in the singular!
        elif delta < 0:
            key = "past"
        else:
            if "future-singular" not in form:
                key = "future"
            elif 2 <= abs_delta % 10 <= 4 and (
                abs_delta % 100 < 10 or abs_delta % 100 >= 20
            ):
                key = "future-singular"
            else:
                key = "future-paucal"

        form: str = form[key]
        return form.format(abs_delta)


class FarsiLocale(Locale):
    names = ["fa""fa-ir"]

    past = "{0} قبل"
    future = "در {0}"

    timeframes = {
        "now""اکنون",
        "second""یک لحظه",
        "seconds""{0} ثانیه",
        "minute""یک دقیقه",
        "minutes""{0} دقیقه",
        "hour""یک ساعت",
        "hours""{0} ساعت",
        "day""یک روز",
        "days""{0} روز",
        "month""یک ماه",
        "months""{0} ماه",
        "year""یک سال",
        "years""{0} سال",
    }

    meridians = {
        "am""قبل از ظهر",
        "pm""بعد از ظهر",
        "AM""قبل از ظهر",
        "PM""بعد از ظهر",
    }

    month_names = [
        "",
        "January",
        "February",
        "March",
        "April",
        "May",
        "June",
        "July",
        "August",
        "September",
        "October",
        "November",
        "December",
    ]
    month_abbreviations = [
        "",
        "Jan",
        "Feb",
        "Mar",
        "Apr",
        "May",
        "Jun",
        "Jul",
        "Aug",
        "Sep",
        "Oct",
        "Nov",
        "Dec",
    ]

    day_names = [
        "",
        "دو شنبه",
        "سه شنبه",
        "چهارشنبه",
        "پنجشنبه",
        "جمعه",
        "شنبه",
        "یکشنبه",
    ]
    day_abbreviations = ["""Mon""Tue""Wed""Thu""Fri""Sat""Sun"]


class HebrewLocale(Locale):
    names = ["he""he-il"]

    past = "לפני {0}"
    future = "בעוד {0}"
    and_word = "ו"

    timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
        "now""הרגע",
        "second""שנייה",
        "seconds""{0} שניות",
        "minute""דקה",
        "minutes""{0} דקות",
        "hour""שעה",
        "hours": {"2""שעתיים""ten""{0} שעות""higher""{0} שעות"},
        "day""יום",
        "days": {"2""יומיים""ten""{0} ימים""higher""{0} יום"},
        "week""שבוע",
        "weeks": {"2""שבועיים""ten""{0} שבועות""higher""{0} שבועות"},
        "month""חודש",
        "months": {"2""חודשיים""ten""{0} חודשים""higher""{0} חודשים"},
        "year""שנה",
        "years": {"2""שנתיים""ten""{0} שנים""higher""{0} שנה"},
    }

    meridians = {
        "am"'לפנ"צ',
        "pm"'אחר"צ',
        "AM""לפני הצהריים",
        "PM""אחרי הצהריים",
    }

    month_names = [
        "",
        "ינואר",
        "פברואר",
        "מרץ",
        "אפריל",
        "מאי",
        "יוני",
        "יולי",
        "אוגוסט",
        "ספטמבר",
        "אוקטובר",
        "נובמבר",
        "דצמבר",
    ]
    month_abbreviations = [
        "",
        "ינו׳",
        "פבר׳",
        "מרץ",
        "אפר׳",
        "מאי",
        "יוני",
        "יולי",
        "אוג׳",
        "ספט׳",
        "אוק׳",
        "נוב׳",
        "דצמ׳",
    ]

    day_names = ["""שני""שלישי""רביעי""חמישי""שישי""שבת""ראשון"]
    day_abbreviations = ["""ב׳""ג׳""ד׳""ה׳""ו׳""ש׳""א׳"]

    def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
        form = self.timeframes[timeframe]
        delta = abs(delta)
        if isinstance(form, Mapping):
            if delta == 2:
                form = form["2"]
            elif delta == 0 or 2 < delta <= 10:
                form = form["ten"]
            else:
                form = form["higher"]

        return form.format(delta)

    def describe_multi(
        self,
        timeframes: Sequence[Tuple[TimeFrameLiteral, Union[int, float]]],
        only_distance: bool = False,
    ) -> str:
        """Describes a delta within multiple timeframes in plain language.
        In Hebrew, the and word behaves a bit differently.

        :param timeframes: a list of string, quantity pairs each representing a timeframe and delta.
        :param only_distance: return only distance eg: "2 hours and 11 seconds" without "in" or "ago" keywords
        """

        humanized = ""
        for index, (timeframe, delta) in enumerate(timeframes):
            last_humanized = self._format_timeframe(timeframe, trunc(delta))
            if index == 0:
                humanized = last_humanized
            elif index == len(timeframes) - 1:  # Must have at least 2 items
                humanized += " " + self.and_word
                if last_humanized[0].isdecimal():
                    humanized += "־"
                humanized += last_humanized
            else:  # Don't add for the last one
                humanized += ", " + last_humanized

        if not only_distance:
            humanized = self._format_relative(humanized, timeframe, trunc(delta))

        return humanized


class MarathiLocale(Locale):
    names = ["mr"]

    past = "{0} आधी"
    future = "{0} नंतर"

    timeframes = {
        "now""सद्य",
        "second""एक सेकंद",
        "seconds""{0} सेकंद",
        "minute""एक मिनिट ",
        "minutes""{0} मिनिट ",
        "hour""एक तास",
        "hours""{0} तास",
        "day""एक दिवस",
        "days""{0} दिवस",
        "month""एक महिना ",
        "months""{0} महिने ",
        "year""एक वर्ष ",
        "years""{0} वर्ष ",
    }

    meridians = {"am""सकाळ""pm""संध्याकाळ""AM""सकाळ""PM""संध्याकाळ"}

    month_names = [
        "",
        "जानेवारी",
        "फेब्रुवारी",
        "मार्च",
        "एप्रिल",
        "मे",
        "जून",
        "जुलै",
        "अॉगस्ट",
        "सप्टेंबर",
        "अॉक्टोबर",
        "नोव्हेंबर",
        "डिसेंबर",
    ]
    month_abbreviations = [
        "",
        "जान",
        "फेब्रु",
        "मार्च",
        "एप्रि",
        "मे",
        "जून",
        "जुलै",
        "अॉग",
        "सप्टें",
        "अॉक्टो",
        "नोव्हें",
        "डिसें",
    ]

    day_names = [
        "",
        "सोमवार",
        "मंगळवार",
        "बुधवार",
        "गुरुवार",
        "शुक्रवार",
        "शनिवार",
        "रविवार",
    ]
    day_abbreviations = ["""सोम""मंगळ""बुध""गुरु""शुक्र""शनि""रवि"]


class CatalanLocale(Locale):
    names = ["ca""ca-es""ca-ad""ca-fr""ca-it"]
    past = "Fa {0}"
    future = "En {0}"
    and_word = "i"

    timeframes = {
        "now""Ara mateix",
        "second""un segon",
        "seconds""{0} segons",
        "minute""un minut",
        "minutes""{0} minuts",
        "hour""una hora",
        "hours""{0} hores",
        "day""un dia",
        "days""{0} dies",
        "month""un mes",
        "months""{0} mesos",
        "year""un any",
        "years""{0} anys",
    }

    month_names = [
        "",
        "gener",
        "febrer",
        "març",
        "abril",
        "maig",
        "juny",
        "juliol",
        "agost",
        "setembre",
        "octubre",
        "novembre",
        "desembre",
    ]
    month_abbreviations = [
        "",
        "gen.",
        "febr.",
        "març",
        "abr.",
        "maig",
        "juny",
        "jul.",
        "ag.",
        "set.",
        "oct.",
        "nov.",
        "des.",
    ]
    day_names = [
        "",
        "dilluns",
        "dimarts",
        "dimecres",
        "dijous",
        "divendres",
        "dissabte",
        "diumenge",
    ]
    day_abbreviations = [
        "",
        "dl.",
        "dt.",
        "dc.",
        "dj.",
        "dv.",
        "ds.",
        "dg.",
    ]


class BasqueLocale(Locale):
    names = ["eu""eu-eu"]
    past = "duela {0}"
    future = "{0}"  # I don't know what's the right phrase in Basque for the future.

    timeframes = {
        "now""Orain",
        "second""segundo bat",
        "seconds""{0} segundu",
        "minute""minutu bat",
        "minutes""{0} minutu",
        "hour""ordu bat",
        "hours""{0} ordu",
        "day""egun bat",
        "days""{0} egun",
        "month""hilabete bat",
        "months""{0} hilabet",
        "year""urte bat",
        "years""{0} urte",
    }

    month_names = [
        "",
        "urtarrilak",
        "otsailak",
        "martxoak",
        "apirilak",
        "maiatzak",
        "ekainak",
        "uztailak",
        "abuztuak",
        "irailak",
        "urriak",
        "azaroak",
        "abenduak",
    ]
    month_abbreviations = [
        "",
        "urt",
        "ots",
        "mar",
        "api",
        "mai",
        "eka",
        "uzt",
        "abu",
        "ira",
        "urr",
        "aza",
        "abe",
    ]
    day_names = [
        "",
        "astelehena",
        "asteartea",
        "asteazkena",
        "osteguna",
        "ostirala",
        "larunbata",
        "igandea",
    ]
    day_abbreviations = ["""al""ar""az""og""ol""lr""ig"]


class HungarianLocale(Locale):
    names = ["hu""hu-hu"]

    past = "{0} ezelőtt"
    future = "{0} múlva"

    timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
        "now""éppen most",
        "second": {"past""egy második""future""egy második"},
        "seconds": {"past""{0} másodpercekkel""future""{0} pár másodperc"},
        "minute": {"past""egy perccel""future""egy perc"},
        "minutes": {"past""{0} perccel""future""{0} perc"},
        "hour": {"past""egy órával""future""egy óra"},
        "hours": {"past""{0} órával""future""{0} óra"},
        "day": {"past""egy nappal""future""egy nap"},
        "days": {"past""{0} nappal""future""{0} nap"},
        "week": {"past""egy héttel""future""egy hét"},
        "weeks": {"past""{0} héttel""future""{0} hét"},
        "month": {"past""egy hónappal""future""egy hónap"},
        "months": {"past""{0} hónappal""future""{0} hónap"},
        "year": {"past""egy évvel""future""egy év"},
        "years": {"past""{0} évvel""future""{0} év"},
    }

    month_names = [
        "",
        "január",
        "február",
        "március",
        "április",
        "május",
        "június",
        "július",
        "augusztus",
        "szeptember",
        "október",
        "november",
        "december",
    ]
    month_abbreviations = [
        "",
        "jan",
        "febr",
        "márc",
        "ápr",
        "máj",
        "jún",
        "júl",
        "aug",
        "szept",
        "okt",
        "nov",
        "dec",
    ]

    day_names = [
        "",
        "hétfő",
        "kedd",
        "szerda",
        "csütörtök",
        "péntek",
        "szombat",
        "vasárnap",
    ]
    day_abbreviations = ["""hét""kedd""szer""csüt""pént""szom""vas"]

    meridians = {"am""de""pm""du""AM""DE""PM""DU"}

    def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
        form = self.timeframes[timeframe]

        if isinstance(form, Mapping):
            if delta > 0:
                form = form["future"]
            else:
                form = form["past"]

        return form.format(abs(delta))


class EsperantoLocale(Locale):
    names = ["eo""eo-xx"]
    past = "antaŭ {0}"
    future = "post {0}"

    timeframes = {
        "now""nun",
        "second""sekundo",
        "seconds""{0} kelkaj sekundoj",
        "minute""unu minuto",
        "minutes""{0} minutoj",
        "hour""un horo",
        "hours""{0} horoj",
        "day""unu tago",
        "days""{0} tagoj",
        "month""unu monato",
        "months""{0} monatoj",
        "year""unu jaro",
        "years""{0} jaroj",
    }

    month_names = [
        "",
        "januaro",
        "februaro",
        "marto",
        "aprilo",
        "majo",
        "junio",
        "julio",
        "aŭgusto",
        "septembro",
        "oktobro",
        "novembro",
        "decembro",
    ]
    month_abbreviations = [
        "",
        "jan",
        "feb",
        "mar",
        "apr",
        "maj",
        "jun",
        "jul",
        "aŭg",
        "sep",
        "okt",
        "nov",
        "dec",
    ]

    day_names = [
        "",
        "lundo",
        "mardo",
        "merkredo",
        "ĵaŭdo",
        "vendredo",
        "sabato",
        "dimanĉo",
    ]
    day_abbreviations = ["""lun""mar""mer""ĵaŭ""ven""sab""dim"]

    meridians = {"am""atm""pm""ptm""AM""ATM""PM""PTM"}

    ordinal_day_re = r"((?P<value>[1-3]?[0-9](?=a))a)"

    def _ordinal_number(self, n: int) -> str:
        return f"{n}a"


class ThaiLocale(Locale):
    names = ["th""th-th"]

    past = "{0} ที่ผ่านมา"
    future = "ในอีก {0}"

    timeframes = {
        "now""ขณะนี้",
        "second""วินาที",
        "seconds""{0} ไม่กี่วินาที",
        "minute""1 นาที",
        "minutes""{0} นาที",
        "hour""1 ชั่วโมง",
        "hours""{0} ชั่วโมง",
        "day""1 วัน",
        "days""{0} วัน",
        "month""1 เดือน",
        "months""{0} เดือน",
        "year""1 ปี",
        "years""{0} ปี",
    }

    month_names = [
        "",
        "มกราคม",
        "กุมภาพันธ์",
        "มีนาคม",
        "เมษายน",
        "พฤษภาคม",
        "มิถุนายน",
        "กรกฎาคม",
        "สิงหาคม",
        "กันยายน",
        "ตุลาคม",
        "พฤศจิกายน",
        "ธันวาคม",
    ]
    month_abbreviations = [
        "",
        "ม.ค.",
        "ก.พ.",
        "มี.ค.",
        "เม.ย.",
        "พ.ค.",
        "มิ.ย.",
        "ก.ค.",
        "ส.ค.",
        "ก.ย.",
        "ต.ค.",
        "พ.ย.",
        "ธ.ค.",
    ]

    day_names = ["""จันทร์""อังคาร""พุธ""พฤหัสบดี""ศุกร์""เสาร์""อาทิตย์"]
    day_abbreviations = ["""จ""อ""พ""พฤ""ศ""ส""อา"]

    meridians = {"am""am""pm""pm""AM""AM""PM""PM"}

    BE_OFFSET = 543

    def year_full(self, year: int) -> str:
        """Thai always use Buddhist Era (BE) which is CE + 543"""
        year += self.BE_OFFSET
        return f"{year:04d}"

    def year_abbreviation(self, year: int) -> str:
        """Thai always use Buddhist Era (BE) which is CE + 543"""
        year += self.BE_OFFSET
        return f"{year:04d}"[2:]

    def _format_relative(
        self,
        humanized: str,
        timeframe: TimeFrameLiteral,
        delta: Union[float, int],
    ) -> str:
        """Thai normally doesn't have any space between words"""
        if timeframe == "now":
            return humanized

        direction = self.past if delta < 0 else self.future
        relative_string = direction.format(humanized)

        if timeframe == "seconds":
            relative_string = relative_string.replace(" """)

        return relative_string


class LaotianLocale(Locale):
    names = ["lo""lo-la"]

    past = "{0} ກ່ອນຫນ້ານີ້"
    future = "ໃນ {0}"

    timeframes = {
        "now""ດຽວນີ້",
        "second""ວິນາທີ",
        "seconds""{0} ວິນາທີ",
        "minute""ນາທີ",
        "minutes""{0} ນາທີ",
        "hour""ຊົ່ວໂມງ",
        "hours""{0} ຊົ່ວໂມງ",
        "day""ມື້",
        "days""{0} ມື້",
        "week""ອາທິດ",
        "weeks""{0} ອາທິດ",
        "month""ເດືອນ",
        "months""{0} ເດືອນ",
        "year""ປີ",
        "years""{0} ປີ",
    }

    month_names = [
        "",
        "ມັງກອນ",  # mangkon
        "ກຸມພາ",  # kumpha
        "ມີນາ",  # mina
        "ເມສາ",  # mesa
        "ພຶດສະພາ",  # phudsapha
        "ມິຖຸນາ",  # mithuna
        "ກໍລະກົດ",  # kolakod
        "ສິງຫາ",  # singha
        "ກັນຍາ",  # knaia
        "ຕຸລາ",  # tula
        "ພະຈິກ",  # phachik
        "ທັນວາ",  # thanuaa
    ]
    month_abbreviations = [
        "",
        "ມັງກອນ",
        "ກຸມພາ",
        "ມີນາ",
        "ເມສາ",
        "ພຶດສະພາ",
        "ມິຖຸນາ",
        "ກໍລະກົດ",
        "ສິງຫາ",
        "ກັນຍາ",
        "ຕຸລາ",
        "ພະຈິກ",
        "ທັນວາ",
    ]

    day_names = [
        "",
        "ວັນຈັນ",  # vanchan
        "ວັນອັງຄານ",  # vnoangkhan
        "ວັນພຸດ",  # vanphud
        "ວັນພະຫັດ",  # vanphahad
        "ວັນ​ສຸກ",  # vansuk
        "ວັນເສົາ",  # vansao
        "ວັນອາທິດ",  # vnoathid
    ]
    day_abbreviations = [
        "",
        "ວັນຈັນ",
        "ວັນອັງຄານ",
        "ວັນພຸດ",
        "ວັນພະຫັດ",
        "ວັນ​ສຸກ",
        "ວັນເສົາ",
        "ວັນອາທິດ",
    ]

    BE_OFFSET = 543

    def year_full(self, year: int) -> str:
        """Lao always use Buddhist Era (BE) which is CE + 543"""
        year += self.BE_OFFSET
        return f"{year:04d}"

    def year_abbreviation(self, year: int) -> str:
        """Lao always use Buddhist Era (BE) which is CE + 543"""
        year += self.BE_OFFSET
        return f"{year:04d}"[2:]

    def _format_relative(
        self,
        humanized: str,
        timeframe: TimeFrameLiteral,
        delta: Union[float, int],
    ) -> str:
        """Lao normally doesn't have any space between words"""
        if timeframe == "now":
            return humanized

        direction = self.past if delta < 0 else self.future
        relative_string = direction.format(humanized)

        if timeframe == "seconds":
            relative_string = relative_string.replace(" """)

        return relative_string


class BengaliLocale(Locale):
    names = ["bn""bn-bd""bn-in"]

    past = "{0} আগে"
    future = "{0} পরে"

    timeframes = {
        "now""এখন",
        "second""একটি দ্বিতীয়",
        "seconds""{0} সেকেন্ড",
        "minute""এক মিনিট",
        "minutes""{0} মিনিট",
        "hour""এক ঘণ্টা",
        "hours""{0} ঘণ্টা",
        "day""এক দিন",
        "days""{0} দিন",
        "month""এক মাস",
        "months""{0} মাস ",
        "year""এক বছর",
        "years""{0} বছর",
    }

    meridians = {"am""সকাল""pm""বিকাল""AM""সকাল""PM""বিকাল"}

    month_names = [
        "",
        "জানুয়ারি",
        "ফেব্রুয়ারি",
        "মার্চ",
        "এপ্রিল",
        "মে",
        "জুন",
        "জুলাই",
        "আগস্ট",
        "সেপ্টেম্বর",
        "অক্টোবর",
        "নভেম্বর",
        "ডিসেম্বর",
    ]
    month_abbreviations = [
        "",
        "জানু",
        "ফেব",
        "মার্চ",
        "এপ্রি",
        "মে",
        "জুন",
        "জুল",
        "অগা",
        "সেপ্ট",
        "অক্টো",
        "নভে",
        "ডিসে",
    ]

    day_names = [
        "",
        "সোমবার",
        "মঙ্গলবার",
        "বুধবার",
        "বৃহস্পতিবার",
        "শুক্রবার",
        "শনিবার",
        "রবিবার",
    ]
    day_abbreviations = ["""সোম""মঙ্গল""বুধ""বৃহঃ""শুক্র""শনি""রবি"]

    def _ordinal_number(self, n: int) -> str:
        if n > 10 or n == 0:
            return f"{n}তম"
        if n in [1578910]:
            return f"{n}ম"
        if n in [23]:
            return f"{n}য়"
        if n == 4:
            return f"{n}র্থ"
        if n == 6:
            return f"{n}ষ্ঠ"
        return ""


class RomanshLocale(Locale):
    names = ["rm""rm-ch"]

    past = "avant {0}"
    future = "en {0}"

    timeframes = {
        "now""en quest mument",
        "second""in secunda",
        "seconds""{0} secundas",
        "minute""ina minuta",
        "minutes""{0} minutas",
        "hour""in'ura",
        "hours""{0} ura",
        "day""in di",
        "days""{0} dis",
        "week""in'emna",
        "weeks""{0} emnas",
        "month""in mais",
        "months""{0} mais",
        "year""in onn",
        "years""{0} onns",
    }

    month_names = [
        "",
        "schaner",
        "favrer",
        "mars",
        "avrigl",
        "matg",
        "zercladur",
        "fanadur",
        "avust",
        "settember",
        "october",
        "november",
        "december",
    ]

    month_abbreviations = [
        "",
        "schan",
        "fav",
        "mars",
        "avr",
        "matg",
        "zer",
        "fan",
        "avu",
        "set",
        "oct",
        "nov",
        "dec",
    ]

    day_names = [
        "",
        "glindesdi",
        "mardi",
        "mesemna",
        "gievgia",
        "venderdi",
        "sonda",
        "dumengia",
    ]

    day_abbreviations = ["""gli""ma""me""gie""ve""so""du"]


class RomanianLocale(Locale):
    names = ["ro""ro-ro"]

    past = "{0} în urmă"
    future = "peste {0}"
    and_word = "și"

    timeframes = {
        "now""acum",
        "second""o secunda",
        "seconds""{0} câteva secunde",
        "minute""un minut",
        "minutes""{0} minute",
        "hour""o oră",
        "hours""{0} ore",
        "day""o zi",
        "days""{0} zile",
        "month""o lună",
        "months""{0} luni",
        "year""un an",
        "years""{0} ani",
    }

    month_names = [
        "",
        "ianuarie",
        "februarie",
        "martie",
        "aprilie",
        "mai",
        "iunie",
        "iulie",
        "august",
        "septembrie",
        "octombrie",
        "noiembrie",
        "decembrie",
    ]
    month_abbreviations = [
        "",
        "ian",
        "febr",
        "mart",
        "apr",
        "mai",
        "iun",
        "iul",
        "aug",
        "sept",
        "oct",
        "nov",
        "dec",
    ]

    day_names = [
        "",
        "luni",
        "marți",
        "miercuri",
        "joi",
        "vineri",
        "sâmbătă",
        "duminică",
    ]
    day_abbreviations = ["""Lun""Mar""Mie""Joi""Vin""Sâm""Dum"]


class SlovenianLocale(Locale):
    names = ["sl""sl-si"]

    past = "pred {0}"
    future = "čez {0}"
    and_word = "in"

    timeframes = {
        "now""zdaj",
        "second""sekundo",
        "seconds""{0} sekund",
        "minute""minuta",
        "minutes""{0} minutami",
        "hour""uro",
        "hours""{0} ur",
        "day""dan",
        "days""{0} dni",
        "month""mesec",
        "months""{0} mesecev",
        "year""leto",
        "years""{0} let",
    }

    meridians = {"am""""pm""""AM""""PM"""}

    month_names = [
        "",
        "Januar",
        "Februar",
        "Marec",
        "April",
        "Maj",
        "Junij",
        "Julij",
        "Avgust",
        "September",
        "Oktober",
        "November",
        "December",
    ]

    month_abbreviations = [
        "",
        "Jan",
        "Feb",
        "Mar",
        "Apr",
        "Maj",
        "Jun",
        "Jul",
        "Avg",
        "Sep",
        "Okt",
        "Nov",
        "Dec",
    ]

    day_names = [
        "",
        "Ponedeljek",
        "Torek",
        "Sreda",
        "Četrtek",
        "Petek",
        "Sobota",
        "Nedelja",
    ]

    day_abbreviations = ["""Pon""Tor""Sre""Čet""Pet""Sob""Ned"]


class IndonesianLocale(Locale):
    names = ["id""id-id"]

    past = "{0} yang lalu"
    future = "dalam {0}"
    and_word = "dan"

    timeframes = {
        "now""baru saja",
        "second""1 sebentar",
        "seconds""{0} detik",
        "minute""1 menit",
        "minutes""{0} menit",
        "hour""1 jam",
        "hours""{0} jam",
        "day""1 hari",
        "days""{0} hari",
        "week""1 minggu",
        "weeks""{0} minggu",
        "month""1 bulan",
        "months""{0} bulan",
        "quarter""1 kuartal",
        "quarters""{0} kuartal",
        "year""1 tahun",
        "years""{0} tahun",
    }

    meridians = {"am""""pm""""AM""""PM"""}

    month_names = [
        "",
        "Januari",
        "Februari",
        "Maret",
        "April",
        "Mei",
        "Juni",
        "Juli",
        "Agustus",
        "September",
        "Oktober",
        "November",
        "Desember",
    ]

    month_abbreviations = [
        "",
        "Jan",
        "Feb",
        "Mar",
        "Apr",
        "Mei",
        "Jun",
        "Jul",
        "Ags",
        "Sept",
        "Okt",
        "Nov",
        "Des",
    ]

    day_names = ["""Senin""Selasa""Rabu""Kamis""Jumat""Sabtu""Minggu"]

    day_abbreviations = [
        "",
        "Senin",
        "Selasa",
        "Rabu",
        "Kamis",
        "Jumat",
        "Sabtu",
        "Minggu",
    ]


class NepaliLocale(Locale):
    names = ["ne""ne-np"]

    past = "{0} पहिले"
    future = "{0} पछी"

    timeframes = {
        "now""अहिले",
        "second""एक सेकेन्ड",
        "seconds""{0} सेकण्ड",
        "minute""मिनेट",
        "minutes""{0} मिनेट",
        "hour""एक घण्टा",
        "hours""{0} घण्टा",
        "day""एक दिन",
        "days""{0} दिन",
        "month""एक महिना",
        "months""{0} महिना",
        "year""एक बर्ष",
        "years""{0} बर्ष",
    }

    meridians = {"am""पूर्वाह्न""pm""अपरान्ह""AM""पूर्वाह्न""PM""अपरान्ह"}

    month_names = [
        "",
        "जनवरी",
        "फेब्रुअरी",
        "मार्च",
        "एप्रील",
        "मे",
        "जुन",
        "जुलाई",
        "अगष्ट",
        "सेप्टेम्बर",
        "अक्टोबर",
        "नोवेम्बर",
        "डिसेम्बर",
    ]
    month_abbreviations = [
        "",
        "जन",
        "फेब",
        "मार्च",
        "एप्रील",
        "मे",
        "जुन",
        "जुलाई",
        "अग",
        "सेप",
        "अक्ट",
        "नोव",
        "डिस",
    ]

    day_names = [
        "",
        "सोमवार",
        "मंगलवार",
        "बुधवार",
        "बिहिवार",
        "शुक्रवार",
        "शनिवार",
        "आइतवार",
    ]

    day_abbreviations = ["""सोम""मंगल""बुध""बिहि""शुक्र""शनि""आइत"]


class EstonianLocale(Locale):
    names = ["ee""et"]

    past = "{0} tagasi"
    future = "{0} pärast"
    and_word = "ja"

    timeframes: ClassVar[Mapping[TimeFrameLiteral, Mapping[str, str]]] = {
        "now": {"past""just nüüd""future""just nüüd"},
        "second": {"past""üks sekund""future""ühe sekundi"},
        "seconds": {"past""{0} sekundit""future""{0} sekundi"},
        "minute": {"past""üks minut""future""ühe minuti"},
        "minutes": {"past""{0} minutit""future""{0} minuti"},
        "hour": {"past""tund aega""future""tunni aja"},
        "hours": {"past""{0} tundi""future""{0} tunni"},
        "day": {"past""üks päev""future""ühe päeva"},
        "days": {"past""{0} päeva""future""{0} päeva"},
        "month": {"past""üks kuu""future""ühe kuu"},
        "months": {"past""{0} kuud""future""{0} kuu"},
        "year": {"past""üks aasta""future""ühe aasta"},
        "years": {"past""{0} aastat""future""{0} aasta"},
    }

    month_names = [
        "",
        "Jaanuar",
        "Veebruar",
        "Märts",
        "Aprill",
        "Mai",
        "Juuni",
        "Juuli",
        "August",
        "September",
        "Oktoober",
        "November",
        "Detsember",
    ]
    month_abbreviations = [
        "",
        "Jan",
        "Veb",
        "Mär",
        "Apr",
        "Mai",
        "Jun",
        "Jul",
        "Aug",
        "Sep",
        "Okt",
        "Nov",
        "Dets",
    ]

    day_names = [
        "",
        "Esmaspäev",
        "Teisipäev",
        "Kolmapäev",
        "Neljapäev",
        "Reede",
        "Laupäev",
        "Pühapäev",
    ]
    day_abbreviations = ["""Esm""Teis""Kolm""Nelj""Re""Lau""Püh"]

    def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
        form = self.timeframes[timeframe]
        if delta > 0:
            _form = form["future"]
        else:
            _form = form["past"]
        return _form.format(abs(delta))


class LatvianLocale(Locale):
    names = ["lv""lv-lv"]

    past = "pirms {0}"
    future = "pēc {0}"
    and_word = "un"

    timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
        "now""tagad",
        "second""sekundes",
        "seconds""{0} sekundēm",
        "minute""minūtes",
        "minutes""{0} minūtēm",
        "hour""stundas",
        "hours""{0} stundām",
        "day""dienas",
        "days""{0} dienām",
        "week""nedēļas",
        "weeks""{0} nedēļām",
        "month""mēneša",
        "months""{0} mēnešiem",
        "year""gada",
        "years""{0} gadiem",
    }

    month_names = [
        "",
        "janvāris",
        "februāris",
        "marts",
        "aprīlis",
        "maijs",
        "jūnijs",
        "jūlijs",
        "augusts",
        "septembris",
        "oktobris",
        "novembris",
        "decembris",
    ]

    month_abbreviations = [
        "",
        "jan",
        "feb",
        "marts",
        "apr",
        "maijs",
        "jūnijs",
        "jūlijs",
        "aug",
        "sept",
        "okt",
        "nov",
        "dec",
    ]

    day_names = [
        "",
        "pirmdiena",
        "otrdiena",
        "trešdiena",
        "ceturtdiena",
        "piektdiena",
        "sestdiena",
        "svētdiena",
    ]

    day_abbreviations = [
        "",
        "pi",
        "ot",
        "tr",
        "ce",
        "pi",
        "se",
        "sv",
    ]


class SwahiliLocale(Locale):
    names = [
        "sw",
        "sw-ke",
        "sw-tz",
    ]

    past = "{0} iliyopita"
    future = "muda wa {0}"
    and_word = "na"

    timeframes = {
        "now""sasa hivi",
        "second""sekunde",
        "seconds""sekunde {0}",
        "minute""dakika moja",
        "minutes""dakika {0}",
        "hour""saa moja",
        "hours""saa {0}",
        "day""siku moja",
        "days""siku {0}",
        "week""wiki moja",
        "weeks""wiki {0}",
        "month""mwezi moja",
        "months""miezi {0}",
        "year""mwaka moja",
        "years""miaka {0}",
    }

    meridians = {"am""asu""pm""mch""AM""ASU""PM""MCH"}

    month_names = [
        "",
        "Januari",
        "Februari",
        "Machi",
        "Aprili",
        "Mei",
        "Juni",
        "Julai",
        "Agosti",
        "Septemba",
        "Oktoba",
        "Novemba",
        "Desemba",
    ]
    month_abbreviations = [
        "",
        "Jan",
        "Feb",
        "Mac",
        "Apr",
        "Mei",
        "Jun",
        "Jul",
        "Ago",
        "Sep",
        "Okt",
        "Nov",
        "Des",
    ]

    day_names = [
        "",
        "Jumatatu",
        "Jumanne",
        "Jumatano",
        "Alhamisi",
        "Ijumaa",
        "Jumamosi",
        "Jumapili",
    ]
    day_abbreviations = [
        "",
        "Jumatatu",
        "Jumanne",
        "Jumatano",
        "Alhamisi",
        "Ijumaa",
        "Jumamosi",
        "Jumapili",
    ]


class CroatianLocale(Locale):
    names = ["hr""hr-hr"]

    past = "prije {0}"
    future = "za {0}"
    and_word = "i"

    timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
        "now""upravo sad",
        "second""sekundu",
        "seconds": {"double""{0} sekunde""higher""{0} sekundi"},
        "minute""minutu",
        "minutes": {"double""{0} minute""higher""{0} minuta"},
        "hour""sat",
        "hours": {"double""{0} sata""higher""{0} sati"},
        "day""jedan dan",
        "days": {"double""{0} dana""higher""{0} dana"},
        "week""tjedan",
        "weeks": {"double""{0} tjedna""higher""{0} tjedana"},
        "month""mjesec",
        "months": {"double""{0} mjeseca""higher""{0} mjeseci"},
        "year""godinu",
        "years": {"double""{0} godine""higher""{0} godina"},
    }

    month_names = [
        "",
        "siječanj",
        "veljača",
        "ožujak",
        "travanj",
        "svibanj",
        "lipanj",
        "srpanj",
        "kolovoz",
        "rujan",
        "listopad",
        "studeni",
        "prosinac",
    ]

    month_abbreviations = [
        "",
        "siječ",
        "velj",
        "ožuj",
        "trav",
        "svib",
        "lip",
        "srp",
        "kol",
        "ruj",
        "list",
        "stud",
        "pros",
    ]

    day_names = [
        "",
        "ponedjeljak",
        "utorak",
        "srijeda",
        "četvrtak",
        "petak",
        "subota",
        "nedjelja",
    ]

    day_abbreviations = [
        "",
        "po",
        "ut",
        "sr",
        "če",
        "pe",
        "su",
        "ne",
    ]

    def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
        form = self.timeframes[timeframe]
        delta = abs(delta)
        if isinstance(form, Mapping):
            if 1 < delta <= 4:
                form = form["double"]
            else:
                form = form["higher"]

        return form.format(delta)


class LatinLocale(Locale):
    names = ["la""la-va"]

    past = "ante {0}"
    future = "in {0}"
    and_word = "et"

    timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
        "now""nunc",
        "second""secundum",
        "seconds""{0} secundis",
        "minute""minutam",
        "minutes""{0} minutis",
        "hour""horam",
        "hours""{0} horas",
        "day""diem",
        "days""{0} dies",
        "week""hebdomadem",
        "weeks""{0} hebdomades",
        "month""mensem",
        "months""{0} mensis",
        "year""annum",
        "years""{0} annos",
    }

    month_names = [
        "",
        "Ianuarius",
        "Februarius",
        "Martius",
        "Aprilis",
        "Maius",
        "Iunius",
        "Iulius",
        "Augustus",
        "September",
        "October",
        "November",
        "December",
    ]

    month_abbreviations = [
        "",
        "Ian",
        "Febr",
        "Mart",
        "Apr",
        "Mai",
        "Iun",
        "Iul",
        "Aug",
        "Sept",
        "Oct",
        "Nov",
        "Dec",
    ]

    day_names = [
        "",
        "dies Lunae",
        "dies Martis",
        "dies Mercurii",
        "dies Iovis",
        "dies Veneris",
        "dies Saturni",
        "dies Solis",
    ]

    day_abbreviations = [
        "",
        "dies Lunae",
        "dies Martis",
        "dies Mercurii",
        "dies Iovis",
        "dies Veneris",
        "dies Saturni",
        "dies Solis",
    ]


class LithuanianLocale(Locale):
    names = ["lt""lt-lt"]

    past = "prieš {0}"
    future = "po {0}"
    and_word = "ir"

    timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
        "now""dabar",
        "second""sekundės",
        "seconds""{0} sekundžių",
        "minute""minutės",
        "minutes""{0} minučių",
        "hour""valandos",
        "hours""{0} valandų",
        "day""dieną",
        "days""{0} dienų",
        "week""savaitės",
        "weeks""{0} savaičių",
        "month""mėnesio",
        "months""{0} mėnesių",
        "year""metų",
        "years""{0} metų",
    }

    month_names = [
        "",
        "sausis",
        "vasaris",
        "kovas",
        "balandis",
        "gegužė",
        "birželis",
        "liepa",
        "rugpjūtis",
        "rugsėjis",
        "spalis",
        "lapkritis",
        "gruodis",
    ]

    month_abbreviations = [
        "",
        "saus",
        "vas",
        "kovas",
        "bal",
        "geg",
        "birž",
        "liepa",
        "rugp",
        "rugs",
        "spalis",
        "lapkr",
        "gr",
    ]

    day_names = [
        "",
        "pirmadienis",
        "antradienis",
        "trečiadienis",
        "ketvirtadienis",
        "penktadienis",
        "šeštadienis",
        "sekmadienis",
    ]

    day_abbreviations = [
        "",
        "pi",
        "an",
        "tr",
        "ke",
        "pe",
        "še",
        "se",
    ]


class MalayLocale(Locale):
    names = ["ms""ms-my""ms-bn"]

    past = "{0} yang lalu"
    future = "dalam {0}"
    and_word = "dan"

    timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
        "now""sekarang",
        "second""saat",
        "seconds""{0} saat",
        "minute""minit",
        "minutes""{0} minit",
        "hour""jam",
        "hours""{0} jam",
        "day""hari",
        "days""{0} hari",
        "week""minggu",
        "weeks""{0} minggu",
        "month""bulan",
        "months""{0} bulan",
        "year""tahun",
        "years""{0} tahun",
    }

    month_names = [
        "",
        "Januari",
        "Februari",
        "Mac",
        "April",
        "Mei",
        "Jun",
        "Julai",
        "Ogos",
        "September",
        "Oktober",
        "November",
        "Disember",
    ]

    month_abbreviations = [
        "",
        "Jan.",
        "Feb.",
        "Mac",
        "Apr.",
        "Mei",
        "Jun",
        "Julai",
        "Og.",
        "Sept.",
        "Okt.",
        "Nov.",
        "Dis.",
    ]

    day_names = [
        "",
        "Isnin",
        "Selasa",
        "Rabu",
        "Khamis",
        "Jumaat",
        "Sabtu",
        "Ahad",
    ]

    day_abbreviations = [
        "",
        "Isnin",
        "Selasa",
        "Rabu",
        "Khamis",
        "Jumaat",
        "Sabtu",
        "Ahad",
    ]


class MalteseLocale(Locale):
    names = ["mt""mt-mt"]

    past = "{0} ilu"
    future = "fi {0}"
    and_word = "u"

    timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
        "now""issa",
        "second""sekonda",
        "seconds""{0} sekondi",
        "minute""minuta",
        "minutes""{0} minuti",
        "hour""siegħa",
        "hours": {"dual""{0} sagħtejn""plural""{0} sigħat"},
        "day""jum",
        "days": {"dual""{0} jumejn""plural""{0} ijiem"},
        "week""ġimgħa",
        "weeks": {"dual""{0} ġimagħtejn""plural""{0} ġimgħat"},
        "month""xahar",
        "months": {"dual""{0} xahrejn""plural""{0} xhur"},
        "year""sena",
        "years": {"dual""{0} sentejn""plural""{0} snin"},
    }

    month_names = [
        "",
        "Jannar",
        "Frar",
        "Marzu",
        "April",
        "Mejju",
        "Ġunju",
        "Lulju",
        "Awwissu",
        "Settembru",
        "Ottubru",
        "Novembru",
        "Diċembru",
    ]

    month_abbreviations = [
        "",
        "Jan",
        "Fr",
        "Mar",
        "Apr",
        "Mejju",
        "Ġun",
        "Lul",
        "Aw",
        "Sett",
        "Ott",
        "Nov",
        "Diċ",
    ]

    day_names = [
        "",
        "It-Tnejn",
        "It-Tlieta",
        "L-Erbgħa",
        "Il-Ħamis",
        "Il-Ġimgħa",
        "Is-Sibt",
        "Il-Ħadd",
    ]

    day_abbreviations = [
        "",
        "T",
        "TL",
        "E",
        "Ħ",
        "Ġ",
        "S",
        "Ħ",
    ]

    def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
        form = self.timeframes[timeframe]
        delta = abs(delta)
        if isinstance(form, Mapping):
            if delta == 2:
                form = form["dual"]
            else:
                form = form["plural"]

        return form.format(delta)


class SamiLocale(Locale):
    names = ["se""se-fi""se-no""se-se"]

    past = "{0} dassái"
    future = "{0} "  # NOTE: couldn't find preposition for Sami here, none needed?

    timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
        "now""dál",
        "second""sekunda",
        "seconds""{0} sekundda",
        "minute""minuhta",
        "minutes""{0} minuhta",
        "hour""diimmu",
        "hours""{0} diimmu",
        "day""beaivvi",
        "days""{0} beaivvi",
        "week""vahku",
        "weeks""{0} vahku",
        "month""mánu",
        "months""{0} mánu",
        "year""jagi",
        "years""{0} jagi",
    }

    month_names = [
        "",
        "Ođđajagimánnu",
        "Guovvamánnu",
        "Njukčamánnu",
        "Cuoŋománnu",
        "Miessemánnu",
        "Geassemánnu",
        "Suoidnemánnu",
        "Borgemánnu",
        "Čakčamánnu",
        "Golggotmánnu",
        "Skábmamánnu",
        "Juovlamánnu",
    ]

    month_abbreviations = [
        "",
        "Ođđajagimánnu",
        "Guovvamánnu",
        "Njukčamánnu",
        "Cuoŋománnu",
        "Miessemánnu",
        "Geassemánnu",
        "Suoidnemánnu",
        "Borgemánnu",
        "Čakčamánnu",
        "Golggotmánnu",
        "Skábmamánnu",
        "Juovlamánnu",
    ]

    day_names = [
        "",
        "Mánnodat",
        "Disdat",
        "Gaskavahkku",
        "Duorastat",
        "Bearjadat",
        "Lávvordat",
        "Sotnabeaivi",
    ]

    day_abbreviations = [
        "",
        "Mánnodat",
        "Disdat",
        "Gaskavahkku",
        "Duorastat",
        "Bearjadat",
        "Lávvordat",
        "Sotnabeaivi",
    ]


class OdiaLocale(Locale):
    names = ["or""or-in"]

    past = "{0} ପୂର୍ବେ"
    future = "{0} ପରେ"

    timeframes = {
        "now""ବର୍ତ୍ତମାନ",
        "second""ଏକ ସେକେଣ୍ଡ",
        "seconds""{0} ସେକେଣ୍ଡ",
        "minute""ଏକ ମିନଟ",
        "minutes""{0} ମିନଟ",
        "hour""ଏକ ଘଣ୍ଟା",
        "hours""{0} ଘଣ୍ଟା",
        "day""ଏକ ଦିନ",
        "days""{0} ଦିନ",
        "month""ଏକ ମାସ",
        "months""{0} ମାସ ",
        "year""ଏକ ବର୍ଷ",
        "years""{0} ବର୍ଷ",
    }

    meridians = {"am""ପୂର୍ବାହ୍ନ""pm""ଅପରାହ୍ନ""AM""ପୂର୍ବାହ୍ନ""PM""ଅପରାହ୍ନ"}

    month_names = [
        "",
        "ଜାନୁଆରୀ",
        "ଫେବୃଆରୀ",
        "ମାର୍ଚ୍ଚ୍",
        "ଅପ୍ରେଲ",
        "ମଇ",
        "ଜୁନ୍",
        "ଜୁଲାଇ",
        "ଅଗଷ୍ଟ",
        "ସେପ୍ଟେମ୍ବର",
        "ଅକ୍ଟୋବର୍",
        "ନଭେମ୍ବର୍",
        "ଡିସେମ୍ବର୍",
    ]
    month_abbreviations = [
        "",
        "ଜାନୁ",
        "ଫେବୃ",
        "ମାର୍ଚ୍ଚ୍",
        "ଅପ୍ରେ",
        "ମଇ",
        "ଜୁନ୍",
        "ଜୁଲା",
        "ଅଗ",
        "ସେପ୍ଟେ",
        "ଅକ୍ଟୋ",
        "ନଭେ",
        "ଡିସେ",
    ]

    day_names = [
        "",
        "ସୋମବାର",
        "ମଙ୍ଗଳବାର",
        "ବୁଧବାର",
        "ଗୁରୁବାର",
        "ଶୁକ୍ରବାର",
        "ଶନିବାର",
        "ରବିବାର",
    ]
    day_abbreviations = [
        "",
        "ସୋମ",
        "ମଙ୍ଗଳ",
        "ବୁଧ",
        "ଗୁରୁ",
        "ଶୁକ୍ର",
        "ଶନି",
        "ରବି",
    ]

    def _ordinal_number(self, n: int) -> str:
        if n > 10 or n == 0:
            return f"{n}ତମ"
        if n in [1578910]:
            return f"{n}ମ"
        if n in [23]:
            return f"{n}ୟ"
        if n == 4:
            return f"{n}ର୍ଥ"
        if n == 6:
            return f"{n}ଷ୍ଠ"
        return ""


class SerbianLocale(Locale):
    names = ["sr""sr-rs""sr-sp"]

    past = "pre {0}"
    future = "za {0}"
    and_word = "i"

    timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
        "now""sada",
        "second""sekundu",
        "seconds": {"double""{0} sekunde""higher""{0} sekundi"},
        "minute""minutu",
        "minutes": {"double""{0} minute""higher""{0} minuta"},
        "hour""sat",
        "hours": {"double""{0} sata""higher""{0} sati"},
        "day""dan",
        "days": {"double""{0} dana""higher""{0} dana"},
        "week""nedelju",
        "weeks": {"double""{0} nedelje""higher""{0} nedelja"},
        "month""mesec",
        "months": {"double""{0} meseca""higher""{0} meseci"},
        "year""godinu",
        "years": {"double""{0} godine""higher""{0} godina"},
    }

    month_names = [
        "",
        "januar",  # јануар
        "februar",  # фебруар
        "mart",  # март
        "april",  # април
        "maj",  # мај
        "jun",  # јун
        "jul",  # јул
        "avgust",  # август
        "septembar",  # септембар
        "oktobar",  # октобар
        "novembar",  # новембар
        "decembar",  # децембар
    ]

    month_abbreviations = [
        "",
        "jan",
        "feb",
        "mar",
        "apr",
        "maj",
        "jun",
        "jul",
        "avg",
        "sep",
        "okt",
        "nov",
        "dec",
    ]

    day_names = [
        "",
        "ponedeljak",  # понедељак
        "utorak",  # уторак
        "sreda",  # среда
        "četvrtak",  # четвртак
        "petak",  # петак
        "subota",  # субота
        "nedelja",  # недеља
    ]

    day_abbreviations = [
        "",
        "po",  # по
        "ut",  # ут
        "sr",  # ср
        "če",  # че
        "pe",  # пе
        "su",  # су
        "ne",  # не
    ]

    def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
        form = self.timeframes[timeframe]
        delta = abs(delta)
        if isinstance(form, Mapping):
            if 1 < delta <= 4:
                form = form["double"]
            else:
                form = form["higher"]

        return form.format(delta)


class LuxembourgishLocale(Locale):
    names = ["lb""lb-lu"]

    past = "virun {0}"
    future = "an {0}"
    and_word = "an"

    timeframes: ClassVar[Dict[TimeFrameLiteral, str]] = {
        "now""just elo",
        "second""enger Sekonn",
        "seconds""{0} Sekonnen",
        "minute""enger Minutt",
        "minutes""{0} Minutten",
        "hour""enger Stonn",
        "hours""{0} Stonnen",
        "day""engem Dag",
        "days""{0} Deeg",
        "week""enger Woch",
        "weeks""{0} Wochen",
        "month""engem Mount",
        "months""{0} Méint",
        "year""engem Joer",
        "years""{0} Jahren",
    }

    timeframes_only_distance = timeframes.copy()
    timeframes_only_distance["second"] = "eng Sekonn"
    timeframes_only_distance["minute"] = "eng Minutt"
    timeframes_only_distance["hour"] = "eng Stonn"
    timeframes_only_distance["day"] = "een Dag"
    timeframes_only_distance["days"] = "{0} Deeg"
    timeframes_only_distance["week"] = "eng Woch"
    timeframes_only_distance["month"] = "ee Mount"
    timeframes_only_distance["months"] = "{0} Méint"
    timeframes_only_distance["year"] = "ee Joer"
    timeframes_only_distance["years"] = "{0} Joer"

    month_names = [
        "",
        "Januar",
        "Februar",
        "Mäerz",
        "Abrëll",
        "Mee",
        "Juni",
        "Juli",
        "August",
        "September",
        "Oktouber",
        "November",
        "Dezember",
    ]

    month_abbreviations = [
        "",
        "Jan",
        "Feb",
        "Mäe",
        "Abr",
        "Mee",
        "Jun",
        "Jul",
        "Aug",
        "Sep",
        "Okt",
        "Nov",
        "Dez",
    ]

    day_names = [
        "",
        "Méindeg",
        "Dënschdeg",
        "Mëttwoch",
        "Donneschdeg",
        "Freideg",
        "Samschdeg",
        "Sonndeg",
    ]

    day_abbreviations = ["""Méi""Dën""Mët""Don""Fre""Sam""Son"]

    def _ordinal_number(self, n: int) -> str:
        return f"{n}."

    def describe(
        self,
        timeframe: TimeFrameLiteral,
        delta: Union[int, float] = 0,
        only_distance: bool = False,
    ) -> str:
        if not only_distance:
            return super().describe(timeframe, delta, only_distance)

        # Luxembourgish uses a different case without 'in' or 'ago'
        humanized: str = self.timeframes_only_distance[timeframe].format(
            trunc(abs(delta))
        )

        return humanized


class ZuluLocale(Locale):
    names = ["zu""zu-za"]

    past = "{0} edlule"
    future = "{0} "
    and_word = "futhi"

    timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[Mapping[str, str], str]]] = {
        "now""manje",
        "second": {"past""umzuzwana""future""ngomzuzwana"},
        "seconds": {"past""{0} imizuzwana""future""{0} ngemizuzwana"},
        "minute": {"past""umzuzu""future""ngomzuzu"},
        "minutes": {"past""{0} imizuzu""future""{0} ngemizuzu"},
        "hour": {"past""ihora""future""ngehora"},
        "hours": {"past""{0} amahora""future""{0} emahoreni"},
        "day": {"past""usuku""future""ngosuku"},
        "days": {"past""{0} izinsuku""future""{0} ezinsukwini"},
        "week": {"past""isonto""future""ngesonto"},
        "weeks": {"past""{0} amasonto""future""{0} emasontweni"},
        "month": {"past""inyanga""future""ngenyanga"},
        "months": {"past""{0} izinyanga""future""{0} ezinyangeni"},
        "year": {"past""unyaka""future""ngonyak"},
        "years": {"past""{0} iminyaka""future""{0} eminyakeni"},
    }

    def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
        """Zulu aware time frame format function, takes into account
        the differences between past and future forms."""
        abs_delta = abs(delta)
        form = self.timeframes[timeframe]

        if isinstance(form, str):
            return form.format(abs_delta)

        if delta > 0:
            key = "future"
        else:
            key = "past"
        form = form[key]

        return form.format(abs_delta)

    month_names = [
        "",
        "uMasingane",
        "uNhlolanja",
        "uNdasa",
        "UMbasa",
        "UNhlaba",
        "UNhlangulana",
        "uNtulikazi",
        "UNcwaba",
        "uMandulo",
        "uMfumfu",
        "uLwezi",
        "uZibandlela",
    ]

    month_abbreviations = [
        "",
        "uMasingane",
        "uNhlolanja",
        "uNdasa",
        "UMbasa",
        "UNhlaba",
        "UNhlangulana",
        "uNtulikazi",
        "UNcwaba",
        "uMandulo",
        "uMfumfu",
        "uLwezi",
        "uZibandlela",
    ]

    day_names = [
        "",
        "uMsombuluko",
        "uLwesibili",
        "uLwesithathu",
        "uLwesine",
        "uLwesihlanu",
        "uMgqibelo",
        "iSonto",
    ]

    day_abbreviations = [
        "",
        "uMsombuluko",
        "uLwesibili",
        "uLwesithathu",
        "uLwesine",
        "uLwesihlanu",
        "uMgqibelo",
        "iSonto",
    ]


class TamilLocale(Locale):
    names = ["ta""ta-in""ta-lk"]

    past = "{0} நேரத்திற்கு முன்பு"
    future = "இல் {0}"

    timeframes = {
        "now""இப்போது",
        "second""ஒரு இரண்டாவது",
        "seconds""{0} விநாடிகள்",
        "minute""ஒரு நிமிடம்",
        "minutes""{0} நிமிடங்கள்",
        "hour""ஒரு மணி",
        "hours""{0} மணிநேரம்",
        "day""ஒரு நாள்",
        "days""{0} நாட்கள்",
        "week""ஒரு வாரம்",
        "weeks""{0} வாரங்கள்",
        "month""ஒரு மாதம்",
        "months""{0} மாதங்கள்",
        "year""ஒரு ஆண்டு",
        "years""{0} ஆண்டுகள்",
    }

    month_names = [
        "",
        "சித்திரை",
        "வைகாசி",
        "ஆனி",
        "ஆடி",
        "ஆவணி",
        "புரட்டாசி",
        "ஐப்பசி",
        "கார்த்திகை",
        "மார்கழி",
        "தை",
        "மாசி",
        "பங்குனி",
    ]

    month_abbreviations = [
        "",
        "ஜன",
        "பிப்",
        "மார்",
        "ஏப்",
        "மே",
        "ஜூன்",
        "ஜூலை",
        "ஆக",
        "செப்",
        "அக்",
        "நவ",
        "டிச",
    ]

    day_names = [
        "",
        "திங்கட்கிழமை",
        "செவ்வாய்க்கிழமை",
        "புதன்கிழமை",
        "வியாழக்கிழமை",
        "வெள்ளிக்கிழமை",
        "சனிக்கிழமை",
        "ஞாயிற்றுக்கிழமை",
    ]

    day_abbreviations = [
        "",
        "திங்கட்",
        "செவ்வாய்",
        "புதன்",
        "வியாழன்",
        "வெள்ளி",
        "சனி",
        "ஞாயிறு",
    ]

    def _ordinal_number(self, n: int) -> str:
        if n == 1:
            return f"{n}வது"
        elif n >= 0:
            return f"{n}ஆம்"
        else:
            return ""


class AlbanianLocale(Locale):
    names = ["sq""sq-al"]

    past = "{0} më parë"
    future = "në {0}"
    and_word = "dhe"

    timeframes = {
        "now""tani",
        "second""sekondë",
        "seconds""{0} sekonda",
        "minute""minutë",
        "minutes""{0} minuta",
        "hour""orë",
        "hours""{0} orë",
        "day""ditë",
        "days""{0} ditë",
        "week""javë",
        "weeks""{0} javë",
        "month""muaj",
        "months""{0} muaj",
        "year""vit",
        "years""{0} vjet",
    }

    month_names = [
        "",
        "janar",
        "shkurt",
        "mars",
        "prill",
        "maj",
        "qershor",
        "korrik",
        "gusht",
        "shtator",
        "tetor",
        "nëntor",
        "dhjetor",
    ]

    month_abbreviations = [
        "",
        "jan",
        "shk",
        "mar",
        "pri",
        "maj",
        "qer",
        "korr",
        "gush",
        "sht",
        "tet",
        "nën",
        "dhj",
    ]

    day_names = [
        "",
        "e hënë",
        "e martë",
        "e mërkurë",
        "e enjte",
        "e premte",
        "e shtunë",
        "e diel",
    ]

    day_abbreviations = [
        "",
        "hën",
        "mar",
        "mër",
        "enj",
        "pre",
        "sht",
        "die",
    ]


class GeorgianLocale(Locale):
    names = ["ka""ka-ge"]

    past = "{0} წინ"  # ts’in
    future = "{0} შემდეგ"  # shemdeg
    and_word = "და"  # da

    timeframes = {
        "now""ახლა",  # akhla
        # When a cardinal qualifies a noun, it stands in the singular
        "second""წამის",  # ts’amis
        "seconds""{0} წამის",
        "minute""წუთის",  # ts’utis
        "minutes""{0} წუთის",
        "hour""საათის",  # saatis
        "hours""{0} საათის",
        "day""დღის",  # dghis
        "days""{0} დღის",
        "week""კვირის",  # k’viris
        "weeks""{0} კვირის",
        "month""თვის",  # tvis
        "months""{0} თვის",
        "year""წლის",  # ts’lis
        "years""{0} წლის",
    }

    month_names = [
        # modern month names
        "",
        "იანვარი",  # Ianvari
        "თებერვალი",  # Tebervali
        "მარტი",  # Mart'i
        "აპრილი",  # Ap'rili
        "მაისი",  # Maisi
        "ივნისი",  # Ivnisi
        "ივლისი",  # Ivlisi
        "აგვისტო",  # Agvist'o
        "სექტემბერი",  # Sekt'emberi
        "ოქტომბერი",  # Okt'omberi
        "ნოემბერი",  # Noemberi
        "დეკემბერი",  # Dek'emberi
    ]

    month_abbreviations = [
        # no abbr. found yet
        "",
        "იანვარი",  # Ianvari
        "თებერვალი",  # Tebervali
        "მარტი",  # Mart'i
        "აპრილი",  # Ap'rili
        "მაისი",  # Maisi
        "ივნისი",  # Ivnisi
        "ივლისი",  # Ivlisi
        "აგვისტო",  # Agvist'o
        "სექტემბერი",  # Sekt'emberi
        "ოქტომბერი",  # Okt'omberi
        "ნოემბერი",  # Noemberi
        "დეკემბერი",  # Dek'emberi
    ]

    day_names = [
        "",
        "ორშაბათი",  # orshabati
        "სამშაბათი",  # samshabati
        "ოთხშაბათი",  # otkhshabati
        "ხუთშაბათი",  # khutshabati
        "პარასკევი",  # p’arask’evi
        "შაბათი",  # shabati
        # "k’vira" also serves as week; to avoid confusion "k’vira-dge" can be used for Sunday
        "კვირა",  # k’vira
    ]

    day_abbreviations = [
        "",
        "ორშაბათი",  # orshabati
        "სამშაბათი",  # samshabati
        "ოთხშაბათი",  # otkhshabati
        "ხუთშაბათი",  # khutshabati
        "პარასკევი",  # p’arask’evi
        "შაბათი",  # shabati
        "კვირა",  # k’vira
    ]


class SinhalaLocale(Locale):
    names = ["si""si-lk"]

    past = "{0}ට පෙර"
    future = "{0}"
    and_word = "සහ"

    timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[Mapping[str, str], str]]] = {
        "now""දැන්",
        "second": {
            "past""තත්පරයක",
            "future""තත්පරයකින්",
        },  # ක් is the article
        "seconds": {
            "past""තත්පර {0} ක",
            "future""තත්පර {0} කින්",
        },
        "minute": {
            "past""විනාඩියක",
            "future""විනාඩියකින්",
        },
        "minutes": {
            "past""විනාඩි {0} ක",
            "future""මිනිත්තු {0} කින්",
        },
        "hour": {"past""පැයක""future""පැයකින්"},
        "hours": {
            "past""පැය {0} ක",
            "future""පැය {0} කින්",
        },
        "day": {"past""දිනක""future""දිනකට"},
        "days": {
            "past""දින {0} ක",
            "future""දින {0} කින්",
        },
        "week": {"past""සතියක""future""සතියකින්"},
        "weeks": {
            "past""සති {0} ක",
            "future""සති {0} කින්",
        },
        "month": {"past""මාසයක""future""එය මාසය තුළ"},
        "months": {
            "past""මාස {0} ක",
            "future""මාස {0} කින්",
        },
        "year": {"past""වසරක""future""වසරක් තුළ"},
        "years": {
            "past""අවුරුදු {0} ක",
            "future""අවුරුදු {0} තුළ",
        },
    }
    # Sinhala: the general format to describe timeframe is different from past and future,
    # so we do not copy the original timeframes dictionary
    timeframes_only_distance = {}
    timeframes_only_distance["second"] = "තත්පරයක්"
    timeframes_only_distance["seconds"] = "තත්පර {0}"
    timeframes_only_distance["minute"] = "මිනිත්තුවක්"
    timeframes_only_distance["minutes"] = "විනාඩි {0}"
    timeframes_only_distance["hour"] = "පැයක්"
    timeframes_only_distance["hours"] = "පැය {0}"
    timeframes_only_distance["day"] = "දවසක්"
    timeframes_only_distance["days"] = "දවස් {0}"
    timeframes_only_distance["week"] = "සතියක්"
    timeframes_only_distance["weeks"] = "සති {0}"
    timeframes_only_distance["month"] = "මාසයක්"
    timeframes_only_distance["months"] = "මාස {0}"
    timeframes_only_distance["year"] = "අවුරුද්දක්"
    timeframes_only_distance["years"] = "අවුරුදු {0}"

    def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
        """
        Sinhala awares time frame format function, takes into account
        the differences between general, past, and future forms (three different suffixes).
        """
        abs_delta = abs(delta)
        form = self.timeframes[timeframe]

        if isinstance(form, str):
            return form.format(abs_delta)

        if delta > 0:
            key = "future"
        else:
            key = "past"
        form = form[key]

        return form.format(abs_delta)

    def describe(
        self,
        timeframe: TimeFrameLiteral,
        delta: Union[float, int] = 1,  # key is always future when only_distance=False
        only_distance: bool = False,
    ) -> str:
        """Describes a delta within a timeframe in plain language.

        :param timeframe: a string representing a timeframe.
        :param delta: a quantity representing a delta in a timeframe.
        :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords
        """

        if not only_distance:
            return super().describe(timeframe, delta, only_distance)
        # Sinhala uses a different case without 'in' or 'ago'
        humanized = self.timeframes_only_distance[timeframe].format(trunc(abs(delta)))

        return humanized

    month_names = [
        "",
        "ජනවාරි",
        "පෙබරවාරි",
        "මාර්තු",
        "අප්‍රේල්",
        "මැයි",
        "ජූනි",
        "ජූලි",
        "අගෝස්තු",
        "සැප්තැම්බර්",
        "ඔක්තෝබර්",
        "නොවැම්බර්",
        "දෙසැම්බර්",
    ]

    month_abbreviations = [
        "",
        "ජන",
        "පෙබ",
        "මාර්",
        "අප්‍රේ",
        "මැයි",
        "ජුනි",
        "ජූලි",
        "අගෝ",
        "සැප්",
        "ඔක්",
        "නොවැ",
        "දෙසැ",
    ]

    day_names = [
        "",
        "සදුදා",
        "අඟහරැවදා",
        "බදාදා",
        "බ්‍රහස්‍පතින්‍දා",
        "සිකුරාදා",
        "සෙනසුරාදා",
        "ඉරිදා",
    ]

    day_abbreviations = [
        "",
        "සදුද",
        "බදා",
        "බදා",
        "සිකු",
        "සෙන",
        "අ",
        "ඉරිදා",
    ]


class UrduLocale(Locale):
    names = ["ur""ur-pk"]

    past = "پہلے {0}"
    future = "میں {0}"
    and_word = "اور"

    timeframes = {
        "now""ابھی",
        "second""ایک سیکنڈ",
        "seconds""{0} سیکنڈ",
        "minute""ایک منٹ",
        "minutes""{0} منٹ",
        "hour""ایک گھنٹے",
        "hours""{0} گھنٹے",
        "day""ایک دن",
        "days""{0} دن",
        "week""ایک ہفتے",
        "weeks""{0} ہفتے",
        "month""ایک مہینہ",
        "months""{0} ماہ",
        "year""ایک سال",
        "years""{0} سال",
    }

    month_names = [
        "",
        "جنوری",
        "فروری",
        "مارچ",
        "اپریل",
        "مئی",
        "جون",
        "جولائی",
        "اگست",
        "ستمبر",
        "اکتوبر",
        "نومبر",
        "دسمبر",
    ]

    month_abbreviations = [
        "",
        "جنوری",
        "فروری",
        "مارچ",
        "اپریل",
        "مئی",
        "جون",
        "جولائی",
        "اگست",
        "ستمبر",
        "اکتوبر",
        "نومبر",
        "دسمبر",
    ]

    day_names = [
        "",
        "سوموار",
        "منگل",
        "بدھ",
        "جمعرات",
        "جمعہ",
        "ہفتہ",
        "اتوار",
    ]

    day_abbreviations = [
        "",
        "سوموار",
        "منگل",
        "بدھ",
        "جمعرات",
        "جمعہ",
        "ہفتہ",
        "اتوار",
    ]


class KazakhLocale(Locale):
    names = ["kk""kk-kz"]

    past = "{0} бұрын"
    future = "{0} кейін"
    timeframes = {
        "now""қазір",
        "second""бір секунд",
        "seconds""{0} секунд",
        "minute""бір минут",
        "minutes""{0} минут",
        "hour""бір сағат",
        "hours""{0} сағат",
        "day""бір күн",
        "days""{0} күн",
        "week""бір апта",
        "weeks""{0} апта",
        "month""бір ай",
        "months""{0} ай",
        "year""бір жыл",
        "years""{0} жыл",
    }

    month_names = [
        "",
        "Қаңтар",
        "Ақпан",
        "Наурыз",
        "Сәуір",
        "Мамыр",
        "Маусым",
        "Шілде",
        "Тамыз",
        "Қыркүйек",
        "Қазан",
        "Қараша",
        "Желтоқсан",
    ]
    month_abbreviations = [
        "",
        "Қан",
        "Ақп",
        "Нау",
        "Сәу",
        "Мам",
        "Мау",
        "Шіл",
        "Там",
        "Қыр",
        "Қаз",
        "Қар",
        "Жел",
    ]

    day_names = [
        "",
        "Дүйсембі",
        "Сейсенбі",
        "Сәрсенбі",
        "Бейсенбі",
        "Жұма",
        "Сенбі",
        "Жексенбі",
    ]
    day_abbreviations = ["""Дс""Сс""Ср""Бс""Жм""Сб""Жс"]


class AmharicLocale(Locale):
    names = ["am""am-et"]

    past = "{0} በፊት"
    future = "{0} ውስጥ"
    and_word = "እና"

    timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[Mapping[str, str], str]]] = {
        "now""አሁን",
        "second": {
            "past""ከአንድ ሰከንድ",
            "future""በአንድ ሰከንድ",
        },
        "seconds": {
            "past""ከ {0} ሰከንድ",
            "future""በ {0} ሰከንድ",
        },
        "minute": {
            "past""ከአንድ ደቂቃ",
            "future""በአንድ ደቂቃ",
        },
        "minutes": {
            "past""ከ {0} ደቂቃዎች",
            "future""በ {0} ደቂቃዎች",
        },
        "hour": {
            "past""ከአንድ ሰዓት",
            "future""በአንድ ሰዓት",
        },
        "hours": {
            "past""ከ {0} ሰዓታት",
            "future""በ {0} ሰከንድ",
        },
        "day": {
            "past""ከአንድ ቀን",
            "future""በአንድ ቀን",
        },
        "days": {
            "past""ከ {0} ቀናት",
            "future""በ {0} ቀናት",
        },
        "week": {
            "past""ከአንድ ሳምንት",
            "future""በአንድ ሳምንት",
        },
        "weeks": {
            "past""ከ {0} ሳምንታት",
            "future""በ {0} ሳምንታት",
        },
        "month": {
            "past""ከአንድ ወር",
            "future""በአንድ ወር",
        },
        "months": {
            "past""ከ {0} ወር",
            "future""በ {0} ወራት",
        },
        "year": {
            "past""ከአንድ አመት",
            "future""በአንድ አመት",
        },
        "years": {
            "past""ከ {0} ዓመታት",
            "future""በ {0} ዓመታት",
        },
    }
    # Amharic: the general format to describe timeframe is different from past and future,
    # so we do not copy the original timeframes dictionary
    timeframes_only_distance = {
        "second""አንድ ሰከንድ",
        "seconds""{0} ሰከንድ",
        "minute""አንድ ደቂቃ",
        "minutes""{0} ደቂቃዎች",
        "hour""አንድ ሰዓት",
        "hours""{0} ሰዓት",
        "day""አንድ ቀን",
        "days""{0} ቀናት",
        "week""አንድ ሳምንት",
        "weeks""{0} ሳምንት",
        "month""አንድ ወር",
        "months""{0} ወራት",
        "year""አንድ አመት",
        "years""{0} ዓመታት",
    }

    month_names = [
        "",
        "ጃንዩወሪ",
        "ፌብሩወሪ",
        "ማርች",
        "ኤፕሪል",
        "ሜይ",
        "ጁን",
        "ጁላይ",
        "ኦገስት",
        "ሴፕቴምበር",
        "ኦክቶበር",
        "ኖቬምበር",
        "ዲሴምበር",
    ]

    month_abbreviations = [
        "",
        "ጃንዩ",
        "ፌብሩ",
        "ማርች",
        "ኤፕሪ",
        "ሜይ",
        "ጁን",
        "ጁላይ",
        "ኦገስ",
        "ሴፕቴ",
        "ኦክቶ",
        "ኖቬም",
        "ዲሴም",
    ]

    day_names = [
        "",
        "ሰኞ",
        "ማክሰኞ",
        "ረቡዕ",
        "ሐሙስ",
        "ዓርብ",
        "ቅዳሜ",
        "እሑድ",
    ]
    day_abbreviations = ["""እ""ሰ""ማ""ረ""ሐ""ዓ""ቅ"]

    def _ordinal_number(self, n: int) -> str:
        return f"{n}ኛ"

    def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str:
        """
        Amharic awares time frame format function, takes into account
        the differences between general, past, and future forms (three different suffixes).
        """
        abs_delta = abs(delta)
        form = self.timeframes[timeframe]

        if isinstance(form, str):
            return form.format(abs_delta)

        if delta > 0:
            key = "future"
        else:
            key = "past"
        form = form[key]

        return form.format(abs_delta)

    def describe(
        self,
        timeframe: TimeFrameLiteral,
        delta: Union[float, int] = 1,  # key is always future when only_distance=False
        only_distance: bool = False,
    ) -> str:
        """Describes a delta within a timeframe in plain language.

        :param timeframe: a string representing a timeframe.
        :param delta: a quantity representing a delta in a timeframe.
        :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords
        """

        if not only_distance:
            return super().describe(timeframe, delta, only_distance)
        humanized = self.timeframes_only_distance[timeframe].format(trunc(abs(delta)))

        return humanized


class ArmenianLocale(Locale):
    names = ["hy""hy-am"]
    past = "{0} առաջ"
    future = "{0}ից"
    and_word = "Եվ"  # Yev

    timeframes = {
        "now""հիմա",
        "second""վայրկյան",
        "seconds""{0} վայրկյան",
        "minute""րոպե",
        "minutes""{0} րոպե",
        "hour""ժամ",
        "hours""{0} ժամ",
        "day""օր",
        "days""{0} օր",
        "month""ամիս",
        "months""{0} ամիս",
        "year""տարին",
        "years""{0} տարին",
        "week""շաբաթ",
        "weeks""{0} շաբաթ",
    }

    meridians = {
        "am""Ամ",
        "pm""պ.մ.",
        "AM""Ամ",
        "PM""պ.մ.",
    }

    month_names = [
        "",
        "հունվար",
        "փետրվար",
        "մարտ",
        "ապրիլ",
        "մայիս",
        "հունիս",
        "հուլիս",
        "օգոստոս",
        "սեպտեմբեր",
        "հոկտեմբեր",
        "նոյեմբեր",
        "դեկտեմբեր",
    ]

    month_abbreviations = [
        "",
        "հունվար",
        "փետրվար",
        "մարտ",
        "ապրիլ",
        "մայիս",
        "հունիս",
        "հուլիս",
        "օգոստոս",
        "սեպտեմբեր",
        "հոկտեմբեր",
        "նոյեմբեր",
        "դեկտեմբեր",
    ]

    day_names = [
        "",
        "երկուշաբթի",
        "երեքշաբթի",
        "չորեքշաբթի",
        "հինգշաբթի",
        "ուրբաթ",
        "շաբաթ",
        "կիրակի",
    ]

    day_abbreviations = [
        "",
        "երկ.",
        "երեք.",
        "չորեք.",
        "հինգ.",
        "ուրբ.",
        "շաբ.",
        "կիր.",
    ]


class UzbekLocale(Locale):
    names = ["uz""uz-uz"]
    past = "{0}dan avval"
    future = "{0}dan keyin"
    timeframes = {
        "now""hozir",
        "second""bir soniya",
        "seconds""{0} soniya",
        "minute""bir daqiqa",
        "minutes""{0} daqiqa",
        "hour""bir soat",
        "hours""{0} soat",
        "day""bir kun",
        "days""{0} kun",
        "week""bir hafta",
        "weeks""{0} hafta",
        "month""bir oy",
        "months""{0} oy",
        "year""bir yil",
        "years""{0} yil",
    }

    month_names = [
        "",
        "Yanvar",
        "Fevral",
        "Mart",
        "Aprel",
        "May",
        "Iyun",
        "Iyul",
        "Avgust",
        "Sentyabr",
        "Oktyabr",
        "Noyabr",
        "Dekabr",
    ]

    month_abbreviations = [
        "",
        "Yan",
        "Fev",
        "Mar",
        "Apr",
        "May",
        "Iyn",
        "Iyl",
        "Avg",
        "Sen",
        "Okt",
        "Noy",
        "Dek",
    ]

    day_names = [
        "",
        "Dushanba",
        "Seshanba",
        "Chorshanba",
        "Payshanba",
        "Juma",
        "Shanba",
        "Yakshanba",
    ]

    day_abbreviations = ["""Dush""Sesh""Chor""Pay""Jum""Shan""Yak"]

Messung V0.5 in Prozent
C=92 H=95 G=93

¤ Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.0.178Bemerkung:  (vorverarbeitet am  2026-06-10) ¤

*Bot Zugriff






Versionsinformation zu Columbo

Bemerkung:

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Anfrage:

Dauer der Verarbeitung:

Sekunden

sprechenden Kalenders