Spaces:
Runtime error
Runtime error
"""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 <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 (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<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 [1, 5, 7, 8, 9, 10]: | |
return f"{n}ম" | |
if n in [2, 3]: | |
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 [1, 5, 7, 8, 9, 10]: | |
return f"{n}ମ" | |
if n in [2, 3]: | |
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"] | |