Edgewall Software

Ticket #129: i18n_domain.patch

File i18n_domain.patch, 6.7 KB (added by palgarvio, 8 years ago)
  • genshi/filters/i18n.py

    diff --git a/genshi/filters/i18n.py b/genshi/filters/i18n.py
    a b  
    2222
    2323from genshi.core import Attrs, Namespace, QName, START, END, TEXT, START_NS, \
    2424                        END_NS, XML_NAMESPACE, _ensure
    25 from genshi.template.base import Template, EXPR, SUB
     25from genshi.template.base import Template, Context, EXPR, SUB, INCLUDE
    2626from genshi.template.markup import MarkupTemplate, EXEC
    2727
    2828__all__ = ['Translator', 'extract']
     
    107107        self.ignore_tags = ignore_tags
    108108        self.include_attrs = include_attrs
    109109        self.extract_text = extract_text
     110        self.i18n_domains = []
    110111
    111112    def __call__(self, stream, ctxt=None, search_text=True, msgbuf=None):
    112113        """Translate any localizable strings in the given stream.
     
    128129        include_attrs = self.include_attrs
    129130        ugettext = self.translator.ugettext
    130131        ungettext = self.translator.ungettext
     132        try:
     133            dugettext = self.translator.dugettext
     134            dungettext = self.translator.dungettext
     135        except AttributeError:
     136            # No domain support, show a warning???
     137            dugettext = lambda d, s: ugettext(s)
     138            dungettext = lambda d, s, p, n: ungettext(s, p, n)
    131139
    132140        if not self.extract_text:
    133141            search_text = False
    134142        skip = 0
    135143        i18n_msg = I18N_NAMESPACE['msg']
    136144        i18n_choose = I18N_NAMESPACE['choose']
     145        i18n_domain = I18N_NAMESPACE['domain']
    137146        ns_prefixes = []
    138147        xml_lang = XML_NAMESPACE['lang']
     148       
     149        if not ctxt:
     150            ctxt = Context()
     151                   
     152        i18n_domains = ctxt.get('i18n_domains', [])
    139153
    140154        for kind, data, pos in stream:
    141155
     
    151165            # handle different events that can be localized
    152166            if kind is START:
    153167                tag, attrs = data
     168
     169                if i18n_domain in attrs:
     170                    i18n_domains.append((tag, attrs.get(i18n_domain).strip()))
     171                    attrs -= i18n_domain
     172                   
    154173                if tag in self.ignore_tags or \
    155174                        isinstance(attrs.get(xml_lang), basestring):
    156175                    skip += 1
    157176                    yield kind, data, pos
    158177                    continue
    159 
     178                   
    160179                new_attrs = []
    161180                changed = False
    162181                for name, value in attrs:
    163182                    newval = value
    164183                    if search_text and isinstance(value, basestring):
    165184                        if name in include_attrs:
    166                             newval = ugettext(value)
     185                            if i18n_domains:
     186                                newval = dugettext(i18n_domains[-1][1], value)
     187                            else:
     188                                newval = ugettext(value)
    167189                    else:
     190                        # Update context with current domains
     191                        ctxt['i18n_domains'] = i18n_domains
    168192                        newval = list(self(_ensure(value), ctxt,
    169                             search_text=False)
    170                         )
     193                                           search_text=False))
    171194                    if newval != value:
    172195                        value = newval
    173196                        changed = True
     
    185208                elif i18n_choose in attrs:
    186209                    params = attrs.get(i18n_choose)
    187210                    msgbuf = MessageBuffer(params)
    188                     attrs -= i18n_choose                   
     211                    attrs -= i18n_choose
    189212
    190213                yield kind, (tag, attrs), pos
    191214
     
    193216                if not msgbuf:
    194217                    text = data.strip()
    195218                    if text:
    196                         data = data.replace(text, unicode(ugettext(text)))
     219                        if i18n_domains:
     220                            data = data.replace(text,
     221                                unicode(dugettext(i18n_domains[-1][1], text)))
     222                        else:
     223                            data = data.replace(text, unicode(ugettext(text)))
    197224                    yield kind, data, pos
    198225                else:
    199226                    msgbuf.append(kind, data, pos)
     
    206233                if not msgbuf.depth:
    207234                    if msgbuf.singular or msgbuf.plural:
    208235                        singular, plural, expr = msgbuf.format()
    209                         events = ungettext(singular, plural,
    210                                            expr.evaluate(ctxt))
     236                        if i18n_domains:
     237                            events = dungettext(i18n_domains[-1][1],
     238                                                singular, plural,
     239                                                expr.evaluate(ctxt))
     240                        else:
     241                            events = ungettext(singular, plural,
     242                                               expr.evaluate(ctxt))
    211243                    else:
    212                         events = ugettext(msgbuf.format())
     244                        if i18n_domains:
     245                            events = dugettext(i18n_domains[-1][1],
     246                                               msgbuf.format())
     247                        else:
     248                            events = ugettext(msgbuf.format())
    213249                    for event in msgbuf.translate(events):
    214250                        yield event
    215251                    msgbuf = None
    216252                    yield kind, data, pos
    217 
     253                   
    218254            elif kind is SUB:
    219255                subkind, substream = data
     256                # Update context with current domains
     257                ctxt['i18n_domains'] = i18n_domains
    220258                new_substream = list(self(substream, ctxt, msgbuf=msgbuf))
    221259                yield kind, (subkind, new_substream), pos
    222260
     
    225263
    226264            elif kind is END_NS and data in ns_prefixes:
    227265                ns_prefixes.remove(data)
    228 
    229266            else:
    230267                yield kind, data, pos
     268               
     269            if kind is END and i18n_domains and i18n_domains[-1][1] == data:
     270                i18n_domains.pop()
     271                # Update context with current domains
     272                ctxt['i18n_domains'] = i18n_domains
    231273
    232274    GETTEXT_FUNCTIONS = ('_', 'gettext', 'ngettext', 'dgettext', 'dngettext',
    233275                         'ugettext', 'ungettext')
  • genshi/template/base.py

    diff --git a/genshi/template/base.py b/genshi/template/base.py
    a b  
    560560        template files.
    561561        """
    562562        from genshi.template.loader import TemplateNotFound
     563        from genshi.filters.i18n import Translator
    563564
    564565        for event in stream:
    565566            if event[0] is INCLUDE: