Edgewall Software

Ticket #129: i18n_domain.patch

File i18n_domain.patch, 6.7 KB (added by palgarvio, 6 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: