summaryrefslogtreecommitdiff
path: root/src/zope/i18n/gettextmessagecatalog.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/zope/i18n/gettextmessagecatalog.py')
-rw-r--r--src/zope/i18n/gettextmessagecatalog.py48
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: