Locale implementation using the `gettext` module.
| 513 | |
| 514 | |
| 515 | class GettextLocale(Locale): |
| 516 | """Locale implementation using the `gettext` module.""" |
| 517 | |
| 518 | def __init__(self, code: str, translations: gettext.NullTranslations) -> None: |
| 519 | self.ngettext = translations.ngettext |
| 520 | self.gettext = translations.gettext |
| 521 | # self.gettext must exist before __init__ is called, since it |
| 522 | # calls into self.translate |
| 523 | super().__init__(code) |
| 524 | |
| 525 | def translate( |
| 526 | self, |
| 527 | message: str, |
| 528 | plural_message: Optional[str] = None, |
| 529 | count: Optional[int] = None, |
| 530 | ) -> str: |
| 531 | if plural_message is not None: |
| 532 | assert count is not None |
| 533 | return self.ngettext(message, plural_message, count) |
| 534 | else: |
| 535 | return self.gettext(message) |
| 536 | |
| 537 | def pgettext( |
| 538 | self, |
| 539 | context: str, |
| 540 | message: str, |
| 541 | plural_message: Optional[str] = None, |
| 542 | count: Optional[int] = None, |
| 543 | ) -> str: |
| 544 | """Allows to set context for translation, accepts plural forms. |
| 545 | |
| 546 | Usage example:: |
| 547 | |
| 548 | pgettext("law", "right") |
| 549 | pgettext("good", "right") |
| 550 | |
| 551 | Plural message example:: |
| 552 | |
| 553 | pgettext("organization", "club", "clubs", len(clubs)) |
| 554 | pgettext("stick", "club", "clubs", len(clubs)) |
| 555 | |
| 556 | To generate POT file with context, add following options to step 1 |
| 557 | of `load_gettext_translations` sequence:: |
| 558 | |
| 559 | xgettext [basic options] --keyword=pgettext:1c,2 --keyword=pgettext:1c,2,3 |
| 560 | |
| 561 | .. versionadded:: 4.2 |
| 562 | """ |
| 563 | if plural_message is not None: |
| 564 | assert count is not None |
| 565 | msgs_with_ctxt = ( |
| 566 | "%s%s%s" % (context, CONTEXT_SEPARATOR, message), |
| 567 | "%s%s%s" % (context, CONTEXT_SEPARATOR, plural_message), |
| 568 | count, |
| 569 | ) |
| 570 | result = self.ngettext(*msgs_with_ctxt) |
| 571 | if CONTEXT_SEPARATOR in result: |
| 572 | # Translation not found |