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 "month": "een maand", 

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

1624 "year": "een jaar", 

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

1626 } 

1627 

1628 month_names = [ 

1629 "", 

1630 "Januarie", 

1631 "Februarie", 

1632 "Maart", 

1633 "April", 

1634 "Mei", 

1635 "Junie", 

1636 "Julie", 

1637 "Augustus", 

1638 "September", 

1639 "Oktober", 

1640 "November", 

1641 "Desember", 

1642 ] 

1643 month_abbreviations = [ 

1644 "", 

1645 "Jan", 

1646 "Feb", 

1647 "Mrt", 

1648 "Apr", 

1649 "Mei", 

1650 "Jun", 

1651 "Jul", 

1652 "Aug", 

1653 "Sep", 

1654 "Okt", 

1655 "Nov", 

1656 "Des", 

1657 ] 

1658 

1659 day_names = [ 

1660 "", 

1661 "Maandag", 

1662 "Dinsdag", 

1663 "Woensdag", 

1664 "Donderdag", 

1665 "Vrydag", 

1666 "Saterdag", 

1667 "Sondag", 

1668 ] 

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

1670 

1671 

1672class BulgarianLocale(SlavicBaseLocale): 

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

1674 

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

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

1677 

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

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

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

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

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

1683 "minutes": { 

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

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

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

1687 }, 

1688 "hour": "час", 

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

1690 "day": "ден", 

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

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

1693 "months": { 

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

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

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

1697 }, 

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

1699 "years": { 

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

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

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

1703 }, 

1704 } 

1705 

1706 month_names = [ 

1707 "", 

1708 "януари", 

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

1710 "март", 

1711 "април", 

1712 "май", 

1713 "юни", 

1714 "юли", 

1715 "август", 

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

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

1718 "ноември", 

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

1720 ] 

1721 month_abbreviations = [ 

1722 "", 

1723 "ян", 

1724 "февр", 

1725 "март", 

1726 "апр", 

1727 "май", 

1728 "юни", 

1729 "юли", 

1730 "авг", 

1731 "септ", 

1732 "окт", 

1733 "ноем", 

1734 "дек", 

1735 ] 

1736 

1737 day_names = [ 

1738 "", 

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

1740 "вторник", 

1741 "сряда", 

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

1743 "петък", 

1744 "събота", 

1745 "неделя", 

1746 ] 

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

1748 

1749 

1750class UkrainianLocale(SlavicBaseLocale): 

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

1752 

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

1754 future = "за {0}" 

1755 

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

1757 "now": "зараз", 

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

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

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

1761 "minutes": { 

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

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

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

1765 }, 

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

1767 "hours": { 

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

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

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

1771 }, 

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

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

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

1775 "months": { 

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

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

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

1779 }, 

1780 "year": "рік", 

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

1782 } 

1783 

1784 month_names = [ 

1785 "", 

1786 "січня", 

1787 "лютого", 

1788 "березня", 

1789 "квітня", 

1790 "травня", 

1791 "червня", 

1792 "липня", 

1793 "серпня", 

1794 "вересня", 

1795 "жовтня", 

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

1797 "грудня", 

1798 ] 

1799 month_abbreviations = [ 

1800 "", 

1801 "січ", 

1802 "лют", 

1803 "бер", 

1804 "квіт", 

1805 "трав", 

1806 "черв", 

1807 "лип", 

1808 "серп", 

1809 "вер", 

1810 "жовт", 

1811 "лист", 

1812 "груд", 

1813 ] 

1814 

1815 day_names = [ 

1816 "", 

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

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

1819 "середа", 

1820 "четвер", 

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

1822 "субота", 

1823 "неділя", 

1824 ] 

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

1826 

1827 

1828class MacedonianLocale(SlavicBaseLocale): 

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

1830 

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

1832 future = "за {0}" 

1833 

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

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

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

1837 "seconds": { 

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

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

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

1841 }, 

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

1843 "minutes": { 

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

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

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

1847 }, 

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

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

1850 "day": "еден ден", 

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

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

1853 "weeks": { 

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

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

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

1857 }, 

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

1859 "months": { 

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

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

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

1863 }, 

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

1865 "years": { 

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

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

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

1869 }, 

1870 } 

1871 

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

1873 

1874 month_names = [ 

1875 "", 

1876 "Јануари", 

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

1878 "Март", 

1879 "Април", 

1880 "Мај", 

1881 "Јуни", 

1882 "Јули", 

1883 "Август", 

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

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

1886 "Ноември", 

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

1888 ] 

1889 month_abbreviations = [ 

1890 "", 

1891 "Јан", 

1892 "Фев", 

1893 "Мар", 

1894 "Апр", 

1895 "Мај", 

1896 "Јун", 

1897 "Јул", 

1898 "Авг", 

1899 "Септ", 

1900 "Окт", 

1901 "Ноем", 

1902 "Декем", 

1903 ] 

1904 

1905 day_names = [ 

1906 "", 

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

1908 "Вторник", 

1909 "Среда", 

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

1911 "Петок", 

1912 "Сабота", 

1913 "Недела", 

1914 ] 

1915 day_abbreviations = [ 

1916 "", 

1917 "Пон", 

1918 "Вт", 

1919 "Сре", 

1920 "Чет", 

1921 "Пет", 

1922 "Саб", 

1923 "Нед", 

1924 ] 

1925 

1926 

1927class MacedonianLatinLocale(SlavicBaseLocale): 

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

1929 

1930 past = "pred {0}" 

1931 future = "za {0}" 

1932 

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

1934 "now": "sega", 

1935 "second": "edna sekunda", 

1936 "seconds": { 

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

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

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

1940 }, 

1941 "minute": "edna minuta", 

1942 "minutes": { 

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

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

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

1946 }, 

1947 "hour": "eden saat", 

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

1949 "day": "eden den", 

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

1951 "week": "edna nedela", 

1952 "weeks": { 

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

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

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

1956 }, 

1957 "month": "eden mesec", 

1958 "months": { 

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

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

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

1962 }, 

1963 "year": "edna godina", 

1964 "years": { 

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

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

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

1968 }, 

1969 } 

1970 

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

1972 

1973 month_names = [ 

1974 "", 

1975 "Januari", 

1976 "Fevruari", 

1977 "Mart", 

1978 "April", 

1979 "Maj", 

1980 "Juni", 

1981 "Juli", 

1982 "Avgust", 

1983 "Septemvri", 

1984 "Oktomvri", 

1985 "Noemvri", 

1986 "Dekemvri", 

1987 ] 

1988 month_abbreviations = [ 

1989 "", 

1990 "Jan", 

1991 "Fev", 

1992 "Mar", 

1993 "Apr", 

1994 "Maj", 

1995 "Jun", 

1996 "Jul", 

1997 "Avg", 

1998 "Sep", 

1999 "Okt", 

2000 "Noe", 

2001 "Dek", 

2002 ] 

2003 

2004 day_names = [ 

2005 "", 

2006 "Ponedelnik", 

2007 "Vtornik", 

2008 "Sreda", 

2009 "Chetvrtok", 

2010 "Petok", 

2011 "Sabota", 

2012 "Nedela", 

2013 ] 

2014 day_abbreviations = [ 

2015 "", 

2016 "Pon", 

2017 "Vt", 

2018 "Sre", 

2019 "Chet", 

2020 "Pet", 

2021 "Sab", 

2022 "Ned", 

2023 ] 

2024 

2025 

2026class GermanBaseLocale(Locale): 

2027 past = "vor {0}" 

2028 future = "in {0}" 

2029 and_word = "und" 

2030 

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

2032 "now": "gerade eben", 

2033 "second": "einer Sekunde", 

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

2035 "minute": "einer Minute", 

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

2037 "hour": "einer Stunde", 

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

2039 "day": "einem Tag", 

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

2041 "week": "einer Woche", 

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

2043 "month": "einem Monat", 

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

2045 "year": "einem Jahr", 

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

2047 } 

2048 

2049 timeframes_only_distance = timeframes.copy() 

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

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

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

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

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

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

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

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

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

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

2060 

2061 month_names = [ 

2062 "", 

2063 "Januar", 

2064 "Februar", 

2065 "März", 

2066 "April", 

2067 "Mai", 

2068 "Juni", 

2069 "Juli", 

2070 "August", 

2071 "September", 

2072 "Oktober", 

2073 "November", 

2074 "Dezember", 

2075 ] 

2076 

2077 month_abbreviations = [ 

2078 "", 

2079 "Jan", 

2080 "Feb", 

2081 "Mär", 

2082 "Apr", 

2083 "Mai", 

2084 "Jun", 

2085 "Jul", 

2086 "Aug", 

2087 "Sep", 

2088 "Okt", 

2089 "Nov", 

2090 "Dez", 

2091 ] 

2092 

2093 day_names = [ 

2094 "", 

2095 "Montag", 

2096 "Dienstag", 

2097 "Mittwoch", 

2098 "Donnerstag", 

2099 "Freitag", 

2100 "Samstag", 

2101 "Sonntag", 

2102 ] 

2103 

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

2105 

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

2107 return f"{n}." 

2108 

2109 def describe( 

2110 self, 

2111 timeframe: TimeFrameLiteral, 

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

2113 only_distance: bool = False, 

2114 ) -> str: 

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

2116 

2117 :param timeframe: a string representing a timeframe. 

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

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

2120 """ 

2121 

2122 if not only_distance: 

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

2124 

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

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

2127 trunc(abs(delta)) 

2128 ) 

2129 

2130 return humanized 

2131 

2132 

2133class GermanLocale(GermanBaseLocale, Locale): 

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

2135 

2136 

2137class SwissLocale(GermanBaseLocale, Locale): 

2138 names = ["de-ch"] 

2139 

2140 

2141class AustrianLocale(GermanBaseLocale, Locale): 

2142 names = ["de-at"] 

2143 

2144 month_names = [ 

2145 "", 

2146 "Jänner", 

2147 "Februar", 

2148 "März", 

2149 "April", 

2150 "Mai", 

2151 "Juni", 

2152 "Juli", 

2153 "August", 

2154 "September", 

2155 "Oktober", 

2156 "November", 

2157 "Dezember", 

2158 ] 

2159 

2160 

2161class NorwegianLocale(Locale): 

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

2163 

2164 past = "for {0} siden" 

2165 future = "om {0}" 

2166 

2167 timeframes = { 

2168 "now": "nå nettopp", 

2169 "second": "ett sekund", 

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

2171 "minute": "ett minutt", 

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

2173 "hour": "en time", 

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

2175 "day": "en dag", 

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

2177 "week": "en uke", 

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

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

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

2181 "year": "ett år", 

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

2183 } 

2184 

2185 month_names = [ 

2186 "", 

2187 "januar", 

2188 "februar", 

2189 "mars", 

2190 "april", 

2191 "mai", 

2192 "juni", 

2193 "juli", 

2194 "august", 

2195 "september", 

2196 "oktober", 

2197 "november", 

2198 "desember", 

2199 ] 

2200 month_abbreviations = [ 

2201 "", 

2202 "jan", 

2203 "feb", 

2204 "mar", 

2205 "apr", 

2206 "mai", 

2207 "jun", 

2208 "jul", 

2209 "aug", 

2210 "sep", 

2211 "okt", 

2212 "nov", 

2213 "des", 

2214 ] 

2215 

2216 day_names = [ 

2217 "", 

2218 "mandag", 

2219 "tirsdag", 

2220 "onsdag", 

2221 "torsdag", 

2222 "fredag", 

2223 "lørdag", 

2224 "søndag", 

2225 ] 

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

2227 

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

2229 return f"{n}." 

2230 

2231 

2232class NewNorwegianLocale(Locale): 

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

2234 

2235 past = "for {0} sidan" 

2236 future = "om {0}" 

2237 

2238 timeframes = { 

2239 "now": "no nettopp", 

2240 "second": "eitt sekund", 

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

2242 "minute": "eitt minutt", 

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

2244 "hour": "ein time", 

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

2246 "day": "ein dag", 

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

2248 "week": "ei veke", 

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

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

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

2252 "year": "eitt år", 

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

2254 } 

2255 

2256 month_names = [ 

2257 "", 

2258 "januar", 

2259 "februar", 

2260 "mars", 

2261 "april", 

2262 "mai", 

2263 "juni", 

2264 "juli", 

2265 "august", 

2266 "september", 

2267 "oktober", 

2268 "november", 

2269 "desember", 

2270 ] 

2271 month_abbreviations = [ 

2272 "", 

2273 "jan", 

2274 "feb", 

2275 "mar", 

2276 "apr", 

2277 "mai", 

2278 "jun", 

2279 "jul", 

2280 "aug", 

2281 "sep", 

2282 "okt", 

2283 "nov", 

2284 "des", 

2285 ] 

2286 

2287 day_names = [ 

2288 "", 

2289 "måndag", 

2290 "tysdag", 

2291 "onsdag", 

2292 "torsdag", 

2293 "fredag", 

2294 "laurdag", 

2295 "sundag", 

2296 ] 

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

2298 

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

2300 return f"{n}." 

2301 

2302 

2303class PortugueseLocale(Locale): 

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

2305 

2306 past = "há {0}" 

2307 future = "em {0}" 

2308 and_word = "e" 

2309 

2310 timeframes = { 

2311 "now": "agora", 

2312 "second": "um segundo", 

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

2314 "minute": "um minuto", 

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

2316 "hour": "uma hora", 

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

2318 "day": "um dia", 

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

2320 "week": "uma semana", 

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

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

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

2324 "year": "um ano", 

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

2326 } 

2327 

2328 month_names = [ 

2329 "", 

2330 "Janeiro", 

2331 "Fevereiro", 

2332 "Março", 

2333 "Abril", 

2334 "Maio", 

2335 "Junho", 

2336 "Julho", 

2337 "Agosto", 

2338 "Setembro", 

2339 "Outubro", 

2340 "Novembro", 

2341 "Dezembro", 

2342 ] 

2343 month_abbreviations = [ 

2344 "", 

2345 "Jan", 

2346 "Fev", 

2347 "Mar", 

2348 "Abr", 

2349 "Mai", 

2350 "Jun", 

2351 "Jul", 

2352 "Ago", 

2353 "Set", 

2354 "Out", 

2355 "Nov", 

2356 "Dez", 

2357 ] 

2358 

2359 day_names = [ 

2360 "", 

2361 "Segunda-feira", 

2362 "Terça-feira", 

2363 "Quarta-feira", 

2364 "Quinta-feira", 

2365 "Sexta-feira", 

2366 "Sábado", 

2367 "Domingo", 

2368 ] 

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

2370 

2371 

2372class BrazilianPortugueseLocale(PortugueseLocale): 

2373 names = ["pt-br"] 

2374 

2375 past = "faz {0}" 

2376 

2377 

2378class TagalogLocale(Locale): 

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

2380 

2381 past = "nakaraang {0}" 

2382 future = "{0} mula ngayon" 

2383 

2384 timeframes = { 

2385 "now": "ngayon lang", 

2386 "second": "isang segundo", 

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

2388 "minute": "isang minuto", 

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

2390 "hour": "isang oras", 

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

2392 "day": "isang araw", 

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

2394 "week": "isang linggo", 

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

2396 "month": "isang buwan", 

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

2398 "year": "isang taon", 

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

2400 } 

2401 

2402 month_names = [ 

2403 "", 

2404 "Enero", 

2405 "Pebrero", 

2406 "Marso", 

2407 "Abril", 

2408 "Mayo", 

2409 "Hunyo", 

2410 "Hulyo", 

2411 "Agosto", 

2412 "Setyembre", 

2413 "Oktubre", 

2414 "Nobyembre", 

2415 "Disyembre", 

2416 ] 

2417 month_abbreviations = [ 

2418 "", 

2419 "Ene", 

2420 "Peb", 

2421 "Mar", 

2422 "Abr", 

2423 "May", 

2424 "Hun", 

2425 "Hul", 

2426 "Ago", 

2427 "Set", 

2428 "Okt", 

2429 "Nob", 

2430 "Dis", 

2431 ] 

2432 

2433 day_names = [ 

2434 "", 

2435 "Lunes", 

2436 "Martes", 

2437 "Miyerkules", 

2438 "Huwebes", 

2439 "Biyernes", 

2440 "Sabado", 

2441 "Linggo", 

2442 ] 

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

2444 

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

2446 

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

2448 return f"ika-{n}" 

2449 

2450 

2451class VietnameseLocale(Locale): 

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

2453 

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

2455 future = "{0} nữa" 

2456 

2457 timeframes = { 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2473 } 

2474 

2475 month_names = [ 

2476 "", 

2477 "Tháng Một", 

2478 "Tháng Hai", 

2479 "Tháng Ba", 

2480 "Tháng Tư", 

2481 "Tháng Năm", 

2482 "Tháng Sáu", 

2483 "Tháng Bảy", 

2484 "Tháng Tám", 

2485 "Tháng Chín", 

2486 "Tháng Mười", 

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

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

2489 ] 

2490 month_abbreviations = [ 

2491 "", 

2492 "Tháng 1", 

2493 "Tháng 2", 

2494 "Tháng 3", 

2495 "Tháng 4", 

2496 "Tháng 5", 

2497 "Tháng 6", 

2498 "Tháng 7", 

2499 "Tháng 8", 

2500 "Tháng 9", 

2501 "Tháng 10", 

2502 "Tháng 11", 

2503 "Tháng 12", 

2504 ] 

2505 

2506 day_names = [ 

2507 "", 

2508 "Thứ Hai", 

2509 "Thứ Ba", 

2510 "Thứ Tư", 

2511 "Thứ Năm", 

2512 "Thứ Sáu", 

2513 "Thứ Bảy", 

2514 "Chủ Nhật", 

2515 ] 

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

2517 

2518 

2519class TurkishLocale(Locale): 

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

2521 

2522 past = "{0} önce" 

2523 future = "{0} sonra" 

2524 and_word = "ve" 

2525 

2526 timeframes = { 

2527 "now": "şimdi", 

2528 "second": "bir saniye", 

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

2530 "minute": "bir dakika", 

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

2532 "hour": "bir saat", 

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

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

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

2536 "week": "bir hafta", 

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

2538 "month": "bir ay", 

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

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

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

2542 } 

2543 

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

2545 

2546 month_names = [ 

2547 "", 

2548 "Ocak", 

2549 "Şubat", 

2550 "Mart", 

2551 "Nisan", 

2552 "Mayıs", 

2553 "Haziran", 

2554 "Temmuz", 

2555 "Ağustos", 

2556 "Eylül", 

2557 "Ekim", 

2558 "Kasım", 

2559 "Aralık", 

2560 ] 

2561 month_abbreviations = [ 

2562 "", 

2563 "Oca", 

2564 "Şub", 

2565 "Mar", 

2566 "Nis", 

2567 "May", 

2568 "Haz", 

2569 "Tem", 

2570 "Ağu", 

2571 "Eyl", 

2572 "Eki", 

2573 "Kas", 

2574 "Ara", 

2575 ] 

2576 

2577 day_names = [ 

2578 "", 

2579 "Pazartesi", 

2580 "Salı", 

2581 "Çarşamba", 

2582 "Perşembe", 

2583 "Cuma", 

2584 "Cumartesi", 

2585 "Pazar", 

2586 ] 

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

2588 

2589 

2590class AzerbaijaniLocale(Locale): 

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

2592 

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

2594 future = "{0} sonra" 

2595 

2596 timeframes = { 

2597 "now": "indi", 

2598 "second": "bir saniyə", 

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

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

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

2602 "hour": "bir saat", 

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

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

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

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

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

2608 "month": "bir ay", 

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

2610 "year": "bir il", 

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

2612 } 

2613 

2614 month_names = [ 

2615 "", 

2616 "Yanvar", 

2617 "Fevral", 

2618 "Mart", 

2619 "Aprel", 

2620 "May", 

2621 "İyun", 

2622 "İyul", 

2623 "Avqust", 

2624 "Sentyabr", 

2625 "Oktyabr", 

2626 "Noyabr", 

2627 "Dekabr", 

2628 ] 

2629 month_abbreviations = [ 

2630 "", 

2631 "Yan", 

2632 "Fev", 

2633 "Mar", 

2634 "Apr", 

2635 "May", 

2636 "İyn", 

2637 "İyl", 

2638 "Avq", 

2639 "Sen", 

2640 "Okt", 

2641 "Noy", 

2642 "Dek", 

2643 ] 

2644 

2645 day_names = [ 

2646 "", 

2647 "Bazar ertəsi", 

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

2649 "Çərşənbə", 

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

2651 "Cümə", 

2652 "Şənbə", 

2653 "Bazar", 

2654 ] 

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

2656 

2657 

2658class ArabicLocale(Locale): 

2659 names = [ 

2660 "ar", 

2661 "ar-ae", 

2662 "ar-bh", 

2663 "ar-dj", 

2664 "ar-eg", 

2665 "ar-eh", 

2666 "ar-er", 

2667 "ar-km", 

2668 "ar-kw", 

2669 "ar-ly", 

2670 "ar-om", 

2671 "ar-qa", 

2672 "ar-sa", 

2673 "ar-sd", 

2674 "ar-so", 

2675 "ar-ss", 

2676 "ar-td", 

2677 "ar-ye", 

2678 ] 

2679 

2680 past = "منذ {0}" 

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

2682 

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

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

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

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

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

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

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

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

2691 "day": "يوم", 

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

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

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

2695 "month": "شهر", 

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

2697 "year": "سنة", 

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

2699 } 

2700 

2701 month_names = [ 

2702 "", 

2703 "يناير", 

2704 "فبراير", 

2705 "مارس", 

2706 "أبريل", 

2707 "مايو", 

2708 "يونيو", 

2709 "يوليو", 

2710 "أغسطس", 

2711 "سبتمبر", 

2712 "أكتوبر", 

2713 "نوفمبر", 

2714 "ديسمبر", 

2715 ] 

2716 month_abbreviations = [ 

2717 "", 

2718 "يناير", 

2719 "فبراير", 

2720 "مارس", 

2721 "أبريل", 

2722 "مايو", 

2723 "يونيو", 

2724 "يوليو", 

2725 "أغسطس", 

2726 "سبتمبر", 

2727 "أكتوبر", 

2728 "نوفمبر", 

2729 "ديسمبر", 

2730 ] 

2731 

2732 day_names = [ 

2733 "", 

2734 "الإثنين", 

2735 "الثلاثاء", 

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

2737 "الخميس", 

2738 "الجمعة", 

2739 "السبت", 

2740 "الأحد", 

2741 ] 

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

2743 

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

2745 form = self.timeframes[timeframe] 

2746 delta = abs(delta) 

2747 if isinstance(form, Mapping): 

2748 if delta == 2: 

2749 form = form["2"] 

2750 elif 2 < delta <= 10: 

2751 form = form["ten"] 

2752 else: 

2753 form = form["higher"] 

2754 

2755 return form.format(delta) 

2756 

2757 

2758class LevantArabicLocale(ArabicLocale): 

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

2760 month_names = [ 

2761 "", 

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

2763 "شباط", 

2764 "آذار", 

2765 "نيسان", 

2766 "أيار", 

2767 "حزيران", 

2768 "تموز", 

2769 "آب", 

2770 "أيلول", 

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

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

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

2774 ] 

2775 month_abbreviations = [ 

2776 "", 

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

2778 "شباط", 

2779 "آذار", 

2780 "نيسان", 

2781 "أيار", 

2782 "حزيران", 

2783 "تموز", 

2784 "آب", 

2785 "أيلول", 

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

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

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

2789 ] 

2790 

2791 

2792class AlgeriaTunisiaArabicLocale(ArabicLocale): 

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

2794 month_names = [ 

2795 "", 

2796 "جانفي", 

2797 "فيفري", 

2798 "مارس", 

2799 "أفريل", 

2800 "ماي", 

2801 "جوان", 

2802 "جويلية", 

2803 "أوت", 

2804 "سبتمبر", 

2805 "أكتوبر", 

2806 "نوفمبر", 

2807 "ديسمبر", 

2808 ] 

2809 month_abbreviations = [ 

2810 "", 

2811 "جانفي", 

2812 "فيفري", 

2813 "مارس", 

2814 "أفريل", 

2815 "ماي", 

2816 "جوان", 

2817 "جويلية", 

2818 "أوت", 

2819 "سبتمبر", 

2820 "أكتوبر", 

2821 "نوفمبر", 

2822 "ديسمبر", 

2823 ] 

2824 

2825 

2826class MauritaniaArabicLocale(ArabicLocale): 

2827 names = ["ar-mr"] 

2828 month_names = [ 

2829 "", 

2830 "يناير", 

2831 "فبراير", 

2832 "مارس", 

2833 "إبريل", 

2834 "مايو", 

2835 "يونيو", 

2836 "يوليو", 

2837 "أغشت", 

2838 "شتمبر", 

2839 "أكتوبر", 

2840 "نوفمبر", 

2841 "دجمبر", 

2842 ] 

2843 month_abbreviations = [ 

2844 "", 

2845 "يناير", 

2846 "فبراير", 

2847 "مارس", 

2848 "إبريل", 

2849 "مايو", 

2850 "يونيو", 

2851 "يوليو", 

2852 "أغشت", 

2853 "شتمبر", 

2854 "أكتوبر", 

2855 "نوفمبر", 

2856 "دجمبر", 

2857 ] 

2858 

2859 

2860class MoroccoArabicLocale(ArabicLocale): 

2861 names = ["ar-ma"] 

2862 month_names = [ 

2863 "", 

2864 "يناير", 

2865 "فبراير", 

2866 "مارس", 

2867 "أبريل", 

2868 "ماي", 

2869 "يونيو", 

2870 "يوليوز", 

2871 "غشت", 

2872 "شتنبر", 

2873 "أكتوبر", 

2874 "نونبر", 

2875 "دجنبر", 

2876 ] 

2877 month_abbreviations = [ 

2878 "", 

2879 "يناير", 

2880 "فبراير", 

2881 "مارس", 

2882 "أبريل", 

2883 "ماي", 

2884 "يونيو", 

2885 "يوليوز", 

2886 "غشت", 

2887 "شتنبر", 

2888 "أكتوبر", 

2889 "نونبر", 

2890 "دجنبر", 

2891 ] 

2892 

2893 

2894class IcelandicLocale(Locale): 

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

2896 form = self.timeframes[timeframe] 

2897 

2898 if isinstance(form, Mapping): 

2899 if delta < 0: 

2900 form = form["past"] 

2901 elif delta > 0: 

2902 form = form["future"] 

2903 else: 

2904 raise ValueError( 

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

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

2907 ) 

2908 # FIXME: handle when delta is 0 

2909 

2910 return form.format(abs(delta)) 

2911 

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

2913 

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

2915 future = "eftir {0}" 

2916 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2931 } 

2932 

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

2934 

2935 month_names = [ 

2936 "", 

2937 "janúar", 

2938 "febrúar", 

2939 "mars", 

2940 "apríl", 

2941 "maí", 

2942 "júní", 

2943 "júlí", 

2944 "ágúst", 

2945 "september", 

2946 "október", 

2947 "nóvember", 

2948 "desember", 

2949 ] 

2950 month_abbreviations = [ 

2951 "", 

2952 "jan", 

2953 "feb", 

2954 "mar", 

2955 "apr", 

2956 "maí", 

2957 "jún", 

2958 "júl", 

2959 "ágú", 

2960 "sep", 

2961 "okt", 

2962 "nóv", 

2963 "des", 

2964 ] 

2965 

2966 day_names = [ 

2967 "", 

2968 "mánudagur", 

2969 "þriðjudagur", 

2970 "miðvikudagur", 

2971 "fimmtudagur", 

2972 "föstudagur", 

2973 "laugardagur", 

2974 "sunnudagur", 

2975 ] 

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

2977 

2978 

2979class DanishLocale(Locale): 

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

2981 

2982 past = "for {0} siden" 

2983 future = "om {0}" 

2984 and_word = "og" 

2985 

2986 timeframes = { 

2987 "now": "lige nu", 

2988 "second": "et sekund", 

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

2990 "minute": "et minut", 

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

2992 "hour": "en time", 

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

2994 "day": "en dag", 

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

2996 "week": "en uge", 

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

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

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

3000 "year": "et år", 

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

3002 } 

3003 

3004 month_names = [ 

3005 "", 

3006 "januar", 

3007 "februar", 

3008 "marts", 

3009 "april", 

3010 "maj", 

3011 "juni", 

3012 "juli", 

3013 "august", 

3014 "september", 

3015 "oktober", 

3016 "november", 

3017 "december", 

3018 ] 

3019 month_abbreviations = [ 

3020 "", 

3021 "jan", 

3022 "feb", 

3023 "mar", 

3024 "apr", 

3025 "maj", 

3026 "jun", 

3027 "jul", 

3028 "aug", 

3029 "sep", 

3030 "okt", 

3031 "nov", 

3032 "dec", 

3033 ] 

3034 

3035 day_names = [ 

3036 "", 

3037 "mandag", 

3038 "tirsdag", 

3039 "onsdag", 

3040 "torsdag", 

3041 "fredag", 

3042 "lørdag", 

3043 "søndag", 

3044 ] 

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

3046 

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

3048 return f"{n}." 

3049 

3050 

3051class MalayalamLocale(Locale): 

3052 names = ["ml"] 

3053 

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

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

3056 

3057 timeframes = { 

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

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

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

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

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

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

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

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

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

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

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

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

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

3071 } 

3072 

3073 meridians = { 

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

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

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

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

3078 } 

3079 

3080 month_names = [ 

3081 "", 

3082 "ജനുവരി", 

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

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

3085 "ഏപ്രിൽ ", 

3086 "മെയ്‌ ", 

3087 "ജൂണ്‍", 

3088 "ജൂലൈ", 

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

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

3091 "ഒക്ടോബർ", 

3092 "നവംബർ", 

3093 "ഡിസംബർ", 

3094 ] 

3095 month_abbreviations = [ 

3096 "", 

3097 "ജനു", 

3098 "ഫെബ് ", 

3099 "മാർ", 

3100 "ഏപ്രിൽ", 

3101 "മേയ്", 

3102 "ജൂണ്‍", 

3103 "ജൂലൈ", 

3104 "ഓഗസ്റ", 

3105 "സെപ്റ്റ", 

3106 "ഒക്ടോ", 

3107 "നവം", 

3108 "ഡിസം", 

3109 ] 

3110 

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

3112 day_abbreviations = [ 

3113 "", 

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

3115 "ചൊവ്വ", 

3116 "ബുധന്‍", 

3117 "വ്യാഴം", 

3118 "വെള്ളി", 

3119 "ശനി", 

3120 "ഞായര്‍", 

3121 ] 

3122 

3123 

3124class HindiLocale(Locale): 

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

3126 

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

3128 future = "{0} बाद" 

3129 

3130 timeframes = { 

3131 "now": "अभी", 

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

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

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

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

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

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

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

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

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

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

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

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

3144 } 

3145 

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

3147 

3148 month_names = [ 

3149 "", 

3150 "जनवरी", 

3151 "फरवरी", 

3152 "मार्च", 

3153 "अप्रैल ", 

3154 "मई", 

3155 "जून", 

3156 "जुलाई", 

3157 "अगस्त", 

3158 "सितंबर", 

3159 "अक्टूबर", 

3160 "नवंबर", 

3161 "दिसंबर", 

3162 ] 

3163 month_abbreviations = [ 

3164 "", 

3165 "जन", 

3166 "फ़र", 

3167 "मार्च", 

3168 "अप्रै", 

3169 "मई", 

3170 "जून", 

3171 "जुलाई", 

3172 "आग", 

3173 "सित", 

3174 "अकत", 

3175 "नवे", 

3176 "दिस", 

3177 ] 

3178 

3179 day_names = [ 

3180 "", 

3181 "सोमवार", 

3182 "मंगलवार", 

3183 "बुधवार", 

3184 "गुरुवार", 

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

3186 "शनिवार", 

3187 "रविवार", 

3188 ] 

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

3190 

3191 

3192class CzechLocale(Locale): 

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

3194 

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

3196 "now": "Teď", 

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

3198 "seconds": { 

3199 "zero": "vteřina", 

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

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

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

3203 }, 

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

3205 "minutes": { 

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

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

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

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

3210 }, 

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

3212 "hours": { 

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

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

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

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

3217 }, 

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

3219 "days": { 

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

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

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

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

3224 }, 

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

3226 "weeks": { 

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

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

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

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

3231 }, 

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

3233 "months": { 

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

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

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

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

3238 }, 

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

3240 "years": { 

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

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

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

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

3245 }, 

3246 } 

3247 

3248 past = "Před {0}" 

3249 future = "Za {0}" 

3250 

3251 month_names = [ 

3252 "", 

3253 "leden", 

3254 "únor", 

3255 "březen", 

3256 "duben", 

3257 "květen", 

3258 "červen", 

3259 "červenec", 

3260 "srpen", 

3261 "září", 

3262 "říjen", 

3263 "listopad", 

3264 "prosinec", 

3265 ] 

3266 month_abbreviations = [ 

3267 "", 

3268 "led", 

3269 "úno", 

3270 "bře", 

3271 "dub", 

3272 "kvě", 

3273 "čvn", 

3274 "čvc", 

3275 "srp", 

3276 "zář", 

3277 "říj", 

3278 "lis", 

3279 "pro", 

3280 ] 

3281 

3282 day_names = [ 

3283 "", 

3284 "pondělí", 

3285 "úterý", 

3286 "středa", 

3287 "čtvrtek", 

3288 "pátek", 

3289 "sobota", 

3290 "neděle", 

3291 ] 

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

3293 

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

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

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

3297 abs_delta = abs(delta) 

3298 form = self.timeframes[timeframe] 

3299 

3300 if isinstance(form, str): 

3301 return form.format(abs_delta) 

3302 

3303 if delta == 0: 

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

3305 elif delta < 0: 

3306 key = "past" 

3307 else: 

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

3309 if "future-singular" not in form: 

3310 key = "future" 

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

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

3313 ): 

3314 key = "future-singular" 

3315 else: 

3316 key = "future-paucal" 

3317 

3318 form: str = form[key] 

3319 return form.format(abs_delta) 

3320 

3321 

3322class SlovakLocale(Locale): 

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

3324 

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

3326 "now": "Teraz", 

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

3328 "seconds": { 

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

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

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

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

3333 }, 

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

3335 "minutes": { 

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

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

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

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

3340 }, 

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

3342 "hours": { 

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

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

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

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

3347 }, 

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

3349 "days": { 

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

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

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

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

3354 }, 

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

3356 "weeks": { 

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

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

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

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

3361 }, 

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

3363 "months": { 

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

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

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

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

3368 }, 

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

3370 "years": { 

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

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

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

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

3375 }, 

3376 } 

3377 

3378 past = "Pred {0}" 

3379 future = "O {0}" 

3380 and_word = "a" 

3381 

3382 month_names = [ 

3383 "", 

3384 "január", 

3385 "február", 

3386 "marec", 

3387 "apríl", 

3388 "máj", 

3389 "jún", 

3390 "júl", 

3391 "august", 

3392 "september", 

3393 "október", 

3394 "november", 

3395 "december", 

3396 ] 

3397 month_abbreviations = [ 

3398 "", 

3399 "jan", 

3400 "feb", 

3401 "mar", 

3402 "apr", 

3403 "máj", 

3404 "jún", 

3405 "júl", 

3406 "aug", 

3407 "sep", 

3408 "okt", 

3409 "nov", 

3410 "dec", 

3411 ] 

3412 

3413 day_names = [ 

3414 "", 

3415 "pondelok", 

3416 "utorok", 

3417 "streda", 

3418 "štvrtok", 

3419 "piatok", 

3420 "sobota", 

3421 "nedeľa", 

3422 ] 

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

3424 

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

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

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

3428 abs_delta = abs(delta) 

3429 form = self.timeframes[timeframe] 

3430 

3431 if isinstance(form, str): 

3432 return form.format(abs_delta) 

3433 

3434 if delta == 0: 

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

3436 elif delta < 0: 

3437 key = "past" 

3438 else: 

3439 if "future-singular" not in form: 

3440 key = "future" 

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

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

3443 ): 

3444 key = "future-singular" 

3445 else: 

3446 key = "future-paucal" 

3447 

3448 form: str = form[key] 

3449 return form.format(abs_delta) 

3450 

3451 

3452class FarsiLocale(Locale): 

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

3454 

3455 past = "{0} قبل" 

3456 future = "در {0}" 

3457 

3458 timeframes = { 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3476 } 

3477 

3478 meridians = { 

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

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

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

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

3483 } 

3484 

3485 month_names = [ 

3486 "", 

3487 "ژانویه", 

3488 "فوریه", 

3489 "مارس", 

3490 "آوریل", 

3491 "مه", 

3492 "ژوئن", 

3493 "ژوئیه", 

3494 "اوت", 

3495 "سپتامبر", 

3496 "اکتبر", 

3497 "نوامبر", 

3498 "دسامبر", 

3499 ] 

3500 month_abbreviations = [ 

3501 "", 

3502 "ژانویه", 

3503 "فوریه", 

3504 "مارس", 

3505 "آوریل", 

3506 "مه", 

3507 "ژوئن", 

3508 "ژوئیه", 

3509 "اوت", 

3510 "سپتامبر", 

3511 "اکتبر", 

3512 "نوامبر", 

3513 "دسامبر", 

3514 ] 

3515 

3516 day_names = [ 

3517 "", 

3518 "دو شنبه", 

3519 "سه شنبه", 

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

3521 "پنجشنبه", 

3522 "جمعه", 

3523 "شنبه", 

3524 "یکشنبه", 

3525 ] 

3526 day_abbreviations = [ 

3527 "", 

3528 "دو شنبه", 

3529 "سه شنبه", 

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

3531 "پنجشنبه", 

3532 "جمعه", 

3533 "شنبه", 

3534 "یکشنبه", 

3535 ] 

3536 

3537 

3538class HebrewLocale(Locale): 

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

3540 

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

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

3543 and_word = "ו" 

3544 

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

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

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

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

3549 "minute": "דקה", 

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

3551 "hour": "שעה", 

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

3553 "day": "יום", 

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

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

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

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

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

3559 "year": "שנה", 

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

3561 } 

3562 

3563 meridians = { 

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

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

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

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

3568 } 

3569 

3570 month_names = [ 

3571 "", 

3572 "ינואר", 

3573 "פברואר", 

3574 "מרץ", 

3575 "אפריל", 

3576 "מאי", 

3577 "יוני", 

3578 "יולי", 

3579 "אוגוסט", 

3580 "ספטמבר", 

3581 "אוקטובר", 

3582 "נובמבר", 

3583 "דצמבר", 

3584 ] 

3585 month_abbreviations = [ 

3586 "", 

3587 "ינו׳", 

3588 "פבר׳", 

3589 "מרץ", 

3590 "אפר׳", 

3591 "מאי", 

3592 "יוני", 

3593 "יולי", 

3594 "אוג׳", 

3595 "ספט׳", 

3596 "אוק׳", 

3597 "נוב׳", 

3598 "דצמ׳", 

3599 ] 

3600 

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

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

3603 

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

3605 form = self.timeframes[timeframe] 

3606 delta = abs(delta) 

3607 if isinstance(form, Mapping): 

3608 if delta == 2: 

3609 form = form["2"] 

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

3611 form = form["ten"] 

3612 else: 

3613 form = form["higher"] 

3614 

3615 return form.format(delta) 

3616 

3617 def describe_multi( 

3618 self, 

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

3620 only_distance: bool = False, 

3621 ) -> str: 

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

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

3624 

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

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

3627 """ 

3628 

3629 humanized = "" 

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

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

3632 if index == 0: 

3633 humanized = last_humanized 

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

3635 humanized += " " + self.and_word 

3636 if last_humanized[0].isdecimal(): 

3637 humanized += "־" 

3638 humanized += last_humanized 

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

3640 humanized += ", " + last_humanized 

3641 

3642 if not only_distance: 

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

3644 

3645 return humanized 

3646 

3647 

3648class MarathiLocale(Locale): 

3649 names = ["mr"] 

3650 

3651 past = "{0} आधी" 

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

3653 

3654 timeframes = { 

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

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

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

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

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

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

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

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

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

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

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

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

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

3668 } 

3669 

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

3671 

3672 month_names = [ 

3673 "", 

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

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

3676 "मार्च", 

3677 "एप्रिल", 

3678 "मे", 

3679 "जून", 

3680 "जुलै", 

3681 "अॉगस्ट", 

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

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

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

3685 "डिसेंबर", 

3686 ] 

3687 month_abbreviations = [ 

3688 "", 

3689 "जान", 

3690 "फेब्रु", 

3691 "मार्च", 

3692 "एप्रि", 

3693 "मे", 

3694 "जून", 

3695 "जुलै", 

3696 "अॉग", 

3697 "सप्टें", 

3698 "अॉक्टो", 

3699 "नोव्हें", 

3700 "डिसें", 

3701 ] 

3702 

3703 day_names = [ 

3704 "", 

3705 "सोमवार", 

3706 "मंगळवार", 

3707 "बुधवार", 

3708 "गुरुवार", 

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

3710 "शनिवार", 

3711 "रविवार", 

3712 ] 

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

3714 

3715 

3716class CatalanLocale(Locale): 

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

3718 past = "Fa {0}" 

3719 future = "En {0}" 

3720 and_word = "i" 

3721 

3722 timeframes = { 

3723 "now": "Ara mateix", 

3724 "second": "un segon", 

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

3726 "minute": "un minut", 

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

3728 "hour": "una hora", 

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

3730 "day": "un dia", 

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

3732 "week": "una setmana", 

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

3734 "month": "un mes", 

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

3736 "year": "un any", 

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

3738 } 

3739 

3740 month_names = [ 

3741 "", 

3742 "gener", 

3743 "febrer", 

3744 "març", 

3745 "abril", 

3746 "maig", 

3747 "juny", 

3748 "juliol", 

3749 "agost", 

3750 "setembre", 

3751 "octubre", 

3752 "novembre", 

3753 "desembre", 

3754 ] 

3755 month_abbreviations = [ 

3756 "", 

3757 "gen.", 

3758 "febr.", 

3759 "març", 

3760 "abr.", 

3761 "maig", 

3762 "juny", 

3763 "jul.", 

3764 "ag.", 

3765 "set.", 

3766 "oct.", 

3767 "nov.", 

3768 "des.", 

3769 ] 

3770 day_names = [ 

3771 "", 

3772 "dilluns", 

3773 "dimarts", 

3774 "dimecres", 

3775 "dijous", 

3776 "divendres", 

3777 "dissabte", 

3778 "diumenge", 

3779 ] 

3780 day_abbreviations = [ 

3781 "", 

3782 "dl.", 

3783 "dt.", 

3784 "dc.", 

3785 "dj.", 

3786 "dv.", 

3787 "ds.", 

3788 "dg.", 

3789 ] 

3790 

3791 

3792class BasqueLocale(Locale): 

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

3794 past = "duela {0}" 

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

3796 

3797 timeframes = { 

3798 "now": "Orain", 

3799 "second": "segundo bat", 

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

3801 "minute": "minutu bat", 

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

3803 "hour": "ordu bat", 

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

3805 "day": "egun bat", 

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

3807 "month": "hilabete bat", 

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

3809 "year": "urte bat", 

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

3811 } 

3812 

3813 month_names = [ 

3814 "", 

3815 "urtarrilak", 

3816 "otsailak", 

3817 "martxoak", 

3818 "apirilak", 

3819 "maiatzak", 

3820 "ekainak", 

3821 "uztailak", 

3822 "abuztuak", 

3823 "irailak", 

3824 "urriak", 

3825 "azaroak", 

3826 "abenduak", 

3827 ] 

3828 month_abbreviations = [ 

3829 "", 

3830 "urt", 

3831 "ots", 

3832 "mar", 

3833 "api", 

3834 "mai", 

3835 "eka", 

3836 "uzt", 

3837 "abu", 

3838 "ira", 

3839 "urr", 

3840 "aza", 

3841 "abe", 

3842 ] 

3843 day_names = [ 

3844 "", 

3845 "astelehena", 

3846 "asteartea", 

3847 "asteazkena", 

3848 "osteguna", 

3849 "ostirala", 

3850 "larunbata", 

3851 "igandea", 

3852 ] 

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

3854 

3855 

3856class HungarianLocale(Locale): 

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

3858 

3859 past = "{0} ezelőtt" 

3860 future = "{0} múlva" 

3861 

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

3863 "now": "éppen most", 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3878 } 

3879 

3880 month_names = [ 

3881 "", 

3882 "január", 

3883 "február", 

3884 "március", 

3885 "április", 

3886 "május", 

3887 "június", 

3888 "július", 

3889 "augusztus", 

3890 "szeptember", 

3891 "október", 

3892 "november", 

3893 "december", 

3894 ] 

3895 month_abbreviations = [ 

3896 "", 

3897 "jan", 

3898 "febr", 

3899 "márc", 

3900 "ápr", 

3901 "máj", 

3902 "jún", 

3903 "júl", 

3904 "aug", 

3905 "szept", 

3906 "okt", 

3907 "nov", 

3908 "dec", 

3909 ] 

3910 

3911 day_names = [ 

3912 "", 

3913 "hétfő", 

3914 "kedd", 

3915 "szerda", 

3916 "csütörtök", 

3917 "péntek", 

3918 "szombat", 

3919 "vasárnap", 

3920 ] 

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

3922 

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

3924 

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

3926 form = self.timeframes[timeframe] 

3927 

3928 if isinstance(form, Mapping): 

3929 if delta > 0: 

3930 form = form["future"] 

3931 else: 

3932 form = form["past"] 

3933 

3934 return form.format(abs(delta)) 

3935 

3936 

3937class EsperantoLocale(Locale): 

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

3939 past = "antaŭ {0}" 

3940 future = "post {0}" 

3941 

3942 timeframes = { 

3943 "now": "nun", 

3944 "second": "sekundo", 

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

3946 "minute": "unu minuto", 

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

3948 "hour": "un horo", 

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

3950 "day": "unu tago", 

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

3952 "month": "unu monato", 

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

3954 "year": "unu jaro", 

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

3956 } 

3957 

3958 month_names = [ 

3959 "", 

3960 "januaro", 

3961 "februaro", 

3962 "marto", 

3963 "aprilo", 

3964 "majo", 

3965 "junio", 

3966 "julio", 

3967 "aŭgusto", 

3968 "septembro", 

3969 "oktobro", 

3970 "novembro", 

3971 "decembro", 

3972 ] 

3973 month_abbreviations = [ 

3974 "", 

3975 "jan", 

3976 "feb", 

3977 "mar", 

3978 "apr", 

3979 "maj", 

3980 "jun", 

3981 "jul", 

3982 "aŭg", 

3983 "sep", 

3984 "okt", 

3985 "nov", 

3986 "dec", 

3987 ] 

3988 

3989 day_names = [ 

3990 "", 

3991 "lundo", 

3992 "mardo", 

3993 "merkredo", 

3994 "ĵaŭdo", 

3995 "vendredo", 

3996 "sabato", 

3997 "dimanĉo", 

3998 ] 

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

4000 

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

4002 

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

4004 

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

4006 return f"{n}a" 

4007 

4008 

4009class ThaiLocale(Locale): 

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

4011 

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

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

4014 

4015 timeframes = { 

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

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

4018 "seconds": "{0} ไม่กี่วินาที", 

4019 "minute": "1 นาที", 

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

4021 "hour": "1 ชั่วโมง", 

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

4023 "day": "1 วัน", 

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

4025 "month": "1 เดือน", 

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

4027 "year": "1 ปี", 

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

4029 } 

4030 

4031 month_names = [ 

4032 "", 

4033 "มกราคม", 

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

4035 "มีนาคม", 

4036 "เมษายน", 

4037 "พฤษภาคม", 

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

4039 "กรกฎาคม", 

4040 "สิงหาคม", 

4041 "กันยายน", 

4042 "ตุลาคม", 

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

4044 "ธันวาคม", 

4045 ] 

4046 month_abbreviations = [ 

4047 "", 

4048 "ม.ค.", 

4049 "ก.พ.", 

4050 "มี.ค.", 

4051 "เม.ย.", 

4052 "พ.ค.", 

4053 "มิ.ย.", 

4054 "ก.ค.", 

4055 "ส.ค.", 

4056 "ก.ย.", 

4057 "ต.ค.", 

4058 "พ.ย.", 

4059 "ธ.ค.", 

4060 ] 

4061 

4062 day_names = ["", "จันทร์", "อังคาร", "พุธ", "พฤหัสบดี", "ศุกร์", "เสาร์", "อาทิตย์"] 

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

4064 

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

4066 

4067 BE_OFFSET = 543 

4068 

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

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

4071 year += self.BE_OFFSET 

4072 return f"{year:04d}" 

4073 

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

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

4076 year += self.BE_OFFSET 

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

4078 

4079 def _format_relative( 

4080 self, 

4081 humanized: str, 

4082 timeframe: TimeFrameLiteral, 

4083 delta: Union[float, int], 

4084 ) -> str: 

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

4086 if timeframe == "now": 

4087 return humanized 

4088 

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

4090 relative_string = direction.format(humanized) 

4091 

4092 if timeframe == "seconds": 

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

4094 

4095 return relative_string 

4096 

4097 

4098class LaotianLocale(Locale): 

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

4100 

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

4102 future = "ໃນ {0}" 

4103 

4104 timeframes = { 

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

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

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

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

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

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

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

4112 "day": "ມື້", 

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

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

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

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

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

4118 "year": "ປີ", 

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

4120 } 

4121 

4122 month_names = [ 

4123 "", 

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

4125 "ກຸມພາ", # kumpha 

4126 "ມີນາ", # mina 

4127 "ເມສາ", # mesa 

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

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

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

4131 "ສິງຫາ", # singha 

4132 "ກັນຍາ", # knaia 

4133 "ຕຸລາ", # tula 

4134 "ພະຈິກ", # phachik 

4135 "ທັນວາ", # thanuaa 

4136 ] 

4137 month_abbreviations = [ 

4138 "", 

4139 "ມັງກອນ", 

4140 "ກຸມພາ", 

4141 "ມີນາ", 

4142 "ເມສາ", 

4143 "ພຶດສະພາ", 

4144 "ມິຖຸນາ", 

4145 "ກໍລະກົດ", 

4146 "ສິງຫາ", 

4147 "ກັນຍາ", 

4148 "ຕຸລາ", 

4149 "ພະຈິກ", 

4150 "ທັນວາ", 

4151 ] 

4152 

4153 day_names = [ 

4154 "", 

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

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

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

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

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

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

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

4162 ] 

4163 day_abbreviations = [ 

4164 "", 

4165 "ວັນຈັນ", 

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

4167 "ວັນພຸດ", 

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

4169 "ວັນ​ສຸກ", 

4170 "ວັນເສົາ", 

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

4172 ] 

4173 

4174 BE_OFFSET = 543 

4175 

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

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

4178 year += self.BE_OFFSET 

4179 return f"{year:04d}" 

4180 

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

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

4183 year += self.BE_OFFSET 

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

4185 

4186 def _format_relative( 

4187 self, 

4188 humanized: str, 

4189 timeframe: TimeFrameLiteral, 

4190 delta: Union[float, int], 

4191 ) -> str: 

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

4193 if timeframe == "now": 

4194 return humanized 

4195 

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

4197 relative_string = direction.format(humanized) 

4198 

4199 if timeframe == "seconds": 

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

4201 

4202 return relative_string 

4203 

4204 

4205class BengaliLocale(Locale): 

4206 names = ["bn", "bn-bd", "bn-in"] 

4207 

4208 past = "{0} আগে" 

4209 future = "{0} পরে" 

4210 

4211 timeframes = { 

4212 "now": "এখন", 

4213 "second": "একটি দ্বিতীয়", 

4214 "seconds": "{0} সেকেন্ড", 

4215 "minute": "এক মিনিট", 

4216 "minutes": "{0} মিনিট", 

4217 "hour": "এক ঘণ্টা", 

4218 "hours": "{0} ঘণ্টা", 

4219 "day": "এক দিন", 

4220 "days": "{0} দিন", 

4221 "month": "এক মাস", 

4222 "months": "{0} মাস ", 

4223 "year": "এক বছর", 

4224 "years": "{0} বছর", 

4225 } 

4226 

4227 meridians = {"am": "সকাল", "pm": "বিকাল", "AM": "সকাল", "PM": "বিকাল"} 

4228 

4229 month_names = [ 

4230 "", 

4231 "জানুয়ারি", 

4232 "ফেব্রুয়ারি", 

4233 "মার্চ", 

4234 "এপ্রিল", 

4235 "মে", 

4236 "জুন", 

4237 "জুলাই", 

4238 "আগস্ট", 

4239 "সেপ্টেম্বর", 

4240 "অক্টোবর", 

4241 "নভেম্বর", 

4242 "ডিসেম্বর", 

4243 ] 

4244 month_abbreviations = [ 

4245 "", 

4246 "জানু", 

4247 "ফেব", 

4248 "মার্চ", 

4249 "এপ্রি", 

4250 "মে", 

4251 "জুন", 

4252 "জুল", 

4253 "অগা", 

4254 "সেপ্ট", 

4255 "অক্টো", 

4256 "নভে", 

4257 "ডিসে", 

4258 ] 

4259 

4260 day_names = [ 

4261 "", 

4262 "সোমবার", 

4263 "মঙ্গলবার", 

4264 "বুধবার", 

4265 "বৃহস্পতিবার", 

4266 "শুক্রবার", 

4267 "শনিবার", 

4268 "রবিবার", 

4269 ] 

4270 day_abbreviations = ["", "সোম", "মঙ্গল", "বুধ", "বৃহঃ", "শুক্র", "শনি", "রবি"] 

4271 

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

4273 if n > 10 or n == 0: 

4274 return f"{n}তম" 

4275 if n in [1, 5, 7, 8, 9, 10]: 

4276 return f"{n}ম" 

4277 if n in [2, 3]: 

4278 return f"{n}য়" 

4279 if n == 4: 

4280 return f"{n}র্থ" 

4281 if n == 6: 

4282 return f"{n}ষ্ঠ" 

4283 return "" 

4284 

4285 

4286class RomanshLocale(Locale): 

4287 names = ["rm", "rm-ch"] 

4288 

4289 past = "avant {0}" 

4290 future = "en {0}" 

4291 

4292 timeframes = { 

4293 "now": "en quest mument", 

4294 "second": "in secunda", 

4295 "seconds": "{0} secundas", 

4296 "minute": "ina minuta", 

4297 "minutes": "{0} minutas", 

4298 "hour": "in'ura", 

4299 "hours": "{0} ura", 

4300 "day": "in di", 

4301 "days": "{0} dis", 

4302 "week": "in'emna", 

4303 "weeks": "{0} emnas", 

4304 "month": "in mais", 

4305 "months": "{0} mais", 

4306 "year": "in onn", 

4307 "years": "{0} onns", 

4308 } 

4309 

4310 month_names = [ 

4311 "", 

4312 "schaner", 

4313 "favrer", 

4314 "mars", 

4315 "avrigl", 

4316 "matg", 

4317 "zercladur", 

4318 "fanadur", 

4319 "avust", 

4320 "settember", 

4321 "october", 

4322 "november", 

4323 "december", 

4324 ] 

4325 

4326 month_abbreviations = [ 

4327 "", 

4328 "schan", 

4329 "fav", 

4330 "mars", 

4331 "avr", 

4332 "matg", 

4333 "zer", 

4334 "fan", 

4335 "avu", 

4336 "set", 

4337 "oct", 

4338 "nov", 

4339 "dec", 

4340 ] 

4341 

4342 day_names = [ 

4343 "", 

4344 "glindesdi", 

4345 "mardi", 

4346 "mesemna", 

4347 "gievgia", 

4348 "venderdi", 

4349 "sonda", 

4350 "dumengia", 

4351 ] 

4352 

4353 day_abbreviations = ["", "gli", "ma", "me", "gie", "ve", "so", "du"] 

4354 

4355 

4356class RomanianLocale(Locale): 

4357 names = ["ro", "ro-ro"] 

4358 

4359 past = "{0} în urmă" 

4360 future = "peste {0}" 

4361 and_word = "și" 

4362 

4363 timeframes = { 

4364 "now": "acum", 

4365 "second": "o secunda", 

4366 "seconds": "{0} câteva secunde", 

4367 "minute": "un minut", 

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

4369 "hour": "o oră", 

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

4371 "day": "o zi", 

4372 "days": "{0} zile", 

4373 "month": "o lună", 

4374 "months": "{0} luni", 

4375 "year": "un an", 

4376 "years": "{0} ani", 

4377 } 

4378 

4379 month_names = [ 

4380 "", 

4381 "ianuarie", 

4382 "februarie", 

4383 "martie", 

4384 "aprilie", 

4385 "mai", 

4386 "iunie", 

4387 "iulie", 

4388 "august", 

4389 "septembrie", 

4390 "octombrie", 

4391 "noiembrie", 

4392 "decembrie", 

4393 ] 

4394 month_abbreviations = [ 

4395 "", 

4396 "ian", 

4397 "febr", 

4398 "mart", 

4399 "apr", 

4400 "mai", 

4401 "iun", 

4402 "iul", 

4403 "aug", 

4404 "sept", 

4405 "oct", 

4406 "nov", 

4407 "dec", 

4408 ] 

4409 

4410 day_names = [ 

4411 "", 

4412 "luni", 

4413 "marți", 

4414 "miercuri", 

4415 "joi", 

4416 "vineri", 

4417 "sâmbătă", 

4418 "duminică", 

4419 ] 

4420 day_abbreviations = ["", "Lun", "Mar", "Mie", "Joi", "Vin", "Sâm", "Dum"] 

4421 

4422 

4423class SlovenianLocale(Locale): 

4424 names = ["sl", "sl-si"] 

4425 

4426 past = "pred {0}" 

4427 future = "čez {0}" 

4428 and_word = "in" 

4429 

4430 timeframes = { 

4431 "now": "zdaj", 

4432 "second": "sekundo", 

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

4434 "minute": "minuta", 

4435 "minutes": "{0} minutami", 

4436 "hour": "uro", 

4437 "hours": "{0} ur", 

4438 "day": "dan", 

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

4440 "month": "mesec", 

4441 "months": "{0} mesecev", 

4442 "year": "leto", 

4443 "years": "{0} let", 

4444 } 

4445 

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

4447 

4448 month_names = [ 

4449 "", 

4450 "Januar", 

4451 "Februar", 

4452 "Marec", 

4453 "April", 

4454 "Maj", 

4455 "Junij", 

4456 "Julij", 

4457 "Avgust", 

4458 "September", 

4459 "Oktober", 

4460 "November", 

4461 "December", 

4462 ] 

4463 

4464 month_abbreviations = [ 

4465 "", 

4466 "Jan", 

4467 "Feb", 

4468 "Mar", 

4469 "Apr", 

4470 "Maj", 

4471 "Jun", 

4472 "Jul", 

4473 "Avg", 

4474 "Sep", 

4475 "Okt", 

4476 "Nov", 

4477 "Dec", 

4478 ] 

4479 

4480 day_names = [ 

4481 "", 

4482 "Ponedeljek", 

4483 "Torek", 

4484 "Sreda", 

4485 "Četrtek", 

4486 "Petek", 

4487 "Sobota", 

4488 "Nedelja", 

4489 ] 

4490 

4491 day_abbreviations = ["", "Pon", "Tor", "Sre", "Čet", "Pet", "Sob", "Ned"] 

4492 

4493 

4494class IndonesianLocale(Locale): 

4495 names = ["id", "id-id"] 

4496 

4497 past = "{0} yang lalu" 

4498 future = "dalam {0}" 

4499 and_word = "dan" 

4500 

4501 timeframes = { 

4502 "now": "baru saja", 

4503 "second": "1 sebentar", 

4504 "seconds": "{0} detik", 

4505 "minute": "1 menit", 

4506 "minutes": "{0} menit", 

4507 "hour": "1 jam", 

4508 "hours": "{0} jam", 

4509 "day": "1 hari", 

4510 "days": "{0} hari", 

4511 "week": "1 minggu", 

4512 "weeks": "{0} minggu", 

4513 "month": "1 bulan", 

4514 "months": "{0} bulan", 

4515 "quarter": "1 kuartal", 

4516 "quarters": "{0} kuartal", 

4517 "year": "1 tahun", 

4518 "years": "{0} tahun", 

4519 } 

4520 

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

4522 

4523 month_names = [ 

4524 "", 

4525 "Januari", 

4526 "Februari", 

4527 "Maret", 

4528 "April", 

4529 "Mei", 

4530 "Juni", 

4531 "Juli", 

4532 "Agustus", 

4533 "September", 

4534 "Oktober", 

4535 "November", 

4536 "Desember", 

4537 ] 

4538 

4539 month_abbreviations = [ 

4540 "", 

4541 "Jan", 

4542 "Feb", 

4543 "Mar", 

4544 "Apr", 

4545 "Mei", 

4546 "Jun", 

4547 "Jul", 

4548 "Ags", 

4549 "Sept", 

4550 "Okt", 

4551 "Nov", 

4552 "Des", 

4553 ] 

4554 

4555 day_names = ["", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu", "Minggu"] 

4556 

4557 day_abbreviations = [ 

4558 "", 

4559 "Senin", 

4560 "Selasa", 

4561 "Rabu", 

4562 "Kamis", 

4563 "Jumat", 

4564 "Sabtu", 

4565 "Minggu", 

4566 ] 

4567 

4568 

4569class NepaliLocale(Locale): 

4570 names = ["ne", "ne-np"] 

4571 

4572 past = "{0} पहिले" 

4573 future = "{0} पछी" 

4574 

4575 timeframes = { 

4576 "now": "अहिले", 

4577 "second": "एक सेकेन्ड", 

4578 "seconds": "{0} सेकण्ड", 

4579 "minute": "मिनेट", 

4580 "minutes": "{0} मिनेट", 

4581 "hour": "एक घण्टा", 

4582 "hours": "{0} घण्टा", 

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

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

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

4586 "months": "{0} महिना", 

4587 "year": "एक बर्ष", 

4588 "years": "{0} बर्ष", 

4589 } 

4590 

4591 meridians = {"am": "पूर्वाह्न", "pm": "अपरान्ह", "AM": "पूर्वाह्न", "PM": "अपरान्ह"} 

4592 

4593 month_names = [ 

4594 "", 

4595 "जनवरी", 

4596 "फेब्रुअरी", 

4597 "मार्च", 

4598 "एप्रील", 

4599 "मे", 

4600 "जुन", 

4601 "जुलाई", 

4602 "अगष्ट", 

4603 "सेप्टेम्बर", 

4604 "अक्टोबर", 

4605 "नोवेम्बर", 

4606 "डिसेम्बर", 

4607 ] 

4608 month_abbreviations = [ 

4609 "", 

4610 "जन", 

4611 "फेब", 

4612 "मार्च", 

4613 "एप्रील", 

4614 "मे", 

4615 "जुन", 

4616 "जुलाई", 

4617 "अग", 

4618 "सेप", 

4619 "अक्ट", 

4620 "नोव", 

4621 "डिस", 

4622 ] 

4623 

4624 day_names = [ 

4625 "", 

4626 "सोमवार", 

4627 "मंगलवार", 

4628 "बुधवार", 

4629 "बिहिवार", 

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

4631 "शनिवार", 

4632 "आइतवार", 

4633 ] 

4634 

4635 day_abbreviations = ["", "सोम", "मंगल", "बुध", "बिहि", "शुक्र", "शनि", "आइत"] 

4636 

4637 

4638class EstonianLocale(Locale): 

4639 names = ["ee", "et"] 

4640 

4641 past = "{0} tagasi" 

4642 future = "{0} pärast" 

4643 and_word = "ja" 

4644 

4645 timeframes: ClassVar[Mapping[TimeFrameLiteral, Mapping[str, str]]] = { 

4646 "now": {"past": "just nüüd", "future": "just nüüd"}, 

4647 "second": {"past": "üks sekund", "future": "ühe sekundi"}, 

4648 "seconds": {"past": "{0} sekundit", "future": "{0} sekundi"}, 

4649 "minute": {"past": "üks minut", "future": "ühe minuti"}, 

4650 "minutes": {"past": "{0} minutit", "future": "{0} minuti"}, 

4651 "hour": {"past": "tund aega", "future": "tunni aja"}, 

4652 "hours": {"past": "{0} tundi", "future": "{0} tunni"}, 

4653 "day": {"past": "üks päev", "future": "ühe päeva"}, 

4654 "days": {"past": "{0} päeva", "future": "{0} päeva"}, 

4655 "month": {"past": "üks kuu", "future": "ühe kuu"}, 

4656 "months": {"past": "{0} kuud", "future": "{0} kuu"}, 

4657 "year": {"past": "üks aasta", "future": "ühe aasta"}, 

4658 "years": {"past": "{0} aastat", "future": "{0} aasta"}, 

4659 } 

4660 

4661 month_names = [ 

4662 "", 

4663 "Jaanuar", 

4664 "Veebruar", 

4665 "Märts", 

4666 "Aprill", 

4667 "Mai", 

4668 "Juuni", 

4669 "Juuli", 

4670 "August", 

4671 "September", 

4672 "Oktoober", 

4673 "November", 

4674 "Detsember", 

4675 ] 

4676 month_abbreviations = [ 

4677 "", 

4678 "Jan", 

4679 "Veb", 

4680 "Mär", 

4681 "Apr", 

4682 "Mai", 

4683 "Jun", 

4684 "Jul", 

4685 "Aug", 

4686 "Sep", 

4687 "Okt", 

4688 "Nov", 

4689 "Dets", 

4690 ] 

4691 

4692 day_names = [ 

4693 "", 

4694 "Esmaspäev", 

4695 "Teisipäev", 

4696 "Kolmapäev", 

4697 "Neljapäev", 

4698 "Reede", 

4699 "Laupäev", 

4700 "Pühapäev", 

4701 ] 

4702 day_abbreviations = ["", "Esm", "Teis", "Kolm", "Nelj", "Re", "Lau", "Püh"] 

4703 

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

4705 form = self.timeframes[timeframe] 

4706 if delta > 0: 

4707 _form = form["future"] 

4708 else: 

4709 _form = form["past"] 

4710 return _form.format(abs(delta)) 

4711 

4712 

4713class LatvianLocale(Locale): 

4714 names = ["lv", "lv-lv"] 

4715 

4716 past = "pirms {0}" 

4717 future = "pēc {0}" 

4718 and_word = "un" 

4719 

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

4721 "now": "tagad", 

4722 "second": "sekundes", 

4723 "seconds": "{0} sekundēm", 

4724 "minute": "minūtes", 

4725 "minutes": "{0} minūtēm", 

4726 "hour": "stundas", 

4727 "hours": "{0} stundām", 

4728 "day": "dienas", 

4729 "days": "{0} dienām", 

4730 "week": "nedēļas", 

4731 "weeks": "{0} nedēļām", 

4732 "month": "mēneša", 

4733 "months": "{0} mēnešiem", 

4734 "year": "gada", 

4735 "years": "{0} gadiem", 

4736 } 

4737 

4738 month_names = [ 

4739 "", 

4740 "janvāris", 

4741 "februāris", 

4742 "marts", 

4743 "aprīlis", 

4744 "maijs", 

4745 "jūnijs", 

4746 "jūlijs", 

4747 "augusts", 

4748 "septembris", 

4749 "oktobris", 

4750 "novembris", 

4751 "decembris", 

4752 ] 

4753 

4754 month_abbreviations = [ 

4755 "", 

4756 "jan", 

4757 "feb", 

4758 "marts", 

4759 "apr", 

4760 "maijs", 

4761 "jūnijs", 

4762 "jūlijs", 

4763 "aug", 

4764 "sept", 

4765 "okt", 

4766 "nov", 

4767 "dec", 

4768 ] 

4769 

4770 day_names = [ 

4771 "", 

4772 "pirmdiena", 

4773 "otrdiena", 

4774 "trešdiena", 

4775 "ceturtdiena", 

4776 "piektdiena", 

4777 "sestdiena", 

4778 "svētdiena", 

4779 ] 

4780 

4781 day_abbreviations = [ 

4782 "", 

4783 "pi", 

4784 "ot", 

4785 "tr", 

4786 "ce", 

4787 "pi", 

4788 "se", 

4789 "sv", 

4790 ] 

4791 

4792 

4793class SwahiliLocale(Locale): 

4794 names = [ 

4795 "sw", 

4796 "sw-ke", 

4797 "sw-tz", 

4798 ] 

4799 

4800 past = "{0} iliyopita" 

4801 future = "muda wa {0}" 

4802 and_word = "na" 

4803 

4804 timeframes = { 

4805 "now": "sasa hivi", 

4806 "second": "sekunde", 

4807 "seconds": "sekunde {0}", 

4808 "minute": "dakika moja", 

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

4810 "hour": "saa moja", 

4811 "hours": "saa {0}", 

4812 "day": "siku moja", 

4813 "days": "siku {0}", 

4814 "week": "wiki moja", 

4815 "weeks": "wiki {0}", 

4816 "month": "mwezi moja", 

4817 "months": "miezi {0}", 

4818 "year": "mwaka moja", 

4819 "years": "miaka {0}", 

4820 } 

4821 

4822 meridians = {"am": "asu", "pm": "mch", "AM": "ASU", "PM": "MCH"} 

4823 

4824 month_names = [ 

4825 "", 

4826 "Januari", 

4827 "Februari", 

4828 "Machi", 

4829 "Aprili", 

4830 "Mei", 

4831 "Juni", 

4832 "Julai", 

4833 "Agosti", 

4834 "Septemba", 

4835 "Oktoba", 

4836 "Novemba", 

4837 "Desemba", 

4838 ] 

4839 month_abbreviations = [ 

4840 "", 

4841 "Jan", 

4842 "Feb", 

4843 "Mac", 

4844 "Apr", 

4845 "Mei", 

4846 "Jun", 

4847 "Jul", 

4848 "Ago", 

4849 "Sep", 

4850 "Okt", 

4851 "Nov", 

4852 "Des", 

4853 ] 

4854 

4855 day_names = [ 

4856 "", 

4857 "Jumatatu", 

4858 "Jumanne", 

4859 "Jumatano", 

4860 "Alhamisi", 

4861 "Ijumaa", 

4862 "Jumamosi", 

4863 "Jumapili", 

4864 ] 

4865 day_abbreviations = [ 

4866 "", 

4867 "Jumatatu", 

4868 "Jumanne", 

4869 "Jumatano", 

4870 "Alhamisi", 

4871 "Ijumaa", 

4872 "Jumamosi", 

4873 "Jumapili", 

4874 ] 

4875 

4876 

4877class CroatianLocale(Locale): 

4878 names = ["hr", "hr-hr"] 

4879 

4880 past = "prije {0}" 

4881 future = "za {0}" 

4882 and_word = "i" 

4883 

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

4885 "now": "upravo sad", 

4886 "second": "sekundu", 

4887 "seconds": {"double": "{0} sekunde", "higher": "{0} sekundi"}, 

4888 "minute": "minutu", 

4889 "minutes": {"double": "{0} minute", "higher": "{0} minuta"}, 

4890 "hour": "sat", 

4891 "hours": {"double": "{0} sata", "higher": "{0} sati"}, 

4892 "day": "jedan dan", 

4893 "days": {"double": "{0} dana", "higher": "{0} dana"}, 

4894 "week": "tjedan", 

4895 "weeks": {"double": "{0} tjedna", "higher": "{0} tjedana"}, 

4896 "month": "mjesec", 

4897 "months": {"double": "{0} mjeseca", "higher": "{0} mjeseci"}, 

4898 "year": "godinu", 

4899 "years": {"double": "{0} godine", "higher": "{0} godina"}, 

4900 } 

4901 

4902 month_names = [ 

4903 "", 

4904 "siječanj", 

4905 "veljača", 

4906 "ožujak", 

4907 "travanj", 

4908 "svibanj", 

4909 "lipanj", 

4910 "srpanj", 

4911 "kolovoz", 

4912 "rujan", 

4913 "listopad", 

4914 "studeni", 

4915 "prosinac", 

4916 ] 

4917 

4918 month_abbreviations = [ 

4919 "", 

4920 "siječ", 

4921 "velj", 

4922 "ožuj", 

4923 "trav", 

4924 "svib", 

4925 "lip", 

4926 "srp", 

4927 "kol", 

4928 "ruj", 

4929 "list", 

4930 "stud", 

4931 "pros", 

4932 ] 

4933 

4934 day_names = [ 

4935 "", 

4936 "ponedjeljak", 

4937 "utorak", 

4938 "srijeda", 

4939 "četvrtak", 

4940 "petak", 

4941 "subota", 

4942 "nedjelja", 

4943 ] 

4944 

4945 day_abbreviations = [ 

4946 "", 

4947 "po", 

4948 "ut", 

4949 "sr", 

4950 "če", 

4951 "pe", 

4952 "su", 

4953 "ne", 

4954 ] 

4955 

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

4957 form = self.timeframes[timeframe] 

4958 delta = abs(delta) 

4959 if isinstance(form, Mapping): 

4960 if 1 < delta <= 4: 

4961 form = form["double"] 

4962 else: 

4963 form = form["higher"] 

4964 

4965 return form.format(delta) 

4966 

4967 

4968class LatinLocale(Locale): 

4969 names = ["la", "la-va"] 

4970 

4971 past = "ante {0}" 

4972 future = "in {0}" 

4973 and_word = "et" 

4974 

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

4976 "now": "nunc", 

4977 "second": "secundum", 

4978 "seconds": "{0} secundis", 

4979 "minute": "minutam", 

4980 "minutes": "{0} minutis", 

4981 "hour": "horam", 

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

4983 "day": "diem", 

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

4985 "week": "hebdomadem", 

4986 "weeks": "{0} hebdomades", 

4987 "month": "mensem", 

4988 "months": "{0} mensis", 

4989 "year": "annum", 

4990 "years": "{0} annos", 

4991 } 

4992 

4993 month_names = [ 

4994 "", 

4995 "Ianuarius", 

4996 "Februarius", 

4997 "Martius", 

4998 "Aprilis", 

4999 "Maius", 

5000 "Iunius", 

5001 "Iulius", 

5002 "Augustus", 

5003 "September", 

5004 "October", 

5005 "November", 

5006 "December", 

5007 ] 

5008 

5009 month_abbreviations = [ 

5010 "", 

5011 "Ian", 

5012 "Febr", 

5013 "Mart", 

5014 "Apr", 

5015 "Mai", 

5016 "Iun", 

5017 "Iul", 

5018 "Aug", 

5019 "Sept", 

5020 "Oct", 

5021 "Nov", 

5022 "Dec", 

5023 ] 

5024 

5025 day_names = [ 

5026 "", 

5027 "dies Lunae", 

5028 "dies Martis", 

5029 "dies Mercurii", 

5030 "dies Iovis", 

5031 "dies Veneris", 

5032 "dies Saturni", 

5033 "dies Solis", 

5034 ] 

5035 

5036 day_abbreviations = [ 

5037 "", 

5038 "dies Lunae", 

5039 "dies Martis", 

5040 "dies Mercurii", 

5041 "dies Iovis", 

5042 "dies Veneris", 

5043 "dies Saturni", 

5044 "dies Solis", 

5045 ] 

5046 

5047 

5048class LithuanianLocale(Locale): 

5049 names = ["lt", "lt-lt"] 

5050 

5051 past = "prieš {0}" 

5052 future = "po {0}" 

5053 and_word = "ir" 

5054 

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

5056 "now": "dabar", 

5057 "second": "sekundės", 

5058 "seconds": "{0} sekundžių", 

5059 "minute": "minutės", 

5060 "minutes": "{0} minučių", 

5061 "hour": "valandos", 

5062 "hours": "{0} valandų", 

5063 "day": "dieną", 

5064 "days": "{0} dienų", 

5065 "week": "savaitės", 

5066 "weeks": "{0} savaičių", 

5067 "month": "mėnesio", 

5068 "months": "{0} mėnesių", 

5069 "year": "metų", 

5070 "years": "{0} metų", 

5071 } 

5072 

5073 month_names = [ 

5074 "", 

5075 "sausis", 

5076 "vasaris", 

5077 "kovas", 

5078 "balandis", 

5079 "gegužė", 

5080 "birželis", 

5081 "liepa", 

5082 "rugpjūtis", 

5083 "rugsėjis", 

5084 "spalis", 

5085 "lapkritis", 

5086 "gruodis", 

5087 ] 

5088 

5089 month_abbreviations = [ 

5090 "", 

5091 "saus", 

5092 "vas", 

5093 "kovas", 

5094 "bal", 

5095 "geg", 

5096 "birž", 

5097 "liepa", 

5098 "rugp", 

5099 "rugs", 

5100 "spalis", 

5101 "lapkr", 

5102 "gr", 

5103 ] 

5104 

5105 day_names = [ 

5106 "", 

5107 "pirmadienis", 

5108 "antradienis", 

5109 "trečiadienis", 

5110 "ketvirtadienis", 

5111 "penktadienis", 

5112 "šeštadienis", 

5113 "sekmadienis", 

5114 ] 

5115 

5116 day_abbreviations = [ 

5117 "", 

5118 "pi", 

5119 "an", 

5120 "tr", 

5121 "ke", 

5122 "pe", 

5123 "še", 

5124 "se", 

5125 ] 

5126 

5127 

5128class MalayLocale(Locale): 

5129 names = ["ms", "ms-my", "ms-bn"] 

5130 

5131 past = "{0} yang lalu" 

5132 future = "dalam {0}" 

5133 and_word = "dan" 

5134 

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

5136 "now": "sekarang", 

5137 "second": "saat", 

5138 "seconds": "{0} saat", 

5139 "minute": "minit", 

5140 "minutes": "{0} minit", 

5141 "hour": "jam", 

5142 "hours": "{0} jam", 

5143 "day": "hari", 

5144 "days": "{0} hari", 

5145 "week": "minggu", 

5146 "weeks": "{0} minggu", 

5147 "month": "bulan", 

5148 "months": "{0} bulan", 

5149 "year": "tahun", 

5150 "years": "{0} tahun", 

5151 } 

5152 

5153 month_names = [ 

5154 "", 

5155 "Januari", 

5156 "Februari", 

5157 "Mac", 

5158 "April", 

5159 "Mei", 

5160 "Jun", 

5161 "Julai", 

5162 "Ogos", 

5163 "September", 

5164 "Oktober", 

5165 "November", 

5166 "Disember", 

5167 ] 

5168 

5169 month_abbreviations = [ 

5170 "", 

5171 "Jan.", 

5172 "Feb.", 

5173 "Mac", 

5174 "Apr.", 

5175 "Mei", 

5176 "Jun", 

5177 "Julai", 

5178 "Og.", 

5179 "Sept.", 

5180 "Okt.", 

5181 "Nov.", 

5182 "Dis.", 

5183 ] 

5184 

5185 day_names = [ 

5186 "", 

5187 "Isnin", 

5188 "Selasa", 

5189 "Rabu", 

5190 "Khamis", 

5191 "Jumaat", 

5192 "Sabtu", 

5193 "Ahad", 

5194 ] 

5195 

5196 day_abbreviations = [ 

5197 "", 

5198 "Isnin", 

5199 "Selasa", 

5200 "Rabu", 

5201 "Khamis", 

5202 "Jumaat", 

5203 "Sabtu", 

5204 "Ahad", 

5205 ] 

5206 

5207 

5208class MalteseLocale(Locale): 

5209 names = ["mt", "mt-mt"] 

5210 

5211 past = "{0} ilu" 

5212 future = "fi {0}" 

5213 and_word = "u" 

5214 

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

5216 "now": "issa", 

5217 "second": "sekonda", 

5218 "seconds": "{0} sekondi", 

5219 "minute": "minuta", 

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

5221 "hour": "siegħa", 

5222 "hours": {"dual": "{0} sagħtejn", "plural": "{0} sigħat"}, 

5223 "day": "jum", 

5224 "days": {"dual": "{0} jumejn", "plural": "{0} ijiem"}, 

5225 "week": "ġimgħa", 

5226 "weeks": {"dual": "{0} ġimagħtejn", "plural": "{0} ġimgħat"}, 

5227 "month": "xahar", 

5228 "months": {"dual": "{0} xahrejn", "plural": "{0} xhur"}, 

5229 "year": "sena", 

5230 "years": {"dual": "{0} sentejn", "plural": "{0} snin"}, 

5231 } 

5232 

5233 month_names = [ 

5234 "", 

5235 "Jannar", 

5236 "Frar", 

5237 "Marzu", 

5238 "April", 

5239 "Mejju", 

5240 "Ġunju", 

5241 "Lulju", 

5242 "Awwissu", 

5243 "Settembru", 

5244 "Ottubru", 

5245 "Novembru", 

5246 "Diċembru", 

5247 ] 

5248 

5249 month_abbreviations = [ 

5250 "", 

5251 "Jan", 

5252 "Fr", 

5253 "Mar", 

5254 "Apr", 

5255 "Mejju", 

5256 "Ġun", 

5257 "Lul", 

5258 "Aw", 

5259 "Sett", 

5260 "Ott", 

5261 "Nov", 

5262 "Diċ", 

5263 ] 

5264 

5265 day_names = [ 

5266 "", 

5267 "It-Tnejn", 

5268 "It-Tlieta", 

5269 "L-Erbgħa", 

5270 "Il-Ħamis", 

5271 "Il-Ġimgħa", 

5272 "Is-Sibt", 

5273 "Il-Ħadd", 

5274 ] 

5275 

5276 day_abbreviations = [ 

5277 "", 

5278 "T", 

5279 "TL", 

5280 "E", 

5281 "Ħ", 

5282 "Ġ", 

5283 "S", 

5284 "Ħ", 

5285 ] 

5286 

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

5288 form = self.timeframes[timeframe] 

5289 delta = abs(delta) 

5290 if isinstance(form, Mapping): 

5291 if delta == 2: 

5292 form = form["dual"] 

5293 else: 

5294 form = form["plural"] 

5295 

5296 return form.format(delta) 

5297 

5298 

5299class SamiLocale(Locale): 

5300 names = ["se", "se-fi", "se-no", "se-se"] 

5301 

5302 past = "{0} dassái" 

5303 future = "{0} " # NOTE: couldn't find preposition for Sami here, none needed? 

5304 

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

5306 "now": "dál", 

5307 "second": "sekunda", 

5308 "seconds": "{0} sekundda", 

5309 "minute": "minuhta", 

5310 "minutes": "{0} minuhta", 

5311 "hour": "diimmu", 

5312 "hours": "{0} diimmu", 

5313 "day": "beaivvi", 

5314 "days": "{0} beaivvi", 

5315 "week": "vahku", 

5316 "weeks": "{0} vahku", 

5317 "month": "mánu", 

5318 "months": "{0} mánu", 

5319 "year": "jagi", 

5320 "years": "{0} jagi", 

5321 } 

5322 

5323 month_names = [ 

5324 "", 

5325 "Ođđajagimánnu", 

5326 "Guovvamánnu", 

5327 "Njukčamánnu", 

5328 "Cuoŋománnu", 

5329 "Miessemánnu", 

5330 "Geassemánnu", 

5331 "Suoidnemánnu", 

5332 "Borgemánnu", 

5333 "Čakčamánnu", 

5334 "Golggotmánnu", 

5335 "Skábmamánnu", 

5336 "Juovlamánnu", 

5337 ] 

5338 

5339 month_abbreviations = [ 

5340 "", 

5341 "Ođđajagimánnu", 

5342 "Guovvamánnu", 

5343 "Njukčamánnu", 

5344 "Cuoŋománnu", 

5345 "Miessemánnu", 

5346 "Geassemánnu", 

5347 "Suoidnemánnu", 

5348 "Borgemánnu", 

5349 "Čakčamánnu", 

5350 "Golggotmánnu", 

5351 "Skábmamánnu", 

5352 "Juovlamánnu", 

5353 ] 

5354 

5355 day_names = [ 

5356 "", 

5357 "Mánnodat", 

5358 "Disdat", 

5359 "Gaskavahkku", 

5360 "Duorastat", 

5361 "Bearjadat", 

5362 "Lávvordat", 

5363 "Sotnabeaivi", 

5364 ] 

5365 

5366 day_abbreviations = [ 

5367 "", 

5368 "Mánnodat", 

5369 "Disdat", 

5370 "Gaskavahkku", 

5371 "Duorastat", 

5372 "Bearjadat", 

5373 "Lávvordat", 

5374 "Sotnabeaivi", 

5375 ] 

5376 

5377 

5378class OdiaLocale(Locale): 

5379 names = ["or", "or-in"] 

5380 

5381 past = "{0} ପୂର୍ବେ" 

5382 future = "{0} ପରେ" 

5383 

5384 timeframes = { 

5385 "now": "ବର୍ତ୍ତମାନ", 

5386 "second": "ଏକ ସେକେଣ୍ଡ", 

5387 "seconds": "{0} ସେକେଣ୍ଡ", 

5388 "minute": "ଏକ ମିନଟ", 

5389 "minutes": "{0} ମିନଟ", 

5390 "hour": "ଏକ ଘଣ୍ଟା", 

5391 "hours": "{0} ଘଣ୍ଟା", 

5392 "day": "ଏକ ଦିନ", 

5393 "days": "{0} ଦିନ", 

5394 "month": "ଏକ ମାସ", 

5395 "months": "{0} ମାସ ", 

5396 "year": "ଏକ ବର୍ଷ", 

5397 "years": "{0} ବର୍ଷ", 

5398 } 

5399 

5400 meridians = {"am": "ପୂର୍ବାହ୍ନ", "pm": "ଅପରାହ୍ନ", "AM": "ପୂର୍ବାହ୍ନ", "PM": "ଅପରାହ୍ନ"} 

5401 

5402 month_names = [ 

5403 "", 

5404 "ଜାନୁଆରୀ", 

5405 "ଫେବୃଆରୀ", 

5406 "ମାର୍ଚ୍ଚ୍", 

5407 "ଅପ୍ରେଲ", 

5408 "ମଇ", 

5409 "ଜୁନ୍", 

5410 "ଜୁଲାଇ", 

5411 "ଅଗଷ୍ଟ", 

5412 "ସେପ୍ଟେମ୍ବର", 

5413 "ଅକ୍ଟୋବର୍", 

5414 "ନଭେମ୍ବର୍", 

5415 "ଡିସେମ୍ବର୍", 

5416 ] 

5417 month_abbreviations = [ 

5418 "", 

5419 "ଜାନୁ", 

5420 "ଫେବୃ", 

5421 "ମାର୍ଚ୍ଚ୍", 

5422 "ଅପ୍ରେ", 

5423 "ମଇ", 

5424 "ଜୁନ୍", 

5425 "ଜୁଲା", 

5426 "ଅଗ", 

5427 "ସେପ୍ଟେ", 

5428 "ଅକ୍ଟୋ", 

5429 "ନଭେ", 

5430 "ଡିସେ", 

5431 ] 

5432 

5433 day_names = [ 

5434 "", 

5435 "ସୋମବାର", 

5436 "ମଙ୍ଗଳବାର", 

5437 "ବୁଧବାର", 

5438 "ଗୁରୁବାର", 

5439 "ଶୁକ୍ରବାର", 

5440 "ଶନିବାର", 

5441 "ରବିବାର", 

5442 ] 

5443 day_abbreviations = [ 

5444 "", 

5445 "ସୋମ", 

5446 "ମଙ୍ଗଳ", 

5447 "ବୁଧ", 

5448 "ଗୁରୁ", 

5449 "ଶୁକ୍ର", 

5450 "ଶନି", 

5451 "ରବି", 

5452 ] 

5453 

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

5455 if n > 10 or n == 0: 

5456 return f"{n}ତମ" 

5457 if n in [1, 5, 7, 8, 9, 10]: 

5458 return f"{n}ମ" 

5459 if n in [2, 3]: 

5460 return f"{n}ୟ" 

5461 if n == 4: 

5462 return f"{n}ର୍ଥ" 

5463 if n == 6: 

5464 return f"{n}ଷ୍ଠ" 

5465 return "" 

5466 

5467 

5468class SerbianLocale(Locale): 

5469 names = ["sr", "sr-rs", "sr-sp"] 

5470 

5471 past = "pre {0}" 

5472 future = "za {0}" 

5473 and_word = "i" 

5474 

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

5476 "now": "sada", 

5477 "second": "sekundu", 

5478 "seconds": {"double": "{0} sekunde", "higher": "{0} sekundi"}, 

5479 "minute": "minutu", 

5480 "minutes": {"double": "{0} minute", "higher": "{0} minuta"}, 

5481 "hour": "sat", 

5482 "hours": {"double": "{0} sata", "higher": "{0} sati"}, 

5483 "day": "dan", 

5484 "days": {"double": "{0} dana", "higher": "{0} dana"}, 

5485 "week": "nedelju", 

5486 "weeks": {"double": "{0} nedelje", "higher": "{0} nedelja"}, 

5487 "month": "mesec", 

5488 "months": {"double": "{0} meseca", "higher": "{0} meseci"}, 

5489 "year": "godinu", 

5490 "years": {"double": "{0} godine", "higher": "{0} godina"}, 

5491 } 

5492 

5493 month_names = [ 

5494 "", 

5495 "januar", # јануар 

5496 "februar", # фебруар 

5497 "mart", # март 

5498 "april", # април 

5499 "maj", # мај 

5500 "jun", # јун 

5501 "jul", # јул 

5502 "avgust", # август 

5503 "septembar", # септембар 

5504 "oktobar", # октобар 

5505 "novembar", # новембар 

5506 "decembar", # децембар 

5507 ] 

5508 

5509 month_abbreviations = [ 

5510 "", 

5511 "jan", 

5512 "feb", 

5513 "mar", 

5514 "apr", 

5515 "maj", 

5516 "jun", 

5517 "jul", 

5518 "avg", 

5519 "sep", 

5520 "okt", 

5521 "nov", 

5522 "dec", 

5523 ] 

5524 

5525 day_names = [ 

5526 "", 

5527 "ponedeljak", # понедељак 

5528 "utorak", # уторак 

5529 "sreda", # среда 

5530 "četvrtak", # четвртак 

5531 "petak", # петак 

5532 "subota", # субота 

5533 "nedelja", # недеља 

5534 ] 

5535 

5536 day_abbreviations = [ 

5537 "", 

5538 "po", # по 

5539 "ut", # ут 

5540 "sr", # ср 

5541 "če", # че 

5542 "pe", # пе 

5543 "su", # су 

5544 "ne", # не 

5545 ] 

5546 

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

5548 form = self.timeframes[timeframe] 

5549 delta = abs(delta) 

5550 if isinstance(form, Mapping): 

5551 if 1 < delta <= 4: 

5552 form = form["double"] 

5553 else: 

5554 form = form["higher"] 

5555 

5556 return form.format(delta) 

5557 

5558 

5559class LuxembourgishLocale(Locale): 

5560 names = ["lb", "lb-lu"] 

5561 

5562 past = "virun {0}" 

5563 future = "an {0}" 

5564 and_word = "an" 

5565 

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

5567 "now": "just elo", 

5568 "second": "enger Sekonn", 

5569 "seconds": "{0} Sekonnen", 

5570 "minute": "enger Minutt", 

5571 "minutes": "{0} Minutten", 

5572 "hour": "enger Stonn", 

5573 "hours": "{0} Stonnen", 

5574 "day": "engem Dag", 

5575 "days": "{0} Deeg", 

5576 "week": "enger Woch", 

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

5578 "month": "engem Mount", 

5579 "months": "{0} Méint", 

5580 "year": "engem Joer", 

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

5582 } 

5583 

5584 timeframes_only_distance = timeframes.copy() 

5585 timeframes_only_distance["second"] = "eng Sekonn" 

5586 timeframes_only_distance["minute"] = "eng Minutt" 

5587 timeframes_only_distance["hour"] = "eng Stonn" 

5588 timeframes_only_distance["day"] = "een Dag" 

5589 timeframes_only_distance["days"] = "{0} Deeg" 

5590 timeframes_only_distance["week"] = "eng Woch" 

5591 timeframes_only_distance["month"] = "ee Mount" 

5592 timeframes_only_distance["months"] = "{0} Méint" 

5593 timeframes_only_distance["year"] = "ee Joer" 

5594 timeframes_only_distance["years"] = "{0} Joer" 

5595 

5596 month_names = [ 

5597 "", 

5598 "Januar", 

5599 "Februar", 

5600 "Mäerz", 

5601 "Abrëll", 

5602 "Mee", 

5603 "Juni", 

5604 "Juli", 

5605 "August", 

5606 "September", 

5607 "Oktouber", 

5608 "November", 

5609 "Dezember", 

5610 ] 

5611 

5612 month_abbreviations = [ 

5613 "", 

5614 "Jan", 

5615 "Feb", 

5616 "Mäe", 

5617 "Abr", 

5618 "Mee", 

5619 "Jun", 

5620 "Jul", 

5621 "Aug", 

5622 "Sep", 

5623 "Okt", 

5624 "Nov", 

5625 "Dez", 

5626 ] 

5627 

5628 day_names = [ 

5629 "", 

5630 "Méindeg", 

5631 "Dënschdeg", 

5632 "Mëttwoch", 

5633 "Donneschdeg", 

5634 "Freideg", 

5635 "Samschdeg", 

5636 "Sonndeg", 

5637 ] 

5638 

5639 day_abbreviations = ["", "Méi", "Dën", "Mët", "Don", "Fre", "Sam", "Son"] 

5640 

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

5642 return f"{n}." 

5643 

5644 def describe( 

5645 self, 

5646 timeframe: TimeFrameLiteral, 

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

5648 only_distance: bool = False, 

5649 ) -> str: 

5650 if not only_distance: 

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

5652 

5653 # Luxembourgish uses a different case without 'in' or 'ago' 

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

5655 trunc(abs(delta)) 

5656 ) 

5657 

5658 return humanized 

5659 

5660 

5661class ZuluLocale(Locale): 

5662 names = ["zu", "zu-za"] 

5663 

5664 past = "{0} edlule" 

5665 future = "{0} " 

5666 and_word = "futhi" 

5667 

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

5669 "now": "manje", 

5670 "second": {"past": "umzuzwana", "future": "ngomzuzwana"}, 

5671 "seconds": {"past": "{0} imizuzwana", "future": "{0} ngemizuzwana"}, 

5672 "minute": {"past": "umzuzu", "future": "ngomzuzu"}, 

5673 "minutes": {"past": "{0} imizuzu", "future": "{0} ngemizuzu"}, 

5674 "hour": {"past": "ihora", "future": "ngehora"}, 

5675 "hours": {"past": "{0} amahora", "future": "{0} emahoreni"}, 

5676 "day": {"past": "usuku", "future": "ngosuku"}, 

5677 "days": {"past": "{0} izinsuku", "future": "{0} ezinsukwini"}, 

5678 "week": {"past": "isonto", "future": "ngesonto"}, 

5679 "weeks": {"past": "{0} amasonto", "future": "{0} emasontweni"}, 

5680 "month": {"past": "inyanga", "future": "ngenyanga"}, 

5681 "months": {"past": "{0} izinyanga", "future": "{0} ezinyangeni"}, 

5682 "year": {"past": "unyaka", "future": "ngonyak"}, 

5683 "years": {"past": "{0} iminyaka", "future": "{0} eminyakeni"}, 

5684 } 

5685 

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

5687 """Zulu aware time frame format function, takes into account 

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

5689 abs_delta = abs(delta) 

5690 form = self.timeframes[timeframe] 

5691 

5692 if isinstance(form, str): 

5693 return form.format(abs_delta) 

5694 

5695 if delta > 0: 

5696 key = "future" 

5697 else: 

5698 key = "past" 

5699 form = form[key] 

5700 

5701 return form.format(abs_delta) 

5702 

5703 month_names = [ 

5704 "", 

5705 "uMasingane", 

5706 "uNhlolanja", 

5707 "uNdasa", 

5708 "UMbasa", 

5709 "UNhlaba", 

5710 "UNhlangulana", 

5711 "uNtulikazi", 

5712 "UNcwaba", 

5713 "uMandulo", 

5714 "uMfumfu", 

5715 "uLwezi", 

5716 "uZibandlela", 

5717 ] 

5718 

5719 month_abbreviations = [ 

5720 "", 

5721 "uMasingane", 

5722 "uNhlolanja", 

5723 "uNdasa", 

5724 "UMbasa", 

5725 "UNhlaba", 

5726 "UNhlangulana", 

5727 "uNtulikazi", 

5728 "UNcwaba", 

5729 "uMandulo", 

5730 "uMfumfu", 

5731 "uLwezi", 

5732 "uZibandlela", 

5733 ] 

5734 

5735 day_names = [ 

5736 "", 

5737 "uMsombuluko", 

5738 "uLwesibili", 

5739 "uLwesithathu", 

5740 "uLwesine", 

5741 "uLwesihlanu", 

5742 "uMgqibelo", 

5743 "iSonto", 

5744 ] 

5745 

5746 day_abbreviations = [ 

5747 "", 

5748 "uMsombuluko", 

5749 "uLwesibili", 

5750 "uLwesithathu", 

5751 "uLwesine", 

5752 "uLwesihlanu", 

5753 "uMgqibelo", 

5754 "iSonto", 

5755 ] 

5756 

5757 

5758class TamilLocale(Locale): 

5759 names = ["ta", "ta-in", "ta-lk"] 

5760 

5761 past = "{0} நேரத்திற்கு முன்பு" 

5762 future = "இல் {0}" 

5763 

5764 timeframes = { 

5765 "now": "இப்போது", 

5766 "second": "ஒரு இரண்டாவது", 

5767 "seconds": "{0} விநாடிகள்", 

5768 "minute": "ஒரு நிமிடம்", 

5769 "minutes": "{0} நிமிடங்கள்", 

5770 "hour": "ஒரு மணி", 

5771 "hours": "{0} மணிநேரம்", 

5772 "day": "ஒரு நாள்", 

5773 "days": "{0} நாட்கள்", 

5774 "week": "ஒரு வாரம்", 

5775 "weeks": "{0} வாரங்கள்", 

5776 "month": "ஒரு மாதம்", 

5777 "months": "{0} மாதங்கள்", 

5778 "year": "ஒரு ஆண்டு", 

5779 "years": "{0} ஆண்டுகள்", 

5780 } 

5781 

5782 month_names = [ 

5783 "", 

5784 "சித்திரை", 

5785 "வைகாசி", 

5786 "ஆனி", 

5787 "ஆடி", 

5788 "ஆவணி", 

5789 "புரட்டாசி", 

5790 "ஐப்பசி", 

5791 "கார்த்திகை", 

5792 "மார்கழி", 

5793 "தை", 

5794 "மாசி", 

5795 "பங்குனி", 

5796 ] 

5797 

5798 month_abbreviations = [ 

5799 "", 

5800 "ஜன", 

5801 "பிப்", 

5802 "மார்", 

5803 "ஏப்", 

5804 "மே", 

5805 "ஜூன்", 

5806 "ஜூலை", 

5807 "ஆக", 

5808 "செப்", 

5809 "அக்", 

5810 "நவ", 

5811 "டிச", 

5812 ] 

5813 

5814 day_names = [ 

5815 "", 

5816 "திங்கட்கிழமை", 

5817 "செவ்வாய்க்கிழமை", 

5818 "புதன்கிழமை", 

5819 "வியாழக்கிழமை", 

5820 "வெள்ளிக்கிழமை", 

5821 "சனிக்கிழமை", 

5822 "ஞாயிற்றுக்கிழமை", 

5823 ] 

5824 

5825 day_abbreviations = [ 

5826 "", 

5827 "திங்கட்", 

5828 "செவ்வாய்", 

5829 "புதன்", 

5830 "வியாழன்", 

5831 "வெள்ளி", 

5832 "சனி", 

5833 "ஞாயிறு", 

5834 ] 

5835 

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

5837 if n == 1: 

5838 return f"{n}வது" 

5839 elif n >= 0: 

5840 return f"{n}ஆம்" 

5841 else: 

5842 return "" 

5843 

5844 

5845class AlbanianLocale(Locale): 

5846 names = ["sq", "sq-al"] 

5847 

5848 past = "{0} më parë" 

5849 future = "në {0}" 

5850 and_word = "dhe" 

5851 

5852 timeframes = { 

5853 "now": "tani", 

5854 "second": "sekondë", 

5855 "seconds": "{0} sekonda", 

5856 "minute": "minutë", 

5857 "minutes": "{0} minuta", 

5858 "hour": "orë", 

5859 "hours": "{0} orë", 

5860 "day": "ditë", 

5861 "days": "{0} ditë", 

5862 "week": "javë", 

5863 "weeks": "{0} javë", 

5864 "month": "muaj", 

5865 "months": "{0} muaj", 

5866 "year": "vit", 

5867 "years": "{0} vjet", 

5868 } 

5869 

5870 month_names = [ 

5871 "", 

5872 "janar", 

5873 "shkurt", 

5874 "mars", 

5875 "prill", 

5876 "maj", 

5877 "qershor", 

5878 "korrik", 

5879 "gusht", 

5880 "shtator", 

5881 "tetor", 

5882 "nëntor", 

5883 "dhjetor", 

5884 ] 

5885 

5886 month_abbreviations = [ 

5887 "", 

5888 "jan", 

5889 "shk", 

5890 "mar", 

5891 "pri", 

5892 "maj", 

5893 "qer", 

5894 "korr", 

5895 "gush", 

5896 "sht", 

5897 "tet", 

5898 "nën", 

5899 "dhj", 

5900 ] 

5901 

5902 day_names = [ 

5903 "", 

5904 "e hënë", 

5905 "e martë", 

5906 "e mërkurë", 

5907 "e enjte", 

5908 "e premte", 

5909 "e shtunë", 

5910 "e diel", 

5911 ] 

5912 

5913 day_abbreviations = [ 

5914 "", 

5915 "hën", 

5916 "mar", 

5917 "mër", 

5918 "enj", 

5919 "pre", 

5920 "sht", 

5921 "die", 

5922 ] 

5923 

5924 

5925class GeorgianLocale(Locale): 

5926 names = ["ka", "ka-ge"] 

5927 

5928 past = "{0} წინ" # ts’in 

5929 future = "{0} შემდეგ" # shemdeg 

5930 and_word = "და" # da 

5931 

5932 timeframes = { 

5933 "now": "ახლა", # akhla 

5934 # When a cardinal qualifies a noun, it stands in the singular 

5935 "second": "წამის", # ts’amis 

5936 "seconds": "{0} წამის", 

5937 "minute": "წუთის", # ts’utis 

5938 "minutes": "{0} წუთის", 

5939 "hour": "საათის", # saatis 

5940 "hours": "{0} საათის", 

5941 "day": "დღის", # dghis 

5942 "days": "{0} დღის", 

5943 "week": "კვირის", # k’viris 

5944 "weeks": "{0} კვირის", 

5945 "month": "თვის", # tvis 

5946 "months": "{0} თვის", 

5947 "year": "წლის", # ts’lis 

5948 "years": "{0} წლის", 

5949 } 

5950 

5951 month_names = [ 

5952 # modern month names 

5953 "", 

5954 "იანვარი", # Ianvari 

5955 "თებერვალი", # Tebervali 

5956 "მარტი", # Mart'i 

5957 "აპრილი", # Ap'rili 

5958 "მაისი", # Maisi 

5959 "ივნისი", # Ivnisi 

5960 "ივლისი", # Ivlisi 

5961 "აგვისტო", # Agvist'o 

5962 "სექტემბერი", # Sekt'emberi 

5963 "ოქტომბერი", # Okt'omberi 

5964 "ნოემბერი", # Noemberi 

5965 "დეკემბერი", # Dek'emberi 

5966 ] 

5967 

5968 month_abbreviations = [ 

5969 # no abbr. found yet 

5970 "", 

5971 "იანვარი", # Ianvari 

5972 "თებერვალი", # Tebervali 

5973 "მარტი", # Mart'i 

5974 "აპრილი", # Ap'rili 

5975 "მაისი", # Maisi 

5976 "ივნისი", # Ivnisi 

5977 "ივლისი", # Ivlisi 

5978 "აგვისტო", # Agvist'o 

5979 "სექტემბერი", # Sekt'emberi 

5980 "ოქტომბერი", # Okt'omberi 

5981 "ნოემბერი", # Noemberi 

5982 "დეკემბერი", # Dek'emberi 

5983 ] 

5984 

5985 day_names = [ 

5986 "", 

5987 "ორშაბათი", # orshabati 

5988 "სამშაბათი", # samshabati 

5989 "ოთხშაბათი", # otkhshabati 

5990 "ხუთშაბათი", # khutshabati 

5991 "პარასკევი", # p’arask’evi 

5992 "შაბათი", # shabati 

5993 # "k’vira" also serves as week; to avoid confusion "k’vira-dge" can be used for Sunday 

5994 "კვირა", # k’vira 

5995 ] 

5996 

5997 day_abbreviations = [ 

5998 "", 

5999 "ორშაბათი", # orshabati 

6000 "სამშაბათი", # samshabati 

6001 "ოთხშაბათი", # otkhshabati 

6002 "ხუთშაბათი", # khutshabati 

6003 "პარასკევი", # p’arask’evi 

6004 "შაბათი", # shabati 

6005 "კვირა", # k’vira 

6006 ] 

6007 

6008 

6009class SinhalaLocale(Locale): 

6010 names = ["si", "si-lk"] 

6011 

6012 past = "{0}ට පෙර" 

6013 future = "{0}" 

6014 and_word = "සහ" 

6015 

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

6017 "now": "දැන්", 

6018 "second": { 

6019 "past": "තත්පරයක", 

6020 "future": "තත්පරයකින්", 

6021 }, # ක් is the article 

6022 "seconds": { 

6023 "past": "තත්පර {0} ක", 

6024 "future": "තත්පර {0} කින්", 

6025 }, 

6026 "minute": { 

6027 "past": "විනාඩියක", 

6028 "future": "විනාඩියකින්", 

6029 }, 

6030 "minutes": { 

6031 "past": "විනාඩි {0} ක", 

6032 "future": "මිනිත්තු {0} කින්", 

6033 }, 

6034 "hour": {"past": "පැයක", "future": "පැයකින්"}, 

6035 "hours": { 

6036 "past": "පැය {0} ක", 

6037 "future": "පැය {0} කින්", 

6038 }, 

6039 "day": {"past": "දිනක", "future": "දිනකට"}, 

6040 "days": { 

6041 "past": "දින {0} ක", 

6042 "future": "දින {0} කින්", 

6043 }, 

6044 "week": {"past": "සතියක", "future": "සතියකින්"}, 

6045 "weeks": { 

6046 "past": "සති {0} ක", 

6047 "future": "සති {0} කින්", 

6048 }, 

6049 "month": {"past": "මාසයක", "future": "එය මාසය තුළ"}, 

6050 "months": { 

6051 "past": "මාස {0} ක", 

6052 "future": "මාස {0} කින්", 

6053 }, 

6054 "year": {"past": "වසරක", "future": "වසරක් තුළ"}, 

6055 "years": { 

6056 "past": "අවුරුදු {0} ක", 

6057 "future": "අවුරුදු {0} තුළ", 

6058 }, 

6059 } 

6060 # Sinhala: the general format to describe timeframe is different from past and future, 

6061 # so we do not copy the original timeframes dictionary 

6062 timeframes_only_distance = {} 

6063 timeframes_only_distance["second"] = "තත්පරයක්" 

6064 timeframes_only_distance["seconds"] = "තත්පර {0}" 

6065 timeframes_only_distance["minute"] = "මිනිත්තුවක්" 

6066 timeframes_only_distance["minutes"] = "විනාඩි {0}" 

6067 timeframes_only_distance["hour"] = "පැයක්" 

6068 timeframes_only_distance["hours"] = "පැය {0}" 

6069 timeframes_only_distance["day"] = "දවසක්" 

6070 timeframes_only_distance["days"] = "දවස් {0}" 

6071 timeframes_only_distance["week"] = "සතියක්" 

6072 timeframes_only_distance["weeks"] = "සති {0}" 

6073 timeframes_only_distance["month"] = "මාසයක්" 

6074 timeframes_only_distance["months"] = "මාස {0}" 

6075 timeframes_only_distance["year"] = "අවුරුද්දක්" 

6076 timeframes_only_distance["years"] = "අවුරුදු {0}" 

6077 

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

6079 """ 

6080 Sinhala awares time frame format function, takes into account 

6081 the differences between general, past, and future forms (three different suffixes). 

6082 """ 

6083 abs_delta = abs(delta) 

6084 form = self.timeframes[timeframe] 

6085 

6086 if isinstance(form, str): 

6087 return form.format(abs_delta) 

6088 

6089 if delta > 0: 

6090 key = "future" 

6091 else: 

6092 key = "past" 

6093 form = form[key] 

6094 

6095 return form.format(abs_delta) 

6096 

6097 def describe( 

6098 self, 

6099 timeframe: TimeFrameLiteral, 

6100 delta: Union[float, int] = 1, # key is always future when only_distance=False 

6101 only_distance: bool = False, 

6102 ) -> str: 

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

6104 

6105 :param timeframe: a string representing a timeframe. 

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

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

6108 """ 

6109 

6110 if not only_distance: 

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

6112 # Sinhala uses a different case without 'in' or 'ago' 

6113 humanized = self.timeframes_only_distance[timeframe].format(trunc(abs(delta))) 

6114 

6115 return humanized 

6116 

6117 month_names = [ 

6118 "", 

6119 "ජනවාරි", 

6120 "පෙබරවාරි", 

6121 "මාර්තු", 

6122 "අප්‍රේල්", 

6123 "මැයි", 

6124 "ජූනි", 

6125 "ජූලි", 

6126 "අගෝස්තු", 

6127 "සැප්තැම්බර්", 

6128 "ඔක්තෝබර්", 

6129 "නොවැම්බර්", 

6130 "දෙසැම්බර්", 

6131 ] 

6132 

6133 month_abbreviations = [ 

6134 "", 

6135 "ජන", 

6136 "පෙබ", 

6137 "මාර්", 

6138 "අප්‍රේ", 

6139 "මැයි", 

6140 "ජුනි", 

6141 "ජූලි", 

6142 "අගෝ", 

6143 "සැප්", 

6144 "ඔක්", 

6145 "නොවැ", 

6146 "දෙසැ", 

6147 ] 

6148 

6149 day_names = [ 

6150 "", 

6151 "සදුදා", 

6152 "අඟහරැවදා", 

6153 "බදාදා", 

6154 "බ්‍රහස්‍පතින්‍දා", 

6155 "සිකුරාදා", 

6156 "සෙනසුරාදා", 

6157 "ඉරිදා", 

6158 ] 

6159 

6160 day_abbreviations = [ 

6161 "", 

6162 "සදුද", 

6163 "බදා", 

6164 "බදා", 

6165 "සිකු", 

6166 "සෙන", 

6167 "අ", 

6168 "ඉරිදා", 

6169 ] 

6170 

6171 

6172class UrduLocale(Locale): 

6173 names = ["ur", "ur-pk"] 

6174 

6175 past = "پہلے {0}" 

6176 future = "میں {0}" 

6177 and_word = "اور" 

6178 

6179 timeframes = { 

6180 "now": "ابھی", 

6181 "second": "ایک سیکنڈ", 

6182 "seconds": "{0} سیکنڈ", 

6183 "minute": "ایک منٹ", 

6184 "minutes": "{0} منٹ", 

6185 "hour": "ایک گھنٹے", 

6186 "hours": "{0} گھنٹے", 

6187 "day": "ایک دن", 

6188 "days": "{0} دن", 

6189 "week": "ایک ہفتے", 

6190 "weeks": "{0} ہفتے", 

6191 "month": "ایک مہینہ", 

6192 "months": "{0} ماہ", 

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

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

6195 } 

6196 

6197 month_names = [ 

6198 "", 

6199 "جنوری", 

6200 "فروری", 

6201 "مارچ", 

6202 "اپریل", 

6203 "مئی", 

6204 "جون", 

6205 "جولائی", 

6206 "اگست", 

6207 "ستمبر", 

6208 "اکتوبر", 

6209 "نومبر", 

6210 "دسمبر", 

6211 ] 

6212 

6213 month_abbreviations = [ 

6214 "", 

6215 "جنوری", 

6216 "فروری", 

6217 "مارچ", 

6218 "اپریل", 

6219 "مئی", 

6220 "جون", 

6221 "جولائی", 

6222 "اگست", 

6223 "ستمبر", 

6224 "اکتوبر", 

6225 "نومبر", 

6226 "دسمبر", 

6227 ] 

6228 

6229 day_names = [ 

6230 "", 

6231 "سوموار", 

6232 "منگل", 

6233 "بدھ", 

6234 "جمعرات", 

6235 "جمعہ", 

6236 "ہفتہ", 

6237 "اتوار", 

6238 ] 

6239 

6240 day_abbreviations = [ 

6241 "", 

6242 "سوموار", 

6243 "منگل", 

6244 "بدھ", 

6245 "جمعرات", 

6246 "جمعہ", 

6247 "ہفتہ", 

6248 "اتوار", 

6249 ] 

6250 

6251 

6252class KazakhLocale(Locale): 

6253 names = ["kk", "kk-kz"] 

6254 

6255 past = "{0} бұрын" 

6256 future = "{0} кейін" 

6257 timeframes = { 

6258 "now": "қазір", 

6259 "second": "бір секунд", 

6260 "seconds": "{0} секунд", 

6261 "minute": "бір минут", 

6262 "minutes": "{0} минут", 

6263 "hour": "бір сағат", 

6264 "hours": "{0} сағат", 

6265 "day": "бір күн", 

6266 "days": "{0} күн", 

6267 "week": "бір апта", 

6268 "weeks": "{0} апта", 

6269 "month": "бір ай", 

6270 "months": "{0} ай", 

6271 "year": "бір жыл", 

6272 "years": "{0} жыл", 

6273 } 

6274 

6275 month_names = [ 

6276 "", 

6277 "Қаңтар", 

6278 "Ақпан", 

6279 "Наурыз", 

6280 "Сәуір", 

6281 "Мамыр", 

6282 "Маусым", 

6283 "Шілде", 

6284 "Тамыз", 

6285 "Қыркүйек", 

6286 "Қазан", 

6287 "Қараша", 

6288 "Желтоқсан", 

6289 ] 

6290 month_abbreviations = [ 

6291 "", 

6292 "Қан", 

6293 "Ақп", 

6294 "Нау", 

6295 "Сәу", 

6296 "Мам", 

6297 "Мау", 

6298 "Шіл", 

6299 "Там", 

6300 "Қыр", 

6301 "Қаз", 

6302 "Қар", 

6303 "Жел", 

6304 ] 

6305 

6306 day_names = [ 

6307 "", 

6308 "Дүйсембі", 

6309 "Сейсенбі", 

6310 "Сәрсенбі", 

6311 "Бейсенбі", 

6312 "Жұма", 

6313 "Сенбі", 

6314 "Жексенбі", 

6315 ] 

6316 day_abbreviations = ["", "Дс", "Сс", "Ср", "Бс", "Жм", "Сб", "Жс"] 

6317 

6318 

6319class AmharicLocale(Locale): 

6320 names = ["am", "am-et"] 

6321 

6322 past = "{0} በፊት" 

6323 future = "{0} ውስጥ" 

6324 and_word = "እና" 

6325 

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

6327 "now": "አሁን", 

6328 "second": { 

6329 "past": "ከአንድ ሰከንድ", 

6330 "future": "በአንድ ሰከንድ", 

6331 }, 

6332 "seconds": { 

6333 "past": "ከ {0} ሰከንድ", 

6334 "future": "በ {0} ሰከንድ", 

6335 }, 

6336 "minute": { 

6337 "past": "ከአንድ ደቂቃ", 

6338 "future": "በአንድ ደቂቃ", 

6339 }, 

6340 "minutes": { 

6341 "past": "ከ {0} ደቂቃዎች", 

6342 "future": "በ {0} ደቂቃዎች", 

6343 }, 

6344 "hour": { 

6345 "past": "ከአንድ ሰዓት", 

6346 "future": "በአንድ ሰዓት", 

6347 }, 

6348 "hours": { 

6349 "past": "ከ {0} ሰዓታት", 

6350 "future": "በ {0} ሰከንድ", 

6351 }, 

6352 "day": { 

6353 "past": "ከአንድ ቀን", 

6354 "future": "በአንድ ቀን", 

6355 }, 

6356 "days": { 

6357 "past": "ከ {0} ቀናት", 

6358 "future": "በ {0} ቀናት", 

6359 }, 

6360 "week": { 

6361 "past": "ከአንድ ሳምንት", 

6362 "future": "በአንድ ሳምንት", 

6363 }, 

6364 "weeks": { 

6365 "past": "ከ {0} ሳምንታት", 

6366 "future": "በ {0} ሳምንታት", 

6367 }, 

6368 "month": { 

6369 "past": "ከአንድ ወር", 

6370 "future": "በአንድ ወር", 

6371 }, 

6372 "months": { 

6373 "past": "ከ {0} ወር", 

6374 "future": "በ {0} ወራት", 

6375 }, 

6376 "year": { 

6377 "past": "ከአንድ አመት", 

6378 "future": "በአንድ አመት", 

6379 }, 

6380 "years": { 

6381 "past": "ከ {0} ዓመታት", 

6382 "future": "በ {0} ዓመታት", 

6383 }, 

6384 } 

6385 # Amharic: the general format to describe timeframe is different from past and future, 

6386 # so we do not copy the original timeframes dictionary 

6387 timeframes_only_distance = { 

6388 "second": "አንድ ሰከንድ", 

6389 "seconds": "{0} ሰከንድ", 

6390 "minute": "አንድ ደቂቃ", 

6391 "minutes": "{0} ደቂቃዎች", 

6392 "hour": "አንድ ሰዓት", 

6393 "hours": "{0} ሰዓት", 

6394 "day": "አንድ ቀን", 

6395 "days": "{0} ቀናት", 

6396 "week": "አንድ ሳምንት", 

6397 "weeks": "{0} ሳምንት", 

6398 "month": "አንድ ወር", 

6399 "months": "{0} ወራት", 

6400 "year": "አንድ አመት", 

6401 "years": "{0} ዓመታት", 

6402 } 

6403 

6404 month_names = [ 

6405 "", 

6406 "ጃንዩወሪ", 

6407 "ፌብሩወሪ", 

6408 "ማርች", 

6409 "ኤፕሪል", 

6410 "ሜይ", 

6411 "ጁን", 

6412 "ጁላይ", 

6413 "ኦገስት", 

6414 "ሴፕቴምበር", 

6415 "ኦክቶበር", 

6416 "ኖቬምበር", 

6417 "ዲሴምበር", 

6418 ] 

6419 

6420 month_abbreviations = [ 

6421 "", 

6422 "ጃንዩ", 

6423 "ፌብሩ", 

6424 "ማርች", 

6425 "ኤፕሪ", 

6426 "ሜይ", 

6427 "ጁን", 

6428 "ጁላይ", 

6429 "ኦገስ", 

6430 "ሴፕቴ", 

6431 "ኦክቶ", 

6432 "ኖቬም", 

6433 "ዲሴም", 

6434 ] 

6435 

6436 day_names = [ 

6437 "", 

6438 "ሰኞ", 

6439 "ማክሰኞ", 

6440 "ረቡዕ", 

6441 "ሐሙስ", 

6442 "ዓርብ", 

6443 "ቅዳሜ", 

6444 "እሑድ", 

6445 ] 

6446 day_abbreviations = ["", "እ", "ሰ", "ማ", "ረ", "ሐ", "ዓ", "ቅ"] 

6447 

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

6449 return f"{n}ኛ" 

6450 

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

6452 """ 

6453 Amharic awares time frame format function, takes into account 

6454 the differences between general, past, and future forms (three different suffixes). 

6455 """ 

6456 abs_delta = abs(delta) 

6457 form = self.timeframes[timeframe] 

6458 

6459 if isinstance(form, str): 

6460 return form.format(abs_delta) 

6461 

6462 if delta > 0: 

6463 key = "future" 

6464 else: 

6465 key = "past" 

6466 form = form[key] 

6467 

6468 return form.format(abs_delta) 

6469 

6470 def describe( 

6471 self, 

6472 timeframe: TimeFrameLiteral, 

6473 delta: Union[float, int] = 1, # key is always future when only_distance=False 

6474 only_distance: bool = False, 

6475 ) -> str: 

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

6477 

6478 :param timeframe: a string representing a timeframe. 

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

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

6481 """ 

6482 

6483 if not only_distance: 

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

6485 humanized = self.timeframes_only_distance[timeframe].format(trunc(abs(delta))) 

6486 

6487 return humanized 

6488 

6489 

6490class ArmenianLocale(Locale): 

6491 names = ["hy", "hy-am"] 

6492 past = "{0} առաջ" 

6493 future = "{0}ից" 

6494 and_word = "Եվ" # Yev 

6495 

6496 timeframes = { 

6497 "now": "հիմա", 

6498 "second": "վայրկյան", 

6499 "seconds": "{0} վայրկյան", 

6500 "minute": "րոպե", 

6501 "minutes": "{0} րոպե", 

6502 "hour": "ժամ", 

6503 "hours": "{0} ժամ", 

6504 "day": "օր", 

6505 "days": "{0} օր", 

6506 "month": "ամիս", 

6507 "months": "{0} ամիս", 

6508 "year": "տարին", 

6509 "years": "{0} տարին", 

6510 "week": "շաբաթ", 

6511 "weeks": "{0} շաբաթ", 

6512 } 

6513 

6514 meridians = { 

6515 "am": "Ամ", 

6516 "pm": "պ.մ.", 

6517 "AM": "Ամ", 

6518 "PM": "պ.մ.", 

6519 } 

6520 

6521 month_names = [ 

6522 "", 

6523 "հունվար", 

6524 "փետրվար", 

6525 "մարտ", 

6526 "ապրիլ", 

6527 "մայիս", 

6528 "հունիս", 

6529 "հուլիս", 

6530 "օգոստոս", 

6531 "սեպտեմբեր", 

6532 "հոկտեմբեր", 

6533 "նոյեմբեր", 

6534 "դեկտեմբեր", 

6535 ] 

6536 

6537 month_abbreviations = [ 

6538 "", 

6539 "հունվար", 

6540 "փետրվար", 

6541 "մարտ", 

6542 "ապրիլ", 

6543 "մայիս", 

6544 "հունիս", 

6545 "հուլիս", 

6546 "օգոստոս", 

6547 "սեպտեմբեր", 

6548 "հոկտեմբեր", 

6549 "նոյեմբեր", 

6550 "դեկտեմբեր", 

6551 ] 

6552 

6553 day_names = [ 

6554 "", 

6555 "երկուշաբթի", 

6556 "երեքշաբթի", 

6557 "չորեքշաբթի", 

6558 "հինգշաբթի", 

6559 "ուրբաթ", 

6560 "շաբաթ", 

6561 "կիրակի", 

6562 ] 

6563 

6564 day_abbreviations = [ 

6565 "", 

6566 "երկ.", 

6567 "երեք.", 

6568 "չորեք.", 

6569 "հինգ.", 

6570 "ուրբ.", 

6571 "շաբ.", 

6572 "կիր.", 

6573 ] 

6574 

6575 

6576class UzbekLocale(Locale): 

6577 names = ["uz", "uz-uz"] 

6578 past = "{0}dan avval" 

6579 future = "{0}dan keyin" 

6580 timeframes = { 

6581 "now": "hozir", 

6582 "second": "bir soniya", 

6583 "seconds": "{0} soniya", 

6584 "minute": "bir daqiqa", 

6585 "minutes": "{0} daqiqa", 

6586 "hour": "bir soat", 

6587 "hours": "{0} soat", 

6588 "day": "bir kun", 

6589 "days": "{0} kun", 

6590 "week": "bir hafta", 

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

6592 "month": "bir oy", 

6593 "months": "{0} oy", 

6594 "year": "bir yil", 

6595 "years": "{0} yil", 

6596 } 

6597 

6598 month_names = [ 

6599 "", 

6600 "Yanvar", 

6601 "Fevral", 

6602 "Mart", 

6603 "Aprel", 

6604 "May", 

6605 "Iyun", 

6606 "Iyul", 

6607 "Avgust", 

6608 "Sentyabr", 

6609 "Oktyabr", 

6610 "Noyabr", 

6611 "Dekabr", 

6612 ] 

6613 

6614 month_abbreviations = [ 

6615 "", 

6616 "Yan", 

6617 "Fev", 

6618 "Mar", 

6619 "Apr", 

6620 "May", 

6621 "Iyn", 

6622 "Iyl", 

6623 "Avg", 

6624 "Sen", 

6625 "Okt", 

6626 "Noy", 

6627 "Dek", 

6628 ] 

6629 

6630 day_names = [ 

6631 "", 

6632 "Dushanba", 

6633 "Seshanba", 

6634 "Chorshanba", 

6635 "Payshanba", 

6636 "Juma", 

6637 "Shanba", 

6638 "Yakshanba", 

6639 ] 

6640 

6641 day_abbreviations = ["", "Dush", "Sesh", "Chor", "Pay", "Jum", "Shan", "Yak"]