diff options
Diffstat (limited to 'src/zope/i18nmessageid/message.py')
-rw-r--r-- | src/zope/i18nmessageid/message.py | 66 |
1 files changed, 49 insertions, 17 deletions
diff --git a/src/zope/i18nmessageid/message.py b/src/zope/i18nmessageid/message.py index 0e62408..4bfcb19 100644 --- a/src/zope/i18nmessageid/message.py +++ b/src/zope/i18nmessageid/message.py @@ -14,14 +14,12 @@ """I18n Messages and factories. """ __docformat__ = "reStructuredText" +_marker = object() -try: - unicode -except NameError: #pragma NO COVER Python3 - unicode = str +import six -class Message(unicode): +class Message(six.text_type): """Message (Python implementation) This is a string used as a message. It has a domain attribute that is @@ -31,18 +29,45 @@ class Message(unicode): message id itself implicitly serves as the default text. """ - __slots__ = ('domain', 'default', 'mapping', '_readonly') + __slots__ = ( + 'domain', 'default', 'mapping', '_readonly', + 'msgid_plural', 'default_plural', 'number') - def __new__(cls, ustr, domain=None, default=None, mapping=None): - self = unicode.__new__(cls, ustr) + def __new__(cls, ustr, domain=_marker, default=_marker, mapping=_marker, + msgid_plural=_marker, default_plural=_marker, number=_marker): + self = six.text_type.__new__(cls, ustr) if isinstance(ustr, self.__class__): - domain = ustr.domain and ustr.domain[:] or domain - default = ustr.default and ustr.default[:] or default - mapping = ustr.mapping and ustr.mapping.copy() or mapping - ustr = unicode(ustr) + domain = ustr.domain[:] if domain is _marker else domain + default = ustr.default[:] if default is _marker else default + mapping = ustr.mapping.copy() if mapping is _marker else mapping + msgid_plural = ( + ustr.msgid_plural[:] if msgid_plural is _marker else + msgid_plural) + default_plural = ( + ustr.default_plural[:] if default_plural is _marker else + default_plural) + number = ustr.number if number is _marker else number + ustr = six.text_type(ustr) + else: + domain = None if domain is _marker else domain + default = None if default is _marker else default + mapping = None if mapping is _marker else mapping + msgid_plural = None if msgid_plural is _marker else msgid_plural + default_plural = (None if default_plural is _marker else + default_plural) + number = None if number is _marker else number + self.domain = domain self.default = default self.mapping = mapping + self.msgid_plural = msgid_plural + self.default_plural = default_plural + + if number is not None and not isinstance( + number, six.integer_types + (float,)): + raise TypeError('`number` should be an integer or a float') + + self.number = number self._readonly = True return self @@ -54,27 +79,34 @@ class Message(unicode): if getattr(self, '_readonly', False): raise TypeError('readonly attribute') else: - return unicode.__setattr__(self, key, value) + return six.text_type.__setattr__(self, key, value) def __getstate__(self): - return unicode(self), self.domain, self.default, self.mapping + return ( + six.text_type(self), self.domain, self.default, self.mapping, + self.msgid_plural, self.default_plural, self.number) def __reduce__(self): return self.__class__, self.__getstate__() + # Name the fallback Python implementation to make it easier to test. pyMessage = Message + try: from ._zope_i18nmessageid_message import Message -except ImportError: # pragma: no cover +except ImportError: # pragma: no cover pass + class MessageFactory(object): """Factory for creating i18n messages.""" def __init__(self, domain): self._domain = domain - def __call__(self, ustr, default=None, mapping=None): - return Message(ustr, self._domain, default, mapping) + def __call__(self, ustr, default=None, mapping=None, + msgid_plural=None, default_plural=None, number=None): + return Message(ustr, self._domain, default, mapping, + msgid_plural, default_plural, number) |