"" "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 < (3, 8): # 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 `
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 `
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[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 (11, 12, 13):
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[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[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\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} दिन",
--> --------------------
--> maximum size reached
--> --------------------
quality 86%
¤ Dauer der Verarbeitung: 0.154 Sekunden
¤
*© Formatika GbR, Deutschland