Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.11/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

1177 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 "", 

781 "月曜日", 

782 "火曜日", 

783 "水曜日", 

784 "木曜日", 

785 "金曜日", 

786 "土曜日", 

787 "日曜日", 

788 ] 

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

790 

791 

792class SwedishLocale(Locale): 

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

794 

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

796 future = "om {0}" 

797 and_word = "och" 

798 

799 timeframes = { 

800 "now": "just nu", 

801 "second": "en sekund", 

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

803 "minute": "en minut", 

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

805 "hour": "en timme", 

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

807 "day": "en dag", 

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

809 "week": "en vecka", 

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

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

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

813 "year": "ett år", 

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

815 } 

816 

817 month_names = [ 

818 "", 

819 "januari", 

820 "februari", 

821 "mars", 

822 "april", 

823 "maj", 

824 "juni", 

825 "juli", 

826 "augusti", 

827 "september", 

828 "oktober", 

829 "november", 

830 "december", 

831 ] 

832 month_abbreviations = [ 

833 "", 

834 "jan", 

835 "feb", 

836 "mar", 

837 "apr", 

838 "maj", 

839 "jun", 

840 "jul", 

841 "aug", 

842 "sep", 

843 "okt", 

844 "nov", 

845 "dec", 

846 ] 

847 

848 day_names = [ 

849 "", 

850 "måndag", 

851 "tisdag", 

852 "onsdag", 

853 "torsdag", 

854 "fredag", 

855 "lördag", 

856 "söndag", 

857 ] 

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

859 

860 

861class FinnishLocale(Locale): 

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

863 

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

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

866 

867 past = "{0} sitten" 

868 future = "{0} kuluttua" 

869 

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

871 "now": "juuri nyt", 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

886 } 

887 

888 # Months and days are lowercase in Finnish 

889 month_names = [ 

890 "", 

891 "tammikuu", 

892 "helmikuu", 

893 "maaliskuu", 

894 "huhtikuu", 

895 "toukokuu", 

896 "kesäkuu", 

897 "heinäkuu", 

898 "elokuu", 

899 "syyskuu", 

900 "lokakuu", 

901 "marraskuu", 

902 "joulukuu", 

903 ] 

904 

905 month_abbreviations = [ 

906 "", 

907 "tammi", 

908 "helmi", 

909 "maalis", 

910 "huhti", 

911 "touko", 

912 "kesä", 

913 "heinä", 

914 "elo", 

915 "syys", 

916 "loka", 

917 "marras", 

918 "joulu", 

919 ] 

920 

921 day_names = [ 

922 "", 

923 "maanantai", 

924 "tiistai", 

925 "keskiviikko", 

926 "torstai", 

927 "perjantai", 

928 "lauantai", 

929 "sunnuntai", 

930 ] 

931 

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

933 

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

935 form = self.timeframes[timeframe] 

936 

937 if isinstance(form, Mapping): 

938 if delta < 0: 

939 form = form["past"] 

940 else: 

941 form = form["future"] 

942 

943 return form.format(abs(delta)) 

944 

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

946 return f"{n}." 

947 

948 

949class ChineseCNLocale(Locale): 

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

951 

952 past = "{0}前" 

953 future = "{0}后" 

954 

955 timeframes = { 

956 "now": "刚才", 

957 "second": "1秒", 

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

959 "minute": "1分钟", 

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

961 "hour": "1小时", 

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

963 "day": "1天", 

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

965 "week": "1周", 

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

967 "month": "1个月", 

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

969 "year": "1年", 

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

971 } 

972 

973 month_names = [ 

974 "", 

975 "一月", 

976 "二月", 

977 "三月", 

978 "四月", 

979 "五月", 

980 "六月", 

981 "七月", 

982 "八月", 

983 "九月", 

984 "十月", 

985 "十一月", 

986 "十二月", 

987 ] 

988 month_abbreviations = [ 

989 "", 

990 " 1", 

991 " 2", 

992 " 3", 

993 " 4", 

994 " 5", 

995 " 6", 

996 " 7", 

997 " 8", 

998 " 9", 

999 "10", 

1000 "11", 

1001 "12", 

1002 ] 

1003 

1004 day_names = [ 

1005 "", 

1006 "星期一", 

1007 "星期二", 

1008 "星期三", 

1009 "星期四", 

1010 "星期五", 

1011 "星期六", 

1012 "星期日", 

1013 ] 

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

1015 

1016 

1017class ChineseTWLocale(Locale): 

1018 names = ["zh-tw"] 

1019 

1020 past = "{0}前" 

1021 future = "{0}後" 

1022 and_word = "和" 

1023 

1024 timeframes = { 

1025 "now": "剛才", 

1026 "second": "1秒", 

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

1028 "minute": "1分鐘", 

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

1030 "hour": "1小時", 

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

1032 "day": "1天", 

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

1034 "week": "1週", 

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

1036 "month": "1個月", 

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

1038 "year": "1年", 

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

1040 } 

1041 

1042 month_names = [ 

1043 "", 

1044 "1月", 

1045 "2月", 

1046 "3月", 

1047 "4月", 

1048 "5月", 

1049 "6月", 

1050 "7月", 

1051 "8月", 

1052 "9月", 

1053 "10月", 

1054 "11月", 

1055 "12月", 

1056 ] 

1057 month_abbreviations = [ 

1058 "", 

1059 " 1", 

1060 " 2", 

1061 " 3", 

1062 " 4", 

1063 " 5", 

1064 " 6", 

1065 " 7", 

1066 " 8", 

1067 " 9", 

1068 "10", 

1069 "11", 

1070 "12", 

1071 ] 

1072 

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

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

1075 

1076 

1077class HongKongLocale(Locale): 

1078 names = ["zh-hk"] 

1079 

1080 past = "{0}前" 

1081 future = "{0}後" 

1082 

1083 timeframes = { 

1084 "now": "剛才", 

1085 "second": "1秒", 

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

1087 "minute": "1分鐘", 

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

1089 "hour": "1小時", 

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

1091 "day": "1天", 

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

1093 "week": "1星期", 

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

1095 "month": "1個月", 

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

1097 "year": "1年", 

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

1099 } 

1100 

1101 month_names = [ 

1102 "", 

1103 "1月", 

1104 "2月", 

1105 "3月", 

1106 "4月", 

1107 "5月", 

1108 "6月", 

1109 "7月", 

1110 "8月", 

1111 "9月", 

1112 "10月", 

1113 "11月", 

1114 "12月", 

1115 ] 

1116 month_abbreviations = [ 

1117 "", 

1118 " 1", 

1119 " 2", 

1120 " 3", 

1121 " 4", 

1122 " 5", 

1123 " 6", 

1124 " 7", 

1125 " 8", 

1126 " 9", 

1127 "10", 

1128 "11", 

1129 "12", 

1130 ] 

1131 

1132 day_names = [ 

1133 "", 

1134 "星期一", 

1135 "星期二", 

1136 "星期三", 

1137 "星期四", 

1138 "星期五", 

1139 "星期六", 

1140 "星期日", 

1141 ] 

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

1143 

1144 

1145class KoreanLocale(Locale): 

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

1147 

1148 past = "{0} 전" 

1149 future = "{0} 후" 

1150 

1151 timeframes = { 

1152 "now": "지금", 

1153 "second": "1초", 

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

1155 "minute": "1분", 

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

1157 "hour": "한시간", 

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

1159 "day": "하루", 

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

1161 "week": "1주", 

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

1163 "month": "한달", 

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

1165 "year": "1년", 

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

1167 } 

1168 

1169 special_dayframes = { 

1170 -2: "그제", 

1171 -1: "어제", 

1172 1: "내일", 

1173 2: "모레", 

1174 3: "글피", 

1175 4: "그글피", 

1176 } 

1177 

1178 special_yearframes = {-2: "재작년", -1: "작년", 1: "내년", 2: "내후년"} 

1179 

1180 month_names = [ 

1181 "", 

1182 "1월", 

1183 "2월", 

1184 "3월", 

1185 "4월", 

1186 "5월", 

1187 "6월", 

1188 "7월", 

1189 "8월", 

1190 "9월", 

1191 "10월", 

1192 "11월", 

1193 "12월", 

1194 ] 

1195 month_abbreviations = [ 

1196 "", 

1197 " 1", 

1198 " 2", 

1199 " 3", 

1200 " 4", 

1201 " 5", 

1202 " 6", 

1203 " 7", 

1204 " 8", 

1205 " 9", 

1206 "10", 

1207 "11", 

1208 "12", 

1209 ] 

1210 

1211 day_names = [ 

1212 "", 

1213 "월요일", 

1214 "화요일", 

1215 "수요일", 

1216 "목요일", 

1217 "금요일", 

1218 "토요일", 

1219 "일요일", 

1220 ] 

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

1222 

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

1224 ordinals = [ 

1225 "0", 

1226 "첫", 

1227 "두", 

1228 "세", 

1229 "네", 

1230 "다섯", 

1231 "여섯", 

1232 "일곱", 

1233 "여덟", 

1234 "아홉", 

1235 "열", 

1236 ] 

1237 if n < len(ordinals): 

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

1239 return f"{n}번째" 

1240 

1241 def _format_relative( 

1242 self, 

1243 humanized: str, 

1244 timeframe: TimeFrameLiteral, 

1245 delta: Union[float, int], 

1246 ) -> str: 

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

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

1249 if special: 

1250 return special 

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

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

1253 if special: 

1254 return special 

1255 

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

1257 

1258 

1259# derived locale types & implementations. 

1260class DutchLocale(Locale): 

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

1262 

1263 past = "{0} geleden" 

1264 future = "over {0}" 

1265 

1266 timeframes = { 

1267 "now": "nu", 

1268 "second": "een seconde", 

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

1270 "minute": "een minuut", 

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

1272 "hour": "een uur", 

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

1274 "day": "een dag", 

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

1276 "week": "een week", 

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

1278 "month": "een maand", 

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

1280 "year": "een jaar", 

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

1282 } 

1283 

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

1285 # like in the English language. 

1286 month_names = [ 

1287 "", 

1288 "januari", 

1289 "februari", 

1290 "maart", 

1291 "april", 

1292 "mei", 

1293 "juni", 

1294 "juli", 

1295 "augustus", 

1296 "september", 

1297 "oktober", 

1298 "november", 

1299 "december", 

1300 ] 

1301 month_abbreviations = [ 

1302 "", 

1303 "jan", 

1304 "feb", 

1305 "mrt", 

1306 "apr", 

1307 "mei", 

1308 "jun", 

1309 "jul", 

1310 "aug", 

1311 "sep", 

1312 "okt", 

1313 "nov", 

1314 "dec", 

1315 ] 

1316 

1317 day_names = [ 

1318 "", 

1319 "maandag", 

1320 "dinsdag", 

1321 "woensdag", 

1322 "donderdag", 

1323 "vrijdag", 

1324 "zaterdag", 

1325 "zondag", 

1326 ] 

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

1328 

1329 

1330class SlavicBaseLocale(Locale): 

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

1332 

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

1334 form = self.timeframes[timeframe] 

1335 delta = abs(delta) 

1336 

1337 if isinstance(form, Mapping): 

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

1339 form = form["singular"] 

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

1341 form = form["dual"] 

1342 else: 

1343 form = form["plural"] 

1344 

1345 return form.format(delta) 

1346 

1347 

1348class BelarusianLocale(SlavicBaseLocale): 

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

1350 

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

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

1353 

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

1355 "now": "зараз", 

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

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

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

1359 "minutes": { 

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

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

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

1363 }, 

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

1365 "hours": { 

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

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

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

1369 }, 

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

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

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

1373 "months": { 

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

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

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

1377 }, 

1378 "year": "год", 

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

1380 } 

1381 

1382 month_names = [ 

1383 "", 

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

1385 "лютага", 

1386 "сакавіка", 

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

1388 "траўня", 

1389 "чэрвеня", 

1390 "ліпеня", 

1391 "жніўня", 

1392 "верасня", 

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

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

1395 "снежня", 

1396 ] 

1397 month_abbreviations = [ 

1398 "", 

1399 "студ", 

1400 "лют", 

1401 "сак", 

1402 "крас", 

1403 "трав", 

1404 "чэрв", 

1405 "ліп", 

1406 "жнів", 

1407 "вер", 

1408 "каст", 

1409 "ліст", 

1410 "снеж", 

1411 ] 

1412 

1413 day_names = [ 

1414 "", 

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

1416 "аўторак", 

1417 "серада", 

1418 "чацвер", 

1419 "пятніца", 

1420 "субота", 

1421 "нядзеля", 

1422 ] 

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

1424 

1425 

1426class PolishLocale(SlavicBaseLocale): 

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

1428 

1429 past = "{0} temu" 

1430 future = "za {0}" 

1431 

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

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

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

1435 "now": "teraz", 

1436 "second": "sekundę", 

1437 "seconds": { 

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

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

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

1441 }, 

1442 "minute": "minutę", 

1443 "minutes": { 

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

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

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

1447 }, 

1448 "hour": "godzinę", 

1449 "hours": { 

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

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

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

1453 }, 

1454 "day": "dzień", 

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

1456 "week": "tydzień", 

1457 "weeks": { 

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

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

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

1461 }, 

1462 "month": "miesiąc", 

1463 "months": { 

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

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

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

1467 }, 

1468 "year": "rok", 

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

1470 } 

1471 

1472 month_names = [ 

1473 "", 

1474 "styczeń", 

1475 "luty", 

1476 "marzec", 

1477 "kwiecień", 

1478 "maj", 

1479 "czerwiec", 

1480 "lipiec", 

1481 "sierpień", 

1482 "wrzesień", 

1483 "październik", 

1484 "listopad", 

1485 "grudzień", 

1486 ] 

1487 month_abbreviations = [ 

1488 "", 

1489 "sty", 

1490 "lut", 

1491 "mar", 

1492 "kwi", 

1493 "maj", 

1494 "cze", 

1495 "lip", 

1496 "sie", 

1497 "wrz", 

1498 "paź", 

1499 "lis", 

1500 "gru", 

1501 ] 

1502 

1503 day_names = [ 

1504 "", 

1505 "poniedziałek", 

1506 "wtorek", 

1507 "środa", 

1508 "czwartek", 

1509 "piątek", 

1510 "sobota", 

1511 "niedziela", 

1512 ] 

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

1514 

1515 

1516class RussianLocale(SlavicBaseLocale): 

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

1518 

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

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

1521 

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

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

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

1525 "seconds": { 

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

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

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

1529 }, 

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

1531 "minutes": { 

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

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

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

1535 }, 

1536 "hour": "час", 

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

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

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

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

1541 "weeks": { 

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

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

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

1545 }, 

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

1547 "months": { 

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

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

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

1551 }, 

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

1553 "quarters": { 

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

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

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

1557 }, 

1558 "year": "год", 

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

1560 } 

1561 

1562 month_names = [ 

1563 "", 

1564 "января", 

1565 "февраля", 

1566 "марта", 

1567 "апреля", 

1568 "мая", 

1569 "июня", 

1570 "июля", 

1571 "августа", 

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

1573 "октября", 

1574 "ноября", 

1575 "декабря", 

1576 ] 

1577 month_abbreviations = [ 

1578 "", 

1579 "янв", 

1580 "фев", 

1581 "мар", 

1582 "апр", 

1583 "май", 

1584 "июн", 

1585 "июл", 

1586 "авг", 

1587 "сен", 

1588 "окт", 

1589 "ноя", 

1590 "дек", 

1591 ] 

1592 

1593 day_names = [ 

1594 "", 

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

1596 "вторник", 

1597 "среда", 

1598 "четверг", 

1599 "пятница", 

1600 "суббота", 

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

1602 ] 

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

1604 

1605 

1606class AfrikaansLocale(Locale): 

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

1608 

1609 past = "{0} gelede" 

1610 future = "in {0}" 

1611 

1612 timeframes = { 

1613 "now": "nou", 

1614 "second": "n sekonde", 

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

1616 "minute": "minuut", 

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

1618 "hour": "uur", 

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

1620 "day": "een dag", 

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

1622 "week": "een week", 

1623 "weeks": "{0} weke", 

1624 "month": "een maand", 

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

1626 "year": "een jaar", 

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

1628 } 

1629 

1630 month_names = [ 

1631 "", 

1632 "Januarie", 

1633 "Februarie", 

1634 "Maart", 

1635 "April", 

1636 "Mei", 

1637 "Junie", 

1638 "Julie", 

1639 "Augustus", 

1640 "September", 

1641 "Oktober", 

1642 "November", 

1643 "Desember", 

1644 ] 

1645 month_abbreviations = [ 

1646 "", 

1647 "Jan", 

1648 "Feb", 

1649 "Mrt", 

1650 "Apr", 

1651 "Mei", 

1652 "Jun", 

1653 "Jul", 

1654 "Aug", 

1655 "Sep", 

1656 "Okt", 

1657 "Nov", 

1658 "Des", 

1659 ] 

1660 

1661 day_names = [ 

1662 "", 

1663 "Maandag", 

1664 "Dinsdag", 

1665 "Woensdag", 

1666 "Donderdag", 

1667 "Vrydag", 

1668 "Saterdag", 

1669 "Sondag", 

1670 ] 

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

1672 

1673 

1674class BulgarianLocale(SlavicBaseLocale): 

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

1676 

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

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

1679 

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

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

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

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

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

1685 "minutes": { 

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

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

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

1689 }, 

1690 "hour": "час", 

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

1692 "day": "ден", 

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

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

1695 "months": { 

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

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

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

1699 }, 

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

1701 "years": { 

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

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

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

1705 }, 

1706 } 

1707 

1708 month_names = [ 

1709 "", 

1710 "януари", 

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

1712 "март", 

1713 "април", 

1714 "май", 

1715 "юни", 

1716 "юли", 

1717 "август", 

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

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

1720 "ноември", 

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

1722 ] 

1723 month_abbreviations = [ 

1724 "", 

1725 "ян", 

1726 "февр", 

1727 "март", 

1728 "апр", 

1729 "май", 

1730 "юни", 

1731 "юли", 

1732 "авг", 

1733 "септ", 

1734 "окт", 

1735 "ноем", 

1736 "дек", 

1737 ] 

1738 

1739 day_names = [ 

1740 "", 

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

1742 "вторник", 

1743 "сряда", 

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

1745 "петък", 

1746 "събота", 

1747 "неделя", 

1748 ] 

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

1750 

1751 

1752class UkrainianLocale(SlavicBaseLocale): 

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

1754 

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

1756 future = "за {0}" 

1757 

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

1759 "now": "зараз", 

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

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

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

1763 "minutes": { 

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

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

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

1767 }, 

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

1769 "hours": { 

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

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

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

1773 }, 

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

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

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

1777 "months": { 

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

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

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

1781 }, 

1782 "year": "рік", 

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

1784 } 

1785 

1786 month_names = [ 

1787 "", 

1788 "січня", 

1789 "лютого", 

1790 "березня", 

1791 "квітня", 

1792 "травня", 

1793 "червня", 

1794 "липня", 

1795 "серпня", 

1796 "вересня", 

1797 "жовтня", 

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

1799 "грудня", 

1800 ] 

1801 month_abbreviations = [ 

1802 "", 

1803 "січ", 

1804 "лют", 

1805 "бер", 

1806 "квіт", 

1807 "трав", 

1808 "черв", 

1809 "лип", 

1810 "серп", 

1811 "вер", 

1812 "жовт", 

1813 "лист", 

1814 "груд", 

1815 ] 

1816 

1817 day_names = [ 

1818 "", 

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

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

1821 "середа", 

1822 "четвер", 

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

1824 "субота", 

1825 "неділя", 

1826 ] 

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

1828 

1829 

1830class MacedonianLocale(SlavicBaseLocale): 

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

1832 

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

1834 future = "за {0}" 

1835 

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

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

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

1839 "seconds": { 

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

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

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

1843 }, 

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

1845 "minutes": { 

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

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

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

1849 }, 

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

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

1852 "day": "еден ден", 

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

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

1855 "weeks": { 

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

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

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

1859 }, 

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

1861 "months": { 

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

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

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

1865 }, 

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

1867 "years": { 

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

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

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

1871 }, 

1872 } 

1873 

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

1875 

1876 month_names = [ 

1877 "", 

1878 "Јануари", 

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

1880 "Март", 

1881 "Април", 

1882 "Мај", 

1883 "Јуни", 

1884 "Јули", 

1885 "Август", 

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

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

1888 "Ноември", 

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

1890 ] 

1891 month_abbreviations = [ 

1892 "", 

1893 "Јан", 

1894 "Фев", 

1895 "Мар", 

1896 "Апр", 

1897 "Мај", 

1898 "Јун", 

1899 "Јул", 

1900 "Авг", 

1901 "Септ", 

1902 "Окт", 

1903 "Ноем", 

1904 "Декем", 

1905 ] 

1906 

1907 day_names = [ 

1908 "", 

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

1910 "Вторник", 

1911 "Среда", 

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

1913 "Петок", 

1914 "Сабота", 

1915 "Недела", 

1916 ] 

1917 day_abbreviations = [ 

1918 "", 

1919 "Пон", 

1920 "Вт", 

1921 "Сре", 

1922 "Чет", 

1923 "Пет", 

1924 "Саб", 

1925 "Нед", 

1926 ] 

1927 

1928 

1929class MacedonianLatinLocale(SlavicBaseLocale): 

1930 names = ["mk-latn", "mk-mk-latn"] 

1931 

1932 past = "pred {0}" 

1933 future = "za {0}" 

1934 

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

1936 "now": "sega", 

1937 "second": "edna sekunda", 

1938 "seconds": { 

1939 "singular": "{0} sekunda", 

1940 "dual": "{0} sekundi", 

1941 "plural": "{0} sekundi", 

1942 }, 

1943 "minute": "edna minuta", 

1944 "minutes": { 

1945 "singular": "{0} minuta", 

1946 "dual": "{0} minuti", 

1947 "plural": "{0} minuti", 

1948 }, 

1949 "hour": "eden saat", 

1950 "hours": {"singular": "{0} saat", "dual": "{0} saati", "plural": "{0} saati"}, 

1951 "day": "eden den", 

1952 "days": {"singular": "{0} den", "dual": "{0} dena", "plural": "{0} dena"}, 

1953 "week": "edna nedela", 

1954 "weeks": { 

1955 "singular": "{0} nedela", 

1956 "dual": "{0} nedeli", 

1957 "plural": "{0} nedeli", 

1958 }, 

1959 "month": "eden mesec", 

1960 "months": { 

1961 "singular": "{0} mesec", 

1962 "dual": "{0} meseci", 

1963 "plural": "{0} meseci", 

1964 }, 

1965 "year": "edna godina", 

1966 "years": { 

1967 "singular": "{0} godina", 

1968 "dual": "{0} godini", 

1969 "plural": "{0} godini", 

1970 }, 

1971 } 

1972 

1973 meridians = {"am": "dp", "pm": "pp", "AM": "pretpladne", "PM": "popladne"} 

1974 

1975 month_names = [ 

1976 "", 

1977 "Januari", 

1978 "Fevruari", 

1979 "Mart", 

1980 "April", 

1981 "Maj", 

1982 "Juni", 

1983 "Juli", 

1984 "Avgust", 

1985 "Septemvri", 

1986 "Oktomvri", 

1987 "Noemvri", 

1988 "Dekemvri", 

1989 ] 

1990 month_abbreviations = [ 

1991 "", 

1992 "Jan", 

1993 "Fev", 

1994 "Mar", 

1995 "Apr", 

1996 "Maj", 

1997 "Jun", 

1998 "Jul", 

1999 "Avg", 

2000 "Sep", 

2001 "Okt", 

2002 "Noe", 

2003 "Dek", 

2004 ] 

2005 

2006 day_names = [ 

2007 "", 

2008 "Ponedelnik", 

2009 "Vtornik", 

2010 "Sreda", 

2011 "Chetvrtok", 

2012 "Petok", 

2013 "Sabota", 

2014 "Nedela", 

2015 ] 

2016 day_abbreviations = [ 

2017 "", 

2018 "Pon", 

2019 "Vt", 

2020 "Sre", 

2021 "Chet", 

2022 "Pet", 

2023 "Sab", 

2024 "Ned", 

2025 ] 

2026 

2027 

2028class GermanBaseLocale(Locale): 

2029 past = "vor {0}" 

2030 future = "in {0}" 

2031 and_word = "und" 

2032 

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

2034 "now": "gerade eben", 

2035 "second": "einer Sekunde", 

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

2037 "minute": "einer Minute", 

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

2039 "hour": "einer Stunde", 

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

2041 "day": "einem Tag", 

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

2043 "week": "einer Woche", 

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

2045 "month": "einem Monat", 

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

2047 "year": "einem Jahr", 

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

2049 } 

2050 

2051 timeframes_only_distance = timeframes.copy() 

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

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

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

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

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

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

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

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

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

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

2062 

2063 month_names = [ 

2064 "", 

2065 "Januar", 

2066 "Februar", 

2067 "März", 

2068 "April", 

2069 "Mai", 

2070 "Juni", 

2071 "Juli", 

2072 "August", 

2073 "September", 

2074 "Oktober", 

2075 "November", 

2076 "Dezember", 

2077 ] 

2078 

2079 month_abbreviations = [ 

2080 "", 

2081 "Jan", 

2082 "Feb", 

2083 "Mär", 

2084 "Apr", 

2085 "Mai", 

2086 "Jun", 

2087 "Jul", 

2088 "Aug", 

2089 "Sep", 

2090 "Okt", 

2091 "Nov", 

2092 "Dez", 

2093 ] 

2094 

2095 day_names = [ 

2096 "", 

2097 "Montag", 

2098 "Dienstag", 

2099 "Mittwoch", 

2100 "Donnerstag", 

2101 "Freitag", 

2102 "Samstag", 

2103 "Sonntag", 

2104 ] 

2105 

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

2107 

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

2109 return f"{n}." 

2110 

2111 def describe( 

2112 self, 

2113 timeframe: TimeFrameLiteral, 

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

2115 only_distance: bool = False, 

2116 ) -> str: 

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

2118 

2119 :param timeframe: a string representing a timeframe. 

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

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

2122 """ 

2123 

2124 if not only_distance: 

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

2126 

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

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

2129 trunc(abs(delta)) 

2130 ) 

2131 

2132 return humanized 

2133 

2134 

2135class GermanLocale(GermanBaseLocale, Locale): 

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

2137 

2138 

2139class SwissLocale(GermanBaseLocale, Locale): 

2140 names = ["de-ch"] 

2141 

2142 

2143class AustrianLocale(GermanBaseLocale, Locale): 

2144 names = ["de-at"] 

2145 

2146 month_names = [ 

2147 "", 

2148 "Jänner", 

2149 "Februar", 

2150 "März", 

2151 "April", 

2152 "Mai", 

2153 "Juni", 

2154 "Juli", 

2155 "August", 

2156 "September", 

2157 "Oktober", 

2158 "November", 

2159 "Dezember", 

2160 ] 

2161 

2162 

2163class NorwegianLocale(Locale): 

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

2165 

2166 past = "for {0} siden" 

2167 future = "om {0}" 

2168 

2169 timeframes = { 

2170 "now": "nå nettopp", 

2171 "second": "ett sekund", 

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

2173 "minute": "ett minutt", 

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

2175 "hour": "en time", 

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

2177 "day": "en dag", 

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

2179 "week": "en uke", 

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

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

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

2183 "year": "ett år", 

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

2185 } 

2186 

2187 month_names = [ 

2188 "", 

2189 "januar", 

2190 "februar", 

2191 "mars", 

2192 "april", 

2193 "mai", 

2194 "juni", 

2195 "juli", 

2196 "august", 

2197 "september", 

2198 "oktober", 

2199 "november", 

2200 "desember", 

2201 ] 

2202 month_abbreviations = [ 

2203 "", 

2204 "jan", 

2205 "feb", 

2206 "mar", 

2207 "apr", 

2208 "mai", 

2209 "jun", 

2210 "jul", 

2211 "aug", 

2212 "sep", 

2213 "okt", 

2214 "nov", 

2215 "des", 

2216 ] 

2217 

2218 day_names = [ 

2219 "", 

2220 "mandag", 

2221 "tirsdag", 

2222 "onsdag", 

2223 "torsdag", 

2224 "fredag", 

2225 "lørdag", 

2226 "søndag", 

2227 ] 

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

2229 

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

2231 return f"{n}." 

2232 

2233 

2234class NewNorwegianLocale(Locale): 

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

2236 

2237 past = "for {0} sidan" 

2238 future = "om {0}" 

2239 

2240 timeframes = { 

2241 "now": "no nettopp", 

2242 "second": "eitt sekund", 

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

2244 "minute": "eitt minutt", 

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

2246 "hour": "ein time", 

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

2248 "day": "ein dag", 

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

2250 "week": "ei veke", 

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

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

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

2254 "year": "eitt år", 

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

2256 } 

2257 

2258 month_names = [ 

2259 "", 

2260 "januar", 

2261 "februar", 

2262 "mars", 

2263 "april", 

2264 "mai", 

2265 "juni", 

2266 "juli", 

2267 "august", 

2268 "september", 

2269 "oktober", 

2270 "november", 

2271 "desember", 

2272 ] 

2273 month_abbreviations = [ 

2274 "", 

2275 "jan", 

2276 "feb", 

2277 "mar", 

2278 "apr", 

2279 "mai", 

2280 "jun", 

2281 "jul", 

2282 "aug", 

2283 "sep", 

2284 "okt", 

2285 "nov", 

2286 "des", 

2287 ] 

2288 

2289 day_names = [ 

2290 "", 

2291 "måndag", 

2292 "tysdag", 

2293 "onsdag", 

2294 "torsdag", 

2295 "fredag", 

2296 "laurdag", 

2297 "sundag", 

2298 ] 

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

2300 

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

2302 return f"{n}." 

2303 

2304 

2305class PortugueseLocale(Locale): 

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

2307 

2308 past = "há {0}" 

2309 future = "em {0}" 

2310 and_word = "e" 

2311 

2312 timeframes = { 

2313 "now": "agora", 

2314 "second": "um segundo", 

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

2316 "minute": "um minuto", 

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

2318 "hour": "uma hora", 

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

2320 "day": "um dia", 

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

2322 "week": "uma semana", 

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

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

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

2326 "year": "um ano", 

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

2328 } 

2329 

2330 month_names = [ 

2331 "", 

2332 "Janeiro", 

2333 "Fevereiro", 

2334 "Março", 

2335 "Abril", 

2336 "Maio", 

2337 "Junho", 

2338 "Julho", 

2339 "Agosto", 

2340 "Setembro", 

2341 "Outubro", 

2342 "Novembro", 

2343 "Dezembro", 

2344 ] 

2345 month_abbreviations = [ 

2346 "", 

2347 "Jan", 

2348 "Fev", 

2349 "Mar", 

2350 "Abr", 

2351 "Mai", 

2352 "Jun", 

2353 "Jul", 

2354 "Ago", 

2355 "Set", 

2356 "Out", 

2357 "Nov", 

2358 "Dez", 

2359 ] 

2360 

2361 day_names = [ 

2362 "", 

2363 "Segunda-feira", 

2364 "Terça-feira", 

2365 "Quarta-feira", 

2366 "Quinta-feira", 

2367 "Sexta-feira", 

2368 "Sábado", 

2369 "Domingo", 

2370 ] 

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

2372 

2373 

2374class BrazilianPortugueseLocale(PortugueseLocale): 

2375 names = ["pt-br"] 

2376 

2377 past = "faz {0}" 

2378 

2379 

2380class TagalogLocale(Locale): 

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

2382 

2383 past = "nakaraang {0}" 

2384 future = "{0} mula ngayon" 

2385 

2386 timeframes = { 

2387 "now": "ngayon lang", 

2388 "second": "isang segundo", 

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

2390 "minute": "isang minuto", 

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

2392 "hour": "isang oras", 

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

2394 "day": "isang araw", 

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

2396 "week": "isang linggo", 

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

2398 "month": "isang buwan", 

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

2400 "year": "isang taon", 

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

2402 } 

2403 

2404 month_names = [ 

2405 "", 

2406 "Enero", 

2407 "Pebrero", 

2408 "Marso", 

2409 "Abril", 

2410 "Mayo", 

2411 "Hunyo", 

2412 "Hulyo", 

2413 "Agosto", 

2414 "Setyembre", 

2415 "Oktubre", 

2416 "Nobyembre", 

2417 "Disyembre", 

2418 ] 

2419 month_abbreviations = [ 

2420 "", 

2421 "Ene", 

2422 "Peb", 

2423 "Mar", 

2424 "Abr", 

2425 "May", 

2426 "Hun", 

2427 "Hul", 

2428 "Ago", 

2429 "Set", 

2430 "Okt", 

2431 "Nob", 

2432 "Dis", 

2433 ] 

2434 

2435 day_names = [ 

2436 "", 

2437 "Lunes", 

2438 "Martes", 

2439 "Miyerkules", 

2440 "Huwebes", 

2441 "Biyernes", 

2442 "Sabado", 

2443 "Linggo", 

2444 ] 

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

2446 

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

2448 

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

2450 return f"ika-{n}" 

2451 

2452 

2453class VietnameseLocale(Locale): 

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

2455 

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

2457 future = "{0} nữa" 

2458 

2459 timeframes = { 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2475 } 

2476 

2477 month_names = [ 

2478 "", 

2479 "Tháng Một", 

2480 "Tháng Hai", 

2481 "Tháng Ba", 

2482 "Tháng Tư", 

2483 "Tháng Năm", 

2484 "Tháng Sáu", 

2485 "Tháng Bảy", 

2486 "Tháng Tám", 

2487 "Tháng Chín", 

2488 "Tháng Mười", 

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

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

2491 ] 

2492 month_abbreviations = [ 

2493 "", 

2494 "Tháng 1", 

2495 "Tháng 2", 

2496 "Tháng 3", 

2497 "Tháng 4", 

2498 "Tháng 5", 

2499 "Tháng 6", 

2500 "Tháng 7", 

2501 "Tháng 8", 

2502 "Tháng 9", 

2503 "Tháng 10", 

2504 "Tháng 11", 

2505 "Tháng 12", 

2506 ] 

2507 

2508 day_names = [ 

2509 "", 

2510 "Thứ Hai", 

2511 "Thứ Ba", 

2512 "Thứ Tư", 

2513 "Thứ Năm", 

2514 "Thứ Sáu", 

2515 "Thứ Bảy", 

2516 "Chủ Nhật", 

2517 ] 

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

2519 

2520 

2521class TurkishLocale(Locale): 

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

2523 

2524 past = "{0} önce" 

2525 future = "{0} sonra" 

2526 and_word = "ve" 

2527 

2528 timeframes = { 

2529 "now": "şimdi", 

2530 "second": "bir saniye", 

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

2532 "minute": "bir dakika", 

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

2534 "hour": "bir saat", 

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

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

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

2538 "week": "bir hafta", 

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

2540 "month": "bir ay", 

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

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

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

2544 } 

2545 

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

2547 

2548 month_names = [ 

2549 "", 

2550 "Ocak", 

2551 "Şubat", 

2552 "Mart", 

2553 "Nisan", 

2554 "Mayıs", 

2555 "Haziran", 

2556 "Temmuz", 

2557 "Ağustos", 

2558 "Eylül", 

2559 "Ekim", 

2560 "Kasım", 

2561 "Aralık", 

2562 ] 

2563 month_abbreviations = [ 

2564 "", 

2565 "Oca", 

2566 "Şub", 

2567 "Mar", 

2568 "Nis", 

2569 "May", 

2570 "Haz", 

2571 "Tem", 

2572 "Ağu", 

2573 "Eyl", 

2574 "Eki", 

2575 "Kas", 

2576 "Ara", 

2577 ] 

2578 

2579 day_names = [ 

2580 "", 

2581 "Pazartesi", 

2582 "Salı", 

2583 "Çarşamba", 

2584 "Perşembe", 

2585 "Cuma", 

2586 "Cumartesi", 

2587 "Pazar", 

2588 ] 

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

2590 

2591 

2592class AzerbaijaniLocale(Locale): 

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

2594 

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

2596 future = "{0} sonra" 

2597 

2598 timeframes = { 

2599 "now": "indi", 

2600 "second": "bir saniyə", 

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

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

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

2604 "hour": "bir saat", 

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

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

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

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

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

2610 "month": "bir ay", 

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

2612 "year": "bir il", 

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

2614 } 

2615 

2616 month_names = [ 

2617 "", 

2618 "Yanvar", 

2619 "Fevral", 

2620 "Mart", 

2621 "Aprel", 

2622 "May", 

2623 "İyun", 

2624 "İyul", 

2625 "Avqust", 

2626 "Sentyabr", 

2627 "Oktyabr", 

2628 "Noyabr", 

2629 "Dekabr", 

2630 ] 

2631 month_abbreviations = [ 

2632 "", 

2633 "Yan", 

2634 "Fev", 

2635 "Mar", 

2636 "Apr", 

2637 "May", 

2638 "İyn", 

2639 "İyl", 

2640 "Avq", 

2641 "Sen", 

2642 "Okt", 

2643 "Noy", 

2644 "Dek", 

2645 ] 

2646 

2647 day_names = [ 

2648 "", 

2649 "Bazar ertəsi", 

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

2651 "Çərşənbə", 

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

2653 "Cümə", 

2654 "Şənbə", 

2655 "Bazar", 

2656 ] 

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

2658 

2659 

2660class ArabicLocale(Locale): 

2661 names = [ 

2662 "ar", 

2663 "ar-ae", 

2664 "ar-bh", 

2665 "ar-dj", 

2666 "ar-eg", 

2667 "ar-eh", 

2668 "ar-er", 

2669 "ar-km", 

2670 "ar-kw", 

2671 "ar-ly", 

2672 "ar-om", 

2673 "ar-qa", 

2674 "ar-sa", 

2675 "ar-sd", 

2676 "ar-so", 

2677 "ar-ss", 

2678 "ar-td", 

2679 "ar-ye", 

2680 ] 

2681 

2682 past = "منذ {0}" 

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

2684 

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

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

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

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

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

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

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

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

2693 "day": "يوم", 

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

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

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

2697 "month": "شهر", 

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

2699 "year": "سنة", 

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

2701 } 

2702 

2703 month_names = [ 

2704 "", 

2705 "يناير", 

2706 "فبراير", 

2707 "مارس", 

2708 "أبريل", 

2709 "مايو", 

2710 "يونيو", 

2711 "يوليو", 

2712 "أغسطس", 

2713 "سبتمبر", 

2714 "أكتوبر", 

2715 "نوفمبر", 

2716 "ديسمبر", 

2717 ] 

2718 month_abbreviations = [ 

2719 "", 

2720 "يناير", 

2721 "فبراير", 

2722 "مارس", 

2723 "أبريل", 

2724 "مايو", 

2725 "يونيو", 

2726 "يوليو", 

2727 "أغسطس", 

2728 "سبتمبر", 

2729 "أكتوبر", 

2730 "نوفمبر", 

2731 "ديسمبر", 

2732 ] 

2733 

2734 day_names = [ 

2735 "", 

2736 "الإثنين", 

2737 "الثلاثاء", 

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

2739 "الخميس", 

2740 "الجمعة", 

2741 "السبت", 

2742 "الأحد", 

2743 ] 

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

2745 

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

2747 form = self.timeframes[timeframe] 

2748 delta = abs(delta) 

2749 if isinstance(form, Mapping): 

2750 if delta == 2: 

2751 form = form["2"] 

2752 elif 2 < delta <= 10: 

2753 form = form["ten"] 

2754 else: 

2755 form = form["higher"] 

2756 

2757 return form.format(delta) 

2758 

2759 

2760class LevantArabicLocale(ArabicLocale): 

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

2762 month_names = [ 

2763 "", 

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

2765 "شباط", 

2766 "آذار", 

2767 "نيسان", 

2768 "أيار", 

2769 "حزيران", 

2770 "تموز", 

2771 "آب", 

2772 "أيلول", 

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

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

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

2776 ] 

2777 month_abbreviations = [ 

2778 "", 

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

2780 "شباط", 

2781 "آذار", 

2782 "نيسان", 

2783 "أيار", 

2784 "حزيران", 

2785 "تموز", 

2786 "آب", 

2787 "أيلول", 

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

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

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

2791 ] 

2792 

2793 

2794class AlgeriaTunisiaArabicLocale(ArabicLocale): 

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

2796 month_names = [ 

2797 "", 

2798 "جانفي", 

2799 "فيفري", 

2800 "مارس", 

2801 "أفريل", 

2802 "ماي", 

2803 "جوان", 

2804 "جويلية", 

2805 "أوت", 

2806 "سبتمبر", 

2807 "أكتوبر", 

2808 "نوفمبر", 

2809 "ديسمبر", 

2810 ] 

2811 month_abbreviations = [ 

2812 "", 

2813 "جانفي", 

2814 "فيفري", 

2815 "مارس", 

2816 "أفريل", 

2817 "ماي", 

2818 "جوان", 

2819 "جويلية", 

2820 "أوت", 

2821 "سبتمبر", 

2822 "أكتوبر", 

2823 "نوفمبر", 

2824 "ديسمبر", 

2825 ] 

2826 

2827 

2828class MauritaniaArabicLocale(ArabicLocale): 

2829 names = ["ar-mr"] 

2830 month_names = [ 

2831 "", 

2832 "يناير", 

2833 "فبراير", 

2834 "مارس", 

2835 "إبريل", 

2836 "مايو", 

2837 "يونيو", 

2838 "يوليو", 

2839 "أغشت", 

2840 "شتمبر", 

2841 "أكتوبر", 

2842 "نوفمبر", 

2843 "دجمبر", 

2844 ] 

2845 month_abbreviations = [ 

2846 "", 

2847 "يناير", 

2848 "فبراير", 

2849 "مارس", 

2850 "إبريل", 

2851 "مايو", 

2852 "يونيو", 

2853 "يوليو", 

2854 "أغشت", 

2855 "شتمبر", 

2856 "أكتوبر", 

2857 "نوفمبر", 

2858 "دجمبر", 

2859 ] 

2860 

2861 

2862class MoroccoArabicLocale(ArabicLocale): 

2863 names = ["ar-ma"] 

2864 month_names = [ 

2865 "", 

2866 "يناير", 

2867 "فبراير", 

2868 "مارس", 

2869 "أبريل", 

2870 "ماي", 

2871 "يونيو", 

2872 "يوليوز", 

2873 "غشت", 

2874 "شتنبر", 

2875 "أكتوبر", 

2876 "نونبر", 

2877 "دجنبر", 

2878 ] 

2879 month_abbreviations = [ 

2880 "", 

2881 "يناير", 

2882 "فبراير", 

2883 "مارس", 

2884 "أبريل", 

2885 "ماي", 

2886 "يونيو", 

2887 "يوليوز", 

2888 "غشت", 

2889 "شتنبر", 

2890 "أكتوبر", 

2891 "نونبر", 

2892 "دجنبر", 

2893 ] 

2894 

2895 

2896class IcelandicLocale(Locale): 

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

2898 form = self.timeframes[timeframe] 

2899 

2900 if isinstance(form, Mapping): 

2901 if delta < 0: 

2902 form = form["past"] 

2903 elif delta > 0: 

2904 form = form["future"] 

2905 else: 

2906 raise ValueError( 

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

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

2909 ) 

2910 # FIXME: handle when delta is 0 

2911 

2912 return form.format(abs(delta)) 

2913 

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

2915 

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

2917 future = "eftir {0}" 

2918 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2933 } 

2934 

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

2936 

2937 month_names = [ 

2938 "", 

2939 "janúar", 

2940 "febrúar", 

2941 "mars", 

2942 "apríl", 

2943 "maí", 

2944 "júní", 

2945 "júlí", 

2946 "ágúst", 

2947 "september", 

2948 "október", 

2949 "nóvember", 

2950 "desember", 

2951 ] 

2952 month_abbreviations = [ 

2953 "", 

2954 "jan", 

2955 "feb", 

2956 "mar", 

2957 "apr", 

2958 "maí", 

2959 "jún", 

2960 "júl", 

2961 "ágú", 

2962 "sep", 

2963 "okt", 

2964 "nóv", 

2965 "des", 

2966 ] 

2967 

2968 day_names = [ 

2969 "", 

2970 "mánudagur", 

2971 "þriðjudagur", 

2972 "miðvikudagur", 

2973 "fimmtudagur", 

2974 "föstudagur", 

2975 "laugardagur", 

2976 "sunnudagur", 

2977 ] 

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

2979 

2980 

2981class DanishLocale(Locale): 

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

2983 

2984 past = "for {0} siden" 

2985 future = "om {0}" 

2986 and_word = "og" 

2987 

2988 timeframes = { 

2989 "now": "lige nu", 

2990 "second": "et sekund", 

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

2992 "minute": "et minut", 

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

2994 "hour": "en time", 

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

2996 "day": "en dag", 

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

2998 "week": "en uge", 

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

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

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

3002 "year": "et år", 

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

3004 } 

3005 

3006 month_names = [ 

3007 "", 

3008 "januar", 

3009 "februar", 

3010 "marts", 

3011 "april", 

3012 "maj", 

3013 "juni", 

3014 "juli", 

3015 "august", 

3016 "september", 

3017 "oktober", 

3018 "november", 

3019 "december", 

3020 ] 

3021 month_abbreviations = [ 

3022 "", 

3023 "jan", 

3024 "feb", 

3025 "mar", 

3026 "apr", 

3027 "maj", 

3028 "jun", 

3029 "jul", 

3030 "aug", 

3031 "sep", 

3032 "okt", 

3033 "nov", 

3034 "dec", 

3035 ] 

3036 

3037 day_names = [ 

3038 "", 

3039 "mandag", 

3040 "tirsdag", 

3041 "onsdag", 

3042 "torsdag", 

3043 "fredag", 

3044 "lørdag", 

3045 "søndag", 

3046 ] 

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

3048 

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

3050 return f"{n}." 

3051 

3052 

3053class MalayalamLocale(Locale): 

3054 names = ["ml"] 

3055 

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

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

3058 

3059 timeframes = { 

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

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

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

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

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

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

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

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

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

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

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

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

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

3073 } 

3074 

3075 meridians = { 

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

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

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

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

3080 } 

3081 

3082 month_names = [ 

3083 "", 

3084 "ജനുവരി", 

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

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

3087 "ഏപ്രിൽ ", 

3088 "മെയ്‌ ", 

3089 "ജൂണ്‍", 

3090 "ജൂലൈ", 

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

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

3093 "ഒക്ടോബർ", 

3094 "നവംബർ", 

3095 "ഡിസംബർ", 

3096 ] 

3097 month_abbreviations = [ 

3098 "", 

3099 "ജനു", 

3100 "ഫെബ് ", 

3101 "മാർ", 

3102 "ഏപ്രിൽ", 

3103 "മേയ്", 

3104 "ജൂണ്‍", 

3105 "ജൂലൈ", 

3106 "ഓഗസ്റ", 

3107 "സെപ്റ്റ", 

3108 "ഒക്ടോ", 

3109 "നവം", 

3110 "ഡിസം", 

3111 ] 

3112 

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

3114 day_abbreviations = [ 

3115 "", 

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

3117 "ചൊവ്വ", 

3118 "ബുധന്‍", 

3119 "വ്യാഴം", 

3120 "വെള്ളി", 

3121 "ശനി", 

3122 "ഞായര്‍", 

3123 ] 

3124 

3125 

3126class HindiLocale(Locale): 

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

3128 

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

3130 future = "{0} बाद" 

3131 

3132 timeframes = { 

3133 "now": "अभी", 

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

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

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

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

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

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

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

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

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

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

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

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

3146 } 

3147 

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

3149 

3150 month_names = [ 

3151 "", 

3152 "जनवरी", 

3153 "फरवरी", 

3154 "मार्च", 

3155 "अप्रैल ", 

3156 "मई", 

3157 "जून", 

3158 "जुलाई", 

3159 "अगस्त", 

3160 "सितंबर", 

3161 "अक्टूबर", 

3162 "नवंबर", 

3163 "दिसंबर", 

3164 ] 

3165 month_abbreviations = [ 

3166 "", 

3167 "जन", 

3168 "फ़र", 

3169 "मार्च", 

3170 "अप्रै", 

3171 "मई", 

3172 "जून", 

3173 "जुलाई", 

3174 "आग", 

3175 "सित", 

3176 "अकत", 

3177 "नवे", 

3178 "दिस", 

3179 ] 

3180 

3181 day_names = [ 

3182 "", 

3183 "सोमवार", 

3184 "मंगलवार", 

3185 "बुधवार", 

3186 "गुरुवार", 

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

3188 "शनिवार", 

3189 "रविवार", 

3190 ] 

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

3192 

3193 

3194class CzechLocale(Locale): 

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

3196 

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

3198 "now": "Teď", 

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

3200 "seconds": { 

3201 "zero": "vteřina", 

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

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

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

3205 }, 

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

3207 "minutes": { 

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

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

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

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

3212 }, 

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

3214 "hours": { 

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

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

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

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

3219 }, 

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

3221 "days": { 

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

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

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

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

3226 }, 

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

3228 "weeks": { 

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

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

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

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

3233 }, 

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

3235 "months": { 

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

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

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

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

3240 }, 

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

3242 "years": { 

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

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

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

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

3247 }, 

3248 } 

3249 

3250 past = "Před {0}" 

3251 future = "Za {0}" 

3252 

3253 month_names = [ 

3254 "", 

3255 "leden", 

3256 "únor", 

3257 "březen", 

3258 "duben", 

3259 "květen", 

3260 "červen", 

3261 "červenec", 

3262 "srpen", 

3263 "září", 

3264 "říjen", 

3265 "listopad", 

3266 "prosinec", 

3267 ] 

3268 month_abbreviations = [ 

3269 "", 

3270 "led", 

3271 "úno", 

3272 "bře", 

3273 "dub", 

3274 "kvě", 

3275 "čvn", 

3276 "čvc", 

3277 "srp", 

3278 "zář", 

3279 "říj", 

3280 "lis", 

3281 "pro", 

3282 ] 

3283 

3284 day_names = [ 

3285 "", 

3286 "pondělí", 

3287 "úterý", 

3288 "středa", 

3289 "čtvrtek", 

3290 "pátek", 

3291 "sobota", 

3292 "neděle", 

3293 ] 

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

3295 

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

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

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

3299 abs_delta = abs(delta) 

3300 form = self.timeframes[timeframe] 

3301 

3302 if isinstance(form, str): 

3303 return form.format(abs_delta) 

3304 

3305 if delta == 0: 

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

3307 elif delta < 0: 

3308 key = "past" 

3309 else: 

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

3311 if "future-singular" not in form: 

3312 key = "future" 

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

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

3315 ): 

3316 key = "future-singular" 

3317 else: 

3318 key = "future-paucal" 

3319 

3320 form: str = form[key] 

3321 return form.format(abs_delta) 

3322 

3323 

3324class SlovakLocale(Locale): 

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

3326 

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

3328 "now": "Teraz", 

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

3330 "seconds": { 

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

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

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

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

3335 }, 

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

3337 "minutes": { 

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

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

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

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

3342 }, 

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

3344 "hours": { 

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

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

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

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

3349 }, 

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

3351 "days": { 

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

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

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

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

3356 }, 

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

3358 "weeks": { 

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

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

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

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

3363 }, 

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

3365 "months": { 

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

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

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

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

3370 }, 

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

3372 "years": { 

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

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

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

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

3377 }, 

3378 } 

3379 

3380 past = "Pred {0}" 

3381 future = "O {0}" 

3382 and_word = "a" 

3383 

3384 month_names = [ 

3385 "", 

3386 "január", 

3387 "február", 

3388 "marec", 

3389 "apríl", 

3390 "máj", 

3391 "jún", 

3392 "júl", 

3393 "august", 

3394 "september", 

3395 "október", 

3396 "november", 

3397 "december", 

3398 ] 

3399 month_abbreviations = [ 

3400 "", 

3401 "jan", 

3402 "feb", 

3403 "mar", 

3404 "apr", 

3405 "máj", 

3406 "jún", 

3407 "júl", 

3408 "aug", 

3409 "sep", 

3410 "okt", 

3411 "nov", 

3412 "dec", 

3413 ] 

3414 

3415 day_names = [ 

3416 "", 

3417 "pondelok", 

3418 "utorok", 

3419 "streda", 

3420 "štvrtok", 

3421 "piatok", 

3422 "sobota", 

3423 "nedeľa", 

3424 ] 

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

3426 

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

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

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

3430 abs_delta = abs(delta) 

3431 form = self.timeframes[timeframe] 

3432 

3433 if isinstance(form, str): 

3434 return form.format(abs_delta) 

3435 

3436 if delta == 0: 

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

3438 elif delta < 0: 

3439 key = "past" 

3440 else: 

3441 if "future-singular" not in form: 

3442 key = "future" 

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

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

3445 ): 

3446 key = "future-singular" 

3447 else: 

3448 key = "future-paucal" 

3449 

3450 form: str = form[key] 

3451 return form.format(abs_delta) 

3452 

3453 

3454class FarsiLocale(Locale): 

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

3456 

3457 past = "{0} قبل" 

3458 future = "در {0}" 

3459 

3460 timeframes = { 

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

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

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

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

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

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

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

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

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

3470 "week": "یک هفته", 

3471 "weeks": "{0} هفته", 

3472 "quarter": "یک فصل", 

3473 "quarters": "{0} فصل", 

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

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

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

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

3478 } 

3479 

3480 meridians = { 

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

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

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

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

3485 } 

3486 

3487 month_names = [ 

3488 "", 

3489 "ژانویه", 

3490 "فوریه", 

3491 "مارس", 

3492 "آوریل", 

3493 "مه", 

3494 "ژوئن", 

3495 "ژوئیه", 

3496 "اوت", 

3497 "سپتامبر", 

3498 "اکتبر", 

3499 "نوامبر", 

3500 "دسامبر", 

3501 ] 

3502 month_abbreviations = [ 

3503 "", 

3504 "ژانویه", 

3505 "فوریه", 

3506 "مارس", 

3507 "آوریل", 

3508 "مه", 

3509 "ژوئن", 

3510 "ژوئیه", 

3511 "اوت", 

3512 "سپتامبر", 

3513 "اکتبر", 

3514 "نوامبر", 

3515 "دسامبر", 

3516 ] 

3517 

3518 day_names = [ 

3519 "", 

3520 "دو شنبه", 

3521 "سه شنبه", 

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

3523 "پنجشنبه", 

3524 "جمعه", 

3525 "شنبه", 

3526 "یکشنبه", 

3527 ] 

3528 day_abbreviations = [ 

3529 "", 

3530 "دو شنبه", 

3531 "سه شنبه", 

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

3533 "پنجشنبه", 

3534 "جمعه", 

3535 "شنبه", 

3536 "یکشنبه", 

3537 ] 

3538 

3539 

3540class HebrewLocale(Locale): 

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

3542 

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

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

3545 and_word = "ו" 

3546 

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

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

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

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

3551 "minute": "דקה", 

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

3553 "hour": "שעה", 

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

3555 "day": "יום", 

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

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

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

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

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

3561 "year": "שנה", 

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

3563 } 

3564 

3565 meridians = { 

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

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

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

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

3570 } 

3571 

3572 month_names = [ 

3573 "", 

3574 "ינואר", 

3575 "פברואר", 

3576 "מרץ", 

3577 "אפריל", 

3578 "מאי", 

3579 "יוני", 

3580 "יולי", 

3581 "אוגוסט", 

3582 "ספטמבר", 

3583 "אוקטובר", 

3584 "נובמבר", 

3585 "דצמבר", 

3586 ] 

3587 month_abbreviations = [ 

3588 "", 

3589 "ינו׳", 

3590 "פבר׳", 

3591 "מרץ", 

3592 "אפר׳", 

3593 "מאי", 

3594 "יוני", 

3595 "יולי", 

3596 "אוג׳", 

3597 "ספט׳", 

3598 "אוק׳", 

3599 "נוב׳", 

3600 "דצמ׳", 

3601 ] 

3602 

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

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

3605 

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

3607 form = self.timeframes[timeframe] 

3608 delta = abs(delta) 

3609 if isinstance(form, Mapping): 

3610 if delta == 2: 

3611 form = form["2"] 

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

3613 form = form["ten"] 

3614 else: 

3615 form = form["higher"] 

3616 

3617 return form.format(delta) 

3618 

3619 def describe_multi( 

3620 self, 

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

3622 only_distance: bool = False, 

3623 ) -> str: 

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

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

3626 

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

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

3629 """ 

3630 

3631 humanized = "" 

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

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

3634 if index == 0: 

3635 humanized = last_humanized 

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

3637 humanized += " " + self.and_word 

3638 if last_humanized[0].isdecimal(): 

3639 humanized += "־" 

3640 humanized += last_humanized 

3641 else: # Don't add for the last one 

3642 humanized += ", " + last_humanized 

3643 

3644 if not only_distance: 

3645 humanized = self._format_relative(humanized, timeframe, trunc(delta)) 

3646 

3647 return humanized 

3648 

3649 

3650class MarathiLocale(Locale): 

3651 names = ["mr"] 

3652 

3653 past = "{0} आधी" 

3654 future = "{0} नंतर" 

3655 

3656 timeframes = { 

3657 "now": "सद्य", 

3658 "second": "एक सेकंद", 

3659 "seconds": "{0} सेकंद", 

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

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

3662 "hour": "एक तास", 

3663 "hours": "{0} तास", 

3664 "day": "एक दिवस", 

3665 "days": "{0} दिवस", 

3666 "month": "एक महिना ", 

3667 "months": "{0} महिने ", 

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

3669 "years": "{0} वर्ष ", 

3670 } 

3671 

3672 meridians = {"am": "सकाळ", "pm": "संध्याकाळ", "AM": "सकाळ", "PM": "संध्याकाळ"} 

3673 

3674 month_names = [ 

3675 "", 

3676 "जानेवारी", 

3677 "फेब्रुवारी", 

3678 "मार्च", 

3679 "एप्रिल", 

3680 "मे", 

3681 "जून", 

3682 "जुलै", 

3683 "अॉगस्ट", 

3684 "सप्टेंबर", 

3685 "अॉक्टोबर", 

3686 "नोव्हेंबर", 

3687 "डिसेंबर", 

3688 ] 

3689 month_abbreviations = [ 

3690 "", 

3691 "जान", 

3692 "फेब्रु", 

3693 "मार्च", 

3694 "एप्रि", 

3695 "मे", 

3696 "जून", 

3697 "जुलै", 

3698 "अॉग", 

3699 "सप्टें", 

3700 "अॉक्टो", 

3701 "नोव्हें", 

3702 "डिसें", 

3703 ] 

3704 

3705 day_names = [ 

3706 "", 

3707 "सोमवार", 

3708 "मंगळवार", 

3709 "बुधवार", 

3710 "गुरुवार", 

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

3712 "शनिवार", 

3713 "रविवार", 

3714 ] 

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

3716 

3717 

3718class CatalanLocale(Locale): 

3719 names = ["ca", "ca-es", "ca-ad", "ca-fr", "ca-it"] 

3720 past = "Fa {0}" 

3721 future = "En {0}" 

3722 and_word = "i" 

3723 

3724 timeframes = { 

3725 "now": "Ara mateix", 

3726 "second": "un segon", 

3727 "seconds": "{0} segons", 

3728 "minute": "un minut", 

3729 "minutes": "{0} minuts", 

3730 "hour": "una hora", 

3731 "hours": "{0} hores", 

3732 "day": "un dia", 

3733 "days": "{0} dies", 

3734 "week": "una setmana", 

3735 "weeks": "{0} setmanes", 

3736 "month": "un mes", 

3737 "months": "{0} mesos", 

3738 "year": "un any", 

3739 "years": "{0} anys", 

3740 } 

3741 

3742 month_names = [ 

3743 "", 

3744 "gener", 

3745 "febrer", 

3746 "març", 

3747 "abril", 

3748 "maig", 

3749 "juny", 

3750 "juliol", 

3751 "agost", 

3752 "setembre", 

3753 "octubre", 

3754 "novembre", 

3755 "desembre", 

3756 ] 

3757 month_abbreviations = [ 

3758 "", 

3759 "gen.", 

3760 "febr.", 

3761 "març", 

3762 "abr.", 

3763 "maig", 

3764 "juny", 

3765 "jul.", 

3766 "ag.", 

3767 "set.", 

3768 "oct.", 

3769 "nov.", 

3770 "des.", 

3771 ] 

3772 day_names = [ 

3773 "", 

3774 "dilluns", 

3775 "dimarts", 

3776 "dimecres", 

3777 "dijous", 

3778 "divendres", 

3779 "dissabte", 

3780 "diumenge", 

3781 ] 

3782 day_abbreviations = [ 

3783 "", 

3784 "dl.", 

3785 "dt.", 

3786 "dc.", 

3787 "dj.", 

3788 "dv.", 

3789 "ds.", 

3790 "dg.", 

3791 ] 

3792 

3793 

3794class BasqueLocale(Locale): 

3795 names = ["eu", "eu-eu"] 

3796 past = "duela {0}" 

3797 future = "{0}" # I don't know what's the right phrase in Basque for the future. 

3798 

3799 timeframes = { 

3800 "now": "Orain", 

3801 "second": "segundo bat", 

3802 "seconds": "{0} segundu", 

3803 "minute": "minutu bat", 

3804 "minutes": "{0} minutu", 

3805 "hour": "ordu bat", 

3806 "hours": "{0} ordu", 

3807 "day": "egun bat", 

3808 "days": "{0} egun", 

3809 "month": "hilabete bat", 

3810 "months": "{0} hilabet", 

3811 "year": "urte bat", 

3812 "years": "{0} urte", 

3813 } 

3814 

3815 month_names = [ 

3816 "", 

3817 "urtarrilak", 

3818 "otsailak", 

3819 "martxoak", 

3820 "apirilak", 

3821 "maiatzak", 

3822 "ekainak", 

3823 "uztailak", 

3824 "abuztuak", 

3825 "irailak", 

3826 "urriak", 

3827 "azaroak", 

3828 "abenduak", 

3829 ] 

3830 month_abbreviations = [ 

3831 "", 

3832 "urt", 

3833 "ots", 

3834 "mar", 

3835 "api", 

3836 "mai", 

3837 "eka", 

3838 "uzt", 

3839 "abu", 

3840 "ira", 

3841 "urr", 

3842 "aza", 

3843 "abe", 

3844 ] 

3845 day_names = [ 

3846 "", 

3847 "astelehena", 

3848 "asteartea", 

3849 "asteazkena", 

3850 "osteguna", 

3851 "ostirala", 

3852 "larunbata", 

3853 "igandea", 

3854 ] 

3855 day_abbreviations = ["", "al", "ar", "az", "og", "ol", "lr", "ig"] 

3856 

3857 

3858class HungarianLocale(Locale): 

3859 names = ["hu", "hu-hu"] 

3860 

3861 past = "{0} ezelőtt" 

3862 future = "{0} múlva" 

3863 

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

3865 "now": "éppen most", 

3866 "second": {"past": "egy második", "future": "egy második"}, 

3867 "seconds": {"past": "{0} másodpercekkel", "future": "{0} pár másodperc"}, 

3868 "minute": {"past": "egy perccel", "future": "egy perc"}, 

3869 "minutes": {"past": "{0} perccel", "future": "{0} perc"}, 

3870 "hour": {"past": "egy órával", "future": "egy óra"}, 

3871 "hours": {"past": "{0} órával", "future": "{0} óra"}, 

3872 "day": {"past": "egy nappal", "future": "egy nap"}, 

3873 "days": {"past": "{0} nappal", "future": "{0} nap"}, 

3874 "week": {"past": "egy héttel", "future": "egy hét"}, 

3875 "weeks": {"past": "{0} héttel", "future": "{0} hét"}, 

3876 "month": {"past": "egy hónappal", "future": "egy hónap"}, 

3877 "months": {"past": "{0} hónappal", "future": "{0} hónap"}, 

3878 "year": {"past": "egy évvel", "future": "egy év"}, 

3879 "years": {"past": "{0} évvel", "future": "{0} év"}, 

3880 } 

3881 

3882 month_names = [ 

3883 "", 

3884 "január", 

3885 "február", 

3886 "március", 

3887 "április", 

3888 "május", 

3889 "június", 

3890 "július", 

3891 "augusztus", 

3892 "szeptember", 

3893 "október", 

3894 "november", 

3895 "december", 

3896 ] 

3897 month_abbreviations = [ 

3898 "", 

3899 "jan", 

3900 "febr", 

3901 "márc", 

3902 "ápr", 

3903 "máj", 

3904 "jún", 

3905 "júl", 

3906 "aug", 

3907 "szept", 

3908 "okt", 

3909 "nov", 

3910 "dec", 

3911 ] 

3912 

3913 day_names = [ 

3914 "", 

3915 "hétfő", 

3916 "kedd", 

3917 "szerda", 

3918 "csütörtök", 

3919 "péntek", 

3920 "szombat", 

3921 "vasárnap", 

3922 ] 

3923 day_abbreviations = ["", "hét", "kedd", "szer", "csüt", "pént", "szom", "vas"] 

3924 

3925 meridians = {"am": "de", "pm": "du", "AM": "DE", "PM": "DU"} 

3926 

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

3928 form = self.timeframes[timeframe] 

3929 

3930 if isinstance(form, Mapping): 

3931 if delta > 0: 

3932 form = form["future"] 

3933 else: 

3934 form = form["past"] 

3935 

3936 return form.format(abs(delta)) 

3937 

3938 

3939class EsperantoLocale(Locale): 

3940 names = ["eo", "eo-xx"] 

3941 past = "antaŭ {0}" 

3942 future = "post {0}" 

3943 

3944 timeframes = { 

3945 "now": "nun", 

3946 "second": "sekundo", 

3947 "seconds": "{0} kelkaj sekundoj", 

3948 "minute": "unu minuto", 

3949 "minutes": "{0} minutoj", 

3950 "hour": "un horo", 

3951 "hours": "{0} horoj", 

3952 "day": "unu tago", 

3953 "days": "{0} tagoj", 

3954 "month": "unu monato", 

3955 "months": "{0} monatoj", 

3956 "year": "unu jaro", 

3957 "years": "{0} jaroj", 

3958 } 

3959 

3960 month_names = [ 

3961 "", 

3962 "januaro", 

3963 "februaro", 

3964 "marto", 

3965 "aprilo", 

3966 "majo", 

3967 "junio", 

3968 "julio", 

3969 "aŭgusto", 

3970 "septembro", 

3971 "oktobro", 

3972 "novembro", 

3973 "decembro", 

3974 ] 

3975 month_abbreviations = [ 

3976 "", 

3977 "jan", 

3978 "feb", 

3979 "mar", 

3980 "apr", 

3981 "maj", 

3982 "jun", 

3983 "jul", 

3984 "aŭg", 

3985 "sep", 

3986 "okt", 

3987 "nov", 

3988 "dec", 

3989 ] 

3990 

3991 day_names = [ 

3992 "", 

3993 "lundo", 

3994 "mardo", 

3995 "merkredo", 

3996 "ĵaŭdo", 

3997 "vendredo", 

3998 "sabato", 

3999 "dimanĉo", 

4000 ] 

4001 day_abbreviations = ["", "lun", "mar", "mer", "ĵaŭ", "ven", "sab", "dim"] 

4002 

4003 meridians = {"am": "atm", "pm": "ptm", "AM": "ATM", "PM": "PTM"} 

4004 

4005 ordinal_day_re = r"((?P<value>[1-3]?[0-9](?=a))a)" 

4006 

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

4008 return f"{n}a" 

4009 

4010 

4011class ThaiLocale(Locale): 

4012 names = ["th", "th-th"] 

4013 

4014 past = "{0} ที่ผ่านมา" 

4015 future = "ในอีก {0}" 

4016 

4017 timeframes = { 

4018 "now": "ขณะนี้", 

4019 "second": "วินาที", 

4020 "seconds": "{0} วินาที", 

4021 "minute": "นาที", 

4022 "minutes": "{0} นาที", 

4023 "hour": "ชั่วโมง", 

4024 "hours": "{0} ชั่วโมง", 

4025 "day": "วัน", 

4026 "days": "{0} วัน", 

4027 "week": "สัปดาห์", 

4028 "weeks": "{0} สัปดาห์", 

4029 "month": "เดือน", 

4030 "months": "{0} เดือน", 

4031 "year": "ปี", 

4032 "years": "{0} ปี", 

4033 } 

4034 

4035 month_names = [ 

4036 "", 

4037 "มกราคม", 

4038 "กุมภาพันธ์", 

4039 "มีนาคม", 

4040 "เมษายน", 

4041 "พฤษภาคม", 

4042 "มิถุนายน", 

4043 "กรกฎาคม", 

4044 "สิงหาคม", 

4045 "กันยายน", 

4046 "ตุลาคม", 

4047 "พฤศจิกายน", 

4048 "ธันวาคม", 

4049 ] 

4050 month_abbreviations = [ 

4051 "", 

4052 "ม.ค.", 

4053 "ก.พ.", 

4054 "มี.ค.", 

4055 "เม.ย.", 

4056 "พ.ค.", 

4057 "มิ.ย.", 

4058 "ก.ค.", 

4059 "ส.ค.", 

4060 "ก.ย.", 

4061 "ต.ค.", 

4062 "พ.ย.", 

4063 "ธ.ค.", 

4064 ] 

4065 

4066 day_names = [ 

4067 "", 

4068 "วันจันทร์", 

4069 "วันอังคาร", 

4070 "วันพุธ", 

4071 "วันพฤหัสบดี", 

4072 "วันศุกร์", 

4073 "วันเสาร์", 

4074 "วันอาทิตย์", 

4075 ] 

4076 day_abbreviations = ["", "จ.", "อ.", "พ.", "พฤ.", "ศ.", "ส.", "อา."] 

4077 

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

4079 

4080 BE_OFFSET = 543 

4081 

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

4083 """Thai always use Buddhist Era (BE) which is CE + 543""" 

4084 year += self.BE_OFFSET 

4085 return f"{year:04d}" 

4086 

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

4088 """Thai always use Buddhist Era (BE) which is CE + 543""" 

4089 year += self.BE_OFFSET 

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

4091 

4092 def _format_relative( 

4093 self, 

4094 humanized: str, 

4095 timeframe: TimeFrameLiteral, 

4096 delta: Union[float, int], 

4097 ) -> str: 

4098 """Thai normally doesn't have any space between words""" 

4099 if timeframe == "now": 

4100 return humanized 

4101 

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

4103 relative_string = direction.format(humanized) 

4104 

4105 if timeframe == "seconds": 

4106 relative_string = relative_string.replace(" ", "") 

4107 

4108 return relative_string 

4109 

4110 

4111class LaotianLocale(Locale): 

4112 names = ["lo", "lo-la"] 

4113 

4114 past = "{0} ກ່ອນຫນ້ານີ້" 

4115 future = "ໃນ {0}" 

4116 

4117 timeframes = { 

4118 "now": "ດຽວນີ້", 

4119 "second": "ວິນາທີ", 

4120 "seconds": "{0} ວິນາທີ", 

4121 "minute": "ນາທີ", 

4122 "minutes": "{0} ນາທີ", 

4123 "hour": "ຊົ່ວໂມງ", 

4124 "hours": "{0} ຊົ່ວໂມງ", 

4125 "day": "ມື້", 

4126 "days": "{0} ມື້", 

4127 "week": "ອາທິດ", 

4128 "weeks": "{0} ອາທິດ", 

4129 "month": "ເດືອນ", 

4130 "months": "{0} ເດືອນ", 

4131 "year": "ປີ", 

4132 "years": "{0} ປີ", 

4133 } 

4134 

4135 month_names = [ 

4136 "", 

4137 "ມັງກອນ", # mangkon 

4138 "ກຸມພາ", # kumpha 

4139 "ມີນາ", # mina 

4140 "ເມສາ", # mesa 

4141 "ພຶດສະພາ", # phudsapha 

4142 "ມິຖຸນາ", # mithuna 

4143 "ກໍລະກົດ", # kolakod 

4144 "ສິງຫາ", # singha 

4145 "ກັນຍາ", # knaia 

4146 "ຕຸລາ", # tula 

4147 "ພະຈິກ", # phachik 

4148 "ທັນວາ", # thanuaa 

4149 ] 

4150 month_abbreviations = [ 

4151 "", 

4152 "ມັງກອນ", 

4153 "ກຸມພາ", 

4154 "ມີນາ", 

4155 "ເມສາ", 

4156 "ພຶດສະພາ", 

4157 "ມິຖຸນາ", 

4158 "ກໍລະກົດ", 

4159 "ສິງຫາ", 

4160 "ກັນຍາ", 

4161 "ຕຸລາ", 

4162 "ພະຈິກ", 

4163 "ທັນວາ", 

4164 ] 

4165 

4166 day_names = [ 

4167 "", 

4168 "ວັນຈັນ", # vanchan 

4169 "ວັນອັງຄານ", # vnoangkhan 

4170 "ວັນພຸດ", # vanphud 

4171 "ວັນພະຫັດ", # vanphahad 

4172 "ວັນ​ສຸກ", # vansuk 

4173 "ວັນເສົາ", # vansao 

4174 "ວັນອາທິດ", # vnoathid 

4175 ] 

4176 day_abbreviations = [ 

4177 "", 

4178 "ວັນຈັນ", 

4179 "ວັນອັງຄານ", 

4180 "ວັນພຸດ", 

4181 "ວັນພະຫັດ", 

4182 "ວັນ​ສຸກ", 

4183 "ວັນເສົາ", 

4184 "ວັນອາທິດ", 

4185 ] 

4186 

4187 BE_OFFSET = 543 

4188 

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

4190 """Lao always use Buddhist Era (BE) which is CE + 543""" 

4191 year += self.BE_OFFSET 

4192 return f"{year:04d}" 

4193 

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

4195 """Lao always use Buddhist Era (BE) which is CE + 543""" 

4196 year += self.BE_OFFSET 

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

4198 

4199 def _format_relative( 

4200 self, 

4201 humanized: str, 

4202 timeframe: TimeFrameLiteral, 

4203 delta: Union[float, int], 

4204 ) -> str: 

4205 """Lao normally doesn't have any space between words""" 

4206 if timeframe == "now": 

4207 return humanized 

4208 

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

4210 relative_string = direction.format(humanized) 

4211 

4212 if timeframe == "seconds": 

4213 relative_string = relative_string.replace(" ", "") 

4214 

4215 return relative_string 

4216 

4217 

4218class BengaliLocale(Locale): 

4219 names = ["bn", "bn-bd", "bn-in"] 

4220 

4221 past = "{0} আগে" 

4222 future = "{0} পরে" 

4223 

4224 timeframes = { 

4225 "now": "এখন", 

4226 "second": "একটি দ্বিতীয়", 

4227 "seconds": "{0} সেকেন্ড", 

4228 "minute": "এক মিনিট", 

4229 "minutes": "{0} মিনিট", 

4230 "hour": "এক ঘণ্টা", 

4231 "hours": "{0} ঘণ্টা", 

4232 "day": "এক দিন", 

4233 "days": "{0} দিন", 

4234 "month": "এক মাস", 

4235 "months": "{0} মাস ", 

4236 "year": "এক বছর", 

4237 "years": "{0} বছর", 

4238 } 

4239 

4240 meridians = {"am": "সকাল", "pm": "বিকাল", "AM": "সকাল", "PM": "বিকাল"} 

4241 

4242 month_names = [ 

4243 "", 

4244 "জানুয়ারি", 

4245 "ফেব্রুয়ারি", 

4246 "মার্চ", 

4247 "এপ্রিল", 

4248 "মে", 

4249 "জুন", 

4250 "জুলাই", 

4251 "আগস্ট", 

4252 "সেপ্টেম্বর", 

4253 "অক্টোবর", 

4254 "নভেম্বর", 

4255 "ডিসেম্বর", 

4256 ] 

4257 month_abbreviations = [ 

4258 "", 

4259 "জানু", 

4260 "ফেব", 

4261 "মার্চ", 

4262 "এপ্রি", 

4263 "মে", 

4264 "জুন", 

4265 "জুল", 

4266 "অগা", 

4267 "সেপ্ট", 

4268 "অক্টো", 

4269 "নভে", 

4270 "ডিসে", 

4271 ] 

4272 

4273 day_names = [ 

4274 "", 

4275 "সোমবার", 

4276 "মঙ্গলবার", 

4277 "বুধবার", 

4278 "বৃহস্পতিবার", 

4279 "শুক্রবার", 

4280 "শনিবার", 

4281 "রবিবার", 

4282 ] 

4283 day_abbreviations = ["", "সোম", "মঙ্গল", "বুধ", "বৃহঃ", "শুক্র", "শনি", "রবি"] 

4284 

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

4286 if n > 10 or n == 0: 

4287 return f"{n}তম" 

4288 if n in [1, 5, 7, 8, 9, 10]: 

4289 return f"{n}ম" 

4290 if n in [2, 3]: 

4291 return f"{n}য়" 

4292 if n == 4: 

4293 return f"{n}র্থ" 

4294 if n == 6: 

4295 return f"{n}ষ্ঠ" 

4296 return "" 

4297 

4298 

4299class RomanshLocale(Locale): 

4300 names = ["rm", "rm-ch"] 

4301 

4302 past = "avant {0}" 

4303 future = "en {0}" 

4304 

4305 timeframes = { 

4306 "now": "en quest mument", 

4307 "second": "in secunda", 

4308 "seconds": "{0} secundas", 

4309 "minute": "ina minuta", 

4310 "minutes": "{0} minutas", 

4311 "hour": "in'ura", 

4312 "hours": "{0} ura", 

4313 "day": "in di", 

4314 "days": "{0} dis", 

4315 "week": "in'emna", 

4316 "weeks": "{0} emnas", 

4317 "month": "in mais", 

4318 "months": "{0} mais", 

4319 "year": "in onn", 

4320 "years": "{0} onns", 

4321 } 

4322 

4323 month_names = [ 

4324 "", 

4325 "schaner", 

4326 "favrer", 

4327 "mars", 

4328 "avrigl", 

4329 "matg", 

4330 "zercladur", 

4331 "fanadur", 

4332 "avust", 

4333 "settember", 

4334 "october", 

4335 "november", 

4336 "december", 

4337 ] 

4338 

4339 month_abbreviations = [ 

4340 "", 

4341 "schan", 

4342 "fav", 

4343 "mars", 

4344 "avr", 

4345 "matg", 

4346 "zer", 

4347 "fan", 

4348 "avu", 

4349 "set", 

4350 "oct", 

4351 "nov", 

4352 "dec", 

4353 ] 

4354 

4355 day_names = [ 

4356 "", 

4357 "glindesdi", 

4358 "mardi", 

4359 "mesemna", 

4360 "gievgia", 

4361 "venderdi", 

4362 "sonda", 

4363 "dumengia", 

4364 ] 

4365 

4366 day_abbreviations = ["", "gli", "ma", "me", "gie", "ve", "so", "du"] 

4367 

4368 

4369class RomanianLocale(Locale): 

4370 names = ["ro", "ro-ro"] 

4371 

4372 past = "{0} în urmă" 

4373 future = "peste {0}" 

4374 and_word = "și" 

4375 

4376 timeframes = { 

4377 "now": "acum", 

4378 "second": "o secunda", 

4379 "seconds": "{0} câteva secunde", 

4380 "minute": "un minut", 

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

4382 "hour": "o oră", 

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

4384 "day": "o zi", 

4385 "days": "{0} zile", 

4386 "month": "o lună", 

4387 "months": "{0} luni", 

4388 "year": "un an", 

4389 "years": "{0} ani", 

4390 } 

4391 

4392 month_names = [ 

4393 "", 

4394 "ianuarie", 

4395 "februarie", 

4396 "martie", 

4397 "aprilie", 

4398 "mai", 

4399 "iunie", 

4400 "iulie", 

4401 "august", 

4402 "septembrie", 

4403 "octombrie", 

4404 "noiembrie", 

4405 "decembrie", 

4406 ] 

4407 month_abbreviations = [ 

4408 "", 

4409 "ian", 

4410 "febr", 

4411 "mart", 

4412 "apr", 

4413 "mai", 

4414 "iun", 

4415 "iul", 

4416 "aug", 

4417 "sept", 

4418 "oct", 

4419 "nov", 

4420 "dec", 

4421 ] 

4422 

4423 day_names = [ 

4424 "", 

4425 "luni", 

4426 "marți", 

4427 "miercuri", 

4428 "joi", 

4429 "vineri", 

4430 "sâmbătă", 

4431 "duminică", 

4432 ] 

4433 day_abbreviations = ["", "Lun", "Mar", "Mie", "Joi", "Vin", "Sâm", "Dum"] 

4434 

4435 

4436class SlovenianLocale(Locale): 

4437 names = ["sl", "sl-si"] 

4438 

4439 past = "pred {0}" 

4440 future = "čez {0}" 

4441 and_word = "in" 

4442 

4443 timeframes = { 

4444 "now": "zdaj", 

4445 "second": "sekundo", 

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

4447 "minute": "minuta", 

4448 "minutes": "{0} minutami", 

4449 "hour": "uro", 

4450 "hours": "{0} ur", 

4451 "day": "dan", 

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

4453 "month": "mesec", 

4454 "months": "{0} mesecev", 

4455 "year": "leto", 

4456 "years": "{0} let", 

4457 } 

4458 

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

4460 

4461 month_names = [ 

4462 "", 

4463 "Januar", 

4464 "Februar", 

4465 "Marec", 

4466 "April", 

4467 "Maj", 

4468 "Junij", 

4469 "Julij", 

4470 "Avgust", 

4471 "September", 

4472 "Oktober", 

4473 "November", 

4474 "December", 

4475 ] 

4476 

4477 month_abbreviations = [ 

4478 "", 

4479 "Jan", 

4480 "Feb", 

4481 "Mar", 

4482 "Apr", 

4483 "Maj", 

4484 "Jun", 

4485 "Jul", 

4486 "Avg", 

4487 "Sep", 

4488 "Okt", 

4489 "Nov", 

4490 "Dec", 

4491 ] 

4492 

4493 day_names = [ 

4494 "", 

4495 "Ponedeljek", 

4496 "Torek", 

4497 "Sreda", 

4498 "Četrtek", 

4499 "Petek", 

4500 "Sobota", 

4501 "Nedelja", 

4502 ] 

4503 

4504 day_abbreviations = ["", "Pon", "Tor", "Sre", "Čet", "Pet", "Sob", "Ned"] 

4505 

4506 

4507class IndonesianLocale(Locale): 

4508 names = ["id", "id-id"] 

4509 

4510 past = "{0} yang lalu" 

4511 future = "dalam {0}" 

4512 and_word = "dan" 

4513 

4514 timeframes = { 

4515 "now": "baru saja", 

4516 "second": "1 sebentar", 

4517 "seconds": "{0} detik", 

4518 "minute": "1 menit", 

4519 "minutes": "{0} menit", 

4520 "hour": "1 jam", 

4521 "hours": "{0} jam", 

4522 "day": "1 hari", 

4523 "days": "{0} hari", 

4524 "week": "1 minggu", 

4525 "weeks": "{0} minggu", 

4526 "month": "1 bulan", 

4527 "months": "{0} bulan", 

4528 "quarter": "1 kuartal", 

4529 "quarters": "{0} kuartal", 

4530 "year": "1 tahun", 

4531 "years": "{0} tahun", 

4532 } 

4533 

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

4535 

4536 month_names = [ 

4537 "", 

4538 "Januari", 

4539 "Februari", 

4540 "Maret", 

4541 "April", 

4542 "Mei", 

4543 "Juni", 

4544 "Juli", 

4545 "Agustus", 

4546 "September", 

4547 "Oktober", 

4548 "November", 

4549 "Desember", 

4550 ] 

4551 

4552 month_abbreviations = [ 

4553 "", 

4554 "Jan", 

4555 "Feb", 

4556 "Mar", 

4557 "Apr", 

4558 "Mei", 

4559 "Jun", 

4560 "Jul", 

4561 "Ags", 

4562 "Sept", 

4563 "Okt", 

4564 "Nov", 

4565 "Des", 

4566 ] 

4567 

4568 day_names = ["", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu", "Minggu"] 

4569 

4570 day_abbreviations = [ 

4571 "", 

4572 "Senin", 

4573 "Selasa", 

4574 "Rabu", 

4575 "Kamis", 

4576 "Jumat", 

4577 "Sabtu", 

4578 "Minggu", 

4579 ] 

4580 

4581 

4582class NepaliLocale(Locale): 

4583 names = ["ne", "ne-np"] 

4584 

4585 past = "{0} पहिले" 

4586 future = "{0} पछी" 

4587 

4588 timeframes = { 

4589 "now": "अहिले", 

4590 "second": "एक सेकेन्ड", 

4591 "seconds": "{0} सेकण्ड", 

4592 "minute": "मिनेट", 

4593 "minutes": "{0} मिनेट", 

4594 "hour": "एक घण्टा", 

4595 "hours": "{0} घण्टा", 

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

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

4598 "month": "एक महिना", 

4599 "months": "{0} महिना", 

4600 "year": "एक बर्ष", 

4601 "years": "{0} बर्ष", 

4602 } 

4603 

4604 meridians = {"am": "पूर्वाह्न", "pm": "अपरान्ह", "AM": "पूर्वाह्न", "PM": "अपरान्ह"} 

4605 

4606 month_names = [ 

4607 "", 

4608 "जनवरी", 

4609 "फेब्रुअरी", 

4610 "मार्च", 

4611 "एप्रील", 

4612 "मे", 

4613 "जुन", 

4614 "जुलाई", 

4615 "अगष्ट", 

4616 "सेप्टेम्बर", 

4617 "अक्टोबर", 

4618 "नोवेम्बर", 

4619 "डिसेम्बर", 

4620 ] 

4621 month_abbreviations = [ 

4622 "", 

4623 "जन", 

4624 "फेब", 

4625 "मार्च", 

4626 "एप्रील", 

4627 "मे", 

4628 "जुन", 

4629 "जुलाई", 

4630 "अग", 

4631 "सेप", 

4632 "अक्ट", 

4633 "नोव", 

4634 "डिस", 

4635 ] 

4636 

4637 day_names = [ 

4638 "", 

4639 "सोमवार", 

4640 "मंगलवार", 

4641 "बुधवार", 

4642 "बिहिवार", 

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

4644 "शनिवार", 

4645 "आइतवार", 

4646 ] 

4647 

4648 day_abbreviations = ["", "सोम", "मंगल", "बुध", "बिहि", "शुक्र", "शनि", "आइत"] 

4649 

4650 

4651class EstonianLocale(Locale): 

4652 names = ["ee", "et"] 

4653 

4654 past = "{0} tagasi" 

4655 future = "{0} pärast" 

4656 and_word = "ja" 

4657 

4658 timeframes: ClassVar[Mapping[TimeFrameLiteral, Mapping[str, str]]] = { 

4659 "now": {"past": "just nüüd", "future": "just nüüd"}, 

4660 "second": {"past": "üks sekund", "future": "ühe sekundi"}, 

4661 "seconds": {"past": "{0} sekundit", "future": "{0} sekundi"}, 

4662 "minute": {"past": "üks minut", "future": "ühe minuti"}, 

4663 "minutes": {"past": "{0} minutit", "future": "{0} minuti"}, 

4664 "hour": {"past": "tund aega", "future": "tunni aja"}, 

4665 "hours": {"past": "{0} tundi", "future": "{0} tunni"}, 

4666 "day": {"past": "üks päev", "future": "ühe päeva"}, 

4667 "days": {"past": "{0} päeva", "future": "{0} päeva"}, 

4668 "month": {"past": "üks kuu", "future": "ühe kuu"}, 

4669 "months": {"past": "{0} kuud", "future": "{0} kuu"}, 

4670 "year": {"past": "üks aasta", "future": "ühe aasta"}, 

4671 "years": {"past": "{0} aastat", "future": "{0} aasta"}, 

4672 } 

4673 

4674 month_names = [ 

4675 "", 

4676 "Jaanuar", 

4677 "Veebruar", 

4678 "Märts", 

4679 "Aprill", 

4680 "Mai", 

4681 "Juuni", 

4682 "Juuli", 

4683 "August", 

4684 "September", 

4685 "Oktoober", 

4686 "November", 

4687 "Detsember", 

4688 ] 

4689 month_abbreviations = [ 

4690 "", 

4691 "Jan", 

4692 "Veb", 

4693 "Mär", 

4694 "Apr", 

4695 "Mai", 

4696 "Jun", 

4697 "Jul", 

4698 "Aug", 

4699 "Sep", 

4700 "Okt", 

4701 "Nov", 

4702 "Dets", 

4703 ] 

4704 

4705 day_names = [ 

4706 "", 

4707 "Esmaspäev", 

4708 "Teisipäev", 

4709 "Kolmapäev", 

4710 "Neljapäev", 

4711 "Reede", 

4712 "Laupäev", 

4713 "Pühapäev", 

4714 ] 

4715 day_abbreviations = ["", "Esm", "Teis", "Kolm", "Nelj", "Re", "Lau", "Püh"] 

4716 

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

4718 form = self.timeframes[timeframe] 

4719 if delta > 0: 

4720 _form = form["future"] 

4721 else: 

4722 _form = form["past"] 

4723 return _form.format(abs(delta)) 

4724 

4725 

4726class LatvianLocale(Locale): 

4727 names = ["lv", "lv-lv"] 

4728 

4729 past = "pirms {0}" 

4730 future = "pēc {0}" 

4731 and_word = "un" 

4732 

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

4734 "now": "tagad", 

4735 "second": "sekundes", 

4736 "seconds": "{0} sekundēm", 

4737 "minute": "minūtes", 

4738 "minutes": "{0} minūtēm", 

4739 "hour": "stundas", 

4740 "hours": "{0} stundām", 

4741 "day": "dienas", 

4742 "days": "{0} dienām", 

4743 "week": "nedēļas", 

4744 "weeks": "{0} nedēļām", 

4745 "month": "mēneša", 

4746 "months": "{0} mēnešiem", 

4747 "year": "gada", 

4748 "years": "{0} gadiem", 

4749 } 

4750 

4751 month_names = [ 

4752 "", 

4753 "janvāris", 

4754 "februāris", 

4755 "marts", 

4756 "aprīlis", 

4757 "maijs", 

4758 "jūnijs", 

4759 "jūlijs", 

4760 "augusts", 

4761 "septembris", 

4762 "oktobris", 

4763 "novembris", 

4764 "decembris", 

4765 ] 

4766 

4767 month_abbreviations = [ 

4768 "", 

4769 "jan", 

4770 "feb", 

4771 "marts", 

4772 "apr", 

4773 "maijs", 

4774 "jūnijs", 

4775 "jūlijs", 

4776 "aug", 

4777 "sept", 

4778 "okt", 

4779 "nov", 

4780 "dec", 

4781 ] 

4782 

4783 day_names = [ 

4784 "", 

4785 "pirmdiena", 

4786 "otrdiena", 

4787 "trešdiena", 

4788 "ceturtdiena", 

4789 "piektdiena", 

4790 "sestdiena", 

4791 "svētdiena", 

4792 ] 

4793 

4794 day_abbreviations = [ 

4795 "", 

4796 "pi", 

4797 "ot", 

4798 "tr", 

4799 "ce", 

4800 "pi", 

4801 "se", 

4802 "sv", 

4803 ] 

4804 

4805 

4806class SwahiliLocale(Locale): 

4807 names = [ 

4808 "sw", 

4809 "sw-ke", 

4810 "sw-tz", 

4811 ] 

4812 

4813 past = "{0} iliyopita" 

4814 future = "muda wa {0}" 

4815 and_word = "na" 

4816 

4817 timeframes = { 

4818 "now": "sasa hivi", 

4819 "second": "sekunde", 

4820 "seconds": "sekunde {0}", 

4821 "minute": "dakika moja", 

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

4823 "hour": "saa moja", 

4824 "hours": "saa {0}", 

4825 "day": "siku moja", 

4826 "days": "siku {0}", 

4827 "week": "wiki moja", 

4828 "weeks": "wiki {0}", 

4829 "month": "mwezi moja", 

4830 "months": "miezi {0}", 

4831 "year": "mwaka moja", 

4832 "years": "miaka {0}", 

4833 } 

4834 

4835 meridians = {"am": "asu", "pm": "mch", "AM": "ASU", "PM": "MCH"} 

4836 

4837 month_names = [ 

4838 "", 

4839 "Januari", 

4840 "Februari", 

4841 "Machi", 

4842 "Aprili", 

4843 "Mei", 

4844 "Juni", 

4845 "Julai", 

4846 "Agosti", 

4847 "Septemba", 

4848 "Oktoba", 

4849 "Novemba", 

4850 "Desemba", 

4851 ] 

4852 month_abbreviations = [ 

4853 "", 

4854 "Jan", 

4855 "Feb", 

4856 "Mac", 

4857 "Apr", 

4858 "Mei", 

4859 "Jun", 

4860 "Jul", 

4861 "Ago", 

4862 "Sep", 

4863 "Okt", 

4864 "Nov", 

4865 "Des", 

4866 ] 

4867 

4868 day_names = [ 

4869 "", 

4870 "Jumatatu", 

4871 "Jumanne", 

4872 "Jumatano", 

4873 "Alhamisi", 

4874 "Ijumaa", 

4875 "Jumamosi", 

4876 "Jumapili", 

4877 ] 

4878 day_abbreviations = [ 

4879 "", 

4880 "Jumatatu", 

4881 "Jumanne", 

4882 "Jumatano", 

4883 "Alhamisi", 

4884 "Ijumaa", 

4885 "Jumamosi", 

4886 "Jumapili", 

4887 ] 

4888 

4889 

4890class CroatianLocale(Locale): 

4891 names = ["hr", "hr-hr"] 

4892 

4893 past = "prije {0}" 

4894 future = "za {0}" 

4895 and_word = "i" 

4896 

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

4898 "now": "upravo sad", 

4899 "second": "sekundu", 

4900 "seconds": {"double": "{0} sekunde", "higher": "{0} sekundi"}, 

4901 "minute": "minutu", 

4902 "minutes": {"double": "{0} minute", "higher": "{0} minuta"}, 

4903 "hour": "sat", 

4904 "hours": {"double": "{0} sata", "higher": "{0} sati"}, 

4905 "day": "jedan dan", 

4906 "days": {"double": "{0} dana", "higher": "{0} dana"}, 

4907 "week": "tjedan", 

4908 "weeks": {"double": "{0} tjedna", "higher": "{0} tjedana"}, 

4909 "month": "mjesec", 

4910 "months": {"double": "{0} mjeseca", "higher": "{0} mjeseci"}, 

4911 "year": "godinu", 

4912 "years": {"double": "{0} godine", "higher": "{0} godina"}, 

4913 } 

4914 

4915 month_names = [ 

4916 "", 

4917 "siječanj", 

4918 "veljača", 

4919 "ožujak", 

4920 "travanj", 

4921 "svibanj", 

4922 "lipanj", 

4923 "srpanj", 

4924 "kolovoz", 

4925 "rujan", 

4926 "listopad", 

4927 "studeni", 

4928 "prosinac", 

4929 ] 

4930 

4931 month_abbreviations = [ 

4932 "", 

4933 "siječ", 

4934 "velj", 

4935 "ožuj", 

4936 "trav", 

4937 "svib", 

4938 "lip", 

4939 "srp", 

4940 "kol", 

4941 "ruj", 

4942 "list", 

4943 "stud", 

4944 "pros", 

4945 ] 

4946 

4947 day_names = [ 

4948 "", 

4949 "ponedjeljak", 

4950 "utorak", 

4951 "srijeda", 

4952 "četvrtak", 

4953 "petak", 

4954 "subota", 

4955 "nedjelja", 

4956 ] 

4957 

4958 day_abbreviations = [ 

4959 "", 

4960 "po", 

4961 "ut", 

4962 "sr", 

4963 "če", 

4964 "pe", 

4965 "su", 

4966 "ne", 

4967 ] 

4968 

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

4970 form = self.timeframes[timeframe] 

4971 delta = abs(delta) 

4972 if isinstance(form, Mapping): 

4973 if 1 < delta <= 4: 

4974 form = form["double"] 

4975 else: 

4976 form = form["higher"] 

4977 

4978 return form.format(delta) 

4979 

4980 

4981class LatinLocale(Locale): 

4982 names = ["la", "la-va"] 

4983 

4984 past = "ante {0}" 

4985 future = "in {0}" 

4986 and_word = "et" 

4987 

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

4989 "now": "nunc", 

4990 "second": "secundum", 

4991 "seconds": "{0} secundis", 

4992 "minute": "minutam", 

4993 "minutes": "{0} minutis", 

4994 "hour": "horam", 

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

4996 "day": "diem", 

4997 "days": "{0} dies", 

4998 "week": "hebdomadem", 

4999 "weeks": "{0} hebdomades", 

5000 "month": "mensem", 

5001 "months": "{0} mensis", 

5002 "year": "annum", 

5003 "years": "{0} annos", 

5004 } 

5005 

5006 month_names = [ 

5007 "", 

5008 "Ianuarius", 

5009 "Februarius", 

5010 "Martius", 

5011 "Aprilis", 

5012 "Maius", 

5013 "Iunius", 

5014 "Iulius", 

5015 "Augustus", 

5016 "September", 

5017 "October", 

5018 "November", 

5019 "December", 

5020 ] 

5021 

5022 month_abbreviations = [ 

5023 "", 

5024 "Ian", 

5025 "Febr", 

5026 "Mart", 

5027 "Apr", 

5028 "Mai", 

5029 "Iun", 

5030 "Iul", 

5031 "Aug", 

5032 "Sept", 

5033 "Oct", 

5034 "Nov", 

5035 "Dec", 

5036 ] 

5037 

5038 day_names = [ 

5039 "", 

5040 "dies Lunae", 

5041 "dies Martis", 

5042 "dies Mercurii", 

5043 "dies Iovis", 

5044 "dies Veneris", 

5045 "dies Saturni", 

5046 "dies Solis", 

5047 ] 

5048 

5049 day_abbreviations = [ 

5050 "", 

5051 "dies Lunae", 

5052 "dies Martis", 

5053 "dies Mercurii", 

5054 "dies Iovis", 

5055 "dies Veneris", 

5056 "dies Saturni", 

5057 "dies Solis", 

5058 ] 

5059 

5060 

5061class LithuanianLocale(Locale): 

5062 names = ["lt", "lt-lt"] 

5063 

5064 past = "prieš {0}" 

5065 future = "po {0}" 

5066 and_word = "ir" 

5067 

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

5069 "now": "dabar", 

5070 "second": "sekundės", 

5071 "seconds": "{0} sekundžių", 

5072 "minute": "minutės", 

5073 "minutes": "{0} minučių", 

5074 "hour": "valandos", 

5075 "hours": "{0} valandų", 

5076 "day": "dieną", 

5077 "days": "{0} dienų", 

5078 "week": "savaitės", 

5079 "weeks": "{0} savaičių", 

5080 "month": "mėnesio", 

5081 "months": "{0} mėnesių", 

5082 "year": "metų", 

5083 "years": "{0} metų", 

5084 } 

5085 

5086 month_names = [ 

5087 "", 

5088 "sausis", 

5089 "vasaris", 

5090 "kovas", 

5091 "balandis", 

5092 "gegužė", 

5093 "birželis", 

5094 "liepa", 

5095 "rugpjūtis", 

5096 "rugsėjis", 

5097 "spalis", 

5098 "lapkritis", 

5099 "gruodis", 

5100 ] 

5101 

5102 month_abbreviations = [ 

5103 "", 

5104 "saus", 

5105 "vas", 

5106 "kovas", 

5107 "bal", 

5108 "geg", 

5109 "birž", 

5110 "liepa", 

5111 "rugp", 

5112 "rugs", 

5113 "spalis", 

5114 "lapkr", 

5115 "gr", 

5116 ] 

5117 

5118 day_names = [ 

5119 "", 

5120 "pirmadienis", 

5121 "antradienis", 

5122 "trečiadienis", 

5123 "ketvirtadienis", 

5124 "penktadienis", 

5125 "šeštadienis", 

5126 "sekmadienis", 

5127 ] 

5128 

5129 day_abbreviations = [ 

5130 "", 

5131 "pi", 

5132 "an", 

5133 "tr", 

5134 "ke", 

5135 "pe", 

5136 "še", 

5137 "se", 

5138 ] 

5139 

5140 

5141class MalayLocale(Locale): 

5142 names = ["ms", "ms-my", "ms-bn"] 

5143 

5144 past = "{0} yang lalu" 

5145 future = "dalam {0}" 

5146 and_word = "dan" 

5147 

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

5149 "now": "sekarang", 

5150 "second": "saat", 

5151 "seconds": "{0} saat", 

5152 "minute": "minit", 

5153 "minutes": "{0} minit", 

5154 "hour": "jam", 

5155 "hours": "{0} jam", 

5156 "day": "hari", 

5157 "days": "{0} hari", 

5158 "week": "minggu", 

5159 "weeks": "{0} minggu", 

5160 "month": "bulan", 

5161 "months": "{0} bulan", 

5162 "year": "tahun", 

5163 "years": "{0} tahun", 

5164 } 

5165 

5166 month_names = [ 

5167 "", 

5168 "Januari", 

5169 "Februari", 

5170 "Mac", 

5171 "April", 

5172 "Mei", 

5173 "Jun", 

5174 "Julai", 

5175 "Ogos", 

5176 "September", 

5177 "Oktober", 

5178 "November", 

5179 "Disember", 

5180 ] 

5181 

5182 month_abbreviations = [ 

5183 "", 

5184 "Jan.", 

5185 "Feb.", 

5186 "Mac", 

5187 "Apr.", 

5188 "Mei", 

5189 "Jun", 

5190 "Julai", 

5191 "Og.", 

5192 "Sept.", 

5193 "Okt.", 

5194 "Nov.", 

5195 "Dis.", 

5196 ] 

5197 

5198 day_names = [ 

5199 "", 

5200 "Isnin", 

5201 "Selasa", 

5202 "Rabu", 

5203 "Khamis", 

5204 "Jumaat", 

5205 "Sabtu", 

5206 "Ahad", 

5207 ] 

5208 

5209 day_abbreviations = [ 

5210 "", 

5211 "Isnin", 

5212 "Selasa", 

5213 "Rabu", 

5214 "Khamis", 

5215 "Jumaat", 

5216 "Sabtu", 

5217 "Ahad", 

5218 ] 

5219 

5220 

5221class MalteseLocale(Locale): 

5222 names = ["mt", "mt-mt"] 

5223 

5224 past = "{0} ilu" 

5225 future = "fi {0}" 

5226 and_word = "u" 

5227 

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

5229 "now": "issa", 

5230 "second": "sekonda", 

5231 "seconds": "{0} sekondi", 

5232 "minute": "minuta", 

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

5234 "hour": "siegħa", 

5235 "hours": {"dual": "{0} sagħtejn", "plural": "{0} sigħat"}, 

5236 "day": "jum", 

5237 "days": {"dual": "{0} jumejn", "plural": "{0} ijiem"}, 

5238 "week": "ġimgħa", 

5239 "weeks": {"dual": "{0} ġimagħtejn", "plural": "{0} ġimgħat"}, 

5240 "month": "xahar", 

5241 "months": {"dual": "{0} xahrejn", "plural": "{0} xhur"}, 

5242 "year": "sena", 

5243 "years": {"dual": "{0} sentejn", "plural": "{0} snin"}, 

5244 } 

5245 

5246 month_names = [ 

5247 "", 

5248 "Jannar", 

5249 "Frar", 

5250 "Marzu", 

5251 "April", 

5252 "Mejju", 

5253 "Ġunju", 

5254 "Lulju", 

5255 "Awwissu", 

5256 "Settembru", 

5257 "Ottubru", 

5258 "Novembru", 

5259 "Diċembru", 

5260 ] 

5261 

5262 month_abbreviations = [ 

5263 "", 

5264 "Jan", 

5265 "Fr", 

5266 "Mar", 

5267 "Apr", 

5268 "Mejju", 

5269 "Ġun", 

5270 "Lul", 

5271 "Aw", 

5272 "Sett", 

5273 "Ott", 

5274 "Nov", 

5275 "Diċ", 

5276 ] 

5277 

5278 day_names = [ 

5279 "", 

5280 "It-Tnejn", 

5281 "It-Tlieta", 

5282 "L-Erbgħa", 

5283 "Il-Ħamis", 

5284 "Il-Ġimgħa", 

5285 "Is-Sibt", 

5286 "Il-Ħadd", 

5287 ] 

5288 

5289 day_abbreviations = [ 

5290 "", 

5291 "T", 

5292 "TL", 

5293 "E", 

5294 "Ħ", 

5295 "Ġ", 

5296 "S", 

5297 "Ħ", 

5298 ] 

5299 

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

5301 form = self.timeframes[timeframe] 

5302 delta = abs(delta) 

5303 if isinstance(form, Mapping): 

5304 if delta == 2: 

5305 form = form["dual"] 

5306 else: 

5307 form = form["plural"] 

5308 

5309 return form.format(delta) 

5310 

5311 

5312class SamiLocale(Locale): 

5313 names = ["se", "se-fi", "se-no", "se-se"] 

5314 

5315 past = "{0} dassái" 

5316 future = "{0} " # NOTE: couldn't find preposition for Sami here, none needed? 

5317 

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

5319 "now": "dál", 

5320 "second": "sekunda", 

5321 "seconds": "{0} sekundda", 

5322 "minute": "minuhta", 

5323 "minutes": "{0} minuhta", 

5324 "hour": "diimmu", 

5325 "hours": "{0} diimmu", 

5326 "day": "beaivvi", 

5327 "days": "{0} beaivvi", 

5328 "week": "vahku", 

5329 "weeks": "{0} vahku", 

5330 "month": "mánu", 

5331 "months": "{0} mánu", 

5332 "year": "jagi", 

5333 "years": "{0} jagi", 

5334 } 

5335 

5336 month_names = [ 

5337 "", 

5338 "Ođđajagimánnu", 

5339 "Guovvamánnu", 

5340 "Njukčamánnu", 

5341 "Cuoŋománnu", 

5342 "Miessemánnu", 

5343 "Geassemánnu", 

5344 "Suoidnemánnu", 

5345 "Borgemánnu", 

5346 "Čakčamánnu", 

5347 "Golggotmánnu", 

5348 "Skábmamánnu", 

5349 "Juovlamánnu", 

5350 ] 

5351 

5352 month_abbreviations = [ 

5353 "", 

5354 "Ođđajagimánnu", 

5355 "Guovvamánnu", 

5356 "Njukčamánnu", 

5357 "Cuoŋománnu", 

5358 "Miessemánnu", 

5359 "Geassemánnu", 

5360 "Suoidnemánnu", 

5361 "Borgemánnu", 

5362 "Čakčamánnu", 

5363 "Golggotmánnu", 

5364 "Skábmamánnu", 

5365 "Juovlamánnu", 

5366 ] 

5367 

5368 day_names = [ 

5369 "", 

5370 "Mánnodat", 

5371 "Disdat", 

5372 "Gaskavahkku", 

5373 "Duorastat", 

5374 "Bearjadat", 

5375 "Lávvordat", 

5376 "Sotnabeaivi", 

5377 ] 

5378 

5379 day_abbreviations = [ 

5380 "", 

5381 "Mánnodat", 

5382 "Disdat", 

5383 "Gaskavahkku", 

5384 "Duorastat", 

5385 "Bearjadat", 

5386 "Lávvordat", 

5387 "Sotnabeaivi", 

5388 ] 

5389 

5390 

5391class OdiaLocale(Locale): 

5392 names = ["or", "or-in"] 

5393 

5394 past = "{0} ପୂର୍ବେ" 

5395 future = "{0} ପରେ" 

5396 

5397 timeframes = { 

5398 "now": "ବର୍ତ୍ତମାନ", 

5399 "second": "ଏକ ସେକେଣ୍ଡ", 

5400 "seconds": "{0} ସେକେଣ୍ଡ", 

5401 "minute": "ଏକ ମିନଟ", 

5402 "minutes": "{0} ମିନଟ", 

5403 "hour": "ଏକ ଘଣ୍ଟା", 

5404 "hours": "{0} ଘଣ୍ଟା", 

5405 "day": "ଏକ ଦିନ", 

5406 "days": "{0} ଦିନ", 

5407 "month": "ଏକ ମାସ", 

5408 "months": "{0} ମାସ ", 

5409 "year": "ଏକ ବର୍ଷ", 

5410 "years": "{0} ବର୍ଷ", 

5411 } 

5412 

5413 meridians = {"am": "ପୂର୍ବାହ୍ନ", "pm": "ଅପରାହ୍ନ", "AM": "ପୂର୍ବାହ୍ନ", "PM": "ଅପରାହ୍ନ"} 

5414 

5415 month_names = [ 

5416 "", 

5417 "ଜାନୁଆରୀ", 

5418 "ଫେବୃଆରୀ", 

5419 "ମାର୍ଚ୍ଚ୍", 

5420 "ଅପ୍ରେଲ", 

5421 "ମଇ", 

5422 "ଜୁନ୍", 

5423 "ଜୁଲାଇ", 

5424 "ଅଗଷ୍ଟ", 

5425 "ସେପ୍ଟେମ୍ବର", 

5426 "ଅକ୍ଟୋବର୍", 

5427 "ନଭେମ୍ବର୍", 

5428 "ଡିସେମ୍ବର୍", 

5429 ] 

5430 month_abbreviations = [ 

5431 "", 

5432 "ଜାନୁ", 

5433 "ଫେବୃ", 

5434 "ମାର୍ଚ୍ଚ୍", 

5435 "ଅପ୍ରେ", 

5436 "ମଇ", 

5437 "ଜୁନ୍", 

5438 "ଜୁଲା", 

5439 "ଅଗ", 

5440 "ସେପ୍ଟେ", 

5441 "ଅକ୍ଟୋ", 

5442 "ନଭେ", 

5443 "ଡିସେ", 

5444 ] 

5445 

5446 day_names = [ 

5447 "", 

5448 "ସୋମବାର", 

5449 "ମଙ୍ଗଳବାର", 

5450 "ବୁଧବାର", 

5451 "ଗୁରୁବାର", 

5452 "ଶୁକ୍ରବାର", 

5453 "ଶନିବାର", 

5454 "ରବିବାର", 

5455 ] 

5456 day_abbreviations = [ 

5457 "", 

5458 "ସୋମ", 

5459 "ମଙ୍ଗଳ", 

5460 "ବୁଧ", 

5461 "ଗୁରୁ", 

5462 "ଶୁକ୍ର", 

5463 "ଶନି", 

5464 "ରବି", 

5465 ] 

5466 

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

5468 if n > 10 or n == 0: 

5469 return f"{n}ତମ" 

5470 if n in [1, 5, 7, 8, 9, 10]: 

5471 return f"{n}ମ" 

5472 if n in [2, 3]: 

5473 return f"{n}ୟ" 

5474 if n == 4: 

5475 return f"{n}ର୍ଥ" 

5476 if n == 6: 

5477 return f"{n}ଷ୍ଠ" 

5478 return "" 

5479 

5480 

5481class SerbianLocale(Locale): 

5482 names = ["sr", "sr-rs", "sr-sp"] 

5483 

5484 past = "pre {0}" 

5485 future = "za {0}" 

5486 and_word = "i" 

5487 

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

5489 "now": "sada", 

5490 "second": "sekundu", 

5491 "seconds": {"double": "{0} sekunde", "higher": "{0} sekundi"}, 

5492 "minute": "minutu", 

5493 "minutes": {"double": "{0} minute", "higher": "{0} minuta"}, 

5494 "hour": "sat", 

5495 "hours": {"double": "{0} sata", "higher": "{0} sati"}, 

5496 "day": "dan", 

5497 "days": {"double": "{0} dana", "higher": "{0} dana"}, 

5498 "week": "nedelju", 

5499 "weeks": {"double": "{0} nedelje", "higher": "{0} nedelja"}, 

5500 "month": "mesec", 

5501 "months": {"double": "{0} meseca", "higher": "{0} meseci"}, 

5502 "year": "godinu", 

5503 "years": {"double": "{0} godine", "higher": "{0} godina"}, 

5504 } 

5505 

5506 month_names = [ 

5507 "", 

5508 "januar", # јануар 

5509 "februar", # фебруар 

5510 "mart", # март 

5511 "april", # април 

5512 "maj", # мај 

5513 "jun", # јун 

5514 "jul", # јул 

5515 "avgust", # август 

5516 "septembar", # септембар 

5517 "oktobar", # октобар 

5518 "novembar", # новембар 

5519 "decembar", # децембар 

5520 ] 

5521 

5522 month_abbreviations = [ 

5523 "", 

5524 "jan", 

5525 "feb", 

5526 "mar", 

5527 "apr", 

5528 "maj", 

5529 "jun", 

5530 "jul", 

5531 "avg", 

5532 "sep", 

5533 "okt", 

5534 "nov", 

5535 "dec", 

5536 ] 

5537 

5538 day_names = [ 

5539 "", 

5540 "ponedeljak", # понедељак 

5541 "utorak", # уторак 

5542 "sreda", # среда 

5543 "četvrtak", # четвртак 

5544 "petak", # петак 

5545 "subota", # субота 

5546 "nedelja", # недеља 

5547 ] 

5548 

5549 day_abbreviations = [ 

5550 "", 

5551 "po", # по 

5552 "ut", # ут 

5553 "sr", # ср 

5554 "če", # че 

5555 "pe", # пе 

5556 "su", # су 

5557 "ne", # не 

5558 ] 

5559 

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

5561 form = self.timeframes[timeframe] 

5562 delta = abs(delta) 

5563 if isinstance(form, Mapping): 

5564 if 1 < delta <= 4: 

5565 form = form["double"] 

5566 else: 

5567 form = form["higher"] 

5568 

5569 return form.format(delta) 

5570 

5571 

5572class LuxembourgishLocale(Locale): 

5573 names = ["lb", "lb-lu"] 

5574 

5575 past = "virun {0}" 

5576 future = "an {0}" 

5577 and_word = "an" 

5578 

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

5580 "now": "just elo", 

5581 "second": "enger Sekonn", 

5582 "seconds": "{0} Sekonnen", 

5583 "minute": "enger Minutt", 

5584 "minutes": "{0} Minutten", 

5585 "hour": "enger Stonn", 

5586 "hours": "{0} Stonnen", 

5587 "day": "engem Dag", 

5588 "days": "{0} Deeg", 

5589 "week": "enger Woch", 

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

5591 "month": "engem Mount", 

5592 "months": "{0} Méint", 

5593 "year": "engem Joer", 

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

5595 } 

5596 

5597 timeframes_only_distance = timeframes.copy() 

5598 timeframes_only_distance["second"] = "eng Sekonn" 

5599 timeframes_only_distance["minute"] = "eng Minutt" 

5600 timeframes_only_distance["hour"] = "eng Stonn" 

5601 timeframes_only_distance["day"] = "een Dag" 

5602 timeframes_only_distance["days"] = "{0} Deeg" 

5603 timeframes_only_distance["week"] = "eng Woch" 

5604 timeframes_only_distance["month"] = "ee Mount" 

5605 timeframes_only_distance["months"] = "{0} Méint" 

5606 timeframes_only_distance["year"] = "ee Joer" 

5607 timeframes_only_distance["years"] = "{0} Joer" 

5608 

5609 month_names = [ 

5610 "", 

5611 "Januar", 

5612 "Februar", 

5613 "Mäerz", 

5614 "Abrëll", 

5615 "Mee", 

5616 "Juni", 

5617 "Juli", 

5618 "August", 

5619 "September", 

5620 "Oktouber", 

5621 "November", 

5622 "Dezember", 

5623 ] 

5624 

5625 month_abbreviations = [ 

5626 "", 

5627 "Jan", 

5628 "Feb", 

5629 "Mäe", 

5630 "Abr", 

5631 "Mee", 

5632 "Jun", 

5633 "Jul", 

5634 "Aug", 

5635 "Sep", 

5636 "Okt", 

5637 "Nov", 

5638 "Dez", 

5639 ] 

5640 

5641 day_names = [ 

5642 "", 

5643 "Méindeg", 

5644 "Dënschdeg", 

5645 "Mëttwoch", 

5646 "Donneschdeg", 

5647 "Freideg", 

5648 "Samschdeg", 

5649 "Sonndeg", 

5650 ] 

5651 

5652 day_abbreviations = ["", "Méi", "Dën", "Mët", "Don", "Fre", "Sam", "Son"] 

5653 

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

5655 return f"{n}." 

5656 

5657 def describe( 

5658 self, 

5659 timeframe: TimeFrameLiteral, 

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

5661 only_distance: bool = False, 

5662 ) -> str: 

5663 if not only_distance: 

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

5665 

5666 # Luxembourgish uses a different case without 'in' or 'ago' 

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

5668 trunc(abs(delta)) 

5669 ) 

5670 

5671 return humanized 

5672 

5673 

5674class ZuluLocale(Locale): 

5675 names = ["zu", "zu-za"] 

5676 

5677 past = "{0} edlule" 

5678 future = "{0} " 

5679 and_word = "futhi" 

5680 

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

5682 "now": "manje", 

5683 "second": {"past": "umzuzwana", "future": "ngomzuzwana"}, 

5684 "seconds": {"past": "{0} imizuzwana", "future": "{0} ngemizuzwana"}, 

5685 "minute": {"past": "umzuzu", "future": "ngomzuzu"}, 

5686 "minutes": {"past": "{0} imizuzu", "future": "{0} ngemizuzu"}, 

5687 "hour": {"past": "ihora", "future": "ngehora"}, 

5688 "hours": {"past": "{0} amahora", "future": "{0} emahoreni"}, 

5689 "day": {"past": "usuku", "future": "ngosuku"}, 

5690 "days": {"past": "{0} izinsuku", "future": "{0} ezinsukwini"}, 

5691 "week": {"past": "isonto", "future": "ngesonto"}, 

5692 "weeks": {"past": "{0} amasonto", "future": "{0} emasontweni"}, 

5693 "month": {"past": "inyanga", "future": "ngenyanga"}, 

5694 "months": {"past": "{0} izinyanga", "future": "{0} ezinyangeni"}, 

5695 "year": {"past": "unyaka", "future": "ngonyak"}, 

5696 "years": {"past": "{0} iminyaka", "future": "{0} eminyakeni"}, 

5697 } 

5698 

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

5700 """Zulu aware time frame format function, takes into account 

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

5702 abs_delta = abs(delta) 

5703 form = self.timeframes[timeframe] 

5704 

5705 if isinstance(form, str): 

5706 return form.format(abs_delta) 

5707 

5708 if delta > 0: 

5709 key = "future" 

5710 else: 

5711 key = "past" 

5712 form = form[key] 

5713 

5714 return form.format(abs_delta) 

5715 

5716 month_names = [ 

5717 "", 

5718 "uMasingane", 

5719 "uNhlolanja", 

5720 "uNdasa", 

5721 "UMbasa", 

5722 "UNhlaba", 

5723 "UNhlangulana", 

5724 "uNtulikazi", 

5725 "UNcwaba", 

5726 "uMandulo", 

5727 "uMfumfu", 

5728 "uLwezi", 

5729 "uZibandlela", 

5730 ] 

5731 

5732 month_abbreviations = [ 

5733 "", 

5734 "uMasingane", 

5735 "uNhlolanja", 

5736 "uNdasa", 

5737 "UMbasa", 

5738 "UNhlaba", 

5739 "UNhlangulana", 

5740 "uNtulikazi", 

5741 "UNcwaba", 

5742 "uMandulo", 

5743 "uMfumfu", 

5744 "uLwezi", 

5745 "uZibandlela", 

5746 ] 

5747 

5748 day_names = [ 

5749 "", 

5750 "uMsombuluko", 

5751 "uLwesibili", 

5752 "uLwesithathu", 

5753 "uLwesine", 

5754 "uLwesihlanu", 

5755 "uMgqibelo", 

5756 "iSonto", 

5757 ] 

5758 

5759 day_abbreviations = [ 

5760 "", 

5761 "uMsombuluko", 

5762 "uLwesibili", 

5763 "uLwesithathu", 

5764 "uLwesine", 

5765 "uLwesihlanu", 

5766 "uMgqibelo", 

5767 "iSonto", 

5768 ] 

5769 

5770 

5771class TamilLocale(Locale): 

5772 names = ["ta", "ta-in", "ta-lk"] 

5773 

5774 past = "{0} நேரத்திற்கு முன்பு" 

5775 future = "இல் {0}" 

5776 

5777 timeframes = { 

5778 "now": "இப்போது", 

5779 "second": "ஒரு இரண்டாவது", 

5780 "seconds": "{0} விநாடிகள்", 

5781 "minute": "ஒரு நிமிடம்", 

5782 "minutes": "{0} நிமிடங்கள்", 

5783 "hour": "ஒரு மணி", 

5784 "hours": "{0} மணிநேரம்", 

5785 "day": "ஒரு நாள்", 

5786 "days": "{0} நாட்கள்", 

5787 "week": "ஒரு வாரம்", 

5788 "weeks": "{0} வாரங்கள்", 

5789 "month": "ஒரு மாதம்", 

5790 "months": "{0} மாதங்கள்", 

5791 "year": "ஒரு ஆண்டு", 

5792 "years": "{0} ஆண்டுகள்", 

5793 } 

5794 

5795 month_names = [ 

5796 "", 

5797 "சித்திரை", 

5798 "வைகாசி", 

5799 "ஆனி", 

5800 "ஆடி", 

5801 "ஆவணி", 

5802 "புரட்டாசி", 

5803 "ஐப்பசி", 

5804 "கார்த்திகை", 

5805 "மார்கழி", 

5806 "தை", 

5807 "மாசி", 

5808 "பங்குனி", 

5809 ] 

5810 

5811 month_abbreviations = [ 

5812 "", 

5813 "ஜன", 

5814 "பிப்", 

5815 "மார்", 

5816 "ஏப்", 

5817 "மே", 

5818 "ஜூன்", 

5819 "ஜூலை", 

5820 "ஆக", 

5821 "செப்", 

5822 "அக்", 

5823 "நவ", 

5824 "டிச", 

5825 ] 

5826 

5827 day_names = [ 

5828 "", 

5829 "திங்கட்கிழமை", 

5830 "செவ்வாய்க்கிழமை", 

5831 "புதன்கிழமை", 

5832 "வியாழக்கிழமை", 

5833 "வெள்ளிக்கிழமை", 

5834 "சனிக்கிழமை", 

5835 "ஞாயிற்றுக்கிழமை", 

5836 ] 

5837 

5838 day_abbreviations = [ 

5839 "", 

5840 "திங்கட்", 

5841 "செவ்வாய்", 

5842 "புதன்", 

5843 "வியாழன்", 

5844 "வெள்ளி", 

5845 "சனி", 

5846 "ஞாயிறு", 

5847 ] 

5848 

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

5850 if n == 1: 

5851 return f"{n}வது" 

5852 elif n >= 0: 

5853 return f"{n}ஆம்" 

5854 else: 

5855 return "" 

5856 

5857 

5858class AlbanianLocale(Locale): 

5859 names = ["sq", "sq-al"] 

5860 

5861 past = "{0} më parë" 

5862 future = "në {0}" 

5863 and_word = "dhe" 

5864 

5865 timeframes = { 

5866 "now": "tani", 

5867 "second": "sekondë", 

5868 "seconds": "{0} sekonda", 

5869 "minute": "minutë", 

5870 "minutes": "{0} minuta", 

5871 "hour": "orë", 

5872 "hours": "{0} orë", 

5873 "day": "ditë", 

5874 "days": "{0} ditë", 

5875 "week": "javë", 

5876 "weeks": "{0} javë", 

5877 "month": "muaj", 

5878 "months": "{0} muaj", 

5879 "year": "vit", 

5880 "years": "{0} vjet", 

5881 } 

5882 

5883 month_names = [ 

5884 "", 

5885 "janar", 

5886 "shkurt", 

5887 "mars", 

5888 "prill", 

5889 "maj", 

5890 "qershor", 

5891 "korrik", 

5892 "gusht", 

5893 "shtator", 

5894 "tetor", 

5895 "nëntor", 

5896 "dhjetor", 

5897 ] 

5898 

5899 month_abbreviations = [ 

5900 "", 

5901 "jan", 

5902 "shk", 

5903 "mar", 

5904 "pri", 

5905 "maj", 

5906 "qer", 

5907 "korr", 

5908 "gush", 

5909 "sht", 

5910 "tet", 

5911 "nën", 

5912 "dhj", 

5913 ] 

5914 

5915 day_names = [ 

5916 "", 

5917 "e hënë", 

5918 "e martë", 

5919 "e mërkurë", 

5920 "e enjte", 

5921 "e premte", 

5922 "e shtunë", 

5923 "e diel", 

5924 ] 

5925 

5926 day_abbreviations = [ 

5927 "", 

5928 "hën", 

5929 "mar", 

5930 "mër", 

5931 "enj", 

5932 "pre", 

5933 "sht", 

5934 "die", 

5935 ] 

5936 

5937 

5938class GeorgianLocale(Locale): 

5939 names = ["ka", "ka-ge"] 

5940 

5941 past = "{0} წინ" # ts’in 

5942 future = "{0} შემდეგ" # shemdeg 

5943 and_word = "და" # da 

5944 

5945 timeframes = { 

5946 "now": "ახლა", # akhla 

5947 # When a cardinal qualifies a noun, it stands in the singular 

5948 "second": "წამის", # ts’amis 

5949 "seconds": "{0} წამის", 

5950 "minute": "წუთის", # ts’utis 

5951 "minutes": "{0} წუთის", 

5952 "hour": "საათის", # saatis 

5953 "hours": "{0} საათის", 

5954 "day": "დღის", # dghis 

5955 "days": "{0} დღის", 

5956 "week": "კვირის", # k’viris 

5957 "weeks": "{0} კვირის", 

5958 "month": "თვის", # tvis 

5959 "months": "{0} თვის", 

5960 "year": "წლის", # ts’lis 

5961 "years": "{0} წლის", 

5962 } 

5963 

5964 month_names = [ 

5965 # modern month names 

5966 "", 

5967 "იანვარი", # Ianvari 

5968 "თებერვალი", # Tebervali 

5969 "მარტი", # Mart'i 

5970 "აპრილი", # Ap'rili 

5971 "მაისი", # Maisi 

5972 "ივნისი", # Ivnisi 

5973 "ივლისი", # Ivlisi 

5974 "აგვისტო", # Agvist'o 

5975 "სექტემბერი", # Sekt'emberi 

5976 "ოქტომბერი", # Okt'omberi 

5977 "ნოემბერი", # Noemberi 

5978 "დეკემბერი", # Dek'emberi 

5979 ] 

5980 

5981 month_abbreviations = [ 

5982 # no abbr. found yet 

5983 "", 

5984 "იანვარი", # Ianvari 

5985 "თებერვალი", # Tebervali 

5986 "მარტი", # Mart'i 

5987 "აპრილი", # Ap'rili 

5988 "მაისი", # Maisi 

5989 "ივნისი", # Ivnisi 

5990 "ივლისი", # Ivlisi 

5991 "აგვისტო", # Agvist'o 

5992 "სექტემბერი", # Sekt'emberi 

5993 "ოქტომბერი", # Okt'omberi 

5994 "ნოემბერი", # Noemberi 

5995 "დეკემბერი", # Dek'emberi 

5996 ] 

5997 

5998 day_names = [ 

5999 "", 

6000 "ორშაბათი", # orshabati 

6001 "სამშაბათი", # samshabati 

6002 "ოთხშაბათი", # otkhshabati 

6003 "ხუთშაბათი", # khutshabati 

6004 "პარასკევი", # p’arask’evi 

6005 "შაბათი", # shabati 

6006 # "k’vira" also serves as week; to avoid confusion "k’vira-dge" can be used for Sunday 

6007 "კვირა", # k’vira 

6008 ] 

6009 

6010 day_abbreviations = [ 

6011 "", 

6012 "ორშაბათი", # orshabati 

6013 "სამშაბათი", # samshabati 

6014 "ოთხშაბათი", # otkhshabati 

6015 "ხუთშაბათი", # khutshabati 

6016 "პარასკევი", # p’arask’evi 

6017 "შაბათი", # shabati 

6018 "კვირა", # k’vira 

6019 ] 

6020 

6021 

6022class SinhalaLocale(Locale): 

6023 names = ["si", "si-lk"] 

6024 

6025 past = "{0}ට පෙර" 

6026 future = "{0}" 

6027 and_word = "සහ" 

6028 

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

6030 "now": "දැන්", 

6031 "second": { 

6032 "past": "තත්පරයක", 

6033 "future": "තත්පරයකින්", 

6034 }, # ක් is the article 

6035 "seconds": { 

6036 "past": "තත්පර {0} ක", 

6037 "future": "තත්පර {0} කින්", 

6038 }, 

6039 "minute": { 

6040 "past": "විනාඩියක", 

6041 "future": "විනාඩියකින්", 

6042 }, 

6043 "minutes": { 

6044 "past": "විනාඩි {0} ක", 

6045 "future": "මිනිත්තු {0} කින්", 

6046 }, 

6047 "hour": {"past": "පැයක", "future": "පැයකින්"}, 

6048 "hours": { 

6049 "past": "පැය {0} ක", 

6050 "future": "පැය {0} කින්", 

6051 }, 

6052 "day": {"past": "දිනක", "future": "දිනකට"}, 

6053 "days": { 

6054 "past": "දින {0} ක", 

6055 "future": "දින {0} කින්", 

6056 }, 

6057 "week": {"past": "සතියක", "future": "සතියකින්"}, 

6058 "weeks": { 

6059 "past": "සති {0} ක", 

6060 "future": "සති {0} කින්", 

6061 }, 

6062 "month": {"past": "මාසයක", "future": "එය මාසය තුළ"}, 

6063 "months": { 

6064 "past": "මාස {0} ක", 

6065 "future": "මාස {0} කින්", 

6066 }, 

6067 "year": {"past": "වසරක", "future": "වසරක් තුළ"}, 

6068 "years": { 

6069 "past": "අවුරුදු {0} ක", 

6070 "future": "අවුරුදු {0} තුළ", 

6071 }, 

6072 } 

6073 # Sinhala: the general format to describe timeframe is different from past and future, 

6074 # so we do not copy the original timeframes dictionary 

6075 timeframes_only_distance = {} 

6076 timeframes_only_distance["second"] = "තත්පරයක්" 

6077 timeframes_only_distance["seconds"] = "තත්පර {0}" 

6078 timeframes_only_distance["minute"] = "මිනිත්තුවක්" 

6079 timeframes_only_distance["minutes"] = "විනාඩි {0}" 

6080 timeframes_only_distance["hour"] = "පැයක්" 

6081 timeframes_only_distance["hours"] = "පැය {0}" 

6082 timeframes_only_distance["day"] = "දවසක්" 

6083 timeframes_only_distance["days"] = "දවස් {0}" 

6084 timeframes_only_distance["week"] = "සතියක්" 

6085 timeframes_only_distance["weeks"] = "සති {0}" 

6086 timeframes_only_distance["month"] = "මාසයක්" 

6087 timeframes_only_distance["months"] = "මාස {0}" 

6088 timeframes_only_distance["year"] = "අවුරුද්දක්" 

6089 timeframes_only_distance["years"] = "අවුරුදු {0}" 

6090 

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

6092 """ 

6093 Sinhala awares time frame format function, takes into account 

6094 the differences between general, past, and future forms (three different suffixes). 

6095 """ 

6096 abs_delta = abs(delta) 

6097 form = self.timeframes[timeframe] 

6098 

6099 if isinstance(form, str): 

6100 return form.format(abs_delta) 

6101 

6102 if delta > 0: 

6103 key = "future" 

6104 else: 

6105 key = "past" 

6106 form = form[key] 

6107 

6108 return form.format(abs_delta) 

6109 

6110 def describe( 

6111 self, 

6112 timeframe: TimeFrameLiteral, 

6113 delta: Union[float, int] = 1, # key is always future when only_distance=False 

6114 only_distance: bool = False, 

6115 ) -> str: 

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

6117 

6118 :param timeframe: a string representing a timeframe. 

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

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

6121 """ 

6122 

6123 if not only_distance: 

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

6125 # Sinhala uses a different case without 'in' or 'ago' 

6126 humanized = self.timeframes_only_distance[timeframe].format(trunc(abs(delta))) 

6127 

6128 return humanized 

6129 

6130 month_names = [ 

6131 "", 

6132 "ජනවාරි", 

6133 "පෙබරවාරි", 

6134 "මාර්තු", 

6135 "අප්‍රේල්", 

6136 "මැයි", 

6137 "ජූනි", 

6138 "ජූලි", 

6139 "අගෝස්තු", 

6140 "සැප්තැම්බර්", 

6141 "ඔක්තෝබර්", 

6142 "නොවැම්බර්", 

6143 "දෙසැම්බර්", 

6144 ] 

6145 

6146 month_abbreviations = [ 

6147 "", 

6148 "ජන", 

6149 "පෙබ", 

6150 "මාර්", 

6151 "අප්‍රේ", 

6152 "මැයි", 

6153 "ජුනි", 

6154 "ජූලි", 

6155 "අගෝ", 

6156 "සැප්", 

6157 "ඔක්", 

6158 "නොවැ", 

6159 "දෙසැ", 

6160 ] 

6161 

6162 day_names = [ 

6163 "", 

6164 "සදුදා", 

6165 "අඟහරැවදා", 

6166 "බදාදා", 

6167 "බ්‍රහස්‍පතින්‍දා", 

6168 "සිකුරාදා", 

6169 "සෙනසුරාදා", 

6170 "ඉරිදා", 

6171 ] 

6172 

6173 day_abbreviations = [ 

6174 "", 

6175 "සදුද", 

6176 "බදා", 

6177 "බදා", 

6178 "සිකු", 

6179 "සෙන", 

6180 "අ", 

6181 "ඉරිදා", 

6182 ] 

6183 

6184 

6185class UrduLocale(Locale): 

6186 names = ["ur", "ur-pk"] 

6187 

6188 past = "پہلے {0}" 

6189 future = "میں {0}" 

6190 and_word = "اور" 

6191 

6192 timeframes = { 

6193 "now": "ابھی", 

6194 "second": "ایک سیکنڈ", 

6195 "seconds": "{0} سیکنڈ", 

6196 "minute": "ایک منٹ", 

6197 "minutes": "{0} منٹ", 

6198 "hour": "ایک گھنٹے", 

6199 "hours": "{0} گھنٹے", 

6200 "day": "ایک دن", 

6201 "days": "{0} دن", 

6202 "week": "ایک ہفتے", 

6203 "weeks": "{0} ہفتے", 

6204 "month": "ایک مہینہ", 

6205 "months": "{0} ماہ", 

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

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

6208 } 

6209 

6210 month_names = [ 

6211 "", 

6212 "جنوری", 

6213 "فروری", 

6214 "مارچ", 

6215 "اپریل", 

6216 "مئی", 

6217 "جون", 

6218 "جولائی", 

6219 "اگست", 

6220 "ستمبر", 

6221 "اکتوبر", 

6222 "نومبر", 

6223 "دسمبر", 

6224 ] 

6225 

6226 month_abbreviations = [ 

6227 "", 

6228 "جنوری", 

6229 "فروری", 

6230 "مارچ", 

6231 "اپریل", 

6232 "مئی", 

6233 "جون", 

6234 "جولائی", 

6235 "اگست", 

6236 "ستمبر", 

6237 "اکتوبر", 

6238 "نومبر", 

6239 "دسمبر", 

6240 ] 

6241 

6242 day_names = [ 

6243 "", 

6244 "سوموار", 

6245 "منگل", 

6246 "بدھ", 

6247 "جمعرات", 

6248 "جمعہ", 

6249 "ہفتہ", 

6250 "اتوار", 

6251 ] 

6252 

6253 day_abbreviations = [ 

6254 "", 

6255 "سوموار", 

6256 "منگل", 

6257 "بدھ", 

6258 "جمعرات", 

6259 "جمعہ", 

6260 "ہفتہ", 

6261 "اتوار", 

6262 ] 

6263 

6264 

6265class KazakhLocale(Locale): 

6266 names = ["kk", "kk-kz"] 

6267 

6268 past = "{0} бұрын" 

6269 future = "{0} кейін" 

6270 timeframes = { 

6271 "now": "қазір", 

6272 "second": "бір секунд", 

6273 "seconds": "{0} секунд", 

6274 "minute": "бір минут", 

6275 "minutes": "{0} минут", 

6276 "hour": "бір сағат", 

6277 "hours": "{0} сағат", 

6278 "day": "бір күн", 

6279 "days": "{0} күн", 

6280 "week": "бір апта", 

6281 "weeks": "{0} апта", 

6282 "month": "бір ай", 

6283 "months": "{0} ай", 

6284 "year": "бір жыл", 

6285 "years": "{0} жыл", 

6286 } 

6287 

6288 month_names = [ 

6289 "", 

6290 "Қаңтар", 

6291 "Ақпан", 

6292 "Наурыз", 

6293 "Сәуір", 

6294 "Мамыр", 

6295 "Маусым", 

6296 "Шілде", 

6297 "Тамыз", 

6298 "Қыркүйек", 

6299 "Қазан", 

6300 "Қараша", 

6301 "Желтоқсан", 

6302 ] 

6303 month_abbreviations = [ 

6304 "", 

6305 "Қан", 

6306 "Ақп", 

6307 "Нау", 

6308 "Сәу", 

6309 "Мам", 

6310 "Мау", 

6311 "Шіл", 

6312 "Там", 

6313 "Қыр", 

6314 "Қаз", 

6315 "Қар", 

6316 "Жел", 

6317 ] 

6318 

6319 day_names = [ 

6320 "", 

6321 "Дүйсембі", 

6322 "Сейсенбі", 

6323 "Сәрсенбі", 

6324 "Бейсенбі", 

6325 "Жұма", 

6326 "Сенбі", 

6327 "Жексенбі", 

6328 ] 

6329 day_abbreviations = ["", "Дс", "Сс", "Ср", "Бс", "Жм", "Сб", "Жс"] 

6330 

6331 

6332class AmharicLocale(Locale): 

6333 names = ["am", "am-et"] 

6334 

6335 past = "{0} በፊት" 

6336 future = "{0} ውስጥ" 

6337 and_word = "እና" 

6338 

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

6340 "now": "አሁን", 

6341 "second": { 

6342 "past": "ከአንድ ሰከንድ", 

6343 "future": "በአንድ ሰከንድ", 

6344 }, 

6345 "seconds": { 

6346 "past": "ከ {0} ሰከንድ", 

6347 "future": "በ {0} ሰከንድ", 

6348 }, 

6349 "minute": { 

6350 "past": "ከአንድ ደቂቃ", 

6351 "future": "በአንድ ደቂቃ", 

6352 }, 

6353 "minutes": { 

6354 "past": "ከ {0} ደቂቃዎች", 

6355 "future": "በ {0} ደቂቃዎች", 

6356 }, 

6357 "hour": { 

6358 "past": "ከአንድ ሰዓት", 

6359 "future": "በአንድ ሰዓት", 

6360 }, 

6361 "hours": { 

6362 "past": "ከ {0} ሰዓታት", 

6363 "future": "በ {0} ሰከንድ", 

6364 }, 

6365 "day": { 

6366 "past": "ከአንድ ቀን", 

6367 "future": "በአንድ ቀን", 

6368 }, 

6369 "days": { 

6370 "past": "ከ {0} ቀናት", 

6371 "future": "በ {0} ቀናት", 

6372 }, 

6373 "week": { 

6374 "past": "ከአንድ ሳምንት", 

6375 "future": "በአንድ ሳምንት", 

6376 }, 

6377 "weeks": { 

6378 "past": "ከ {0} ሳምንታት", 

6379 "future": "በ {0} ሳምንታት", 

6380 }, 

6381 "month": { 

6382 "past": "ከአንድ ወር", 

6383 "future": "በአንድ ወር", 

6384 }, 

6385 "months": { 

6386 "past": "ከ {0} ወር", 

6387 "future": "በ {0} ወራት", 

6388 }, 

6389 "year": { 

6390 "past": "ከአንድ አመት", 

6391 "future": "በአንድ አመት", 

6392 }, 

6393 "years": { 

6394 "past": "ከ {0} ዓመታት", 

6395 "future": "በ {0} ዓመታት", 

6396 }, 

6397 } 

6398 # Amharic: the general format to describe timeframe is different from past and future, 

6399 # so we do not copy the original timeframes dictionary 

6400 timeframes_only_distance = { 

6401 "second": "አንድ ሰከንድ", 

6402 "seconds": "{0} ሰከንድ", 

6403 "minute": "አንድ ደቂቃ", 

6404 "minutes": "{0} ደቂቃዎች", 

6405 "hour": "አንድ ሰዓት", 

6406 "hours": "{0} ሰዓት", 

6407 "day": "አንድ ቀን", 

6408 "days": "{0} ቀናት", 

6409 "week": "አንድ ሳምንት", 

6410 "weeks": "{0} ሳምንት", 

6411 "month": "አንድ ወር", 

6412 "months": "{0} ወራት", 

6413 "year": "አንድ አመት", 

6414 "years": "{0} ዓመታት", 

6415 } 

6416 

6417 month_names = [ 

6418 "", 

6419 "ጃንዩወሪ", 

6420 "ፌብሩወሪ", 

6421 "ማርች", 

6422 "ኤፕሪል", 

6423 "ሜይ", 

6424 "ጁን", 

6425 "ጁላይ", 

6426 "ኦገስት", 

6427 "ሴፕቴምበር", 

6428 "ኦክቶበር", 

6429 "ኖቬምበር", 

6430 "ዲሴምበር", 

6431 ] 

6432 

6433 month_abbreviations = [ 

6434 "", 

6435 "ጃንዩ", 

6436 "ፌብሩ", 

6437 "ማርች", 

6438 "ኤፕሪ", 

6439 "ሜይ", 

6440 "ጁን", 

6441 "ጁላይ", 

6442 "ኦገስ", 

6443 "ሴፕቴ", 

6444 "ኦክቶ", 

6445 "ኖቬም", 

6446 "ዲሴም", 

6447 ] 

6448 

6449 day_names = [ 

6450 "", 

6451 "ሰኞ", 

6452 "ማክሰኞ", 

6453 "ረቡዕ", 

6454 "ሐሙስ", 

6455 "ዓርብ", 

6456 "ቅዳሜ", 

6457 "እሑድ", 

6458 ] 

6459 day_abbreviations = ["", "እ", "ሰ", "ማ", "ረ", "ሐ", "ዓ", "ቅ"] 

6460 

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

6462 return f"{n}ኛ" 

6463 

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

6465 """ 

6466 Amharic awares time frame format function, takes into account 

6467 the differences between general, past, and future forms (three different suffixes). 

6468 """ 

6469 abs_delta = abs(delta) 

6470 form = self.timeframes[timeframe] 

6471 

6472 if isinstance(form, str): 

6473 return form.format(abs_delta) 

6474 

6475 if delta > 0: 

6476 key = "future" 

6477 else: 

6478 key = "past" 

6479 form = form[key] 

6480 

6481 return form.format(abs_delta) 

6482 

6483 def describe( 

6484 self, 

6485 timeframe: TimeFrameLiteral, 

6486 delta: Union[float, int] = 1, # key is always future when only_distance=False 

6487 only_distance: bool = False, 

6488 ) -> str: 

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

6490 

6491 :param timeframe: a string representing a timeframe. 

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

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

6494 """ 

6495 

6496 if not only_distance: 

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

6498 humanized = self.timeframes_only_distance[timeframe].format(trunc(abs(delta))) 

6499 

6500 return humanized 

6501 

6502 

6503class ArmenianLocale(Locale): 

6504 names = ["hy", "hy-am"] 

6505 past = "{0} առաջ" 

6506 future = "{0}ից" 

6507 and_word = "Եվ" # Yev 

6508 

6509 timeframes = { 

6510 "now": "հիմա", 

6511 "second": "վայրկյան", 

6512 "seconds": "{0} վայրկյան", 

6513 "minute": "րոպե", 

6514 "minutes": "{0} րոպե", 

6515 "hour": "ժամ", 

6516 "hours": "{0} ժամ", 

6517 "day": "օր", 

6518 "days": "{0} օր", 

6519 "month": "ամիս", 

6520 "months": "{0} ամիս", 

6521 "year": "տարին", 

6522 "years": "{0} տարին", 

6523 "week": "շաբաթ", 

6524 "weeks": "{0} շաբաթ", 

6525 } 

6526 

6527 meridians = { 

6528 "am": "Ամ", 

6529 "pm": "պ.մ.", 

6530 "AM": "Ամ", 

6531 "PM": "պ.մ.", 

6532 } 

6533 

6534 month_names = [ 

6535 "", 

6536 "հունվար", 

6537 "փետրվար", 

6538 "մարտ", 

6539 "ապրիլ", 

6540 "մայիս", 

6541 "հունիս", 

6542 "հուլիս", 

6543 "օգոստոս", 

6544 "սեպտեմբեր", 

6545 "հոկտեմբեր", 

6546 "նոյեմբեր", 

6547 "դեկտեմբեր", 

6548 ] 

6549 

6550 month_abbreviations = [ 

6551 "", 

6552 "հունվար", 

6553 "փետրվար", 

6554 "մարտ", 

6555 "ապրիլ", 

6556 "մայիս", 

6557 "հունիս", 

6558 "հուլիս", 

6559 "օգոստոս", 

6560 "սեպտեմբեր", 

6561 "հոկտեմբեր", 

6562 "նոյեմբեր", 

6563 "դեկտեմբեր", 

6564 ] 

6565 

6566 day_names = [ 

6567 "", 

6568 "երկուշաբթի", 

6569 "երեքշաբթի", 

6570 "չորեքշաբթի", 

6571 "հինգշաբթի", 

6572 "ուրբաթ", 

6573 "շաբաթ", 

6574 "կիրակի", 

6575 ] 

6576 

6577 day_abbreviations = [ 

6578 "", 

6579 "երկ.", 

6580 "երեք.", 

6581 "չորեք.", 

6582 "հինգ.", 

6583 "ուրբ.", 

6584 "շաբ.", 

6585 "կիր.", 

6586 ] 

6587 

6588 

6589class UzbekLocale(Locale): 

6590 names = ["uz", "uz-uz"] 

6591 past = "{0}dan avval" 

6592 future = "{0}dan keyin" 

6593 timeframes = { 

6594 "now": "hozir", 

6595 "second": "bir soniya", 

6596 "seconds": "{0} soniya", 

6597 "minute": "bir daqiqa", 

6598 "minutes": "{0} daqiqa", 

6599 "hour": "bir soat", 

6600 "hours": "{0} soat", 

6601 "day": "bir kun", 

6602 "days": "{0} kun", 

6603 "week": "bir hafta", 

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

6605 "month": "bir oy", 

6606 "months": "{0} oy", 

6607 "year": "bir yil", 

6608 "years": "{0} yil", 

6609 } 

6610 

6611 month_names = [ 

6612 "", 

6613 "Yanvar", 

6614 "Fevral", 

6615 "Mart", 

6616 "Aprel", 

6617 "May", 

6618 "Iyun", 

6619 "Iyul", 

6620 "Avgust", 

6621 "Sentyabr", 

6622 "Oktyabr", 

6623 "Noyabr", 

6624 "Dekabr", 

6625 ] 

6626 

6627 month_abbreviations = [ 

6628 "", 

6629 "Yan", 

6630 "Fev", 

6631 "Mar", 

6632 "Apr", 

6633 "May", 

6634 "Iyn", 

6635 "Iyl", 

6636 "Avg", 

6637 "Sen", 

6638 "Okt", 

6639 "Noy", 

6640 "Dek", 

6641 ] 

6642 

6643 day_names = [ 

6644 "", 

6645 "Dushanba", 

6646 "Seshanba", 

6647 "Chorshanba", 

6648 "Payshanba", 

6649 "Juma", 

6650 "Shanba", 

6651 "Yakshanba", 

6652 ] 

6653 

6654 day_abbreviations = ["", "Dush", "Sesh", "Chor", "Pay", "Jum", "Shan", "Yak"]