# -*- coding: utf-8 -*- from __future__ import absolute_import from __future__ import unicode_literals import inspect import sys from math import trunc def get_locale(name): '''Returns an appropriate :class:`Locale ` corresponding to an inpute locale name. :param name: the name of the locale. ''' locale_cls = _locales.get(name.lower()) if locale_cls is None: raise ValueError('Unsupported locale \'{0}\''.format(name)) return locale_cls() # base locale type. class Locale(object): ''' Represents locale-specific data and functionality. ''' names = [] timeframes = { 'now': '', 'seconds': '', 'minute': '', 'minutes': '', 'hour': '', 'hours': '', 'day': '', 'days': '', 'month': '', 'months': '', 'year': '', 'years': '', } meridians = { 'am': '', 'pm': '', 'AM': '', 'PM': '', } past = None future = None month_names = [] month_abbreviations = [] day_names = [] day_abbreviations = [] ordinal_day_re = r'(\d+)' def __init__(self): self._month_name_to_ordinal = None def describe(self, timeframe, delta=0, only_distance=False): ''' 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, delta) if not only_distance: humanized = self._format_relative(humanized, timeframe, delta) return humanized def day_name(self, day): ''' 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): ''' 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): ''' 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): ''' 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): ''' 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): ''' Returns the year for specific locale if available :param name: the ``int`` year (4-digit) ''' return '{0:04d}'.format(year) def year_abbreviation(self, year): ''' Returns the year for specific locale if available :param name: the ``int`` year (4-digit) ''' return '{0:04d}'.format(year)[2:] def meridian(self, hour, token): ''' 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'] def ordinal_number(self, n): ''' Returns the ordinal format of a given integer :param n: an integer ''' return self._ordinal_number(n) def _ordinal_number(self, n): return '{0}'.format(n) def _name_to_ordinal(self, lst): return dict(map(lambda i: (i[1].lower(), i[0] + 1), enumerate(lst[1:]))) def _format_timeframe(self, timeframe, delta): return self.timeframes[timeframe].format(trunc(abs(delta))) def _format_relative(self, humanized, timeframe, delta): if timeframe == 'now': return humanized direction = self.past if delta < 0 else self.future return direction.format(humanized) # base locale type implementations. class EnglishLocale(Locale): names = ['en', 'en_us', 'en_gb', 'en_au', 'en_be', 'en_jp', 'en_za', 'en_ca'] past = '{0} ago' future = 'in {0}' timeframes = { 'now': 'just now', 'seconds': 'seconds', 'minute': 'a minute', 'minutes': '{0} minutes', 'hour': 'an hour', 'hours': '{0} hours', 'day': 'a day', 'days': '{0} days', 'month': 'a month', 'months': '{0} months', 'year': 'a year', 'years': '{0} years', } meridians = { 'am': 'am', 'pm': 'pm', 'AM': 'AM', 'PM': 'PM', } month_names = ['', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] month_abbreviations = ['', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] day_names = ['', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] day_abbreviations = ['', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] ordinal_day_re = r'((?P[2-3]?1(?=st)|[2-3]?2(?=nd)|[2-3]?3(?=rd)|[1-3]?[04-9](?=th)|1[1-3](?=th))(st|nd|rd|th))' def _ordinal_number(self, n): if n % 100 not in (11, 12, 13): remainder = abs(n) % 10 if remainder == 1: return '{0}st'.format(n) elif remainder == 2: return '{0}nd'.format(n) elif remainder == 3: return '{0}rd'.format(n) return '{0}th'.format(n) class ItalianLocale(Locale): names = ['it', 'it_it'] past = '{0} fa' future = 'tra {0}' timeframes = { 'now': 'adesso', 'seconds': 'qualche secondo', 'minute': 'un minuto', 'minutes': '{0} minuti', 'hour': 'un\'ora', 'hours': '{0} ore', 'day': 'un giorno', 'days': '{0} giorni', 'month': 'un mese', 'months': '{0} mesi', 'year': 'un anno', 'years': '{0} anni', } month_names = ['', 'gennaio', 'febbraio', 'marzo', 'aprile', 'maggio', 'giugno', 'luglio', 'agosto', 'settembre', 'ottobre', 'novembre', 'dicembre'] month_abbreviations = ['', 'gen', 'feb', 'mar', 'apr', 'mag', 'giu', 'lug', 'ago', 'set', 'ott', 'nov', 'dic'] day_names = ['', 'lunedì', 'martedì', 'mercoledì', 'giovedì', 'venerdì', 'sabato', 'domenica'] day_abbreviations = ['', 'lun', 'mar', 'mer', 'gio', 'ven', 'sab', 'dom'] ordinal_day_re = r'((?P[1-3]?[0-9](?=[ºª]))[ºª])' def _ordinal_number(self, n): return '{0}º'.format(n) class SpanishLocale(Locale): names = ['es', 'es_es'] past = 'hace {0}' future = 'en {0}' timeframes = { 'now': 'ahora', 'seconds': 'segundos', 'minute': 'un minuto', 'minutes': '{0} minutos', 'hour': 'una hora', 'hours': '{0} horas', 'day': 'un día', 'days': '{0} días', 'month': 'un mes', 'months': '{0} meses', 'year': 'un año', 'years': '{0} años', } month_names = ['', 'enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'] month_abbreviations = ['', 'ene', 'feb', 'mar', 'abr', 'may', 'jun', 'jul', 'ago', 'sep', 'oct', 'nov', 'dic'] day_names = ['', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado', 'domingo'] day_abbreviations = ['', 'lun', 'mar', 'mie', 'jue', 'vie', 'sab', 'dom'] ordinal_day_re = r'((?P[1-3]?[0-9](?=[ºª]))[ºª])' def _ordinal_number(self, n): return '{0}º'.format(n) class FrenchLocale(Locale): names = ['fr', 'fr_fr'] past = 'il y a {0}' future = 'dans {0}' timeframes = { 'now': 'maintenant', 'seconds': 'quelques secondes', 'minute': 'une minute', 'minutes': '{0} minutes', 'hour': 'une heure', 'hours': '{0} heures', 'day': 'un jour', 'days': '{0} jours', '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'] month_abbreviations = ['', 'janv', 'févr', 'mars', 'avr', 'mai', 'juin', 'juil', 'août', 'sept', 'oct', 'nov', 'déc'] day_names = ['', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche'] day_abbreviations = ['', 'lun', 'mar', 'mer', 'jeu', 'ven', 'sam', 'dim'] ordinal_day_re = r'((?P\b1(?=er\b)|[1-3]?[02-9](?=e\b)|[1-3]1(?=e\b))(er|e)\b)' def _ordinal_number(self, n): if abs(n) == 1: return '{0}er'.format(n) return '{0}e'.format(n) class GreekLocale(Locale): names = ['el', 'el_gr'] past = '{0} πριν' future = 'σε {0}' timeframes = { 'now': 'τώρα', 'seconds': 'δευτερόλεπτα', 'minute': 'ένα λεπτό', 'minutes': '{0} λεπτά', 'hour': 'μια ώρα', 'hours': '{0} ώρες', 'day': 'μια μέρα', 'days': '{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}後' timeframes = { 'now': '現在', 'seconds': '数秒', 'minute': '1分', 'minutes': '{0}分', 'hour': '1時間', 'hours': '{0}時間', 'day': '1日', 'days': '{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}' timeframes = { 'now': 'just nu', 'seconds': 'några sekunder', 'minute': 'en minut', 'minutes': '{0} minuter', 'hour': 'en timme', 'hours': '{0} timmar', 'day': 'en dag', 'days': '{0} dagar', '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 = { 'now': ['juuri nyt', 'juuri nyt'], 'seconds': ['muutama sekunti', 'muutaman sekunnin'], 'minute': ['minuutti', 'minuutin'], 'minutes': ['{0} minuuttia', '{0} minuutin'], 'hour': ['tunti', 'tunnin'], 'hours': ['{0} tuntia', '{0} tunnin'], 'day': ['päivä', 'päivä'], 'days': ['{0} päivää', '{0} päivän'], 'month': ['kuukausi', 'kuukauden'], 'months': ['{0} kuukautta', '{0} kuukauden'], 'year': ['vuosi', 'vuoden'], 'years': ['{0} vuotta', '{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, delta): return (self.timeframes[timeframe][0].format(abs(delta)), self.timeframes[timeframe][1].format(abs(delta))) def _format_relative(self, humanized, timeframe, delta): if timeframe == 'now': return humanized[0] direction = self.past if delta < 0 else self.future which = 0 if delta < 0 else 1 return direction.format(humanized[which]) def _ordinal_number(self, n): return '{0}.'.format(n) class ChineseCNLocale(Locale): names = ['zh', 'zh_cn'] past = '{0}前' future = '{0}后' timeframes = { 'now': '刚才', 'seconds': '几秒', 'minute': '1分钟', 'minutes': '{0}分钟', 'hour': '1小时', 'hours': '{0}小时', 'day': '1天', 'days': '{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}後' timeframes = { 'now': '剛才', 'seconds': '幾秒', 'minute': '1分鐘', 'minutes': '{0}分鐘', 'hour': '1小時', 'hours': '{0}小時', 'day': '1天', 'days': '{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': '지금', 'seconds': '몇 초', 'minute': '1분', 'minutes': '{0}분', 'hour': '1시간', 'hours': '{0}시간', 'day': '1일', 'days': '{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 = ['', '월', '화', '수', '목', '금', '토', '일'] # derived locale types & implementations. class DutchLocale(Locale): names = ['nl', 'nl_nl'] past = '{0} geleden' future = 'over {0}' timeframes = { 'now': 'nu', 'seconds': 'seconden', 'minute': 'een minuut', 'minutes': '{0} minuten', 'hour': 'een uur', 'hours': '{0} uur', 'day': 'een dag', 'days': '{0} dagen', '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): def _format_timeframe(self, timeframe, delta): form = self.timeframes[timeframe] delta = abs(delta) if isinstance(form, list): if delta % 10 == 1 and delta % 100 != 11: form = form[0] elif 2 <= delta % 10 <= 4 and (delta % 100 < 10 or delta % 100 >= 20): form = form[1] else: form = form[2] return form.format(delta) class BelarusianLocale(SlavicBaseLocale): names = ['be', 'be_by'] past = '{0} таму' future = 'праз {0}' timeframes = { 'now': 'зараз', 'seconds': 'некалькі секунд', 'minute': 'хвіліну', 'minutes': ['{0} хвіліну', '{0} хвіліны', '{0} хвілін'], 'hour': 'гадзіну', 'hours': ['{0} гадзіну', '{0} гадзіны', '{0} гадзін'], 'day': 'дзень', 'days': ['{0} дзень', '{0} дні', '{0} дзён'], 'month': 'месяц', 'months': ['{0} месяц', '{0} месяцы', '{0} месяцаў'], 'year': 'год', 'years': ['{0} год', '{0} гады', '{0} гадоў'], } month_names = ['', 'студзеня', 'лютага', 'сакавіка', 'красавіка', 'траўня', 'чэрвеня', 'ліпеня', 'жніўня', 'верасня', 'кастрычніка', 'лістапада', 'снежня'] month_abbreviations = ['', 'студ', 'лют', 'сак', 'крас', 'трав', 'чэрв', 'ліп', 'жнів', 'вер', 'каст', 'ліст', 'снеж'] day_names = ['', 'панядзелак', 'аўторак', 'серада', 'чацвер', 'пятніца', 'субота', 'нядзеля'] day_abbreviations = ['', 'пн', 'ат', 'ср', 'чц', 'пт', 'сб', 'нд'] class PolishLocale(SlavicBaseLocale): names = ['pl', 'pl_pl'] past = '{0} temu' future = 'za {0}' timeframes = { 'now': 'teraz', 'seconds': 'kilka sekund', 'minute': 'minutę', 'minutes': ['{0} minut', '{0} minuty', '{0} minut'], 'hour': 'godzina', 'hours': ['{0} godzin', '{0} godziny', '{0} godzin'], 'day': 'dzień', 'days': ['{0} dzień', '{0} dni', '{0} dni'], 'month': 'miesiąc', 'months': ['{0} miesiąc', '{0} miesiące', '{0} miesięcy'], 'year': 'rok', 'years': ['{0} rok', '{0} lata', '{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 = { 'now': 'сейчас', 'seconds': 'несколько секунд', 'minute': 'минуту', 'minutes': ['{0} минуту', '{0} минуты', '{0} минут'], 'hour': 'час', 'hours': ['{0} час', '{0} часа', '{0} часов'], 'day': 'день', 'days': ['{0} день', '{0} дня', '{0} дней'], 'month': 'месяц', 'months': ['{0} месяц', '{0} месяца', '{0} месяцев'], 'year': 'год', 'years': ['{0} год', '{0} года', '{0} лет'], } month_names = ['', 'января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'] month_abbreviations = ['', 'янв', 'фев', 'мар', 'апр', 'май', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'] day_names = ['', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота', 'воскресенье'] day_abbreviations = ['', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб', 'вс'] class BulgarianLocale(SlavicBaseLocale): names = ['bg', 'bg_BG'] past = '{0} назад' future = 'напред {0}' timeframes = { 'now': 'сега', 'seconds': 'няколко секунди', 'minute': 'минута', 'minutes': ['{0} минута', '{0} минути', '{0} минути'], 'hour': 'час', 'hours': ['{0} час', '{0} часа', '{0} часа'], 'day': 'ден', 'days': ['{0} ден', '{0} дни', '{0} дни'], 'month': 'месец', 'months': ['{0} месец', '{0} месеца', '{0} месеца'], 'year': 'година', 'years': ['{0} година', '{0} години', '{0} години'], } month_names = ['', 'януари', 'февруари', 'март', 'април', 'май', 'юни', 'юли', 'август', 'септември', 'октомври', 'ноември', 'декември'] month_abbreviations = ['', 'ян', 'февр', 'март', 'апр', 'май', 'юни', 'юли', 'авг', 'септ', 'окт', 'ноем', 'дек'] day_names = ['', 'понеделник', 'вторник', 'сряда', 'четвъртък', 'петък', 'събота', 'неделя'] day_abbreviations = ['', 'пон', 'вт', 'ср', 'четв', 'пет', 'съб', 'нед'] class UkrainianLocale(SlavicBaseLocale): names = ['ua', 'uk_ua'] past = '{0} тому' future = 'за {0}' timeframes = { 'now': 'зараз', 'seconds': 'кілька секунд', 'minute': 'хвилину', 'minutes': ['{0} хвилину', '{0} хвилини', '{0} хвилин'], 'hour': 'годину', 'hours': ['{0} годину', '{0} години', '{0} годин'], 'day': 'день', 'days': ['{0} день', '{0} дні', '{0} днів'], 'month': 'місяць', 'months': ['{0} місяць', '{0} місяці', '{0} місяців'], 'year': 'рік', 'years': ['{0} рік', '{0} роки', '{0} років'], } month_names = ['', 'січня', 'лютого', 'березня', 'квітня', 'травня', 'червня', 'липня', 'серпня', 'вересня', 'жовтня', 'листопада', 'грудня'] month_abbreviations = ['', 'січ', 'лют', 'бер', 'квіт', 'трав', 'черв', 'лип', 'серп', 'вер', 'жовт', 'лист', 'груд'] day_names = ['', 'понеділок', 'вівторок', 'середа', 'четвер', 'п’ятниця', 'субота', 'неділя'] day_abbreviations = ['', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб', 'нд'] class _DeutschLocaleCommonMixin(object): past = 'vor {0}' future = 'in {0}' timeframes = { 'now': 'gerade eben', 'seconds': 'Sekunden', 'minute': 'einer Minute', 'minutes': '{0} Minuten', 'hour': 'einer Stunde', 'hours': '{0} Stunden', 'day': 'einem Tag', 'days': '{0} Tagen', 'month': 'einem Monat', 'months': '{0} Monaten', 'year': 'einem Jahr', 'years': '{0} Jahren', } 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): return '{0}.'.format(n) class GermanLocale(_DeutschLocaleCommonMixin, Locale): names = ['de', 'de_de'] class AustrianLocale(_DeutschLocaleCommonMixin, 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', 'seconds': 'noen sekunder', 'minute': 'ett minutt', 'minutes': '{0} minutter', 'hour': 'en time', 'hours': '{0} timer', 'day': 'en dag', 'days': '{0} dager', '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ø'] class NewNorwegianLocale(Locale): names = ['nn', 'nn_no'] past = 'for {0} sidan' future = 'om {0}' timeframes = { 'now': 'no nettopp', 'seconds': 'nokre sekund', 'minute': 'ett minutt', 'minutes': '{0} minutt', 'hour': 'ein time', 'hours': '{0} timar', 'day': 'ein dag', 'days': '{0} dagar', 'month': 'en månad', 'months': '{0} månader', 'year': 'eit å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'] class PortugueseLocale(Locale): names = ['pt', 'pt_pt'] past = 'há {0}' future = 'em {0}' timeframes = { 'now': 'agora', 'seconds': 'segundos', 'minute': 'um minuto', 'minutes': '{0} minutos', 'hour': 'uma hora', 'hours': '{0} horas', 'day': 'um dia', 'days': '{0} dias', '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', 'maio', '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'] past = 'nakaraang {0}' future = '{0} mula ngayon' timeframes = { 'now': 'ngayon lang', 'seconds': 'segundo', 'minute': 'isang minuto', 'minutes': '{0} minuto', 'hour': 'isang oras', 'hours': '{0} oras', 'day': 'isang araw', 'days': '{0} araw', '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'] class VietnameseLocale(Locale): names = ['vi', 'vi_vn'] past = '{0} trước' future = '{0} nữa' timeframes = { 'now': 'hiện tại', 'seconds': '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', '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' timeframes = { 'now': 'şimdi', 'seconds': 'saniye', 'minute': 'bir dakika', 'minutes': '{0} dakika', 'hour': 'bir saat', 'hours': '{0} saat', 'day': 'bir gün', 'days': '{0} gün', 'month': 'bir ay', 'months': '{0} ay', 'year': 'yıl', 'years': '{0} yıl', } 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', 'seconds': 'saniyə', 'minute': 'bir dəqiqə', 'minutes': '{0} dəqiqə', 'hour': 'bir saat', 'hours': '{0} saat', 'day': 'bir gün', 'days': '{0} gün', 'month': 'bir ay', 'months': '{0} ay', 'year': '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 = { 'now': 'الآن', 'seconds': { 'double' : 'ثانيتين', 'ten' : '{0} ثوان', 'higher' : '{0} ثانية' }, 'minute': 'دقيقة', 'minutes': { 'double' : 'دقيقتين', 'ten' : '{0} دقائق', 'higher' : '{0} دقيقة' }, 'hour': 'ساعة', 'hours': { 'double' : 'ساعتين', 'ten' : '{0} ساعات', 'higher' : '{0} ساعة' }, 'day': 'يوم', 'days': { 'double' : 'يومين', 'ten' : '{0} أيام', 'higher' : '{0} يوم' }, 'month': 'شهر', 'months': { 'double' : 'شهرين', 'ten' : '{0} أشهر', 'higher' : '{0} شهر' }, 'year': 'سنة', 'years': { 'double' : 'سنتين', 'ten' : '{0} سنوات', 'higher' : '{0} سنة' }, } month_names = ['', 'يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'] month_abbreviations = ['', 'يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'] day_names = ['', 'الإثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت', 'الأحد'] day_abbreviations = ['', 'إثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة', 'سبت', 'أحد'] def _format_timeframe(self, timeframe, delta): form = self.timeframes[timeframe] delta = abs(delta) if isinstance(form, dict): if delta == 2: form = form['double'] elif delta > 2 and 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, delta): timeframe = self.timeframes[timeframe] if delta < 0: timeframe = timeframe[0] elif delta > 0: timeframe = timeframe[1] return timeframe.format(abs(delta)) names = ['is', 'is_is'] past = 'fyrir {0} síðan' future = 'eftir {0}' timeframes = { 'now': 'rétt í þessu', 'seconds': ('nokkrum sekúndum', 'nokkrar sekúndur'), 'minute': ('einni mínútu', 'eina mínútu'), 'minutes': ('{0} mínútum', '{0} mínútur'), 'hour': ('einum tíma', 'einn tíma'), 'hours': ('{0} tímum', '{0} tíma'), 'day': ('einum degi', 'einn dag'), 'days': ('{0} dögum', '{0} daga'), 'month': ('einum mánuði', 'einn mánuð'), 'months': ('{0} mánuðum', '{0} mánuði'), 'year': ('einu ári', 'eitt ár'), 'years': ('{0} árum', '{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 = 'efter {0}' timeframes = { 'now': 'lige nu', 'seconds': 'et par sekunder', 'minute': 'et minut', 'minutes': '{0} minutter', 'hour': 'en time', 'hours': '{0} timer', 'day': 'en dag', 'days': '{0} dage', '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'] class MalayalamLocale(Locale): names = ['ml'] past = '{0} മുമ്പ്' future = '{0} ശേഷം' timeframes = { 'now': 'ഇപ്പോൾ', 'seconds': 'സെക്കന്റ്‌', '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'] past = '{0} पहले' future = '{0} बाद' timeframes = { 'now': 'अभी', 'seconds': 'सेकंड्', '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 = { 'now': 'Teď', 'seconds': { 'past': '{0} sekundami', 'future': ['{0} sekundy', '{0} sekund'] }, 'minute': {'past': 'minutou', 'future': 'minutu', 'zero': '{0} minut'}, 'minutes': { 'past': '{0} minutami', 'future': ['{0} minuty', '{0} minut'] }, 'hour': {'past': 'hodinou', 'future': 'hodinu', 'zero': '{0} hodin'}, 'hours': { 'past': '{0} hodinami', 'future': ['{0} hodiny', '{0} hodin'] }, 'day': {'past': 'dnem', 'future': 'den', 'zero': '{0} dnů'}, 'days': { 'past': '{0} dny', 'future': ['{0} dny', '{0} dnů'] }, 'month': {'past': 'měsícem', 'future': 'měsíc', 'zero': '{0} měsíců'}, 'months': { 'past': '{0} měsíci', 'future': ['{0} měsíce', '{0} měsíců'] }, 'year': {'past': 'rokem', 'future': 'rok', 'zero': '{0} let'}, 'years': { 'past': '{0} lety', 'future': ['{0} roky', '{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, delta): '''Czech aware time frame format function, takes into account the differences between past and future forms.''' form = self.timeframes[timeframe] if isinstance(form, dict): if delta == 0: form = form['zero'] # And *never* use 0 in the singular! elif delta > 0: form = form['future'] else: form = form['past'] delta = abs(delta) if isinstance(form, list): if 2 <= delta % 10 <= 4 and (delta % 100 < 10 or delta % 100 >= 20): form = form[0] else: form = form[1] return form.format(delta) class SlovakLocale(Locale): names = ['sk', 'sk_sk'] timeframes = { 'now': 'Teraz', 'seconds': { 'past': 'pár sekundami', 'future': ['{0} sekundy', '{0} sekúnd'] }, 'minute': {'past': 'minútou', 'future': 'minútu', 'zero': '{0} minút'}, 'minutes': { 'past': '{0} minútami', 'future': ['{0} minúty', '{0} minút'] }, 'hour': {'past': 'hodinou', 'future': 'hodinu', 'zero': '{0} hodín'}, 'hours': { 'past': '{0} hodinami', 'future': ['{0} hodiny', '{0} hodín'] }, 'day': {'past': 'dňom', 'future': 'deň', 'zero': '{0} dní'}, 'days': { 'past': '{0} dňami', 'future': ['{0} dni', '{0} dní'] }, 'month': {'past': 'mesiacom', 'future': 'mesiac', 'zero': '{0} mesiacov'}, 'months': { 'past': '{0} mesiacmi', 'future': ['{0} mesiace', '{0} mesiacov'] }, 'year': {'past': 'rokom', 'future': 'rok', 'zero': '{0} rokov'}, 'years': { 'past': '{0} rokmi', 'future': ['{0} roky', '{0} rokov'] } } past = 'Pred {0}' future = 'O {0}' 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, delta): '''Slovak aware time frame format function, takes into account the differences between past and future forms.''' form = self.timeframes[timeframe] if isinstance(form, dict): if delta == 0: form = form['zero'] # And *never* use 0 in the singular! elif delta > 0: form = form['future'] else: form = form['past'] delta = abs(delta) if isinstance(form, list): if 2 <= delta % 10 <= 4 and (delta % 100 < 10 or delta % 100 >= 20): form = form[0] else: form = form[1] return form.format(delta) class FarsiLocale(Locale): names = ['fa', 'fa_ir'] past = '{0} قبل' future = 'در {0}' timeframes = { 'now': 'اکنون', 'seconds': 'ثانیه', '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 MacedonianLocale(Locale): names = ['mk', 'mk_mk'] past = 'пред {0}' future = 'за {0}' timeframes = { 'now': 'сега', 'seconds': 'секунди', '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 HebrewLocale(Locale): names = ['he', 'he_IL'] past = 'לפני {0}' future = 'בעוד {0}' timeframes = { 'now': 'הרגע', 'seconds': 'שניות', 'minute': 'דקה', 'minutes': '{0} דקות', 'hour': 'שעה', 'hours': '{0} שעות', '2-hours': 'שעתיים', 'day': 'יום', 'days': '{0} ימים', '2-days': 'יומיים', 'month': 'חודש', 'months': '{0} חודשים', '2-months': 'חודשיים', 'year': 'שנה', 'years': '{0} שנים', '2-years': 'שנתיים', } meridians = { 'am': 'לפנ"צ', 'pm': 'אחר"צ', 'AM': 'לפני הצהריים', 'PM': 'אחרי הצהריים', } month_names = ['', 'ינואר', 'פברואר', 'מרץ', 'אפריל', 'מאי', 'יוני', 'יולי', 'אוגוסט', 'ספטמבר', 'אוקטובר', 'נובמבר', 'דצמבר'] month_abbreviations = ['', 'ינו׳', 'פבר׳', 'מרץ', 'אפר׳', 'מאי', 'יוני', 'יולי', 'אוג׳', 'ספט׳', 'אוק׳', 'נוב׳', 'דצמ׳'] day_names = ['', 'שני', 'שלישי', 'רביעי', 'חמישי', 'שישי', 'שבת', 'ראשון'] day_abbreviations = ['', 'ב׳', 'ג׳', 'ד׳', 'ה׳', 'ו׳', 'ש׳', 'א׳'] def _format_timeframe(self, timeframe, delta): '''Hebrew couple of aware''' couple = '2-{0}'.format(timeframe) if abs(delta) == 2 and couple in self.timeframes: return self.timeframes[couple].format(abs(delta)) else: return self.timeframes[timeframe].format(abs(delta)) class MarathiLocale(Locale): names = ['mr'] past = '{0} आधी' future = '{0} नंतर' timeframes = { 'now': 'सद्य', 'seconds': 'सेकंद', '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 _map_locales(): locales = {} for cls_name, cls in inspect.getmembers(sys.modules[__name__], inspect.isclass): if issubclass(cls, Locale): for name in cls.names: locales[name.lower()] = cls return locales class CatalanLocale(Locale): names = ['ca', 'ca_es', 'ca_ad', 'ca_fr', 'ca_it'] past = 'Fa {0}' future = 'En {0}' timeframes = { 'now': 'Ara mateix', 'seconds': 'segons', 'minute': '1 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 = ['', 'Gener', 'Febrer', 'Març', 'Abril', 'Maig', 'Juny', 'Juliol', 'Agost', 'Setembre', 'Octubre', 'Novembre', 'Desembre'] day_names = ['', 'Dilluns', 'Dimarts', 'Dimecres', 'Dijous', 'Divendres', 'Dissabte', 'Diumenge'] day_abbreviations = ['', 'Dilluns', 'Dimarts', 'Dimecres', 'Dijous', 'Divendres', 'Dissabte', 'Diumenge'] 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', 'seconds': '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 = { 'now': 'éppen most', 'seconds': { 'past': 'másodpercekkel', 'future': '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' }, '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, delta): form = self.timeframes[timeframe] if isinstance(form, dict): 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', 'seconds': '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[1-3]?[0-9](?=a))a)' def _ordinal_number(self, n): return '{0}a'.format(n) class ThaiLocale(Locale): names = ['th', 'th_th'] past = '{0}{1}ที่ผ่านมา' future = 'ในอีก{1}{0}' timeframes = { 'now': 'ขณะนี้', 'seconds': 'ไม่กี่วินาที', '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): '''Thai always use Buddhist Era (BE) which is CE + 543''' year += self.BE_OFFSET return '{0:04d}'.format(year) def year_abbreviation(self, year): '''Thai always use Buddhist Era (BE) which is CE + 543''' year += self.BE_OFFSET return '{0:04d}'.format(year)[2:] def _format_relative(self, humanized, timeframe, delta): '''Thai normally doesn't have any space between words''' if timeframe == 'now': return humanized space = '' if timeframe == 'seconds' else ' ' direction = self.past if delta < 0 else self.future return direction.format(humanized, space) class BengaliLocale(Locale): names = ['bn', 'bn_bd', 'bn_in'] past = '{0} আগে' future = '{0} পরে' timeframes = { 'now': 'এখন', 'seconds': 'সেকেন্ড', '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): if n > 10 or n == 0: return '{0}তম'.format(n) if n in [1, 5, 7, 8, 9, 10]: return '{0}ম'.format(n) if n in [2, 3]: return '{0}য়'.format(n) if n == 4: return '{0}র্থ'.format(n) if n == 6: return '{0}ষ্ঠ'.format(n) class RomanshLocale(Locale): names = ['rm', 'rm_ch'] past = 'avant {0}' future = 'en {0}' timeframes = { 'now': 'en quest mument', 'seconds': 'secundas', 'minute': 'ina minuta', 'minutes': '{0} minutas', 'hour': 'in\'ura', 'hours': '{0} ura', 'day': 'in di', 'days': '{0} dis', '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 SwissLocale(Locale): names = ['de', 'de_ch'] past = 'vor {0}' future = 'in {0}' timeframes = { 'now': 'gerade eben', 'seconds': 'Sekunden', 'minute': 'einer Minute', 'minutes': '{0} Minuten', 'hour': 'einer Stunde', 'hours': '{0} Stunden', 'day': 'einem Tag', 'days': '{0} Tagen', 'month': 'einem Monat', 'months': '{0} Monaten', 'year': 'einem Jahr', 'years': '{0} Jahren', } 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' ] class RomanianLocale(Locale): names = ['ro', 'ro_ro'] past = '{0} în urmă' future = 'peste {0}' timeframes = { 'now': 'acum', 'seconds': '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}' timeframes = { 'now': 'zdaj', 'seconds': '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}' timeframes = { 'now': 'baru saja', 'seconds': 'detik', 'minute': '1 menit', 'minutes': '{0} menit', 'hour': '1 jam', 'hours': '{0} jam', 'day': '1 hari', 'days': '{0} hari', 'month': '1 bulan', 'months': '{0} bulan', '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': 'अहिले', 'seconds': 'सेकण्ड', 'minute': 'मिनेट', 'minutes': '{0} मिनेट', 'hour': 'एक घण्टा', 'hours': '{0} घण्टा', 'day': 'एक दिन', 'days': '{0} दिन', 'month': 'एक महिना', 'months': '{0} महिना', 'year': 'एक बर्ष', 'years': 'बर्ष' } meridians = { 'am': 'पूर्वाह्न', 'pm': 'अपरान्ह', 'AM': 'पूर्वाह्न', 'PM': 'अपरान्ह' } month_names = [ '', 'जनवरी', 'फेब्रुअरी', 'मार्च', 'एप्रील', 'मे', 'जुन', 'जुलाई', 'अगष्ट', 'सेप्टेम्बर', 'अक्टोबर', 'नोवेम्बर', 'डिसेम्बर' ] month_abbreviations = [ '', 'जन', 'फेब', 'मार्च', 'एप्रील', 'मे', 'जुन', 'जुलाई', 'अग', 'सेप', 'अक्ट', 'नोव', 'डिस' ] day_names = [ '', 'सोमवार', 'मंगलवार', 'बुधवार', 'बिहिवार', 'शुक्रवार', 'शनिवार', 'आइतवार' ] day_abbreviations = [ '', 'सोम', 'मंगल', 'बुध', 'बिहि', 'शुक्र', 'शनि', 'आइत' ] _locales = _map_locales()