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

1167 statements  

« prev     ^ index     » next       coverage.py v7.3.1, created at 2023-09-25 06:13 +0000

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

2 

3import sys 

4from math import trunc 

5from typing import ( 

6 Any, 

7 ClassVar, 

8 Dict, 

9 List, 

10 Mapping, 

11 Optional, 

12 Sequence, 

13 Tuple, 

14 Type, 

15 Union, 

16 cast, 

17) 

18 

19if sys.version_info < (3, 8): # pragma: no cover 

20 from typing_extensions import Literal 

21else: 

22 from typing import Literal # pragma: no cover 

23 

24TimeFrameLiteral = Literal[ 

25 "now", 

26 "second", 

27 "seconds", 

28 "minute", 

29 "minutes", 

30 "hour", 

31 "hours", 

32 "day", 

33 "days", 

34 "week", 

35 "weeks", 

36 "month", 

37 "months", 

38 "quarter", 

39 "quarters", 

40 "year", 

41 "years", 

42] 

43 

44_TimeFrameElements = Union[ 

45 str, Sequence[str], Mapping[str, str], Mapping[str, Sequence[str]] 

46] 

47 

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

49 

50 

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

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

53 corresponding to an input locale name. 

54 

55 :param name: the name of the locale. 

56 

57 """ 

58 

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

60 locale_cls = _locale_map.get(normalized_locale_name) 

61 

62 if locale_cls is None: 

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

64 

65 return locale_cls() 

66 

67 

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

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

70 corresponding to an locale class name. 

71 

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

73 

74 """ 

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

76 

77 if locale_cls is None: 

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

79 

80 return locale_cls() 

81 

82 

83class Locale: 

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

85 

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

87 

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

89 "now": "", 

90 "second": "", 

91 "seconds": "", 

92 "minute": "", 

93 "minutes": "", 

94 "hour": "", 

95 "hours": "", 

96 "day": "", 

97 "days": "", 

98 "week": "", 

99 "weeks": "", 

100 "month": "", 

101 "months": "", 

102 "quarter": "", 

103 "quarters": "", 

104 "year": "", 

105 "years": "", 

106 } 

107 

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

109 

110 past: ClassVar[str] 

111 future: ClassVar[str] 

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

113 

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

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

116 

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

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

119 

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

121 

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

123 

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

125 for locale_name in cls.names: 

126 if locale_name in _locale_map: 

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

128 

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

130 

131 def __init__(self) -> None: 

132 self._month_name_to_ordinal = None 

133 

134 def describe( 

135 self, 

136 timeframe: TimeFrameLiteral, 

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

138 only_distance: bool = False, 

139 ) -> str: 

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

141 

142 :param timeframe: a string representing a timeframe. 

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

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

145 """ 

146 

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

148 if not only_distance: 

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

150 

151 return humanized 

152 

153 def describe_multi( 

154 self, 

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

156 only_distance: bool = False, 

157 ) -> str: 

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

159 

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

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

162 """ 

163 

164 parts = [ 

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

166 for timeframe, delta in timeframes 

167 ] 

168 if self.and_word: 

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

170 humanized = " ".join(parts) 

171 

172 if not only_distance: 

173 # Needed to determine the correct relative string to use 

174 timeframe_value = 0 

175 

176 for _, unit_value in timeframes: 

177 if trunc(unit_value) != 0: 

178 timeframe_value = trunc(unit_value) 

179 break 

180 

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

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

183 

184 return humanized 

185 

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

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

188 

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

190 

191 """ 

192 

193 return self.day_names[day] 

194 

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

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

197 

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

199 

200 """ 

201 

202 return self.day_abbreviations[day] 

203 

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

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

206 

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

208 

209 """ 

210 

211 return self.month_names[month] 

212 

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

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

215 

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

217 

218 """ 

219 

220 return self.month_abbreviations[month] 

221 

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

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

224 

225 :param name: the month name or abbreviation. 

226 

227 """ 

228 

229 if self._month_name_to_ordinal is None: 

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

231 self._month_name_to_ordinal.update( 

232 self._name_to_ordinal(self.month_abbreviations) 

233 ) 

234 

235 return self._month_name_to_ordinal.get(name) 

236 

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

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

239 

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

241 """ 

242 return f"{year:04d}" 

243 

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

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

246 

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

248 """ 

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

250 

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

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

253 

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

255 :param token: the format token. 

256 """ 

257 

258 if token == "a": 

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

260 if token == "A": 

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

262 return None 

263 

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

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

266 

267 :param n: an integer 

268 """ 

269 return self._ordinal_number(n) 

270 

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

272 return f"{n}" 

273 

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

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

276 

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

278 # TODO: remove cast 

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

280 

281 def _format_relative( 

282 self, 

283 humanized: str, 

284 timeframe: TimeFrameLiteral, 

285 delta: Union[float, int], 

286 ) -> str: 

287 if timeframe == "now": 

288 return humanized 

289 

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

291 

292 return direction.format(humanized) 

293 

294 

295class EnglishLocale(Locale): 

296 names = [ 

297 "en", 

298 "en-us", 

299 "en-gb", 

300 "en-au", 

301 "en-be", 

302 "en-jp", 

303 "en-za", 

304 "en-ca", 

305 "en-ph", 

306 ] 

307 

308 past = "{0} ago" 

309 future = "in {0}" 

310 and_word = "and" 

311 

312 timeframes = { 

313 "now": "just now", 

314 "second": "a second", 

315 "seconds": "{0} seconds", 

316 "minute": "a minute", 

317 "minutes": "{0} minutes", 

318 "hour": "an hour", 

319 "hours": "{0} hours", 

320 "day": "a day", 

321 "days": "{0} days", 

322 "week": "a week", 

323 "weeks": "{0} weeks", 

324 "month": "a month", 

325 "months": "{0} months", 

326 "quarter": "a quarter", 

327 "quarters": "{0} quarters", 

328 "year": "a year", 

329 "years": "{0} years", 

330 } 

331 

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

333 

334 month_names = [ 

335 "", 

336 "January", 

337 "February", 

338 "March", 

339 "April", 

340 "May", 

341 "June", 

342 "July", 

343 "August", 

344 "September", 

345 "October", 

346 "November", 

347 "December", 

348 ] 

349 month_abbreviations = [ 

350 "", 

351 "Jan", 

352 "Feb", 

353 "Mar", 

354 "Apr", 

355 "May", 

356 "Jun", 

357 "Jul", 

358 "Aug", 

359 "Sep", 

360 "Oct", 

361 "Nov", 

362 "Dec", 

363 ] 

364 

365 day_names = [ 

366 "", 

367 "Monday", 

368 "Tuesday", 

369 "Wednesday", 

370 "Thursday", 

371 "Friday", 

372 "Saturday", 

373 "Sunday", 

374 ] 

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

376 

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

378 

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

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

381 remainder = abs(n) % 10 

382 if remainder == 1: 

383 return f"{n}st" 

384 elif remainder == 2: 

385 return f"{n}nd" 

386 elif remainder == 3: 

387 return f"{n}rd" 

388 return f"{n}th" 

389 

390 def describe( 

391 self, 

392 timeframe: TimeFrameLiteral, 

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

394 only_distance: bool = False, 

395 ) -> str: 

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

397 

398 :param timeframe: a string representing a timeframe. 

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

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

401 """ 

402 

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

404 if only_distance and timeframe == "now": 

405 humanized = "instantly" 

406 

407 return humanized 

408 

409 

410class ItalianLocale(Locale): 

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

412 past = "{0} fa" 

413 future = "tra {0}" 

414 and_word = "e" 

415 

416 timeframes = { 

417 "now": "adesso", 

418 "second": "un secondo", 

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

420 "minute": "un minuto", 

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

422 "hour": "un'ora", 

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

424 "day": "un giorno", 

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

426 "week": "una settimana", 

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

428 "month": "un mese", 

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

430 "year": "un anno", 

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

432 } 

433 

434 month_names = [ 

435 "", 

436 "gennaio", 

437 "febbraio", 

438 "marzo", 

439 "aprile", 

440 "maggio", 

441 "giugno", 

442 "luglio", 

443 "agosto", 

444 "settembre", 

445 "ottobre", 

446 "novembre", 

447 "dicembre", 

448 ] 

449 month_abbreviations = [ 

450 "", 

451 "gen", 

452 "feb", 

453 "mar", 

454 "apr", 

455 "mag", 

456 "giu", 

457 "lug", 

458 "ago", 

459 "set", 

460 "ott", 

461 "nov", 

462 "dic", 

463 ] 

464 

465 day_names = [ 

466 "", 

467 "lunedì", 

468 "martedì", 

469 "mercoledì", 

470 "giovedì", 

471 "venerdì", 

472 "sabato", 

473 "domenica", 

474 ] 

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

476 

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

478 

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

480 return f"{n}º" 

481 

482 

483class SpanishLocale(Locale): 

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

485 past = "hace {0}" 

486 future = "en {0}" 

487 and_word = "y" 

488 

489 timeframes = { 

490 "now": "ahora", 

491 "second": "un segundo", 

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

493 "minute": "un minuto", 

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

495 "hour": "una hora", 

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

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

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

499 "week": "una semana", 

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

501 "month": "un mes", 

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

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

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

505 } 

506 

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

508 

509 month_names = [ 

510 "", 

511 "enero", 

512 "febrero", 

513 "marzo", 

514 "abril", 

515 "mayo", 

516 "junio", 

517 "julio", 

518 "agosto", 

519 "septiembre", 

520 "octubre", 

521 "noviembre", 

522 "diciembre", 

523 ] 

524 month_abbreviations = [ 

525 "", 

526 "ene", 

527 "feb", 

528 "mar", 

529 "abr", 

530 "may", 

531 "jun", 

532 "jul", 

533 "ago", 

534 "sep", 

535 "oct", 

536 "nov", 

537 "dic", 

538 ] 

539 

540 day_names = [ 

541 "", 

542 "lunes", 

543 "martes", 

544 "miércoles", 

545 "jueves", 

546 "viernes", 

547 "sábado", 

548 "domingo", 

549 ] 

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

551 

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

553 

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

555 return f"{n}º" 

556 

557 

558class FrenchBaseLocale(Locale): 

559 past = "il y a {0}" 

560 future = "dans {0}" 

561 and_word = "et" 

562 

563 timeframes = { 

564 "now": "maintenant", 

565 "second": "une seconde", 

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

567 "minute": "une minute", 

568 "minutes": "{0} minutes", 

569 "hour": "une heure", 

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

571 "day": "un jour", 

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

573 "week": "une semaine", 

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

575 "month": "un mois", 

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

577 "year": "un an", 

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

579 } 

580 

581 month_names = [ 

582 "", 

583 "janvier", 

584 "février", 

585 "mars", 

586 "avril", 

587 "mai", 

588 "juin", 

589 "juillet", 

590 "août", 

591 "septembre", 

592 "octobre", 

593 "novembre", 

594 "décembre", 

595 ] 

596 

597 day_names = [ 

598 "", 

599 "lundi", 

600 "mardi", 

601 "mercredi", 

602 "jeudi", 

603 "vendredi", 

604 "samedi", 

605 "dimanche", 

606 ] 

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

608 

609 ordinal_day_re = ( 

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

611 ) 

612 

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

614 if abs(n) == 1: 

615 return f"{n}er" 

616 return f"{n}e" 

617 

618 

619class FrenchLocale(FrenchBaseLocale, Locale): 

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

621 

622 month_abbreviations = [ 

623 "", 

624 "janv", 

625 "févr", 

626 "mars", 

627 "avr", 

628 "mai", 

629 "juin", 

630 "juil", 

631 "août", 

632 "sept", 

633 "oct", 

634 "nov", 

635 "déc", 

636 ] 

637 

638 

639class FrenchCanadianLocale(FrenchBaseLocale, Locale): 

640 names = ["fr-ca"] 

641 

642 month_abbreviations = [ 

643 "", 

644 "janv", 

645 "févr", 

646 "mars", 

647 "avr", 

648 "mai", 

649 "juin", 

650 "juill", 

651 "août", 

652 "sept", 

653 "oct", 

654 "nov", 

655 "déc", 

656 ] 

657 

658 

659class GreekLocale(Locale): 

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

661 

662 past = "{0} πριν" 

663 future = "σε {0}" 

664 and_word = "και" 

665 

666 timeframes = { 

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

668 "second": "ένα δεύτερο", 

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

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

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

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

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

674 "day": "μία μέρα", 

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

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

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

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

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

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

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

682 } 

683 

684 month_names = [ 

685 "", 

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

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

688 "Μαρτίου", 

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

690 "Μαΐου", 

691 "Ιουνίου", 

692 "Ιουλίου", 

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

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

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

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

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

698 ] 

699 month_abbreviations = [ 

700 "", 

701 "Ιαν", 

702 "Φεβ", 

703 "Μαρ", 

704 "Απρ", 

705 "Μαϊ", 

706 "Ιον", 

707 "Ιολ", 

708 "Αυγ", 

709 "Σεπ", 

710 "Οκτ", 

711 "Νοε", 

712 "Δεκ", 

713 ] 

714 

715 day_names = [ 

716 "", 

717 "Δευτέρα", 

718 "Τρίτη", 

719 "Τετάρτη", 

720 "Πέμπτη", 

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

722 "Σάββατο", 

723 "Κυριακή", 

724 ] 

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

726 

727 

728class JapaneseLocale(Locale): 

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

730 

731 past = "{0}前" 

732 future = "{0}後" 

733 and_word = "" 

734 

735 timeframes = { 

736 "now": "現在", 

737 "second": "1秒", 

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

739 "minute": "1分", 

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

741 "hour": "1時間", 

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

743 "day": "1日", 

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

745 "week": "1週間", 

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

747 "month": "1ヶ月", 

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

749 "year": "1年", 

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

751 } 

752 

753 month_names = [ 

754 "", 

755 "1月", 

756 "2月", 

757 "3月", 

758 "4月", 

759 "5月", 

760 "6月", 

761 "7月", 

762 "8月", 

763 "9月", 

764 "10月", 

765 "11月", 

766 "12月", 

767 ] 

768 month_abbreviations = [ 

769 "", 

770 " 1", 

771 " 2", 

772 " 3", 

773 " 4", 

774 " 5", 

775 " 6", 

776 " 7", 

777 " 8", 

778 " 9", 

779 "10", 

780 "11", 

781 "12", 

782 ] 

783 

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

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

786 

787 

788class SwedishLocale(Locale): 

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

790 

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

792 future = "om {0}" 

793 and_word = "och" 

794 

795 timeframes = { 

796 "now": "just nu", 

797 "second": "en sekund", 

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

799 "minute": "en minut", 

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

801 "hour": "en timme", 

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

803 "day": "en dag", 

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

805 "week": "en vecka", 

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

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

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

809 "year": "ett år", 

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

811 } 

812 

813 month_names = [ 

814 "", 

815 "januari", 

816 "februari", 

817 "mars", 

818 "april", 

819 "maj", 

820 "juni", 

821 "juli", 

822 "augusti", 

823 "september", 

824 "oktober", 

825 "november", 

826 "december", 

827 ] 

828 month_abbreviations = [ 

829 "", 

830 "jan", 

831 "feb", 

832 "mar", 

833 "apr", 

834 "maj", 

835 "jun", 

836 "jul", 

837 "aug", 

838 "sep", 

839 "okt", 

840 "nov", 

841 "dec", 

842 ] 

843 

844 day_names = [ 

845 "", 

846 "måndag", 

847 "tisdag", 

848 "onsdag", 

849 "torsdag", 

850 "fredag", 

851 "lördag", 

852 "söndag", 

853 ] 

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

855 

856 

857class FinnishLocale(Locale): 

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

859 

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

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

862 

863 past = "{0} sitten" 

864 future = "{0} kuluttua" 

865 

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

867 "now": "juuri nyt", 

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

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

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

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

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

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

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

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

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

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

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

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

880 } 

881 

882 # Months and days are lowercase in Finnish 

883 month_names = [ 

884 "", 

885 "tammikuu", 

886 "helmikuu", 

887 "maaliskuu", 

888 "huhtikuu", 

889 "toukokuu", 

890 "kesäkuu", 

891 "heinäkuu", 

892 "elokuu", 

893 "syyskuu", 

894 "lokakuu", 

895 "marraskuu", 

896 "joulukuu", 

897 ] 

898 

899 month_abbreviations = [ 

900 "", 

901 "tammi", 

902 "helmi", 

903 "maalis", 

904 "huhti", 

905 "touko", 

906 "kesä", 

907 "heinä", 

908 "elo", 

909 "syys", 

910 "loka", 

911 "marras", 

912 "joulu", 

913 ] 

914 

915 day_names = [ 

916 "", 

917 "maanantai", 

918 "tiistai", 

919 "keskiviikko", 

920 "torstai", 

921 "perjantai", 

922 "lauantai", 

923 "sunnuntai", 

924 ] 

925 

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

927 

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

929 form = self.timeframes[timeframe] 

930 

931 if isinstance(form, Mapping): 

932 if delta < 0: 

933 form = form["past"] 

934 else: 

935 form = form["future"] 

936 

937 return form.format(abs(delta)) 

938 

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

940 return f"{n}." 

941 

942 

943class ChineseCNLocale(Locale): 

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

945 

946 past = "{0}前" 

947 future = "{0}后" 

948 

949 timeframes = { 

950 "now": "刚才", 

951 "second": "1秒", 

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

953 "minute": "1分钟", 

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

955 "hour": "1小时", 

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

957 "day": "1天", 

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

959 "week": "1周", 

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

961 "month": "1个月", 

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

963 "year": "1年", 

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

965 } 

966 

967 month_names = [ 

968 "", 

969 "一月", 

970 "二月", 

971 "三月", 

972 "四月", 

973 "五月", 

974 "六月", 

975 "七月", 

976 "八月", 

977 "九月", 

978 "十月", 

979 "十一月", 

980 "十二月", 

981 ] 

982 month_abbreviations = [ 

983 "", 

984 " 1", 

985 " 2", 

986 " 3", 

987 " 4", 

988 " 5", 

989 " 6", 

990 " 7", 

991 " 8", 

992 " 9", 

993 "10", 

994 "11", 

995 "12", 

996 ] 

997 

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

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

1000 

1001 

1002class ChineseTWLocale(Locale): 

1003 names = ["zh-tw"] 

1004 

1005 past = "{0}前" 

1006 future = "{0}後" 

1007 and_word = "和" 

1008 

1009 timeframes = { 

1010 "now": "剛才", 

1011 "second": "1秒", 

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

1013 "minute": "1分鐘", 

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

1015 "hour": "1小時", 

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

1017 "day": "1天", 

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

1019 "week": "1週", 

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

1021 "month": "1個月", 

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

1023 "year": "1年", 

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

1025 } 

1026 

1027 month_names = [ 

1028 "", 

1029 "1月", 

1030 "2月", 

1031 "3月", 

1032 "4月", 

1033 "5月", 

1034 "6月", 

1035 "7月", 

1036 "8月", 

1037 "9月", 

1038 "10月", 

1039 "11月", 

1040 "12月", 

1041 ] 

1042 month_abbreviations = [ 

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 

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

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

1060 

1061 

1062class HongKongLocale(Locale): 

1063 names = ["zh-hk"] 

1064 

1065 past = "{0}前" 

1066 future = "{0}後" 

1067 

1068 timeframes = { 

1069 "now": "剛才", 

1070 "second": "1秒", 

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

1072 "minute": "1分鐘", 

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

1074 "hour": "1小時", 

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

1076 "day": "1天", 

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

1078 "week": "1星期", 

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

1080 "month": "1個月", 

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

1082 "year": "1年", 

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

1084 } 

1085 

1086 month_names = [ 

1087 "", 

1088 "1月", 

1089 "2月", 

1090 "3月", 

1091 "4月", 

1092 "5月", 

1093 "6月", 

1094 "7月", 

1095 "8月", 

1096 "9月", 

1097 "10月", 

1098 "11月", 

1099 "12月", 

1100 ] 

1101 month_abbreviations = [ 

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 

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

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

1119 

1120 

1121class KoreanLocale(Locale): 

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

1123 

1124 past = "{0} 전" 

1125 future = "{0} 후" 

1126 

1127 timeframes = { 

1128 "now": "지금", 

1129 "second": "1초", 

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

1131 "minute": "1분", 

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

1133 "hour": "한시간", 

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

1135 "day": "하루", 

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

1137 "week": "1주", 

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

1139 "month": "한달", 

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

1141 "year": "1년", 

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

1143 } 

1144 

1145 special_dayframes = { 

1146 -3: "그끄제", 

1147 -2: "그제", 

1148 -1: "어제", 

1149 1: "내일", 

1150 2: "모레", 

1151 3: "글피", 

1152 4: "그글피", 

1153 } 

1154 

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

1156 

1157 month_names = [ 

1158 "", 

1159 "1월", 

1160 "2월", 

1161 "3월", 

1162 "4월", 

1163 "5월", 

1164 "6월", 

1165 "7월", 

1166 "8월", 

1167 "9월", 

1168 "10월", 

1169 "11월", 

1170 "12월", 

1171 ] 

1172 month_abbreviations = [ 

1173 "", 

1174 " 1", 

1175 " 2", 

1176 " 3", 

1177 " 4", 

1178 " 5", 

1179 " 6", 

1180 " 7", 

1181 " 8", 

1182 " 9", 

1183 "10", 

1184 "11", 

1185 "12", 

1186 ] 

1187 

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

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

1190 

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

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

1193 if n < len(ordinals): 

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

1195 return f"{n}번째" 

1196 

1197 def _format_relative( 

1198 self, 

1199 humanized: str, 

1200 timeframe: TimeFrameLiteral, 

1201 delta: Union[float, int], 

1202 ) -> str: 

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

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

1205 if special: 

1206 return special 

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

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

1209 if special: 

1210 return special 

1211 

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

1213 

1214 

1215# derived locale types & implementations. 

1216class DutchLocale(Locale): 

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

1218 

1219 past = "{0} geleden" 

1220 future = "over {0}" 

1221 

1222 timeframes = { 

1223 "now": "nu", 

1224 "second": "een seconde", 

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

1226 "minute": "een minuut", 

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

1228 "hour": "een uur", 

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

1230 "day": "een dag", 

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

1232 "week": "een week", 

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

1234 "month": "een maand", 

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

1236 "year": "een jaar", 

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

1238 } 

1239 

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

1241 # like in the English language. 

1242 month_names = [ 

1243 "", 

1244 "januari", 

1245 "februari", 

1246 "maart", 

1247 "april", 

1248 "mei", 

1249 "juni", 

1250 "juli", 

1251 "augustus", 

1252 "september", 

1253 "oktober", 

1254 "november", 

1255 "december", 

1256 ] 

1257 month_abbreviations = [ 

1258 "", 

1259 "jan", 

1260 "feb", 

1261 "mrt", 

1262 "apr", 

1263 "mei", 

1264 "jun", 

1265 "jul", 

1266 "aug", 

1267 "sep", 

1268 "okt", 

1269 "nov", 

1270 "dec", 

1271 ] 

1272 

1273 day_names = [ 

1274 "", 

1275 "maandag", 

1276 "dinsdag", 

1277 "woensdag", 

1278 "donderdag", 

1279 "vrijdag", 

1280 "zaterdag", 

1281 "zondag", 

1282 ] 

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

1284 

1285 

1286class SlavicBaseLocale(Locale): 

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

1288 

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

1290 form = self.timeframes[timeframe] 

1291 delta = abs(delta) 

1292 

1293 if isinstance(form, Mapping): 

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

1295 form = form["singular"] 

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

1297 form = form["dual"] 

1298 else: 

1299 form = form["plural"] 

1300 

1301 return form.format(delta) 

1302 

1303 

1304class BelarusianLocale(SlavicBaseLocale): 

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

1306 

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

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

1309 

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

1311 "now": "зараз", 

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

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

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

1315 "minutes": { 

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

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

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

1319 }, 

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

1321 "hours": { 

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

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

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

1325 }, 

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

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

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

1329 "months": { 

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

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

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

1333 }, 

1334 "year": "год", 

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

1336 } 

1337 

1338 month_names = [ 

1339 "", 

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

1341 "лютага", 

1342 "сакавіка", 

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

1344 "траўня", 

1345 "чэрвеня", 

1346 "ліпеня", 

1347 "жніўня", 

1348 "верасня", 

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

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

1351 "снежня", 

1352 ] 

1353 month_abbreviations = [ 

1354 "", 

1355 "студ", 

1356 "лют", 

1357 "сак", 

1358 "крас", 

1359 "трав", 

1360 "чэрв", 

1361 "ліп", 

1362 "жнів", 

1363 "вер", 

1364 "каст", 

1365 "ліст", 

1366 "снеж", 

1367 ] 

1368 

1369 day_names = [ 

1370 "", 

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

1372 "аўторак", 

1373 "серада", 

1374 "чацвер", 

1375 "пятніца", 

1376 "субота", 

1377 "нядзеля", 

1378 ] 

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

1380 

1381 

1382class PolishLocale(SlavicBaseLocale): 

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

1384 

1385 past = "{0} temu" 

1386 future = "za {0}" 

1387 

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

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

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

1391 "now": "teraz", 

1392 "second": "sekundę", 

1393 "seconds": { 

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

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

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

1397 }, 

1398 "minute": "minutę", 

1399 "minutes": { 

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

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

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

1403 }, 

1404 "hour": "godzinę", 

1405 "hours": { 

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

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

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

1409 }, 

1410 "day": "dzień", 

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

1412 "week": "tydzień", 

1413 "weeks": { 

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

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

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

1417 }, 

1418 "month": "miesiąc", 

1419 "months": { 

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

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

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

1423 }, 

1424 "year": "rok", 

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

1426 } 

1427 

1428 month_names = [ 

1429 "", 

1430 "styczeń", 

1431 "luty", 

1432 "marzec", 

1433 "kwiecień", 

1434 "maj", 

1435 "czerwiec", 

1436 "lipiec", 

1437 "sierpień", 

1438 "wrzesień", 

1439 "październik", 

1440 "listopad", 

1441 "grudzień", 

1442 ] 

1443 month_abbreviations = [ 

1444 "", 

1445 "sty", 

1446 "lut", 

1447 "mar", 

1448 "kwi", 

1449 "maj", 

1450 "cze", 

1451 "lip", 

1452 "sie", 

1453 "wrz", 

1454 "paź", 

1455 "lis", 

1456 "gru", 

1457 ] 

1458 

1459 day_names = [ 

1460 "", 

1461 "poniedziałek", 

1462 "wtorek", 

1463 "środa", 

1464 "czwartek", 

1465 "piątek", 

1466 "sobota", 

1467 "niedziela", 

1468 ] 

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

1470 

1471 

1472class RussianLocale(SlavicBaseLocale): 

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

1474 

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

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

1477 

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

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

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

1481 "seconds": { 

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

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

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

1485 }, 

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

1487 "minutes": { 

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

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

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

1491 }, 

1492 "hour": "час", 

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

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

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

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

1497 "weeks": { 

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

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

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

1501 }, 

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

1503 "months": { 

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

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

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

1507 }, 

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

1509 "quarters": { 

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

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

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

1513 }, 

1514 "year": "год", 

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

1516 } 

1517 

1518 month_names = [ 

1519 "", 

1520 "января", 

1521 "февраля", 

1522 "марта", 

1523 "апреля", 

1524 "мая", 

1525 "июня", 

1526 "июля", 

1527 "августа", 

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

1529 "октября", 

1530 "ноября", 

1531 "декабря", 

1532 ] 

1533 month_abbreviations = [ 

1534 "", 

1535 "янв", 

1536 "фев", 

1537 "мар", 

1538 "апр", 

1539 "май", 

1540 "июн", 

1541 "июл", 

1542 "авг", 

1543 "сен", 

1544 "окт", 

1545 "ноя", 

1546 "дек", 

1547 ] 

1548 

1549 day_names = [ 

1550 "", 

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

1552 "вторник", 

1553 "среда", 

1554 "четверг", 

1555 "пятница", 

1556 "суббота", 

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

1558 ] 

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

1560 

1561 

1562class AfrikaansLocale(Locale): 

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

1564 

1565 past = "{0} gelede" 

1566 future = "in {0}" 

1567 

1568 timeframes = { 

1569 "now": "nou", 

1570 "second": "n sekonde", 

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

1572 "minute": "minuut", 

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

1574 "hour": "uur", 

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

1576 "day": "een dag", 

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

1578 "month": "een maand", 

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

1580 "year": "een jaar", 

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

1582 } 

1583 

1584 month_names = [ 

1585 "", 

1586 "Januarie", 

1587 "Februarie", 

1588 "Maart", 

1589 "April", 

1590 "Mei", 

1591 "Junie", 

1592 "Julie", 

1593 "Augustus", 

1594 "September", 

1595 "Oktober", 

1596 "November", 

1597 "Desember", 

1598 ] 

1599 month_abbreviations = [ 

1600 "", 

1601 "Jan", 

1602 "Feb", 

1603 "Mrt", 

1604 "Apr", 

1605 "Mei", 

1606 "Jun", 

1607 "Jul", 

1608 "Aug", 

1609 "Sep", 

1610 "Okt", 

1611 "Nov", 

1612 "Des", 

1613 ] 

1614 

1615 day_names = [ 

1616 "", 

1617 "Maandag", 

1618 "Dinsdag", 

1619 "Woensdag", 

1620 "Donderdag", 

1621 "Vrydag", 

1622 "Saterdag", 

1623 "Sondag", 

1624 ] 

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

1626 

1627 

1628class BulgarianLocale(SlavicBaseLocale): 

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

1630 

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

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

1633 

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

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

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

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

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

1639 "minutes": { 

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

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

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

1643 }, 

1644 "hour": "час", 

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

1646 "day": "ден", 

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

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

1649 "months": { 

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

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

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

1653 }, 

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

1655 "years": { 

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

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

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

1659 }, 

1660 } 

1661 

1662 month_names = [ 

1663 "", 

1664 "януари", 

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

1666 "март", 

1667 "април", 

1668 "май", 

1669 "юни", 

1670 "юли", 

1671 "август", 

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

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

1674 "ноември", 

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

1676 ] 

1677 month_abbreviations = [ 

1678 "", 

1679 "ян", 

1680 "февр", 

1681 "март", 

1682 "апр", 

1683 "май", 

1684 "юни", 

1685 "юли", 

1686 "авг", 

1687 "септ", 

1688 "окт", 

1689 "ноем", 

1690 "дек", 

1691 ] 

1692 

1693 day_names = [ 

1694 "", 

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

1696 "вторник", 

1697 "сряда", 

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

1699 "петък", 

1700 "събота", 

1701 "неделя", 

1702 ] 

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

1704 

1705 

1706class UkrainianLocale(SlavicBaseLocale): 

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

1708 

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

1710 future = "за {0}" 

1711 

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

1713 "now": "зараз", 

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

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

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

1717 "minutes": { 

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

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

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

1721 }, 

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

1723 "hours": { 

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

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

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

1727 }, 

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

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

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

1731 "months": { 

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

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

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

1735 }, 

1736 "year": "рік", 

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

1738 } 

1739 

1740 month_names = [ 

1741 "", 

1742 "січня", 

1743 "лютого", 

1744 "березня", 

1745 "квітня", 

1746 "травня", 

1747 "червня", 

1748 "липня", 

1749 "серпня", 

1750 "вересня", 

1751 "жовтня", 

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

1753 "грудня", 

1754 ] 

1755 month_abbreviations = [ 

1756 "", 

1757 "січ", 

1758 "лют", 

1759 "бер", 

1760 "квіт", 

1761 "трав", 

1762 "черв", 

1763 "лип", 

1764 "серп", 

1765 "вер", 

1766 "жовт", 

1767 "лист", 

1768 "груд", 

1769 ] 

1770 

1771 day_names = [ 

1772 "", 

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

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

1775 "середа", 

1776 "четвер", 

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

1778 "субота", 

1779 "неділя", 

1780 ] 

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

1782 

1783 

1784class MacedonianLocale(SlavicBaseLocale): 

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

1786 

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

1788 future = "за {0}" 

1789 

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

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

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

1793 "seconds": { 

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

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

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

1797 }, 

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

1799 "minutes": { 

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

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

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

1803 }, 

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

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

1806 "day": "еден ден", 

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

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

1809 "weeks": { 

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

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

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

1813 }, 

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

1815 "months": { 

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

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

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

1819 }, 

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

1821 "years": { 

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

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

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

1825 }, 

1826 } 

1827 

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

1829 

1830 month_names = [ 

1831 "", 

1832 "Јануари", 

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

1834 "Март", 

1835 "Април", 

1836 "Мај", 

1837 "Јуни", 

1838 "Јули", 

1839 "Август", 

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

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

1842 "Ноември", 

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

1844 ] 

1845 month_abbreviations = [ 

1846 "", 

1847 "Јан", 

1848 "Фев", 

1849 "Мар", 

1850 "Апр", 

1851 "Мај", 

1852 "Јун", 

1853 "Јул", 

1854 "Авг", 

1855 "Септ", 

1856 "Окт", 

1857 "Ноем", 

1858 "Декем", 

1859 ] 

1860 

1861 day_names = [ 

1862 "", 

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

1864 "Вторник", 

1865 "Среда", 

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

1867 "Петок", 

1868 "Сабота", 

1869 "Недела", 

1870 ] 

1871 day_abbreviations = [ 

1872 "", 

1873 "Пон", 

1874 "Вт", 

1875 "Сре", 

1876 "Чет", 

1877 "Пет", 

1878 "Саб", 

1879 "Нед", 

1880 ] 

1881 

1882 

1883class GermanBaseLocale(Locale): 

1884 past = "vor {0}" 

1885 future = "in {0}" 

1886 and_word = "und" 

1887 

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

1889 "now": "gerade eben", 

1890 "second": "einer Sekunde", 

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

1892 "minute": "einer Minute", 

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

1894 "hour": "einer Stunde", 

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

1896 "day": "einem Tag", 

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

1898 "week": "einer Woche", 

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

1900 "month": "einem Monat", 

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

1902 "year": "einem Jahr", 

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

1904 } 

1905 

1906 timeframes_only_distance = timeframes.copy() 

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

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

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

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

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

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

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

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

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

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

1917 

1918 month_names = [ 

1919 "", 

1920 "Januar", 

1921 "Februar", 

1922 "März", 

1923 "April", 

1924 "Mai", 

1925 "Juni", 

1926 "Juli", 

1927 "August", 

1928 "September", 

1929 "Oktober", 

1930 "November", 

1931 "Dezember", 

1932 ] 

1933 

1934 month_abbreviations = [ 

1935 "", 

1936 "Jan", 

1937 "Feb", 

1938 "Mär", 

1939 "Apr", 

1940 "Mai", 

1941 "Jun", 

1942 "Jul", 

1943 "Aug", 

1944 "Sep", 

1945 "Okt", 

1946 "Nov", 

1947 "Dez", 

1948 ] 

1949 

1950 day_names = [ 

1951 "", 

1952 "Montag", 

1953 "Dienstag", 

1954 "Mittwoch", 

1955 "Donnerstag", 

1956 "Freitag", 

1957 "Samstag", 

1958 "Sonntag", 

1959 ] 

1960 

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

1962 

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

1964 return f"{n}." 

1965 

1966 def describe( 

1967 self, 

1968 timeframe: TimeFrameLiteral, 

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

1970 only_distance: bool = False, 

1971 ) -> str: 

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

1973 

1974 :param timeframe: a string representing a timeframe. 

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

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

1977 """ 

1978 

1979 if not only_distance: 

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

1981 

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

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

1984 trunc(abs(delta)) 

1985 ) 

1986 

1987 return humanized 

1988 

1989 

1990class GermanLocale(GermanBaseLocale, Locale): 

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

1992 

1993 

1994class SwissLocale(GermanBaseLocale, Locale): 

1995 names = ["de-ch"] 

1996 

1997 

1998class AustrianLocale(GermanBaseLocale, Locale): 

1999 names = ["de-at"] 

2000 

2001 month_names = [ 

2002 "", 

2003 "Jänner", 

2004 "Februar", 

2005 "März", 

2006 "April", 

2007 "Mai", 

2008 "Juni", 

2009 "Juli", 

2010 "August", 

2011 "September", 

2012 "Oktober", 

2013 "November", 

2014 "Dezember", 

2015 ] 

2016 

2017 

2018class NorwegianLocale(Locale): 

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

2020 

2021 past = "for {0} siden" 

2022 future = "om {0}" 

2023 

2024 timeframes = { 

2025 "now": "nå nettopp", 

2026 "second": "ett sekund", 

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

2028 "minute": "ett minutt", 

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

2030 "hour": "en time", 

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

2032 "day": "en dag", 

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

2034 "week": "en uke", 

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

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

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

2038 "year": "ett år", 

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

2040 } 

2041 

2042 month_names = [ 

2043 "", 

2044 "januar", 

2045 "februar", 

2046 "mars", 

2047 "april", 

2048 "mai", 

2049 "juni", 

2050 "juli", 

2051 "august", 

2052 "september", 

2053 "oktober", 

2054 "november", 

2055 "desember", 

2056 ] 

2057 month_abbreviations = [ 

2058 "", 

2059 "jan", 

2060 "feb", 

2061 "mar", 

2062 "apr", 

2063 "mai", 

2064 "jun", 

2065 "jul", 

2066 "aug", 

2067 "sep", 

2068 "okt", 

2069 "nov", 

2070 "des", 

2071 ] 

2072 

2073 day_names = [ 

2074 "", 

2075 "mandag", 

2076 "tirsdag", 

2077 "onsdag", 

2078 "torsdag", 

2079 "fredag", 

2080 "lørdag", 

2081 "søndag", 

2082 ] 

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

2084 

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

2086 return f"{n}." 

2087 

2088 

2089class NewNorwegianLocale(Locale): 

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

2091 

2092 past = "for {0} sidan" 

2093 future = "om {0}" 

2094 

2095 timeframes = { 

2096 "now": "no nettopp", 

2097 "second": "eitt sekund", 

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

2099 "minute": "eitt minutt", 

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

2101 "hour": "ein time", 

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

2103 "day": "ein dag", 

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

2105 "week": "ei veke", 

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

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

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

2109 "year": "eitt år", 

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

2111 } 

2112 

2113 month_names = [ 

2114 "", 

2115 "januar", 

2116 "februar", 

2117 "mars", 

2118 "april", 

2119 "mai", 

2120 "juni", 

2121 "juli", 

2122 "august", 

2123 "september", 

2124 "oktober", 

2125 "november", 

2126 "desember", 

2127 ] 

2128 month_abbreviations = [ 

2129 "", 

2130 "jan", 

2131 "feb", 

2132 "mar", 

2133 "apr", 

2134 "mai", 

2135 "jun", 

2136 "jul", 

2137 "aug", 

2138 "sep", 

2139 "okt", 

2140 "nov", 

2141 "des", 

2142 ] 

2143 

2144 day_names = [ 

2145 "", 

2146 "måndag", 

2147 "tysdag", 

2148 "onsdag", 

2149 "torsdag", 

2150 "fredag", 

2151 "laurdag", 

2152 "sundag", 

2153 ] 

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

2155 

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

2157 return f"{n}." 

2158 

2159 

2160class PortugueseLocale(Locale): 

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

2162 

2163 past = "há {0}" 

2164 future = "em {0}" 

2165 and_word = "e" 

2166 

2167 timeframes = { 

2168 "now": "agora", 

2169 "second": "um segundo", 

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

2171 "minute": "um minuto", 

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

2173 "hour": "uma hora", 

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

2175 "day": "um dia", 

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

2177 "week": "uma semana", 

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

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

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

2181 "year": "um ano", 

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

2183 } 

2184 

2185 month_names = [ 

2186 "", 

2187 "Janeiro", 

2188 "Fevereiro", 

2189 "Março", 

2190 "Abril", 

2191 "Maio", 

2192 "Junho", 

2193 "Julho", 

2194 "Agosto", 

2195 "Setembro", 

2196 "Outubro", 

2197 "Novembro", 

2198 "Dezembro", 

2199 ] 

2200 month_abbreviations = [ 

2201 "", 

2202 "Jan", 

2203 "Fev", 

2204 "Mar", 

2205 "Abr", 

2206 "Mai", 

2207 "Jun", 

2208 "Jul", 

2209 "Ago", 

2210 "Set", 

2211 "Out", 

2212 "Nov", 

2213 "Dez", 

2214 ] 

2215 

2216 day_names = [ 

2217 "", 

2218 "Segunda-feira", 

2219 "Terça-feira", 

2220 "Quarta-feira", 

2221 "Quinta-feira", 

2222 "Sexta-feira", 

2223 "Sábado", 

2224 "Domingo", 

2225 ] 

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

2227 

2228 

2229class BrazilianPortugueseLocale(PortugueseLocale): 

2230 names = ["pt-br"] 

2231 

2232 past = "faz {0}" 

2233 

2234 

2235class TagalogLocale(Locale): 

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

2237 

2238 past = "nakaraang {0}" 

2239 future = "{0} mula ngayon" 

2240 

2241 timeframes = { 

2242 "now": "ngayon lang", 

2243 "second": "isang segundo", 

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

2245 "minute": "isang minuto", 

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

2247 "hour": "isang oras", 

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

2249 "day": "isang araw", 

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

2251 "week": "isang linggo", 

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

2253 "month": "isang buwan", 

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

2255 "year": "isang taon", 

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

2257 } 

2258 

2259 month_names = [ 

2260 "", 

2261 "Enero", 

2262 "Pebrero", 

2263 "Marso", 

2264 "Abril", 

2265 "Mayo", 

2266 "Hunyo", 

2267 "Hulyo", 

2268 "Agosto", 

2269 "Setyembre", 

2270 "Oktubre", 

2271 "Nobyembre", 

2272 "Disyembre", 

2273 ] 

2274 month_abbreviations = [ 

2275 "", 

2276 "Ene", 

2277 "Peb", 

2278 "Mar", 

2279 "Abr", 

2280 "May", 

2281 "Hun", 

2282 "Hul", 

2283 "Ago", 

2284 "Set", 

2285 "Okt", 

2286 "Nob", 

2287 "Dis", 

2288 ] 

2289 

2290 day_names = [ 

2291 "", 

2292 "Lunes", 

2293 "Martes", 

2294 "Miyerkules", 

2295 "Huwebes", 

2296 "Biyernes", 

2297 "Sabado", 

2298 "Linggo", 

2299 ] 

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

2301 

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

2303 

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

2305 return f"ika-{n}" 

2306 

2307 

2308class VietnameseLocale(Locale): 

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

2310 

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

2312 future = "{0} nữa" 

2313 

2314 timeframes = { 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2330 } 

2331 

2332 month_names = [ 

2333 "", 

2334 "Tháng Một", 

2335 "Tháng Hai", 

2336 "Tháng Ba", 

2337 "Tháng Tư", 

2338 "Tháng Năm", 

2339 "Tháng Sáu", 

2340 "Tháng Bảy", 

2341 "Tháng Tám", 

2342 "Tháng Chín", 

2343 "Tháng Mười", 

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

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

2346 ] 

2347 month_abbreviations = [ 

2348 "", 

2349 "Tháng 1", 

2350 "Tháng 2", 

2351 "Tháng 3", 

2352 "Tháng 4", 

2353 "Tháng 5", 

2354 "Tháng 6", 

2355 "Tháng 7", 

2356 "Tháng 8", 

2357 "Tháng 9", 

2358 "Tháng 10", 

2359 "Tháng 11", 

2360 "Tháng 12", 

2361 ] 

2362 

2363 day_names = [ 

2364 "", 

2365 "Thứ Hai", 

2366 "Thứ Ba", 

2367 "Thứ Tư", 

2368 "Thứ Năm", 

2369 "Thứ Sáu", 

2370 "Thứ Bảy", 

2371 "Chủ Nhật", 

2372 ] 

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

2374 

2375 

2376class TurkishLocale(Locale): 

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

2378 

2379 past = "{0} önce" 

2380 future = "{0} sonra" 

2381 and_word = "ve" 

2382 

2383 timeframes = { 

2384 "now": "şimdi", 

2385 "second": "bir saniye", 

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

2387 "minute": "bir dakika", 

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

2389 "hour": "bir saat", 

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

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

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

2393 "week": "bir hafta", 

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

2395 "month": "bir ay", 

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

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

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

2399 } 

2400 

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

2402 

2403 month_names = [ 

2404 "", 

2405 "Ocak", 

2406 "Şubat", 

2407 "Mart", 

2408 "Nisan", 

2409 "Mayıs", 

2410 "Haziran", 

2411 "Temmuz", 

2412 "Ağustos", 

2413 "Eylül", 

2414 "Ekim", 

2415 "Kasım", 

2416 "Aralık", 

2417 ] 

2418 month_abbreviations = [ 

2419 "", 

2420 "Oca", 

2421 "Şub", 

2422 "Mar", 

2423 "Nis", 

2424 "May", 

2425 "Haz", 

2426 "Tem", 

2427 "Ağu", 

2428 "Eyl", 

2429 "Eki", 

2430 "Kas", 

2431 "Ara", 

2432 ] 

2433 

2434 day_names = [ 

2435 "", 

2436 "Pazartesi", 

2437 "Salı", 

2438 "Çarşamba", 

2439 "Perşembe", 

2440 "Cuma", 

2441 "Cumartesi", 

2442 "Pazar", 

2443 ] 

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

2445 

2446 

2447class AzerbaijaniLocale(Locale): 

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

2449 

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

2451 future = "{0} sonra" 

2452 

2453 timeframes = { 

2454 "now": "indi", 

2455 "second": "bir saniyə", 

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

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

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

2459 "hour": "bir saat", 

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

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

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

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

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

2465 "month": "bir ay", 

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

2467 "year": "bir il", 

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

2469 } 

2470 

2471 month_names = [ 

2472 "", 

2473 "Yanvar", 

2474 "Fevral", 

2475 "Mart", 

2476 "Aprel", 

2477 "May", 

2478 "İyun", 

2479 "İyul", 

2480 "Avqust", 

2481 "Sentyabr", 

2482 "Oktyabr", 

2483 "Noyabr", 

2484 "Dekabr", 

2485 ] 

2486 month_abbreviations = [ 

2487 "", 

2488 "Yan", 

2489 "Fev", 

2490 "Mar", 

2491 "Apr", 

2492 "May", 

2493 "İyn", 

2494 "İyl", 

2495 "Avq", 

2496 "Sen", 

2497 "Okt", 

2498 "Noy", 

2499 "Dek", 

2500 ] 

2501 

2502 day_names = [ 

2503 "", 

2504 "Bazar ertəsi", 

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

2506 "Çərşənbə", 

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

2508 "Cümə", 

2509 "Şənbə", 

2510 "Bazar", 

2511 ] 

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

2513 

2514 

2515class ArabicLocale(Locale): 

2516 names = [ 

2517 "ar", 

2518 "ar-ae", 

2519 "ar-bh", 

2520 "ar-dj", 

2521 "ar-eg", 

2522 "ar-eh", 

2523 "ar-er", 

2524 "ar-km", 

2525 "ar-kw", 

2526 "ar-ly", 

2527 "ar-om", 

2528 "ar-qa", 

2529 "ar-sa", 

2530 "ar-sd", 

2531 "ar-so", 

2532 "ar-ss", 

2533 "ar-td", 

2534 "ar-ye", 

2535 ] 

2536 

2537 past = "منذ {0}" 

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

2539 

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

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

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

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

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

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

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

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

2548 "day": "يوم", 

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

2550 "month": "شهر", 

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

2552 "year": "سنة", 

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

2554 } 

2555 

2556 month_names = [ 

2557 "", 

2558 "يناير", 

2559 "فبراير", 

2560 "مارس", 

2561 "أبريل", 

2562 "مايو", 

2563 "يونيو", 

2564 "يوليو", 

2565 "أغسطس", 

2566 "سبتمبر", 

2567 "أكتوبر", 

2568 "نوفمبر", 

2569 "ديسمبر", 

2570 ] 

2571 month_abbreviations = [ 

2572 "", 

2573 "يناير", 

2574 "فبراير", 

2575 "مارس", 

2576 "أبريل", 

2577 "مايو", 

2578 "يونيو", 

2579 "يوليو", 

2580 "أغسطس", 

2581 "سبتمبر", 

2582 "أكتوبر", 

2583 "نوفمبر", 

2584 "ديسمبر", 

2585 ] 

2586 

2587 day_names = [ 

2588 "", 

2589 "الإثنين", 

2590 "الثلاثاء", 

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

2592 "الخميس", 

2593 "الجمعة", 

2594 "السبت", 

2595 "الأحد", 

2596 ] 

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

2598 

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

2600 form = self.timeframes[timeframe] 

2601 delta = abs(delta) 

2602 if isinstance(form, Mapping): 

2603 if delta == 2: 

2604 form = form["2"] 

2605 elif 2 < delta <= 10: 

2606 form = form["ten"] 

2607 else: 

2608 form = form["higher"] 

2609 

2610 return form.format(delta) 

2611 

2612 

2613class LevantArabicLocale(ArabicLocale): 

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

2615 month_names = [ 

2616 "", 

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

2618 "شباط", 

2619 "آذار", 

2620 "نيسان", 

2621 "أيار", 

2622 "حزيران", 

2623 "تموز", 

2624 "آب", 

2625 "أيلول", 

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

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

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

2629 ] 

2630 month_abbreviations = [ 

2631 "", 

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

2633 "شباط", 

2634 "آذار", 

2635 "نيسان", 

2636 "أيار", 

2637 "حزيران", 

2638 "تموز", 

2639 "آب", 

2640 "أيلول", 

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

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

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

2644 ] 

2645 

2646 

2647class AlgeriaTunisiaArabicLocale(ArabicLocale): 

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

2649 month_names = [ 

2650 "", 

2651 "جانفي", 

2652 "فيفري", 

2653 "مارس", 

2654 "أفريل", 

2655 "ماي", 

2656 "جوان", 

2657 "جويلية", 

2658 "أوت", 

2659 "سبتمبر", 

2660 "أكتوبر", 

2661 "نوفمبر", 

2662 "ديسمبر", 

2663 ] 

2664 month_abbreviations = [ 

2665 "", 

2666 "جانفي", 

2667 "فيفري", 

2668 "مارس", 

2669 "أفريل", 

2670 "ماي", 

2671 "جوان", 

2672 "جويلية", 

2673 "أوت", 

2674 "سبتمبر", 

2675 "أكتوبر", 

2676 "نوفمبر", 

2677 "ديسمبر", 

2678 ] 

2679 

2680 

2681class MauritaniaArabicLocale(ArabicLocale): 

2682 names = ["ar-mr"] 

2683 month_names = [ 

2684 "", 

2685 "يناير", 

2686 "فبراير", 

2687 "مارس", 

2688 "إبريل", 

2689 "مايو", 

2690 "يونيو", 

2691 "يوليو", 

2692 "أغشت", 

2693 "شتمبر", 

2694 "أكتوبر", 

2695 "نوفمبر", 

2696 "دجمبر", 

2697 ] 

2698 month_abbreviations = [ 

2699 "", 

2700 "يناير", 

2701 "فبراير", 

2702 "مارس", 

2703 "إبريل", 

2704 "مايو", 

2705 "يونيو", 

2706 "يوليو", 

2707 "أغشت", 

2708 "شتمبر", 

2709 "أكتوبر", 

2710 "نوفمبر", 

2711 "دجمبر", 

2712 ] 

2713 

2714 

2715class MoroccoArabicLocale(ArabicLocale): 

2716 names = ["ar-ma"] 

2717 month_names = [ 

2718 "", 

2719 "يناير", 

2720 "فبراير", 

2721 "مارس", 

2722 "أبريل", 

2723 "ماي", 

2724 "يونيو", 

2725 "يوليوز", 

2726 "غشت", 

2727 "شتنبر", 

2728 "أكتوبر", 

2729 "نونبر", 

2730 "دجنبر", 

2731 ] 

2732 month_abbreviations = [ 

2733 "", 

2734 "يناير", 

2735 "فبراير", 

2736 "مارس", 

2737 "أبريل", 

2738 "ماي", 

2739 "يونيو", 

2740 "يوليوز", 

2741 "غشت", 

2742 "شتنبر", 

2743 "أكتوبر", 

2744 "نونبر", 

2745 "دجنبر", 

2746 ] 

2747 

2748 

2749class IcelandicLocale(Locale): 

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

2751 form = self.timeframes[timeframe] 

2752 

2753 if isinstance(form, Mapping): 

2754 if delta < 0: 

2755 form = form["past"] 

2756 elif delta > 0: 

2757 form = form["future"] 

2758 else: 

2759 raise ValueError( 

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

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

2762 ) 

2763 # FIXME: handle when delta is 0 

2764 

2765 return form.format(abs(delta)) 

2766 

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

2768 

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

2770 future = "eftir {0}" 

2771 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2786 } 

2787 

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

2789 

2790 month_names = [ 

2791 "", 

2792 "janúar", 

2793 "febrúar", 

2794 "mars", 

2795 "apríl", 

2796 "maí", 

2797 "júní", 

2798 "júlí", 

2799 "ágúst", 

2800 "september", 

2801 "október", 

2802 "nóvember", 

2803 "desember", 

2804 ] 

2805 month_abbreviations = [ 

2806 "", 

2807 "jan", 

2808 "feb", 

2809 "mar", 

2810 "apr", 

2811 "maí", 

2812 "jún", 

2813 "júl", 

2814 "ágú", 

2815 "sep", 

2816 "okt", 

2817 "nóv", 

2818 "des", 

2819 ] 

2820 

2821 day_names = [ 

2822 "", 

2823 "mánudagur", 

2824 "þriðjudagur", 

2825 "miðvikudagur", 

2826 "fimmtudagur", 

2827 "föstudagur", 

2828 "laugardagur", 

2829 "sunnudagur", 

2830 ] 

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

2832 

2833 

2834class DanishLocale(Locale): 

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

2836 

2837 past = "for {0} siden" 

2838 future = "om {0}" 

2839 and_word = "og" 

2840 

2841 timeframes = { 

2842 "now": "lige nu", 

2843 "second": "et sekund", 

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

2845 "minute": "et minut", 

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

2847 "hour": "en time", 

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

2849 "day": "en dag", 

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

2851 "week": "en uge", 

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

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

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

2855 "year": "et år", 

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

2857 } 

2858 

2859 month_names = [ 

2860 "", 

2861 "januar", 

2862 "februar", 

2863 "marts", 

2864 "april", 

2865 "maj", 

2866 "juni", 

2867 "juli", 

2868 "august", 

2869 "september", 

2870 "oktober", 

2871 "november", 

2872 "december", 

2873 ] 

2874 month_abbreviations = [ 

2875 "", 

2876 "jan", 

2877 "feb", 

2878 "mar", 

2879 "apr", 

2880 "maj", 

2881 "jun", 

2882 "jul", 

2883 "aug", 

2884 "sep", 

2885 "okt", 

2886 "nov", 

2887 "dec", 

2888 ] 

2889 

2890 day_names = [ 

2891 "", 

2892 "mandag", 

2893 "tirsdag", 

2894 "onsdag", 

2895 "torsdag", 

2896 "fredag", 

2897 "lørdag", 

2898 "søndag", 

2899 ] 

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

2901 

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

2903 return f"{n}." 

2904 

2905 

2906class MalayalamLocale(Locale): 

2907 names = ["ml"] 

2908 

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

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

2911 

2912 timeframes = { 

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

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

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

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

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

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

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

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

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

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

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

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

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

2926 } 

2927 

2928 meridians = { 

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

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

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

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

2933 } 

2934 

2935 month_names = [ 

2936 "", 

2937 "ജനുവരി", 

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

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

2940 "ഏപ്രിൽ ", 

2941 "മെയ്‌ ", 

2942 "ജൂണ്‍", 

2943 "ജൂലൈ", 

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

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

2946 "ഒക്ടോബർ", 

2947 "നവംബർ", 

2948 "ഡിസംബർ", 

2949 ] 

2950 month_abbreviations = [ 

2951 "", 

2952 "ജനു", 

2953 "ഫെബ് ", 

2954 "മാർ", 

2955 "ഏപ്രിൽ", 

2956 "മേയ്", 

2957 "ജൂണ്‍", 

2958 "ജൂലൈ", 

2959 "ഓഗസ്റ", 

2960 "സെപ്റ്റ", 

2961 "ഒക്ടോ", 

2962 "നവം", 

2963 "ഡിസം", 

2964 ] 

2965 

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

2967 day_abbreviations = [ 

2968 "", 

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

2970 "ചൊവ്വ", 

2971 "ബുധന്‍", 

2972 "വ്യാഴം", 

2973 "വെള്ളി", 

2974 "ശനി", 

2975 "ഞായര്‍", 

2976 ] 

2977 

2978 

2979class HindiLocale(Locale): 

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

2981 

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

2983 future = "{0} बाद" 

2984 

2985 timeframes = { 

2986 "now": "अभी", 

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

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

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

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

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

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

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

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

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

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

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

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

2999 } 

3000 

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

3002 

3003 month_names = [ 

3004 "", 

3005 "जनवरी", 

3006 "फरवरी", 

3007 "मार्च", 

3008 "अप्रैल ", 

3009 "मई", 

3010 "जून", 

3011 "जुलाई", 

3012 "अगस्त", 

3013 "सितंबर", 

3014 "अक्टूबर", 

3015 "नवंबर", 

3016 "दिसंबर", 

3017 ] 

3018 month_abbreviations = [ 

3019 "", 

3020 "जन", 

3021 "फ़र", 

3022 "मार्च", 

3023 "अप्रै", 

3024 "मई", 

3025 "जून", 

3026 "जुलाई", 

3027 "आग", 

3028 "सित", 

3029 "अकत", 

3030 "नवे", 

3031 "दिस", 

3032 ] 

3033 

3034 day_names = [ 

3035 "", 

3036 "सोमवार", 

3037 "मंगलवार", 

3038 "बुधवार", 

3039 "गुरुवार", 

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

3041 "शनिवार", 

3042 "रविवार", 

3043 ] 

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

3045 

3046 

3047class CzechLocale(Locale): 

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

3049 

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

3051 "now": "Teď", 

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

3053 "seconds": { 

3054 "zero": "vteřina", 

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

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

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

3058 }, 

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

3060 "minutes": { 

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

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

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

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

3065 }, 

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

3067 "hours": { 

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

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

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

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

3072 }, 

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

3074 "days": { 

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

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

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

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

3079 }, 

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

3081 "weeks": { 

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

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

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

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

3086 }, 

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

3088 "months": { 

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

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

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

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

3093 }, 

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

3095 "years": { 

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

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

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

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

3100 }, 

3101 } 

3102 

3103 past = "Před {0}" 

3104 future = "Za {0}" 

3105 

3106 month_names = [ 

3107 "", 

3108 "leden", 

3109 "únor", 

3110 "březen", 

3111 "duben", 

3112 "květen", 

3113 "červen", 

3114 "červenec", 

3115 "srpen", 

3116 "září", 

3117 "říjen", 

3118 "listopad", 

3119 "prosinec", 

3120 ] 

3121 month_abbreviations = [ 

3122 "", 

3123 "led", 

3124 "úno", 

3125 "bře", 

3126 "dub", 

3127 "kvě", 

3128 "čvn", 

3129 "čvc", 

3130 "srp", 

3131 "zář", 

3132 "říj", 

3133 "lis", 

3134 "pro", 

3135 ] 

3136 

3137 day_names = [ 

3138 "", 

3139 "pondělí", 

3140 "úterý", 

3141 "středa", 

3142 "čtvrtek", 

3143 "pátek", 

3144 "sobota", 

3145 "neděle", 

3146 ] 

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

3148 

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

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

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

3152 abs_delta = abs(delta) 

3153 form = self.timeframes[timeframe] 

3154 

3155 if isinstance(form, str): 

3156 return form.format(abs_delta) 

3157 

3158 if delta == 0: 

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

3160 elif delta < 0: 

3161 key = "past" 

3162 else: 

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

3164 if "future-singular" not in form: 

3165 key = "future" 

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

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

3168 ): 

3169 key = "future-singular" 

3170 else: 

3171 key = "future-paucal" 

3172 

3173 form: str = form[key] 

3174 return form.format(abs_delta) 

3175 

3176 

3177class SlovakLocale(Locale): 

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

3179 

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

3181 "now": "Teraz", 

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

3183 "seconds": { 

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

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

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

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

3188 }, 

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

3190 "minutes": { 

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

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

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

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

3195 }, 

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

3197 "hours": { 

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

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

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

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

3202 }, 

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

3204 "days": { 

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

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

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

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

3209 }, 

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

3211 "weeks": { 

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

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

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

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

3216 }, 

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

3218 "months": { 

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

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

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

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

3223 }, 

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

3225 "years": { 

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

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

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

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

3230 }, 

3231 } 

3232 

3233 past = "Pred {0}" 

3234 future = "O {0}" 

3235 and_word = "a" 

3236 

3237 month_names = [ 

3238 "", 

3239 "január", 

3240 "február", 

3241 "marec", 

3242 "apríl", 

3243 "máj", 

3244 "jún", 

3245 "júl", 

3246 "august", 

3247 "september", 

3248 "október", 

3249 "november", 

3250 "december", 

3251 ] 

3252 month_abbreviations = [ 

3253 "", 

3254 "jan", 

3255 "feb", 

3256 "mar", 

3257 "apr", 

3258 "máj", 

3259 "jún", 

3260 "júl", 

3261 "aug", 

3262 "sep", 

3263 "okt", 

3264 "nov", 

3265 "dec", 

3266 ] 

3267 

3268 day_names = [ 

3269 "", 

3270 "pondelok", 

3271 "utorok", 

3272 "streda", 

3273 "štvrtok", 

3274 "piatok", 

3275 "sobota", 

3276 "nedeľa", 

3277 ] 

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

3279 

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

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

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

3283 abs_delta = abs(delta) 

3284 form = self.timeframes[timeframe] 

3285 

3286 if isinstance(form, str): 

3287 return form.format(abs_delta) 

3288 

3289 if delta == 0: 

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

3291 elif delta < 0: 

3292 key = "past" 

3293 else: 

3294 if "future-singular" not in form: 

3295 key = "future" 

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

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

3298 ): 

3299 key = "future-singular" 

3300 else: 

3301 key = "future-paucal" 

3302 

3303 form: str = form[key] 

3304 return form.format(abs_delta) 

3305 

3306 

3307class FarsiLocale(Locale): 

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

3309 

3310 past = "{0} قبل" 

3311 future = "در {0}" 

3312 

3313 timeframes = { 

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

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

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

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

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

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

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

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

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

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

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

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

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

3327 } 

3328 

3329 meridians = { 

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

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

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

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

3334 } 

3335 

3336 month_names = [ 

3337 "", 

3338 "January", 

3339 "February", 

3340 "March", 

3341 "April", 

3342 "May", 

3343 "June", 

3344 "July", 

3345 "August", 

3346 "September", 

3347 "October", 

3348 "November", 

3349 "December", 

3350 ] 

3351 month_abbreviations = [ 

3352 "", 

3353 "Jan", 

3354 "Feb", 

3355 "Mar", 

3356 "Apr", 

3357 "May", 

3358 "Jun", 

3359 "Jul", 

3360 "Aug", 

3361 "Sep", 

3362 "Oct", 

3363 "Nov", 

3364 "Dec", 

3365 ] 

3366 

3367 day_names = [ 

3368 "", 

3369 "دو شنبه", 

3370 "سه شنبه", 

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

3372 "پنجشنبه", 

3373 "جمعه", 

3374 "شنبه", 

3375 "یکشنبه", 

3376 ] 

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

3378 

3379 

3380class HebrewLocale(Locale): 

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

3382 

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

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

3385 and_word = "ו" 

3386 

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

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

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

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

3391 "minute": "דקה", 

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

3393 "hour": "שעה", 

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

3395 "day": "יום", 

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

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

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

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

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

3401 "year": "שנה", 

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

3403 } 

3404 

3405 meridians = { 

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

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

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

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

3410 } 

3411 

3412 month_names = [ 

3413 "", 

3414 "ינואר", 

3415 "פברואר", 

3416 "מרץ", 

3417 "אפריל", 

3418 "מאי", 

3419 "יוני", 

3420 "יולי", 

3421 "אוגוסט", 

3422 "ספטמבר", 

3423 "אוקטובר", 

3424 "נובמבר", 

3425 "דצמבר", 

3426 ] 

3427 month_abbreviations = [ 

3428 "", 

3429 "ינו׳", 

3430 "פבר׳", 

3431 "מרץ", 

3432 "אפר׳", 

3433 "מאי", 

3434 "יוני", 

3435 "יולי", 

3436 "אוג׳", 

3437 "ספט׳", 

3438 "אוק׳", 

3439 "נוב׳", 

3440 "דצמ׳", 

3441 ] 

3442 

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

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

3445 

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

3447 form = self.timeframes[timeframe] 

3448 delta = abs(delta) 

3449 if isinstance(form, Mapping): 

3450 if delta == 2: 

3451 form = form["2"] 

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

3453 form = form["ten"] 

3454 else: 

3455 form = form["higher"] 

3456 

3457 return form.format(delta) 

3458 

3459 def describe_multi( 

3460 self, 

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

3462 only_distance: bool = False, 

3463 ) -> str: 

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

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

3466 

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

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

3469 """ 

3470 

3471 humanized = "" 

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

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

3474 if index == 0: 

3475 humanized = last_humanized 

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

3477 humanized += " " + self.and_word 

3478 if last_humanized[0].isdecimal(): 

3479 humanized += "־" 

3480 humanized += last_humanized 

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

3482 humanized += ", " + last_humanized 

3483 

3484 if not only_distance: 

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

3486 

3487 return humanized 

3488 

3489 

3490class MarathiLocale(Locale): 

3491 names = ["mr"] 

3492 

3493 past = "{0} आधी" 

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

3495 

3496 timeframes = { 

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

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

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

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

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

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

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

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

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

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

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

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

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

3510 } 

3511 

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

3513 

3514 month_names = [ 

3515 "", 

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

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

3518 "मार्च", 

3519 "एप्रिल", 

3520 "मे", 

3521 "जून", 

3522 "जुलै", 

3523 "अॉगस्ट", 

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

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

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

3527 "डिसेंबर", 

3528 ] 

3529 month_abbreviations = [ 

3530 "", 

3531 "जान", 

3532 "फेब्रु", 

3533 "मार्च", 

3534 "एप्रि", 

3535 "मे", 

3536 "जून", 

3537 "जुलै", 

3538 "अॉग", 

3539 "सप्टें", 

3540 "अॉक्टो", 

3541 "नोव्हें", 

3542 "डिसें", 

3543 ] 

3544 

3545 day_names = [ 

3546 "", 

3547 "सोमवार", 

3548 "मंगळवार", 

3549 "बुधवार", 

3550 "गुरुवार", 

3551 "शुक्रवार", 

3552 "शनिवार", 

3553 "रविवार", 

3554 ] 

3555 day_abbreviations = ["", "सोम", "मंगळ", "बुध", "गुरु", "शुक्र", "शनि", "रवि"] 

3556 

3557 

3558class CatalanLocale(Locale): 

3559 names = ["ca", "ca-es", "ca-ad", "ca-fr", "ca-it"] 

3560 past = "Fa {0}" 

3561 future = "En {0}" 

3562 and_word = "i" 

3563 

3564 timeframes = { 

3565 "now": "Ara mateix", 

3566 "second": "un segon", 

3567 "seconds": "{0} segons", 

3568 "minute": "un minut", 

3569 "minutes": "{0} minuts", 

3570 "hour": "una hora", 

3571 "hours": "{0} hores", 

3572 "day": "un dia", 

3573 "days": "{0} dies", 

3574 "month": "un mes", 

3575 "months": "{0} mesos", 

3576 "year": "un any", 

3577 "years": "{0} anys", 

3578 } 

3579 

3580 month_names = [ 

3581 "", 

3582 "gener", 

3583 "febrer", 

3584 "març", 

3585 "abril", 

3586 "maig", 

3587 "juny", 

3588 "juliol", 

3589 "agost", 

3590 "setembre", 

3591 "octubre", 

3592 "novembre", 

3593 "desembre", 

3594 ] 

3595 month_abbreviations = [ 

3596 "", 

3597 "gen.", 

3598 "febr.", 

3599 "març", 

3600 "abr.", 

3601 "maig", 

3602 "juny", 

3603 "jul.", 

3604 "ag.", 

3605 "set.", 

3606 "oct.", 

3607 "nov.", 

3608 "des.", 

3609 ] 

3610 day_names = [ 

3611 "", 

3612 "dilluns", 

3613 "dimarts", 

3614 "dimecres", 

3615 "dijous", 

3616 "divendres", 

3617 "dissabte", 

3618 "diumenge", 

3619 ] 

3620 day_abbreviations = [ 

3621 "", 

3622 "dl.", 

3623 "dt.", 

3624 "dc.", 

3625 "dj.", 

3626 "dv.", 

3627 "ds.", 

3628 "dg.", 

3629 ] 

3630 

3631 

3632class BasqueLocale(Locale): 

3633 names = ["eu", "eu-eu"] 

3634 past = "duela {0}" 

3635 future = "{0}" # I don't know what's the right phrase in Basque for the future. 

3636 

3637 timeframes = { 

3638 "now": "Orain", 

3639 "second": "segundo bat", 

3640 "seconds": "{0} segundu", 

3641 "minute": "minutu bat", 

3642 "minutes": "{0} minutu", 

3643 "hour": "ordu bat", 

3644 "hours": "{0} ordu", 

3645 "day": "egun bat", 

3646 "days": "{0} egun", 

3647 "month": "hilabete bat", 

3648 "months": "{0} hilabet", 

3649 "year": "urte bat", 

3650 "years": "{0} urte", 

3651 } 

3652 

3653 month_names = [ 

3654 "", 

3655 "urtarrilak", 

3656 "otsailak", 

3657 "martxoak", 

3658 "apirilak", 

3659 "maiatzak", 

3660 "ekainak", 

3661 "uztailak", 

3662 "abuztuak", 

3663 "irailak", 

3664 "urriak", 

3665 "azaroak", 

3666 "abenduak", 

3667 ] 

3668 month_abbreviations = [ 

3669 "", 

3670 "urt", 

3671 "ots", 

3672 "mar", 

3673 "api", 

3674 "mai", 

3675 "eka", 

3676 "uzt", 

3677 "abu", 

3678 "ira", 

3679 "urr", 

3680 "aza", 

3681 "abe", 

3682 ] 

3683 day_names = [ 

3684 "", 

3685 "astelehena", 

3686 "asteartea", 

3687 "asteazkena", 

3688 "osteguna", 

3689 "ostirala", 

3690 "larunbata", 

3691 "igandea", 

3692 ] 

3693 day_abbreviations = ["", "al", "ar", "az", "og", "ol", "lr", "ig"] 

3694 

3695 

3696class HungarianLocale(Locale): 

3697 names = ["hu", "hu-hu"] 

3698 

3699 past = "{0} ezelőtt" 

3700 future = "{0} múlva" 

3701 

3702 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { 

3703 "now": "éppen most", 

3704 "second": {"past": "egy második", "future": "egy második"}, 

3705 "seconds": {"past": "{0} másodpercekkel", "future": "{0} pár másodperc"}, 

3706 "minute": {"past": "egy perccel", "future": "egy perc"}, 

3707 "minutes": {"past": "{0} perccel", "future": "{0} perc"}, 

3708 "hour": {"past": "egy órával", "future": "egy óra"}, 

3709 "hours": {"past": "{0} órával", "future": "{0} óra"}, 

3710 "day": {"past": "egy nappal", "future": "egy nap"}, 

3711 "days": {"past": "{0} nappal", "future": "{0} nap"}, 

3712 "week": {"past": "egy héttel", "future": "egy hét"}, 

3713 "weeks": {"past": "{0} héttel", "future": "{0} hét"}, 

3714 "month": {"past": "egy hónappal", "future": "egy hónap"}, 

3715 "months": {"past": "{0} hónappal", "future": "{0} hónap"}, 

3716 "year": {"past": "egy évvel", "future": "egy év"}, 

3717 "years": {"past": "{0} évvel", "future": "{0} év"}, 

3718 } 

3719 

3720 month_names = [ 

3721 "", 

3722 "január", 

3723 "február", 

3724 "március", 

3725 "április", 

3726 "május", 

3727 "június", 

3728 "július", 

3729 "augusztus", 

3730 "szeptember", 

3731 "október", 

3732 "november", 

3733 "december", 

3734 ] 

3735 month_abbreviations = [ 

3736 "", 

3737 "jan", 

3738 "febr", 

3739 "márc", 

3740 "ápr", 

3741 "máj", 

3742 "jún", 

3743 "júl", 

3744 "aug", 

3745 "szept", 

3746 "okt", 

3747 "nov", 

3748 "dec", 

3749 ] 

3750 

3751 day_names = [ 

3752 "", 

3753 "hétfő", 

3754 "kedd", 

3755 "szerda", 

3756 "csütörtök", 

3757 "péntek", 

3758 "szombat", 

3759 "vasárnap", 

3760 ] 

3761 day_abbreviations = ["", "hét", "kedd", "szer", "csüt", "pént", "szom", "vas"] 

3762 

3763 meridians = {"am": "de", "pm": "du", "AM": "DE", "PM": "DU"} 

3764 

3765 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: 

3766 form = self.timeframes[timeframe] 

3767 

3768 if isinstance(form, Mapping): 

3769 if delta > 0: 

3770 form = form["future"] 

3771 else: 

3772 form = form["past"] 

3773 

3774 return form.format(abs(delta)) 

3775 

3776 

3777class EsperantoLocale(Locale): 

3778 names = ["eo", "eo-xx"] 

3779 past = "antaŭ {0}" 

3780 future = "post {0}" 

3781 

3782 timeframes = { 

3783 "now": "nun", 

3784 "second": "sekundo", 

3785 "seconds": "{0} kelkaj sekundoj", 

3786 "minute": "unu minuto", 

3787 "minutes": "{0} minutoj", 

3788 "hour": "un horo", 

3789 "hours": "{0} horoj", 

3790 "day": "unu tago", 

3791 "days": "{0} tagoj", 

3792 "month": "unu monato", 

3793 "months": "{0} monatoj", 

3794 "year": "unu jaro", 

3795 "years": "{0} jaroj", 

3796 } 

3797 

3798 month_names = [ 

3799 "", 

3800 "januaro", 

3801 "februaro", 

3802 "marto", 

3803 "aprilo", 

3804 "majo", 

3805 "junio", 

3806 "julio", 

3807 "aŭgusto", 

3808 "septembro", 

3809 "oktobro", 

3810 "novembro", 

3811 "decembro", 

3812 ] 

3813 month_abbreviations = [ 

3814 "", 

3815 "jan", 

3816 "feb", 

3817 "mar", 

3818 "apr", 

3819 "maj", 

3820 "jun", 

3821 "jul", 

3822 "aŭg", 

3823 "sep", 

3824 "okt", 

3825 "nov", 

3826 "dec", 

3827 ] 

3828 

3829 day_names = [ 

3830 "", 

3831 "lundo", 

3832 "mardo", 

3833 "merkredo", 

3834 "ĵaŭdo", 

3835 "vendredo", 

3836 "sabato", 

3837 "dimanĉo", 

3838 ] 

3839 day_abbreviations = ["", "lun", "mar", "mer", "ĵaŭ", "ven", "sab", "dim"] 

3840 

3841 meridians = {"am": "atm", "pm": "ptm", "AM": "ATM", "PM": "PTM"} 

3842 

3843 ordinal_day_re = r"((?P<value>[1-3]?[0-9](?=a))a)" 

3844 

3845 def _ordinal_number(self, n: int) -> str: 

3846 return f"{n}a" 

3847 

3848 

3849class ThaiLocale(Locale): 

3850 names = ["th", "th-th"] 

3851 

3852 past = "{0} ที่ผ่านมา" 

3853 future = "ในอีก {0}" 

3854 

3855 timeframes = { 

3856 "now": "ขณะนี้", 

3857 "second": "วินาที", 

3858 "seconds": "{0} ไม่กี่วินาที", 

3859 "minute": "1 นาที", 

3860 "minutes": "{0} นาที", 

3861 "hour": "1 ชั่วโมง", 

3862 "hours": "{0} ชั่วโมง", 

3863 "day": "1 วัน", 

3864 "days": "{0} วัน", 

3865 "month": "1 เดือน", 

3866 "months": "{0} เดือน", 

3867 "year": "1 ปี", 

3868 "years": "{0} ปี", 

3869 } 

3870 

3871 month_names = [ 

3872 "", 

3873 "มกราคม", 

3874 "กุมภาพันธ์", 

3875 "มีนาคม", 

3876 "เมษายน", 

3877 "พฤษภาคม", 

3878 "มิถุนายน", 

3879 "กรกฎาคม", 

3880 "สิงหาคม", 

3881 "กันยายน", 

3882 "ตุลาคม", 

3883 "พฤศจิกายน", 

3884 "ธันวาคม", 

3885 ] 

3886 month_abbreviations = [ 

3887 "", 

3888 "ม.ค.", 

3889 "ก.พ.", 

3890 "มี.ค.", 

3891 "เม.ย.", 

3892 "พ.ค.", 

3893 "มิ.ย.", 

3894 "ก.ค.", 

3895 "ส.ค.", 

3896 "ก.ย.", 

3897 "ต.ค.", 

3898 "พ.ย.", 

3899 "ธ.ค.", 

3900 ] 

3901 

3902 day_names = ["", "จันทร์", "อังคาร", "พุธ", "พฤหัสบดี", "ศุกร์", "เสาร์", "อาทิตย์"] 

3903 day_abbreviations = ["", "จ", "อ", "พ", "พฤ", "ศ", "ส", "อา"] 

3904 

3905 meridians = {"am": "am", "pm": "pm", "AM": "AM", "PM": "PM"} 

3906 

3907 BE_OFFSET = 543 

3908 

3909 def year_full(self, year: int) -> str: 

3910 """Thai always use Buddhist Era (BE) which is CE + 543""" 

3911 year += self.BE_OFFSET 

3912 return f"{year:04d}" 

3913 

3914 def year_abbreviation(self, year: int) -> str: 

3915 """Thai always use Buddhist Era (BE) which is CE + 543""" 

3916 year += self.BE_OFFSET 

3917 return f"{year:04d}"[2:] 

3918 

3919 def _format_relative( 

3920 self, 

3921 humanized: str, 

3922 timeframe: TimeFrameLiteral, 

3923 delta: Union[float, int], 

3924 ) -> str: 

3925 """Thai normally doesn't have any space between words""" 

3926 if timeframe == "now": 

3927 return humanized 

3928 

3929 direction = self.past if delta < 0 else self.future 

3930 relative_string = direction.format(humanized) 

3931 

3932 if timeframe == "seconds": 

3933 relative_string = relative_string.replace(" ", "") 

3934 

3935 return relative_string 

3936 

3937 

3938class LaotianLocale(Locale): 

3939 names = ["lo", "lo-la"] 

3940 

3941 past = "{0} ກ່ອນຫນ້ານີ້" 

3942 future = "ໃນ {0}" 

3943 

3944 timeframes = { 

3945 "now": "ດຽວນີ້", 

3946 "second": "ວິນາທີ", 

3947 "seconds": "{0} ວິນາທີ", 

3948 "minute": "ນາທີ", 

3949 "minutes": "{0} ນາທີ", 

3950 "hour": "ຊົ່ວໂມງ", 

3951 "hours": "{0} ຊົ່ວໂມງ", 

3952 "day": "ມື້", 

3953 "days": "{0} ມື້", 

3954 "week": "ອາທິດ", 

3955 "weeks": "{0} ອາທິດ", 

3956 "month": "ເດືອນ", 

3957 "months": "{0} ເດືອນ", 

3958 "year": "ປີ", 

3959 "years": "{0} ປີ", 

3960 } 

3961 

3962 month_names = [ 

3963 "", 

3964 "ມັງກອນ", # mangkon 

3965 "ກຸມພາ", # kumpha 

3966 "ມີນາ", # mina 

3967 "ເມສາ", # mesa 

3968 "ພຶດສະພາ", # phudsapha 

3969 "ມິຖຸນາ", # mithuna 

3970 "ກໍລະກົດ", # kolakod 

3971 "ສິງຫາ", # singha 

3972 "ກັນຍາ", # knaia 

3973 "ຕຸລາ", # tula 

3974 "ພະຈິກ", # phachik 

3975 "ທັນວາ", # thanuaa 

3976 ] 

3977 month_abbreviations = [ 

3978 "", 

3979 "ມັງກອນ", 

3980 "ກຸມພາ", 

3981 "ມີນາ", 

3982 "ເມສາ", 

3983 "ພຶດສະພາ", 

3984 "ມິຖຸນາ", 

3985 "ກໍລະກົດ", 

3986 "ສິງຫາ", 

3987 "ກັນຍາ", 

3988 "ຕຸລາ", 

3989 "ພະຈິກ", 

3990 "ທັນວາ", 

3991 ] 

3992 

3993 day_names = [ 

3994 "", 

3995 "ວັນຈັນ", # vanchan 

3996 "ວັນອັງຄານ", # vnoangkhan 

3997 "ວັນພຸດ", # vanphud 

3998 "ວັນພະຫັດ", # vanphahad 

3999 "ວັນ​ສຸກ", # vansuk 

4000 "ວັນເສົາ", # vansao 

4001 "ວັນອາທິດ", # vnoathid 

4002 ] 

4003 day_abbreviations = [ 

4004 "", 

4005 "ວັນຈັນ", 

4006 "ວັນອັງຄານ", 

4007 "ວັນພຸດ", 

4008 "ວັນພະຫັດ", 

4009 "ວັນ​ສຸກ", 

4010 "ວັນເສົາ", 

4011 "ວັນອາທິດ", 

4012 ] 

4013 

4014 BE_OFFSET = 543 

4015 

4016 def year_full(self, year: int) -> str: 

4017 """Lao always use Buddhist Era (BE) which is CE + 543""" 

4018 year += self.BE_OFFSET 

4019 return f"{year:04d}" 

4020 

4021 def year_abbreviation(self, year: int) -> str: 

4022 """Lao always use Buddhist Era (BE) which is CE + 543""" 

4023 year += self.BE_OFFSET 

4024 return f"{year:04d}"[2:] 

4025 

4026 def _format_relative( 

4027 self, 

4028 humanized: str, 

4029 timeframe: TimeFrameLiteral, 

4030 delta: Union[float, int], 

4031 ) -> str: 

4032 """Lao normally doesn't have any space between words""" 

4033 if timeframe == "now": 

4034 return humanized 

4035 

4036 direction = self.past if delta < 0 else self.future 

4037 relative_string = direction.format(humanized) 

4038 

4039 if timeframe == "seconds": 

4040 relative_string = relative_string.replace(" ", "") 

4041 

4042 return relative_string 

4043 

4044 

4045class BengaliLocale(Locale): 

4046 names = ["bn", "bn-bd", "bn-in"] 

4047 

4048 past = "{0} আগে" 

4049 future = "{0} পরে" 

4050 

4051 timeframes = { 

4052 "now": "এখন", 

4053 "second": "একটি দ্বিতীয়", 

4054 "seconds": "{0} সেকেন্ড", 

4055 "minute": "এক মিনিট", 

4056 "minutes": "{0} মিনিট", 

4057 "hour": "এক ঘণ্টা", 

4058 "hours": "{0} ঘণ্টা", 

4059 "day": "এক দিন", 

4060 "days": "{0} দিন", 

4061 "month": "এক মাস", 

4062 "months": "{0} মাস ", 

4063 "year": "এক বছর", 

4064 "years": "{0} বছর", 

4065 } 

4066 

4067 meridians = {"am": "সকাল", "pm": "বিকাল", "AM": "সকাল", "PM": "বিকাল"} 

4068 

4069 month_names = [ 

4070 "", 

4071 "জানুয়ারি", 

4072 "ফেব্রুয়ারি", 

4073 "মার্চ", 

4074 "এপ্রিল", 

4075 "মে", 

4076 "জুন", 

4077 "জুলাই", 

4078 "আগস্ট", 

4079 "সেপ্টেম্বর", 

4080 "অক্টোবর", 

4081 "নভেম্বর", 

4082 "ডিসেম্বর", 

4083 ] 

4084 month_abbreviations = [ 

4085 "", 

4086 "জানু", 

4087 "ফেব", 

4088 "মার্চ", 

4089 "এপ্রি", 

4090 "মে", 

4091 "জুন", 

4092 "জুল", 

4093 "অগা", 

4094 "সেপ্ট", 

4095 "অক্টো", 

4096 "নভে", 

4097 "ডিসে", 

4098 ] 

4099 

4100 day_names = [ 

4101 "", 

4102 "সোমবার", 

4103 "মঙ্গলবার", 

4104 "বুধবার", 

4105 "বৃহস্পতিবার", 

4106 "শুক্রবার", 

4107 "শনিবার", 

4108 "রবিবার", 

4109 ] 

4110 day_abbreviations = ["", "সোম", "মঙ্গল", "বুধ", "বৃহঃ", "শুক্র", "শনি", "রবি"] 

4111 

4112 def _ordinal_number(self, n: int) -> str: 

4113 if n > 10 or n == 0: 

4114 return f"{n}তম" 

4115 if n in [1, 5, 7, 8, 9, 10]: 

4116 return f"{n}ম" 

4117 if n in [2, 3]: 

4118 return f"{n}য়" 

4119 if n == 4: 

4120 return f"{n}র্থ" 

4121 if n == 6: 

4122 return f"{n}ষ্ঠ" 

4123 return "" 

4124 

4125 

4126class RomanshLocale(Locale): 

4127 names = ["rm", "rm-ch"] 

4128 

4129 past = "avant {0}" 

4130 future = "en {0}" 

4131 

4132 timeframes = { 

4133 "now": "en quest mument", 

4134 "second": "in secunda", 

4135 "seconds": "{0} secundas", 

4136 "minute": "ina minuta", 

4137 "minutes": "{0} minutas", 

4138 "hour": "in'ura", 

4139 "hours": "{0} ura", 

4140 "day": "in di", 

4141 "days": "{0} dis", 

4142 "week": "in'emna", 

4143 "weeks": "{0} emnas", 

4144 "month": "in mais", 

4145 "months": "{0} mais", 

4146 "year": "in onn", 

4147 "years": "{0} onns", 

4148 } 

4149 

4150 month_names = [ 

4151 "", 

4152 "schaner", 

4153 "favrer", 

4154 "mars", 

4155 "avrigl", 

4156 "matg", 

4157 "zercladur", 

4158 "fanadur", 

4159 "avust", 

4160 "settember", 

4161 "october", 

4162 "november", 

4163 "december", 

4164 ] 

4165 

4166 month_abbreviations = [ 

4167 "", 

4168 "schan", 

4169 "fav", 

4170 "mars", 

4171 "avr", 

4172 "matg", 

4173 "zer", 

4174 "fan", 

4175 "avu", 

4176 "set", 

4177 "oct", 

4178 "nov", 

4179 "dec", 

4180 ] 

4181 

4182 day_names = [ 

4183 "", 

4184 "glindesdi", 

4185 "mardi", 

4186 "mesemna", 

4187 "gievgia", 

4188 "venderdi", 

4189 "sonda", 

4190 "dumengia", 

4191 ] 

4192 

4193 day_abbreviations = ["", "gli", "ma", "me", "gie", "ve", "so", "du"] 

4194 

4195 

4196class RomanianLocale(Locale): 

4197 names = ["ro", "ro-ro"] 

4198 

4199 past = "{0} în urmă" 

4200 future = "peste {0}" 

4201 and_word = "și" 

4202 

4203 timeframes = { 

4204 "now": "acum", 

4205 "second": "o secunda", 

4206 "seconds": "{0} câteva secunde", 

4207 "minute": "un minut", 

4208 "minutes": "{0} minute", 

4209 "hour": "o oră", 

4210 "hours": "{0} ore", 

4211 "day": "o zi", 

4212 "days": "{0} zile", 

4213 "month": "o lună", 

4214 "months": "{0} luni", 

4215 "year": "un an", 

4216 "years": "{0} ani", 

4217 } 

4218 

4219 month_names = [ 

4220 "", 

4221 "ianuarie", 

4222 "februarie", 

4223 "martie", 

4224 "aprilie", 

4225 "mai", 

4226 "iunie", 

4227 "iulie", 

4228 "august", 

4229 "septembrie", 

4230 "octombrie", 

4231 "noiembrie", 

4232 "decembrie", 

4233 ] 

4234 month_abbreviations = [ 

4235 "", 

4236 "ian", 

4237 "febr", 

4238 "mart", 

4239 "apr", 

4240 "mai", 

4241 "iun", 

4242 "iul", 

4243 "aug", 

4244 "sept", 

4245 "oct", 

4246 "nov", 

4247 "dec", 

4248 ] 

4249 

4250 day_names = [ 

4251 "", 

4252 "luni", 

4253 "marți", 

4254 "miercuri", 

4255 "joi", 

4256 "vineri", 

4257 "sâmbătă", 

4258 "duminică", 

4259 ] 

4260 day_abbreviations = ["", "Lun", "Mar", "Mie", "Joi", "Vin", "Sâm", "Dum"] 

4261 

4262 

4263class SlovenianLocale(Locale): 

4264 names = ["sl", "sl-si"] 

4265 

4266 past = "pred {0}" 

4267 future = "čez {0}" 

4268 and_word = "in" 

4269 

4270 timeframes = { 

4271 "now": "zdaj", 

4272 "second": "sekundo", 

4273 "seconds": "{0} sekund", 

4274 "minute": "minuta", 

4275 "minutes": "{0} minutami", 

4276 "hour": "uro", 

4277 "hours": "{0} ur", 

4278 "day": "dan", 

4279 "days": "{0} dni", 

4280 "month": "mesec", 

4281 "months": "{0} mesecev", 

4282 "year": "leto", 

4283 "years": "{0} let", 

4284 } 

4285 

4286 meridians = {"am": "", "pm": "", "AM": "", "PM": ""} 

4287 

4288 month_names = [ 

4289 "", 

4290 "Januar", 

4291 "Februar", 

4292 "Marec", 

4293 "April", 

4294 "Maj", 

4295 "Junij", 

4296 "Julij", 

4297 "Avgust", 

4298 "September", 

4299 "Oktober", 

4300 "November", 

4301 "December", 

4302 ] 

4303 

4304 month_abbreviations = [ 

4305 "", 

4306 "Jan", 

4307 "Feb", 

4308 "Mar", 

4309 "Apr", 

4310 "Maj", 

4311 "Jun", 

4312 "Jul", 

4313 "Avg", 

4314 "Sep", 

4315 "Okt", 

4316 "Nov", 

4317 "Dec", 

4318 ] 

4319 

4320 day_names = [ 

4321 "", 

4322 "Ponedeljek", 

4323 "Torek", 

4324 "Sreda", 

4325 "Četrtek", 

4326 "Petek", 

4327 "Sobota", 

4328 "Nedelja", 

4329 ] 

4330 

4331 day_abbreviations = ["", "Pon", "Tor", "Sre", "Čet", "Pet", "Sob", "Ned"] 

4332 

4333 

4334class IndonesianLocale(Locale): 

4335 names = ["id", "id-id"] 

4336 

4337 past = "{0} yang lalu" 

4338 future = "dalam {0}" 

4339 and_word = "dan" 

4340 

4341 timeframes = { 

4342 "now": "baru saja", 

4343 "second": "1 sebentar", 

4344 "seconds": "{0} detik", 

4345 "minute": "1 menit", 

4346 "minutes": "{0} menit", 

4347 "hour": "1 jam", 

4348 "hours": "{0} jam", 

4349 "day": "1 hari", 

4350 "days": "{0} hari", 

4351 "week": "1 minggu", 

4352 "weeks": "{0} minggu", 

4353 "month": "1 bulan", 

4354 "months": "{0} bulan", 

4355 "quarter": "1 kuartal", 

4356 "quarters": "{0} kuartal", 

4357 "year": "1 tahun", 

4358 "years": "{0} tahun", 

4359 } 

4360 

4361 meridians = {"am": "", "pm": "", "AM": "", "PM": ""} 

4362 

4363 month_names = [ 

4364 "", 

4365 "Januari", 

4366 "Februari", 

4367 "Maret", 

4368 "April", 

4369 "Mei", 

4370 "Juni", 

4371 "Juli", 

4372 "Agustus", 

4373 "September", 

4374 "Oktober", 

4375 "November", 

4376 "Desember", 

4377 ] 

4378 

4379 month_abbreviations = [ 

4380 "", 

4381 "Jan", 

4382 "Feb", 

4383 "Mar", 

4384 "Apr", 

4385 "Mei", 

4386 "Jun", 

4387 "Jul", 

4388 "Ags", 

4389 "Sept", 

4390 "Okt", 

4391 "Nov", 

4392 "Des", 

4393 ] 

4394 

4395 day_names = ["", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu", "Minggu"] 

4396 

4397 day_abbreviations = [ 

4398 "", 

4399 "Senin", 

4400 "Selasa", 

4401 "Rabu", 

4402 "Kamis", 

4403 "Jumat", 

4404 "Sabtu", 

4405 "Minggu", 

4406 ] 

4407 

4408 

4409class NepaliLocale(Locale): 

4410 names = ["ne", "ne-np"] 

4411 

4412 past = "{0} पहिले" 

4413 future = "{0} पछी" 

4414 

4415 timeframes = { 

4416 "now": "अहिले", 

4417 "second": "एक सेकेन्ड", 

4418 "seconds": "{0} सेकण्ड", 

4419 "minute": "मिनेट", 

4420 "minutes": "{0} मिनेट", 

4421 "hour": "एक घण्टा", 

4422 "hours": "{0} घण्टा", 

4423 "day": "एक दिन", 

4424 "days": "{0} दिन", 

4425 "month": "एक महिना", 

4426 "months": "{0} महिना", 

4427 "year": "एक बर्ष", 

4428 "years": "{0} बर्ष", 

4429 } 

4430 

4431 meridians = {"am": "पूर्वाह्न", "pm": "अपरान्ह", "AM": "पूर्वाह्न", "PM": "अपरान्ह"} 

4432 

4433 month_names = [ 

4434 "", 

4435 "जनवरी", 

4436 "फेब्रुअरी", 

4437 "मार्च", 

4438 "एप्रील", 

4439 "मे", 

4440 "जुन", 

4441 "जुलाई", 

4442 "अगष्ट", 

4443 "सेप्टेम्बर", 

4444 "अक्टोबर", 

4445 "नोवेम्बर", 

4446 "डिसेम्बर", 

4447 ] 

4448 month_abbreviations = [ 

4449 "", 

4450 "जन", 

4451 "फेब", 

4452 "मार्च", 

4453 "एप्रील", 

4454 "मे", 

4455 "जुन", 

4456 "जुलाई", 

4457 "अग", 

4458 "सेप", 

4459 "अक्ट", 

4460 "नोव", 

4461 "डिस", 

4462 ] 

4463 

4464 day_names = [ 

4465 "", 

4466 "सोमवार", 

4467 "मंगलवार", 

4468 "बुधवार", 

4469 "बिहिवार", 

4470 "शुक्रवार", 

4471 "शनिवार", 

4472 "आइतवार", 

4473 ] 

4474 

4475 day_abbreviations = ["", "सोम", "मंगल", "बुध", "बिहि", "शुक्र", "शनि", "आइत"] 

4476 

4477 

4478class EstonianLocale(Locale): 

4479 names = ["ee", "et"] 

4480 

4481 past = "{0} tagasi" 

4482 future = "{0} pärast" 

4483 and_word = "ja" 

4484 

4485 timeframes: ClassVar[Mapping[TimeFrameLiteral, Mapping[str, str]]] = { 

4486 "now": {"past": "just nüüd", "future": "just nüüd"}, 

4487 "second": {"past": "üks sekund", "future": "ühe sekundi"}, 

4488 "seconds": {"past": "{0} sekundit", "future": "{0} sekundi"}, 

4489 "minute": {"past": "üks minut", "future": "ühe minuti"}, 

4490 "minutes": {"past": "{0} minutit", "future": "{0} minuti"}, 

4491 "hour": {"past": "tund aega", "future": "tunni aja"}, 

4492 "hours": {"past": "{0} tundi", "future": "{0} tunni"}, 

4493 "day": {"past": "üks päev", "future": "ühe päeva"}, 

4494 "days": {"past": "{0} päeva", "future": "{0} päeva"}, 

4495 "month": {"past": "üks kuu", "future": "ühe kuu"}, 

4496 "months": {"past": "{0} kuud", "future": "{0} kuu"}, 

4497 "year": {"past": "üks aasta", "future": "ühe aasta"}, 

4498 "years": {"past": "{0} aastat", "future": "{0} aasta"}, 

4499 } 

4500 

4501 month_names = [ 

4502 "", 

4503 "Jaanuar", 

4504 "Veebruar", 

4505 "Märts", 

4506 "Aprill", 

4507 "Mai", 

4508 "Juuni", 

4509 "Juuli", 

4510 "August", 

4511 "September", 

4512 "Oktoober", 

4513 "November", 

4514 "Detsember", 

4515 ] 

4516 month_abbreviations = [ 

4517 "", 

4518 "Jan", 

4519 "Veb", 

4520 "Mär", 

4521 "Apr", 

4522 "Mai", 

4523 "Jun", 

4524 "Jul", 

4525 "Aug", 

4526 "Sep", 

4527 "Okt", 

4528 "Nov", 

4529 "Dets", 

4530 ] 

4531 

4532 day_names = [ 

4533 "", 

4534 "Esmaspäev", 

4535 "Teisipäev", 

4536 "Kolmapäev", 

4537 "Neljapäev", 

4538 "Reede", 

4539 "Laupäev", 

4540 "Pühapäev", 

4541 ] 

4542 day_abbreviations = ["", "Esm", "Teis", "Kolm", "Nelj", "Re", "Lau", "Püh"] 

4543 

4544 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: 

4545 form = self.timeframes[timeframe] 

4546 if delta > 0: 

4547 _form = form["future"] 

4548 else: 

4549 _form = form["past"] 

4550 return _form.format(abs(delta)) 

4551 

4552 

4553class LatvianLocale(Locale): 

4554 names = ["lv", "lv-lv"] 

4555 

4556 past = "pirms {0}" 

4557 future = "pēc {0}" 

4558 and_word = "un" 

4559 

4560 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { 

4561 "now": "tagad", 

4562 "second": "sekundes", 

4563 "seconds": "{0} sekundēm", 

4564 "minute": "minūtes", 

4565 "minutes": "{0} minūtēm", 

4566 "hour": "stundas", 

4567 "hours": "{0} stundām", 

4568 "day": "dienas", 

4569 "days": "{0} dienām", 

4570 "week": "nedēļas", 

4571 "weeks": "{0} nedēļām", 

4572 "month": "mēneša", 

4573 "months": "{0} mēnešiem", 

4574 "year": "gada", 

4575 "years": "{0} gadiem", 

4576 } 

4577 

4578 month_names = [ 

4579 "", 

4580 "janvāris", 

4581 "februāris", 

4582 "marts", 

4583 "aprīlis", 

4584 "maijs", 

4585 "jūnijs", 

4586 "jūlijs", 

4587 "augusts", 

4588 "septembris", 

4589 "oktobris", 

4590 "novembris", 

4591 "decembris", 

4592 ] 

4593 

4594 month_abbreviations = [ 

4595 "", 

4596 "jan", 

4597 "feb", 

4598 "marts", 

4599 "apr", 

4600 "maijs", 

4601 "jūnijs", 

4602 "jūlijs", 

4603 "aug", 

4604 "sept", 

4605 "okt", 

4606 "nov", 

4607 "dec", 

4608 ] 

4609 

4610 day_names = [ 

4611 "", 

4612 "pirmdiena", 

4613 "otrdiena", 

4614 "trešdiena", 

4615 "ceturtdiena", 

4616 "piektdiena", 

4617 "sestdiena", 

4618 "svētdiena", 

4619 ] 

4620 

4621 day_abbreviations = [ 

4622 "", 

4623 "pi", 

4624 "ot", 

4625 "tr", 

4626 "ce", 

4627 "pi", 

4628 "se", 

4629 "sv", 

4630 ] 

4631 

4632 

4633class SwahiliLocale(Locale): 

4634 names = [ 

4635 "sw", 

4636 "sw-ke", 

4637 "sw-tz", 

4638 ] 

4639 

4640 past = "{0} iliyopita" 

4641 future = "muda wa {0}" 

4642 and_word = "na" 

4643 

4644 timeframes = { 

4645 "now": "sasa hivi", 

4646 "second": "sekunde", 

4647 "seconds": "sekunde {0}", 

4648 "minute": "dakika moja", 

4649 "minutes": "dakika {0}", 

4650 "hour": "saa moja", 

4651 "hours": "saa {0}", 

4652 "day": "siku moja", 

4653 "days": "siku {0}", 

4654 "week": "wiki moja", 

4655 "weeks": "wiki {0}", 

4656 "month": "mwezi moja", 

4657 "months": "miezi {0}", 

4658 "year": "mwaka moja", 

4659 "years": "miaka {0}", 

4660 } 

4661 

4662 meridians = {"am": "asu", "pm": "mch", "AM": "ASU", "PM": "MCH"} 

4663 

4664 month_names = [ 

4665 "", 

4666 "Januari", 

4667 "Februari", 

4668 "Machi", 

4669 "Aprili", 

4670 "Mei", 

4671 "Juni", 

4672 "Julai", 

4673 "Agosti", 

4674 "Septemba", 

4675 "Oktoba", 

4676 "Novemba", 

4677 "Desemba", 

4678 ] 

4679 month_abbreviations = [ 

4680 "", 

4681 "Jan", 

4682 "Feb", 

4683 "Mac", 

4684 "Apr", 

4685 "Mei", 

4686 "Jun", 

4687 "Jul", 

4688 "Ago", 

4689 "Sep", 

4690 "Okt", 

4691 "Nov", 

4692 "Des", 

4693 ] 

4694 

4695 day_names = [ 

4696 "", 

4697 "Jumatatu", 

4698 "Jumanne", 

4699 "Jumatano", 

4700 "Alhamisi", 

4701 "Ijumaa", 

4702 "Jumamosi", 

4703 "Jumapili", 

4704 ] 

4705 day_abbreviations = [ 

4706 "", 

4707 "Jumatatu", 

4708 "Jumanne", 

4709 "Jumatano", 

4710 "Alhamisi", 

4711 "Ijumaa", 

4712 "Jumamosi", 

4713 "Jumapili", 

4714 ] 

4715 

4716 

4717class CroatianLocale(Locale): 

4718 names = ["hr", "hr-hr"] 

4719 

4720 past = "prije {0}" 

4721 future = "za {0}" 

4722 and_word = "i" 

4723 

4724 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { 

4725 "now": "upravo sad", 

4726 "second": "sekundu", 

4727 "seconds": {"double": "{0} sekunde", "higher": "{0} sekundi"}, 

4728 "minute": "minutu", 

4729 "minutes": {"double": "{0} minute", "higher": "{0} minuta"}, 

4730 "hour": "sat", 

4731 "hours": {"double": "{0} sata", "higher": "{0} sati"}, 

4732 "day": "jedan dan", 

4733 "days": {"double": "{0} dana", "higher": "{0} dana"}, 

4734 "week": "tjedan", 

4735 "weeks": {"double": "{0} tjedna", "higher": "{0} tjedana"}, 

4736 "month": "mjesec", 

4737 "months": {"double": "{0} mjeseca", "higher": "{0} mjeseci"}, 

4738 "year": "godinu", 

4739 "years": {"double": "{0} godine", "higher": "{0} godina"}, 

4740 } 

4741 

4742 month_names = [ 

4743 "", 

4744 "siječanj", 

4745 "veljača", 

4746 "ožujak", 

4747 "travanj", 

4748 "svibanj", 

4749 "lipanj", 

4750 "srpanj", 

4751 "kolovoz", 

4752 "rujan", 

4753 "listopad", 

4754 "studeni", 

4755 "prosinac", 

4756 ] 

4757 

4758 month_abbreviations = [ 

4759 "", 

4760 "siječ", 

4761 "velj", 

4762 "ožuj", 

4763 "trav", 

4764 "svib", 

4765 "lip", 

4766 "srp", 

4767 "kol", 

4768 "ruj", 

4769 "list", 

4770 "stud", 

4771 "pros", 

4772 ] 

4773 

4774 day_names = [ 

4775 "", 

4776 "ponedjeljak", 

4777 "utorak", 

4778 "srijeda", 

4779 "četvrtak", 

4780 "petak", 

4781 "subota", 

4782 "nedjelja", 

4783 ] 

4784 

4785 day_abbreviations = [ 

4786 "", 

4787 "po", 

4788 "ut", 

4789 "sr", 

4790 "če", 

4791 "pe", 

4792 "su", 

4793 "ne", 

4794 ] 

4795 

4796 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: 

4797 form = self.timeframes[timeframe] 

4798 delta = abs(delta) 

4799 if isinstance(form, Mapping): 

4800 if 1 < delta <= 4: 

4801 form = form["double"] 

4802 else: 

4803 form = form["higher"] 

4804 

4805 return form.format(delta) 

4806 

4807 

4808class LatinLocale(Locale): 

4809 names = ["la", "la-va"] 

4810 

4811 past = "ante {0}" 

4812 future = "in {0}" 

4813 and_word = "et" 

4814 

4815 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { 

4816 "now": "nunc", 

4817 "second": "secundum", 

4818 "seconds": "{0} secundis", 

4819 "minute": "minutam", 

4820 "minutes": "{0} minutis", 

4821 "hour": "horam", 

4822 "hours": "{0} horas", 

4823 "day": "diem", 

4824 "days": "{0} dies", 

4825 "week": "hebdomadem", 

4826 "weeks": "{0} hebdomades", 

4827 "month": "mensem", 

4828 "months": "{0} mensis", 

4829 "year": "annum", 

4830 "years": "{0} annos", 

4831 } 

4832 

4833 month_names = [ 

4834 "", 

4835 "Ianuarius", 

4836 "Februarius", 

4837 "Martius", 

4838 "Aprilis", 

4839 "Maius", 

4840 "Iunius", 

4841 "Iulius", 

4842 "Augustus", 

4843 "September", 

4844 "October", 

4845 "November", 

4846 "December", 

4847 ] 

4848 

4849 month_abbreviations = [ 

4850 "", 

4851 "Ian", 

4852 "Febr", 

4853 "Mart", 

4854 "Apr", 

4855 "Mai", 

4856 "Iun", 

4857 "Iul", 

4858 "Aug", 

4859 "Sept", 

4860 "Oct", 

4861 "Nov", 

4862 "Dec", 

4863 ] 

4864 

4865 day_names = [ 

4866 "", 

4867 "dies Lunae", 

4868 "dies Martis", 

4869 "dies Mercurii", 

4870 "dies Iovis", 

4871 "dies Veneris", 

4872 "dies Saturni", 

4873 "dies Solis", 

4874 ] 

4875 

4876 day_abbreviations = [ 

4877 "", 

4878 "dies Lunae", 

4879 "dies Martis", 

4880 "dies Mercurii", 

4881 "dies Iovis", 

4882 "dies Veneris", 

4883 "dies Saturni", 

4884 "dies Solis", 

4885 ] 

4886 

4887 

4888class LithuanianLocale(Locale): 

4889 names = ["lt", "lt-lt"] 

4890 

4891 past = "prieš {0}" 

4892 future = "po {0}" 

4893 and_word = "ir" 

4894 

4895 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { 

4896 "now": "dabar", 

4897 "second": "sekundės", 

4898 "seconds": "{0} sekundžių", 

4899 "minute": "minutės", 

4900 "minutes": "{0} minučių", 

4901 "hour": "valandos", 

4902 "hours": "{0} valandų", 

4903 "day": "dieną", 

4904 "days": "{0} dienų", 

4905 "week": "savaitės", 

4906 "weeks": "{0} savaičių", 

4907 "month": "mėnesio", 

4908 "months": "{0} mėnesių", 

4909 "year": "metų", 

4910 "years": "{0} metų", 

4911 } 

4912 

4913 month_names = [ 

4914 "", 

4915 "sausis", 

4916 "vasaris", 

4917 "kovas", 

4918 "balandis", 

4919 "gegužė", 

4920 "birželis", 

4921 "liepa", 

4922 "rugpjūtis", 

4923 "rugsėjis", 

4924 "spalis", 

4925 "lapkritis", 

4926 "gruodis", 

4927 ] 

4928 

4929 month_abbreviations = [ 

4930 "", 

4931 "saus", 

4932 "vas", 

4933 "kovas", 

4934 "bal", 

4935 "geg", 

4936 "birž", 

4937 "liepa", 

4938 "rugp", 

4939 "rugs", 

4940 "spalis", 

4941 "lapkr", 

4942 "gr", 

4943 ] 

4944 

4945 day_names = [ 

4946 "", 

4947 "pirmadienis", 

4948 "antradienis", 

4949 "trečiadienis", 

4950 "ketvirtadienis", 

4951 "penktadienis", 

4952 "šeštadienis", 

4953 "sekmadienis", 

4954 ] 

4955 

4956 day_abbreviations = [ 

4957 "", 

4958 "pi", 

4959 "an", 

4960 "tr", 

4961 "ke", 

4962 "pe", 

4963 "še", 

4964 "se", 

4965 ] 

4966 

4967 

4968class MalayLocale(Locale): 

4969 names = ["ms", "ms-my", "ms-bn"] 

4970 

4971 past = "{0} yang lalu" 

4972 future = "dalam {0}" 

4973 and_word = "dan" 

4974 

4975 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { 

4976 "now": "sekarang", 

4977 "second": "saat", 

4978 "seconds": "{0} saat", 

4979 "minute": "minit", 

4980 "minutes": "{0} minit", 

4981 "hour": "jam", 

4982 "hours": "{0} jam", 

4983 "day": "hari", 

4984 "days": "{0} hari", 

4985 "week": "minggu", 

4986 "weeks": "{0} minggu", 

4987 "month": "bulan", 

4988 "months": "{0} bulan", 

4989 "year": "tahun", 

4990 "years": "{0} tahun", 

4991 } 

4992 

4993 month_names = [ 

4994 "", 

4995 "Januari", 

4996 "Februari", 

4997 "Mac", 

4998 "April", 

4999 "Mei", 

5000 "Jun", 

5001 "Julai", 

5002 "Ogos", 

5003 "September", 

5004 "Oktober", 

5005 "November", 

5006 "Disember", 

5007 ] 

5008 

5009 month_abbreviations = [ 

5010 "", 

5011 "Jan.", 

5012 "Feb.", 

5013 "Mac", 

5014 "Apr.", 

5015 "Mei", 

5016 "Jun", 

5017 "Julai", 

5018 "Og.", 

5019 "Sept.", 

5020 "Okt.", 

5021 "Nov.", 

5022 "Dis.", 

5023 ] 

5024 

5025 day_names = [ 

5026 "", 

5027 "Isnin", 

5028 "Selasa", 

5029 "Rabu", 

5030 "Khamis", 

5031 "Jumaat", 

5032 "Sabtu", 

5033 "Ahad", 

5034 ] 

5035 

5036 day_abbreviations = [ 

5037 "", 

5038 "Isnin", 

5039 "Selasa", 

5040 "Rabu", 

5041 "Khamis", 

5042 "Jumaat", 

5043 "Sabtu", 

5044 "Ahad", 

5045 ] 

5046 

5047 

5048class MalteseLocale(Locale): 

5049 names = ["mt", "mt-mt"] 

5050 

5051 past = "{0} ilu" 

5052 future = "fi {0}" 

5053 and_word = "u" 

5054 

5055 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { 

5056 "now": "issa", 

5057 "second": "sekonda", 

5058 "seconds": "{0} sekondi", 

5059 "minute": "minuta", 

5060 "minutes": "{0} minuti", 

5061 "hour": "siegħa", 

5062 "hours": {"dual": "{0} sagħtejn", "plural": "{0} sigħat"}, 

5063 "day": "jum", 

5064 "days": {"dual": "{0} jumejn", "plural": "{0} ijiem"}, 

5065 "week": "ġimgħa", 

5066 "weeks": {"dual": "{0} ġimagħtejn", "plural": "{0} ġimgħat"}, 

5067 "month": "xahar", 

5068 "months": {"dual": "{0} xahrejn", "plural": "{0} xhur"}, 

5069 "year": "sena", 

5070 "years": {"dual": "{0} sentejn", "plural": "{0} snin"}, 

5071 } 

5072 

5073 month_names = [ 

5074 "", 

5075 "Jannar", 

5076 "Frar", 

5077 "Marzu", 

5078 "April", 

5079 "Mejju", 

5080 "Ġunju", 

5081 "Lulju", 

5082 "Awwissu", 

5083 "Settembru", 

5084 "Ottubru", 

5085 "Novembru", 

5086 "Diċembru", 

5087 ] 

5088 

5089 month_abbreviations = [ 

5090 "", 

5091 "Jan", 

5092 "Fr", 

5093 "Mar", 

5094 "Apr", 

5095 "Mejju", 

5096 "Ġun", 

5097 "Lul", 

5098 "Aw", 

5099 "Sett", 

5100 "Ott", 

5101 "Nov", 

5102 "Diċ", 

5103 ] 

5104 

5105 day_names = [ 

5106 "", 

5107 "It-Tnejn", 

5108 "It-Tlieta", 

5109 "L-Erbgħa", 

5110 "Il-Ħamis", 

5111 "Il-Ġimgħa", 

5112 "Is-Sibt", 

5113 "Il-Ħadd", 

5114 ] 

5115 

5116 day_abbreviations = [ 

5117 "", 

5118 "T", 

5119 "TL", 

5120 "E", 

5121 "Ħ", 

5122 "Ġ", 

5123 "S", 

5124 "Ħ", 

5125 ] 

5126 

5127 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: 

5128 form = self.timeframes[timeframe] 

5129 delta = abs(delta) 

5130 if isinstance(form, Mapping): 

5131 if delta == 2: 

5132 form = form["dual"] 

5133 else: 

5134 form = form["plural"] 

5135 

5136 return form.format(delta) 

5137 

5138 

5139class SamiLocale(Locale): 

5140 names = ["se", "se-fi", "se-no", "se-se"] 

5141 

5142 past = "{0} dassái" 

5143 future = "{0} " # NOTE: couldn't find preposition for Sami here, none needed? 

5144 

5145 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { 

5146 "now": "dál", 

5147 "second": "sekunda", 

5148 "seconds": "{0} sekundda", 

5149 "minute": "minuhta", 

5150 "minutes": "{0} minuhta", 

5151 "hour": "diimmu", 

5152 "hours": "{0} diimmu", 

5153 "day": "beaivvi", 

5154 "days": "{0} beaivvi", 

5155 "week": "vahku", 

5156 "weeks": "{0} vahku", 

5157 "month": "mánu", 

5158 "months": "{0} mánu", 

5159 "year": "jagi", 

5160 "years": "{0} jagi", 

5161 } 

5162 

5163 month_names = [ 

5164 "", 

5165 "Ođđajagimánnu", 

5166 "Guovvamánnu", 

5167 "Njukčamánnu", 

5168 "Cuoŋománnu", 

5169 "Miessemánnu", 

5170 "Geassemánnu", 

5171 "Suoidnemánnu", 

5172 "Borgemánnu", 

5173 "Čakčamánnu", 

5174 "Golggotmánnu", 

5175 "Skábmamánnu", 

5176 "Juovlamánnu", 

5177 ] 

5178 

5179 month_abbreviations = [ 

5180 "", 

5181 "Ođđajagimánnu", 

5182 "Guovvamánnu", 

5183 "Njukčamánnu", 

5184 "Cuoŋománnu", 

5185 "Miessemánnu", 

5186 "Geassemánnu", 

5187 "Suoidnemánnu", 

5188 "Borgemánnu", 

5189 "Čakčamánnu", 

5190 "Golggotmánnu", 

5191 "Skábmamánnu", 

5192 "Juovlamánnu", 

5193 ] 

5194 

5195 day_names = [ 

5196 "", 

5197 "Mánnodat", 

5198 "Disdat", 

5199 "Gaskavahkku", 

5200 "Duorastat", 

5201 "Bearjadat", 

5202 "Lávvordat", 

5203 "Sotnabeaivi", 

5204 ] 

5205 

5206 day_abbreviations = [ 

5207 "", 

5208 "Mánnodat", 

5209 "Disdat", 

5210 "Gaskavahkku", 

5211 "Duorastat", 

5212 "Bearjadat", 

5213 "Lávvordat", 

5214 "Sotnabeaivi", 

5215 ] 

5216 

5217 

5218class OdiaLocale(Locale): 

5219 names = ["or", "or-in"] 

5220 

5221 past = "{0} ପୂର୍ବେ" 

5222 future = "{0} ପରେ" 

5223 

5224 timeframes = { 

5225 "now": "ବର୍ତ୍ତମାନ", 

5226 "second": "ଏକ ସେକେଣ୍ଡ", 

5227 "seconds": "{0} ସେକେଣ୍ଡ", 

5228 "minute": "ଏକ ମିନଟ", 

5229 "minutes": "{0} ମିନଟ", 

5230 "hour": "ଏକ ଘଣ୍ଟା", 

5231 "hours": "{0} ଘଣ୍ଟା", 

5232 "day": "ଏକ ଦିନ", 

5233 "days": "{0} ଦିନ", 

5234 "month": "ଏକ ମାସ", 

5235 "months": "{0} ମାସ ", 

5236 "year": "ଏକ ବର୍ଷ", 

5237 "years": "{0} ବର୍ଷ", 

5238 } 

5239 

5240 meridians = {"am": "ପୂର୍ବାହ୍ନ", "pm": "ଅପରାହ୍ନ", "AM": "ପୂର୍ବାହ୍ନ", "PM": "ଅପରାହ୍ନ"} 

5241 

5242 month_names = [ 

5243 "", 

5244 "ଜାନୁଆରୀ", 

5245 "ଫେବୃଆରୀ", 

5246 "ମାର୍ଚ୍ଚ୍", 

5247 "ଅପ୍ରେଲ", 

5248 "ମଇ", 

5249 "ଜୁନ୍", 

5250 "ଜୁଲାଇ", 

5251 "ଅଗଷ୍ଟ", 

5252 "ସେପ୍ଟେମ୍ବର", 

5253 "ଅକ୍ଟୋବର୍", 

5254 "ନଭେମ୍ବର୍", 

5255 "ଡିସେମ୍ବର୍", 

5256 ] 

5257 month_abbreviations = [ 

5258 "", 

5259 "ଜାନୁ", 

5260 "ଫେବୃ", 

5261 "ମାର୍ଚ୍ଚ୍", 

5262 "ଅପ୍ରେ", 

5263 "ମଇ", 

5264 "ଜୁନ୍", 

5265 "ଜୁଲା", 

5266 "ଅଗ", 

5267 "ସେପ୍ଟେ", 

5268 "ଅକ୍ଟୋ", 

5269 "ନଭେ", 

5270 "ଡିସେ", 

5271 ] 

5272 

5273 day_names = [ 

5274 "", 

5275 "ସୋମବାର", 

5276 "ମଙ୍ଗଳବାର", 

5277 "ବୁଧବାର", 

5278 "ଗୁରୁବାର", 

5279 "ଶୁକ୍ରବାର", 

5280 "ଶନିବାର", 

5281 "ରବିବାର", 

5282 ] 

5283 day_abbreviations = [ 

5284 "", 

5285 "ସୋମ", 

5286 "ମଙ୍ଗଳ", 

5287 "ବୁଧ", 

5288 "ଗୁରୁ", 

5289 "ଶୁକ୍ର", 

5290 "ଶନି", 

5291 "ରବି", 

5292 ] 

5293 

5294 def _ordinal_number(self, n: int) -> str: 

5295 if n > 10 or n == 0: 

5296 return f"{n}ତମ" 

5297 if n in [1, 5, 7, 8, 9, 10]: 

5298 return f"{n}ମ" 

5299 if n in [2, 3]: 

5300 return f"{n}ୟ" 

5301 if n == 4: 

5302 return f"{n}ର୍ଥ" 

5303 if n == 6: 

5304 return f"{n}ଷ୍ଠ" 

5305 return "" 

5306 

5307 

5308class SerbianLocale(Locale): 

5309 names = ["sr", "sr-rs", "sr-sp"] 

5310 

5311 past = "pre {0}" 

5312 future = "za {0}" 

5313 and_word = "i" 

5314 

5315 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { 

5316 "now": "sada", 

5317 "second": "sekundu", 

5318 "seconds": {"double": "{0} sekunde", "higher": "{0} sekundi"}, 

5319 "minute": "minutu", 

5320 "minutes": {"double": "{0} minute", "higher": "{0} minuta"}, 

5321 "hour": "sat", 

5322 "hours": {"double": "{0} sata", "higher": "{0} sati"}, 

5323 "day": "dan", 

5324 "days": {"double": "{0} dana", "higher": "{0} dana"}, 

5325 "week": "nedelju", 

5326 "weeks": {"double": "{0} nedelje", "higher": "{0} nedelja"}, 

5327 "month": "mesec", 

5328 "months": {"double": "{0} meseca", "higher": "{0} meseci"}, 

5329 "year": "godinu", 

5330 "years": {"double": "{0} godine", "higher": "{0} godina"}, 

5331 } 

5332 

5333 month_names = [ 

5334 "", 

5335 "januar", # јануар 

5336 "februar", # фебруар 

5337 "mart", # март 

5338 "april", # април 

5339 "maj", # мај 

5340 "jun", # јун 

5341 "jul", # јул 

5342 "avgust", # август 

5343 "septembar", # септембар 

5344 "oktobar", # октобар 

5345 "novembar", # новембар 

5346 "decembar", # децембар 

5347 ] 

5348 

5349 month_abbreviations = [ 

5350 "", 

5351 "jan", 

5352 "feb", 

5353 "mar", 

5354 "apr", 

5355 "maj", 

5356 "jun", 

5357 "jul", 

5358 "avg", 

5359 "sep", 

5360 "okt", 

5361 "nov", 

5362 "dec", 

5363 ] 

5364 

5365 day_names = [ 

5366 "", 

5367 "ponedeljak", # понедељак 

5368 "utorak", # уторак 

5369 "sreda", # среда 

5370 "četvrtak", # четвртак 

5371 "petak", # петак 

5372 "subota", # субота 

5373 "nedelja", # недеља 

5374 ] 

5375 

5376 day_abbreviations = [ 

5377 "", 

5378 "po", # по 

5379 "ut", # ут 

5380 "sr", # ср 

5381 "če", # че 

5382 "pe", # пе 

5383 "su", # су 

5384 "ne", # не 

5385 ] 

5386 

5387 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: 

5388 form = self.timeframes[timeframe] 

5389 delta = abs(delta) 

5390 if isinstance(form, Mapping): 

5391 if 1 < delta <= 4: 

5392 form = form["double"] 

5393 else: 

5394 form = form["higher"] 

5395 

5396 return form.format(delta) 

5397 

5398 

5399class LuxembourgishLocale(Locale): 

5400 names = ["lb", "lb-lu"] 

5401 

5402 past = "virun {0}" 

5403 future = "an {0}" 

5404 and_word = "an" 

5405 

5406 timeframes: ClassVar[Dict[TimeFrameLiteral, str]] = { 

5407 "now": "just elo", 

5408 "second": "enger Sekonn", 

5409 "seconds": "{0} Sekonnen", 

5410 "minute": "enger Minutt", 

5411 "minutes": "{0} Minutten", 

5412 "hour": "enger Stonn", 

5413 "hours": "{0} Stonnen", 

5414 "day": "engem Dag", 

5415 "days": "{0} Deeg", 

5416 "week": "enger Woch", 

5417 "weeks": "{0} Wochen", 

5418 "month": "engem Mount", 

5419 "months": "{0} Méint", 

5420 "year": "engem Joer", 

5421 "years": "{0} Jahren", 

5422 } 

5423 

5424 timeframes_only_distance = timeframes.copy() 

5425 timeframes_only_distance["second"] = "eng Sekonn" 

5426 timeframes_only_distance["minute"] = "eng Minutt" 

5427 timeframes_only_distance["hour"] = "eng Stonn" 

5428 timeframes_only_distance["day"] = "een Dag" 

5429 timeframes_only_distance["days"] = "{0} Deeg" 

5430 timeframes_only_distance["week"] = "eng Woch" 

5431 timeframes_only_distance["month"] = "ee Mount" 

5432 timeframes_only_distance["months"] = "{0} Méint" 

5433 timeframes_only_distance["year"] = "ee Joer" 

5434 timeframes_only_distance["years"] = "{0} Joer" 

5435 

5436 month_names = [ 

5437 "", 

5438 "Januar", 

5439 "Februar", 

5440 "Mäerz", 

5441 "Abrëll", 

5442 "Mee", 

5443 "Juni", 

5444 "Juli", 

5445 "August", 

5446 "September", 

5447 "Oktouber", 

5448 "November", 

5449 "Dezember", 

5450 ] 

5451 

5452 month_abbreviations = [ 

5453 "", 

5454 "Jan", 

5455 "Feb", 

5456 "Mäe", 

5457 "Abr", 

5458 "Mee", 

5459 "Jun", 

5460 "Jul", 

5461 "Aug", 

5462 "Sep", 

5463 "Okt", 

5464 "Nov", 

5465 "Dez", 

5466 ] 

5467 

5468 day_names = [ 

5469 "", 

5470 "Méindeg", 

5471 "Dënschdeg", 

5472 "Mëttwoch", 

5473 "Donneschdeg", 

5474 "Freideg", 

5475 "Samschdeg", 

5476 "Sonndeg", 

5477 ] 

5478 

5479 day_abbreviations = ["", "Méi", "Dën", "Mët", "Don", "Fre", "Sam", "Son"] 

5480 

5481 def _ordinal_number(self, n: int) -> str: 

5482 return f"{n}." 

5483 

5484 def describe( 

5485 self, 

5486 timeframe: TimeFrameLiteral, 

5487 delta: Union[int, float] = 0, 

5488 only_distance: bool = False, 

5489 ) -> str: 

5490 if not only_distance: 

5491 return super().describe(timeframe, delta, only_distance) 

5492 

5493 # Luxembourgish uses a different case without 'in' or 'ago' 

5494 humanized: str = self.timeframes_only_distance[timeframe].format( 

5495 trunc(abs(delta)) 

5496 ) 

5497 

5498 return humanized 

5499 

5500 

5501class ZuluLocale(Locale): 

5502 names = ["zu", "zu-za"] 

5503 

5504 past = "{0} edlule" 

5505 future = "{0} " 

5506 and_word = "futhi" 

5507 

5508 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[Mapping[str, str], str]]] = { 

5509 "now": "manje", 

5510 "second": {"past": "umzuzwana", "future": "ngomzuzwana"}, 

5511 "seconds": {"past": "{0} imizuzwana", "future": "{0} ngemizuzwana"}, 

5512 "minute": {"past": "umzuzu", "future": "ngomzuzu"}, 

5513 "minutes": {"past": "{0} imizuzu", "future": "{0} ngemizuzu"}, 

5514 "hour": {"past": "ihora", "future": "ngehora"}, 

5515 "hours": {"past": "{0} amahora", "future": "{0} emahoreni"}, 

5516 "day": {"past": "usuku", "future": "ngosuku"}, 

5517 "days": {"past": "{0} izinsuku", "future": "{0} ezinsukwini"}, 

5518 "week": {"past": "isonto", "future": "ngesonto"}, 

5519 "weeks": {"past": "{0} amasonto", "future": "{0} emasontweni"}, 

5520 "month": {"past": "inyanga", "future": "ngenyanga"}, 

5521 "months": {"past": "{0} izinyanga", "future": "{0} ezinyangeni"}, 

5522 "year": {"past": "unyaka", "future": "ngonyak"}, 

5523 "years": {"past": "{0} iminyaka", "future": "{0} eminyakeni"}, 

5524 } 

5525 

5526 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: 

5527 """Zulu aware time frame format function, takes into account 

5528 the differences between past and future forms.""" 

5529 abs_delta = abs(delta) 

5530 form = self.timeframes[timeframe] 

5531 

5532 if isinstance(form, str): 

5533 return form.format(abs_delta) 

5534 

5535 if delta > 0: 

5536 key = "future" 

5537 else: 

5538 key = "past" 

5539 form = form[key] 

5540 

5541 return form.format(abs_delta) 

5542 

5543 month_names = [ 

5544 "", 

5545 "uMasingane", 

5546 "uNhlolanja", 

5547 "uNdasa", 

5548 "UMbasa", 

5549 "UNhlaba", 

5550 "UNhlangulana", 

5551 "uNtulikazi", 

5552 "UNcwaba", 

5553 "uMandulo", 

5554 "uMfumfu", 

5555 "uLwezi", 

5556 "uZibandlela", 

5557 ] 

5558 

5559 month_abbreviations = [ 

5560 "", 

5561 "uMasingane", 

5562 "uNhlolanja", 

5563 "uNdasa", 

5564 "UMbasa", 

5565 "UNhlaba", 

5566 "UNhlangulana", 

5567 "uNtulikazi", 

5568 "UNcwaba", 

5569 "uMandulo", 

5570 "uMfumfu", 

5571 "uLwezi", 

5572 "uZibandlela", 

5573 ] 

5574 

5575 day_names = [ 

5576 "", 

5577 "uMsombuluko", 

5578 "uLwesibili", 

5579 "uLwesithathu", 

5580 "uLwesine", 

5581 "uLwesihlanu", 

5582 "uMgqibelo", 

5583 "iSonto", 

5584 ] 

5585 

5586 day_abbreviations = [ 

5587 "", 

5588 "uMsombuluko", 

5589 "uLwesibili", 

5590 "uLwesithathu", 

5591 "uLwesine", 

5592 "uLwesihlanu", 

5593 "uMgqibelo", 

5594 "iSonto", 

5595 ] 

5596 

5597 

5598class TamilLocale(Locale): 

5599 names = ["ta", "ta-in", "ta-lk"] 

5600 

5601 past = "{0} நேரத்திற்கு முன்பு" 

5602 future = "இல் {0}" 

5603 

5604 timeframes = { 

5605 "now": "இப்போது", 

5606 "second": "ஒரு இரண்டாவது", 

5607 "seconds": "{0} விநாடிகள்", 

5608 "minute": "ஒரு நிமிடம்", 

5609 "minutes": "{0} நிமிடங்கள்", 

5610 "hour": "ஒரு மணி", 

5611 "hours": "{0} மணிநேரம்", 

5612 "day": "ஒரு நாள்", 

5613 "days": "{0} நாட்கள்", 

5614 "week": "ஒரு வாரம்", 

5615 "weeks": "{0} வாரங்கள்", 

5616 "month": "ஒரு மாதம்", 

5617 "months": "{0} மாதங்கள்", 

5618 "year": "ஒரு ஆண்டு", 

5619 "years": "{0} ஆண்டுகள்", 

5620 } 

5621 

5622 month_names = [ 

5623 "", 

5624 "சித்திரை", 

5625 "வைகாசி", 

5626 "ஆனி", 

5627 "ஆடி", 

5628 "ஆவணி", 

5629 "புரட்டாசி", 

5630 "ஐப்பசி", 

5631 "கார்த்திகை", 

5632 "மார்கழி", 

5633 "தை", 

5634 "மாசி", 

5635 "பங்குனி", 

5636 ] 

5637 

5638 month_abbreviations = [ 

5639 "", 

5640 "ஜன", 

5641 "பிப்", 

5642 "மார்", 

5643 "ஏப்", 

5644 "மே", 

5645 "ஜூன்", 

5646 "ஜூலை", 

5647 "ஆக", 

5648 "செப்", 

5649 "அக்", 

5650 "நவ", 

5651 "டிச", 

5652 ] 

5653 

5654 day_names = [ 

5655 "", 

5656 "திங்கட்கிழமை", 

5657 "செவ்வாய்க்கிழமை", 

5658 "புதன்கிழமை", 

5659 "வியாழக்கிழமை", 

5660 "வெள்ளிக்கிழமை", 

5661 "சனிக்கிழமை", 

5662 "ஞாயிற்றுக்கிழமை", 

5663 ] 

5664 

5665 day_abbreviations = [ 

5666 "", 

5667 "திங்கட்", 

5668 "செவ்வாய்", 

5669 "புதன்", 

5670 "வியாழன்", 

5671 "வெள்ளி", 

5672 "சனி", 

5673 "ஞாயிறு", 

5674 ] 

5675 

5676 def _ordinal_number(self, n: int) -> str: 

5677 if n == 1: 

5678 return f"{n}வது" 

5679 elif n >= 0: 

5680 return f"{n}ஆம்" 

5681 else: 

5682 return "" 

5683 

5684 

5685class AlbanianLocale(Locale): 

5686 names = ["sq", "sq-al"] 

5687 

5688 past = "{0} më parë" 

5689 future = "në {0}" 

5690 and_word = "dhe" 

5691 

5692 timeframes = { 

5693 "now": "tani", 

5694 "second": "sekondë", 

5695 "seconds": "{0} sekonda", 

5696 "minute": "minutë", 

5697 "minutes": "{0} minuta", 

5698 "hour": "orë", 

5699 "hours": "{0} orë", 

5700 "day": "ditë", 

5701 "days": "{0} ditë", 

5702 "week": "javë", 

5703 "weeks": "{0} javë", 

5704 "month": "muaj", 

5705 "months": "{0} muaj", 

5706 "year": "vit", 

5707 "years": "{0} vjet", 

5708 } 

5709 

5710 month_names = [ 

5711 "", 

5712 "janar", 

5713 "shkurt", 

5714 "mars", 

5715 "prill", 

5716 "maj", 

5717 "qershor", 

5718 "korrik", 

5719 "gusht", 

5720 "shtator", 

5721 "tetor", 

5722 "nëntor", 

5723 "dhjetor", 

5724 ] 

5725 

5726 month_abbreviations = [ 

5727 "", 

5728 "jan", 

5729 "shk", 

5730 "mar", 

5731 "pri", 

5732 "maj", 

5733 "qer", 

5734 "korr", 

5735 "gush", 

5736 "sht", 

5737 "tet", 

5738 "nën", 

5739 "dhj", 

5740 ] 

5741 

5742 day_names = [ 

5743 "", 

5744 "e hënë", 

5745 "e martë", 

5746 "e mërkurë", 

5747 "e enjte", 

5748 "e premte", 

5749 "e shtunë", 

5750 "e diel", 

5751 ] 

5752 

5753 day_abbreviations = [ 

5754 "", 

5755 "hën", 

5756 "mar", 

5757 "mër", 

5758 "enj", 

5759 "pre", 

5760 "sht", 

5761 "die", 

5762 ] 

5763 

5764 

5765class GeorgianLocale(Locale): 

5766 names = ["ka", "ka-ge"] 

5767 

5768 past = "{0} წინ" # ts’in 

5769 future = "{0} შემდეგ" # shemdeg 

5770 and_word = "და" # da 

5771 

5772 timeframes = { 

5773 "now": "ახლა", # akhla 

5774 # When a cardinal qualifies a noun, it stands in the singular 

5775 "second": "წამის", # ts’amis 

5776 "seconds": "{0} წამის", 

5777 "minute": "წუთის", # ts’utis 

5778 "minutes": "{0} წუთის", 

5779 "hour": "საათის", # saatis 

5780 "hours": "{0} საათის", 

5781 "day": "დღის", # dghis 

5782 "days": "{0} დღის", 

5783 "week": "კვირის", # k’viris 

5784 "weeks": "{0} კვირის", 

5785 "month": "თვის", # tvis 

5786 "months": "{0} თვის", 

5787 "year": "წლის", # ts’lis 

5788 "years": "{0} წლის", 

5789 } 

5790 

5791 month_names = [ 

5792 # modern month names 

5793 "", 

5794 "იანვარი", # Ianvari 

5795 "თებერვალი", # Tebervali 

5796 "მარტი", # Mart'i 

5797 "აპრილი", # Ap'rili 

5798 "მაისი", # Maisi 

5799 "ივნისი", # Ivnisi 

5800 "ივლისი", # Ivlisi 

5801 "აგვისტო", # Agvist'o 

5802 "სექტემბერი", # Sekt'emberi 

5803 "ოქტომბერი", # Okt'omberi 

5804 "ნოემბერი", # Noemberi 

5805 "დეკემბერი", # Dek'emberi 

5806 ] 

5807 

5808 month_abbreviations = [ 

5809 # no abbr. found yet 

5810 "", 

5811 "იანვარი", # Ianvari 

5812 "თებერვალი", # Tebervali 

5813 "მარტი", # Mart'i 

5814 "აპრილი", # Ap'rili 

5815 "მაისი", # Maisi 

5816 "ივნისი", # Ivnisi 

5817 "ივლისი", # Ivlisi 

5818 "აგვისტო", # Agvist'o 

5819 "სექტემბერი", # Sekt'emberi 

5820 "ოქტომბერი", # Okt'omberi 

5821 "ნოემბერი", # Noemberi 

5822 "დეკემბერი", # Dek'emberi 

5823 ] 

5824 

5825 day_names = [ 

5826 "", 

5827 "ორშაბათი", # orshabati 

5828 "სამშაბათი", # samshabati 

5829 "ოთხშაბათი", # otkhshabati 

5830 "ხუთშაბათი", # khutshabati 

5831 "პარასკევი", # p’arask’evi 

5832 "შაბათი", # shabati 

5833 # "k’vira" also serves as week; to avoid confusion "k’vira-dge" can be used for Sunday 

5834 "კვირა", # k’vira 

5835 ] 

5836 

5837 day_abbreviations = [ 

5838 "", 

5839 "ორშაბათი", # orshabati 

5840 "სამშაბათი", # samshabati 

5841 "ოთხშაბათი", # otkhshabati 

5842 "ხუთშაბათი", # khutshabati 

5843 "პარასკევი", # p’arask’evi 

5844 "შაბათი", # shabati 

5845 "კვირა", # k’vira 

5846 ] 

5847 

5848 

5849class SinhalaLocale(Locale): 

5850 names = ["si", "si-lk"] 

5851 

5852 past = "{0}ට පෙර" 

5853 future = "{0}" 

5854 and_word = "සහ" 

5855 

5856 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[Mapping[str, str], str]]] = { 

5857 "now": "දැන්", 

5858 "second": { 

5859 "past": "තත්පරයක", 

5860 "future": "තත්පරයකින්", 

5861 }, # ක් is the article 

5862 "seconds": { 

5863 "past": "තත්පර {0} ක", 

5864 "future": "තත්පර {0} කින්", 

5865 }, 

5866 "minute": { 

5867 "past": "විනාඩියක", 

5868 "future": "විනාඩියකින්", 

5869 }, 

5870 "minutes": { 

5871 "past": "විනාඩි {0} ක", 

5872 "future": "මිනිත්තු {0} කින්", 

5873 }, 

5874 "hour": {"past": "පැයක", "future": "පැයකින්"}, 

5875 "hours": { 

5876 "past": "පැය {0} ක", 

5877 "future": "පැය {0} කින්", 

5878 }, 

5879 "day": {"past": "දිනක", "future": "දිනකට"}, 

5880 "days": { 

5881 "past": "දින {0} ක", 

5882 "future": "දින {0} කින්", 

5883 }, 

5884 "week": {"past": "සතියක", "future": "සතියකින්"}, 

5885 "weeks": { 

5886 "past": "සති {0} ක", 

5887 "future": "සති {0} කින්", 

5888 }, 

5889 "month": {"past": "මාසයක", "future": "එය මාසය තුළ"}, 

5890 "months": { 

5891 "past": "මාස {0} ක", 

5892 "future": "මාස {0} කින්", 

5893 }, 

5894 "year": {"past": "වසරක", "future": "වසරක් තුළ"}, 

5895 "years": { 

5896 "past": "අවුරුදු {0} ක", 

5897 "future": "අවුරුදු {0} තුළ", 

5898 }, 

5899 } 

5900 # Sinhala: the general format to describe timeframe is different from past and future, 

5901 # so we do not copy the original timeframes dictionary 

5902 timeframes_only_distance = {} 

5903 timeframes_only_distance["second"] = "තත්පරයක්" 

5904 timeframes_only_distance["seconds"] = "තත්පර {0}" 

5905 timeframes_only_distance["minute"] = "මිනිත්තුවක්" 

5906 timeframes_only_distance["minutes"] = "විනාඩි {0}" 

5907 timeframes_only_distance["hour"] = "පැයක්" 

5908 timeframes_only_distance["hours"] = "පැය {0}" 

5909 timeframes_only_distance["day"] = "දවසක්" 

5910 timeframes_only_distance["days"] = "දවස් {0}" 

5911 timeframes_only_distance["week"] = "සතියක්" 

5912 timeframes_only_distance["weeks"] = "සති {0}" 

5913 timeframes_only_distance["month"] = "මාසයක්" 

5914 timeframes_only_distance["months"] = "මාස {0}" 

5915 timeframes_only_distance["year"] = "අවුරුද්දක්" 

5916 timeframes_only_distance["years"] = "අවුරුදු {0}" 

5917 

5918 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: 

5919 """ 

5920 Sinhala awares time frame format function, takes into account 

5921 the differences between general, past, and future forms (three different suffixes). 

5922 """ 

5923 abs_delta = abs(delta) 

5924 form = self.timeframes[timeframe] 

5925 

5926 if isinstance(form, str): 

5927 return form.format(abs_delta) 

5928 

5929 if delta > 0: 

5930 key = "future" 

5931 else: 

5932 key = "past" 

5933 form = form[key] 

5934 

5935 return form.format(abs_delta) 

5936 

5937 def describe( 

5938 self, 

5939 timeframe: TimeFrameLiteral, 

5940 delta: Union[float, int] = 1, # key is always future when only_distance=False 

5941 only_distance: bool = False, 

5942 ) -> str: 

5943 """Describes a delta within a timeframe in plain language. 

5944 

5945 :param timeframe: a string representing a timeframe. 

5946 :param delta: a quantity representing a delta in a timeframe. 

5947 :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords 

5948 """ 

5949 

5950 if not only_distance: 

5951 return super().describe(timeframe, delta, only_distance) 

5952 # Sinhala uses a different case without 'in' or 'ago' 

5953 humanized = self.timeframes_only_distance[timeframe].format(trunc(abs(delta))) 

5954 

5955 return humanized 

5956 

5957 month_names = [ 

5958 "", 

5959 "ජනවාරි", 

5960 "පෙබරවාරි", 

5961 "මාර්තු", 

5962 "අප්‍රේල්", 

5963 "මැයි", 

5964 "ජූනි", 

5965 "ජූලි", 

5966 "අගෝස්තු", 

5967 "සැප්තැම්බර්", 

5968 "ඔක්තෝබර්", 

5969 "නොවැම්බර්", 

5970 "දෙසැම්බර්", 

5971 ] 

5972 

5973 month_abbreviations = [ 

5974 "", 

5975 "ජන", 

5976 "පෙබ", 

5977 "මාර්", 

5978 "අප්‍රේ", 

5979 "මැයි", 

5980 "ජුනි", 

5981 "ජූලි", 

5982 "අගෝ", 

5983 "සැප්", 

5984 "ඔක්", 

5985 "නොවැ", 

5986 "දෙසැ", 

5987 ] 

5988 

5989 day_names = [ 

5990 "", 

5991 "සදුදා", 

5992 "අඟහරැවදා", 

5993 "බදාදා", 

5994 "බ්‍රහස්‍පතින්‍දා", 

5995 "සිකුරාදා", 

5996 "සෙනසුරාදා", 

5997 "ඉරිදා", 

5998 ] 

5999 

6000 day_abbreviations = [ 

6001 "", 

6002 "සදුද", 

6003 "බදා", 

6004 "බදා", 

6005 "සිකු", 

6006 "සෙන", 

6007 "අ", 

6008 "ඉරිදා", 

6009 ] 

6010 

6011 

6012class UrduLocale(Locale): 

6013 names = ["ur", "ur-pk"] 

6014 

6015 past = "پہلے {0}" 

6016 future = "میں {0}" 

6017 and_word = "اور" 

6018 

6019 timeframes = { 

6020 "now": "ابھی", 

6021 "second": "ایک سیکنڈ", 

6022 "seconds": "{0} سیکنڈ", 

6023 "minute": "ایک منٹ", 

6024 "minutes": "{0} منٹ", 

6025 "hour": "ایک گھنٹے", 

6026 "hours": "{0} گھنٹے", 

6027 "day": "ایک دن", 

6028 "days": "{0} دن", 

6029 "week": "ایک ہفتے", 

6030 "weeks": "{0} ہفتے", 

6031 "month": "ایک مہینہ", 

6032 "months": "{0} ماہ", 

6033 "year": "ایک سال", 

6034 "years": "{0} سال", 

6035 } 

6036 

6037 month_names = [ 

6038 "", 

6039 "جنوری", 

6040 "فروری", 

6041 "مارچ", 

6042 "اپریل", 

6043 "مئی", 

6044 "جون", 

6045 "جولائی", 

6046 "اگست", 

6047 "ستمبر", 

6048 "اکتوبر", 

6049 "نومبر", 

6050 "دسمبر", 

6051 ] 

6052 

6053 month_abbreviations = [ 

6054 "", 

6055 "جنوری", 

6056 "فروری", 

6057 "مارچ", 

6058 "اپریل", 

6059 "مئی", 

6060 "جون", 

6061 "جولائی", 

6062 "اگست", 

6063 "ستمبر", 

6064 "اکتوبر", 

6065 "نومبر", 

6066 "دسمبر", 

6067 ] 

6068 

6069 day_names = [ 

6070 "", 

6071 "سوموار", 

6072 "منگل", 

6073 "بدھ", 

6074 "جمعرات", 

6075 "جمعہ", 

6076 "ہفتہ", 

6077 "اتوار", 

6078 ] 

6079 

6080 day_abbreviations = [ 

6081 "", 

6082 "سوموار", 

6083 "منگل", 

6084 "بدھ", 

6085 "جمعرات", 

6086 "جمعہ", 

6087 "ہفتہ", 

6088 "اتوار", 

6089 ] 

6090 

6091 

6092class KazakhLocale(Locale): 

6093 names = ["kk", "kk-kz"] 

6094 

6095 past = "{0} бұрын" 

6096 future = "{0} кейін" 

6097 timeframes = { 

6098 "now": "қазір", 

6099 "second": "бір секунд", 

6100 "seconds": "{0} секунд", 

6101 "minute": "бір минут", 

6102 "minutes": "{0} минут", 

6103 "hour": "бір сағат", 

6104 "hours": "{0} сағат", 

6105 "day": "бір күн", 

6106 "days": "{0} күн", 

6107 "week": "бір апта", 

6108 "weeks": "{0} апта", 

6109 "month": "бір ай", 

6110 "months": "{0} ай", 

6111 "year": "бір жыл", 

6112 "years": "{0} жыл", 

6113 } 

6114 

6115 month_names = [ 

6116 "", 

6117 "Қаңтар", 

6118 "Ақпан", 

6119 "Наурыз", 

6120 "Сәуір", 

6121 "Мамыр", 

6122 "Маусым", 

6123 "Шілде", 

6124 "Тамыз", 

6125 "Қыркүйек", 

6126 "Қазан", 

6127 "Қараша", 

6128 "Желтоқсан", 

6129 ] 

6130 month_abbreviations = [ 

6131 "", 

6132 "Қан", 

6133 "Ақп", 

6134 "Нау", 

6135 "Сәу", 

6136 "Мам", 

6137 "Мау", 

6138 "Шіл", 

6139 "Там", 

6140 "Қыр", 

6141 "Қаз", 

6142 "Қар", 

6143 "Жел", 

6144 ] 

6145 

6146 day_names = [ 

6147 "", 

6148 "Дүйсембі", 

6149 "Сейсенбі", 

6150 "Сәрсенбі", 

6151 "Бейсенбі", 

6152 "Жұма", 

6153 "Сенбі", 

6154 "Жексенбі", 

6155 ] 

6156 day_abbreviations = ["", "Дс", "Сс", "Ср", "Бс", "Жм", "Сб", "Жс"] 

6157 

6158 

6159class AmharicLocale(Locale): 

6160 names = ["am", "am-et"] 

6161 

6162 past = "{0} በፊት" 

6163 future = "{0} ውስጥ" 

6164 and_word = "እና" 

6165 

6166 timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[Mapping[str, str], str]]] = { 

6167 "now": "አሁን", 

6168 "second": { 

6169 "past": "ከአንድ ሰከንድ", 

6170 "future": "በአንድ ሰከንድ", 

6171 }, 

6172 "seconds": { 

6173 "past": "ከ {0} ሰከንድ", 

6174 "future": "በ {0} ሰከንድ", 

6175 }, 

6176 "minute": { 

6177 "past": "ከአንድ ደቂቃ", 

6178 "future": "በአንድ ደቂቃ", 

6179 }, 

6180 "minutes": { 

6181 "past": "ከ {0} ደቂቃዎች", 

6182 "future": "በ {0} ደቂቃዎች", 

6183 }, 

6184 "hour": { 

6185 "past": "ከአንድ ሰዓት", 

6186 "future": "በአንድ ሰዓት", 

6187 }, 

6188 "hours": { 

6189 "past": "ከ {0} ሰዓታት", 

6190 "future": "በ {0} ሰከንድ", 

6191 }, 

6192 "day": { 

6193 "past": "ከአንድ ቀን", 

6194 "future": "በአንድ ቀን", 

6195 }, 

6196 "days": { 

6197 "past": "ከ {0} ቀናት", 

6198 "future": "በ {0} ቀናት", 

6199 }, 

6200 "week": { 

6201 "past": "ከአንድ ሳምንት", 

6202 "future": "በአንድ ሳምንት", 

6203 }, 

6204 "weeks": { 

6205 "past": "ከ {0} ሳምንታት", 

6206 "future": "በ {0} ሳምንታት", 

6207 }, 

6208 "month": { 

6209 "past": "ከአንድ ወር", 

6210 "future": "በአንድ ወር", 

6211 }, 

6212 "months": { 

6213 "past": "ከ {0} ወር", 

6214 "future": "በ {0} ወራት", 

6215 }, 

6216 "year": { 

6217 "past": "ከአንድ አመት", 

6218 "future": "በአንድ አመት", 

6219 }, 

6220 "years": { 

6221 "past": "ከ {0} ዓመታት", 

6222 "future": "በ {0} ዓመታት", 

6223 }, 

6224 } 

6225 # Amharic: the general format to describe timeframe is different from past and future, 

6226 # so we do not copy the original timeframes dictionary 

6227 timeframes_only_distance = { 

6228 "second": "አንድ ሰከንድ", 

6229 "seconds": "{0} ሰከንድ", 

6230 "minute": "አንድ ደቂቃ", 

6231 "minutes": "{0} ደቂቃዎች", 

6232 "hour": "አንድ ሰዓት", 

6233 "hours": "{0} ሰዓት", 

6234 "day": "አንድ ቀን", 

6235 "days": "{0} ቀናት", 

6236 "week": "አንድ ሳምንት", 

6237 "weeks": "{0} ሳምንት", 

6238 "month": "አንድ ወር", 

6239 "months": "{0} ወራት", 

6240 "year": "አንድ አመት", 

6241 "years": "{0} ዓመታት", 

6242 } 

6243 

6244 month_names = [ 

6245 "", 

6246 "ጃንዩወሪ", 

6247 "ፌብሩወሪ", 

6248 "ማርች", 

6249 "ኤፕሪል", 

6250 "ሜይ", 

6251 "ጁን", 

6252 "ጁላይ", 

6253 "ኦገስት", 

6254 "ሴፕቴምበር", 

6255 "ኦክቶበር", 

6256 "ኖቬምበር", 

6257 "ዲሴምበር", 

6258 ] 

6259 

6260 month_abbreviations = [ 

6261 "", 

6262 "ጃንዩ", 

6263 "ፌብሩ", 

6264 "ማርች", 

6265 "ኤፕሪ", 

6266 "ሜይ", 

6267 "ጁን", 

6268 "ጁላይ", 

6269 "ኦገስ", 

6270 "ሴፕቴ", 

6271 "ኦክቶ", 

6272 "ኖቬም", 

6273 "ዲሴም", 

6274 ] 

6275 

6276 day_names = [ 

6277 "", 

6278 "ሰኞ", 

6279 "ማክሰኞ", 

6280 "ረቡዕ", 

6281 "ሐሙስ", 

6282 "ዓርብ", 

6283 "ቅዳሜ", 

6284 "እሑድ", 

6285 ] 

6286 day_abbreviations = ["", "እ", "ሰ", "ማ", "ረ", "ሐ", "ዓ", "ቅ"] 

6287 

6288 def _ordinal_number(self, n: int) -> str: 

6289 return f"{n}ኛ" 

6290 

6291 def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: 

6292 """ 

6293 Amharic awares time frame format function, takes into account 

6294 the differences between general, past, and future forms (three different suffixes). 

6295 """ 

6296 abs_delta = abs(delta) 

6297 form = self.timeframes[timeframe] 

6298 

6299 if isinstance(form, str): 

6300 return form.format(abs_delta) 

6301 

6302 if delta > 0: 

6303 key = "future" 

6304 else: 

6305 key = "past" 

6306 form = form[key] 

6307 

6308 return form.format(abs_delta) 

6309 

6310 def describe( 

6311 self, 

6312 timeframe: TimeFrameLiteral, 

6313 delta: Union[float, int] = 1, # key is always future when only_distance=False 

6314 only_distance: bool = False, 

6315 ) -> str: 

6316 """Describes a delta within a timeframe in plain language. 

6317 

6318 :param timeframe: a string representing a timeframe. 

6319 :param delta: a quantity representing a delta in a timeframe. 

6320 :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords 

6321 """ 

6322 

6323 if not only_distance: 

6324 return super().describe(timeframe, delta, only_distance) 

6325 humanized = self.timeframes_only_distance[timeframe].format(trunc(abs(delta))) 

6326 

6327 return humanized 

6328 

6329 

6330class ArmenianLocale(Locale): 

6331 names = ["hy", "hy-am"] 

6332 past = "{0} առաջ" 

6333 future = "{0}ից" 

6334 and_word = "Եվ" # Yev 

6335 

6336 timeframes = { 

6337 "now": "հիմա", 

6338 "second": "վայրկյան", 

6339 "seconds": "{0} վայրկյան", 

6340 "minute": "րոպե", 

6341 "minutes": "{0} րոպե", 

6342 "hour": "ժամ", 

6343 "hours": "{0} ժամ", 

6344 "day": "օր", 

6345 "days": "{0} օր", 

6346 "month": "ամիս", 

6347 "months": "{0} ամիս", 

6348 "year": "տարին", 

6349 "years": "{0} տարին", 

6350 "week": "շաբաթ", 

6351 "weeks": "{0} շաբաթ", 

6352 } 

6353 

6354 meridians = { 

6355 "am": "Ամ", 

6356 "pm": "պ.մ.", 

6357 "AM": "Ամ", 

6358 "PM": "պ.մ.", 

6359 } 

6360 

6361 month_names = [ 

6362 "", 

6363 "հունվար", 

6364 "փետրվար", 

6365 "մարտ", 

6366 "ապրիլ", 

6367 "մայիս", 

6368 "հունիս", 

6369 "հուլիս", 

6370 "օգոստոս", 

6371 "սեպտեմբեր", 

6372 "հոկտեմբեր", 

6373 "նոյեմբեր", 

6374 "դեկտեմբեր", 

6375 ] 

6376 

6377 month_abbreviations = [ 

6378 "", 

6379 "հունվար", 

6380 "փետրվար", 

6381 "մարտ", 

6382 "ապրիլ", 

6383 "մայիս", 

6384 "հունիս", 

6385 "հուլիս", 

6386 "օգոստոս", 

6387 "սեպտեմբեր", 

6388 "հոկտեմբեր", 

6389 "նոյեմբեր", 

6390 "դեկտեմբեր", 

6391 ] 

6392 

6393 day_names = [ 

6394 "", 

6395 "երկուշաբթի", 

6396 "երեքշաբթի", 

6397 "չորեքշաբթի", 

6398 "հինգշաբթի", 

6399 "ուրբաթ", 

6400 "շաբաթ", 

6401 "կիրակի", 

6402 ] 

6403 

6404 day_abbreviations = [ 

6405 "", 

6406 "երկ.", 

6407 "երեք.", 

6408 "չորեք.", 

6409 "հինգ.", 

6410 "ուրբ.", 

6411 "շաբ.", 

6412 "կիր.", 

6413 ] 

6414 

6415 

6416class UzbekLocale(Locale): 

6417 names = ["uz", "uz-uz"] 

6418 past = "{0}dan avval" 

6419 future = "{0}dan keyin" 

6420 timeframes = { 

6421 "now": "hozir", 

6422 "second": "bir soniya", 

6423 "seconds": "{0} soniya", 

6424 "minute": "bir daqiqa", 

6425 "minutes": "{0} daqiqa", 

6426 "hour": "bir soat", 

6427 "hours": "{0} soat", 

6428 "day": "bir kun", 

6429 "days": "{0} kun", 

6430 "week": "bir hafta", 

6431 "weeks": "{0} hafta", 

6432 "month": "bir oy", 

6433 "months": "{0} oy", 

6434 "year": "bir yil", 

6435 "years": "{0} yil", 

6436 } 

6437 

6438 month_names = [ 

6439 "", 

6440 "Yanvar", 

6441 "Fevral", 

6442 "Mart", 

6443 "Aprel", 

6444 "May", 

6445 "Iyun", 

6446 "Iyul", 

6447 "Avgust", 

6448 "Sentyabr", 

6449 "Oktyabr", 

6450 "Noyabr", 

6451 "Dekabr", 

6452 ] 

6453 

6454 month_abbreviations = [ 

6455 "", 

6456 "Yan", 

6457 "Fev", 

6458 "Mar", 

6459 "Apr", 

6460 "May", 

6461 "Iyn", 

6462 "Iyl", 

6463 "Avg", 

6464 "Sen", 

6465 "Okt", 

6466 "Noy", 

6467 "Dek", 

6468 ] 

6469 

6470 day_names = [ 

6471 "", 

6472 "Dushanba", 

6473 "Seshanba", 

6474 "Chorshanba", 

6475 "Payshanba", 

6476 "Juma", 

6477 "Shanba", 

6478 "Yakshanba", 

6479 ] 

6480 

6481 day_abbreviations = ["", "Dush", "Sesh", "Chor", "Pay", "Jum", "Shan", "Yak"]