diff options
Diffstat (limited to 'src/zope/i18n/gettextmessagecatalog.py')
-rw-r--r-- | src/zope/i18n/gettextmessagecatalog.py | 48 |
1 files changed, 45 insertions, 3 deletions
diff --git a/src/zope/i18n/gettextmessagecatalog.py b/src/zope/i18n/gettextmessagecatalog.py index 307e5be..99f1951 100644 --- a/src/zope/i18n/gettextmessagecatalog.py +++ b/src/zope/i18n/gettextmessagecatalog.py @@ -14,6 +14,7 @@ """A simple implementation of a Message Catalog. """ +from functools import wraps from gettext import GNUTranslations from zope.i18n.interfaces import IGlobalMessageCatalog from zope.interface import implementer @@ -22,7 +23,24 @@ from zope.interface import implementer class _KeyErrorRaisingFallback(object): def ugettext(self, message): raise KeyError(message) + + def ungettext(self, singular, plural, n): + raise KeyError(singular) + gettext = ugettext + ngettext = ungettext + + +def plural_formatting(func): + @wraps(func) + def pformat(catalog, singular, plural, n, *args, **kwargs): + msg = func(catalog, singular, plural, n, *args, **kwargs) + try: + return msg % n + except TypeError: + # The message cannot be formatted : return it "raw". + return msg + return pformat @implementer(IGlobalMessageCatalog) @@ -33,13 +51,20 @@ class GettextMessageCatalog(object): def __init__(self, language, domain, path_to_file): """Initialize the message catalog""" - self.language = language.decode('utf-8') if isinstance(language, bytes) else language - self.domain = domain.decode("utf-8") if isinstance(domain, bytes) else domain + self.language = ( + language.decode('utf-8') if isinstance(language, bytes) + else language) + self.domain = ( + domain.decode("utf-8") if isinstance(domain, bytes) + else domain) self._path_to_file = path_to_file self.reload() catalog = self._catalog catalog.add_fallback(_KeyErrorRaisingFallback()) - self._gettext = catalog.gettext if str is not bytes else catalog.ugettext + self._gettext = ( + catalog.gettext if str is not bytes else catalog.ugettext) + self._ngettext = ( + catalog.ngettext if str is not bytes else catalog.ungettext) def reload(self): 'See IMessageCatalog' @@ -50,6 +75,23 @@ class GettextMessageCatalog(object): 'See IMessageCatalog' return self._gettext(id) + @plural_formatting + def getPluralMessage(self, singular, plural, n): + 'See IMessageCatalog' + return self._ngettext(singular, plural, n) + + @plural_formatting + def queryPluralMessage(self, singular, plural, n, dft1=None, dft2=None): + 'See IMessageCatalog' + try: + return self._ngettext(singular, plural, n) + except KeyError: + # Here, we use the catalog plural function to determine + # if `n` triggers a plural form or not. + if self._catalog.plural(n): + return dft2 + return dft1 + def queryMessage(self, id, default=None): 'See IMessageCatalog' try: |