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