Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/arrow/locales.py: 75%

Shortcuts on this page

r m x   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1166 statements  

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

2 

3from math import trunc 

4from typing import ( 

5 Any, 

6 ClassVar, 

7 Dict, 

8 List, 

9 Literal, 

10 Mapping, 

11 Optional, 

12 Sequence, 

13 Tuple, 

14 Type, 

15 Union, 

16 cast, 

17) 

18 

19TimeFrameLiteral = Literal[ 

20 "now", 

21 "second", 

22 "seconds", 

23 "minute", 

24 "minutes", 

25 "hour", 

26 "hours", 

27 "day", 

28 "days", 

29 "week", 

30 "weeks", 

31 "month", 

32 "months", 

33 "quarter", 

34 "quarters", 

35 "year", 

36 "years", 

37] 

38 

39_TimeFrameElements = Union[ 

40 str, Sequence[str], Mapping[str, str], Mapping[str, Sequence[str]] 

41] 

42 

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

44 

45 

46def get_locale(name: str) -> "Locale": 

47 """Returns an appropriate :class:`Locale <arrow.locales.Locale>` 

48 corresponding to an input locale name. 

49 

50 :param name: the name of the locale. 

51 

52 """ 

53 

54 normalized_locale_name = name.lower().replace("_", "-") 

55 locale_cls = _locale_map.get(normalized_locale_name) 

56 

57 if locale_cls is None: 

58 raise ValueError(f"Unsupported locale {normalized_locale_name!r}.") 

59 

60 return locale_cls() 

61 

62 

63def get_locale_by_class_name(name: str) -> "Locale": 

64 """Returns an appropriate :class:`Locale <arrow.locales.Locale>` 

65 corresponding to an locale class name. 

66 

67 :param name: the name of the locale class. 

68 

69 """ 

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

71 

72 if locale_cls is None: 

73 raise ValueError(f"Unsupported locale {name!r}.") 

74 

75 return locale_cls() 

76 

77 

78class Locale: 

79 """Represents locale-specific data and functionality.""" 

80 

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

82 

83 timeframes: ClassVar[Mapping[TimeFrameLiteral, _TimeFrameElements]] = { 

84 "now": "", 

85 "second": "", 

86 "seconds": "", 

87 "minute": "", 

88 "minutes": "", 

89 "hour": "", 

90 "hours": "", 

91 "day": "", 

92 "days": "", 

93 "week": "", 

94 "weeks": "", 

95 "month": "", 

96 "months": "", 

97 "quarter": "", 

98 "quarters": "", 

99 "year": "", 

100 "years": "", 

101 } 

102 

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

104 

105 past: ClassVar[str] 

106 future: ClassVar[str] 

107 and_word: ClassVar[Optional[str]] = None 

108 

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

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

111 

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

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

114 

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

116 

117 _month_name_to_ordinal: Optional[Dict[str, int]] 

118 

119 def __init_subclass__(cls, **kwargs: Any) -> None: 

120 for locale_name in cls.names: 

121 if locale_name in _locale_map: 

122 raise LookupError(f"Duplicated locale name: {locale_name}") 

123 

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

125 

126 def __init__(self) -> None: 

127 self._month_name_to_ordinal = None 

128 

129 def describe( 

130 self, 

131 timeframe: TimeFrameLiteral, 

132 delta: Union[float, int] = 0, 

133 only_distance: bool = False, 

134 ) -> str: 

135 """Describes a delta within a timeframe in plain language. 

136 

137 :param timeframe: a string representing a timeframe. 

138 :param delta: a quantity representing a delta in a timeframe. 

139 :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords 

140 """ 

141 

142 humanized = self._format_timeframe(timeframe, trunc(delta)) 

143 if not only_distance: 

144 humanized = self._format_relative(humanized, timeframe, delta) 

145 

146 return humanized 

147 

148 def describe_multi( 

149 self, 

150 timeframes: Sequence[Tuple[TimeFrameLiteral, Union[int, float]]], 

151 only_distance: bool = False, 

152 ) -> str: 

153 """Describes a delta within multiple timeframes in plain language. 

154 

155 :param timeframes: a list of string, quantity pairs each representing a timeframe and delta. 

156 :param only_distance: return only distance eg: "2 hours and 11 seconds" without "in" or "ago" keywords 

157 """ 

158 

159 parts = [ 

160 self._format_timeframe(timeframe, trunc(delta)) 

161 for timeframe, delta in timeframes 

162 ] 

163 if self.and_word: 

164 parts.insert(-1, self.and_word) 

165 humanized = " ".join(parts) 

166 

167 if not only_distance: 

168 # Needed to determine the correct relative string to use 

169 timeframe_value = 0 

170 

171 for _, unit_value in timeframes: 

172 if trunc(unit_value) != 0: 

173 timeframe_value = trunc(unit_value) 

174 break 

175 

176 # Note it doesn't matter the timeframe unit we use on the call, only the value 

177 humanized = self._format_relative(humanized, "seconds", timeframe_value) 

178 

179 return humanized 

180 

181 def day_name(self, day: int) -> str: 

182 """Returns the day name for a specified day of the week. 

183 

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

185 

186 """ 

187 

188 return self.day_names[day] 

189 

190 def day_abbreviation(self, day: int) -> str: 

191 """Returns the day abbreviation for a specified day of the week. 

192 

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

194 

195 """ 

196 

197 return self.day_abbreviations[day] 

198 

199 def month_name(self, month: int) -> str: 

200 """Returns the month name for a specified month of the year. 

201 

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

203 

204 """ 

205 

206 return self.month_names[month] 

207 

208 def month_abbreviation(self, month: int) -> str: 

209 """Returns the month abbreviation for a specified month of the year. 

210 

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

212 

213 """ 

214 

215 return self.month_abbreviations[month] 

216 

217 def month_number(self, name: str) -> Optional[int]: 

218 """Returns the month number for a month specified by name or abbreviation. 

219 

220 :param name: the month name or abbreviation. 

221 

222 """ 

223 

224 if self._month_name_to_ordinal is None: 

225 self._month_name_to_ordinal = self._name_to_ordinal(self.month_names) 

226 self._month_name_to_ordinal.update( 

227 self._name_to_ordinal(self.month_abbreviations) 

228 ) 

229 

230 return self._month_name_to_ordinal.get(name) 

231 

232 def year_full(self, year: int) -> str: 

233 """Returns the year for specific locale if available 

234 

235 :param year: the ``int`` year (4-digit) 

236 """ 

237 return f"{year:04d}" 

238 

239 def year_abbreviation(self, year: int) -> str: 

240 """Returns the year for specific locale if available 

241 

242 :param year: the ``int`` year (4-digit) 

243 """ 

244 return f"{year:04d}"[2:] 

245 

246 def meridian(self, hour: int, token: Any) -> Optional[str]: 

247 """Returns the meridian indicator for a specified hour and format token. 

248 

249 :param hour: the ``int`` hour of the day. 

250 :param token: the format token. 

251 """ 

252 

253 if token == "a": 

254 return self.meridians["am"] if hour < 12 else self.meridians["pm"] 

255 if token == "A": 

256 return self.meridians["AM"] if hour < 12 else self.meridians["PM"] 

257 return None 

258 

259 def ordinal_number(self, n: int) -> str: 

260 """Returns the ordinal format of a given integer 

261 

262 :param n: an integer 

263 """ 

264 return self._ordinal_number(n) 

265 

266 def _ordinal_number(self, n: int) -> str: 

267 return f"{n}" 

268 

269 def _name_to_ordinal(self, lst: Sequence[str]) -> Dict[str, int]: 

270 return {elem.lower(): i for i, elem in enumerate(lst[1:], 1)} 

271 

272 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: 

273 # TODO: remove cast 

274 return cast(str, self.timeframes[timeframe]).format(trunc(abs(delta))) 

275 

276 def _format_relative( 

277 self, 

278 humanized: str, 

279 timeframe: TimeFrameLiteral, 

280 delta: Union[float, int], 

281 ) -> str: 

282 if timeframe == "now": 

283 return humanized 

284 

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

286 

287 return direction.format(humanized) 

288 

289 

290class EnglishLocale(Locale): 

291 names = [ 

292 "en", 

293 "en-us", 

294 "en-gb", 

295 "en-au", 

296 "en-be", 

297 "en-jp", 

298 "en-za", 

299 "en-ca", 

300 "en-ph", 

301 ] 

302 

303 past = "{0} ago" 

304 future = "in {0}" 

305 and_word = "and" 

306 

307 timeframes = { 

308 "now": "just now", 

309 "second": "a second", 

310 "seconds": "{0} seconds", 

311 "minute": "a minute", 

312 "minutes": "{0} minutes", 

313 "hour": "an hour", 

314 "hours": "{0} hours", 

315 "day": "a day", 

316 "days": "{0} days", 

317 "week": "a week", 

318 "weeks": "{0} weeks", 

319 "month": "a month", 

320 "months": "{0} months", 

321 "quarter": "a quarter", 

322 "quarters": "{0} quarters", 

323 "year": "a year", 

324 "years": "{0} years", 

325 } 

326 

327 meridians = {"am": "am", "pm": "pm", "AM": "AM", "PM": "PM"} 

328 

329 month_names = [ 

330 "", 

331 "January", 

332 "February", 

333 "March", 

334 "April", 

335 "May", 

336 "June", 

337 "July", 

338 "August", 

339 "September", 

340 "October", 

341 "November", 

342 "December", 

343 ] 

344 month_abbreviations = [ 

345 "", 

346 "Jan", 

347 "Feb", 

348 "Mar", 

349 "Apr", 

350 "May", 

351 "Jun", 

352 "Jul", 

353 "Aug", 

354 "Sep", 

355 "Oct", 

356 "Nov", 

357 "Dec", 

358 ] 

359 

360 day_names = [ 

361 "", 

362 "Monday", 

363 "Tuesday", 

364 "Wednesday", 

365 "Thursday", 

366 "Friday", 

367 "Saturday", 

368 "Sunday", 

369 ] 

370 day_abbreviations = ["", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] 

371 

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

373 

374 def _ordinal_number(self, n: int) -> str: 

375 if n % 100 not in (11, 12, 13): 

376 remainder = abs(n) % 10 

377 if remainder == 1: 

378 return f"{n}st" 

379 elif remainder == 2: 

380 return f"{n}nd" 

381 elif remainder == 3: 

382 return f"{n}rd" 

383 return f"{n}th" 

384 

385 def describe( 

386 self, 

387 timeframe: TimeFrameLiteral, 

388 delta: Union[int, float] = 0, 

389 only_distance: bool = False, 

390 ) -> str: 

391 """Describes a delta within a timeframe in plain language. 

392 

393 :param timeframe: a string representing a timeframe. 

394 :param delta: a quantity representing a delta in a timeframe. 

395 :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords 

396 """ 

397 

398 humanized = super().describe(timeframe, delta, only_distance) 

399 if only_distance and timeframe == "now": 

400 humanized = "instantly" 

401 

402 return humanized 

403 

404 

405class ItalianLocale(Locale): 

406 names = ["it", "it-it"] 

407 past = "{0} fa" 

408 future = "tra {0}" 

409 and_word = "e" 

410 

411 timeframes = { 

412 "now": "adesso", 

413 "second": "un secondo", 

414 "seconds": "{0} qualche secondo", 

415 "minute": "un minuto", 

416 "minutes": "{0} minuti", 

417 "hour": "un'ora", 

418 "hours": "{0} ore", 

419 "day": "un giorno", 

420 "days": "{0} giorni", 

421 "week": "una settimana", 

422 "weeks": "{0} settimane", 

423 "month": "un mese", 

424 "months": "{0} mesi", 

425 "year": "un anno", 

426 "years": "{0} anni", 

427 } 

428 

429 month_names = [ 

430 "", 

431 "gennaio", 

432 "febbraio", 

433 "marzo", 

434 "aprile", 

435 "maggio", 

436 "giugno", 

437 "luglio", 

438 "agosto", 

439 "settembre", 

440 "ottobre", 

441 "novembre", 

442 "dicembre", 

443 ] 

444 month_abbreviations = [ 

445 "", 

446 "gen", 

447 "feb", 

448 "mar", 

449 "apr", 

450 "mag", 

451 "giu", 

452 "lug", 

453 "ago", 

454 "set", 

455 "ott", 

456 "nov", 

457 "dic", 

458 ] 

459 

460 day_names = [ 

461 "", 

462 "lunedì", 

463 "martedì", 

464 "mercoledì", 

465 "giovedì", 

466 "venerdì", 

467 "sabato", 

468 "domenica", 

469 ] 

470 day_abbreviations = ["", "lun", "mar", "mer", "gio", "ven", "sab", "dom"] 

471 

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

473 

474 def _ordinal_number(self, n: int) -> str: 

475 return f"{n}º" 

476 

477 

478class SpanishLocale(Locale): 

479 names = ["es", "es-es"] 

480 past = "hace {0}" 

481 future = "en {0}" 

482 and_word = "y" 

483 

484 timeframes = { 

485 "now": "ahora", 

486 "second": "un segundo", 

487 "seconds": "{0} segundos", 

488 "minute": "un minuto", 

489 "minutes": "{0} minutos", 

490 "hour": "una hora", 

491 "hours": "{0} horas", 

492 "day": "un día", 

493 "days": "{0} días", 

494 "week": "una semana", 

495 "weeks": "{0} semanas", 

496 "month": "un mes", 

497 "months": "{0} meses", 

498 "year": "un año", 

499 "years": "{0} años", 

500 } 

501 

502 meridians = {"am": "am", "pm": "pm", "AM": "AM", "PM": "PM"} 

503 

504 month_names = [ 

505 "", 

506 "enero", 

507 "febrero", 

508 "marzo", 

509 "abril", 

510 "mayo", 

511 "junio", 

512 "julio", 

513 "agosto", 

514 "septiembre", 

515 "octubre", 

516 "noviembre", 

517 "diciembre", 

518 ] 

519 month_abbreviations = [ 

520 "", 

521 "ene", 

522 "feb", 

523 "mar", 

524 "abr", 

525 "may", 

526 "jun", 

527 "jul", 

528 "ago", 

529 "sep", 

530 "oct", 

531 "nov", 

532 "dic", 

533 ] 

534 

535 day_names = [ 

536 "", 

537 "lunes", 

538 "martes", 

539 "miércoles", 

540 "jueves", 

541 "viernes", 

542 "sábado", 

543 "domingo", 

544 ] 

545 day_abbreviations = ["", "lun", "mar", "mie", "jue", "vie", "sab", "dom"] 

546 

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

548 

549 def _ordinal_number(self, n: int) -> str: 

550 return f"{n}º" 

551 

552 

553class FrenchBaseLocale(Locale): 

554 past = "il y a {0}" 

555 future = "dans {0}" 

556 and_word = "et" 

557 

558 timeframes = { 

559 "now": "maintenant", 

560 "second": "une seconde", 

561 "seconds": "{0} secondes", 

562 "minute": "une minute", 

563 "minutes": "{0} minutes", 

564 "hour": "une heure", 

565 "hours": "{0} heures", 

566 "day": "un jour", 

567 "days": "{0} jours", 

568 "week": "une semaine", 

569 "weeks": "{0} semaines", 

570 "month": "un mois", 

571 "months": "{0} mois", 

572 "year": "un an", 

573 "years": "{0} ans", 

574 } 

575 

576 month_names = [ 

577 "", 

578 "janvier", 

579 "février", 

580 "mars", 

581 "avril", 

582 "mai", 

583 "juin", 

584 "juillet", 

585 "août", 

586 "septembre", 

587 "octobre", 

588 "novembre", 

589 "décembre", 

590 ] 

591 

592 day_names = [ 

593 "", 

594 "lundi", 

595 "mardi", 

596 "mercredi", 

597 "jeudi", 

598 "vendredi", 

599 "samedi", 

600 "dimanche", 

601 ] 

602 day_abbreviations = ["", "lun", "mar", "mer", "jeu", "ven", "sam", "dim"] 

603 

604 ordinal_day_re = ( 

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

606 ) 

607 

608 def _ordinal_number(self, n: int) -> str: 

609 if abs(n) == 1: 

610 return f"{n}er" 

611 return f"{n}e" 

612 

613 

614class FrenchLocale(FrenchBaseLocale, Locale): 

615 names = ["fr", "fr-fr"] 

616 

617 month_abbreviations = [ 

618 "", 

619 "janv", 

620 "févr", 

621 "mars", 

622 "avr", 

623 "mai", 

624 "juin", 

625 "juil", 

626 "août", 

627 "sept", 

628 "oct", 

629 "nov", 

630 "déc", 

631 ] 

632 

633 

634class FrenchCanadianLocale(FrenchBaseLocale, Locale): 

635 names = ["fr-ca"] 

636 

637 month_abbreviations = [ 

638 "", 

639 "janv", 

640 "févr", 

641 "mars", 

642 "avr", 

643 "mai", 

644 "juin", 

645 "juill", 

646 "août", 

647 "sept", 

648 "oct", 

649 "nov", 

650 "déc", 

651 ] 

652 

653 

654class GreekLocale(Locale): 

655 names = ["el", "el-gr"] 

656 

657 past = "πριν από {0}" 

658 future = "σε {0}" 

659 and_word = "και" 

660 

661 timeframes = { 

662 "now": "τώρα", 

663 "second": "ένα δευτερόλεπτο", 

664 "seconds": "{0} δευτερόλεπτα", 

665 "minute": "ένα λεπτό", 

666 "minutes": "{0} λεπτά", 

667 "hour": "μία ώρα", 

668 "hours": "{0} ώρες", 

669 "day": "μία ημέρα", 

670 "days": "{0} ημέρες", 

671 "week": "μία εβδομάδα", 

672 "weeks": "{0} εβδομάδες", 

673 "month": "ένα μήνα", 

674 "months": "{0} μήνες", 

675 "year": "ένα χρόνο", 

676 "years": "{0} χρόνια", 

677 } 

678 

679 month_names = [ 

680 "", 

681 "Ιανουαρίου", 

682 "Φεβρουαρίου", 

683 "Μαρτίου", 

684 "Απριλίου", 

685 "Μαΐου", 

686 "Ιουνίου", 

687 "Ιουλίου", 

688 "Αυγούστου", 

689 "Σεπτεμβρίου", 

690 "Οκτωβρίου", 

691 "Νοεμβρίου", 

692 "Δεκεμβρίου", 

693 ] 

694 month_abbreviations = [ 

695 "", 

696 "Ιαν", 

697 "Φεβ", 

698 "Μαρ", 

699 "Απρ", 

700 "Μαΐ", 

701 "Ιον", 

702 "Ιολ", 

703 "Αυγ", 

704 "Σεπ", 

705 "Οκτ", 

706 "Νοε", 

707 "Δεκ", 

708 ] 

709 

710 day_names = [ 

711 "", 

712 "Δευτέρα", 

713 "Τρίτη", 

714 "Τετάρτη", 

715 "Πέμπτη", 

716 "Παρασκευή", 

717 "Σάββατο", 

718 "Κυριακή", 

719 ] 

720 day_abbreviations = ["", "Δευ", "Τρι", "Τετ", "Πεμ", "Παρ", "Σαβ", "Κυρ"] 

721 

722 

723class JapaneseLocale(Locale): 

724 names = ["ja", "ja-jp"] 

725 

726 past = "{0}前" 

727 future = "{0}後" 

728 and_word = "" 

729 

730 timeframes = { 

731 "now": "現在", 

732 "second": "1秒", 

733 "seconds": "{0}秒", 

734 "minute": "1分", 

735 "minutes": "{0}分", 

736 "hour": "1時間", 

737 "hours": "{0}時間", 

738 "day": "1日", 

739 "days": "{0}日", 

740 "week": "1週間", 

741 "weeks": "{0}週間", 

742 "month": "1ヶ月", 

743 "months": "{0}ヶ月", 

744 "year": "1年", 

745 "years": "{0}年", 

746 } 

747 

748 month_names = [ 

749 "", 

750 "1月", 

751 "2月", 

752 "3月", 

753 "4月", 

754 "5月", 

755 "6月", 

756 "7月", 

757 "8月", 

758 "9月", 

759 "10月", 

760 "11月", 

761 "12月", 

762 ] 

763 month_abbreviations = [ 

764 "", 

765 " 1", 

766 " 2", 

767 " 3", 

768 " 4", 

769 " 5", 

770 " 6", 

771 " 7", 

772 " 8", 

773 " 9", 

774 "10", 

775 "11", 

776 "12", 

777 ] 

778 

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

780 day_abbreviations = ["", "月", "火", "水", "木", "金", "土", "日"] 

781 

782 

783class SwedishLocale(Locale): 

784 names = ["sv", "sv-se"] 

785 

786 past = "för {0} sen" 

787 future = "om {0}" 

788 and_word = "och" 

789 

790 timeframes = { 

791 "now": "just nu", 

792 "second": "en sekund", 

793 "seconds": "{0} sekunder", 

794 "minute": "en minut", 

795 "minutes": "{0} minuter", 

796 "hour": "en timme", 

797 "hours": "{0} timmar", 

798 "day": "en dag", 

799 "days": "{0} dagar", 

800 "week": "en vecka", 

801 "weeks": "{0} veckor", 

802 "month": "en månad", 

803 "months": "{0} månader", 

804 "year": "ett år", 

805 "years": "{0} år", 

806 } 

807 

808 month_names = [ 

809 "", 

810 "januari", 

811 "februari", 

812 "mars", 

813 "april", 

814 "maj", 

815 "juni", 

816 "juli", 

817 "augusti", 

818 "september", 

819 "oktober", 

820 "november", 

821 "december", 

822 ] 

823 month_abbreviations = [ 

824 "", 

825 "jan", 

826 "feb", 

827 "mar", 

828 "apr", 

829 "maj", 

830 "jun", 

831 "jul", 

832 "aug", 

833 "sep", 

834 "okt", 

835 "nov", 

836 "dec", 

837 ] 

838 

839 day_names = [ 

840 "", 

841 "måndag", 

842 "tisdag", 

843 "onsdag", 

844 "torsdag", 

845 "fredag", 

846 "lördag", 

847 "söndag", 

848 ] 

849 day_abbreviations = ["", "mån", "tis", "ons", "tor", "fre", "lör", "sön"] 

850 

851 

852class FinnishLocale(Locale): 

853 names = ["fi", "fi-fi"] 

854 

855 # The finnish grammar is very complex, and its hard to convert 

856 # 1-to-1 to something like English. 

857 

858 past = "{0} sitten" 

859 future = "{0} kuluttua" 

860 

861 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { 

862 "now": "juuri nyt", 

863 "second": {"past": "sekunti", "future": "sekunnin"}, 

864 "seconds": {"past": "{0} sekuntia", "future": "{0} sekunnin"}, 

865 "minute": {"past": "minuutti", "future": "minuutin"}, 

866 "minutes": {"past": "{0} minuuttia", "future": "{0} minuutin"}, 

867 "hour": {"past": "tunti", "future": "tunnin"}, 

868 "hours": {"past": "{0} tuntia", "future": "{0} tunnin"}, 

869 "day": {"past": "päivä", "future": "päivän"}, 

870 "days": {"past": "{0} päivää", "future": "{0} päivän"}, 

871 "week": {"past": "viikko", "future": "viikon"}, 

872 "weeks": {"past": "{0} viikkoa", "future": "{0} viikon"}, 

873 "month": {"past": "kuukausi", "future": "kuukauden"}, 

874 "months": {"past": "{0} kuukautta", "future": "{0} kuukauden"}, 

875 "year": {"past": "vuosi", "future": "vuoden"}, 

876 "years": {"past": "{0} vuotta", "future": "{0} vuoden"}, 

877 } 

878 

879 # Months and days are lowercase in Finnish 

880 month_names = [ 

881 "", 

882 "tammikuu", 

883 "helmikuu", 

884 "maaliskuu", 

885 "huhtikuu", 

886 "toukokuu", 

887 "kesäkuu", 

888 "heinäkuu", 

889 "elokuu", 

890 "syyskuu", 

891 "lokakuu", 

892 "marraskuu", 

893 "joulukuu", 

894 ] 

895 

896 month_abbreviations = [ 

897 "", 

898 "tammi", 

899 "helmi", 

900 "maalis", 

901 "huhti", 

902 "touko", 

903 "kesä", 

904 "heinä", 

905 "elo", 

906 "syys", 

907 "loka", 

908 "marras", 

909 "joulu", 

910 ] 

911 

912 day_names = [ 

913 "", 

914 "maanantai", 

915 "tiistai", 

916 "keskiviikko", 

917 "torstai", 

918 "perjantai", 

919 "lauantai", 

920 "sunnuntai", 

921 ] 

922 

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

924 

925 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: 

926 form = self.timeframes[timeframe] 

927 

928 if isinstance(form, Mapping): 

929 if delta < 0: 

930 form = form["past"] 

931 else: 

932 form = form["future"] 

933 

934 return form.format(abs(delta)) 

935 

936 def _ordinal_number(self, n: int) -> str: 

937 return f"{n}." 

938 

939 

940class ChineseCNLocale(Locale): 

941 names = ["zh", "zh-cn"] 

942 

943 past = "{0}前" 

944 future = "{0}后" 

945 

946 timeframes = { 

947 "now": "刚才", 

948 "second": "1秒", 

949 "seconds": "{0}秒", 

950 "minute": "1分钟", 

951 "minutes": "{0}分钟", 

952 "hour": "1小时", 

953 "hours": "{0}小时", 

954 "day": "1天", 

955 "days": "{0}天", 

956 "week": "1周", 

957 "weeks": "{0}周", 

958 "month": "1个月", 

959 "months": "{0}个月", 

960 "year": "1年", 

961 "years": "{0}年", 

962 } 

963 

964 month_names = [ 

965 "", 

966 "一月", 

967 "二月", 

968 "三月", 

969 "四月", 

970 "五月", 

971 "六月", 

972 "七月", 

973 "八月", 

974 "九月", 

975 "十月", 

976 "十一月", 

977 "十二月", 

978 ] 

979 month_abbreviations = [ 

980 "", 

981 " 1", 

982 " 2", 

983 " 3", 

984 " 4", 

985 " 5", 

986 " 6", 

987 " 7", 

988 " 8", 

989 " 9", 

990 "10", 

991 "11", 

992 "12", 

993 ] 

994 

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

996 day_abbreviations = ["", "一", "二", "三", "四", "五", "六", "日"] 

997 

998 

999class ChineseTWLocale(Locale): 

1000 names = ["zh-tw"] 

1001 

1002 past = "{0}前" 

1003 future = "{0}後" 

1004 and_word = "和" 

1005 

1006 timeframes = { 

1007 "now": "剛才", 

1008 "second": "1秒", 

1009 "seconds": "{0}秒", 

1010 "minute": "1分鐘", 

1011 "minutes": "{0}分鐘", 

1012 "hour": "1小時", 

1013 "hours": "{0}小時", 

1014 "day": "1天", 

1015 "days": "{0}天", 

1016 "week": "1週", 

1017 "weeks": "{0}週", 

1018 "month": "1個月", 

1019 "months": "{0}個月", 

1020 "year": "1年", 

1021 "years": "{0}年", 

1022 } 

1023 

1024 month_names = [ 

1025 "", 

1026 "1月", 

1027 "2月", 

1028 "3月", 

1029 "4月", 

1030 "5月", 

1031 "6月", 

1032 "7月", 

1033 "8月", 

1034 "9月", 

1035 "10月", 

1036 "11月", 

1037 "12月", 

1038 ] 

1039 month_abbreviations = [ 

1040 "", 

1041 " 1", 

1042 " 2", 

1043 " 3", 

1044 " 4", 

1045 " 5", 

1046 " 6", 

1047 " 7", 

1048 " 8", 

1049 " 9", 

1050 "10", 

1051 "11", 

1052 "12", 

1053 ] 

1054 

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

1056 day_abbreviations = ["", "一", "二", "三", "四", "五", "六", "日"] 

1057 

1058 

1059class HongKongLocale(Locale): 

1060 names = ["zh-hk"] 

1061 

1062 past = "{0}前" 

1063 future = "{0}後" 

1064 

1065 timeframes = { 

1066 "now": "剛才", 

1067 "second": "1秒", 

1068 "seconds": "{0}秒", 

1069 "minute": "1分鐘", 

1070 "minutes": "{0}分鐘", 

1071 "hour": "1小時", 

1072 "hours": "{0}小時", 

1073 "day": "1天", 

1074 "days": "{0}天", 

1075 "week": "1星期", 

1076 "weeks": "{0}星期", 

1077 "month": "1個月", 

1078 "months": "{0}個月", 

1079 "year": "1年", 

1080 "years": "{0}年", 

1081 } 

1082 

1083 month_names = [ 

1084 "", 

1085 "1月", 

1086 "2月", 

1087 "3月", 

1088 "4月", 

1089 "5月", 

1090 "6月", 

1091 "7月", 

1092 "8月", 

1093 "9月", 

1094 "10月", 

1095 "11月", 

1096 "12月", 

1097 ] 

1098 month_abbreviations = [ 

1099 "", 

1100 " 1", 

1101 " 2", 

1102 " 3", 

1103 " 4", 

1104 " 5", 

1105 " 6", 

1106 " 7", 

1107 " 8", 

1108 " 9", 

1109 "10", 

1110 "11", 

1111 "12", 

1112 ] 

1113 

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

1115 day_abbreviations = ["", "一", "二", "三", "四", "五", "六", "日"] 

1116 

1117 

1118class KoreanLocale(Locale): 

1119 names = ["ko", "ko-kr"] 

1120 

1121 past = "{0} 전" 

1122 future = "{0} 후" 

1123 

1124 timeframes = { 

1125 "now": "지금", 

1126 "second": "1초", 

1127 "seconds": "{0}초", 

1128 "minute": "1분", 

1129 "minutes": "{0}분", 

1130 "hour": "한시간", 

1131 "hours": "{0}시간", 

1132 "day": "하루", 

1133 "days": "{0}일", 

1134 "week": "1주", 

1135 "weeks": "{0}주", 

1136 "month": "한달", 

1137 "months": "{0}개월", 

1138 "year": "1년", 

1139 "years": "{0}년", 

1140 } 

1141 

1142 special_dayframes = { 

1143 -3: "그끄제", 

1144 -2: "그제", 

1145 -1: "어제", 

1146 1: "내일", 

1147 2: "모레", 

1148 3: "글피", 

1149 4: "그글피", 

1150 } 

1151 

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

1153 

1154 month_names = [ 

1155 "", 

1156 "1월", 

1157 "2월", 

1158 "3월", 

1159 "4월", 

1160 "5월", 

1161 "6월", 

1162 "7월", 

1163 "8월", 

1164 "9월", 

1165 "10월", 

1166 "11월", 

1167 "12월", 

1168 ] 

1169 month_abbreviations = [ 

1170 "", 

1171 " 1", 

1172 " 2", 

1173 " 3", 

1174 " 4", 

1175 " 5", 

1176 " 6", 

1177 " 7", 

1178 " 8", 

1179 " 9", 

1180 "10", 

1181 "11", 

1182 "12", 

1183 ] 

1184 

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

1186 day_abbreviations = ["", "월", "화", "수", "목", "금", "토", "일"] 

1187 

1188 def _ordinal_number(self, n: int) -> str: 

1189 ordinals = ["0", "첫", "두", "세", "네", "다섯", "여섯", "일곱", "여덟", "아홉", "열"] 

1190 if n < len(ordinals): 

1191 return f"{ordinals[n]}번째" 

1192 return f"{n}번째" 

1193 

1194 def _format_relative( 

1195 self, 

1196 humanized: str, 

1197 timeframe: TimeFrameLiteral, 

1198 delta: Union[float, int], 

1199 ) -> str: 

1200 if timeframe in ("day", "days"): 

1201 special = self.special_dayframes.get(int(delta)) 

1202 if special: 

1203 return special 

1204 elif timeframe in ("year", "years"): 

1205 special = self.special_yearframes.get(int(delta)) 

1206 if special: 

1207 return special 

1208 

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

1210 

1211 

1212# derived locale types & implementations. 

1213class DutchLocale(Locale): 

1214 names = ["nl", "nl-nl"] 

1215 

1216 past = "{0} geleden" 

1217 future = "over {0}" 

1218 

1219 timeframes = { 

1220 "now": "nu", 

1221 "second": "een seconde", 

1222 "seconds": "{0} seconden", 

1223 "minute": "een minuut", 

1224 "minutes": "{0} minuten", 

1225 "hour": "een uur", 

1226 "hours": "{0} uur", 

1227 "day": "een dag", 

1228 "days": "{0} dagen", 

1229 "week": "een week", 

1230 "weeks": "{0} weken", 

1231 "month": "een maand", 

1232 "months": "{0} maanden", 

1233 "year": "een jaar", 

1234 "years": "{0} jaar", 

1235 } 

1236 

1237 # In Dutch names of months and days are not starting with a capital letter 

1238 # like in the English language. 

1239 month_names = [ 

1240 "", 

1241 "januari", 

1242 "februari", 

1243 "maart", 

1244 "april", 

1245 "mei", 

1246 "juni", 

1247 "juli", 

1248 "augustus", 

1249 "september", 

1250 "oktober", 

1251 "november", 

1252 "december", 

1253 ] 

1254 month_abbreviations = [ 

1255 "", 

1256 "jan", 

1257 "feb", 

1258 "mrt", 

1259 "apr", 

1260 "mei", 

1261 "jun", 

1262 "jul", 

1263 "aug", 

1264 "sep", 

1265 "okt", 

1266 "nov", 

1267 "dec", 

1268 ] 

1269 

1270 day_names = [ 

1271 "", 

1272 "maandag", 

1273 "dinsdag", 

1274 "woensdag", 

1275 "donderdag", 

1276 "vrijdag", 

1277 "zaterdag", 

1278 "zondag", 

1279 ] 

1280 day_abbreviations = ["", "ma", "di", "wo", "do", "vr", "za", "zo"] 

1281 

1282 

1283class SlavicBaseLocale(Locale): 

1284 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] 

1285 

1286 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: 

1287 form = self.timeframes[timeframe] 

1288 delta = abs(delta) 

1289 

1290 if isinstance(form, Mapping): 

1291 if delta % 10 == 1 and delta % 100 != 11: 

1292 form = form["singular"] 

1293 elif 2 <= delta % 10 <= 4 and (delta % 100 < 10 or delta % 100 >= 20): 

1294 form = form["dual"] 

1295 else: 

1296 form = form["plural"] 

1297 

1298 return form.format(delta) 

1299 

1300 

1301class BelarusianLocale(SlavicBaseLocale): 

1302 names = ["be", "be-by"] 

1303 

1304 past = "{0} таму" 

1305 future = "праз {0}" 

1306 

1307 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { 

1308 "now": "зараз", 

1309 "second": "секунду", 

1310 "seconds": "{0} некалькі секунд", 

1311 "minute": "хвіліну", 

1312 "minutes": { 

1313 "singular": "{0} хвіліну", 

1314 "dual": "{0} хвіліны", 

1315 "plural": "{0} хвілін", 

1316 }, 

1317 "hour": "гадзіну", 

1318 "hours": { 

1319 "singular": "{0} гадзіну", 

1320 "dual": "{0} гадзіны", 

1321 "plural": "{0} гадзін", 

1322 }, 

1323 "day": "дзень", 

1324 "days": {"singular": "{0} дзень", "dual": "{0} дні", "plural": "{0} дзён"}, 

1325 "month": "месяц", 

1326 "months": { 

1327 "singular": "{0} месяц", 

1328 "dual": "{0} месяцы", 

1329 "plural": "{0} месяцаў", 

1330 }, 

1331 "year": "год", 

1332 "years": {"singular": "{0} год", "dual": "{0} гады", "plural": "{0} гадоў"}, 

1333 } 

1334 

1335 month_names = [ 

1336 "", 

1337 "студзеня", 

1338 "лютага", 

1339 "сакавіка", 

1340 "красавіка", 

1341 "траўня", 

1342 "чэрвеня", 

1343 "ліпеня", 

1344 "жніўня", 

1345 "верасня", 

1346 "кастрычніка", 

1347 "лістапада", 

1348 "снежня", 

1349 ] 

1350 month_abbreviations = [ 

1351 "", 

1352 "студ", 

1353 "лют", 

1354 "сак", 

1355 "крас", 

1356 "трав", 

1357 "чэрв", 

1358 "ліп", 

1359 "жнів", 

1360 "вер", 

1361 "каст", 

1362 "ліст", 

1363 "снеж", 

1364 ] 

1365 

1366 day_names = [ 

1367 "", 

1368 "панядзелак", 

1369 "аўторак", 

1370 "серада", 

1371 "чацвер", 

1372 "пятніца", 

1373 "субота", 

1374 "нядзеля", 

1375 ] 

1376 day_abbreviations = ["", "пн", "ат", "ср", "чц", "пт", "сб", "нд"] 

1377 

1378 

1379class PolishLocale(SlavicBaseLocale): 

1380 names = ["pl", "pl-pl"] 

1381 

1382 past = "{0} temu" 

1383 future = "za {0}" 

1384 

1385 # The nouns should be in genitive case (Polish: "dopełniacz") 

1386 # in order to correctly form `past` & `future` expressions. 

1387 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { 

1388 "now": "teraz", 

1389 "second": "sekundę", 

1390 "seconds": { 

1391 "singular": "{0} sekund", 

1392 "dual": "{0} sekundy", 

1393 "plural": "{0} sekund", 

1394 }, 

1395 "minute": "minutę", 

1396 "minutes": { 

1397 "singular": "{0} minut", 

1398 "dual": "{0} minuty", 

1399 "plural": "{0} minut", 

1400 }, 

1401 "hour": "godzinę", 

1402 "hours": { 

1403 "singular": "{0} godzin", 

1404 "dual": "{0} godziny", 

1405 "plural": "{0} godzin", 

1406 }, 

1407 "day": "dzień", 

1408 "days": "{0} dni", 

1409 "week": "tydzień", 

1410 "weeks": { 

1411 "singular": "{0} tygodni", 

1412 "dual": "{0} tygodnie", 

1413 "plural": "{0} tygodni", 

1414 }, 

1415 "month": "miesiąc", 

1416 "months": { 

1417 "singular": "{0} miesięcy", 

1418 "dual": "{0} miesiące", 

1419 "plural": "{0} miesięcy", 

1420 }, 

1421 "year": "rok", 

1422 "years": {"singular": "{0} lat", "dual": "{0} lata", "plural": "{0} lat"}, 

1423 } 

1424 

1425 month_names = [ 

1426 "", 

1427 "styczeń", 

1428 "luty", 

1429 "marzec", 

1430 "kwiecień", 

1431 "maj", 

1432 "czerwiec", 

1433 "lipiec", 

1434 "sierpień", 

1435 "wrzesień", 

1436 "październik", 

1437 "listopad", 

1438 "grudzień", 

1439 ] 

1440 month_abbreviations = [ 

1441 "", 

1442 "sty", 

1443 "lut", 

1444 "mar", 

1445 "kwi", 

1446 "maj", 

1447 "cze", 

1448 "lip", 

1449 "sie", 

1450 "wrz", 

1451 "paź", 

1452 "lis", 

1453 "gru", 

1454 ] 

1455 

1456 day_names = [ 

1457 "", 

1458 "poniedziałek", 

1459 "wtorek", 

1460 "środa", 

1461 "czwartek", 

1462 "piątek", 

1463 "sobota", 

1464 "niedziela", 

1465 ] 

1466 day_abbreviations = ["", "Pn", "Wt", "Śr", "Czw", "Pt", "So", "Nd"] 

1467 

1468 

1469class RussianLocale(SlavicBaseLocale): 

1470 names = ["ru", "ru-ru"] 

1471 

1472 past = "{0} назад" 

1473 future = "через {0}" 

1474 

1475 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { 

1476 "now": "сейчас", 

1477 "second": "секунда", 

1478 "seconds": { 

1479 "singular": "{0} секунду", 

1480 "dual": "{0} секунды", 

1481 "plural": "{0} секунд", 

1482 }, 

1483 "minute": "минуту", 

1484 "minutes": { 

1485 "singular": "{0} минуту", 

1486 "dual": "{0} минуты", 

1487 "plural": "{0} минут", 

1488 }, 

1489 "hour": "час", 

1490 "hours": {"singular": "{0} час", "dual": "{0} часа", "plural": "{0} часов"}, 

1491 "day": "день", 

1492 "days": {"singular": "{0} день", "dual": "{0} дня", "plural": "{0} дней"}, 

1493 "week": "неделю", 

1494 "weeks": { 

1495 "singular": "{0} неделю", 

1496 "dual": "{0} недели", 

1497 "plural": "{0} недель", 

1498 }, 

1499 "month": "месяц", 

1500 "months": { 

1501 "singular": "{0} месяц", 

1502 "dual": "{0} месяца", 

1503 "plural": "{0} месяцев", 

1504 }, 

1505 "quarter": "квартал", 

1506 "quarters": { 

1507 "singular": "{0} квартал", 

1508 "dual": "{0} квартала", 

1509 "plural": "{0} кварталов", 

1510 }, 

1511 "year": "год", 

1512 "years": {"singular": "{0} год", "dual": "{0} года", "plural": "{0} лет"}, 

1513 } 

1514 

1515 month_names = [ 

1516 "", 

1517 "января", 

1518 "февраля", 

1519 "марта", 

1520 "апреля", 

1521 "мая", 

1522 "июня", 

1523 "июля", 

1524 "августа", 

1525 "сентября", 

1526 "октября", 

1527 "ноября", 

1528 "декабря", 

1529 ] 

1530 month_abbreviations = [ 

1531 "", 

1532 "янв", 

1533 "фев", 

1534 "мар", 

1535 "апр", 

1536 "май", 

1537 "июн", 

1538 "июл", 

1539 "авг", 

1540 "сен", 

1541 "окт", 

1542 "ноя", 

1543 "дек", 

1544 ] 

1545 

1546 day_names = [ 

1547 "", 

1548 "понедельник", 

1549 "вторник", 

1550 "среда", 

1551 "четверг", 

1552 "пятница", 

1553 "суббота", 

1554 "воскресенье", 

1555 ] 

1556 day_abbreviations = ["", "пн", "вт", "ср", "чт", "пт", "сб", "вс"] 

1557 

1558 

1559class AfrikaansLocale(Locale): 

1560 names = ["af", "af-nl"] 

1561 

1562 past = "{0} gelede" 

1563 future = "in {0}" 

1564 

1565 timeframes = { 

1566 "now": "nou", 

1567 "second": "n sekonde", 

1568 "seconds": "{0} sekondes", 

1569 "minute": "minuut", 

1570 "minutes": "{0} minute", 

1571 "hour": "uur", 

1572 "hours": "{0} ure", 

1573 "day": "een dag", 

1574 "days": "{0} dae", 

1575 "month": "een maand", 

1576 "months": "{0} maande", 

1577 "year": "een jaar", 

1578 "years": "{0} jaar", 

1579 } 

1580 

1581 month_names = [ 

1582 "", 

1583 "Januarie", 

1584 "Februarie", 

1585 "Maart", 

1586 "April", 

1587 "Mei", 

1588 "Junie", 

1589 "Julie", 

1590 "Augustus", 

1591 "September", 

1592 "Oktober", 

1593 "November", 

1594 "Desember", 

1595 ] 

1596 month_abbreviations = [ 

1597 "", 

1598 "Jan", 

1599 "Feb", 

1600 "Mrt", 

1601 "Apr", 

1602 "Mei", 

1603 "Jun", 

1604 "Jul", 

1605 "Aug", 

1606 "Sep", 

1607 "Okt", 

1608 "Nov", 

1609 "Des", 

1610 ] 

1611 

1612 day_names = [ 

1613 "", 

1614 "Maandag", 

1615 "Dinsdag", 

1616 "Woensdag", 

1617 "Donderdag", 

1618 "Vrydag", 

1619 "Saterdag", 

1620 "Sondag", 

1621 ] 

1622 day_abbreviations = ["", "Ma", "Di", "Wo", "Do", "Vr", "Za", "So"] 

1623 

1624 

1625class BulgarianLocale(SlavicBaseLocale): 

1626 names = ["bg", "bg-bg"] 

1627 

1628 past = "{0} назад" 

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

1630 

1631 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { 

1632 "now": "сега", 

1633 "second": "секунда", 

1634 "seconds": "{0} няколко секунди", 

1635 "minute": "минута", 

1636 "minutes": { 

1637 "singular": "{0} минута", 

1638 "dual": "{0} минути", 

1639 "plural": "{0} минути", 

1640 }, 

1641 "hour": "час", 

1642 "hours": {"singular": "{0} час", "dual": "{0} часа", "plural": "{0} часа"}, 

1643 "day": "ден", 

1644 "days": {"singular": "{0} ден", "dual": "{0} дни", "plural": "{0} дни"}, 

1645 "month": "месец", 

1646 "months": { 

1647 "singular": "{0} месец", 

1648 "dual": "{0} месеца", 

1649 "plural": "{0} месеца", 

1650 }, 

1651 "year": "година", 

1652 "years": { 

1653 "singular": "{0} година", 

1654 "dual": "{0} години", 

1655 "plural": "{0} години", 

1656 }, 

1657 } 

1658 

1659 month_names = [ 

1660 "", 

1661 "януари", 

1662 "февруари", 

1663 "март", 

1664 "април", 

1665 "май", 

1666 "юни", 

1667 "юли", 

1668 "август", 

1669 "септември", 

1670 "октомври", 

1671 "ноември", 

1672 "декември", 

1673 ] 

1674 month_abbreviations = [ 

1675 "", 

1676 "ян", 

1677 "февр", 

1678 "март", 

1679 "апр", 

1680 "май", 

1681 "юни", 

1682 "юли", 

1683 "авг", 

1684 "септ", 

1685 "окт", 

1686 "ноем", 

1687 "дек", 

1688 ] 

1689 

1690 day_names = [ 

1691 "", 

1692 "понеделник", 

1693 "вторник", 

1694 "сряда", 

1695 "четвъртък", 

1696 "петък", 

1697 "събота", 

1698 "неделя", 

1699 ] 

1700 day_abbreviations = ["", "пон", "вт", "ср", "четв", "пет", "съб", "нед"] 

1701 

1702 

1703class UkrainianLocale(SlavicBaseLocale): 

1704 names = ["ua", "uk", "uk-ua"] 

1705 

1706 past = "{0} тому" 

1707 future = "за {0}" 

1708 

1709 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { 

1710 "now": "зараз", 

1711 "second": "секунда", 

1712 "seconds": "{0} кілька секунд", 

1713 "minute": "хвилину", 

1714 "minutes": { 

1715 "singular": "{0} хвилину", 

1716 "dual": "{0} хвилини", 

1717 "plural": "{0} хвилин", 

1718 }, 

1719 "hour": "годину", 

1720 "hours": { 

1721 "singular": "{0} годину", 

1722 "dual": "{0} години", 

1723 "plural": "{0} годин", 

1724 }, 

1725 "day": "день", 

1726 "days": {"singular": "{0} день", "dual": "{0} дні", "plural": "{0} днів"}, 

1727 "month": "місяць", 

1728 "months": { 

1729 "singular": "{0} місяць", 

1730 "dual": "{0} місяці", 

1731 "plural": "{0} місяців", 

1732 }, 

1733 "year": "рік", 

1734 "years": {"singular": "{0} рік", "dual": "{0} роки", "plural": "{0} років"}, 

1735 } 

1736 

1737 month_names = [ 

1738 "", 

1739 "січня", 

1740 "лютого", 

1741 "березня", 

1742 "квітня", 

1743 "травня", 

1744 "червня", 

1745 "липня", 

1746 "серпня", 

1747 "вересня", 

1748 "жовтня", 

1749 "листопада", 

1750 "грудня", 

1751 ] 

1752 month_abbreviations = [ 

1753 "", 

1754 "січ", 

1755 "лют", 

1756 "бер", 

1757 "квіт", 

1758 "трав", 

1759 "черв", 

1760 "лип", 

1761 "серп", 

1762 "вер", 

1763 "жовт", 

1764 "лист", 

1765 "груд", 

1766 ] 

1767 

1768 day_names = [ 

1769 "", 

1770 "понеділок", 

1771 "вівторок", 

1772 "середа", 

1773 "четвер", 

1774 "п’ятниця", 

1775 "субота", 

1776 "неділя", 

1777 ] 

1778 day_abbreviations = ["", "пн", "вт", "ср", "чт", "пт", "сб", "нд"] 

1779 

1780 

1781class MacedonianLocale(SlavicBaseLocale): 

1782 names = ["mk", "mk-mk"] 

1783 

1784 past = "пред {0}" 

1785 future = "за {0}" 

1786 

1787 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { 

1788 "now": "сега", 

1789 "second": "една секунда", 

1790 "seconds": { 

1791 "singular": "{0} секунда", 

1792 "dual": "{0} секунди", 

1793 "plural": "{0} секунди", 

1794 }, 

1795 "minute": "една минута", 

1796 "minutes": { 

1797 "singular": "{0} минута", 

1798 "dual": "{0} минути", 

1799 "plural": "{0} минути", 

1800 }, 

1801 "hour": "еден саат", 

1802 "hours": {"singular": "{0} саат", "dual": "{0} саати", "plural": "{0} саати"}, 

1803 "day": "еден ден", 

1804 "days": {"singular": "{0} ден", "dual": "{0} дена", "plural": "{0} дена"}, 

1805 "week": "една недела", 

1806 "weeks": { 

1807 "singular": "{0} недела", 

1808 "dual": "{0} недели", 

1809 "plural": "{0} недели", 

1810 }, 

1811 "month": "еден месец", 

1812 "months": { 

1813 "singular": "{0} месец", 

1814 "dual": "{0} месеци", 

1815 "plural": "{0} месеци", 

1816 }, 

1817 "year": "една година", 

1818 "years": { 

1819 "singular": "{0} година", 

1820 "dual": "{0} години", 

1821 "plural": "{0} години", 

1822 }, 

1823 } 

1824 

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

1826 

1827 month_names = [ 

1828 "", 

1829 "Јануари", 

1830 "Февруари", 

1831 "Март", 

1832 "Април", 

1833 "Мај", 

1834 "Јуни", 

1835 "Јули", 

1836 "Август", 

1837 "Септември", 

1838 "Октомври", 

1839 "Ноември", 

1840 "Декември", 

1841 ] 

1842 month_abbreviations = [ 

1843 "", 

1844 "Јан", 

1845 "Фев", 

1846 "Мар", 

1847 "Апр", 

1848 "Мај", 

1849 "Јун", 

1850 "Јул", 

1851 "Авг", 

1852 "Септ", 

1853 "Окт", 

1854 "Ноем", 

1855 "Декем", 

1856 ] 

1857 

1858 day_names = [ 

1859 "", 

1860 "Понеделник", 

1861 "Вторник", 

1862 "Среда", 

1863 "Четврток", 

1864 "Петок", 

1865 "Сабота", 

1866 "Недела", 

1867 ] 

1868 day_abbreviations = [ 

1869 "", 

1870 "Пон", 

1871 "Вт", 

1872 "Сре", 

1873 "Чет", 

1874 "Пет", 

1875 "Саб", 

1876 "Нед", 

1877 ] 

1878 

1879 

1880class GermanBaseLocale(Locale): 

1881 past = "vor {0}" 

1882 future = "in {0}" 

1883 and_word = "und" 

1884 

1885 timeframes: ClassVar[Dict[TimeFrameLiteral, str]] = { 

1886 "now": "gerade eben", 

1887 "second": "einer Sekunde", 

1888 "seconds": "{0} Sekunden", 

1889 "minute": "einer Minute", 

1890 "minutes": "{0} Minuten", 

1891 "hour": "einer Stunde", 

1892 "hours": "{0} Stunden", 

1893 "day": "einem Tag", 

1894 "days": "{0} Tagen", 

1895 "week": "einer Woche", 

1896 "weeks": "{0} Wochen", 

1897 "month": "einem Monat", 

1898 "months": "{0} Monaten", 

1899 "year": "einem Jahr", 

1900 "years": "{0} Jahren", 

1901 } 

1902 

1903 timeframes_only_distance = timeframes.copy() 

1904 timeframes_only_distance["second"] = "eine Sekunde" 

1905 timeframes_only_distance["minute"] = "eine Minute" 

1906 timeframes_only_distance["hour"] = "eine Stunde" 

1907 timeframes_only_distance["day"] = "ein Tag" 

1908 timeframes_only_distance["days"] = "{0} Tage" 

1909 timeframes_only_distance["week"] = "eine Woche" 

1910 timeframes_only_distance["month"] = "ein Monat" 

1911 timeframes_only_distance["months"] = "{0} Monate" 

1912 timeframes_only_distance["year"] = "ein Jahr" 

1913 timeframes_only_distance["years"] = "{0} Jahre" 

1914 

1915 month_names = [ 

1916 "", 

1917 "Januar", 

1918 "Februar", 

1919 "März", 

1920 "April", 

1921 "Mai", 

1922 "Juni", 

1923 "Juli", 

1924 "August", 

1925 "September", 

1926 "Oktober", 

1927 "November", 

1928 "Dezember", 

1929 ] 

1930 

1931 month_abbreviations = [ 

1932 "", 

1933 "Jan", 

1934 "Feb", 

1935 "Mär", 

1936 "Apr", 

1937 "Mai", 

1938 "Jun", 

1939 "Jul", 

1940 "Aug", 

1941 "Sep", 

1942 "Okt", 

1943 "Nov", 

1944 "Dez", 

1945 ] 

1946 

1947 day_names = [ 

1948 "", 

1949 "Montag", 

1950 "Dienstag", 

1951 "Mittwoch", 

1952 "Donnerstag", 

1953 "Freitag", 

1954 "Samstag", 

1955 "Sonntag", 

1956 ] 

1957 

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

1959 

1960 def _ordinal_number(self, n: int) -> str: 

1961 return f"{n}." 

1962 

1963 def describe( 

1964 self, 

1965 timeframe: TimeFrameLiteral, 

1966 delta: Union[int, float] = 0, 

1967 only_distance: bool = False, 

1968 ) -> str: 

1969 """Describes a delta within a timeframe in plain language. 

1970 

1971 :param timeframe: a string representing a timeframe. 

1972 :param delta: a quantity representing a delta in a timeframe. 

1973 :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords 

1974 """ 

1975 

1976 if not only_distance: 

1977 return super().describe(timeframe, delta, only_distance) 

1978 

1979 # German uses a different case without 'in' or 'ago' 

1980 humanized: str = self.timeframes_only_distance[timeframe].format( 

1981 trunc(abs(delta)) 

1982 ) 

1983 

1984 return humanized 

1985 

1986 

1987class GermanLocale(GermanBaseLocale, Locale): 

1988 names = ["de", "de-de"] 

1989 

1990 

1991class SwissLocale(GermanBaseLocale, Locale): 

1992 names = ["de-ch"] 

1993 

1994 

1995class AustrianLocale(GermanBaseLocale, Locale): 

1996 names = ["de-at"] 

1997 

1998 month_names = [ 

1999 "", 

2000 "Jänner", 

2001 "Februar", 

2002 "März", 

2003 "April", 

2004 "Mai", 

2005 "Juni", 

2006 "Juli", 

2007 "August", 

2008 "September", 

2009 "Oktober", 

2010 "November", 

2011 "Dezember", 

2012 ] 

2013 

2014 

2015class NorwegianLocale(Locale): 

2016 names = ["nb", "nb-no"] 

2017 

2018 past = "for {0} siden" 

2019 future = "om {0}" 

2020 

2021 timeframes = { 

2022 "now": "nå nettopp", 

2023 "second": "ett sekund", 

2024 "seconds": "{0} sekunder", 

2025 "minute": "ett minutt", 

2026 "minutes": "{0} minutter", 

2027 "hour": "en time", 

2028 "hours": "{0} timer", 

2029 "day": "en dag", 

2030 "days": "{0} dager", 

2031 "week": "en uke", 

2032 "weeks": "{0} uker", 

2033 "month": "en måned", 

2034 "months": "{0} måneder", 

2035 "year": "ett år", 

2036 "years": "{0} år", 

2037 } 

2038 

2039 month_names = [ 

2040 "", 

2041 "januar", 

2042 "februar", 

2043 "mars", 

2044 "april", 

2045 "mai", 

2046 "juni", 

2047 "juli", 

2048 "august", 

2049 "september", 

2050 "oktober", 

2051 "november", 

2052 "desember", 

2053 ] 

2054 month_abbreviations = [ 

2055 "", 

2056 "jan", 

2057 "feb", 

2058 "mar", 

2059 "apr", 

2060 "mai", 

2061 "jun", 

2062 "jul", 

2063 "aug", 

2064 "sep", 

2065 "okt", 

2066 "nov", 

2067 "des", 

2068 ] 

2069 

2070 day_names = [ 

2071 "", 

2072 "mandag", 

2073 "tirsdag", 

2074 "onsdag", 

2075 "torsdag", 

2076 "fredag", 

2077 "lørdag", 

2078 "søndag", 

2079 ] 

2080 day_abbreviations = ["", "ma", "ti", "on", "to", "fr", "lø", "sø"] 

2081 

2082 def _ordinal_number(self, n: int) -> str: 

2083 return f"{n}." 

2084 

2085 

2086class NewNorwegianLocale(Locale): 

2087 names = ["nn", "nn-no"] 

2088 

2089 past = "for {0} sidan" 

2090 future = "om {0}" 

2091 

2092 timeframes = { 

2093 "now": "no nettopp", 

2094 "second": "eitt sekund", 

2095 "seconds": "{0} sekund", 

2096 "minute": "eitt minutt", 

2097 "minutes": "{0} minutt", 

2098 "hour": "ein time", 

2099 "hours": "{0} timar", 

2100 "day": "ein dag", 

2101 "days": "{0} dagar", 

2102 "week": "ei veke", 

2103 "weeks": "{0} veker", 

2104 "month": "ein månad", 

2105 "months": "{0} månader", 

2106 "year": "eitt år", 

2107 "years": "{0} år", 

2108 } 

2109 

2110 month_names = [ 

2111 "", 

2112 "januar", 

2113 "februar", 

2114 "mars", 

2115 "april", 

2116 "mai", 

2117 "juni", 

2118 "juli", 

2119 "august", 

2120 "september", 

2121 "oktober", 

2122 "november", 

2123 "desember", 

2124 ] 

2125 month_abbreviations = [ 

2126 "", 

2127 "jan", 

2128 "feb", 

2129 "mar", 

2130 "apr", 

2131 "mai", 

2132 "jun", 

2133 "jul", 

2134 "aug", 

2135 "sep", 

2136 "okt", 

2137 "nov", 

2138 "des", 

2139 ] 

2140 

2141 day_names = [ 

2142 "", 

2143 "måndag", 

2144 "tysdag", 

2145 "onsdag", 

2146 "torsdag", 

2147 "fredag", 

2148 "laurdag", 

2149 "sundag", 

2150 ] 

2151 day_abbreviations = ["", "må", "ty", "on", "to", "fr", "la", "su"] 

2152 

2153 def _ordinal_number(self, n: int) -> str: 

2154 return f"{n}." 

2155 

2156 

2157class PortugueseLocale(Locale): 

2158 names = ["pt", "pt-pt"] 

2159 

2160 past = "há {0}" 

2161 future = "em {0}" 

2162 and_word = "e" 

2163 

2164 timeframes = { 

2165 "now": "agora", 

2166 "second": "um segundo", 

2167 "seconds": "{0} segundos", 

2168 "minute": "um minuto", 

2169 "minutes": "{0} minutos", 

2170 "hour": "uma hora", 

2171 "hours": "{0} horas", 

2172 "day": "um dia", 

2173 "days": "{0} dias", 

2174 "week": "uma semana", 

2175 "weeks": "{0} semanas", 

2176 "month": "um mês", 

2177 "months": "{0} meses", 

2178 "year": "um ano", 

2179 "years": "{0} anos", 

2180 } 

2181 

2182 month_names = [ 

2183 "", 

2184 "Janeiro", 

2185 "Fevereiro", 

2186 "Março", 

2187 "Abril", 

2188 "Maio", 

2189 "Junho", 

2190 "Julho", 

2191 "Agosto", 

2192 "Setembro", 

2193 "Outubro", 

2194 "Novembro", 

2195 "Dezembro", 

2196 ] 

2197 month_abbreviations = [ 

2198 "", 

2199 "Jan", 

2200 "Fev", 

2201 "Mar", 

2202 "Abr", 

2203 "Mai", 

2204 "Jun", 

2205 "Jul", 

2206 "Ago", 

2207 "Set", 

2208 "Out", 

2209 "Nov", 

2210 "Dez", 

2211 ] 

2212 

2213 day_names = [ 

2214 "", 

2215 "Segunda-feira", 

2216 "Terça-feira", 

2217 "Quarta-feira", 

2218 "Quinta-feira", 

2219 "Sexta-feira", 

2220 "Sábado", 

2221 "Domingo", 

2222 ] 

2223 day_abbreviations = ["", "Seg", "Ter", "Qua", "Qui", "Sex", "Sab", "Dom"] 

2224 

2225 

2226class BrazilianPortugueseLocale(PortugueseLocale): 

2227 names = ["pt-br"] 

2228 

2229 past = "faz {0}" 

2230 

2231 

2232class TagalogLocale(Locale): 

2233 names = ["tl", "tl-ph"] 

2234 

2235 past = "nakaraang {0}" 

2236 future = "{0} mula ngayon" 

2237 

2238 timeframes = { 

2239 "now": "ngayon lang", 

2240 "second": "isang segundo", 

2241 "seconds": "{0} segundo", 

2242 "minute": "isang minuto", 

2243 "minutes": "{0} minuto", 

2244 "hour": "isang oras", 

2245 "hours": "{0} oras", 

2246 "day": "isang araw", 

2247 "days": "{0} araw", 

2248 "week": "isang linggo", 

2249 "weeks": "{0} linggo", 

2250 "month": "isang buwan", 

2251 "months": "{0} buwan", 

2252 "year": "isang taon", 

2253 "years": "{0} taon", 

2254 } 

2255 

2256 month_names = [ 

2257 "", 

2258 "Enero", 

2259 "Pebrero", 

2260 "Marso", 

2261 "Abril", 

2262 "Mayo", 

2263 "Hunyo", 

2264 "Hulyo", 

2265 "Agosto", 

2266 "Setyembre", 

2267 "Oktubre", 

2268 "Nobyembre", 

2269 "Disyembre", 

2270 ] 

2271 month_abbreviations = [ 

2272 "", 

2273 "Ene", 

2274 "Peb", 

2275 "Mar", 

2276 "Abr", 

2277 "May", 

2278 "Hun", 

2279 "Hul", 

2280 "Ago", 

2281 "Set", 

2282 "Okt", 

2283 "Nob", 

2284 "Dis", 

2285 ] 

2286 

2287 day_names = [ 

2288 "", 

2289 "Lunes", 

2290 "Martes", 

2291 "Miyerkules", 

2292 "Huwebes", 

2293 "Biyernes", 

2294 "Sabado", 

2295 "Linggo", 

2296 ] 

2297 day_abbreviations = ["", "Lun", "Mar", "Miy", "Huw", "Biy", "Sab", "Lin"] 

2298 

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

2300 

2301 def _ordinal_number(self, n: int) -> str: 

2302 return f"ika-{n}" 

2303 

2304 

2305class VietnameseLocale(Locale): 

2306 names = ["vi", "vi-vn"] 

2307 

2308 past = "{0} trước" 

2309 future = "{0} nữa" 

2310 

2311 timeframes = { 

2312 "now": "hiện tại", 

2313 "second": "một giây", 

2314 "seconds": "{0} giây", 

2315 "minute": "một phút", 

2316 "minutes": "{0} phút", 

2317 "hour": "một giờ", 

2318 "hours": "{0} giờ", 

2319 "day": "một ngày", 

2320 "days": "{0} ngày", 

2321 "week": "một tuần", 

2322 "weeks": "{0} tuần", 

2323 "month": "một tháng", 

2324 "months": "{0} tháng", 

2325 "year": "một năm", 

2326 "years": "{0} năm", 

2327 } 

2328 

2329 month_names = [ 

2330 "", 

2331 "Tháng Một", 

2332 "Tháng Hai", 

2333 "Tháng Ba", 

2334 "Tháng Tư", 

2335 "Tháng Năm", 

2336 "Tháng Sáu", 

2337 "Tháng Bảy", 

2338 "Tháng Tám", 

2339 "Tháng Chín", 

2340 "Tháng Mười", 

2341 "Tháng Mười Một", 

2342 "Tháng Mười Hai", 

2343 ] 

2344 month_abbreviations = [ 

2345 "", 

2346 "Tháng 1", 

2347 "Tháng 2", 

2348 "Tháng 3", 

2349 "Tháng 4", 

2350 "Tháng 5", 

2351 "Tháng 6", 

2352 "Tháng 7", 

2353 "Tháng 8", 

2354 "Tháng 9", 

2355 "Tháng 10", 

2356 "Tháng 11", 

2357 "Tháng 12", 

2358 ] 

2359 

2360 day_names = [ 

2361 "", 

2362 "Thứ Hai", 

2363 "Thứ Ba", 

2364 "Thứ Tư", 

2365 "Thứ Năm", 

2366 "Thứ Sáu", 

2367 "Thứ Bảy", 

2368 "Chủ Nhật", 

2369 ] 

2370 day_abbreviations = ["", "Thứ 2", "Thứ 3", "Thứ 4", "Thứ 5", "Thứ 6", "Thứ 7", "CN"] 

2371 

2372 

2373class TurkishLocale(Locale): 

2374 names = ["tr", "tr-tr"] 

2375 

2376 past = "{0} önce" 

2377 future = "{0} sonra" 

2378 and_word = "ve" 

2379 

2380 timeframes = { 

2381 "now": "şimdi", 

2382 "second": "bir saniye", 

2383 "seconds": "{0} saniye", 

2384 "minute": "bir dakika", 

2385 "minutes": "{0} dakika", 

2386 "hour": "bir saat", 

2387 "hours": "{0} saat", 

2388 "day": "bir gün", 

2389 "days": "{0} gün", 

2390 "week": "bir hafta", 

2391 "weeks": "{0} hafta", 

2392 "month": "bir ay", 

2393 "months": "{0} ay", 

2394 "year": "bir yıl", 

2395 "years": "{0} yıl", 

2396 } 

2397 

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

2399 

2400 month_names = [ 

2401 "", 

2402 "Ocak", 

2403 "Şubat", 

2404 "Mart", 

2405 "Nisan", 

2406 "Mayıs", 

2407 "Haziran", 

2408 "Temmuz", 

2409 "Ağustos", 

2410 "Eylül", 

2411 "Ekim", 

2412 "Kasım", 

2413 "Aralık", 

2414 ] 

2415 month_abbreviations = [ 

2416 "", 

2417 "Oca", 

2418 "Şub", 

2419 "Mar", 

2420 "Nis", 

2421 "May", 

2422 "Haz", 

2423 "Tem", 

2424 "Ağu", 

2425 "Eyl", 

2426 "Eki", 

2427 "Kas", 

2428 "Ara", 

2429 ] 

2430 

2431 day_names = [ 

2432 "", 

2433 "Pazartesi", 

2434 "Salı", 

2435 "Çarşamba", 

2436 "Perşembe", 

2437 "Cuma", 

2438 "Cumartesi", 

2439 "Pazar", 

2440 ] 

2441 day_abbreviations = ["", "Pzt", "Sal", "Çar", "Per", "Cum", "Cmt", "Paz"] 

2442 

2443 

2444class AzerbaijaniLocale(Locale): 

2445 names = ["az", "az-az"] 

2446 

2447 past = "{0} əvvəl" 

2448 future = "{0} sonra" 

2449 

2450 timeframes = { 

2451 "now": "indi", 

2452 "second": "bir saniyə", 

2453 "seconds": "{0} saniyə", 

2454 "minute": "bir dəqiqə", 

2455 "minutes": "{0} dəqiqə", 

2456 "hour": "bir saat", 

2457 "hours": "{0} saat", 

2458 "day": "bir gün", 

2459 "days": "{0} gün", 

2460 "week": "bir həftə", 

2461 "weeks": "{0} həftə", 

2462 "month": "bir ay", 

2463 "months": "{0} ay", 

2464 "year": "bir il", 

2465 "years": "{0} il", 

2466 } 

2467 

2468 month_names = [ 

2469 "", 

2470 "Yanvar", 

2471 "Fevral", 

2472 "Mart", 

2473 "Aprel", 

2474 "May", 

2475 "İyun", 

2476 "İyul", 

2477 "Avqust", 

2478 "Sentyabr", 

2479 "Oktyabr", 

2480 "Noyabr", 

2481 "Dekabr", 

2482 ] 

2483 month_abbreviations = [ 

2484 "", 

2485 "Yan", 

2486 "Fev", 

2487 "Mar", 

2488 "Apr", 

2489 "May", 

2490 "İyn", 

2491 "İyl", 

2492 "Avq", 

2493 "Sen", 

2494 "Okt", 

2495 "Noy", 

2496 "Dek", 

2497 ] 

2498 

2499 day_names = [ 

2500 "", 

2501 "Bazar ertəsi", 

2502 "Çərşənbə axşamı", 

2503 "Çərşənbə", 

2504 "Cümə axşamı", 

2505 "Cümə", 

2506 "Şənbə", 

2507 "Bazar", 

2508 ] 

2509 day_abbreviations = ["", "Ber", "Çax", "Çər", "Cax", "Cüm", "Şnb", "Bzr"] 

2510 

2511 

2512class ArabicLocale(Locale): 

2513 names = [ 

2514 "ar", 

2515 "ar-ae", 

2516 "ar-bh", 

2517 "ar-dj", 

2518 "ar-eg", 

2519 "ar-eh", 

2520 "ar-er", 

2521 "ar-km", 

2522 "ar-kw", 

2523 "ar-ly", 

2524 "ar-om", 

2525 "ar-qa", 

2526 "ar-sa", 

2527 "ar-sd", 

2528 "ar-so", 

2529 "ar-ss", 

2530 "ar-td", 

2531 "ar-ye", 

2532 ] 

2533 

2534 past = "منذ {0}" 

2535 future = "خلال {0}" 

2536 

2537 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { 

2538 "now": "الآن", 

2539 "second": "ثانية", 

2540 "seconds": {"2": "ثانيتين", "ten": "{0} ثوان", "higher": "{0} ثانية"}, 

2541 "minute": "دقيقة", 

2542 "minutes": {"2": "دقيقتين", "ten": "{0} دقائق", "higher": "{0} دقيقة"}, 

2543 "hour": "ساعة", 

2544 "hours": {"2": "ساعتين", "ten": "{0} ساعات", "higher": "{0} ساعة"}, 

2545 "day": "يوم", 

2546 "days": {"2": "يومين", "ten": "{0} أيام", "higher": "{0} يوم"}, 

2547 "week": "اسبوع", 

2548 "weeks": {"2": "اسبوعين", "ten": "{0} أسابيع", "higher": "{0} اسبوع"}, 

2549 "month": "شهر", 

2550 "months": {"2": "شهرين", "ten": "{0} أشهر", "higher": "{0} شهر"}, 

2551 "year": "سنة", 

2552 "years": {"2": "سنتين", "ten": "{0} سنوات", "higher": "{0} سنة"}, 

2553 } 

2554 

2555 month_names = [ 

2556 "", 

2557 "يناير", 

2558 "فبراير", 

2559 "مارس", 

2560 "أبريل", 

2561 "مايو", 

2562 "يونيو", 

2563 "يوليو", 

2564 "أغسطس", 

2565 "سبتمبر", 

2566 "أكتوبر", 

2567 "نوفمبر", 

2568 "ديسمبر", 

2569 ] 

2570 month_abbreviations = [ 

2571 "", 

2572 "يناير", 

2573 "فبراير", 

2574 "مارس", 

2575 "أبريل", 

2576 "مايو", 

2577 "يونيو", 

2578 "يوليو", 

2579 "أغسطس", 

2580 "سبتمبر", 

2581 "أكتوبر", 

2582 "نوفمبر", 

2583 "ديسمبر", 

2584 ] 

2585 

2586 day_names = [ 

2587 "", 

2588 "الإثنين", 

2589 "الثلاثاء", 

2590 "الأربعاء", 

2591 "الخميس", 

2592 "الجمعة", 

2593 "السبت", 

2594 "الأحد", 

2595 ] 

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

2597 

2598 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: 

2599 form = self.timeframes[timeframe] 

2600 delta = abs(delta) 

2601 if isinstance(form, Mapping): 

2602 if delta == 2: 

2603 form = form["2"] 

2604 elif 2 < delta <= 10: 

2605 form = form["ten"] 

2606 else: 

2607 form = form["higher"] 

2608 

2609 return form.format(delta) 

2610 

2611 

2612class LevantArabicLocale(ArabicLocale): 

2613 names = ["ar-iq", "ar-jo", "ar-lb", "ar-ps", "ar-sy"] 

2614 month_names = [ 

2615 "", 

2616 "كانون الثاني", 

2617 "شباط", 

2618 "آذار", 

2619 "نيسان", 

2620 "أيار", 

2621 "حزيران", 

2622 "تموز", 

2623 "آب", 

2624 "أيلول", 

2625 "تشرين الأول", 

2626 "تشرين الثاني", 

2627 "كانون الأول", 

2628 ] 

2629 month_abbreviations = [ 

2630 "", 

2631 "كانون الثاني", 

2632 "شباط", 

2633 "آذار", 

2634 "نيسان", 

2635 "أيار", 

2636 "حزيران", 

2637 "تموز", 

2638 "آب", 

2639 "أيلول", 

2640 "تشرين الأول", 

2641 "تشرين الثاني", 

2642 "كانون الأول", 

2643 ] 

2644 

2645 

2646class AlgeriaTunisiaArabicLocale(ArabicLocale): 

2647 names = ["ar-tn", "ar-dz"] 

2648 month_names = [ 

2649 "", 

2650 "جانفي", 

2651 "فيفري", 

2652 "مارس", 

2653 "أفريل", 

2654 "ماي", 

2655 "جوان", 

2656 "جويلية", 

2657 "أوت", 

2658 "سبتمبر", 

2659 "أكتوبر", 

2660 "نوفمبر", 

2661 "ديسمبر", 

2662 ] 

2663 month_abbreviations = [ 

2664 "", 

2665 "جانفي", 

2666 "فيفري", 

2667 "مارس", 

2668 "أفريل", 

2669 "ماي", 

2670 "جوان", 

2671 "جويلية", 

2672 "أوت", 

2673 "سبتمبر", 

2674 "أكتوبر", 

2675 "نوفمبر", 

2676 "ديسمبر", 

2677 ] 

2678 

2679 

2680class MauritaniaArabicLocale(ArabicLocale): 

2681 names = ["ar-mr"] 

2682 month_names = [ 

2683 "", 

2684 "يناير", 

2685 "فبراير", 

2686 "مارس", 

2687 "إبريل", 

2688 "مايو", 

2689 "يونيو", 

2690 "يوليو", 

2691 "أغشت", 

2692 "شتمبر", 

2693 "أكتوبر", 

2694 "نوفمبر", 

2695 "دجمبر", 

2696 ] 

2697 month_abbreviations = [ 

2698 "", 

2699 "يناير", 

2700 "فبراير", 

2701 "مارس", 

2702 "إبريل", 

2703 "مايو", 

2704 "يونيو", 

2705 "يوليو", 

2706 "أغشت", 

2707 "شتمبر", 

2708 "أكتوبر", 

2709 "نوفمبر", 

2710 "دجمبر", 

2711 ] 

2712 

2713 

2714class MoroccoArabicLocale(ArabicLocale): 

2715 names = ["ar-ma"] 

2716 month_names = [ 

2717 "", 

2718 "يناير", 

2719 "فبراير", 

2720 "مارس", 

2721 "أبريل", 

2722 "ماي", 

2723 "يونيو", 

2724 "يوليوز", 

2725 "غشت", 

2726 "شتنبر", 

2727 "أكتوبر", 

2728 "نونبر", 

2729 "دجنبر", 

2730 ] 

2731 month_abbreviations = [ 

2732 "", 

2733 "يناير", 

2734 "فبراير", 

2735 "مارس", 

2736 "أبريل", 

2737 "ماي", 

2738 "يونيو", 

2739 "يوليوز", 

2740 "غشت", 

2741 "شتنبر", 

2742 "أكتوبر", 

2743 "نونبر", 

2744 "دجنبر", 

2745 ] 

2746 

2747 

2748class IcelandicLocale(Locale): 

2749 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: 

2750 form = self.timeframes[timeframe] 

2751 

2752 if isinstance(form, Mapping): 

2753 if delta < 0: 

2754 form = form["past"] 

2755 elif delta > 0: 

2756 form = form["future"] 

2757 else: 

2758 raise ValueError( 

2759 "Icelandic Locale does not support units with a delta of zero. " 

2760 "Please consider making a contribution to fix this issue." 

2761 ) 

2762 # FIXME: handle when delta is 0 

2763 

2764 return form.format(abs(delta)) 

2765 

2766 names = ["is", "is-is"] 

2767 

2768 past = "fyrir {0} síðan" 

2769 future = "eftir {0}" 

2770 

2771 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { 

2772 "now": "rétt í þessu", 

2773 "second": {"past": "sekúndu", "future": "sekúndu"}, 

2774 "seconds": {"past": "{0} nokkrum sekúndum", "future": "nokkrar sekúndur"}, 

2775 "minute": {"past": "einni mínútu", "future": "eina mínútu"}, 

2776 "minutes": {"past": "{0} mínútum", "future": "{0} mínútur"}, 

2777 "hour": {"past": "einum tíma", "future": "einn tíma"}, 

2778 "hours": {"past": "{0} tímum", "future": "{0} tíma"}, 

2779 "day": {"past": "einum degi", "future": "einn dag"}, 

2780 "days": {"past": "{0} dögum", "future": "{0} daga"}, 

2781 "month": {"past": "einum mánuði", "future": "einn mánuð"}, 

2782 "months": {"past": "{0} mánuðum", "future": "{0} mánuði"}, 

2783 "year": {"past": "einu ári", "future": "eitt ár"}, 

2784 "years": {"past": "{0} árum", "future": "{0} ár"}, 

2785 } 

2786 

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

2788 

2789 month_names = [ 

2790 "", 

2791 "janúar", 

2792 "febrúar", 

2793 "mars", 

2794 "apríl", 

2795 "maí", 

2796 "júní", 

2797 "júlí", 

2798 "ágúst", 

2799 "september", 

2800 "október", 

2801 "nóvember", 

2802 "desember", 

2803 ] 

2804 month_abbreviations = [ 

2805 "", 

2806 "jan", 

2807 "feb", 

2808 "mar", 

2809 "apr", 

2810 "maí", 

2811 "jún", 

2812 "júl", 

2813 "ágú", 

2814 "sep", 

2815 "okt", 

2816 "nóv", 

2817 "des", 

2818 ] 

2819 

2820 day_names = [ 

2821 "", 

2822 "mánudagur", 

2823 "þriðjudagur", 

2824 "miðvikudagur", 

2825 "fimmtudagur", 

2826 "föstudagur", 

2827 "laugardagur", 

2828 "sunnudagur", 

2829 ] 

2830 day_abbreviations = ["", "mán", "þri", "mið", "fim", "fös", "lau", "sun"] 

2831 

2832 

2833class DanishLocale(Locale): 

2834 names = ["da", "da-dk"] 

2835 

2836 past = "for {0} siden" 

2837 future = "om {0}" 

2838 and_word = "og" 

2839 

2840 timeframes = { 

2841 "now": "lige nu", 

2842 "second": "et sekund", 

2843 "seconds": "{0} sekunder", 

2844 "minute": "et minut", 

2845 "minutes": "{0} minutter", 

2846 "hour": "en time", 

2847 "hours": "{0} timer", 

2848 "day": "en dag", 

2849 "days": "{0} dage", 

2850 "week": "en uge", 

2851 "weeks": "{0} uger", 

2852 "month": "en måned", 

2853 "months": "{0} måneder", 

2854 "year": "et år", 

2855 "years": "{0} år", 

2856 } 

2857 

2858 month_names = [ 

2859 "", 

2860 "januar", 

2861 "februar", 

2862 "marts", 

2863 "april", 

2864 "maj", 

2865 "juni", 

2866 "juli", 

2867 "august", 

2868 "september", 

2869 "oktober", 

2870 "november", 

2871 "december", 

2872 ] 

2873 month_abbreviations = [ 

2874 "", 

2875 "jan", 

2876 "feb", 

2877 "mar", 

2878 "apr", 

2879 "maj", 

2880 "jun", 

2881 "jul", 

2882 "aug", 

2883 "sep", 

2884 "okt", 

2885 "nov", 

2886 "dec", 

2887 ] 

2888 

2889 day_names = [ 

2890 "", 

2891 "mandag", 

2892 "tirsdag", 

2893 "onsdag", 

2894 "torsdag", 

2895 "fredag", 

2896 "lørdag", 

2897 "søndag", 

2898 ] 

2899 day_abbreviations = ["", "man", "tir", "ons", "tor", "fre", "lør", "søn"] 

2900 

2901 def _ordinal_number(self, n: int) -> str: 

2902 return f"{n}." 

2903 

2904 

2905class MalayalamLocale(Locale): 

2906 names = ["ml"] 

2907 

2908 past = "{0} മുമ്പ്" 

2909 future = "{0} ശേഷം" 

2910 

2911 timeframes = { 

2912 "now": "ഇപ്പോൾ", 

2913 "second": "ഒരു നിമിഷം", 

2914 "seconds": "{0} സെക്കന്റ്‌", 

2915 "minute": "ഒരു മിനിറ്റ്", 

2916 "minutes": "{0} മിനിറ്റ്", 

2917 "hour": "ഒരു മണിക്കൂർ", 

2918 "hours": "{0} മണിക്കൂർ", 

2919 "day": "ഒരു ദിവസം ", 

2920 "days": "{0} ദിവസം ", 

2921 "month": "ഒരു മാസം ", 

2922 "months": "{0} മാസം ", 

2923 "year": "ഒരു വർഷം ", 

2924 "years": "{0} വർഷം ", 

2925 } 

2926 

2927 meridians = { 

2928 "am": "രാവിലെ", 

2929 "pm": "ഉച്ചക്ക് ശേഷം", 

2930 "AM": "രാവിലെ", 

2931 "PM": "ഉച്ചക്ക് ശേഷം", 

2932 } 

2933 

2934 month_names = [ 

2935 "", 

2936 "ജനുവരി", 

2937 "ഫെബ്രുവരി", 

2938 "മാർച്ച്‌", 

2939 "ഏപ്രിൽ ", 

2940 "മെയ്‌ ", 

2941 "ജൂണ്‍", 

2942 "ജൂലൈ", 

2943 "ഓഗസ്റ്റ്‌", 

2944 "സെപ്റ്റംബർ", 

2945 "ഒക്ടോബർ", 

2946 "നവംബർ", 

2947 "ഡിസംബർ", 

2948 ] 

2949 month_abbreviations = [ 

2950 "", 

2951 "ജനു", 

2952 "ഫെബ് ", 

2953 "മാർ", 

2954 "ഏപ്രിൽ", 

2955 "മേയ്", 

2956 "ജൂണ്‍", 

2957 "ജൂലൈ", 

2958 "ഓഗസ്റ", 

2959 "സെപ്റ്റ", 

2960 "ഒക്ടോ", 

2961 "നവം", 

2962 "ഡിസം", 

2963 ] 

2964 

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

2966 day_abbreviations = [ 

2967 "", 

2968 "തിങ്കള്‍", 

2969 "ചൊവ്വ", 

2970 "ബുധന്‍", 

2971 "വ്യാഴം", 

2972 "വെള്ളി", 

2973 "ശനി", 

2974 "ഞായര്‍", 

2975 ] 

2976 

2977 

2978class HindiLocale(Locale): 

2979 names = ["hi", "hi-in"] 

2980 

2981 past = "{0} पहले" 

2982 future = "{0} बाद" 

2983 

2984 timeframes = { 

2985 "now": "अभी", 

2986 "second": "एक पल", 

2987 "seconds": "{0} सेकंड्", 

2988 "minute": "एक मिनट ", 

2989 "minutes": "{0} मिनट ", 

2990 "hour": "एक घंटा", 

2991 "hours": "{0} घंटे", 

2992 "day": "एक दिन", 

2993 "days": "{0} दिन", 

2994 "month": "एक माह ", 

2995 "months": "{0} महीने ", 

2996 "year": "एक वर्ष ", 

2997 "years": "{0} साल ", 

2998 } 

2999 

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

3001 

3002 month_names = [ 

3003 "", 

3004 "जनवरी", 

3005 "फरवरी", 

3006 "मार्च", 

3007 "अप्रैल ", 

3008 "मई", 

3009 "जून", 

3010 "जुलाई", 

3011 "अगस्त", 

3012 "सितंबर", 

3013 "अक्टूबर", 

3014 "नवंबर", 

3015 "दिसंबर", 

3016 ] 

3017 month_abbreviations = [ 

3018 "", 

3019 "जन", 

3020 "फ़र", 

3021 "मार्च", 

3022 "अप्रै", 

3023 "मई", 

3024 "जून", 

3025 "जुलाई", 

3026 "आग", 

3027 "सित", 

3028 "अकत", 

3029 "नवे", 

3030 "दिस", 

3031 ] 

3032 

3033 day_names = [ 

3034 "", 

3035 "सोमवार", 

3036 "मंगलवार", 

3037 "बुधवार", 

3038 "गुरुवार", 

3039 "शुक्रवार", 

3040 "शनिवार", 

3041 "रविवार", 

3042 ] 

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

3044 

3045 

3046class CzechLocale(Locale): 

3047 names = ["cs", "cs-cz"] 

3048 

3049 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { 

3050 "now": "Teď", 

3051 "second": {"past": "vteřina", "future": "vteřina"}, 

3052 "seconds": { 

3053 "zero": "vteřina", 

3054 "past": "{0} sekundami", 

3055 "future-singular": "{0} sekundy", 

3056 "future-paucal": "{0} sekund", 

3057 }, 

3058 "minute": {"past": "minutou", "future": "minutu"}, 

3059 "minutes": { 

3060 "zero": "{0} minut", 

3061 "past": "{0} minutami", 

3062 "future-singular": "{0} minuty", 

3063 "future-paucal": "{0} minut", 

3064 }, 

3065 "hour": {"past": "hodinou", "future": "hodinu"}, 

3066 "hours": { 

3067 "zero": "{0} hodin", 

3068 "past": "{0} hodinami", 

3069 "future-singular": "{0} hodiny", 

3070 "future-paucal": "{0} hodin", 

3071 }, 

3072 "day": {"past": "dnem", "future": "den"}, 

3073 "days": { 

3074 "zero": "{0} dnů", 

3075 "past": "{0} dny", 

3076 "future-singular": "{0} dny", 

3077 "future-paucal": "{0} dnů", 

3078 }, 

3079 "week": {"past": "týdnem", "future": "týden"}, 

3080 "weeks": { 

3081 "zero": "{0} týdnů", 

3082 "past": "{0} týdny", 

3083 "future-singular": "{0} týdny", 

3084 "future-paucal": "{0} týdnů", 

3085 }, 

3086 "month": {"past": "měsícem", "future": "měsíc"}, 

3087 "months": { 

3088 "zero": "{0} měsíců", 

3089 "past": "{0} měsíci", 

3090 "future-singular": "{0} měsíce", 

3091 "future-paucal": "{0} měsíců", 

3092 }, 

3093 "year": {"past": "rokem", "future": "rok"}, 

3094 "years": { 

3095 "zero": "{0} let", 

3096 "past": "{0} lety", 

3097 "future-singular": "{0} roky", 

3098 "future-paucal": "{0} let", 

3099 }, 

3100 } 

3101 

3102 past = "Před {0}" 

3103 future = "Za {0}" 

3104 

3105 month_names = [ 

3106 "", 

3107 "leden", 

3108 "únor", 

3109 "březen", 

3110 "duben", 

3111 "květen", 

3112 "červen", 

3113 "červenec", 

3114 "srpen", 

3115 "září", 

3116 "říjen", 

3117 "listopad", 

3118 "prosinec", 

3119 ] 

3120 month_abbreviations = [ 

3121 "", 

3122 "led", 

3123 "úno", 

3124 "bře", 

3125 "dub", 

3126 "kvě", 

3127 "čvn", 

3128 "čvc", 

3129 "srp", 

3130 "zář", 

3131 "říj", 

3132 "lis", 

3133 "pro", 

3134 ] 

3135 

3136 day_names = [ 

3137 "", 

3138 "pondělí", 

3139 "úterý", 

3140 "středa", 

3141 "čtvrtek", 

3142 "pátek", 

3143 "sobota", 

3144 "neděle", 

3145 ] 

3146 day_abbreviations = ["", "po", "út", "st", "čt", "pá", "so", "ne"] 

3147 

3148 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: 

3149 """Czech aware time frame format function, takes into account 

3150 the differences between past and future forms.""" 

3151 abs_delta = abs(delta) 

3152 form = self.timeframes[timeframe] 

3153 

3154 if isinstance(form, str): 

3155 return form.format(abs_delta) 

3156 

3157 if delta == 0: 

3158 key = "zero" # And *never* use 0 in the singular! 

3159 elif delta < 0: 

3160 key = "past" 

3161 else: 

3162 # Needed since both regular future and future-singular and future-paucal cases 

3163 if "future-singular" not in form: 

3164 key = "future" 

3165 elif 2 <= abs_delta % 10 <= 4 and ( 

3166 abs_delta % 100 < 10 or abs_delta % 100 >= 20 

3167 ): 

3168 key = "future-singular" 

3169 else: 

3170 key = "future-paucal" 

3171 

3172 form: str = form[key] 

3173 return form.format(abs_delta) 

3174 

3175 

3176class SlovakLocale(Locale): 

3177 names = ["sk", "sk-sk"] 

3178 

3179 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { 

3180 "now": "Teraz", 

3181 "second": {"past": "sekundou", "future": "sekundu"}, 

3182 "seconds": { 

3183 "zero": "{0} sekúnd", 

3184 "past": "{0} sekundami", 

3185 "future-singular": "{0} sekundy", 

3186 "future-paucal": "{0} sekúnd", 

3187 }, 

3188 "minute": {"past": "minútou", "future": "minútu"}, 

3189 "minutes": { 

3190 "zero": "{0} minút", 

3191 "past": "{0} minútami", 

3192 "future-singular": "{0} minúty", 

3193 "future-paucal": "{0} minút", 

3194 }, 

3195 "hour": {"past": "hodinou", "future": "hodinu"}, 

3196 "hours": { 

3197 "zero": "{0} hodín", 

3198 "past": "{0} hodinami", 

3199 "future-singular": "{0} hodiny", 

3200 "future-paucal": "{0} hodín", 

3201 }, 

3202 "day": {"past": "dňom", "future": "deň"}, 

3203 "days": { 

3204 "zero": "{0} dní", 

3205 "past": "{0} dňami", 

3206 "future-singular": "{0} dni", 

3207 "future-paucal": "{0} dní", 

3208 }, 

3209 "week": {"past": "týždňom", "future": "týždeň"}, 

3210 "weeks": { 

3211 "zero": "{0} týždňov", 

3212 "past": "{0} týždňami", 

3213 "future-singular": "{0} týždne", 

3214 "future-paucal": "{0} týždňov", 

3215 }, 

3216 "month": {"past": "mesiacom", "future": "mesiac"}, 

3217 "months": { 

3218 "zero": "{0} mesiacov", 

3219 "past": "{0} mesiacmi", 

3220 "future-singular": "{0} mesiace", 

3221 "future-paucal": "{0} mesiacov", 

3222 }, 

3223 "year": {"past": "rokom", "future": "rok"}, 

3224 "years": { 

3225 "zero": "{0} rokov", 

3226 "past": "{0} rokmi", 

3227 "future-singular": "{0} roky", 

3228 "future-paucal": "{0} rokov", 

3229 }, 

3230 } 

3231 

3232 past = "Pred {0}" 

3233 future = "O {0}" 

3234 and_word = "a" 

3235 

3236 month_names = [ 

3237 "", 

3238 "január", 

3239 "február", 

3240 "marec", 

3241 "apríl", 

3242 "máj", 

3243 "jún", 

3244 "júl", 

3245 "august", 

3246 "september", 

3247 "október", 

3248 "november", 

3249 "december", 

3250 ] 

3251 month_abbreviations = [ 

3252 "", 

3253 "jan", 

3254 "feb", 

3255 "mar", 

3256 "apr", 

3257 "máj", 

3258 "jún", 

3259 "júl", 

3260 "aug", 

3261 "sep", 

3262 "okt", 

3263 "nov", 

3264 "dec", 

3265 ] 

3266 

3267 day_names = [ 

3268 "", 

3269 "pondelok", 

3270 "utorok", 

3271 "streda", 

3272 "štvrtok", 

3273 "piatok", 

3274 "sobota", 

3275 "nedeľa", 

3276 ] 

3277 day_abbreviations = ["", "po", "ut", "st", "št", "pi", "so", "ne"] 

3278 

3279 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: 

3280 """Slovak aware time frame format function, takes into account 

3281 the differences between past and future forms.""" 

3282 abs_delta = abs(delta) 

3283 form = self.timeframes[timeframe] 

3284 

3285 if isinstance(form, str): 

3286 return form.format(abs_delta) 

3287 

3288 if delta == 0: 

3289 key = "zero" # And *never* use 0 in the singular! 

3290 elif delta < 0: 

3291 key = "past" 

3292 else: 

3293 if "future-singular" not in form: 

3294 key = "future" 

3295 elif 2 <= abs_delta % 10 <= 4 and ( 

3296 abs_delta % 100 < 10 or abs_delta % 100 >= 20 

3297 ): 

3298 key = "future-singular" 

3299 else: 

3300 key = "future-paucal" 

3301 

3302 form: str = form[key] 

3303 return form.format(abs_delta) 

3304 

3305 

3306class FarsiLocale(Locale): 

3307 names = ["fa", "fa-ir"] 

3308 

3309 past = "{0} قبل" 

3310 future = "در {0}" 

3311 

3312 timeframes = { 

3313 "now": "اکنون", 

3314 "second": "یک لحظه", 

3315 "seconds": "{0} ثانیه", 

3316 "minute": "یک دقیقه", 

3317 "minutes": "{0} دقیقه", 

3318 "hour": "یک ساعت", 

3319 "hours": "{0} ساعت", 

3320 "day": "یک روز", 

3321 "days": "{0} روز", 

3322 "month": "یک ماه", 

3323 "months": "{0} ماه", 

3324 "year": "یک سال", 

3325 "years": "{0} سال", 

3326 } 

3327 

3328 meridians = { 

3329 "am": "قبل از ظهر", 

3330 "pm": "بعد از ظهر", 

3331 "AM": "قبل از ظهر", 

3332 "PM": "بعد از ظهر", 

3333 } 

3334 

3335 month_names = [ 

3336 "", 

3337 "January", 

3338 "February", 

3339 "March", 

3340 "April", 

3341 "May", 

3342 "June", 

3343 "July", 

3344 "August", 

3345 "September", 

3346 "October", 

3347 "November", 

3348 "December", 

3349 ] 

3350 month_abbreviations = [ 

3351 "", 

3352 "Jan", 

3353 "Feb", 

3354 "Mar", 

3355 "Apr", 

3356 "May", 

3357 "Jun", 

3358 "Jul", 

3359 "Aug", 

3360 "Sep", 

3361 "Oct", 

3362 "Nov", 

3363 "Dec", 

3364 ] 

3365 

3366 day_names = [ 

3367 "", 

3368 "دو شنبه", 

3369 "سه شنبه", 

3370 "چهارشنبه", 

3371 "پنجشنبه", 

3372 "جمعه", 

3373 "شنبه", 

3374 "یکشنبه", 

3375 ] 

3376 day_abbreviations = ["", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] 

3377 

3378 

3379class HebrewLocale(Locale): 

3380 names = ["he", "he-il"] 

3381 

3382 past = "לפני {0}" 

3383 future = "בעוד {0}" 

3384 and_word = "ו" 

3385 

3386 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { 

3387 "now": "הרגע", 

3388 "second": "שנייה", 

3389 "seconds": "{0} שניות", 

3390 "minute": "דקה", 

3391 "minutes": "{0} דקות", 

3392 "hour": "שעה", 

3393 "hours": {"2": "שעתיים", "ten": "{0} שעות", "higher": "{0} שעות"}, 

3394 "day": "יום", 

3395 "days": {"2": "יומיים", "ten": "{0} ימים", "higher": "{0} יום"}, 

3396 "week": "שבוע", 

3397 "weeks": {"2": "שבועיים", "ten": "{0} שבועות", "higher": "{0} שבועות"}, 

3398 "month": "חודש", 

3399 "months": {"2": "חודשיים", "ten": "{0} חודשים", "higher": "{0} חודשים"}, 

3400 "year": "שנה", 

3401 "years": {"2": "שנתיים", "ten": "{0} שנים", "higher": "{0} שנה"}, 

3402 } 

3403 

3404 meridians = { 

3405 "am": 'לפנ"צ', 

3406 "pm": 'אחר"צ', 

3407 "AM": "לפני הצהריים", 

3408 "PM": "אחרי הצהריים", 

3409 } 

3410 

3411 month_names = [ 

3412 "", 

3413 "ינואר", 

3414 "פברואר", 

3415 "מרץ", 

3416 "אפריל", 

3417 "מאי", 

3418 "יוני", 

3419 "יולי", 

3420 "אוגוסט", 

3421 "ספטמבר", 

3422 "אוקטובר", 

3423 "נובמבר", 

3424 "דצמבר", 

3425 ] 

3426 month_abbreviations = [ 

3427 "", 

3428 "ינו׳", 

3429 "פבר׳", 

3430 "מרץ", 

3431 "אפר׳", 

3432 "מאי", 

3433 "יוני", 

3434 "יולי", 

3435 "אוג׳", 

3436 "ספט׳", 

3437 "אוק׳", 

3438 "נוב׳", 

3439 "דצמ׳", 

3440 ] 

3441 

3442 day_names = ["", "שני", "שלישי", "רביעי", "חמישי", "שישי", "שבת", "ראשון"] 

3443 day_abbreviations = ["", "ב׳", "ג׳", "ד׳", "ה׳", "ו׳", "ש׳", "א׳"] 

3444 

3445 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: 

3446 form = self.timeframes[timeframe] 

3447 delta = abs(delta) 

3448 if isinstance(form, Mapping): 

3449 if delta == 2: 

3450 form = form["2"] 

3451 elif delta == 0 or 2 < delta <= 10: 

3452 form = form["ten"] 

3453 else: 

3454 form = form["higher"] 

3455 

3456 return form.format(delta) 

3457 

3458 def describe_multi( 

3459 self, 

3460 timeframes: Sequence[Tuple[TimeFrameLiteral, Union[int, float]]], 

3461 only_distance: bool = False, 

3462 ) -> str: 

3463 """Describes a delta within multiple timeframes in plain language. 

3464 In Hebrew, the and word behaves a bit differently. 

3465 

3466 :param timeframes: a list of string, quantity pairs each representing a timeframe and delta. 

3467 :param only_distance: return only distance eg: "2 hours and 11 seconds" without "in" or "ago" keywords 

3468 """ 

3469 

3470 humanized = "" 

3471 for index, (timeframe, delta) in enumerate(timeframes): 

3472 last_humanized = self._format_timeframe(timeframe, trunc(delta)) 

3473 if index == 0: 

3474 humanized = last_humanized 

3475 elif index == len(timeframes) - 1: # Must have at least 2 items 

3476 humanized += " " + self.and_word 

3477 if last_humanized[0].isdecimal(): 

3478 humanized += "־" 

3479 humanized += last_humanized 

3480 else: # Don't add for the last one 

3481 humanized += ", " + last_humanized 

3482 

3483 if not only_distance: 

3484 humanized = self._format_relative(humanized, timeframe, trunc(delta)) 

3485 

3486 return humanized 

3487 

3488 

3489class MarathiLocale(Locale): 

3490 names = ["mr"] 

3491 

3492 past = "{0} आधी" 

3493 future = "{0} नंतर" 

3494 

3495 timeframes = { 

3496 "now": "सद्य", 

3497 "second": "एक सेकंद", 

3498 "seconds": "{0} सेकंद", 

3499 "minute": "एक मिनिट ", 

3500 "minutes": "{0} मिनिट ", 

3501 "hour": "एक तास", 

3502 "hours": "{0} तास", 

3503 "day": "एक दिवस", 

3504 "days": "{0} दिवस", 

3505 "month": "एक महिना ", 

3506 "months": "{0} महिने ", 

3507 "year": "एक वर्ष ", 

3508 "years": "{0} वर्ष ", 

3509 } 

3510 

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

3512 

3513 month_names = [ 

3514 "", 

3515 "जानेवारी", 

3516 "फेब्रुवारी", 

3517 "मार्च", 

3518 "एप्रिल", 

3519 "मे", 

3520 "जून", 

3521 "जुलै", 

3522 "अॉगस्ट", 

3523 "सप्टेंबर", 

3524 "अॉक्टोबर", 

3525 "नोव्हेंबर", 

3526 "डिसेंबर", 

3527 ] 

3528 month_abbreviations = [ 

3529 "", 

3530 "जान", 

3531 "फेब्रु", 

3532 "मार्च", 

3533 "एप्रि", 

3534 "मे", 

3535 "जून", 

3536 "जुलै", 

3537 "अॉग", 

3538 "सप्टें", 

3539 "अॉक्टो", 

3540 "नोव्हें", 

3541 "डिसें", 

3542 ] 

3543 

3544 day_names = [ 

3545 "", 

3546 "सोमवार", 

3547 "मंगळवार", 

3548 "बुधवार", 

3549 "गुरुवार", 

3550 "शुक्रवार", 

3551 "शनिवार", 

3552 "रविवार", 

3553 ] 

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

3555 

3556 

3557class CatalanLocale(Locale): 

3558 names = ["ca", "ca-es", "ca-ad", "ca-fr", "ca-it"] 

3559 past = "Fa {0}" 

3560 future = "En {0}" 

3561 and_word = "i" 

3562 

3563 timeframes = { 

3564 "now": "Ara mateix", 

3565 "second": "un segon", 

3566 "seconds": "{0} segons", 

3567 "minute": "un minut", 

3568 "minutes": "{0} minuts", 

3569 "hour": "una hora", 

3570 "hours": "{0} hores", 

3571 "day": "un dia", 

3572 "days": "{0} dies", 

3573 "month": "un mes", 

3574 "months": "{0} mesos", 

3575 "year": "un any", 

3576 "years": "{0} anys", 

3577 } 

3578 

3579 month_names = [ 

3580 "", 

3581 "gener", 

3582 "febrer", 

3583 "març", 

3584 "abril", 

3585 "maig", 

3586 "juny", 

3587 "juliol", 

3588 "agost", 

3589 "setembre", 

3590 "octubre", 

3591 "novembre", 

3592 "desembre", 

3593 ] 

3594 month_abbreviations = [ 

3595 "", 

3596 "gen.", 

3597 "febr.", 

3598 "març", 

3599 "abr.", 

3600 "maig", 

3601 "juny", 

3602 "jul.", 

3603 "ag.", 

3604 "set.", 

3605 "oct.", 

3606 "nov.", 

3607 "des.", 

3608 ] 

3609 day_names = [ 

3610 "", 

3611 "dilluns", 

3612 "dimarts", 

3613 "dimecres", 

3614 "dijous", 

3615 "divendres", 

3616 "dissabte", 

3617 "diumenge", 

3618 ] 

3619 day_abbreviations = [ 

3620 "", 

3621 "dl.", 

3622 "dt.", 

3623 "dc.", 

3624 "dj.", 

3625 "dv.", 

3626 "ds.", 

3627 "dg.", 

3628 ] 

3629 

3630 

3631class BasqueLocale(Locale): 

3632 names = ["eu", "eu-eu"] 

3633 past = "duela {0}" 

3634 future = "{0}" # I don't know what's the right phrase in Basque for the future. 

3635 

3636 timeframes = { 

3637 "now": "Orain", 

3638 "second": "segundo bat", 

3639 "seconds": "{0} segundu", 

3640 "minute": "minutu bat", 

3641 "minutes": "{0} minutu", 

3642 "hour": "ordu bat", 

3643 "hours": "{0} ordu", 

3644 "day": "egun bat", 

3645 "days": "{0} egun", 

3646 "month": "hilabete bat", 

3647 "months": "{0} hilabet", 

3648 "year": "urte bat", 

3649 "years": "{0} urte", 

3650 } 

3651 

3652 month_names = [ 

3653 "", 

3654 "urtarrilak", 

3655 "otsailak", 

3656 "martxoak", 

3657 "apirilak", 

3658 "maiatzak", 

3659 "ekainak", 

3660 "uztailak", 

3661 "abuztuak", 

3662 "irailak", 

3663 "urriak", 

3664 "azaroak", 

3665 "abenduak", 

3666 ] 

3667 month_abbreviations = [ 

3668 "", 

3669 "urt", 

3670 "ots", 

3671 "mar", 

3672 "api", 

3673 "mai", 

3674 "eka", 

3675 "uzt", 

3676 "abu", 

3677 "ira", 

3678 "urr", 

3679 "aza", 

3680 "abe", 

3681 ] 

3682 day_names = [ 

3683 "", 

3684 "astelehena", 

3685 "asteartea", 

3686 "asteazkena", 

3687 "osteguna", 

3688 "ostirala", 

3689 "larunbata", 

3690 "igandea", 

3691 ] 

3692 day_abbreviations = ["", "al", "ar", "az", "og", "ol", "lr", "ig"] 

3693 

3694 

3695class HungarianLocale(Locale): 

3696 names = ["hu", "hu-hu"] 

3697 

3698 past = "{0} ezelőtt" 

3699 future = "{0} múlva" 

3700 

3701 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { 

3702 "now": "éppen most", 

3703 "second": {"past": "egy második", "future": "egy második"}, 

3704 "seconds": {"past": "{0} másodpercekkel", "future": "{0} pár másodperc"}, 

3705 "minute": {"past": "egy perccel", "future": "egy perc"}, 

3706 "minutes": {"past": "{0} perccel", "future": "{0} perc"}, 

3707 "hour": {"past": "egy órával", "future": "egy óra"}, 

3708 "hours": {"past": "{0} órával", "future": "{0} óra"}, 

3709 "day": {"past": "egy nappal", "future": "egy nap"}, 

3710 "days": {"past": "{0} nappal", "future": "{0} nap"}, 

3711 "week": {"past": "egy héttel", "future": "egy hét"}, 

3712 "weeks": {"past": "{0} héttel", "future": "{0} hét"}, 

3713 "month": {"past": "egy hónappal", "future": "egy hónap"}, 

3714 "months": {"past": "{0} hónappal", "future": "{0} hónap"}, 

3715 "year": {"past": "egy évvel", "future": "egy év"}, 

3716 "years": {"past": "{0} évvel", "future": "{0} év"}, 

3717 } 

3718 

3719 month_names = [ 

3720 "", 

3721 "január", 

3722 "február", 

3723 "március", 

3724 "április", 

3725 "május", 

3726 "június", 

3727 "július", 

3728 "augusztus", 

3729 "szeptember", 

3730 "október", 

3731 "november", 

3732 "december", 

3733 ] 

3734 month_abbreviations = [ 

3735 "", 

3736 "jan", 

3737 "febr", 

3738 "márc", 

3739 "ápr", 

3740 "máj", 

3741 "jún", 

3742 "júl", 

3743 "aug", 

3744 "szept", 

3745 "okt", 

3746 "nov", 

3747 "dec", 

3748 ] 

3749 

3750 day_names = [ 

3751 "", 

3752 "hétfő", 

3753 "kedd", 

3754 "szerda", 

3755 "csütörtök", 

3756 "péntek", 

3757 "szombat", 

3758 "vasárnap", 

3759 ] 

3760 day_abbreviations = ["", "hét", "kedd", "szer", "csüt", "pént", "szom", "vas"] 

3761 

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

3763 

3764 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: 

3765 form = self.timeframes[timeframe] 

3766 

3767 if isinstance(form, Mapping): 

3768 if delta > 0: 

3769 form = form["future"] 

3770 else: 

3771 form = form["past"] 

3772 

3773 return form.format(abs(delta)) 

3774 

3775 

3776class EsperantoLocale(Locale): 

3777 names = ["eo", "eo-xx"] 

3778 past = "antaŭ {0}" 

3779 future = "post {0}" 

3780 

3781 timeframes = { 

3782 "now": "nun", 

3783 "second": "sekundo", 

3784 "seconds": "{0} kelkaj sekundoj", 

3785 "minute": "unu minuto", 

3786 "minutes": "{0} minutoj", 

3787 "hour": "un horo", 

3788 "hours": "{0} horoj", 

3789 "day": "unu tago", 

3790 "days": "{0} tagoj", 

3791 "month": "unu monato", 

3792 "months": "{0} monatoj", 

3793 "year": "unu jaro", 

3794 "years": "{0} jaroj", 

3795 } 

3796 

3797 month_names = [ 

3798 "", 

3799 "januaro", 

3800 "februaro", 

3801 "marto", 

3802 "aprilo", 

3803 "majo", 

3804 "junio", 

3805 "julio", 

3806 "aŭgusto", 

3807 "septembro", 

3808 "oktobro", 

3809 "novembro", 

3810 "decembro", 

3811 ] 

3812 month_abbreviations = [ 

3813 "", 

3814 "jan", 

3815 "feb", 

3816 "mar", 

3817 "apr", 

3818 "maj", 

3819 "jun", 

3820 "jul", 

3821 "aŭg", 

3822 "sep", 

3823 "okt", 

3824 "nov", 

3825 "dec", 

3826 ] 

3827 

3828 day_names = [ 

3829 "", 

3830 "lundo", 

3831 "mardo", 

3832 "merkredo", 

3833 "ĵaŭdo", 

3834 "vendredo", 

3835 "sabato", 

3836 "dimanĉo", 

3837 ] 

3838 day_abbreviations = ["", "lun", "mar", "mer", "ĵaŭ", "ven", "sab", "dim"] 

3839 

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

3841 

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

3843 

3844 def _ordinal_number(self, n: int) -> str: 

3845 return f"{n}a" 

3846 

3847 

3848class ThaiLocale(Locale): 

3849 names = ["th", "th-th"] 

3850 

3851 past = "{0} ที่ผ่านมา" 

3852 future = "ในอีก {0}" 

3853 

3854 timeframes = { 

3855 "now": "ขณะนี้", 

3856 "second": "วินาที", 

3857 "seconds": "{0} ไม่กี่วินาที", 

3858 "minute": "1 นาที", 

3859 "minutes": "{0} นาที", 

3860 "hour": "1 ชั่วโมง", 

3861 "hours": "{0} ชั่วโมง", 

3862 "day": "1 วัน", 

3863 "days": "{0} วัน", 

3864 "month": "1 เดือน", 

3865 "months": "{0} เดือน", 

3866 "year": "1 ปี", 

3867 "years": "{0} ปี", 

3868 } 

3869 

3870 month_names = [ 

3871 "", 

3872 "มกราคม", 

3873 "กุมภาพันธ์", 

3874 "มีนาคม", 

3875 "เมษายน", 

3876 "พฤษภาคม", 

3877 "มิถุนายน", 

3878 "กรกฎาคม", 

3879 "สิงหาคม", 

3880 "กันยายน", 

3881 "ตุลาคม", 

3882 "พฤศจิกายน", 

3883 "ธันวาคม", 

3884 ] 

3885 month_abbreviations = [ 

3886 "", 

3887 "ม.ค.", 

3888 "ก.พ.", 

3889 "มี.ค.", 

3890 "เม.ย.", 

3891 "พ.ค.", 

3892 "มิ.ย.", 

3893 "ก.ค.", 

3894 "ส.ค.", 

3895 "ก.ย.", 

3896 "ต.ค.", 

3897 "พ.ย.", 

3898 "ธ.ค.", 

3899 ] 

3900 

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

3902 day_abbreviations = ["", "จ", "อ", "พ", "พฤ", "ศ", "ส", "อา"] 

3903 

3904 meridians = {"am": "am", "pm": "pm", "AM": "AM", "PM": "PM"} 

3905 

3906 BE_OFFSET = 543 

3907 

3908 def year_full(self, year: int) -> str: 

3909 """Thai always use Buddhist Era (BE) which is CE + 543""" 

3910 year += self.BE_OFFSET 

3911 return f"{year:04d}" 

3912 

3913 def year_abbreviation(self, year: int) -> str: 

3914 """Thai always use Buddhist Era (BE) which is CE + 543""" 

3915 year += self.BE_OFFSET 

3916 return f"{year:04d}"[2:] 

3917 

3918 def _format_relative( 

3919 self, 

3920 humanized: str, 

3921 timeframe: TimeFrameLiteral, 

3922 delta: Union[float, int], 

3923 ) -> str: 

3924 """Thai normally doesn't have any space between words""" 

3925 if timeframe == "now": 

3926 return humanized 

3927 

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

3929 relative_string = direction.format(humanized) 

3930 

3931 if timeframe == "seconds": 

3932 relative_string = relative_string.replace(" ", "") 

3933 

3934 return relative_string 

3935 

3936 

3937class LaotianLocale(Locale): 

3938 names = ["lo", "lo-la"] 

3939 

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

3941 future = "ໃນ {0}" 

3942 

3943 timeframes = { 

3944 "now": "ດຽວນີ້", 

3945 "second": "ວິນາທີ", 

3946 "seconds": "{0} ວິນາທີ", 

3947 "minute": "ນາທີ", 

3948 "minutes": "{0} ນາທີ", 

3949 "hour": "ຊົ່ວໂມງ", 

3950 "hours": "{0} ຊົ່ວໂມງ", 

3951 "day": "ມື້", 

3952 "days": "{0} ມື້", 

3953 "week": "ອາທິດ", 

3954 "weeks": "{0} ອາທິດ", 

3955 "month": "ເດືອນ", 

3956 "months": "{0} ເດືອນ", 

3957 "year": "ປີ", 

3958 "years": "{0} ປີ", 

3959 } 

3960 

3961 month_names = [ 

3962 "", 

3963 "ມັງກອນ", # mangkon 

3964 "ກຸມພາ", # kumpha 

3965 "ມີນາ", # mina 

3966 "ເມສາ", # mesa 

3967 "ພຶດສະພາ", # phudsapha 

3968 "ມິຖຸນາ", # mithuna 

3969 "ກໍລະກົດ", # kolakod 

3970 "ສິງຫາ", # singha 

3971 "ກັນຍາ", # knaia 

3972 "ຕຸລາ", # tula 

3973 "ພະຈິກ", # phachik 

3974 "ທັນວາ", # thanuaa 

3975 ] 

3976 month_abbreviations = [ 

3977 "", 

3978 "ມັງກອນ", 

3979 "ກຸມພາ", 

3980 "ມີນາ", 

3981 "ເມສາ", 

3982 "ພຶດສະພາ", 

3983 "ມິຖຸນາ", 

3984 "ກໍລະກົດ", 

3985 "ສິງຫາ", 

3986 "ກັນຍາ", 

3987 "ຕຸລາ", 

3988 "ພະຈິກ", 

3989 "ທັນວາ", 

3990 ] 

3991 

3992 day_names = [ 

3993 "", 

3994 "ວັນຈັນ", # vanchan 

3995 "ວັນອັງຄານ", # vnoangkhan 

3996 "ວັນພຸດ", # vanphud 

3997 "ວັນພະຫັດ", # vanphahad 

3998 "ວັນ​ສຸກ", # vansuk 

3999 "ວັນເສົາ", # vansao 

4000 "ວັນອາທິດ", # vnoathid 

4001 ] 

4002 day_abbreviations = [ 

4003 "", 

4004 "ວັນຈັນ", 

4005 "ວັນອັງຄານ", 

4006 "ວັນພຸດ", 

4007 "ວັນພະຫັດ", 

4008 "ວັນ​ສຸກ", 

4009 "ວັນເສົາ", 

4010 "ວັນອາທິດ", 

4011 ] 

4012 

4013 BE_OFFSET = 543 

4014 

4015 def year_full(self, year: int) -> str: 

4016 """Lao always use Buddhist Era (BE) which is CE + 543""" 

4017 year += self.BE_OFFSET 

4018 return f"{year:04d}" 

4019 

4020 def year_abbreviation(self, year: int) -> str: 

4021 """Lao always use Buddhist Era (BE) which is CE + 543""" 

4022 year += self.BE_OFFSET 

4023 return f"{year:04d}"[2:] 

4024 

4025 def _format_relative( 

4026 self, 

4027 humanized: str, 

4028 timeframe: TimeFrameLiteral, 

4029 delta: Union[float, int], 

4030 ) -> str: 

4031 """Lao normally doesn't have any space between words""" 

4032 if timeframe == "now": 

4033 return humanized 

4034 

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

4036 relative_string = direction.format(humanized) 

4037 

4038 if timeframe == "seconds": 

4039 relative_string = relative_string.replace(" ", "") 

4040 

4041 return relative_string 

4042 

4043 

4044class BengaliLocale(Locale): 

4045 names = ["bn", "bn-bd", "bn-in"] 

4046 

4047 past = "{0} আগে" 

4048 future = "{0} পরে" 

4049 

4050 timeframes = { 

4051 "now": "এখন", 

4052 "second": "একটি দ্বিতীয়", 

4053 "seconds": "{0} সেকেন্ড", 

4054 "minute": "এক মিনিট", 

4055 "minutes": "{0} মিনিট", 

4056 "hour": "এক ঘণ্টা", 

4057 "hours": "{0} ঘণ্টা", 

4058 "day": "এক দিন", 

4059 "days": "{0} দিন", 

4060 "month": "এক মাস", 

4061 "months": "{0} মাস ", 

4062 "year": "এক বছর", 

4063 "years": "{0} বছর", 

4064 } 

4065 

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

4067 

4068 month_names = [ 

4069 "", 

4070 "জানুয়ারি", 

4071 "ফেব্রুয়ারি", 

4072 "মার্চ", 

4073 "এপ্রিল", 

4074 "মে", 

4075 "জুন", 

4076 "জুলাই", 

4077 "আগস্ট", 

4078 "সেপ্টেম্বর", 

4079 "অক্টোবর", 

4080 "নভেম্বর", 

4081 "ডিসেম্বর", 

4082 ] 

4083 month_abbreviations = [ 

4084 "", 

4085 "জানু", 

4086 "ফেব", 

4087 "মার্চ", 

4088 "এপ্রি", 

4089 "মে", 

4090 "জুন", 

4091 "জুল", 

4092 "অগা", 

4093 "সেপ্ট", 

4094 "অক্টো", 

4095 "নভে", 

4096 "ডিসে", 

4097 ] 

4098 

4099 day_names = [ 

4100 "", 

4101 "সোমবার", 

4102 "মঙ্গলবার", 

4103 "বুধবার", 

4104 "বৃহস্পতিবার", 

4105 "শুক্রবার", 

4106 "শনিবার", 

4107 "রবিবার", 

4108 ] 

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

4110 

4111 def _ordinal_number(self, n: int) -> str: 

4112 if n > 10 or n == 0: 

4113 return f"{n}তম" 

4114 if n in [1, 5, 7, 8, 9, 10]: 

4115 return f"{n}ম" 

4116 if n in [2, 3]: 

4117 return f"{n}য়" 

4118 if n == 4: 

4119 return f"{n}র্থ" 

4120 if n == 6: 

4121 return f"{n}ষ্ঠ" 

4122 return "" 

4123 

4124 

4125class RomanshLocale(Locale): 

4126 names = ["rm", "rm-ch"] 

4127 

4128 past = "avant {0}" 

4129 future = "en {0}" 

4130 

4131 timeframes = { 

4132 "now": "en quest mument", 

4133 "second": "in secunda", 

4134 "seconds": "{0} secundas", 

4135 "minute": "ina minuta", 

4136 "minutes": "{0} minutas", 

4137 "hour": "in'ura", 

4138 "hours": "{0} ura", 

4139 "day": "in di", 

4140 "days": "{0} dis", 

4141 "week": "in'emna", 

4142 "weeks": "{0} emnas", 

4143 "month": "in mais", 

4144 "months": "{0} mais", 

4145 "year": "in onn", 

4146 "years": "{0} onns", 

4147 } 

4148 

4149 month_names = [ 

4150 "", 

4151 "schaner", 

4152 "favrer", 

4153 "mars", 

4154 "avrigl", 

4155 "matg", 

4156 "zercladur", 

4157 "fanadur", 

4158 "avust", 

4159 "settember", 

4160 "october", 

4161 "november", 

4162 "december", 

4163 ] 

4164 

4165 month_abbreviations = [ 

4166 "", 

4167 "schan", 

4168 "fav", 

4169 "mars", 

4170 "avr", 

4171 "matg", 

4172 "zer", 

4173 "fan", 

4174 "avu", 

4175 "set", 

4176 "oct", 

4177 "nov", 

4178 "dec", 

4179 ] 

4180 

4181 day_names = [ 

4182 "", 

4183 "glindesdi", 

4184 "mardi", 

4185 "mesemna", 

4186 "gievgia", 

4187 "venderdi", 

4188 "sonda", 

4189 "dumengia", 

4190 ] 

4191 

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

4193 

4194 

4195class RomanianLocale(Locale): 

4196 names = ["ro", "ro-ro"] 

4197 

4198 past = "{0} în urmă" 

4199 future = "peste {0}" 

4200 and_word = "și" 

4201 

4202 timeframes = { 

4203 "now": "acum", 

4204 "second": "o secunda", 

4205 "seconds": "{0} câteva secunde", 

4206 "minute": "un minut", 

4207 "minutes": "{0} minute", 

4208 "hour": "o oră", 

4209 "hours": "{0} ore", 

4210 "day": "o zi", 

4211 "days": "{0} zile", 

4212 "month": "o lună", 

4213 "months": "{0} luni", 

4214 "year": "un an", 

4215 "years": "{0} ani", 

4216 } 

4217 

4218 month_names = [ 

4219 "", 

4220 "ianuarie", 

4221 "februarie", 

4222 "martie", 

4223 "aprilie", 

4224 "mai", 

4225 "iunie", 

4226 "iulie", 

4227 "august", 

4228 "septembrie", 

4229 "octombrie", 

4230 "noiembrie", 

4231 "decembrie", 

4232 ] 

4233 month_abbreviations = [ 

4234 "", 

4235 "ian", 

4236 "febr", 

4237 "mart", 

4238 "apr", 

4239 "mai", 

4240 "iun", 

4241 "iul", 

4242 "aug", 

4243 "sept", 

4244 "oct", 

4245 "nov", 

4246 "dec", 

4247 ] 

4248 

4249 day_names = [ 

4250 "", 

4251 "luni", 

4252 "marți", 

4253 "miercuri", 

4254 "joi", 

4255 "vineri", 

4256 "sâmbătă", 

4257 "duminică", 

4258 ] 

4259 day_abbreviations = ["", "Lun", "Mar", "Mie", "Joi", "Vin", "Sâm", "Dum"] 

4260 

4261 

4262class SlovenianLocale(Locale): 

4263 names = ["sl", "sl-si"] 

4264 

4265 past = "pred {0}" 

4266 future = "čez {0}" 

4267 and_word = "in" 

4268 

4269 timeframes = { 

4270 "now": "zdaj", 

4271 "second": "sekundo", 

4272 "seconds": "{0} sekund", 

4273 "minute": "minuta", 

4274 "minutes": "{0} minutami", 

4275 "hour": "uro", 

4276 "hours": "{0} ur", 

4277 "day": "dan", 

4278 "days": "{0} dni", 

4279 "month": "mesec", 

4280 "months": "{0} mesecev", 

4281 "year": "leto", 

4282 "years": "{0} let", 

4283 } 

4284 

4285 meridians = {"am": "", "pm": "", "AM": "", "PM": ""} 

4286 

4287 month_names = [ 

4288 "", 

4289 "Januar", 

4290 "Februar", 

4291 "Marec", 

4292 "April", 

4293 "Maj", 

4294 "Junij", 

4295 "Julij", 

4296 "Avgust", 

4297 "September", 

4298 "Oktober", 

4299 "November", 

4300 "December", 

4301 ] 

4302 

4303 month_abbreviations = [ 

4304 "", 

4305 "Jan", 

4306 "Feb", 

4307 "Mar", 

4308 "Apr", 

4309 "Maj", 

4310 "Jun", 

4311 "Jul", 

4312 "Avg", 

4313 "Sep", 

4314 "Okt", 

4315 "Nov", 

4316 "Dec", 

4317 ] 

4318 

4319 day_names = [ 

4320 "", 

4321 "Ponedeljek", 

4322 "Torek", 

4323 "Sreda", 

4324 "Četrtek", 

4325 "Petek", 

4326 "Sobota", 

4327 "Nedelja", 

4328 ] 

4329 

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

4331 

4332 

4333class IndonesianLocale(Locale): 

4334 names = ["id", "id-id"] 

4335 

4336 past = "{0} yang lalu" 

4337 future = "dalam {0}" 

4338 and_word = "dan" 

4339 

4340 timeframes = { 

4341 "now": "baru saja", 

4342 "second": "1 sebentar", 

4343 "seconds": "{0} detik", 

4344 "minute": "1 menit", 

4345 "minutes": "{0} menit", 

4346 "hour": "1 jam", 

4347 "hours": "{0} jam", 

4348 "day": "1 hari", 

4349 "days": "{0} hari", 

4350 "week": "1 minggu", 

4351 "weeks": "{0} minggu", 

4352 "month": "1 bulan", 

4353 "months": "{0} bulan", 

4354 "quarter": "1 kuartal", 

4355 "quarters": "{0} kuartal", 

4356 "year": "1 tahun", 

4357 "years": "{0} tahun", 

4358 } 

4359 

4360 meridians = {"am": "", "pm": "", "AM": "", "PM": ""} 

4361 

4362 month_names = [ 

4363 "", 

4364 "Januari", 

4365 "Februari", 

4366 "Maret", 

4367 "April", 

4368 "Mei", 

4369 "Juni", 

4370 "Juli", 

4371 "Agustus", 

4372 "September", 

4373 "Oktober", 

4374 "November", 

4375 "Desember", 

4376 ] 

4377 

4378 month_abbreviations = [ 

4379 "", 

4380 "Jan", 

4381 "Feb", 

4382 "Mar", 

4383 "Apr", 

4384 "Mei", 

4385 "Jun", 

4386 "Jul", 

4387 "Ags", 

4388 "Sept", 

4389 "Okt", 

4390 "Nov", 

4391 "Des", 

4392 ] 

4393 

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

4395 

4396 day_abbreviations = [ 

4397 "", 

4398 "Senin", 

4399 "Selasa", 

4400 "Rabu", 

4401 "Kamis", 

4402 "Jumat", 

4403 "Sabtu", 

4404 "Minggu", 

4405 ] 

4406 

4407 

4408class NepaliLocale(Locale): 

4409 names = ["ne", "ne-np"] 

4410 

4411 past = "{0} पहिले" 

4412 future = "{0} पछी" 

4413 

4414 timeframes = { 

4415 "now": "अहिले", 

4416 "second": "एक सेकेन्ड", 

4417 "seconds": "{0} सेकण्ड", 

4418 "minute": "मिनेट", 

4419 "minutes": "{0} मिनेट", 

4420 "hour": "एक घण्टा", 

4421 "hours": "{0} घण्टा", 

4422 "day": "एक दिन", 

4423 "days": "{0} दिन", 

4424 "month": "एक महिना", 

4425 "months": "{0} महिना", 

4426 "year": "एक बर्ष", 

4427 "years": "{0} बर्ष", 

4428 } 

4429 

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

4431 

4432 month_names = [ 

4433 "", 

4434 "जनवरी", 

4435 "फेब्रुअरी", 

4436 "मार्च", 

4437 "एप्रील", 

4438 "मे", 

4439 "जुन", 

4440 "जुलाई", 

4441 "अगष्ट", 

4442 "सेप्टेम्बर", 

4443 "अक्टोबर", 

4444 "नोवेम्बर", 

4445 "डिसेम्बर", 

4446 ] 

4447 month_abbreviations = [ 

4448 "", 

4449 "जन", 

4450 "फेब", 

4451 "मार्च", 

4452 "एप्रील", 

4453 "मे", 

4454 "जुन", 

4455 "जुलाई", 

4456 "अग", 

4457 "सेप", 

4458 "अक्ट", 

4459 "नोव", 

4460 "डिस", 

4461 ] 

4462 

4463 day_names = [ 

4464 "", 

4465 "सोमवार", 

4466 "मंगलवार", 

4467 "बुधवार", 

4468 "बिहिवार", 

4469 "शुक्रवार", 

4470 "शनिवार", 

4471 "आइतवार", 

4472 ] 

4473 

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

4475 

4476 

4477class EstonianLocale(Locale): 

4478 names = ["ee", "et"] 

4479 

4480 past = "{0} tagasi" 

4481 future = "{0} pärast" 

4482 and_word = "ja" 

4483 

4484 timeframes: ClassVar[Mapping[TimeFrameLiteral, Mapping[str, str]]] = { 

4485 "now": {"past": "just nüüd", "future": "just nüüd"}, 

4486 "second": {"past": "üks sekund", "future": "ühe sekundi"}, 

4487 "seconds": {"past": "{0} sekundit", "future": "{0} sekundi"}, 

4488 "minute": {"past": "üks minut", "future": "ühe minuti"}, 

4489 "minutes": {"past": "{0} minutit", "future": "{0} minuti"}, 

4490 "hour": {"past": "tund aega", "future": "tunni aja"}, 

4491 "hours": {"past": "{0} tundi", "future": "{0} tunni"}, 

4492 "day": {"past": "üks päev", "future": "ühe päeva"}, 

4493 "days": {"past": "{0} päeva", "future": "{0} päeva"}, 

4494 "month": {"past": "üks kuu", "future": "ühe kuu"}, 

4495 "months": {"past": "{0} kuud", "future": "{0} kuu"}, 

4496 "year": {"past": "üks aasta", "future": "ühe aasta"}, 

4497 "years": {"past": "{0} aastat", "future": "{0} aasta"}, 

4498 } 

4499 

4500 month_names = [ 

4501 "", 

4502 "Jaanuar", 

4503 "Veebruar", 

4504 "Märts", 

4505 "Aprill", 

4506 "Mai", 

4507 "Juuni", 

4508 "Juuli", 

4509 "August", 

4510 "September", 

4511 "Oktoober", 

4512 "November", 

4513 "Detsember", 

4514 ] 

4515 month_abbreviations = [ 

4516 "", 

4517 "Jan", 

4518 "Veb", 

4519 "Mär", 

4520 "Apr", 

4521 "Mai", 

4522 "Jun", 

4523 "Jul", 

4524 "Aug", 

4525 "Sep", 

4526 "Okt", 

4527 "Nov", 

4528 "Dets", 

4529 ] 

4530 

4531 day_names = [ 

4532 "", 

4533 "Esmaspäev", 

4534 "Teisipäev", 

4535 "Kolmapäev", 

4536 "Neljapäev", 

4537 "Reede", 

4538 "Laupäev", 

4539 "Pühapäev", 

4540 ] 

4541 day_abbreviations = ["", "Esm", "Teis", "Kolm", "Nelj", "Re", "Lau", "Püh"] 

4542 

4543 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: 

4544 form = self.timeframes[timeframe] 

4545 if delta > 0: 

4546 _form = form["future"] 

4547 else: 

4548 _form = form["past"] 

4549 return _form.format(abs(delta)) 

4550 

4551 

4552class LatvianLocale(Locale): 

4553 names = ["lv", "lv-lv"] 

4554 

4555 past = "pirms {0}" 

4556 future = "pēc {0}" 

4557 and_word = "un" 

4558 

4559 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { 

4560 "now": "tagad", 

4561 "second": "sekundes", 

4562 "seconds": "{0} sekundēm", 

4563 "minute": "minūtes", 

4564 "minutes": "{0} minūtēm", 

4565 "hour": "stundas", 

4566 "hours": "{0} stundām", 

4567 "day": "dienas", 

4568 "days": "{0} dienām", 

4569 "week": "nedēļas", 

4570 "weeks": "{0} nedēļām", 

4571 "month": "mēneša", 

4572 "months": "{0} mēnešiem", 

4573 "year": "gada", 

4574 "years": "{0} gadiem", 

4575 } 

4576 

4577 month_names = [ 

4578 "", 

4579 "janvāris", 

4580 "februāris", 

4581 "marts", 

4582 "aprīlis", 

4583 "maijs", 

4584 "jūnijs", 

4585 "jūlijs", 

4586 "augusts", 

4587 "septembris", 

4588 "oktobris", 

4589 "novembris", 

4590 "decembris", 

4591 ] 

4592 

4593 month_abbreviations = [ 

4594 "", 

4595 "jan", 

4596 "feb", 

4597 "marts", 

4598 "apr", 

4599 "maijs", 

4600 "jūnijs", 

4601 "jūlijs", 

4602 "aug", 

4603 "sept", 

4604 "okt", 

4605 "nov", 

4606 "dec", 

4607 ] 

4608 

4609 day_names = [ 

4610 "", 

4611 "pirmdiena", 

4612 "otrdiena", 

4613 "trešdiena", 

4614 "ceturtdiena", 

4615 "piektdiena", 

4616 "sestdiena", 

4617 "svētdiena", 

4618 ] 

4619 

4620 day_abbreviations = [ 

4621 "", 

4622 "pi", 

4623 "ot", 

4624 "tr", 

4625 "ce", 

4626 "pi", 

4627 "se", 

4628 "sv", 

4629 ] 

4630 

4631 

4632class SwahiliLocale(Locale): 

4633 names = [ 

4634 "sw", 

4635 "sw-ke", 

4636 "sw-tz", 

4637 ] 

4638 

4639 past = "{0} iliyopita" 

4640 future = "muda wa {0}" 

4641 and_word = "na" 

4642 

4643 timeframes = { 

4644 "now": "sasa hivi", 

4645 "second": "sekunde", 

4646 "seconds": "sekunde {0}", 

4647 "minute": "dakika moja", 

4648 "minutes": "dakika {0}", 

4649 "hour": "saa moja", 

4650 "hours": "saa {0}", 

4651 "day": "siku moja", 

4652 "days": "siku {0}", 

4653 "week": "wiki moja", 

4654 "weeks": "wiki {0}", 

4655 "month": "mwezi moja", 

4656 "months": "miezi {0}", 

4657 "year": "mwaka moja", 

4658 "years": "miaka {0}", 

4659 } 

4660 

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

4662 

4663 month_names = [ 

4664 "", 

4665 "Januari", 

4666 "Februari", 

4667 "Machi", 

4668 "Aprili", 

4669 "Mei", 

4670 "Juni", 

4671 "Julai", 

4672 "Agosti", 

4673 "Septemba", 

4674 "Oktoba", 

4675 "Novemba", 

4676 "Desemba", 

4677 ] 

4678 month_abbreviations = [ 

4679 "", 

4680 "Jan", 

4681 "Feb", 

4682 "Mac", 

4683 "Apr", 

4684 "Mei", 

4685 "Jun", 

4686 "Jul", 

4687 "Ago", 

4688 "Sep", 

4689 "Okt", 

4690 "Nov", 

4691 "Des", 

4692 ] 

4693 

4694 day_names = [ 

4695 "", 

4696 "Jumatatu", 

4697 "Jumanne", 

4698 "Jumatano", 

4699 "Alhamisi", 

4700 "Ijumaa", 

4701 "Jumamosi", 

4702 "Jumapili", 

4703 ] 

4704 day_abbreviations = [ 

4705 "", 

4706 "Jumatatu", 

4707 "Jumanne", 

4708 "Jumatano", 

4709 "Alhamisi", 

4710 "Ijumaa", 

4711 "Jumamosi", 

4712 "Jumapili", 

4713 ] 

4714 

4715 

4716class CroatianLocale(Locale): 

4717 names = ["hr", "hr-hr"] 

4718 

4719 past = "prije {0}" 

4720 future = "za {0}" 

4721 and_word = "i" 

4722 

4723 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { 

4724 "now": "upravo sad", 

4725 "second": "sekundu", 

4726 "seconds": {"double": "{0} sekunde", "higher": "{0} sekundi"}, 

4727 "minute": "minutu", 

4728 "minutes": {"double": "{0} minute", "higher": "{0} minuta"}, 

4729 "hour": "sat", 

4730 "hours": {"double": "{0} sata", "higher": "{0} sati"}, 

4731 "day": "jedan dan", 

4732 "days": {"double": "{0} dana", "higher": "{0} dana"}, 

4733 "week": "tjedan", 

4734 "weeks": {"double": "{0} tjedna", "higher": "{0} tjedana"}, 

4735 "month": "mjesec", 

4736 "months": {"double": "{0} mjeseca", "higher": "{0} mjeseci"}, 

4737 "year": "godinu", 

4738 "years": {"double": "{0} godine", "higher": "{0} godina"}, 

4739 } 

4740 

4741 month_names = [ 

4742 "", 

4743 "siječanj", 

4744 "veljača", 

4745 "ožujak", 

4746 "travanj", 

4747 "svibanj", 

4748 "lipanj", 

4749 "srpanj", 

4750 "kolovoz", 

4751 "rujan", 

4752 "listopad", 

4753 "studeni", 

4754 "prosinac", 

4755 ] 

4756 

4757 month_abbreviations = [ 

4758 "", 

4759 "siječ", 

4760 "velj", 

4761 "ožuj", 

4762 "trav", 

4763 "svib", 

4764 "lip", 

4765 "srp", 

4766 "kol", 

4767 "ruj", 

4768 "list", 

4769 "stud", 

4770 "pros", 

4771 ] 

4772 

4773 day_names = [ 

4774 "", 

4775 "ponedjeljak", 

4776 "utorak", 

4777 "srijeda", 

4778 "četvrtak", 

4779 "petak", 

4780 "subota", 

4781 "nedjelja", 

4782 ] 

4783 

4784 day_abbreviations = [ 

4785 "", 

4786 "po", 

4787 "ut", 

4788 "sr", 

4789 "če", 

4790 "pe", 

4791 "su", 

4792 "ne", 

4793 ] 

4794 

4795 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: 

4796 form = self.timeframes[timeframe] 

4797 delta = abs(delta) 

4798 if isinstance(form, Mapping): 

4799 if 1 < delta <= 4: 

4800 form = form["double"] 

4801 else: 

4802 form = form["higher"] 

4803 

4804 return form.format(delta) 

4805 

4806 

4807class LatinLocale(Locale): 

4808 names = ["la", "la-va"] 

4809 

4810 past = "ante {0}" 

4811 future = "in {0}" 

4812 and_word = "et" 

4813 

4814 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { 

4815 "now": "nunc", 

4816 "second": "secundum", 

4817 "seconds": "{0} secundis", 

4818 "minute": "minutam", 

4819 "minutes": "{0} minutis", 

4820 "hour": "horam", 

4821 "hours": "{0} horas", 

4822 "day": "diem", 

4823 "days": "{0} dies", 

4824 "week": "hebdomadem", 

4825 "weeks": "{0} hebdomades", 

4826 "month": "mensem", 

4827 "months": "{0} mensis", 

4828 "year": "annum", 

4829 "years": "{0} annos", 

4830 } 

4831 

4832 month_names = [ 

4833 "", 

4834 "Ianuarius", 

4835 "Februarius", 

4836 "Martius", 

4837 "Aprilis", 

4838 "Maius", 

4839 "Iunius", 

4840 "Iulius", 

4841 "Augustus", 

4842 "September", 

4843 "October", 

4844 "November", 

4845 "December", 

4846 ] 

4847 

4848 month_abbreviations = [ 

4849 "", 

4850 "Ian", 

4851 "Febr", 

4852 "Mart", 

4853 "Apr", 

4854 "Mai", 

4855 "Iun", 

4856 "Iul", 

4857 "Aug", 

4858 "Sept", 

4859 "Oct", 

4860 "Nov", 

4861 "Dec", 

4862 ] 

4863 

4864 day_names = [ 

4865 "", 

4866 "dies Lunae", 

4867 "dies Martis", 

4868 "dies Mercurii", 

4869 "dies Iovis", 

4870 "dies Veneris", 

4871 "dies Saturni", 

4872 "dies Solis", 

4873 ] 

4874 

4875 day_abbreviations = [ 

4876 "", 

4877 "dies Lunae", 

4878 "dies Martis", 

4879 "dies Mercurii", 

4880 "dies Iovis", 

4881 "dies Veneris", 

4882 "dies Saturni", 

4883 "dies Solis", 

4884 ] 

4885 

4886 

4887class LithuanianLocale(Locale): 

4888 names = ["lt", "lt-lt"] 

4889 

4890 past = "prieš {0}" 

4891 future = "po {0}" 

4892 and_word = "ir" 

4893 

4894 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { 

4895 "now": "dabar", 

4896 "second": "sekundės", 

4897 "seconds": "{0} sekundžių", 

4898 "minute": "minutės", 

4899 "minutes": "{0} minučių", 

4900 "hour": "valandos", 

4901 "hours": "{0} valandų", 

4902 "day": "dieną", 

4903 "days": "{0} dienų", 

4904 "week": "savaitės", 

4905 "weeks": "{0} savaičių", 

4906 "month": "mėnesio", 

4907 "months": "{0} mėnesių", 

4908 "year": "metų", 

4909 "years": "{0} metų", 

4910 } 

4911 

4912 month_names = [ 

4913 "", 

4914 "sausis", 

4915 "vasaris", 

4916 "kovas", 

4917 "balandis", 

4918 "gegužė", 

4919 "birželis", 

4920 "liepa", 

4921 "rugpjūtis", 

4922 "rugsėjis", 

4923 "spalis", 

4924 "lapkritis", 

4925 "gruodis", 

4926 ] 

4927 

4928 month_abbreviations = [ 

4929 "", 

4930 "saus", 

4931 "vas", 

4932 "kovas", 

4933 "bal", 

4934 "geg", 

4935 "birž", 

4936 "liepa", 

4937 "rugp", 

4938 "rugs", 

4939 "spalis", 

4940 "lapkr", 

4941 "gr", 

4942 ] 

4943 

4944 day_names = [ 

4945 "", 

4946 "pirmadienis", 

4947 "antradienis", 

4948 "trečiadienis", 

4949 "ketvirtadienis", 

4950 "penktadienis", 

4951 "šeštadienis", 

4952 "sekmadienis", 

4953 ] 

4954 

4955 day_abbreviations = [ 

4956 "", 

4957 "pi", 

4958 "an", 

4959 "tr", 

4960 "ke", 

4961 "pe", 

4962 "še", 

4963 "se", 

4964 ] 

4965 

4966 

4967class MalayLocale(Locale): 

4968 names = ["ms", "ms-my", "ms-bn"] 

4969 

4970 past = "{0} yang lalu" 

4971 future = "dalam {0}" 

4972 and_word = "dan" 

4973 

4974 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { 

4975 "now": "sekarang", 

4976 "second": "saat", 

4977 "seconds": "{0} saat", 

4978 "minute": "minit", 

4979 "minutes": "{0} minit", 

4980 "hour": "jam", 

4981 "hours": "{0} jam", 

4982 "day": "hari", 

4983 "days": "{0} hari", 

4984 "week": "minggu", 

4985 "weeks": "{0} minggu", 

4986 "month": "bulan", 

4987 "months": "{0} bulan", 

4988 "year": "tahun", 

4989 "years": "{0} tahun", 

4990 } 

4991 

4992 month_names = [ 

4993 "", 

4994 "Januari", 

4995 "Februari", 

4996 "Mac", 

4997 "April", 

4998 "Mei", 

4999 "Jun", 

5000 "Julai", 

5001 "Ogos", 

5002 "September", 

5003 "Oktober", 

5004 "November", 

5005 "Disember", 

5006 ] 

5007 

5008 month_abbreviations = [ 

5009 "", 

5010 "Jan.", 

5011 "Feb.", 

5012 "Mac", 

5013 "Apr.", 

5014 "Mei", 

5015 "Jun", 

5016 "Julai", 

5017 "Og.", 

5018 "Sept.", 

5019 "Okt.", 

5020 "Nov.", 

5021 "Dis.", 

5022 ] 

5023 

5024 day_names = [ 

5025 "", 

5026 "Isnin", 

5027 "Selasa", 

5028 "Rabu", 

5029 "Khamis", 

5030 "Jumaat", 

5031 "Sabtu", 

5032 "Ahad", 

5033 ] 

5034 

5035 day_abbreviations = [ 

5036 "", 

5037 "Isnin", 

5038 "Selasa", 

5039 "Rabu", 

5040 "Khamis", 

5041 "Jumaat", 

5042 "Sabtu", 

5043 "Ahad", 

5044 ] 

5045 

5046 

5047class MalteseLocale(Locale): 

5048 names = ["mt", "mt-mt"] 

5049 

5050 past = "{0} ilu" 

5051 future = "fi {0}" 

5052 and_word = "u" 

5053 

5054 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { 

5055 "now": "issa", 

5056 "second": "sekonda", 

5057 "seconds": "{0} sekondi", 

5058 "minute": "minuta", 

5059 "minutes": "{0} minuti", 

5060 "hour": "siegħa", 

5061 "hours": {"dual": "{0} sagħtejn", "plural": "{0} sigħat"}, 

5062 "day": "jum", 

5063 "days": {"dual": "{0} jumejn", "plural": "{0} ijiem"}, 

5064 "week": "ġimgħa", 

5065 "weeks": {"dual": "{0} ġimagħtejn", "plural": "{0} ġimgħat"}, 

5066 "month": "xahar", 

5067 "months": {"dual": "{0} xahrejn", "plural": "{0} xhur"}, 

5068 "year": "sena", 

5069 "years": {"dual": "{0} sentejn", "plural": "{0} snin"}, 

5070 } 

5071 

5072 month_names = [ 

5073 "", 

5074 "Jannar", 

5075 "Frar", 

5076 "Marzu", 

5077 "April", 

5078 "Mejju", 

5079 "Ġunju", 

5080 "Lulju", 

5081 "Awwissu", 

5082 "Settembru", 

5083 "Ottubru", 

5084 "Novembru", 

5085 "Diċembru", 

5086 ] 

5087 

5088 month_abbreviations = [ 

5089 "", 

5090 "Jan", 

5091 "Fr", 

5092 "Mar", 

5093 "Apr", 

5094 "Mejju", 

5095 "Ġun", 

5096 "Lul", 

5097 "Aw", 

5098 "Sett", 

5099 "Ott", 

5100 "Nov", 

5101 "Diċ", 

5102 ] 

5103 

5104 day_names = [ 

5105 "", 

5106 "It-Tnejn", 

5107 "It-Tlieta", 

5108 "L-Erbgħa", 

5109 "Il-Ħamis", 

5110 "Il-Ġimgħa", 

5111 "Is-Sibt", 

5112 "Il-Ħadd", 

5113 ] 

5114 

5115 day_abbreviations = [ 

5116 "", 

5117 "T", 

5118 "TL", 

5119 "E", 

5120 "Ħ", 

5121 "Ġ", 

5122 "S", 

5123 "Ħ", 

5124 ] 

5125 

5126 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: 

5127 form = self.timeframes[timeframe] 

5128 delta = abs(delta) 

5129 if isinstance(form, Mapping): 

5130 if delta == 2: 

5131 form = form["dual"] 

5132 else: 

5133 form = form["plural"] 

5134 

5135 return form.format(delta) 

5136 

5137 

5138class SamiLocale(Locale): 

5139 names = ["se", "se-fi", "se-no", "se-se"] 

5140 

5141 past = "{0} dassái" 

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

5143 

5144 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { 

5145 "now": "dál", 

5146 "second": "sekunda", 

5147 "seconds": "{0} sekundda", 

5148 "minute": "minuhta", 

5149 "minutes": "{0} minuhta", 

5150 "hour": "diimmu", 

5151 "hours": "{0} diimmu", 

5152 "day": "beaivvi", 

5153 "days": "{0} beaivvi", 

5154 "week": "vahku", 

5155 "weeks": "{0} vahku", 

5156 "month": "mánu", 

5157 "months": "{0} mánu", 

5158 "year": "jagi", 

5159 "years": "{0} jagi", 

5160 } 

5161 

5162 month_names = [ 

5163 "", 

5164 "Ođđajagimánnu", 

5165 "Guovvamánnu", 

5166 "Njukčamánnu", 

5167 "Cuoŋománnu", 

5168 "Miessemánnu", 

5169 "Geassemánnu", 

5170 "Suoidnemánnu", 

5171 "Borgemánnu", 

5172 "Čakčamánnu", 

5173 "Golggotmánnu", 

5174 "Skábmamánnu", 

5175 "Juovlamánnu", 

5176 ] 

5177 

5178 month_abbreviations = [ 

5179 "", 

5180 "Ođđajagimánnu", 

5181 "Guovvamánnu", 

5182 "Njukčamánnu", 

5183 "Cuoŋománnu", 

5184 "Miessemánnu", 

5185 "Geassemánnu", 

5186 "Suoidnemánnu", 

5187 "Borgemánnu", 

5188 "Čakčamánnu", 

5189 "Golggotmánnu", 

5190 "Skábmamánnu", 

5191 "Juovlamánnu", 

5192 ] 

5193 

5194 day_names = [ 

5195 "", 

5196 "Mánnodat", 

5197 "Disdat", 

5198 "Gaskavahkku", 

5199 "Duorastat", 

5200 "Bearjadat", 

5201 "Lávvordat", 

5202 "Sotnabeaivi", 

5203 ] 

5204 

5205 day_abbreviations = [ 

5206 "", 

5207 "Mánnodat", 

5208 "Disdat", 

5209 "Gaskavahkku", 

5210 "Duorastat", 

5211 "Bearjadat", 

5212 "Lávvordat", 

5213 "Sotnabeaivi", 

5214 ] 

5215 

5216 

5217class OdiaLocale(Locale): 

5218 names = ["or", "or-in"] 

5219 

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

5221 future = "{0} ପରେ" 

5222 

5223 timeframes = { 

5224 "now": "ବର୍ତ୍ତମାନ", 

5225 "second": "ଏକ ସେକେଣ୍ଡ", 

5226 "seconds": "{0} ସେକେଣ୍ଡ", 

5227 "minute": "ଏକ ମିନଟ", 

5228 "minutes": "{0} ମିନଟ", 

5229 "hour": "ଏକ ଘଣ୍ଟା", 

5230 "hours": "{0} ଘଣ୍ଟା", 

5231 "day": "ଏକ ଦିନ", 

5232 "days": "{0} ଦିନ", 

5233 "month": "ଏକ ମାସ", 

5234 "months": "{0} ମାସ ", 

5235 "year": "ଏକ ବର୍ଷ", 

5236 "years": "{0} ବର୍ଷ", 

5237 } 

5238 

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

5240 

5241 month_names = [ 

5242 "", 

5243 "ଜାନୁଆରୀ", 

5244 "ଫେବୃଆରୀ", 

5245 "ମାର୍ଚ୍ଚ୍", 

5246 "ଅପ୍ରେଲ", 

5247 "ମଇ", 

5248 "ଜୁନ୍", 

5249 "ଜୁଲାଇ", 

5250 "ଅଗଷ୍ଟ", 

5251 "ସେପ୍ଟେମ୍ବର", 

5252 "ଅକ୍ଟୋବର୍", 

5253 "ନଭେମ୍ବର୍", 

5254 "ଡିସେମ୍ବର୍", 

5255 ] 

5256 month_abbreviations = [ 

5257 "", 

5258 "ଜାନୁ", 

5259 "ଫେବୃ", 

5260 "ମାର୍ଚ୍ଚ୍", 

5261 "ଅପ୍ରେ", 

5262 "ମଇ", 

5263 "ଜୁନ୍", 

5264 "ଜୁଲା", 

5265 "ଅଗ", 

5266 "ସେପ୍ଟେ", 

5267 "ଅକ୍ଟୋ", 

5268 "ନଭେ", 

5269 "ଡିସେ", 

5270 ] 

5271 

5272 day_names = [ 

5273 "", 

5274 "ସୋମବାର", 

5275 "ମଙ୍ଗଳବାର", 

5276 "ବୁଧବାର", 

5277 "ଗୁରୁବାର", 

5278 "ଶୁକ୍ରବାର", 

5279 "ଶନିବାର", 

5280 "ରବିବାର", 

5281 ] 

5282 day_abbreviations = [ 

5283 "", 

5284 "ସୋମ", 

5285 "ମଙ୍ଗଳ", 

5286 "ବୁଧ", 

5287 "ଗୁରୁ", 

5288 "ଶୁକ୍ର", 

5289 "ଶନି", 

5290 "ରବି", 

5291 ] 

5292 

5293 def _ordinal_number(self, n: int) -> str: 

5294 if n > 10 or n == 0: 

5295 return f"{n}ତମ" 

5296 if n in [1, 5, 7, 8, 9, 10]: 

5297 return f"{n}ମ" 

5298 if n in [2, 3]: 

5299 return f"{n}ୟ" 

5300 if n == 4: 

5301 return f"{n}ର୍ଥ" 

5302 if n == 6: 

5303 return f"{n}ଷ୍ଠ" 

5304 return "" 

5305 

5306 

5307class SerbianLocale(Locale): 

5308 names = ["sr", "sr-rs", "sr-sp"] 

5309 

5310 past = "pre {0}" 

5311 future = "za {0}" 

5312 and_word = "i" 

5313 

5314 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { 

5315 "now": "sada", 

5316 "second": "sekundu", 

5317 "seconds": {"double": "{0} sekunde", "higher": "{0} sekundi"}, 

5318 "minute": "minutu", 

5319 "minutes": {"double": "{0} minute", "higher": "{0} minuta"}, 

5320 "hour": "sat", 

5321 "hours": {"double": "{0} sata", "higher": "{0} sati"}, 

5322 "day": "dan", 

5323 "days": {"double": "{0} dana", "higher": "{0} dana"}, 

5324 "week": "nedelju", 

5325 "weeks": {"double": "{0} nedelje", "higher": "{0} nedelja"}, 

5326 "month": "mesec", 

5327 "months": {"double": "{0} meseca", "higher": "{0} meseci"}, 

5328 "year": "godinu", 

5329 "years": {"double": "{0} godine", "higher": "{0} godina"}, 

5330 } 

5331 

5332 month_names = [ 

5333 "", 

5334 "januar", # јануар 

5335 "februar", # фебруар 

5336 "mart", # март 

5337 "april", # април 

5338 "maj", # мај 

5339 "jun", # јун 

5340 "jul", # јул 

5341 "avgust", # август 

5342 "septembar", # септембар 

5343 "oktobar", # октобар 

5344 "novembar", # новембар 

5345 "decembar", # децембар 

5346 ] 

5347 

5348 month_abbreviations = [ 

5349 "", 

5350 "jan", 

5351 "feb", 

5352 "mar", 

5353 "apr", 

5354 "maj", 

5355 "jun", 

5356 "jul", 

5357 "avg", 

5358 "sep", 

5359 "okt", 

5360 "nov", 

5361 "dec", 

5362 ] 

5363 

5364 day_names = [ 

5365 "", 

5366 "ponedeljak", # понедељак 

5367 "utorak", # уторак 

5368 "sreda", # среда 

5369 "četvrtak", # четвртак 

5370 "petak", # петак 

5371 "subota", # субота 

5372 "nedelja", # недеља 

5373 ] 

5374 

5375 day_abbreviations = [ 

5376 "", 

5377 "po", # по 

5378 "ut", # ут 

5379 "sr", # ср 

5380 "če", # че 

5381 "pe", # пе 

5382 "su", # су 

5383 "ne", # не 

5384 ] 

5385 

5386 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: 

5387 form = self.timeframes[timeframe] 

5388 delta = abs(delta) 

5389 if isinstance(form, Mapping): 

5390 if 1 < delta <= 4: 

5391 form = form["double"] 

5392 else: 

5393 form = form["higher"] 

5394 

5395 return form.format(delta) 

5396 

5397 

5398class LuxembourgishLocale(Locale): 

5399 names = ["lb", "lb-lu"] 

5400 

5401 past = "virun {0}" 

5402 future = "an {0}" 

5403 and_word = "an" 

5404 

5405 timeframes: ClassVar[Dict[TimeFrameLiteral, str]] = { 

5406 "now": "just elo", 

5407 "second": "enger Sekonn", 

5408 "seconds": "{0} Sekonnen", 

5409 "minute": "enger Minutt", 

5410 "minutes": "{0} Minutten", 

5411 "hour": "enger Stonn", 

5412 "hours": "{0} Stonnen", 

5413 "day": "engem Dag", 

5414 "days": "{0} Deeg", 

5415 "week": "enger Woch", 

5416 "weeks": "{0} Wochen", 

5417 "month": "engem Mount", 

5418 "months": "{0} Méint", 

5419 "year": "engem Joer", 

5420 "years": "{0} Jahren", 

5421 } 

5422 

5423 timeframes_only_distance = timeframes.copy() 

5424 timeframes_only_distance["second"] = "eng Sekonn" 

5425 timeframes_only_distance["minute"] = "eng Minutt" 

5426 timeframes_only_distance["hour"] = "eng Stonn" 

5427 timeframes_only_distance["day"] = "een Dag" 

5428 timeframes_only_distance["days"] = "{0} Deeg" 

5429 timeframes_only_distance["week"] = "eng Woch" 

5430 timeframes_only_distance["month"] = "ee Mount" 

5431 timeframes_only_distance["months"] = "{0} Méint" 

5432 timeframes_only_distance["year"] = "ee Joer" 

5433 timeframes_only_distance["years"] = "{0} Joer" 

5434 

5435 month_names = [ 

5436 "", 

5437 "Januar", 

5438 "Februar", 

5439 "Mäerz", 

5440 "Abrëll", 

5441 "Mee", 

5442 "Juni", 

5443 "Juli", 

5444 "August", 

5445 "September", 

5446 "Oktouber", 

5447 "November", 

5448 "Dezember", 

5449 ] 

5450 

5451 month_abbreviations = [ 

5452 "", 

5453 "Jan", 

5454 "Feb", 

5455 "Mäe", 

5456 "Abr", 

5457 "Mee", 

5458 "Jun", 

5459 "Jul", 

5460 "Aug", 

5461 "Sep", 

5462 "Okt", 

5463 "Nov", 

5464 "Dez", 

5465 ] 

5466 

5467 day_names = [ 

5468 "", 

5469 "Méindeg", 

5470 "Dënschdeg", 

5471 "Mëttwoch", 

5472 "Donneschdeg", 

5473 "Freideg", 

5474 "Samschdeg", 

5475 "Sonndeg", 

5476 ] 

5477 

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

5479 

5480 def _ordinal_number(self, n: int) -> str: 

5481 return f"{n}." 

5482 

5483 def describe( 

5484 self, 

5485 timeframe: TimeFrameLiteral, 

5486 delta: Union[int, float] = 0, 

5487 only_distance: bool = False, 

5488 ) -> str: 

5489 if not only_distance: 

5490 return super().describe(timeframe, delta, only_distance) 

5491 

5492 # Luxembourgish uses a different case without 'in' or 'ago' 

5493 humanized: str = self.timeframes_only_distance[timeframe].format( 

5494 trunc(abs(delta)) 

5495 ) 

5496 

5497 return humanized 

5498 

5499 

5500class ZuluLocale(Locale): 

5501 names = ["zu", "zu-za"] 

5502 

5503 past = "{0} edlule" 

5504 future = "{0} " 

5505 and_word = "futhi" 

5506 

5507 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[Mapping[str, str], str]]] = { 

5508 "now": "manje", 

5509 "second": {"past": "umzuzwana", "future": "ngomzuzwana"}, 

5510 "seconds": {"past": "{0} imizuzwana", "future": "{0} ngemizuzwana"}, 

5511 "minute": {"past": "umzuzu", "future": "ngomzuzu"}, 

5512 "minutes": {"past": "{0} imizuzu", "future": "{0} ngemizuzu"}, 

5513 "hour": {"past": "ihora", "future": "ngehora"}, 

5514 "hours": {"past": "{0} amahora", "future": "{0} emahoreni"}, 

5515 "day": {"past": "usuku", "future": "ngosuku"}, 

5516 "days": {"past": "{0} izinsuku", "future": "{0} ezinsukwini"}, 

5517 "week": {"past": "isonto", "future": "ngesonto"}, 

5518 "weeks": {"past": "{0} amasonto", "future": "{0} emasontweni"}, 

5519 "month": {"past": "inyanga", "future": "ngenyanga"}, 

5520 "months": {"past": "{0} izinyanga", "future": "{0} ezinyangeni"}, 

5521 "year": {"past": "unyaka", "future": "ngonyak"}, 

5522 "years": {"past": "{0} iminyaka", "future": "{0} eminyakeni"}, 

5523 } 

5524 

5525 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: 

5526 """Zulu aware time frame format function, takes into account 

5527 the differences between past and future forms.""" 

5528 abs_delta = abs(delta) 

5529 form = self.timeframes[timeframe] 

5530 

5531 if isinstance(form, str): 

5532 return form.format(abs_delta) 

5533 

5534 if delta > 0: 

5535 key = "future" 

5536 else: 

5537 key = "past" 

5538 form = form[key] 

5539 

5540 return form.format(abs_delta) 

5541 

5542 month_names = [ 

5543 "", 

5544 "uMasingane", 

5545 "uNhlolanja", 

5546 "uNdasa", 

5547 "UMbasa", 

5548 "UNhlaba", 

5549 "UNhlangulana", 

5550 "uNtulikazi", 

5551 "UNcwaba", 

5552 "uMandulo", 

5553 "uMfumfu", 

5554 "uLwezi", 

5555 "uZibandlela", 

5556 ] 

5557 

5558 month_abbreviations = [ 

5559 "", 

5560 "uMasingane", 

5561 "uNhlolanja", 

5562 "uNdasa", 

5563 "UMbasa", 

5564 "UNhlaba", 

5565 "UNhlangulana", 

5566 "uNtulikazi", 

5567 "UNcwaba", 

5568 "uMandulo", 

5569 "uMfumfu", 

5570 "uLwezi", 

5571 "uZibandlela", 

5572 ] 

5573 

5574 day_names = [ 

5575 "", 

5576 "uMsombuluko", 

5577 "uLwesibili", 

5578 "uLwesithathu", 

5579 "uLwesine", 

5580 "uLwesihlanu", 

5581 "uMgqibelo", 

5582 "iSonto", 

5583 ] 

5584 

5585 day_abbreviations = [ 

5586 "", 

5587 "uMsombuluko", 

5588 "uLwesibili", 

5589 "uLwesithathu", 

5590 "uLwesine", 

5591 "uLwesihlanu", 

5592 "uMgqibelo", 

5593 "iSonto", 

5594 ] 

5595 

5596 

5597class TamilLocale(Locale): 

5598 names = ["ta", "ta-in", "ta-lk"] 

5599 

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

5601 future = "இல் {0}" 

5602 

5603 timeframes = { 

5604 "now": "இப்போது", 

5605 "second": "ஒரு இரண்டாவது", 

5606 "seconds": "{0} விநாடிகள்", 

5607 "minute": "ஒரு நிமிடம்", 

5608 "minutes": "{0} நிமிடங்கள்", 

5609 "hour": "ஒரு மணி", 

5610 "hours": "{0} மணிநேரம்", 

5611 "day": "ஒரு நாள்", 

5612 "days": "{0} நாட்கள்", 

5613 "week": "ஒரு வாரம்", 

5614 "weeks": "{0} வாரங்கள்", 

5615 "month": "ஒரு மாதம்", 

5616 "months": "{0} மாதங்கள்", 

5617 "year": "ஒரு ஆண்டு", 

5618 "years": "{0} ஆண்டுகள்", 

5619 } 

5620 

5621 month_names = [ 

5622 "", 

5623 "சித்திரை", 

5624 "வைகாசி", 

5625 "ஆனி", 

5626 "ஆடி", 

5627 "ஆவணி", 

5628 "புரட்டாசி", 

5629 "ஐப்பசி", 

5630 "கார்த்திகை", 

5631 "மார்கழி", 

5632 "தை", 

5633 "மாசி", 

5634 "பங்குனி", 

5635 ] 

5636 

5637 month_abbreviations = [ 

5638 "", 

5639 "ஜன", 

5640 "பிப்", 

5641 "மார்", 

5642 "ஏப்", 

5643 "மே", 

5644 "ஜூன்", 

5645 "ஜூலை", 

5646 "ஆக", 

5647 "செப்", 

5648 "அக்", 

5649 "நவ", 

5650 "டிச", 

5651 ] 

5652 

5653 day_names = [ 

5654 "", 

5655 "திங்கட்கிழமை", 

5656 "செவ்வாய்க்கிழமை", 

5657 "புதன்கிழமை", 

5658 "வியாழக்கிழமை", 

5659 "வெள்ளிக்கிழமை", 

5660 "சனிக்கிழமை", 

5661 "ஞாயிற்றுக்கிழமை", 

5662 ] 

5663 

5664 day_abbreviations = [ 

5665 "", 

5666 "திங்கட்", 

5667 "செவ்வாய்", 

5668 "புதன்", 

5669 "வியாழன்", 

5670 "வெள்ளி", 

5671 "சனி", 

5672 "ஞாயிறு", 

5673 ] 

5674 

5675 def _ordinal_number(self, n: int) -> str: 

5676 if n == 1: 

5677 return f"{n}வது" 

5678 elif n >= 0: 

5679 return f"{n}ஆம்" 

5680 else: 

5681 return "" 

5682 

5683 

5684class AlbanianLocale(Locale): 

5685 names = ["sq", "sq-al"] 

5686 

5687 past = "{0} më parë" 

5688 future = "në {0}" 

5689 and_word = "dhe" 

5690 

5691 timeframes = { 

5692 "now": "tani", 

5693 "second": "sekondë", 

5694 "seconds": "{0} sekonda", 

5695 "minute": "minutë", 

5696 "minutes": "{0} minuta", 

5697 "hour": "orë", 

5698 "hours": "{0} orë", 

5699 "day": "ditë", 

5700 "days": "{0} ditë", 

5701 "week": "javë", 

5702 "weeks": "{0} javë", 

5703 "month": "muaj", 

5704 "months": "{0} muaj", 

5705 "year": "vit", 

5706 "years": "{0} vjet", 

5707 } 

5708 

5709 month_names = [ 

5710 "", 

5711 "janar", 

5712 "shkurt", 

5713 "mars", 

5714 "prill", 

5715 "maj", 

5716 "qershor", 

5717 "korrik", 

5718 "gusht", 

5719 "shtator", 

5720 "tetor", 

5721 "nëntor", 

5722 "dhjetor", 

5723 ] 

5724 

5725 month_abbreviations = [ 

5726 "", 

5727 "jan", 

5728 "shk", 

5729 "mar", 

5730 "pri", 

5731 "maj", 

5732 "qer", 

5733 "korr", 

5734 "gush", 

5735 "sht", 

5736 "tet", 

5737 "nën", 

5738 "dhj", 

5739 ] 

5740 

5741 day_names = [ 

5742 "", 

5743 "e hënë", 

5744 "e martë", 

5745 "e mërkurë", 

5746 "e enjte", 

5747 "e premte", 

5748 "e shtunë", 

5749 "e diel", 

5750 ] 

5751 

5752 day_abbreviations = [ 

5753 "", 

5754 "hën", 

5755 "mar", 

5756 "mër", 

5757 "enj", 

5758 "pre", 

5759 "sht", 

5760 "die", 

5761 ] 

5762 

5763 

5764class GeorgianLocale(Locale): 

5765 names = ["ka", "ka-ge"] 

5766 

5767 past = "{0} წინ" # ts’in 

5768 future = "{0} შემდეგ" # shemdeg 

5769 and_word = "და" # da 

5770 

5771 timeframes = { 

5772 "now": "ახლა", # akhla 

5773 # When a cardinal qualifies a noun, it stands in the singular 

5774 "second": "წამის", # ts’amis 

5775 "seconds": "{0} წამის", 

5776 "minute": "წუთის", # ts’utis 

5777 "minutes": "{0} წუთის", 

5778 "hour": "საათის", # saatis 

5779 "hours": "{0} საათის", 

5780 "day": "დღის", # dghis 

5781 "days": "{0} დღის", 

5782 "week": "კვირის", # k’viris 

5783 "weeks": "{0} კვირის", 

5784 "month": "თვის", # tvis 

5785 "months": "{0} თვის", 

5786 "year": "წლის", # ts’lis 

5787 "years": "{0} წლის", 

5788 } 

5789 

5790 month_names = [ 

5791 # modern month names 

5792 "", 

5793 "იანვარი", # Ianvari 

5794 "თებერვალი", # Tebervali 

5795 "მარტი", # Mart'i 

5796 "აპრილი", # Ap'rili 

5797 "მაისი", # Maisi 

5798 "ივნისი", # Ivnisi 

5799 "ივლისი", # Ivlisi 

5800 "აგვისტო", # Agvist'o 

5801 "სექტემბერი", # Sekt'emberi 

5802 "ოქტომბერი", # Okt'omberi 

5803 "ნოემბერი", # Noemberi 

5804 "დეკემბერი", # Dek'emberi 

5805 ] 

5806 

5807 month_abbreviations = [ 

5808 # no abbr. found yet 

5809 "", 

5810 "იანვარი", # Ianvari 

5811 "თებერვალი", # Tebervali 

5812 "მარტი", # Mart'i 

5813 "აპრილი", # Ap'rili 

5814 "მაისი", # Maisi 

5815 "ივნისი", # Ivnisi 

5816 "ივლისი", # Ivlisi 

5817 "აგვისტო", # Agvist'o 

5818 "სექტემბერი", # Sekt'emberi 

5819 "ოქტომბერი", # Okt'omberi 

5820 "ნოემბერი", # Noemberi 

5821 "დეკემბერი", # Dek'emberi 

5822 ] 

5823 

5824 day_names = [ 

5825 "", 

5826 "ორშაბათი", # orshabati 

5827 "სამშაბათი", # samshabati 

5828 "ოთხშაბათი", # otkhshabati 

5829 "ხუთშაბათი", # khutshabati 

5830 "პარასკევი", # p’arask’evi 

5831 "შაბათი", # shabati 

5832 # "k’vira" also serves as week; to avoid confusion "k’vira-dge" can be used for Sunday 

5833 "კვირა", # k’vira 

5834 ] 

5835 

5836 day_abbreviations = [ 

5837 "", 

5838 "ორშაბათი", # orshabati 

5839 "სამშაბათი", # samshabati 

5840 "ოთხშაბათი", # otkhshabati 

5841 "ხუთშაბათი", # khutshabati 

5842 "პარასკევი", # p’arask’evi 

5843 "შაბათი", # shabati 

5844 "კვირა", # k’vira 

5845 ] 

5846 

5847 

5848class SinhalaLocale(Locale): 

5849 names = ["si", "si-lk"] 

5850 

5851 past = "{0}ට පෙර" 

5852 future = "{0}" 

5853 and_word = "සහ" 

5854 

5855 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[Mapping[str, str], str]]] = { 

5856 "now": "දැන්", 

5857 "second": { 

5858 "past": "තත්පරයක", 

5859 "future": "තත්පරයකින්", 

5860 }, # ක් is the article 

5861 "seconds": { 

5862 "past": "තත්පර {0} ක", 

5863 "future": "තත්පර {0} කින්", 

5864 }, 

5865 "minute": { 

5866 "past": "විනාඩියක", 

5867 "future": "විනාඩියකින්", 

5868 }, 

5869 "minutes": { 

5870 "past": "විනාඩි {0} ක", 

5871 "future": "මිනිත්තු {0} කින්", 

5872 }, 

5873 "hour": {"past": "පැයක", "future": "පැයකින්"}, 

5874 "hours": { 

5875 "past": "පැය {0} ක", 

5876 "future": "පැය {0} කින්", 

5877 }, 

5878 "day": {"past": "දිනක", "future": "දිනකට"}, 

5879 "days": { 

5880 "past": "දින {0} ක", 

5881 "future": "දින {0} කින්", 

5882 }, 

5883 "week": {"past": "සතියක", "future": "සතියකින්"}, 

5884 "weeks": { 

5885 "past": "සති {0} ක", 

5886 "future": "සති {0} කින්", 

5887 }, 

5888 "month": {"past": "මාසයක", "future": "එය මාසය තුළ"}, 

5889 "months": { 

5890 "past": "මාස {0} ක", 

5891 "future": "මාස {0} කින්", 

5892 }, 

5893 "year": {"past": "වසරක", "future": "වසරක් තුළ"}, 

5894 "years": { 

5895 "past": "අවුරුදු {0} ක", 

5896 "future": "අවුරුදු {0} තුළ", 

5897 }, 

5898 } 

5899 # Sinhala: the general format to describe timeframe is different from past and future, 

5900 # so we do not copy the original timeframes dictionary 

5901 timeframes_only_distance = {} 

5902 timeframes_only_distance["second"] = "තත්පරයක්" 

5903 timeframes_only_distance["seconds"] = "තත්පර {0}" 

5904 timeframes_only_distance["minute"] = "මිනිත්තුවක්" 

5905 timeframes_only_distance["minutes"] = "විනාඩි {0}" 

5906 timeframes_only_distance["hour"] = "පැයක්" 

5907 timeframes_only_distance["hours"] = "පැය {0}" 

5908 timeframes_only_distance["day"] = "දවසක්" 

5909 timeframes_only_distance["days"] = "දවස් {0}" 

5910 timeframes_only_distance["week"] = "සතියක්" 

5911 timeframes_only_distance["weeks"] = "සති {0}" 

5912 timeframes_only_distance["month"] = "මාසයක්" 

5913 timeframes_only_distance["months"] = "මාස {0}" 

5914 timeframes_only_distance["year"] = "අවුරුද්දක්" 

5915 timeframes_only_distance["years"] = "අවුරුදු {0}" 

5916 

5917 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: 

5918 """ 

5919 Sinhala awares time frame format function, takes into account 

5920 the differences between general, past, and future forms (three different suffixes). 

5921 """ 

5922 abs_delta = abs(delta) 

5923 form = self.timeframes[timeframe] 

5924 

5925 if isinstance(form, str): 

5926 return form.format(abs_delta) 

5927 

5928 if delta > 0: 

5929 key = "future" 

5930 else: 

5931 key = "past" 

5932 form = form[key] 

5933 

5934 return form.format(abs_delta) 

5935 

5936 def describe( 

5937 self, 

5938 timeframe: TimeFrameLiteral, 

5939 delta: Union[float, int] = 1, # key is always future when only_distance=False 

5940 only_distance: bool = False, 

5941 ) -> str: 

5942 """Describes a delta within a timeframe in plain language. 

5943 

5944 :param timeframe: a string representing a timeframe. 

5945 :param delta: a quantity representing a delta in a timeframe. 

5946 :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords 

5947 """ 

5948 

5949 if not only_distance: 

5950 return super().describe(timeframe, delta, only_distance) 

5951 # Sinhala uses a different case without 'in' or 'ago' 

5952 humanized = self.timeframes_only_distance[timeframe].format(trunc(abs(delta))) 

5953 

5954 return humanized 

5955 

5956 month_names = [ 

5957 "", 

5958 "ජනවාරි", 

5959 "පෙබරවාරි", 

5960 "මාර්තු", 

5961 "අප්‍රේල්", 

5962 "මැයි", 

5963 "ජූනි", 

5964 "ජූලි", 

5965 "අගෝස්තු", 

5966 "සැප්තැම්බර්", 

5967 "ඔක්තෝබර්", 

5968 "නොවැම්බර්", 

5969 "දෙසැම්බර්", 

5970 ] 

5971 

5972 month_abbreviations = [ 

5973 "", 

5974 "ජන", 

5975 "පෙබ", 

5976 "මාර්", 

5977 "අප්‍රේ", 

5978 "මැයි", 

5979 "ජුනි", 

5980 "ජූලි", 

5981 "අගෝ", 

5982 "සැප්", 

5983 "ඔක්", 

5984 "නොවැ", 

5985 "දෙසැ", 

5986 ] 

5987 

5988 day_names = [ 

5989 "", 

5990 "සදුදා", 

5991 "අඟහරැවදා", 

5992 "බදාදා", 

5993 "බ්‍රහස්‍පතින්‍දා", 

5994 "සිකුරාදා", 

5995 "සෙනසුරාදා", 

5996 "ඉරිදා", 

5997 ] 

5998 

5999 day_abbreviations = [ 

6000 "", 

6001 "සදුද", 

6002 "බදා", 

6003 "බදා", 

6004 "සිකු", 

6005 "සෙන", 

6006 "අ", 

6007 "ඉරිදා", 

6008 ] 

6009 

6010 

6011class UrduLocale(Locale): 

6012 names = ["ur", "ur-pk"] 

6013 

6014 past = "پہلے {0}" 

6015 future = "میں {0}" 

6016 and_word = "اور" 

6017 

6018 timeframes = { 

6019 "now": "ابھی", 

6020 "second": "ایک سیکنڈ", 

6021 "seconds": "{0} سیکنڈ", 

6022 "minute": "ایک منٹ", 

6023 "minutes": "{0} منٹ", 

6024 "hour": "ایک گھنٹے", 

6025 "hours": "{0} گھنٹے", 

6026 "day": "ایک دن", 

6027 "days": "{0} دن", 

6028 "week": "ایک ہفتے", 

6029 "weeks": "{0} ہفتے", 

6030 "month": "ایک مہینہ", 

6031 "months": "{0} ماہ", 

6032 "year": "ایک سال", 

6033 "years": "{0} سال", 

6034 } 

6035 

6036 month_names = [ 

6037 "", 

6038 "جنوری", 

6039 "فروری", 

6040 "مارچ", 

6041 "اپریل", 

6042 "مئی", 

6043 "جون", 

6044 "جولائی", 

6045 "اگست", 

6046 "ستمبر", 

6047 "اکتوبر", 

6048 "نومبر", 

6049 "دسمبر", 

6050 ] 

6051 

6052 month_abbreviations = [ 

6053 "", 

6054 "جنوری", 

6055 "فروری", 

6056 "مارچ", 

6057 "اپریل", 

6058 "مئی", 

6059 "جون", 

6060 "جولائی", 

6061 "اگست", 

6062 "ستمبر", 

6063 "اکتوبر", 

6064 "نومبر", 

6065 "دسمبر", 

6066 ] 

6067 

6068 day_names = [ 

6069 "", 

6070 "سوموار", 

6071 "منگل", 

6072 "بدھ", 

6073 "جمعرات", 

6074 "جمعہ", 

6075 "ہفتہ", 

6076 "اتوار", 

6077 ] 

6078 

6079 day_abbreviations = [ 

6080 "", 

6081 "سوموار", 

6082 "منگل", 

6083 "بدھ", 

6084 "جمعرات", 

6085 "جمعہ", 

6086 "ہفتہ", 

6087 "اتوار", 

6088 ] 

6089 

6090 

6091class KazakhLocale(Locale): 

6092 names = ["kk", "kk-kz"] 

6093 

6094 past = "{0} бұрын" 

6095 future = "{0} кейін" 

6096 timeframes = { 

6097 "now": "қазір", 

6098 "second": "бір секунд", 

6099 "seconds": "{0} секунд", 

6100 "minute": "бір минут", 

6101 "minutes": "{0} минут", 

6102 "hour": "бір сағат", 

6103 "hours": "{0} сағат", 

6104 "day": "бір күн", 

6105 "days": "{0} күн", 

6106 "week": "бір апта", 

6107 "weeks": "{0} апта", 

6108 "month": "бір ай", 

6109 "months": "{0} ай", 

6110 "year": "бір жыл", 

6111 "years": "{0} жыл", 

6112 } 

6113 

6114 month_names = [ 

6115 "", 

6116 "Қаңтар", 

6117 "Ақпан", 

6118 "Наурыз", 

6119 "Сәуір", 

6120 "Мамыр", 

6121 "Маусым", 

6122 "Шілде", 

6123 "Тамыз", 

6124 "Қыркүйек", 

6125 "Қазан", 

6126 "Қараша", 

6127 "Желтоқсан", 

6128 ] 

6129 month_abbreviations = [ 

6130 "", 

6131 "Қан", 

6132 "Ақп", 

6133 "Нау", 

6134 "Сәу", 

6135 "Мам", 

6136 "Мау", 

6137 "Шіл", 

6138 "Там", 

6139 "Қыр", 

6140 "Қаз", 

6141 "Қар", 

6142 "Жел", 

6143 ] 

6144 

6145 day_names = [ 

6146 "", 

6147 "Дүйсембі", 

6148 "Сейсенбі", 

6149 "Сәрсенбі", 

6150 "Бейсенбі", 

6151 "Жұма", 

6152 "Сенбі", 

6153 "Жексенбі", 

6154 ] 

6155 day_abbreviations = ["", "Дс", "Сс", "Ср", "Бс", "Жм", "Сб", "Жс"] 

6156 

6157 

6158class AmharicLocale(Locale): 

6159 names = ["am", "am-et"] 

6160 

6161 past = "{0} በፊት" 

6162 future = "{0} ውስጥ" 

6163 and_word = "እና" 

6164 

6165 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[Mapping[str, str], str]]] = { 

6166 "now": "አሁን", 

6167 "second": { 

6168 "past": "ከአንድ ሰከንድ", 

6169 "future": "በአንድ ሰከንድ", 

6170 }, 

6171 "seconds": { 

6172 "past": "ከ {0} ሰከንድ", 

6173 "future": "በ {0} ሰከንድ", 

6174 }, 

6175 "minute": { 

6176 "past": "ከአንድ ደቂቃ", 

6177 "future": "በአንድ ደቂቃ", 

6178 }, 

6179 "minutes": { 

6180 "past": "ከ {0} ደቂቃዎች", 

6181 "future": "በ {0} ደቂቃዎች", 

6182 }, 

6183 "hour": { 

6184 "past": "ከአንድ ሰዓት", 

6185 "future": "በአንድ ሰዓት", 

6186 }, 

6187 "hours": { 

6188 "past": "ከ {0} ሰዓታት", 

6189 "future": "በ {0} ሰከንድ", 

6190 }, 

6191 "day": { 

6192 "past": "ከአንድ ቀን", 

6193 "future": "በአንድ ቀን", 

6194 }, 

6195 "days": { 

6196 "past": "ከ {0} ቀናት", 

6197 "future": "በ {0} ቀናት", 

6198 }, 

6199 "week": { 

6200 "past": "ከአንድ ሳምንት", 

6201 "future": "በአንድ ሳምንት", 

6202 }, 

6203 "weeks": { 

6204 "past": "ከ {0} ሳምንታት", 

6205 "future": "በ {0} ሳምንታት", 

6206 }, 

6207 "month": { 

6208 "past": "ከአንድ ወር", 

6209 "future": "በአንድ ወር", 

6210 }, 

6211 "months": { 

6212 "past": "ከ {0} ወር", 

6213 "future": "በ {0} ወራት", 

6214 }, 

6215 "year": { 

6216 "past": "ከአንድ አመት", 

6217 "future": "በአንድ አመት", 

6218 }, 

6219 "years": { 

6220 "past": "ከ {0} ዓመታት", 

6221 "future": "በ {0} ዓመታት", 

6222 }, 

6223 } 

6224 # Amharic: the general format to describe timeframe is different from past and future, 

6225 # so we do not copy the original timeframes dictionary 

6226 timeframes_only_distance = { 

6227 "second": "አንድ ሰከንድ", 

6228 "seconds": "{0} ሰከንድ", 

6229 "minute": "አንድ ደቂቃ", 

6230 "minutes": "{0} ደቂቃዎች", 

6231 "hour": "አንድ ሰዓት", 

6232 "hours": "{0} ሰዓት", 

6233 "day": "አንድ ቀን", 

6234 "days": "{0} ቀናት", 

6235 "week": "አንድ ሳምንት", 

6236 "weeks": "{0} ሳምንት", 

6237 "month": "አንድ ወር", 

6238 "months": "{0} ወራት", 

6239 "year": "አንድ አመት", 

6240 "years": "{0} ዓመታት", 

6241 } 

6242 

6243 month_names = [ 

6244 "", 

6245 "ጃንዩወሪ", 

6246 "ፌብሩወሪ", 

6247 "ማርች", 

6248 "ኤፕሪል", 

6249 "ሜይ", 

6250 "ጁን", 

6251 "ጁላይ", 

6252 "ኦገስት", 

6253 "ሴፕቴምበር", 

6254 "ኦክቶበር", 

6255 "ኖቬምበር", 

6256 "ዲሴምበር", 

6257 ] 

6258 

6259 month_abbreviations = [ 

6260 "", 

6261 "ጃንዩ", 

6262 "ፌብሩ", 

6263 "ማርች", 

6264 "ኤፕሪ", 

6265 "ሜይ", 

6266 "ጁን", 

6267 "ጁላይ", 

6268 "ኦገስ", 

6269 "ሴፕቴ", 

6270 "ኦክቶ", 

6271 "ኖቬም", 

6272 "ዲሴም", 

6273 ] 

6274 

6275 day_names = [ 

6276 "", 

6277 "ሰኞ", 

6278 "ማክሰኞ", 

6279 "ረቡዕ", 

6280 "ሐሙስ", 

6281 "ዓርብ", 

6282 "ቅዳሜ", 

6283 "እሑድ", 

6284 ] 

6285 day_abbreviations = ["", "እ", "ሰ", "ማ", "ረ", "ሐ", "ዓ", "ቅ"] 

6286 

6287 def _ordinal_number(self, n: int) -> str: 

6288 return f"{n}ኛ" 

6289 

6290 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: 

6291 """ 

6292 Amharic awares time frame format function, takes into account 

6293 the differences between general, past, and future forms (three different suffixes). 

6294 """ 

6295 abs_delta = abs(delta) 

6296 form = self.timeframes[timeframe] 

6297 

6298 if isinstance(form, str): 

6299 return form.format(abs_delta) 

6300 

6301 if delta > 0: 

6302 key = "future" 

6303 else: 

6304 key = "past" 

6305 form = form[key] 

6306 

6307 return form.format(abs_delta) 

6308 

6309 def describe( 

6310 self, 

6311 timeframe: TimeFrameLiteral, 

6312 delta: Union[float, int] = 1, # key is always future when only_distance=False 

6313 only_distance: bool = False, 

6314 ) -> str: 

6315 """Describes a delta within a timeframe in plain language. 

6316 

6317 :param timeframe: a string representing a timeframe. 

6318 :param delta: a quantity representing a delta in a timeframe. 

6319 :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords 

6320 """ 

6321 

6322 if not only_distance: 

6323 return super().describe(timeframe, delta, only_distance) 

6324 humanized = self.timeframes_only_distance[timeframe].format(trunc(abs(delta))) 

6325 

6326 return humanized 

6327 

6328 

6329class ArmenianLocale(Locale): 

6330 names = ["hy", "hy-am"] 

6331 past = "{0} առաջ" 

6332 future = "{0}ից" 

6333 and_word = "Եվ" # Yev 

6334 

6335 timeframes = { 

6336 "now": "հիմա", 

6337 "second": "վայրկյան", 

6338 "seconds": "{0} վայրկյան", 

6339 "minute": "րոպե", 

6340 "minutes": "{0} րոպե", 

6341 "hour": "ժամ", 

6342 "hours": "{0} ժամ", 

6343 "day": "օր", 

6344 "days": "{0} օր", 

6345 "month": "ամիս", 

6346 "months": "{0} ամիս", 

6347 "year": "տարին", 

6348 "years": "{0} տարին", 

6349 "week": "շաբաթ", 

6350 "weeks": "{0} շաբաթ", 

6351 } 

6352 

6353 meridians = { 

6354 "am": "Ամ", 

6355 "pm": "պ.մ.", 

6356 "AM": "Ամ", 

6357 "PM": "պ.մ.", 

6358 } 

6359 

6360 month_names = [ 

6361 "", 

6362 "հունվար", 

6363 "փետրվար", 

6364 "մարտ", 

6365 "ապրիլ", 

6366 "մայիս", 

6367 "հունիս", 

6368 "հուլիս", 

6369 "օգոստոս", 

6370 "սեպտեմբեր", 

6371 "հոկտեմբեր", 

6372 "նոյեմբեր", 

6373 "դեկտեմբեր", 

6374 ] 

6375 

6376 month_abbreviations = [ 

6377 "", 

6378 "հունվար", 

6379 "փետրվար", 

6380 "մարտ", 

6381 "ապրիլ", 

6382 "մայիս", 

6383 "հունիս", 

6384 "հուլիս", 

6385 "օգոստոս", 

6386 "սեպտեմբեր", 

6387 "հոկտեմբեր", 

6388 "նոյեմբեր", 

6389 "դեկտեմբեր", 

6390 ] 

6391 

6392 day_names = [ 

6393 "", 

6394 "երկուշաբթի", 

6395 "երեքշաբթի", 

6396 "չորեքշաբթի", 

6397 "հինգշաբթի", 

6398 "ուրբաթ", 

6399 "շաբաթ", 

6400 "կիրակի", 

6401 ] 

6402 

6403 day_abbreviations = [ 

6404 "", 

6405 "երկ.", 

6406 "երեք.", 

6407 "չորեք.", 

6408 "հինգ.", 

6409 "ուրբ.", 

6410 "շաբ.", 

6411 "կիր.", 

6412 ] 

6413 

6414 

6415class UzbekLocale(Locale): 

6416 names = ["uz", "uz-uz"] 

6417 past = "{0}dan avval" 

6418 future = "{0}dan keyin" 

6419 timeframes = { 

6420 "now": "hozir", 

6421 "second": "bir soniya", 

6422 "seconds": "{0} soniya", 

6423 "minute": "bir daqiqa", 

6424 "minutes": "{0} daqiqa", 

6425 "hour": "bir soat", 

6426 "hours": "{0} soat", 

6427 "day": "bir kun", 

6428 "days": "{0} kun", 

6429 "week": "bir hafta", 

6430 "weeks": "{0} hafta", 

6431 "month": "bir oy", 

6432 "months": "{0} oy", 

6433 "year": "bir yil", 

6434 "years": "{0} yil", 

6435 } 

6436 

6437 month_names = [ 

6438 "", 

6439 "Yanvar", 

6440 "Fevral", 

6441 "Mart", 

6442 "Aprel", 

6443 "May", 

6444 "Iyun", 

6445 "Iyul", 

6446 "Avgust", 

6447 "Sentyabr", 

6448 "Oktyabr", 

6449 "Noyabr", 

6450 "Dekabr", 

6451 ] 

6452 

6453 month_abbreviations = [ 

6454 "", 

6455 "Yan", 

6456 "Fev", 

6457 "Mar", 

6458 "Apr", 

6459 "May", 

6460 "Iyn", 

6461 "Iyl", 

6462 "Avg", 

6463 "Sen", 

6464 "Okt", 

6465 "Noy", 

6466 "Dek", 

6467 ] 

6468 

6469 day_names = [ 

6470 "", 

6471 "Dushanba", 

6472 "Seshanba", 

6473 "Chorshanba", 

6474 "Payshanba", 

6475 "Juma", 

6476 "Shanba", 

6477 "Yakshanba", 

6478 ] 

6479 

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