locales.py 93 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139
  1. # -*- coding: utf-8 -*-
  2. from __future__ import absolute_import, unicode_literals
  3. import inspect
  4. import sys
  5. from math import trunc
  6. def get_locale(name):
  7. """Returns an appropriate :class:`Locale <arrow.locales.Locale>`
  8. corresponding to an inpute locale name.
  9. :param name: the name of the locale.
  10. """
  11. locale_cls = _locales.get(name.lower())
  12. if locale_cls is None:
  13. raise ValueError("Unsupported locale '{}'".format(name))
  14. return locale_cls()
  15. def get_locale_by_class_name(name):
  16. """Returns an appropriate :class:`Locale <arrow.locales.Locale>`
  17. corresponding to an locale class name.
  18. :param name: the name of the locale class.
  19. """
  20. locale_cls = globals().get(name)
  21. if locale_cls is None:
  22. raise ValueError("Unsupported locale '{}'".format(name))
  23. return locale_cls()
  24. # base locale type.
  25. class Locale(object):
  26. """ Represents locale-specific data and functionality. """
  27. names = []
  28. timeframes = {
  29. "now": "",
  30. "second": "",
  31. "seconds": "",
  32. "minute": "",
  33. "minutes": "",
  34. "hour": "",
  35. "hours": "",
  36. "day": "",
  37. "days": "",
  38. "week": "",
  39. "weeks": "",
  40. "month": "",
  41. "months": "",
  42. "year": "",
  43. "years": "",
  44. }
  45. meridians = {"am": "", "pm": "", "AM": "", "PM": ""}
  46. past = None
  47. future = None
  48. and_word = None
  49. month_names = []
  50. month_abbreviations = []
  51. day_names = []
  52. day_abbreviations = []
  53. ordinal_day_re = r"(\d+)"
  54. def __init__(self):
  55. self._month_name_to_ordinal = None
  56. def describe(self, timeframe, delta=0, only_distance=False):
  57. """ Describes a delta within a timeframe in plain language.
  58. :param timeframe: a string representing a timeframe.
  59. :param delta: a quantity representing a delta in a timeframe.
  60. :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords
  61. """
  62. humanized = self._format_timeframe(timeframe, delta)
  63. if not only_distance:
  64. humanized = self._format_relative(humanized, timeframe, delta)
  65. return humanized
  66. def describe_multi(self, timeframes, only_distance=False):
  67. """ Describes a delta within multiple timeframes in plain language.
  68. :param timeframes: a list of string, quantity pairs each representing a timeframe and delta.
  69. :param only_distance: return only distance eg: "2 hours and 11 seconds" without "in" or "ago" keywords
  70. """
  71. humanized = ""
  72. for index, (timeframe, delta) in enumerate(timeframes):
  73. humanized += self._format_timeframe(timeframe, delta)
  74. if index == len(timeframes) - 2 and self.and_word:
  75. humanized += " " + self.and_word + " "
  76. elif index < len(timeframes) - 1:
  77. humanized += " "
  78. if not only_distance:
  79. humanized = self._format_relative(humanized, timeframe, delta)
  80. return humanized
  81. def day_name(self, day):
  82. """ Returns the day name for a specified day of the week.
  83. :param day: the ``int`` day of the week (1-7).
  84. """
  85. return self.day_names[day]
  86. def day_abbreviation(self, day):
  87. """ Returns the day abbreviation for a specified day of the week.
  88. :param day: the ``int`` day of the week (1-7).
  89. """
  90. return self.day_abbreviations[day]
  91. def month_name(self, month):
  92. """ Returns the month name for a specified month of the year.
  93. :param month: the ``int`` month of the year (1-12).
  94. """
  95. return self.month_names[month]
  96. def month_abbreviation(self, month):
  97. """ Returns the month abbreviation for a specified month of the year.
  98. :param month: the ``int`` month of the year (1-12).
  99. """
  100. return self.month_abbreviations[month]
  101. def month_number(self, name):
  102. """ Returns the month number for a month specified by name or abbreviation.
  103. :param name: the month name or abbreviation.
  104. """
  105. if self._month_name_to_ordinal is None:
  106. self._month_name_to_ordinal = self._name_to_ordinal(self.month_names)
  107. self._month_name_to_ordinal.update(
  108. self._name_to_ordinal(self.month_abbreviations)
  109. )
  110. return self._month_name_to_ordinal.get(name)
  111. def year_full(self, year):
  112. """ Returns the year for specific locale if available
  113. :param name: the ``int`` year (4-digit)
  114. """
  115. return "{:04d}".format(year)
  116. def year_abbreviation(self, year):
  117. """ Returns the year for specific locale if available
  118. :param name: the ``int`` year (4-digit)
  119. """
  120. return "{:04d}".format(year)[2:]
  121. def meridian(self, hour, token):
  122. """ Returns the meridian indicator for a specified hour and format token.
  123. :param hour: the ``int`` hour of the day.
  124. :param token: the format token.
  125. """
  126. if token == "a":
  127. return self.meridians["am"] if hour < 12 else self.meridians["pm"]
  128. if token == "A":
  129. return self.meridians["AM"] if hour < 12 else self.meridians["PM"]
  130. def ordinal_number(self, n):
  131. """ Returns the ordinal format of a given integer
  132. :param n: an integer
  133. """
  134. return self._ordinal_number(n)
  135. def _ordinal_number(self, n):
  136. return "{}".format(n)
  137. def _name_to_ordinal(self, lst):
  138. return dict(map(lambda i: (i[1].lower(), i[0] + 1), enumerate(lst[1:])))
  139. def _format_timeframe(self, timeframe, delta):
  140. return self.timeframes[timeframe].format(trunc(abs(delta)))
  141. def _format_relative(self, humanized, timeframe, delta):
  142. if timeframe == "now":
  143. return humanized
  144. direction = self.past if delta < 0 else self.future
  145. return direction.format(humanized)
  146. # base locale type implementations.
  147. class EnglishLocale(Locale):
  148. names = [
  149. "en",
  150. "en_us",
  151. "en_gb",
  152. "en_au",
  153. "en_be",
  154. "en_jp",
  155. "en_za",
  156. "en_ca",
  157. "en_ph",
  158. ]
  159. past = "{0} ago"
  160. future = "in {0}"
  161. and_word = "and"
  162. timeframes = {
  163. "now": "just now",
  164. "second": "a second",
  165. "seconds": "{0} seconds",
  166. "minute": "a minute",
  167. "minutes": "{0} minutes",
  168. "hour": "an hour",
  169. "hours": "{0} hours",
  170. "day": "a day",
  171. "days": "{0} days",
  172. "week": "a week",
  173. "weeks": "{0} weeks",
  174. "month": "a month",
  175. "months": "{0} months",
  176. "year": "a year",
  177. "years": "{0} years",
  178. }
  179. meridians = {"am": "am", "pm": "pm", "AM": "AM", "PM": "PM"}
  180. month_names = [
  181. "",
  182. "January",
  183. "February",
  184. "March",
  185. "April",
  186. "May",
  187. "June",
  188. "July",
  189. "August",
  190. "September",
  191. "October",
  192. "November",
  193. "December",
  194. ]
  195. month_abbreviations = [
  196. "",
  197. "Jan",
  198. "Feb",
  199. "Mar",
  200. "Apr",
  201. "May",
  202. "Jun",
  203. "Jul",
  204. "Aug",
  205. "Sep",
  206. "Oct",
  207. "Nov",
  208. "Dec",
  209. ]
  210. day_names = [
  211. "",
  212. "Monday",
  213. "Tuesday",
  214. "Wednesday",
  215. "Thursday",
  216. "Friday",
  217. "Saturday",
  218. "Sunday",
  219. ]
  220. day_abbreviations = ["", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
  221. 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))"
  222. def _ordinal_number(self, n):
  223. if n % 100 not in (11, 12, 13):
  224. remainder = abs(n) % 10
  225. if remainder == 1:
  226. return "{}st".format(n)
  227. elif remainder == 2:
  228. return "{}nd".format(n)
  229. elif remainder == 3:
  230. return "{}rd".format(n)
  231. return "{}th".format(n)
  232. def describe(self, timeframe, delta=0, only_distance=False):
  233. """ Describes a delta within a timeframe in plain language.
  234. :param timeframe: a string representing a timeframe.
  235. :param delta: a quantity representing a delta in a timeframe.
  236. :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords
  237. """
  238. humanized = super(EnglishLocale, self).describe(timeframe, delta, only_distance)
  239. if only_distance and timeframe == "now":
  240. humanized = "instantly"
  241. return humanized
  242. class ItalianLocale(Locale):
  243. names = ["it", "it_it"]
  244. past = "{0} fa"
  245. future = "tra {0}"
  246. and_word = "e"
  247. timeframes = {
  248. "now": "adesso",
  249. "second": "un secondo",
  250. "seconds": "{0} qualche secondo",
  251. "minute": "un minuto",
  252. "minutes": "{0} minuti",
  253. "hour": "un'ora",
  254. "hours": "{0} ore",
  255. "day": "un giorno",
  256. "days": "{0} giorni",
  257. "week": "una settimana,",
  258. "weeks": "{0} settimane",
  259. "month": "un mese",
  260. "months": "{0} mesi",
  261. "year": "un anno",
  262. "years": "{0} anni",
  263. }
  264. month_names = [
  265. "",
  266. "gennaio",
  267. "febbraio",
  268. "marzo",
  269. "aprile",
  270. "maggio",
  271. "giugno",
  272. "luglio",
  273. "agosto",
  274. "settembre",
  275. "ottobre",
  276. "novembre",
  277. "dicembre",
  278. ]
  279. month_abbreviations = [
  280. "",
  281. "gen",
  282. "feb",
  283. "mar",
  284. "apr",
  285. "mag",
  286. "giu",
  287. "lug",
  288. "ago",
  289. "set",
  290. "ott",
  291. "nov",
  292. "dic",
  293. ]
  294. day_names = [
  295. "",
  296. "lunedì",
  297. "martedì",
  298. "mercoledì",
  299. "giovedì",
  300. "venerdì",
  301. "sabato",
  302. "domenica",
  303. ]
  304. day_abbreviations = ["", "lun", "mar", "mer", "gio", "ven", "sab", "dom"]
  305. ordinal_day_re = r"((?P<value>[1-3]?[0-9](?=[ºª]))[ºª])"
  306. def _ordinal_number(self, n):
  307. return "{}º".format(n)
  308. class SpanishLocale(Locale):
  309. names = ["es", "es_es"]
  310. past = "hace {0}"
  311. future = "en {0}"
  312. and_word = "y"
  313. timeframes = {
  314. "now": "ahora",
  315. "second": "un segundo",
  316. "seconds": "{0} segundos",
  317. "minute": "un minuto",
  318. "minutes": "{0} minutos",
  319. "hour": "una hora",
  320. "hours": "{0} horas",
  321. "day": "un día",
  322. "days": "{0} días",
  323. "week": "una semana",
  324. "weeks": "{0} semanas",
  325. "month": "un mes",
  326. "months": "{0} meses",
  327. "year": "un año",
  328. "years": "{0} años",
  329. }
  330. meridians = {"am": "am", "pm": "pm", "AM": "AM", "PM": "PM"}
  331. month_names = [
  332. "",
  333. "enero",
  334. "febrero",
  335. "marzo",
  336. "abril",
  337. "mayo",
  338. "junio",
  339. "julio",
  340. "agosto",
  341. "septiembre",
  342. "octubre",
  343. "noviembre",
  344. "diciembre",
  345. ]
  346. month_abbreviations = [
  347. "",
  348. "ene",
  349. "feb",
  350. "mar",
  351. "abr",
  352. "may",
  353. "jun",
  354. "jul",
  355. "ago",
  356. "sep",
  357. "oct",
  358. "nov",
  359. "dic",
  360. ]
  361. day_names = [
  362. "",
  363. "lunes",
  364. "martes",
  365. "miércoles",
  366. "jueves",
  367. "viernes",
  368. "sábado",
  369. "domingo",
  370. ]
  371. day_abbreviations = ["", "lun", "mar", "mie", "jue", "vie", "sab", "dom"]
  372. ordinal_day_re = r"((?P<value>[1-3]?[0-9](?=[ºª]))[ºª])"
  373. def _ordinal_number(self, n):
  374. return "{}º".format(n)
  375. class FrenchLocale(Locale):
  376. names = ["fr", "fr_fr"]
  377. past = "il y a {0}"
  378. future = "dans {0}"
  379. and_word = "et"
  380. timeframes = {
  381. "now": "maintenant",
  382. "second": "une seconde",
  383. "seconds": "{0} quelques secondes",
  384. "minute": "une minute",
  385. "minutes": "{0} minutes",
  386. "hour": "une heure",
  387. "hours": "{0} heures",
  388. "day": "un jour",
  389. "days": "{0} jours",
  390. "week": "une semaine",
  391. "weeks": "{0} semaines",
  392. "month": "un mois",
  393. "months": "{0} mois",
  394. "year": "un an",
  395. "years": "{0} ans",
  396. }
  397. month_names = [
  398. "",
  399. "janvier",
  400. "février",
  401. "mars",
  402. "avril",
  403. "mai",
  404. "juin",
  405. "juillet",
  406. "août",
  407. "septembre",
  408. "octobre",
  409. "novembre",
  410. "décembre",
  411. ]
  412. month_abbreviations = [
  413. "",
  414. "janv",
  415. "févr",
  416. "mars",
  417. "avr",
  418. "mai",
  419. "juin",
  420. "juil",
  421. "août",
  422. "sept",
  423. "oct",
  424. "nov",
  425. "déc",
  426. ]
  427. day_names = [
  428. "",
  429. "lundi",
  430. "mardi",
  431. "mercredi",
  432. "jeudi",
  433. "vendredi",
  434. "samedi",
  435. "dimanche",
  436. ]
  437. day_abbreviations = ["", "lun", "mar", "mer", "jeu", "ven", "sam", "dim"]
  438. ordinal_day_re = (
  439. r"((?P<value>\b1(?=er\b)|[1-3]?[02-9](?=e\b)|[1-3]1(?=e\b))(er|e)\b)"
  440. )
  441. def _ordinal_number(self, n):
  442. if abs(n) == 1:
  443. return "{}er".format(n)
  444. return "{}e".format(n)
  445. class GreekLocale(Locale):
  446. names = ["el", "el_gr"]
  447. past = "{0} πριν"
  448. future = "σε {0}"
  449. and_word = "και"
  450. timeframes = {
  451. "now": "τώρα",
  452. "second": "ένα δεύτερο",
  453. "seconds": "{0} δευτερόλεπτα",
  454. "minute": "ένα λεπτό",
  455. "minutes": "{0} λεπτά",
  456. "hour": "μία ώρα",
  457. "hours": "{0} ώρες",
  458. "day": "μία μέρα",
  459. "days": "{0} μέρες",
  460. "month": "ένα μήνα",
  461. "months": "{0} μήνες",
  462. "year": "ένα χρόνο",
  463. "years": "{0} χρόνια",
  464. }
  465. month_names = [
  466. "",
  467. "Ιανουαρίου",
  468. "Φεβρουαρίου",
  469. "Μαρτίου",
  470. "Απριλίου",
  471. "Μαΐου",
  472. "Ιουνίου",
  473. "Ιουλίου",
  474. "Αυγούστου",
  475. "Σεπτεμβρίου",
  476. "Οκτωβρίου",
  477. "Νοεμβρίου",
  478. "Δεκεμβρίου",
  479. ]
  480. month_abbreviations = [
  481. "",
  482. "Ιαν",
  483. "Φεβ",
  484. "Μαρ",
  485. "Απρ",
  486. "Μαϊ",
  487. "Ιον",
  488. "Ιολ",
  489. "Αυγ",
  490. "Σεπ",
  491. "Οκτ",
  492. "Νοε",
  493. "Δεκ",
  494. ]
  495. day_names = [
  496. "",
  497. "Δευτέρα",
  498. "Τρίτη",
  499. "Τετάρτη",
  500. "Πέμπτη",
  501. "Παρασκευή",
  502. "Σάββατο",
  503. "Κυριακή",
  504. ]
  505. day_abbreviations = ["", "Δευ", "Τρι", "Τετ", "Πεμ", "Παρ", "Σαβ", "Κυρ"]
  506. class JapaneseLocale(Locale):
  507. names = ["ja", "ja_jp"]
  508. past = "{0}前"
  509. future = "{0}後"
  510. timeframes = {
  511. "now": "現在",
  512. "second": "二番目の",
  513. "seconds": "{0}数秒",
  514. "minute": "1分",
  515. "minutes": "{0}分",
  516. "hour": "1時間",
  517. "hours": "{0}時間",
  518. "day": "1日",
  519. "days": "{0}日",
  520. "week": "1週間",
  521. "weeks": "{0}週間",
  522. "month": "1ヶ月",
  523. "months": "{0}ヶ月",
  524. "year": "1年",
  525. "years": "{0}年",
  526. }
  527. month_names = [
  528. "",
  529. "1月",
  530. "2月",
  531. "3月",
  532. "4月",
  533. "5月",
  534. "6月",
  535. "7月",
  536. "8月",
  537. "9月",
  538. "10月",
  539. "11月",
  540. "12月",
  541. ]
  542. month_abbreviations = [
  543. "",
  544. " 1",
  545. " 2",
  546. " 3",
  547. " 4",
  548. " 5",
  549. " 6",
  550. " 7",
  551. " 8",
  552. " 9",
  553. "10",
  554. "11",
  555. "12",
  556. ]
  557. day_names = ["", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日", "日曜日"]
  558. day_abbreviations = ["", "月", "火", "水", "木", "金", "土", "日"]
  559. class SwedishLocale(Locale):
  560. names = ["sv", "sv_se"]
  561. past = "för {0} sen"
  562. future = "om {0}"
  563. and_word = "och"
  564. timeframes = {
  565. "now": "just nu",
  566. "second": "en sekund",
  567. "seconds": "{0} några sekunder",
  568. "minute": "en minut",
  569. "minutes": "{0} minuter",
  570. "hour": "en timme",
  571. "hours": "{0} timmar",
  572. "day": "en dag",
  573. "days": "{0} dagar",
  574. "month": "en månad",
  575. "months": "{0} månader",
  576. "year": "ett år",
  577. "years": "{0} år",
  578. }
  579. month_names = [
  580. "",
  581. "januari",
  582. "februari",
  583. "mars",
  584. "april",
  585. "maj",
  586. "juni",
  587. "juli",
  588. "augusti",
  589. "september",
  590. "oktober",
  591. "november",
  592. "december",
  593. ]
  594. month_abbreviations = [
  595. "",
  596. "jan",
  597. "feb",
  598. "mar",
  599. "apr",
  600. "maj",
  601. "jun",
  602. "jul",
  603. "aug",
  604. "sep",
  605. "okt",
  606. "nov",
  607. "dec",
  608. ]
  609. day_names = [
  610. "",
  611. "måndag",
  612. "tisdag",
  613. "onsdag",
  614. "torsdag",
  615. "fredag",
  616. "lördag",
  617. "söndag",
  618. ]
  619. day_abbreviations = ["", "mån", "tis", "ons", "tor", "fre", "lör", "sön"]
  620. class FinnishLocale(Locale):
  621. names = ["fi", "fi_fi"]
  622. # The finnish grammar is very complex, and its hard to convert
  623. # 1-to-1 to something like English.
  624. past = "{0} sitten"
  625. future = "{0} kuluttua"
  626. timeframes = {
  627. "now": ["juuri nyt", "juuri nyt"],
  628. "second": ["sekunti", "sekunti"],
  629. "seconds": ["{0} muutama sekunti", "{0} muutaman sekunnin"],
  630. "minute": ["minuutti", "minuutin"],
  631. "minutes": ["{0} minuuttia", "{0} minuutin"],
  632. "hour": ["tunti", "tunnin"],
  633. "hours": ["{0} tuntia", "{0} tunnin"],
  634. "day": ["päivä", "päivä"],
  635. "days": ["{0} päivää", "{0} päivän"],
  636. "month": ["kuukausi", "kuukauden"],
  637. "months": ["{0} kuukautta", "{0} kuukauden"],
  638. "year": ["vuosi", "vuoden"],
  639. "years": ["{0} vuotta", "{0} vuoden"],
  640. }
  641. # Months and days are lowercase in Finnish
  642. month_names = [
  643. "",
  644. "tammikuu",
  645. "helmikuu",
  646. "maaliskuu",
  647. "huhtikuu",
  648. "toukokuu",
  649. "kesäkuu",
  650. "heinäkuu",
  651. "elokuu",
  652. "syyskuu",
  653. "lokakuu",
  654. "marraskuu",
  655. "joulukuu",
  656. ]
  657. month_abbreviations = [
  658. "",
  659. "tammi",
  660. "helmi",
  661. "maalis",
  662. "huhti",
  663. "touko",
  664. "kesä",
  665. "heinä",
  666. "elo",
  667. "syys",
  668. "loka",
  669. "marras",
  670. "joulu",
  671. ]
  672. day_names = [
  673. "",
  674. "maanantai",
  675. "tiistai",
  676. "keskiviikko",
  677. "torstai",
  678. "perjantai",
  679. "lauantai",
  680. "sunnuntai",
  681. ]
  682. day_abbreviations = ["", "ma", "ti", "ke", "to", "pe", "la", "su"]
  683. def _format_timeframe(self, timeframe, delta):
  684. return (
  685. self.timeframes[timeframe][0].format(abs(delta)),
  686. self.timeframes[timeframe][1].format(abs(delta)),
  687. )
  688. def _format_relative(self, humanized, timeframe, delta):
  689. if timeframe == "now":
  690. return humanized[0]
  691. direction = self.past if delta < 0 else self.future
  692. which = 0 if delta < 0 else 1
  693. return direction.format(humanized[which])
  694. def _ordinal_number(self, n):
  695. return "{}.".format(n)
  696. class ChineseCNLocale(Locale):
  697. names = ["zh", "zh_cn"]
  698. past = "{0}前"
  699. future = "{0}后"
  700. timeframes = {
  701. "now": "刚才",
  702. "second": "一秒",
  703. "seconds": "{0}秒",
  704. "minute": "1分钟",
  705. "minutes": "{0}分钟",
  706. "hour": "1小时",
  707. "hours": "{0}小时",
  708. "day": "1天",
  709. "days": "{0}天",
  710. "week": "一周",
  711. "weeks": "{0}周",
  712. "month": "1个月",
  713. "months": "{0}个月",
  714. "year": "1年",
  715. "years": "{0}年",
  716. }
  717. month_names = [
  718. "",
  719. "一月",
  720. "二月",
  721. "三月",
  722. "四月",
  723. "五月",
  724. "六月",
  725. "七月",
  726. "八月",
  727. "九月",
  728. "十月",
  729. "十一月",
  730. "十二月",
  731. ]
  732. month_abbreviations = [
  733. "",
  734. " 1",
  735. " 2",
  736. " 3",
  737. " 4",
  738. " 5",
  739. " 6",
  740. " 7",
  741. " 8",
  742. " 9",
  743. "10",
  744. "11",
  745. "12",
  746. ]
  747. day_names = ["", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"]
  748. day_abbreviations = ["", "一", "二", "三", "四", "五", "六", "日"]
  749. class ChineseTWLocale(Locale):
  750. names = ["zh_tw"]
  751. past = "{0}前"
  752. future = "{0}後"
  753. and_word = "和"
  754. timeframes = {
  755. "now": "剛才",
  756. "second": "1秒",
  757. "seconds": "{0}秒",
  758. "minute": "1分鐘",
  759. "minutes": "{0}分鐘",
  760. "hour": "1小時",
  761. "hours": "{0}小時",
  762. "day": "1天",
  763. "days": "{0}天",
  764. "week": "1週",
  765. "weeks": "{0}週",
  766. "month": "1個月",
  767. "months": "{0}個月",
  768. "year": "1年",
  769. "years": "{0}年",
  770. }
  771. month_names = [
  772. "",
  773. "1月",
  774. "2月",
  775. "3月",
  776. "4月",
  777. "5月",
  778. "6月",
  779. "7月",
  780. "8月",
  781. "9月",
  782. "10月",
  783. "11月",
  784. "12月",
  785. ]
  786. month_abbreviations = [
  787. "",
  788. " 1",
  789. " 2",
  790. " 3",
  791. " 4",
  792. " 5",
  793. " 6",
  794. " 7",
  795. " 8",
  796. " 9",
  797. "10",
  798. "11",
  799. "12",
  800. ]
  801. day_names = ["", "週一", "週二", "週三", "週四", "週五", "週六", "週日"]
  802. day_abbreviations = ["", "一", "二", "三", "四", "五", "六", "日"]
  803. class HongKongLocale(Locale):
  804. names = ["zh_hk"]
  805. past = "{0}前"
  806. future = "{0}後"
  807. timeframes = {
  808. "now": "剛才",
  809. "second": "1秒",
  810. "seconds": "{0}秒",
  811. "minute": "1分鐘",
  812. "minutes": "{0}分鐘",
  813. "hour": "1小時",
  814. "hours": "{0}小時",
  815. "day": "1天",
  816. "days": "{0}天",
  817. "week": "1星期",
  818. "weeks": "{0}星期",
  819. "month": "1個月",
  820. "months": "{0}個月",
  821. "year": "1年",
  822. "years": "{0}年",
  823. }
  824. month_names = [
  825. "",
  826. "1月",
  827. "2月",
  828. "3月",
  829. "4月",
  830. "5月",
  831. "6月",
  832. "7月",
  833. "8月",
  834. "9月",
  835. "10月",
  836. "11月",
  837. "12月",
  838. ]
  839. month_abbreviations = [
  840. "",
  841. " 1",
  842. " 2",
  843. " 3",
  844. " 4",
  845. " 5",
  846. " 6",
  847. " 7",
  848. " 8",
  849. " 9",
  850. "10",
  851. "11",
  852. "12",
  853. ]
  854. day_names = ["", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"]
  855. day_abbreviations = ["", "一", "二", "三", "四", "五", "六", "日"]
  856. class KoreanLocale(Locale):
  857. names = ["ko", "ko_kr"]
  858. past = "{0} 전"
  859. future = "{0} 후"
  860. timeframes = {
  861. "now": "지금",
  862. "second": "두 번째",
  863. "seconds": "{0}몇 초",
  864. "minute": "1분",
  865. "minutes": "{0}분",
  866. "hour": "1시간",
  867. "hours": "{0}시간",
  868. "day": "1일",
  869. "days": "{0}일",
  870. "month": "1개월",
  871. "months": "{0}개월",
  872. "year": "1년",
  873. "years": "{0}년",
  874. }
  875. month_names = [
  876. "",
  877. "1월",
  878. "2월",
  879. "3월",
  880. "4월",
  881. "5월",
  882. "6월",
  883. "7월",
  884. "8월",
  885. "9월",
  886. "10월",
  887. "11월",
  888. "12월",
  889. ]
  890. month_abbreviations = [
  891. "",
  892. " 1",
  893. " 2",
  894. " 3",
  895. " 4",
  896. " 5",
  897. " 6",
  898. " 7",
  899. " 8",
  900. " 9",
  901. "10",
  902. "11",
  903. "12",
  904. ]
  905. day_names = ["", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일", "일요일"]
  906. day_abbreviations = ["", "월", "화", "수", "목", "금", "토", "일"]
  907. # derived locale types & implementations.
  908. class DutchLocale(Locale):
  909. names = ["nl", "nl_nl"]
  910. past = "{0} geleden"
  911. future = "over {0}"
  912. timeframes = {
  913. "now": "nu",
  914. "second": "een seconde",
  915. "seconds": "{0} seconden",
  916. "minute": "een minuut",
  917. "minutes": "{0} minuten",
  918. "hour": "een uur",
  919. "hours": "{0} uur",
  920. "day": "een dag",
  921. "days": "{0} dagen",
  922. "week": "een week",
  923. "weeks": "{0} weken",
  924. "month": "een maand",
  925. "months": "{0} maanden",
  926. "year": "een jaar",
  927. "years": "{0} jaar",
  928. }
  929. # In Dutch names of months and days are not starting with a capital letter
  930. # like in the English language.
  931. month_names = [
  932. "",
  933. "januari",
  934. "februari",
  935. "maart",
  936. "april",
  937. "mei",
  938. "juni",
  939. "juli",
  940. "augustus",
  941. "september",
  942. "oktober",
  943. "november",
  944. "december",
  945. ]
  946. month_abbreviations = [
  947. "",
  948. "jan",
  949. "feb",
  950. "mrt",
  951. "apr",
  952. "mei",
  953. "jun",
  954. "jul",
  955. "aug",
  956. "sep",
  957. "okt",
  958. "nov",
  959. "dec",
  960. ]
  961. day_names = [
  962. "",
  963. "maandag",
  964. "dinsdag",
  965. "woensdag",
  966. "donderdag",
  967. "vrijdag",
  968. "zaterdag",
  969. "zondag",
  970. ]
  971. day_abbreviations = ["", "ma", "di", "wo", "do", "vr", "za", "zo"]
  972. class SlavicBaseLocale(Locale):
  973. def _format_timeframe(self, timeframe, delta):
  974. form = self.timeframes[timeframe]
  975. delta = abs(delta)
  976. if isinstance(form, list):
  977. if delta % 10 == 1 and delta % 100 != 11:
  978. form = form[0]
  979. elif 2 <= delta % 10 <= 4 and (delta % 100 < 10 or delta % 100 >= 20):
  980. form = form[1]
  981. else:
  982. form = form[2]
  983. return form.format(delta)
  984. class BelarusianLocale(SlavicBaseLocale):
  985. names = ["be", "be_by"]
  986. past = "{0} таму"
  987. future = "праз {0}"
  988. timeframes = {
  989. "now": "зараз",
  990. "second": "секунду",
  991. "seconds": "{0} некалькі секунд",
  992. "minute": "хвіліну",
  993. "minutes": ["{0} хвіліну", "{0} хвіліны", "{0} хвілін"],
  994. "hour": "гадзіну",
  995. "hours": ["{0} гадзіну", "{0} гадзіны", "{0} гадзін"],
  996. "day": "дзень",
  997. "days": ["{0} дзень", "{0} дні", "{0} дзён"],
  998. "month": "месяц",
  999. "months": ["{0} месяц", "{0} месяцы", "{0} месяцаў"],
  1000. "year": "год",
  1001. "years": ["{0} год", "{0} гады", "{0} гадоў"],
  1002. }
  1003. month_names = [
  1004. "",
  1005. "студзеня",
  1006. "лютага",
  1007. "сакавіка",
  1008. "красавіка",
  1009. "траўня",
  1010. "чэрвеня",
  1011. "ліпеня",
  1012. "жніўня",
  1013. "верасня",
  1014. "кастрычніка",
  1015. "лістапада",
  1016. "снежня",
  1017. ]
  1018. month_abbreviations = [
  1019. "",
  1020. "студ",
  1021. "лют",
  1022. "сак",
  1023. "крас",
  1024. "трав",
  1025. "чэрв",
  1026. "ліп",
  1027. "жнів",
  1028. "вер",
  1029. "каст",
  1030. "ліст",
  1031. "снеж",
  1032. ]
  1033. day_names = [
  1034. "",
  1035. "панядзелак",
  1036. "аўторак",
  1037. "серада",
  1038. "чацвер",
  1039. "пятніца",
  1040. "субота",
  1041. "нядзеля",
  1042. ]
  1043. day_abbreviations = ["", "пн", "ат", "ср", "чц", "пт", "сб", "нд"]
  1044. class PolishLocale(SlavicBaseLocale):
  1045. names = ["pl", "pl_pl"]
  1046. past = "{0} temu"
  1047. future = "za {0}"
  1048. # The nouns should be in genitive case (Polish: "dopełniacz")
  1049. # in order to correctly form `past` & `future` expressions.
  1050. timeframes = {
  1051. "now": "teraz",
  1052. "second": "sekundę",
  1053. "seconds": ["{0} sekund", "{0} sekundy", "{0} sekund"],
  1054. "minute": "minutę",
  1055. "minutes": ["{0} minut", "{0} minuty", "{0} minut"],
  1056. "hour": "godzinę",
  1057. "hours": ["{0} godzin", "{0} godziny", "{0} godzin"],
  1058. "day": "dzień",
  1059. "days": "{0} dni",
  1060. "week": "tydzień",
  1061. "weeks": ["{0} tygodni", "{0} tygodnie", "{0} tygodni"],
  1062. "month": "miesiąc",
  1063. "months": ["{0} miesięcy", "{0} miesiące", "{0} miesięcy"],
  1064. "year": "rok",
  1065. "years": ["{0} lat", "{0} lata", "{0} lat"],
  1066. }
  1067. month_names = [
  1068. "",
  1069. "styczeń",
  1070. "luty",
  1071. "marzec",
  1072. "kwiecień",
  1073. "maj",
  1074. "czerwiec",
  1075. "lipiec",
  1076. "sierpień",
  1077. "wrzesień",
  1078. "październik",
  1079. "listopad",
  1080. "grudzień",
  1081. ]
  1082. month_abbreviations = [
  1083. "",
  1084. "sty",
  1085. "lut",
  1086. "mar",
  1087. "kwi",
  1088. "maj",
  1089. "cze",
  1090. "lip",
  1091. "sie",
  1092. "wrz",
  1093. "paź",
  1094. "lis",
  1095. "gru",
  1096. ]
  1097. day_names = [
  1098. "",
  1099. "poniedziałek",
  1100. "wtorek",
  1101. "środa",
  1102. "czwartek",
  1103. "piątek",
  1104. "sobota",
  1105. "niedziela",
  1106. ]
  1107. day_abbreviations = ["", "Pn", "Wt", "Śr", "Czw", "Pt", "So", "Nd"]
  1108. class RussianLocale(SlavicBaseLocale):
  1109. names = ["ru", "ru_ru"]
  1110. past = "{0} назад"
  1111. future = "через {0}"
  1112. timeframes = {
  1113. "now": "сейчас",
  1114. "second": "Второй",
  1115. "seconds": "{0} несколько секунд",
  1116. "minute": "минуту",
  1117. "minutes": ["{0} минуту", "{0} минуты", "{0} минут"],
  1118. "hour": "час",
  1119. "hours": ["{0} час", "{0} часа", "{0} часов"],
  1120. "day": "день",
  1121. "days": ["{0} день", "{0} дня", "{0} дней"],
  1122. "week": "неделю",
  1123. "weeks": ["{0} неделю", "{0} недели", "{0} недель"],
  1124. "month": "месяц",
  1125. "months": ["{0} месяц", "{0} месяца", "{0} месяцев"],
  1126. "year": "год",
  1127. "years": ["{0} год", "{0} года", "{0} лет"],
  1128. }
  1129. month_names = [
  1130. "",
  1131. "января",
  1132. "февраля",
  1133. "марта",
  1134. "апреля",
  1135. "мая",
  1136. "июня",
  1137. "июля",
  1138. "августа",
  1139. "сентября",
  1140. "октября",
  1141. "ноября",
  1142. "декабря",
  1143. ]
  1144. month_abbreviations = [
  1145. "",
  1146. "янв",
  1147. "фев",
  1148. "мар",
  1149. "апр",
  1150. "май",
  1151. "июн",
  1152. "июл",
  1153. "авг",
  1154. "сен",
  1155. "окт",
  1156. "ноя",
  1157. "дек",
  1158. ]
  1159. day_names = [
  1160. "",
  1161. "понедельник",
  1162. "вторник",
  1163. "среда",
  1164. "четверг",
  1165. "пятница",
  1166. "суббота",
  1167. "воскресенье",
  1168. ]
  1169. day_abbreviations = ["", "пн", "вт", "ср", "чт", "пт", "сб", "вс"]
  1170. class AfrikaansLocale(Locale):
  1171. names = ["af", "af_nl"]
  1172. past = "{0} gelede"
  1173. future = "in {0}"
  1174. timeframes = {
  1175. "now": "nou",
  1176. "second": "n sekonde",
  1177. "seconds": "{0} sekondes",
  1178. "minute": "minuut",
  1179. "minutes": "{0} minute",
  1180. "hour": "uur",
  1181. "hours": "{0} ure",
  1182. "day": "een dag",
  1183. "days": "{0} dae",
  1184. "month": "een maand",
  1185. "months": "{0} maande",
  1186. "year": "een jaar",
  1187. "years": "{0} jaar",
  1188. }
  1189. month_names = [
  1190. "",
  1191. "Januarie",
  1192. "Februarie",
  1193. "Maart",
  1194. "April",
  1195. "Mei",
  1196. "Junie",
  1197. "Julie",
  1198. "Augustus",
  1199. "September",
  1200. "Oktober",
  1201. "November",
  1202. "Desember",
  1203. ]
  1204. month_abbreviations = [
  1205. "",
  1206. "Jan",
  1207. "Feb",
  1208. "Mrt",
  1209. "Apr",
  1210. "Mei",
  1211. "Jun",
  1212. "Jul",
  1213. "Aug",
  1214. "Sep",
  1215. "Okt",
  1216. "Nov",
  1217. "Des",
  1218. ]
  1219. day_names = [
  1220. "",
  1221. "Maandag",
  1222. "Dinsdag",
  1223. "Woensdag",
  1224. "Donderdag",
  1225. "Vrydag",
  1226. "Saterdag",
  1227. "Sondag",
  1228. ]
  1229. day_abbreviations = ["", "Ma", "Di", "Wo", "Do", "Vr", "Za", "So"]
  1230. class BulgarianLocale(SlavicBaseLocale):
  1231. names = ["bg", "bg_BG"]
  1232. past = "{0} назад"
  1233. future = "напред {0}"
  1234. timeframes = {
  1235. "now": "сега",
  1236. "second": "секунда",
  1237. "seconds": "{0} няколко секунди",
  1238. "minute": "минута",
  1239. "minutes": ["{0} минута", "{0} минути", "{0} минути"],
  1240. "hour": "час",
  1241. "hours": ["{0} час", "{0} часа", "{0} часа"],
  1242. "day": "ден",
  1243. "days": ["{0} ден", "{0} дни", "{0} дни"],
  1244. "month": "месец",
  1245. "months": ["{0} месец", "{0} месеца", "{0} месеца"],
  1246. "year": "година",
  1247. "years": ["{0} година", "{0} години", "{0} години"],
  1248. }
  1249. month_names = [
  1250. "",
  1251. "януари",
  1252. "февруари",
  1253. "март",
  1254. "април",
  1255. "май",
  1256. "юни",
  1257. "юли",
  1258. "август",
  1259. "септември",
  1260. "октомври",
  1261. "ноември",
  1262. "декември",
  1263. ]
  1264. month_abbreviations = [
  1265. "",
  1266. "ян",
  1267. "февр",
  1268. "март",
  1269. "апр",
  1270. "май",
  1271. "юни",
  1272. "юли",
  1273. "авг",
  1274. "септ",
  1275. "окт",
  1276. "ноем",
  1277. "дек",
  1278. ]
  1279. day_names = [
  1280. "",
  1281. "понеделник",
  1282. "вторник",
  1283. "сряда",
  1284. "четвъртък",
  1285. "петък",
  1286. "събота",
  1287. "неделя",
  1288. ]
  1289. day_abbreviations = ["", "пон", "вт", "ср", "четв", "пет", "съб", "нед"]
  1290. class UkrainianLocale(SlavicBaseLocale):
  1291. names = ["ua", "uk_ua"]
  1292. past = "{0} тому"
  1293. future = "за {0}"
  1294. timeframes = {
  1295. "now": "зараз",
  1296. "second": "секунда",
  1297. "seconds": "{0} кілька секунд",
  1298. "minute": "хвилину",
  1299. "minutes": ["{0} хвилину", "{0} хвилини", "{0} хвилин"],
  1300. "hour": "годину",
  1301. "hours": ["{0} годину", "{0} години", "{0} годин"],
  1302. "day": "день",
  1303. "days": ["{0} день", "{0} дні", "{0} днів"],
  1304. "month": "місяць",
  1305. "months": ["{0} місяць", "{0} місяці", "{0} місяців"],
  1306. "year": "рік",
  1307. "years": ["{0} рік", "{0} роки", "{0} років"],
  1308. }
  1309. month_names = [
  1310. "",
  1311. "січня",
  1312. "лютого",
  1313. "березня",
  1314. "квітня",
  1315. "травня",
  1316. "червня",
  1317. "липня",
  1318. "серпня",
  1319. "вересня",
  1320. "жовтня",
  1321. "листопада",
  1322. "грудня",
  1323. ]
  1324. month_abbreviations = [
  1325. "",
  1326. "січ",
  1327. "лют",
  1328. "бер",
  1329. "квіт",
  1330. "трав",
  1331. "черв",
  1332. "лип",
  1333. "серп",
  1334. "вер",
  1335. "жовт",
  1336. "лист",
  1337. "груд",
  1338. ]
  1339. day_names = [
  1340. "",
  1341. "понеділок",
  1342. "вівторок",
  1343. "середа",
  1344. "четвер",
  1345. "п’ятниця",
  1346. "субота",
  1347. "неділя",
  1348. ]
  1349. day_abbreviations = ["", "пн", "вт", "ср", "чт", "пт", "сб", "нд"]
  1350. class MacedonianLocale(SlavicBaseLocale):
  1351. names = ["mk", "mk_mk"]
  1352. past = "пред {0}"
  1353. future = "за {0}"
  1354. timeframes = {
  1355. "now": "сега",
  1356. "second": "секунда",
  1357. "seconds": "{0} секунди",
  1358. "minute": "една минута",
  1359. "minutes": ["{0} минута", "{0} минути", "{0} минути"],
  1360. "hour": "еден саат",
  1361. "hours": ["{0} саат", "{0} саати", "{0} саати"],
  1362. "day": "еден ден",
  1363. "days": ["{0} ден", "{0} дена", "{0} дена"],
  1364. "month": "еден месец",
  1365. "months": ["{0} месец", "{0} месеци", "{0} месеци"],
  1366. "year": "една година",
  1367. "years": ["{0} година", "{0} години", "{0} години"],
  1368. }
  1369. meridians = {"am": "дп", "pm": "пп", "AM": "претпладне", "PM": "попладне"}
  1370. month_names = [
  1371. "",
  1372. "Јануари",
  1373. "Февруари",
  1374. "Март",
  1375. "Април",
  1376. "Мај",
  1377. "Јуни",
  1378. "Јули",
  1379. "Август",
  1380. "Септември",
  1381. "Октомври",
  1382. "Ноември",
  1383. "Декември",
  1384. ]
  1385. month_abbreviations = [
  1386. "",
  1387. "Јан.",
  1388. " Фев.",
  1389. " Мар.",
  1390. " Апр.",
  1391. " Мај",
  1392. " Јун.",
  1393. " Јул.",
  1394. " Авг.",
  1395. " Септ.",
  1396. " Окт.",
  1397. " Ноем.",
  1398. " Декем.",
  1399. ]
  1400. day_names = [
  1401. "",
  1402. "Понеделник",
  1403. " Вторник",
  1404. " Среда",
  1405. " Четврток",
  1406. " Петок",
  1407. " Сабота",
  1408. " Недела",
  1409. ]
  1410. day_abbreviations = [
  1411. "",
  1412. "Пон.",
  1413. " Вт.",
  1414. " Сре.",
  1415. " Чет.",
  1416. " Пет.",
  1417. " Саб.",
  1418. " Нед.",
  1419. ]
  1420. class GermanBaseLocale(Locale):
  1421. past = "vor {0}"
  1422. future = "in {0}"
  1423. and_word = "und"
  1424. timeframes = {
  1425. "now": "gerade eben",
  1426. "second": "eine Sekunde",
  1427. "seconds": "{0} Sekunden",
  1428. "minute": "einer Minute",
  1429. "minutes": "{0} Minuten",
  1430. "hour": "einer Stunde",
  1431. "hours": "{0} Stunden",
  1432. "day": "einem Tag",
  1433. "days": "{0} Tagen",
  1434. "week": "einer Woche",
  1435. "weeks": "{0} Wochen",
  1436. "month": "einem Monat",
  1437. "months": "{0} Monaten",
  1438. "year": "einem Jahr",
  1439. "years": "{0} Jahren",
  1440. }
  1441. timeframes_only_distance = timeframes.copy()
  1442. timeframes_only_distance["minute"] = "eine Minute"
  1443. timeframes_only_distance["hour"] = "eine Stunde"
  1444. timeframes_only_distance["day"] = "ein Tag"
  1445. timeframes_only_distance["week"] = "eine Woche"
  1446. timeframes_only_distance["month"] = "ein Monat"
  1447. timeframes_only_distance["year"] = "ein Jahr"
  1448. month_names = [
  1449. "",
  1450. "Januar",
  1451. "Februar",
  1452. "März",
  1453. "April",
  1454. "Mai",
  1455. "Juni",
  1456. "Juli",
  1457. "August",
  1458. "September",
  1459. "Oktober",
  1460. "November",
  1461. "Dezember",
  1462. ]
  1463. month_abbreviations = [
  1464. "",
  1465. "Jan",
  1466. "Feb",
  1467. "Mär",
  1468. "Apr",
  1469. "Mai",
  1470. "Jun",
  1471. "Jul",
  1472. "Aug",
  1473. "Sep",
  1474. "Okt",
  1475. "Nov",
  1476. "Dez",
  1477. ]
  1478. day_names = [
  1479. "",
  1480. "Montag",
  1481. "Dienstag",
  1482. "Mittwoch",
  1483. "Donnerstag",
  1484. "Freitag",
  1485. "Samstag",
  1486. "Sonntag",
  1487. ]
  1488. day_abbreviations = ["", "Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"]
  1489. def _ordinal_number(self, n):
  1490. return "{}.".format(n)
  1491. def describe(self, timeframe, delta=0, only_distance=False):
  1492. """ Describes a delta within a timeframe in plain language.
  1493. :param timeframe: a string representing a timeframe.
  1494. :param delta: a quantity representing a delta in a timeframe.
  1495. :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords
  1496. """
  1497. if not only_distance:
  1498. return super(GermanBaseLocale, self).describe(
  1499. timeframe, delta, only_distance
  1500. )
  1501. # German uses a different case without 'in' or 'ago'
  1502. humanized = self.timeframes_only_distance[timeframe].format(trunc(abs(delta)))
  1503. return humanized
  1504. class GermanLocale(GermanBaseLocale, Locale):
  1505. names = ["de", "de_de"]
  1506. class SwissLocale(GermanBaseLocale, Locale):
  1507. names = ["de_ch"]
  1508. class AustrianLocale(GermanBaseLocale, Locale):
  1509. names = ["de_at"]
  1510. month_names = [
  1511. "",
  1512. "Jänner",
  1513. "Februar",
  1514. "März",
  1515. "April",
  1516. "Mai",
  1517. "Juni",
  1518. "Juli",
  1519. "August",
  1520. "September",
  1521. "Oktober",
  1522. "November",
  1523. "Dezember",
  1524. ]
  1525. class NorwegianLocale(Locale):
  1526. names = ["nb", "nb_no"]
  1527. past = "for {0} siden"
  1528. future = "om {0}"
  1529. timeframes = {
  1530. "now": "nå nettopp",
  1531. "second": "et sekund",
  1532. "seconds": "{0} noen sekunder",
  1533. "minute": "ett minutt",
  1534. "minutes": "{0} minutter",
  1535. "hour": "en time",
  1536. "hours": "{0} timer",
  1537. "day": "en dag",
  1538. "days": "{0} dager",
  1539. "month": "en måned",
  1540. "months": "{0} måneder",
  1541. "year": "ett år",
  1542. "years": "{0} år",
  1543. }
  1544. month_names = [
  1545. "",
  1546. "januar",
  1547. "februar",
  1548. "mars",
  1549. "april",
  1550. "mai",
  1551. "juni",
  1552. "juli",
  1553. "august",
  1554. "september",
  1555. "oktober",
  1556. "november",
  1557. "desember",
  1558. ]
  1559. month_abbreviations = [
  1560. "",
  1561. "jan",
  1562. "feb",
  1563. "mar",
  1564. "apr",
  1565. "mai",
  1566. "jun",
  1567. "jul",
  1568. "aug",
  1569. "sep",
  1570. "okt",
  1571. "nov",
  1572. "des",
  1573. ]
  1574. day_names = [
  1575. "",
  1576. "mandag",
  1577. "tirsdag",
  1578. "onsdag",
  1579. "torsdag",
  1580. "fredag",
  1581. "lørdag",
  1582. "søndag",
  1583. ]
  1584. day_abbreviations = ["", "ma", "ti", "on", "to", "fr", "lø", "sø"]
  1585. class NewNorwegianLocale(Locale):
  1586. names = ["nn", "nn_no"]
  1587. past = "for {0} sidan"
  1588. future = "om {0}"
  1589. timeframes = {
  1590. "now": "no nettopp",
  1591. "second": "et sekund",
  1592. "seconds": "{0} nokre sekund",
  1593. "minute": "ett minutt",
  1594. "minutes": "{0} minutt",
  1595. "hour": "ein time",
  1596. "hours": "{0} timar",
  1597. "day": "ein dag",
  1598. "days": "{0} dagar",
  1599. "month": "en månad",
  1600. "months": "{0} månader",
  1601. "year": "eit år",
  1602. "years": "{0} år",
  1603. }
  1604. month_names = [
  1605. "",
  1606. "januar",
  1607. "februar",
  1608. "mars",
  1609. "april",
  1610. "mai",
  1611. "juni",
  1612. "juli",
  1613. "august",
  1614. "september",
  1615. "oktober",
  1616. "november",
  1617. "desember",
  1618. ]
  1619. month_abbreviations = [
  1620. "",
  1621. "jan",
  1622. "feb",
  1623. "mar",
  1624. "apr",
  1625. "mai",
  1626. "jun",
  1627. "jul",
  1628. "aug",
  1629. "sep",
  1630. "okt",
  1631. "nov",
  1632. "des",
  1633. ]
  1634. day_names = [
  1635. "",
  1636. "måndag",
  1637. "tysdag",
  1638. "onsdag",
  1639. "torsdag",
  1640. "fredag",
  1641. "laurdag",
  1642. "sundag",
  1643. ]
  1644. day_abbreviations = ["", "må", "ty", "on", "to", "fr", "la", "su"]
  1645. class PortugueseLocale(Locale):
  1646. names = ["pt", "pt_pt"]
  1647. past = "há {0}"
  1648. future = "em {0}"
  1649. and_word = "e"
  1650. timeframes = {
  1651. "now": "agora",
  1652. "second": "um segundo",
  1653. "seconds": "{0} segundos",
  1654. "minute": "um minuto",
  1655. "minutes": "{0} minutos",
  1656. "hour": "uma hora",
  1657. "hours": "{0} horas",
  1658. "day": "um dia",
  1659. "days": "{0} dias",
  1660. "week": "uma semana",
  1661. "weeks": "{0} semanas",
  1662. "month": "um mês",
  1663. "months": "{0} meses",
  1664. "year": "um ano",
  1665. "years": "{0} anos",
  1666. }
  1667. month_names = [
  1668. "",
  1669. "janeiro",
  1670. "fevereiro",
  1671. "março",
  1672. "abril",
  1673. "maio",
  1674. "junho",
  1675. "julho",
  1676. "agosto",
  1677. "setembro",
  1678. "outubro",
  1679. "novembro",
  1680. "dezembro",
  1681. ]
  1682. month_abbreviations = [
  1683. "",
  1684. "jan",
  1685. "fev",
  1686. "mar",
  1687. "abr",
  1688. "maio",
  1689. "jun",
  1690. "jul",
  1691. "ago",
  1692. "set",
  1693. "out",
  1694. "nov",
  1695. "dez",
  1696. ]
  1697. day_names = [
  1698. "",
  1699. "segunda-feira",
  1700. "terça-feira",
  1701. "quarta-feira",
  1702. "quinta-feira",
  1703. "sexta-feira",
  1704. "sábado",
  1705. "domingo",
  1706. ]
  1707. day_abbreviations = ["", "seg", "ter", "qua", "qui", "sex", "sab", "dom"]
  1708. class BrazilianPortugueseLocale(PortugueseLocale):
  1709. names = ["pt_br"]
  1710. past = "faz {0}"
  1711. future = "em {0}"
  1712. timeframes = {
  1713. "now": "agora",
  1714. "second": "um segundo",
  1715. "seconds": "{0} segundos",
  1716. "minute": "um minuto",
  1717. "minutes": "{0} minutos",
  1718. "hour": "uma hora",
  1719. "hours": "{0} horas",
  1720. "day": "um dia",
  1721. "days": "{0} dias",
  1722. "week": "uma semana",
  1723. "weeks": "{0} semanas",
  1724. "month": "um mês",
  1725. "months": "{0} meses",
  1726. "year": "um ano",
  1727. "years": "{0} anos",
  1728. }
  1729. month_names = [
  1730. "",
  1731. "Janeiro",
  1732. "Fevereiro",
  1733. "Março",
  1734. "Abril",
  1735. "Maio",
  1736. "Junho",
  1737. "Julho",
  1738. "Agosto",
  1739. "Setembro",
  1740. "Outubro",
  1741. "Novembro",
  1742. "Dezembro",
  1743. ]
  1744. month_abbreviations = [
  1745. "",
  1746. "Jan",
  1747. "Fev",
  1748. "Mar",
  1749. "Abr",
  1750. "Mai",
  1751. "Jun",
  1752. "Jul",
  1753. "Ago",
  1754. "Set",
  1755. "Out",
  1756. "Nov",
  1757. "Dez",
  1758. ]
  1759. day_names = [
  1760. "",
  1761. "Segunda-feira",
  1762. "Terça-feira",
  1763. "Quarta-feira",
  1764. "Quinta-feira",
  1765. "Sexta-feira",
  1766. "Sábado",
  1767. "Domingo",
  1768. ]
  1769. day_abbreviations = ["", "Seg", "Ter", "Qua", "Qui", "Sex", "Sab", "Dom"]
  1770. class TagalogLocale(Locale):
  1771. names = ["tl", "tl_ph"]
  1772. past = "nakaraang {0}"
  1773. future = "{0} mula ngayon"
  1774. timeframes = {
  1775. "now": "ngayon lang",
  1776. "second": "isang segundo",
  1777. "seconds": "{0} segundo",
  1778. "minute": "isang minuto",
  1779. "minutes": "{0} minuto",
  1780. "hour": "isang oras",
  1781. "hours": "{0} oras",
  1782. "day": "isang araw",
  1783. "days": "{0} araw",
  1784. "month": "isang buwan",
  1785. "months": "{0} buwan",
  1786. "year": "isang taon",
  1787. "years": "{0} taon",
  1788. }
  1789. month_names = [
  1790. "",
  1791. "Enero",
  1792. "Pebrero",
  1793. "Marso",
  1794. "Abril",
  1795. "Mayo",
  1796. "Hunyo",
  1797. "Hulyo",
  1798. "Agosto",
  1799. "Setyembre",
  1800. "Oktubre",
  1801. "Nobyembre",
  1802. "Disyembre",
  1803. ]
  1804. month_abbreviations = [
  1805. "",
  1806. "Ene",
  1807. "Peb",
  1808. "Mar",
  1809. "Abr",
  1810. "May",
  1811. "Hun",
  1812. "Hul",
  1813. "Ago",
  1814. "Set",
  1815. "Okt",
  1816. "Nob",
  1817. "Dis",
  1818. ]
  1819. day_names = [
  1820. "",
  1821. "Lunes",
  1822. "Martes",
  1823. "Miyerkules",
  1824. "Huwebes",
  1825. "Biyernes",
  1826. "Sabado",
  1827. "Linggo",
  1828. ]
  1829. day_abbreviations = ["", "Lun", "Mar", "Miy", "Huw", "Biy", "Sab", "Lin"]
  1830. def _ordinal_number(self, n):
  1831. return "ika-{}".format(n)
  1832. class VietnameseLocale(Locale):
  1833. names = ["vi", "vi_vn"]
  1834. past = "{0} trước"
  1835. future = "{0} nữa"
  1836. timeframes = {
  1837. "now": "hiện tại",
  1838. "second": "một giây",
  1839. "seconds": "{0} giây",
  1840. "minute": "một phút",
  1841. "minutes": "{0} phút",
  1842. "hour": "một giờ",
  1843. "hours": "{0} giờ",
  1844. "day": "một ngày",
  1845. "days": "{0} ngày",
  1846. "week": "một tuần",
  1847. "weeks": "{0} tuần",
  1848. "month": "một tháng",
  1849. "months": "{0} tháng",
  1850. "year": "một năm",
  1851. "years": "{0} năm",
  1852. }
  1853. month_names = [
  1854. "",
  1855. "Tháng Một",
  1856. "Tháng Hai",
  1857. "Tháng Ba",
  1858. "Tháng Tư",
  1859. "Tháng Năm",
  1860. "Tháng Sáu",
  1861. "Tháng Bảy",
  1862. "Tháng Tám",
  1863. "Tháng Chín",
  1864. "Tháng Mười",
  1865. "Tháng Mười Một",
  1866. "Tháng Mười Hai",
  1867. ]
  1868. month_abbreviations = [
  1869. "",
  1870. "Tháng 1",
  1871. "Tháng 2",
  1872. "Tháng 3",
  1873. "Tháng 4",
  1874. "Tháng 5",
  1875. "Tháng 6",
  1876. "Tháng 7",
  1877. "Tháng 8",
  1878. "Tháng 9",
  1879. "Tháng 10",
  1880. "Tháng 11",
  1881. "Tháng 12",
  1882. ]
  1883. day_names = [
  1884. "",
  1885. "Thứ Hai",
  1886. "Thứ Ba",
  1887. "Thứ Tư",
  1888. "Thứ Năm",
  1889. "Thứ Sáu",
  1890. "Thứ Bảy",
  1891. "Chủ Nhật",
  1892. ]
  1893. day_abbreviations = ["", "Thứ 2", "Thứ 3", "Thứ 4", "Thứ 5", "Thứ 6", "Thứ 7", "CN"]
  1894. class TurkishLocale(Locale):
  1895. names = ["tr", "tr_tr"]
  1896. past = "{0} önce"
  1897. future = "{0} sonra"
  1898. timeframes = {
  1899. "now": "şimdi",
  1900. "second": "bir saniye",
  1901. "seconds": "{0} saniye",
  1902. "minute": "bir dakika",
  1903. "minutes": "{0} dakika",
  1904. "hour": "bir saat",
  1905. "hours": "{0} saat",
  1906. "day": "bir gün",
  1907. "days": "{0} gün",
  1908. "month": "bir ay",
  1909. "months": "{0} ay",
  1910. "year": "yıl",
  1911. "years": "{0} yıl",
  1912. }
  1913. month_names = [
  1914. "",
  1915. "Ocak",
  1916. "Şubat",
  1917. "Mart",
  1918. "Nisan",
  1919. "Mayıs",
  1920. "Haziran",
  1921. "Temmuz",
  1922. "Ağustos",
  1923. "Eylül",
  1924. "Ekim",
  1925. "Kasım",
  1926. "Aralık",
  1927. ]
  1928. month_abbreviations = [
  1929. "",
  1930. "Oca",
  1931. "Şub",
  1932. "Mar",
  1933. "Nis",
  1934. "May",
  1935. "Haz",
  1936. "Tem",
  1937. "Ağu",
  1938. "Eyl",
  1939. "Eki",
  1940. "Kas",
  1941. "Ara",
  1942. ]
  1943. day_names = [
  1944. "",
  1945. "Pazartesi",
  1946. "Salı",
  1947. "Çarşamba",
  1948. "Perşembe",
  1949. "Cuma",
  1950. "Cumartesi",
  1951. "Pazar",
  1952. ]
  1953. day_abbreviations = ["", "Pzt", "Sal", "Çar", "Per", "Cum", "Cmt", "Paz"]
  1954. class AzerbaijaniLocale(Locale):
  1955. names = ["az", "az_az"]
  1956. past = "{0} əvvəl"
  1957. future = "{0} sonra"
  1958. timeframes = {
  1959. "now": "indi",
  1960. "second": "saniyə",
  1961. "seconds": "{0} saniyə",
  1962. "minute": "bir dəqiqə",
  1963. "minutes": "{0} dəqiqə",
  1964. "hour": "bir saat",
  1965. "hours": "{0} saat",
  1966. "day": "bir gün",
  1967. "days": "{0} gün",
  1968. "month": "bir ay",
  1969. "months": "{0} ay",
  1970. "year": "il",
  1971. "years": "{0} il",
  1972. }
  1973. month_names = [
  1974. "",
  1975. "Yanvar",
  1976. "Fevral",
  1977. "Mart",
  1978. "Aprel",
  1979. "May",
  1980. "İyun",
  1981. "İyul",
  1982. "Avqust",
  1983. "Sentyabr",
  1984. "Oktyabr",
  1985. "Noyabr",
  1986. "Dekabr",
  1987. ]
  1988. month_abbreviations = [
  1989. "",
  1990. "Yan",
  1991. "Fev",
  1992. "Mar",
  1993. "Apr",
  1994. "May",
  1995. "İyn",
  1996. "İyl",
  1997. "Avq",
  1998. "Sen",
  1999. "Okt",
  2000. "Noy",
  2001. "Dek",
  2002. ]
  2003. day_names = [
  2004. "",
  2005. "Bazar ertəsi",
  2006. "Çərşənbə axşamı",
  2007. "Çərşənbə",
  2008. "Cümə axşamı",
  2009. "Cümə",
  2010. "Şənbə",
  2011. "Bazar",
  2012. ]
  2013. day_abbreviations = ["", "Ber", "Çax", "Çər", "Cax", "Cüm", "Şnb", "Bzr"]
  2014. class ArabicLocale(Locale):
  2015. names = [
  2016. "ar",
  2017. "ar_ae",
  2018. "ar_bh",
  2019. "ar_dj",
  2020. "ar_eg",
  2021. "ar_eh",
  2022. "ar_er",
  2023. "ar_km",
  2024. "ar_kw",
  2025. "ar_ly",
  2026. "ar_om",
  2027. "ar_qa",
  2028. "ar_sa",
  2029. "ar_sd",
  2030. "ar_so",
  2031. "ar_ss",
  2032. "ar_td",
  2033. "ar_ye",
  2034. ]
  2035. past = "منذ {0}"
  2036. future = "خلال {0}"
  2037. timeframes = {
  2038. "now": "الآن",
  2039. "second": "ثانية",
  2040. "seconds": {"double": "ثانيتين", "ten": "{0} ثوان", "higher": "{0} ثانية"},
  2041. "minute": "دقيقة",
  2042. "minutes": {"double": "دقيقتين", "ten": "{0} دقائق", "higher": "{0} دقيقة"},
  2043. "hour": "ساعة",
  2044. "hours": {"double": "ساعتين", "ten": "{0} ساعات", "higher": "{0} ساعة"},
  2045. "day": "يوم",
  2046. "days": {"double": "يومين", "ten": "{0} أيام", "higher": "{0} يوم"},
  2047. "month": "شهر",
  2048. "months": {"double": "شهرين", "ten": "{0} أشهر", "higher": "{0} شهر"},
  2049. "year": "سنة",
  2050. "years": {"double": "سنتين", "ten": "{0} سنوات", "higher": "{0} سنة"},
  2051. }
  2052. month_names = [
  2053. "",
  2054. "يناير",
  2055. "فبراير",
  2056. "مارس",
  2057. "أبريل",
  2058. "مايو",
  2059. "يونيو",
  2060. "يوليو",
  2061. "أغسطس",
  2062. "سبتمبر",
  2063. "أكتوبر",
  2064. "نوفمبر",
  2065. "ديسمبر",
  2066. ]
  2067. month_abbreviations = [
  2068. "",
  2069. "يناير",
  2070. "فبراير",
  2071. "مارس",
  2072. "أبريل",
  2073. "مايو",
  2074. "يونيو",
  2075. "يوليو",
  2076. "أغسطس",
  2077. "سبتمبر",
  2078. "أكتوبر",
  2079. "نوفمبر",
  2080. "ديسمبر",
  2081. ]
  2082. day_names = [
  2083. "",
  2084. "الإثنين",
  2085. "الثلاثاء",
  2086. "الأربعاء",
  2087. "الخميس",
  2088. "الجمعة",
  2089. "السبت",
  2090. "الأحد",
  2091. ]
  2092. day_abbreviations = ["", "إثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت", "أحد"]
  2093. def _format_timeframe(self, timeframe, delta):
  2094. form = self.timeframes[timeframe]
  2095. delta = abs(delta)
  2096. if isinstance(form, dict):
  2097. if delta == 2:
  2098. form = form["double"]
  2099. elif delta > 2 and delta <= 10:
  2100. form = form["ten"]
  2101. else:
  2102. form = form["higher"]
  2103. return form.format(delta)
  2104. class LevantArabicLocale(ArabicLocale):
  2105. names = ["ar_iq", "ar_jo", "ar_lb", "ar_ps", "ar_sy"]
  2106. month_names = [
  2107. "",
  2108. "كانون الثاني",
  2109. "شباط",
  2110. "آذار",
  2111. "نيسان",
  2112. "أيار",
  2113. "حزيران",
  2114. "تموز",
  2115. "آب",
  2116. "أيلول",
  2117. "تشرين الأول",
  2118. "تشرين الثاني",
  2119. "كانون الأول",
  2120. ]
  2121. month_abbreviations = [
  2122. "",
  2123. "كانون الثاني",
  2124. "شباط",
  2125. "آذار",
  2126. "نيسان",
  2127. "أيار",
  2128. "حزيران",
  2129. "تموز",
  2130. "آب",
  2131. "أيلول",
  2132. "تشرين الأول",
  2133. "تشرين الثاني",
  2134. "كانون الأول",
  2135. ]
  2136. class AlgeriaTunisiaArabicLocale(ArabicLocale):
  2137. names = ["ar_tn", "ar_dz"]
  2138. month_names = [
  2139. "",
  2140. "جانفي",
  2141. "فيفري",
  2142. "مارس",
  2143. "أفريل",
  2144. "ماي",
  2145. "جوان",
  2146. "جويلية",
  2147. "أوت",
  2148. "سبتمبر",
  2149. "أكتوبر",
  2150. "نوفمبر",
  2151. "ديسمبر",
  2152. ]
  2153. month_abbreviations = [
  2154. "",
  2155. "جانفي",
  2156. "فيفري",
  2157. "مارس",
  2158. "أفريل",
  2159. "ماي",
  2160. "جوان",
  2161. "جويلية",
  2162. "أوت",
  2163. "سبتمبر",
  2164. "أكتوبر",
  2165. "نوفمبر",
  2166. "ديسمبر",
  2167. ]
  2168. class MauritaniaArabicLocale(ArabicLocale):
  2169. names = ["ar_mr"]
  2170. month_names = [
  2171. "",
  2172. "يناير",
  2173. "فبراير",
  2174. "مارس",
  2175. "إبريل",
  2176. "مايو",
  2177. "يونيو",
  2178. "يوليو",
  2179. "أغشت",
  2180. "شتمبر",
  2181. "أكتوبر",
  2182. "نوفمبر",
  2183. "دجمبر",
  2184. ]
  2185. month_abbreviations = [
  2186. "",
  2187. "يناير",
  2188. "فبراير",
  2189. "مارس",
  2190. "إبريل",
  2191. "مايو",
  2192. "يونيو",
  2193. "يوليو",
  2194. "أغشت",
  2195. "شتمبر",
  2196. "أكتوبر",
  2197. "نوفمبر",
  2198. "دجمبر",
  2199. ]
  2200. class MoroccoArabicLocale(ArabicLocale):
  2201. names = ["ar_ma"]
  2202. month_names = [
  2203. "",
  2204. "يناير",
  2205. "فبراير",
  2206. "مارس",
  2207. "أبريل",
  2208. "ماي",
  2209. "يونيو",
  2210. "يوليوز",
  2211. "غشت",
  2212. "شتنبر",
  2213. "أكتوبر",
  2214. "نونبر",
  2215. "دجنبر",
  2216. ]
  2217. month_abbreviations = [
  2218. "",
  2219. "يناير",
  2220. "فبراير",
  2221. "مارس",
  2222. "أبريل",
  2223. "ماي",
  2224. "يونيو",
  2225. "يوليوز",
  2226. "غشت",
  2227. "شتنبر",
  2228. "أكتوبر",
  2229. "نونبر",
  2230. "دجنبر",
  2231. ]
  2232. class IcelandicLocale(Locale):
  2233. def _format_timeframe(self, timeframe, delta):
  2234. timeframe = self.timeframes[timeframe]
  2235. if delta < 0:
  2236. timeframe = timeframe[0]
  2237. elif delta > 0:
  2238. timeframe = timeframe[1]
  2239. return timeframe.format(abs(delta))
  2240. names = ["is", "is_is"]
  2241. past = "fyrir {0} síðan"
  2242. future = "eftir {0}"
  2243. timeframes = {
  2244. "now": "rétt í þessu",
  2245. "second": ("sekúndu", "sekúndu"),
  2246. "seconds": ("{0} nokkrum sekúndum", "nokkrar sekúndur"),
  2247. "minute": ("einni mínútu", "eina mínútu"),
  2248. "minutes": ("{0} mínútum", "{0} mínútur"),
  2249. "hour": ("einum tíma", "einn tíma"),
  2250. "hours": ("{0} tímum", "{0} tíma"),
  2251. "day": ("einum degi", "einn dag"),
  2252. "days": ("{0} dögum", "{0} daga"),
  2253. "month": ("einum mánuði", "einn mánuð"),
  2254. "months": ("{0} mánuðum", "{0} mánuði"),
  2255. "year": ("einu ári", "eitt ár"),
  2256. "years": ("{0} árum", "{0} ár"),
  2257. }
  2258. meridians = {"am": "f.h.", "pm": "e.h.", "AM": "f.h.", "PM": "e.h."}
  2259. month_names = [
  2260. "",
  2261. "janúar",
  2262. "febrúar",
  2263. "mars",
  2264. "apríl",
  2265. "maí",
  2266. "júní",
  2267. "júlí",
  2268. "ágúst",
  2269. "september",
  2270. "október",
  2271. "nóvember",
  2272. "desember",
  2273. ]
  2274. month_abbreviations = [
  2275. "",
  2276. "jan",
  2277. "feb",
  2278. "mar",
  2279. "apr",
  2280. "maí",
  2281. "jún",
  2282. "júl",
  2283. "ágú",
  2284. "sep",
  2285. "okt",
  2286. "nóv",
  2287. "des",
  2288. ]
  2289. day_names = [
  2290. "",
  2291. "mánudagur",
  2292. "þriðjudagur",
  2293. "miðvikudagur",
  2294. "fimmtudagur",
  2295. "föstudagur",
  2296. "laugardagur",
  2297. "sunnudagur",
  2298. ]
  2299. day_abbreviations = ["", "mán", "þri", "mið", "fim", "fös", "lau", "sun"]
  2300. class DanishLocale(Locale):
  2301. names = ["da", "da_dk"]
  2302. past = "for {0} siden"
  2303. future = "efter {0}"
  2304. and_word = "og"
  2305. timeframes = {
  2306. "now": "lige nu",
  2307. "second": "et sekund",
  2308. "seconds": "{0} et par sekunder",
  2309. "minute": "et minut",
  2310. "minutes": "{0} minutter",
  2311. "hour": "en time",
  2312. "hours": "{0} timer",
  2313. "day": "en dag",
  2314. "days": "{0} dage",
  2315. "month": "en måned",
  2316. "months": "{0} måneder",
  2317. "year": "et år",
  2318. "years": "{0} år",
  2319. }
  2320. month_names = [
  2321. "",
  2322. "januar",
  2323. "februar",
  2324. "marts",
  2325. "april",
  2326. "maj",
  2327. "juni",
  2328. "juli",
  2329. "august",
  2330. "september",
  2331. "oktober",
  2332. "november",
  2333. "december",
  2334. ]
  2335. month_abbreviations = [
  2336. "",
  2337. "jan",
  2338. "feb",
  2339. "mar",
  2340. "apr",
  2341. "maj",
  2342. "jun",
  2343. "jul",
  2344. "aug",
  2345. "sep",
  2346. "okt",
  2347. "nov",
  2348. "dec",
  2349. ]
  2350. day_names = [
  2351. "",
  2352. "mandag",
  2353. "tirsdag",
  2354. "onsdag",
  2355. "torsdag",
  2356. "fredag",
  2357. "lørdag",
  2358. "søndag",
  2359. ]
  2360. day_abbreviations = ["", "man", "tir", "ons", "tor", "fre", "lør", "søn"]
  2361. class MalayalamLocale(Locale):
  2362. names = ["ml"]
  2363. past = "{0} മുമ്പ്"
  2364. future = "{0} ശേഷം"
  2365. timeframes = {
  2366. "now": "ഇപ്പോൾ",
  2367. "second": "ഒരു നിമിഷം",
  2368. "seconds": "{0} സെക്കന്റ്‌",
  2369. "minute": "ഒരു മിനിറ്റ്",
  2370. "minutes": "{0} മിനിറ്റ്",
  2371. "hour": "ഒരു മണിക്കൂർ",
  2372. "hours": "{0} മണിക്കൂർ",
  2373. "day": "ഒരു ദിവസം ",
  2374. "days": "{0} ദിവസം ",
  2375. "month": "ഒരു മാസം ",
  2376. "months": "{0} മാസം ",
  2377. "year": "ഒരു വർഷം ",
  2378. "years": "{0} വർഷം ",
  2379. }
  2380. meridians = {
  2381. "am": "രാവിലെ",
  2382. "pm": "ഉച്ചക്ക് ശേഷം",
  2383. "AM": "രാവിലെ",
  2384. "PM": "ഉച്ചക്ക് ശേഷം",
  2385. }
  2386. month_names = [
  2387. "",
  2388. "ജനുവരി",
  2389. "ഫെബ്രുവരി",
  2390. "മാർച്ച്‌",
  2391. "ഏപ്രിൽ ",
  2392. "മെയ്‌ ",
  2393. "ജൂണ്‍",
  2394. "ജൂലൈ",
  2395. "ഓഗസ്റ്റ്‌",
  2396. "സെപ്റ്റംബർ",
  2397. "ഒക്ടോബർ",
  2398. "നവംബർ",
  2399. "ഡിസംബർ",
  2400. ]
  2401. month_abbreviations = [
  2402. "",
  2403. "ജനു",
  2404. "ഫെബ് ",
  2405. "മാർ",
  2406. "ഏപ്രിൽ",
  2407. "മേയ്",
  2408. "ജൂണ്‍",
  2409. "ജൂലൈ",
  2410. "ഓഗസ്റ",
  2411. "സെപ്റ്റ",
  2412. "ഒക്ടോ",
  2413. "നവം",
  2414. "ഡിസം",
  2415. ]
  2416. day_names = ["", "തിങ്കള്‍", "ചൊവ്വ", "ബുധന്‍", "വ്യാഴം", "വെള്ളി", "ശനി", "ഞായര്‍"]
  2417. day_abbreviations = [
  2418. "",
  2419. "തിങ്കള്‍",
  2420. "ചൊവ്വ",
  2421. "ബുധന്‍",
  2422. "വ്യാഴം",
  2423. "വെള്ളി",
  2424. "ശനി",
  2425. "ഞായര്‍",
  2426. ]
  2427. class HindiLocale(Locale):
  2428. names = ["hi"]
  2429. past = "{0} पहले"
  2430. future = "{0} बाद"
  2431. timeframes = {
  2432. "now": "अभी",
  2433. "second": "एक पल",
  2434. "seconds": "{0} सेकंड्",
  2435. "minute": "एक मिनट ",
  2436. "minutes": "{0} मिनट ",
  2437. "hour": "एक घंटा",
  2438. "hours": "{0} घंटे",
  2439. "day": "एक दिन",
  2440. "days": "{0} दिन",
  2441. "month": "एक माह ",
  2442. "months": "{0} महीने ",
  2443. "year": "एक वर्ष ",
  2444. "years": "{0} साल ",
  2445. }
  2446. meridians = {"am": "सुबह", "pm": "शाम", "AM": "सुबह", "PM": "शाम"}
  2447. month_names = [
  2448. "",
  2449. "जनवरी",
  2450. "फरवरी",
  2451. "मार्च",
  2452. "अप्रैल ",
  2453. "मई",
  2454. "जून",
  2455. "जुलाई",
  2456. "अगस्त",
  2457. "सितंबर",
  2458. "अक्टूबर",
  2459. "नवंबर",
  2460. "दिसंबर",
  2461. ]
  2462. month_abbreviations = [
  2463. "",
  2464. "जन",
  2465. "फ़र",
  2466. "मार्च",
  2467. "अप्रै",
  2468. "मई",
  2469. "जून",
  2470. "जुलाई",
  2471. "आग",
  2472. "सित",
  2473. "अकत",
  2474. "नवे",
  2475. "दिस",
  2476. ]
  2477. day_names = [
  2478. "",
  2479. "सोमवार",
  2480. "मंगलवार",
  2481. "बुधवार",
  2482. "गुरुवार",
  2483. "शुक्रवार",
  2484. "शनिवार",
  2485. "रविवार",
  2486. ]
  2487. day_abbreviations = ["", "सोम", "मंगल", "बुध", "गुरुवार", "शुक्र", "शनि", "रवि"]
  2488. class CzechLocale(Locale):
  2489. names = ["cs", "cs_cz"]
  2490. timeframes = {
  2491. "now": "Teď",
  2492. "second": {"past": "vteřina", "future": "vteřina", "zero": "vteřina"},
  2493. "seconds": {"past": "{0} sekundami", "future": ["{0} sekundy", "{0} sekund"]},
  2494. "minute": {"past": "minutou", "future": "minutu", "zero": "{0} minut"},
  2495. "minutes": {"past": "{0} minutami", "future": ["{0} minuty", "{0} minut"]},
  2496. "hour": {"past": "hodinou", "future": "hodinu", "zero": "{0} hodin"},
  2497. "hours": {"past": "{0} hodinami", "future": ["{0} hodiny", "{0} hodin"]},
  2498. "day": {"past": "dnem", "future": "den", "zero": "{0} dnů"},
  2499. "days": {"past": "{0} dny", "future": ["{0} dny", "{0} dnů"]},
  2500. "month": {"past": "měsícem", "future": "měsíc", "zero": "{0} měsíců"},
  2501. "months": {"past": "{0} měsíci", "future": ["{0} měsíce", "{0} měsíců"]},
  2502. "year": {"past": "rokem", "future": "rok", "zero": "{0} let"},
  2503. "years": {"past": "{0} lety", "future": ["{0} roky", "{0} let"]},
  2504. }
  2505. past = "Před {0}"
  2506. future = "Za {0}"
  2507. month_names = [
  2508. "",
  2509. "leden",
  2510. "únor",
  2511. "březen",
  2512. "duben",
  2513. "květen",
  2514. "červen",
  2515. "červenec",
  2516. "srpen",
  2517. "září",
  2518. "říjen",
  2519. "listopad",
  2520. "prosinec",
  2521. ]
  2522. month_abbreviations = [
  2523. "",
  2524. "led",
  2525. "úno",
  2526. "bře",
  2527. "dub",
  2528. "kvě",
  2529. "čvn",
  2530. "čvc",
  2531. "srp",
  2532. "zář",
  2533. "říj",
  2534. "lis",
  2535. "pro",
  2536. ]
  2537. day_names = [
  2538. "",
  2539. "pondělí",
  2540. "úterý",
  2541. "středa",
  2542. "čtvrtek",
  2543. "pátek",
  2544. "sobota",
  2545. "neděle",
  2546. ]
  2547. day_abbreviations = ["", "po", "út", "st", "čt", "pá", "so", "ne"]
  2548. def _format_timeframe(self, timeframe, delta):
  2549. """Czech aware time frame format function, takes into account
  2550. the differences between past and future forms."""
  2551. form = self.timeframes[timeframe]
  2552. if isinstance(form, dict):
  2553. if delta == 0:
  2554. form = form["zero"] # And *never* use 0 in the singular!
  2555. elif delta > 0:
  2556. form = form["future"]
  2557. else:
  2558. form = form["past"]
  2559. delta = abs(delta)
  2560. if isinstance(form, list):
  2561. if 2 <= delta % 10 <= 4 and (delta % 100 < 10 or delta % 100 >= 20):
  2562. form = form[0]
  2563. else:
  2564. form = form[1]
  2565. return form.format(delta)
  2566. class SlovakLocale(Locale):
  2567. names = ["sk", "sk_sk"]
  2568. timeframes = {
  2569. "now": "Teraz",
  2570. "second": {"past": "druhý", "future": "druhý", "zero": "druhý"},
  2571. "seconds": {"past": "pár sekundami", "future": ["{0} sekundy", "{0} sekúnd"]},
  2572. "minute": {"past": "minútou", "future": "minútu", "zero": "{0} minút"},
  2573. "minutes": {"past": "{0} minútami", "future": ["{0} minúty", "{0} minút"]},
  2574. "hour": {"past": "hodinou", "future": "hodinu", "zero": "{0} hodín"},
  2575. "hours": {"past": "{0} hodinami", "future": ["{0} hodiny", "{0} hodín"]},
  2576. "day": {"past": "dňom", "future": "deň", "zero": "{0} dní"},
  2577. "days": {"past": "{0} dňami", "future": ["{0} dni", "{0} dní"]},
  2578. "month": {"past": "mesiacom", "future": "mesiac", "zero": "{0} mesiacov"},
  2579. "months": {"past": "{0} mesiacmi", "future": ["{0} mesiace", "{0} mesiacov"]},
  2580. "year": {"past": "rokom", "future": "rok", "zero": "{0} rokov"},
  2581. "years": {"past": "{0} rokmi", "future": ["{0} roky", "{0} rokov"]},
  2582. }
  2583. past = "Pred {0}"
  2584. future = "O {0}"
  2585. and_word = "a"
  2586. month_names = [
  2587. "",
  2588. "január",
  2589. "február",
  2590. "marec",
  2591. "apríl",
  2592. "máj",
  2593. "jún",
  2594. "júl",
  2595. "august",
  2596. "september",
  2597. "október",
  2598. "november",
  2599. "december",
  2600. ]
  2601. month_abbreviations = [
  2602. "",
  2603. "jan",
  2604. "feb",
  2605. "mar",
  2606. "apr",
  2607. "máj",
  2608. "jún",
  2609. "júl",
  2610. "aug",
  2611. "sep",
  2612. "okt",
  2613. "nov",
  2614. "dec",
  2615. ]
  2616. day_names = [
  2617. "",
  2618. "pondelok",
  2619. "utorok",
  2620. "streda",
  2621. "štvrtok",
  2622. "piatok",
  2623. "sobota",
  2624. "nedeľa",
  2625. ]
  2626. day_abbreviations = ["", "po", "ut", "st", "št", "pi", "so", "ne"]
  2627. def _format_timeframe(self, timeframe, delta):
  2628. """Slovak aware time frame format function, takes into account
  2629. the differences between past and future forms."""
  2630. form = self.timeframes[timeframe]
  2631. if isinstance(form, dict):
  2632. if delta == 0:
  2633. form = form["zero"] # And *never* use 0 in the singular!
  2634. elif delta > 0:
  2635. form = form["future"]
  2636. else:
  2637. form = form["past"]
  2638. delta = abs(delta)
  2639. if isinstance(form, list):
  2640. if 2 <= delta % 10 <= 4 and (delta % 100 < 10 or delta % 100 >= 20):
  2641. form = form[0]
  2642. else:
  2643. form = form[1]
  2644. return form.format(delta)
  2645. class FarsiLocale(Locale):
  2646. names = ["fa", "fa_ir"]
  2647. past = "{0} قبل"
  2648. future = "در {0}"
  2649. timeframes = {
  2650. "now": "اکنون",
  2651. "second": "یک لحظه",
  2652. "seconds": "{0} ثانیه",
  2653. "minute": "یک دقیقه",
  2654. "minutes": "{0} دقیقه",
  2655. "hour": "یک ساعت",
  2656. "hours": "{0} ساعت",
  2657. "day": "یک روز",
  2658. "days": "{0} روز",
  2659. "month": "یک ماه",
  2660. "months": "{0} ماه",
  2661. "year": "یک سال",
  2662. "years": "{0} سال",
  2663. }
  2664. meridians = {
  2665. "am": "قبل از ظهر",
  2666. "pm": "بعد از ظهر",
  2667. "AM": "قبل از ظهر",
  2668. "PM": "بعد از ظهر",
  2669. }
  2670. month_names = [
  2671. "",
  2672. "January",
  2673. "February",
  2674. "March",
  2675. "April",
  2676. "May",
  2677. "June",
  2678. "July",
  2679. "August",
  2680. "September",
  2681. "October",
  2682. "November",
  2683. "December",
  2684. ]
  2685. month_abbreviations = [
  2686. "",
  2687. "Jan",
  2688. "Feb",
  2689. "Mar",
  2690. "Apr",
  2691. "May",
  2692. "Jun",
  2693. "Jul",
  2694. "Aug",
  2695. "Sep",
  2696. "Oct",
  2697. "Nov",
  2698. "Dec",
  2699. ]
  2700. day_names = [
  2701. "",
  2702. "دو شنبه",
  2703. "سه شنبه",
  2704. "چهارشنبه",
  2705. "پنجشنبه",
  2706. "جمعه",
  2707. "شنبه",
  2708. "یکشنبه",
  2709. ]
  2710. day_abbreviations = ["", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
  2711. class HebrewLocale(Locale):
  2712. names = ["he", "he_IL"]
  2713. past = "לפני {0}"
  2714. future = "בעוד {0}"
  2715. timeframes = {
  2716. "now": "הרגע",
  2717. "second": "שנייה",
  2718. "seconds": "{0} שניות",
  2719. "minute": "דקה",
  2720. "minutes": "{0} דקות",
  2721. "hour": "שעה",
  2722. "hours": "{0} שעות",
  2723. "2-hours": "שעתיים",
  2724. "day": "יום",
  2725. "days": "{0} ימים",
  2726. "2-days": "יומיים",
  2727. "month": "חודש",
  2728. "months": "{0} חודשים",
  2729. "2-months": "חודשיים",
  2730. "year": "שנה",
  2731. "years": "{0} שנים",
  2732. "2-years": "שנתיים",
  2733. }
  2734. meridians = {
  2735. "am": 'לפנ"צ',
  2736. "pm": 'אחר"צ',
  2737. "AM": "לפני הצהריים",
  2738. "PM": "אחרי הצהריים",
  2739. }
  2740. month_names = [
  2741. "",
  2742. "ינואר",
  2743. "פברואר",
  2744. "מרץ",
  2745. "אפריל",
  2746. "מאי",
  2747. "יוני",
  2748. "יולי",
  2749. "אוגוסט",
  2750. "ספטמבר",
  2751. "אוקטובר",
  2752. "נובמבר",
  2753. "דצמבר",
  2754. ]
  2755. month_abbreviations = [
  2756. "",
  2757. "ינו׳",
  2758. "פבר׳",
  2759. "מרץ",
  2760. "אפר׳",
  2761. "מאי",
  2762. "יוני",
  2763. "יולי",
  2764. "אוג׳",
  2765. "ספט׳",
  2766. "אוק׳",
  2767. "נוב׳",
  2768. "דצמ׳",
  2769. ]
  2770. day_names = ["", "שני", "שלישי", "רביעי", "חמישי", "שישי", "שבת", "ראשון"]
  2771. day_abbreviations = ["", "ב׳", "ג׳", "ד׳", "ה׳", "ו׳", "ש׳", "א׳"]
  2772. def _format_timeframe(self, timeframe, delta):
  2773. """Hebrew couple of <timeframe> aware"""
  2774. couple = "2-{}".format(timeframe)
  2775. if abs(delta) == 2 and couple in self.timeframes:
  2776. return self.timeframes[couple].format(abs(delta))
  2777. else:
  2778. return self.timeframes[timeframe].format(abs(delta))
  2779. class MarathiLocale(Locale):
  2780. names = ["mr"]
  2781. past = "{0} आधी"
  2782. future = "{0} नंतर"
  2783. timeframes = {
  2784. "now": "सद्य",
  2785. "second": "एक सेकंद",
  2786. "seconds": "{0} सेकंद",
  2787. "minute": "एक मिनिट ",
  2788. "minutes": "{0} मिनिट ",
  2789. "hour": "एक तास",
  2790. "hours": "{0} तास",
  2791. "day": "एक दिवस",
  2792. "days": "{0} दिवस",
  2793. "month": "एक महिना ",
  2794. "months": "{0} महिने ",
  2795. "year": "एक वर्ष ",
  2796. "years": "{0} वर्ष ",
  2797. }
  2798. meridians = {"am": "सकाळ", "pm": "संध्याकाळ", "AM": "सकाळ", "PM": "संध्याकाळ"}
  2799. month_names = [
  2800. "",
  2801. "जानेवारी",
  2802. "फेब्रुवारी",
  2803. "मार्च",
  2804. "एप्रिल",
  2805. "मे",
  2806. "जून",
  2807. "जुलै",
  2808. "अॉगस्ट",
  2809. "सप्टेंबर",
  2810. "अॉक्टोबर",
  2811. "नोव्हेंबर",
  2812. "डिसेंबर",
  2813. ]
  2814. month_abbreviations = [
  2815. "",
  2816. "जान",
  2817. "फेब्रु",
  2818. "मार्च",
  2819. "एप्रि",
  2820. "मे",
  2821. "जून",
  2822. "जुलै",
  2823. "अॉग",
  2824. "सप्टें",
  2825. "अॉक्टो",
  2826. "नोव्हें",
  2827. "डिसें",
  2828. ]
  2829. day_names = [
  2830. "",
  2831. "सोमवार",
  2832. "मंगळवार",
  2833. "बुधवार",
  2834. "गुरुवार",
  2835. "शुक्रवार",
  2836. "शनिवार",
  2837. "रविवार",
  2838. ]
  2839. day_abbreviations = ["", "सोम", "मंगळ", "बुध", "गुरु", "शुक्र", "शनि", "रवि"]
  2840. def _map_locales():
  2841. locales = {}
  2842. for _, cls in inspect.getmembers(sys.modules[__name__], inspect.isclass):
  2843. if issubclass(cls, Locale): # pragma: no branch
  2844. for name in cls.names:
  2845. locales[name.lower()] = cls
  2846. return locales
  2847. class CatalanLocale(Locale):
  2848. names = ["ca", "ca_es", "ca_ad", "ca_fr", "ca_it"]
  2849. past = "Fa {0}"
  2850. future = "En {0}"
  2851. and_word = "i"
  2852. timeframes = {
  2853. "now": "Ara mateix",
  2854. "second": "un segon",
  2855. "seconds": "{0} segons",
  2856. "minute": "1 minut",
  2857. "minutes": "{0} minuts",
  2858. "hour": "una hora",
  2859. "hours": "{0} hores",
  2860. "day": "un dia",
  2861. "days": "{0} dies",
  2862. "month": "un mes",
  2863. "months": "{0} mesos",
  2864. "year": "un any",
  2865. "years": "{0} anys",
  2866. }
  2867. month_names = [
  2868. "",
  2869. "Gener",
  2870. "Febrer",
  2871. "Març",
  2872. "Abril",
  2873. "Maig",
  2874. "Juny",
  2875. "Juliol",
  2876. "Agost",
  2877. "Setembre",
  2878. "Octubre",
  2879. "Novembre",
  2880. "Desembre",
  2881. ]
  2882. month_abbreviations = [
  2883. "",
  2884. "Gener",
  2885. "Febrer",
  2886. "Març",
  2887. "Abril",
  2888. "Maig",
  2889. "Juny",
  2890. "Juliol",
  2891. "Agost",
  2892. "Setembre",
  2893. "Octubre",
  2894. "Novembre",
  2895. "Desembre",
  2896. ]
  2897. day_names = [
  2898. "",
  2899. "Dilluns",
  2900. "Dimarts",
  2901. "Dimecres",
  2902. "Dijous",
  2903. "Divendres",
  2904. "Dissabte",
  2905. "Diumenge",
  2906. ]
  2907. day_abbreviations = [
  2908. "",
  2909. "Dilluns",
  2910. "Dimarts",
  2911. "Dimecres",
  2912. "Dijous",
  2913. "Divendres",
  2914. "Dissabte",
  2915. "Diumenge",
  2916. ]
  2917. class BasqueLocale(Locale):
  2918. names = ["eu", "eu_eu"]
  2919. past = "duela {0}"
  2920. future = "{0}" # I don't know what's the right phrase in Basque for the future.
  2921. timeframes = {
  2922. "now": "Orain",
  2923. "second": "segundo bat",
  2924. "seconds": "{0} segundu",
  2925. "minute": "minutu bat",
  2926. "minutes": "{0} minutu",
  2927. "hour": "ordu bat",
  2928. "hours": "{0} ordu",
  2929. "day": "egun bat",
  2930. "days": "{0} egun",
  2931. "month": "hilabete bat",
  2932. "months": "{0} hilabet",
  2933. "year": "urte bat",
  2934. "years": "{0} urte",
  2935. }
  2936. month_names = [
  2937. "",
  2938. "urtarrilak",
  2939. "otsailak",
  2940. "martxoak",
  2941. "apirilak",
  2942. "maiatzak",
  2943. "ekainak",
  2944. "uztailak",
  2945. "abuztuak",
  2946. "irailak",
  2947. "urriak",
  2948. "azaroak",
  2949. "abenduak",
  2950. ]
  2951. month_abbreviations = [
  2952. "",
  2953. "urt",
  2954. "ots",
  2955. "mar",
  2956. "api",
  2957. "mai",
  2958. "eka",
  2959. "uzt",
  2960. "abu",
  2961. "ira",
  2962. "urr",
  2963. "aza",
  2964. "abe",
  2965. ]
  2966. day_names = [
  2967. "",
  2968. "astelehena",
  2969. "asteartea",
  2970. "asteazkena",
  2971. "osteguna",
  2972. "ostirala",
  2973. "larunbata",
  2974. "igandea",
  2975. ]
  2976. day_abbreviations = ["", "al", "ar", "az", "og", "ol", "lr", "ig"]
  2977. class HungarianLocale(Locale):
  2978. names = ["hu", "hu_hu"]
  2979. past = "{0} ezelőtt"
  2980. future = "{0} múlva"
  2981. timeframes = {
  2982. "now": "éppen most",
  2983. "second": {"past": "egy második", "future": "egy második"},
  2984. "seconds": {"past": "{0} másodpercekkel", "future": "{0} pár másodperc"},
  2985. "minute": {"past": "egy perccel", "future": "egy perc"},
  2986. "minutes": {"past": "{0} perccel", "future": "{0} perc"},
  2987. "hour": {"past": "egy órával", "future": "egy óra"},
  2988. "hours": {"past": "{0} órával", "future": "{0} óra"},
  2989. "day": {"past": "egy nappal", "future": "egy nap"},
  2990. "days": {"past": "{0} nappal", "future": "{0} nap"},
  2991. "month": {"past": "egy hónappal", "future": "egy hónap"},
  2992. "months": {"past": "{0} hónappal", "future": "{0} hónap"},
  2993. "year": {"past": "egy évvel", "future": "egy év"},
  2994. "years": {"past": "{0} évvel", "future": "{0} év"},
  2995. }
  2996. month_names = [
  2997. "",
  2998. "január",
  2999. "február",
  3000. "március",
  3001. "április",
  3002. "május",
  3003. "június",
  3004. "július",
  3005. "augusztus",
  3006. "szeptember",
  3007. "október",
  3008. "november",
  3009. "december",
  3010. ]
  3011. month_abbreviations = [
  3012. "",
  3013. "jan",
  3014. "febr",
  3015. "márc",
  3016. "ápr",
  3017. "máj",
  3018. "jún",
  3019. "júl",
  3020. "aug",
  3021. "szept",
  3022. "okt",
  3023. "nov",
  3024. "dec",
  3025. ]
  3026. day_names = [
  3027. "",
  3028. "hétfő",
  3029. "kedd",
  3030. "szerda",
  3031. "csütörtök",
  3032. "péntek",
  3033. "szombat",
  3034. "vasárnap",
  3035. ]
  3036. day_abbreviations = ["", "hét", "kedd", "szer", "csüt", "pént", "szom", "vas"]
  3037. meridians = {"am": "de", "pm": "du", "AM": "DE", "PM": "DU"}
  3038. def _format_timeframe(self, timeframe, delta):
  3039. form = self.timeframes[timeframe]
  3040. if isinstance(form, dict):
  3041. if delta > 0:
  3042. form = form["future"]
  3043. else:
  3044. form = form["past"]
  3045. return form.format(abs(delta))
  3046. class EsperantoLocale(Locale):
  3047. names = ["eo", "eo_xx"]
  3048. past = "antaŭ {0}"
  3049. future = "post {0}"
  3050. timeframes = {
  3051. "now": "nun",
  3052. "second": "sekundo",
  3053. "seconds": "{0} kelkaj sekundoj",
  3054. "minute": "unu minuto",
  3055. "minutes": "{0} minutoj",
  3056. "hour": "un horo",
  3057. "hours": "{0} horoj",
  3058. "day": "unu tago",
  3059. "days": "{0} tagoj",
  3060. "month": "unu monato",
  3061. "months": "{0} monatoj",
  3062. "year": "unu jaro",
  3063. "years": "{0} jaroj",
  3064. }
  3065. month_names = [
  3066. "",
  3067. "januaro",
  3068. "februaro",
  3069. "marto",
  3070. "aprilo",
  3071. "majo",
  3072. "junio",
  3073. "julio",
  3074. "aŭgusto",
  3075. "septembro",
  3076. "oktobro",
  3077. "novembro",
  3078. "decembro",
  3079. ]
  3080. month_abbreviations = [
  3081. "",
  3082. "jan",
  3083. "feb",
  3084. "mar",
  3085. "apr",
  3086. "maj",
  3087. "jun",
  3088. "jul",
  3089. "aŭg",
  3090. "sep",
  3091. "okt",
  3092. "nov",
  3093. "dec",
  3094. ]
  3095. day_names = [
  3096. "",
  3097. "lundo",
  3098. "mardo",
  3099. "merkredo",
  3100. "ĵaŭdo",
  3101. "vendredo",
  3102. "sabato",
  3103. "dimanĉo",
  3104. ]
  3105. day_abbreviations = ["", "lun", "mar", "mer", "ĵaŭ", "ven", "sab", "dim"]
  3106. meridians = {"am": "atm", "pm": "ptm", "AM": "ATM", "PM": "PTM"}
  3107. ordinal_day_re = r"((?P<value>[1-3]?[0-9](?=a))a)"
  3108. def _ordinal_number(self, n):
  3109. return "{}a".format(n)
  3110. class ThaiLocale(Locale):
  3111. names = ["th", "th_th"]
  3112. past = "{0}{1}ที่ผ่านมา"
  3113. future = "ในอีก{1}{0}"
  3114. timeframes = {
  3115. "now": "ขณะนี้",
  3116. "second": "วินาที",
  3117. "seconds": "{0} ไม่กี่วินาที",
  3118. "minute": "1 นาที",
  3119. "minutes": "{0} นาที",
  3120. "hour": "1 ชั่วโมง",
  3121. "hours": "{0} ชั่วโมง",
  3122. "day": "1 วัน",
  3123. "days": "{0} วัน",
  3124. "month": "1 เดือน",
  3125. "months": "{0} เดือน",
  3126. "year": "1 ปี",
  3127. "years": "{0} ปี",
  3128. }
  3129. month_names = [
  3130. "",
  3131. "มกราคม",
  3132. "กุมภาพันธ์",
  3133. "มีนาคม",
  3134. "เมษายน",
  3135. "พฤษภาคม",
  3136. "มิถุนายน",
  3137. "กรกฎาคม",
  3138. "สิงหาคม",
  3139. "กันยายน",
  3140. "ตุลาคม",
  3141. "พฤศจิกายน",
  3142. "ธันวาคม",
  3143. ]
  3144. month_abbreviations = [
  3145. "",
  3146. "ม.ค.",
  3147. "ก.พ.",
  3148. "มี.ค.",
  3149. "เม.ย.",
  3150. "พ.ค.",
  3151. "มิ.ย.",
  3152. "ก.ค.",
  3153. "ส.ค.",
  3154. "ก.ย.",
  3155. "ต.ค.",
  3156. "พ.ย.",
  3157. "ธ.ค.",
  3158. ]
  3159. day_names = ["", "จันทร์", "อังคาร", "พุธ", "พฤหัสบดี", "ศุกร์", "เสาร์", "อาทิตย์"]
  3160. day_abbreviations = ["", "จ", "อ", "พ", "พฤ", "ศ", "ส", "อา"]
  3161. meridians = {"am": "am", "pm": "pm", "AM": "AM", "PM": "PM"}
  3162. BE_OFFSET = 543
  3163. def year_full(self, year):
  3164. """Thai always use Buddhist Era (BE) which is CE + 543"""
  3165. year += self.BE_OFFSET
  3166. return "{:04d}".format(year)
  3167. def year_abbreviation(self, year):
  3168. """Thai always use Buddhist Era (BE) which is CE + 543"""
  3169. year += self.BE_OFFSET
  3170. return "{:04d}".format(year)[2:]
  3171. def _format_relative(self, humanized, timeframe, delta):
  3172. """Thai normally doesn't have any space between words"""
  3173. if timeframe == "now":
  3174. return humanized
  3175. space = "" if timeframe == "seconds" else " "
  3176. direction = self.past if delta < 0 else self.future
  3177. return direction.format(humanized, space)
  3178. class BengaliLocale(Locale):
  3179. names = ["bn", "bn_bd", "bn_in"]
  3180. past = "{0} আগে"
  3181. future = "{0} পরে"
  3182. timeframes = {
  3183. "now": "এখন",
  3184. "second": "একটি দ্বিতীয়",
  3185. "seconds": "{0} সেকেন্ড",
  3186. "minute": "এক মিনিট",
  3187. "minutes": "{0} মিনিট",
  3188. "hour": "এক ঘণ্টা",
  3189. "hours": "{0} ঘণ্টা",
  3190. "day": "এক দিন",
  3191. "days": "{0} দিন",
  3192. "month": "এক মাস",
  3193. "months": "{0} মাস ",
  3194. "year": "এক বছর",
  3195. "years": "{0} বছর",
  3196. }
  3197. meridians = {"am": "সকাল", "pm": "বিকাল", "AM": "সকাল", "PM": "বিকাল"}
  3198. month_names = [
  3199. "",
  3200. "জানুয়ারি",
  3201. "ফেব্রুয়ারি",
  3202. "মার্চ",
  3203. "এপ্রিল",
  3204. "মে",
  3205. "জুন",
  3206. "জুলাই",
  3207. "আগস্ট",
  3208. "সেপ্টেম্বর",
  3209. "অক্টোবর",
  3210. "নভেম্বর",
  3211. "ডিসেম্বর",
  3212. ]
  3213. month_abbreviations = [
  3214. "",
  3215. "জানু",
  3216. "ফেব",
  3217. "মার্চ",
  3218. "এপ্রি",
  3219. "মে",
  3220. "জুন",
  3221. "জুল",
  3222. "অগা",
  3223. "সেপ্ট",
  3224. "অক্টো",
  3225. "নভে",
  3226. "ডিসে",
  3227. ]
  3228. day_names = [
  3229. "",
  3230. "সোমবার",
  3231. "মঙ্গলবার",
  3232. "বুধবার",
  3233. "বৃহস্পতিবার",
  3234. "শুক্রবার",
  3235. "শনিবার",
  3236. "রবিবার",
  3237. ]
  3238. day_abbreviations = ["", "সোম", "মঙ্গল", "বুধ", "বৃহঃ", "শুক্র", "শনি", "রবি"]
  3239. def _ordinal_number(self, n):
  3240. if n > 10 or n == 0:
  3241. return "{}তম".format(n)
  3242. if n in [1, 5, 7, 8, 9, 10]:
  3243. return "{}ম".format(n)
  3244. if n in [2, 3]:
  3245. return "{}য়".format(n)
  3246. if n == 4:
  3247. return "{}র্থ".format(n)
  3248. if n == 6:
  3249. return "{}ষ্ঠ".format(n)
  3250. class RomanshLocale(Locale):
  3251. names = ["rm", "rm_ch"]
  3252. past = "avant {0}"
  3253. future = "en {0}"
  3254. timeframes = {
  3255. "now": "en quest mument",
  3256. "second": "in secunda",
  3257. "seconds": "{0} secundas",
  3258. "minute": "ina minuta",
  3259. "minutes": "{0} minutas",
  3260. "hour": "in'ura",
  3261. "hours": "{0} ura",
  3262. "day": "in di",
  3263. "days": "{0} dis",
  3264. "month": "in mais",
  3265. "months": "{0} mais",
  3266. "year": "in onn",
  3267. "years": "{0} onns",
  3268. }
  3269. month_names = [
  3270. "",
  3271. "schaner",
  3272. "favrer",
  3273. "mars",
  3274. "avrigl",
  3275. "matg",
  3276. "zercladur",
  3277. "fanadur",
  3278. "avust",
  3279. "settember",
  3280. "october",
  3281. "november",
  3282. "december",
  3283. ]
  3284. month_abbreviations = [
  3285. "",
  3286. "schan",
  3287. "fav",
  3288. "mars",
  3289. "avr",
  3290. "matg",
  3291. "zer",
  3292. "fan",
  3293. "avu",
  3294. "set",
  3295. "oct",
  3296. "nov",
  3297. "dec",
  3298. ]
  3299. day_names = [
  3300. "",
  3301. "glindesdi",
  3302. "mardi",
  3303. "mesemna",
  3304. "gievgia",
  3305. "venderdi",
  3306. "sonda",
  3307. "dumengia",
  3308. ]
  3309. day_abbreviations = ["", "gli", "ma", "me", "gie", "ve", "so", "du"]
  3310. class RomanianLocale(Locale):
  3311. names = ["ro", "ro_ro"]
  3312. past = "{0} în urmă"
  3313. future = "peste {0}"
  3314. and_word = "și"
  3315. timeframes = {
  3316. "now": "acum",
  3317. "second": "o secunda",
  3318. "seconds": "{0} câteva secunde",
  3319. "minute": "un minut",
  3320. "minutes": "{0} minute",
  3321. "hour": "o oră",
  3322. "hours": "{0} ore",
  3323. "day": "o zi",
  3324. "days": "{0} zile",
  3325. "month": "o lună",
  3326. "months": "{0} luni",
  3327. "year": "un an",
  3328. "years": "{0} ani",
  3329. }
  3330. month_names = [
  3331. "",
  3332. "ianuarie",
  3333. "februarie",
  3334. "martie",
  3335. "aprilie",
  3336. "mai",
  3337. "iunie",
  3338. "iulie",
  3339. "august",
  3340. "septembrie",
  3341. "octombrie",
  3342. "noiembrie",
  3343. "decembrie",
  3344. ]
  3345. month_abbreviations = [
  3346. "",
  3347. "ian",
  3348. "febr",
  3349. "mart",
  3350. "apr",
  3351. "mai",
  3352. "iun",
  3353. "iul",
  3354. "aug",
  3355. "sept",
  3356. "oct",
  3357. "nov",
  3358. "dec",
  3359. ]
  3360. day_names = [
  3361. "",
  3362. "luni",
  3363. "marți",
  3364. "miercuri",
  3365. "joi",
  3366. "vineri",
  3367. "sâmbătă",
  3368. "duminică",
  3369. ]
  3370. day_abbreviations = ["", "Lun", "Mar", "Mie", "Joi", "Vin", "Sâm", "Dum"]
  3371. class SlovenianLocale(Locale):
  3372. names = ["sl", "sl_si"]
  3373. past = "pred {0}"
  3374. future = "čez {0}"
  3375. and_word = "in"
  3376. timeframes = {
  3377. "now": "zdaj",
  3378. "second": "sekundo",
  3379. "seconds": "{0} sekund",
  3380. "minute": "minuta",
  3381. "minutes": "{0} minutami",
  3382. "hour": "uro",
  3383. "hours": "{0} ur",
  3384. "day": "dan",
  3385. "days": "{0} dni",
  3386. "month": "mesec",
  3387. "months": "{0} mesecev",
  3388. "year": "leto",
  3389. "years": "{0} let",
  3390. }
  3391. meridians = {"am": "", "pm": "", "AM": "", "PM": ""}
  3392. month_names = [
  3393. "",
  3394. "Januar",
  3395. "Februar",
  3396. "Marec",
  3397. "April",
  3398. "Maj",
  3399. "Junij",
  3400. "Julij",
  3401. "Avgust",
  3402. "September",
  3403. "Oktober",
  3404. "November",
  3405. "December",
  3406. ]
  3407. month_abbreviations = [
  3408. "",
  3409. "Jan",
  3410. "Feb",
  3411. "Mar",
  3412. "Apr",
  3413. "Maj",
  3414. "Jun",
  3415. "Jul",
  3416. "Avg",
  3417. "Sep",
  3418. "Okt",
  3419. "Nov",
  3420. "Dec",
  3421. ]
  3422. day_names = [
  3423. "",
  3424. "Ponedeljek",
  3425. "Torek",
  3426. "Sreda",
  3427. "Četrtek",
  3428. "Petek",
  3429. "Sobota",
  3430. "Nedelja",
  3431. ]
  3432. day_abbreviations = ["", "Pon", "Tor", "Sre", "Čet", "Pet", "Sob", "Ned"]
  3433. class IndonesianLocale(Locale):
  3434. names = ["id", "id_id"]
  3435. past = "{0} yang lalu"
  3436. future = "dalam {0}"
  3437. and_word = "dan"
  3438. timeframes = {
  3439. "now": "baru saja",
  3440. "second": "1 sebentar",
  3441. "seconds": "{0} detik",
  3442. "minute": "1 menit",
  3443. "minutes": "{0} menit",
  3444. "hour": "1 jam",
  3445. "hours": "{0} jam",
  3446. "day": "1 hari",
  3447. "days": "{0} hari",
  3448. "month": "1 bulan",
  3449. "months": "{0} bulan",
  3450. "year": "1 tahun",
  3451. "years": "{0} tahun",
  3452. }
  3453. meridians = {"am": "", "pm": "", "AM": "", "PM": ""}
  3454. month_names = [
  3455. "",
  3456. "Januari",
  3457. "Februari",
  3458. "Maret",
  3459. "April",
  3460. "Mei",
  3461. "Juni",
  3462. "Juli",
  3463. "Agustus",
  3464. "September",
  3465. "Oktober",
  3466. "November",
  3467. "Desember",
  3468. ]
  3469. month_abbreviations = [
  3470. "",
  3471. "Jan",
  3472. "Feb",
  3473. "Mar",
  3474. "Apr",
  3475. "Mei",
  3476. "Jun",
  3477. "Jul",
  3478. "Ags",
  3479. "Sept",
  3480. "Okt",
  3481. "Nov",
  3482. "Des",
  3483. ]
  3484. day_names = ["", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu", "Minggu"]
  3485. day_abbreviations = [
  3486. "",
  3487. "Senin",
  3488. "Selasa",
  3489. "Rabu",
  3490. "Kamis",
  3491. "Jumat",
  3492. "Sabtu",
  3493. "Minggu",
  3494. ]
  3495. class NepaliLocale(Locale):
  3496. names = ["ne", "ne_np"]
  3497. past = "{0} पहिले"
  3498. future = "{0} पछी"
  3499. timeframes = {
  3500. "now": "अहिले",
  3501. "second": "एक सेकेन्ड",
  3502. "seconds": "{0} सेकण्ड",
  3503. "minute": "मिनेट",
  3504. "minutes": "{0} मिनेट",
  3505. "hour": "एक घण्टा",
  3506. "hours": "{0} घण्टा",
  3507. "day": "एक दिन",
  3508. "days": "{0} दिन",
  3509. "month": "एक महिना",
  3510. "months": "{0} महिना",
  3511. "year": "एक बर्ष",
  3512. "years": "बर्ष",
  3513. }
  3514. meridians = {"am": "पूर्वाह्न", "pm": "अपरान्ह", "AM": "पूर्वाह्न", "PM": "अपरान्ह"}
  3515. month_names = [
  3516. "",
  3517. "जनवरी",
  3518. "फेब्रुअरी",
  3519. "मार्च",
  3520. "एप्रील",
  3521. "मे",
  3522. "जुन",
  3523. "जुलाई",
  3524. "अगष्ट",
  3525. "सेप्टेम्बर",
  3526. "अक्टोबर",
  3527. "नोवेम्बर",
  3528. "डिसेम्बर",
  3529. ]
  3530. month_abbreviations = [
  3531. "",
  3532. "जन",
  3533. "फेब",
  3534. "मार्च",
  3535. "एप्रील",
  3536. "मे",
  3537. "जुन",
  3538. "जुलाई",
  3539. "अग",
  3540. "सेप",
  3541. "अक्ट",
  3542. "नोव",
  3543. "डिस",
  3544. ]
  3545. day_names = [
  3546. "",
  3547. "सोमवार",
  3548. "मंगलवार",
  3549. "बुधवार",
  3550. "बिहिवार",
  3551. "शुक्रवार",
  3552. "शनिवार",
  3553. "आइतवार",
  3554. ]
  3555. day_abbreviations = ["", "सोम", "मंगल", "बुध", "बिहि", "शुक्र", "शनि", "आइत"]
  3556. class EstonianLocale(Locale):
  3557. names = ["ee", "et"]
  3558. past = "{0} tagasi"
  3559. future = "{0} pärast"
  3560. and_word = "ja"
  3561. timeframes = {
  3562. "now": {"past": "just nüüd", "future": "just nüüd"},
  3563. "second": {"past": "üks sekund", "future": "ühe sekundi"},
  3564. "seconds": {"past": "{0} sekundit", "future": "{0} sekundi"},
  3565. "minute": {"past": "üks minut", "future": "ühe minuti"},
  3566. "minutes": {"past": "{0} minutit", "future": "{0} minuti"},
  3567. "hour": {"past": "tund aega", "future": "tunni aja"},
  3568. "hours": {"past": "{0} tundi", "future": "{0} tunni"},
  3569. "day": {"past": "üks päev", "future": "ühe päeva"},
  3570. "days": {"past": "{0} päeva", "future": "{0} päeva"},
  3571. "month": {"past": "üks kuu", "future": "ühe kuu"},
  3572. "months": {"past": "{0} kuud", "future": "{0} kuu"},
  3573. "year": {"past": "üks aasta", "future": "ühe aasta"},
  3574. "years": {"past": "{0} aastat", "future": "{0} aasta"},
  3575. }
  3576. month_names = [
  3577. "",
  3578. "Jaanuar",
  3579. "Veebruar",
  3580. "Märts",
  3581. "Aprill",
  3582. "Mai",
  3583. "Juuni",
  3584. "Juuli",
  3585. "August",
  3586. "September",
  3587. "Oktoober",
  3588. "November",
  3589. "Detsember",
  3590. ]
  3591. month_abbreviations = [
  3592. "",
  3593. "Jan",
  3594. "Veb",
  3595. "Mär",
  3596. "Apr",
  3597. "Mai",
  3598. "Jun",
  3599. "Jul",
  3600. "Aug",
  3601. "Sep",
  3602. "Okt",
  3603. "Nov",
  3604. "Dets",
  3605. ]
  3606. day_names = [
  3607. "",
  3608. "Esmaspäev",
  3609. "Teisipäev",
  3610. "Kolmapäev",
  3611. "Neljapäev",
  3612. "Reede",
  3613. "Laupäev",
  3614. "Pühapäev",
  3615. ]
  3616. day_abbreviations = ["", "Esm", "Teis", "Kolm", "Nelj", "Re", "Lau", "Püh"]
  3617. def _format_timeframe(self, timeframe, delta):
  3618. form = self.timeframes[timeframe]
  3619. if delta > 0:
  3620. form = form["future"]
  3621. else:
  3622. form = form["past"]
  3623. return form.format(abs(delta))
  3624. _locales = _map_locales()