On 10/17/2013 10:13 AM, John S Warren wrote:
[snip]
Instead of faking unicode behavior, I'm suggesting that we use its
functionality in Message as-is, only overriding the __mod__ method
in order to support translation in downstream code. In short, the
Message class would differ from unicode in only these ways:

1. A "translate" method is introduced.
2. Attributes necessary to perform the translation operation (e.g.
    message ID) are added.
3. The __mod__ method is overridden to preserve the parameters so
    they can be used in case a translation operation is needed.

So I guess where we differ is in that I don't see the need to have
Message objects that are distinct from unicode objects. It seems
to me that having _() return objects that can be used in the same
manner as the ones returned by the original gettext implementation
avoids a lot of complications.  Because Message is extending unicode,
and it is not overriding any of the relevant behaviors, for all intents
and purposes it's not pretending to be something it isn't when an
instance of it is being used as a unicode object would be used.

+1
Yeah, I think this is the way to go, it would solve all the problems we are seeing with "trying" to look and feel like unicode, when the Message class is not, but it would also greatly remove a lot of teh "magic" and complexity previously in the Message class.

Basically the Message class would look like this (I changed the name too):

class TranslatableUnicode(unicode):

    def __new__(cls, *args, **kwargs):
        return super(TranslatableUnicode, cls).__new__(cls, args[0])

    def __init__(self, msgid, domain):
        self.domain = domain
        self.msgid = msgid
        self.params = None

    def __mod__(self, other):
        # We just save the params in case they are needed in a translation
        self.params = other
        return super(TranslatableUnicode, self).__mod__(other)

    def translate(self, locale):
        localedir = os.environ.get(self.domain.upper() + '_LOCALEDIR')
        if not locale:
            locale = locale.getdefaultlocale()
        lang = gettext.translation(self.domain,
                                   localedir=localedir,
                                   languages=[locale],
                                   fallback=True)

        ugettext = lang.gettext if six.PY3 else lang.ugettext
        translated = ugettext(self.msgid)

        if self.params is not None:
            # Recurse and translate parameters
            translated = translated % self.params
        return translated


--
Luis A. García
Cloud Solutions & OpenStack Development
IBM Systems and Technology Group
Ph: (915) 307-6568 | T/L: 363-6276

"Everything should be made as simple as possible, but not simpler."
                                        - Albert Einstein

"Simple can be harder than complex: You have to work hard to get
your thinking clean to make it simple."
                                        – Steve Jobs


_______________________________________________
OpenStack-dev mailing list
OpenStack-dev@lists.openstack.org
http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev

Reply via email to