Edgewall Software

Ticket #7497: plugin_i18n_support.patch

File plugin_i18n_support.patch, 7.2 KB (added by palgarvio, 5 months ago)
  • trac/util/translation.py

    diff --git a/trac/util/translation.py b/trac/util/translation.py
    a b  
    1414"""Utilities for text translation with gettext.""" 
    1515 
    1616import re 
     17import sys  
    1718try: 
    1819    import threading 
    1920except ImportError: 
     
    6566        def _gettext(): 
    6667            trans = get_translations().ugettext(string) 
    6768            return kwargs and trans % kwargs or trans 
     69        domain = sys._getframe(1).f_globals.get('domain') 
     70        if domain: 
     71            # It has, use that domain 
     72            return dgettext(domain, string, **kwargs) 
    6873        if not hasattr(_current, 'translations'): 
    6974            return LazyProxy(_gettext) 
    7075        return _gettext() 
    7176    _ = gettext 
     77     
     78    def dgettext(domain, string, **kwargs): 
     79        def _dgettext(): 
     80            trans = get_translations().dugettext(domain, string) 
     81            return kwargs and trans % kwargs or trans 
     82        if not hasattr(_current, 'translations'): 
     83            return LazyProxy(_dgettext) 
     84        return _dgettext() 
    7285 
    7386    def ngettext(singular, plural, num, **kwargs): 
    7487        kwargs = kwargs.copy() 
     
    7790            if '%(num)' in trans: 
    7891                kwargs.update(num=num) 
    7992            return kwargs and trans % kwargs or trans 
     93        # The caller is a plugin with domain variable defined ??? 
     94        domain = sys._getframe(1).f_globals.get('domain') 
     95        if domain: 
     96            # It has, use that domain 
     97            return dngettext(domain, singular, plural, num, **kwargs) 
    8098        if not hasattr(_current, 'translations'): 
    8199            return LazyProxy(_ngettext) 
    82100        return _ngettext() 
     101     
     102    def dngettext(domain, singular, plural, num, **kwargs): 
     103        kwargs = kwargs.copy() 
     104        def _dngettext(): 
     105            trans = get_translations().dungettext(domain, singular, plural, num) 
     106            if '%(num)' in trans: 
     107                kwargs.update(num=num) 
     108            return kwargs and trans % kwargs or trans 
     109        if not hasattr(_current, 'translations'): 
     110            return LazyProxy(_dngettext) 
     111        return _dngettext() 
    83112 
    84113    def tgettext(string, **kwargs): 
    85114        def _tgettext(): 
    86115            trans = get_translations().ugettext(string) 
    87116            return kwargs and _tag_kwargs(trans, kwargs) or trans 
     117        # The caller is a plugin with domain variable defined ??? 
     118        domain = sys._getframe(1).f_globals.get('domain') 
     119        if domain: 
     120            # It has, use that domain 
     121            return dtgettext(domain, string, **kwargs) 
    88122        if not hasattr(_current, 'translations'): 
    89123            return LazyProxy(_tgettext) 
    90124        return _tgettext() 
    91125    tag_ = tgettext 
     126     
     127    def dtgettext(domain, string, **kwargs): 
     128        def _dtgettext(): 
     129            trans = get_translations().dugettext(domain, string) 
     130            return kwargs and _tag_kwargs(trans, kwargs) or trans 
     131        if not hasattr(_current, 'translations'): 
     132            return LazyProxy(_dtgettext) 
     133        return _dtgettext() 
    92134 
    93135    def tngettext(singular, plural, num, **kwargs): 
    94136        kwargs = kwargs.copy() 
     
    97139            if '%(num)' in trans: 
    98140                kwargs.update(num=num) 
    99141            return kwargs and _tag_kwargs(trans, kwargs) or trans 
     142        # The caller is a plugin with domain variable defined ??? 
     143        domain = sys._getframe(1).f_globals.get('domain') 
     144        if domain: 
     145            # It has, use that domain 
     146            return dtngettext(domain, singular, plural, num, **kwargs) 
    100147        if not hasattr(_current, 'translations'): 
    101148            return LazyProxy(_tngettext) 
    102149        return _tngettext() 
     150     
     151    def dtngettext(domain, singular, plural, num, **kwargs): 
     152        kwargs = kwargs.copy() 
     153        def _dtngettext(): 
     154            trans = get_translations().dungettext(domain, singular, plural, num) 
     155            if '%(num)' in trans: 
     156                kwargs.update(num=num) 
     157            return kwargs and _tag_kwargs(trans, kwargs) or trans 
     158        if not hasattr(_current, 'translations'): 
     159            return LazyProxy(_dtngettext) 
     160        return _dtngettext() 
     161     
     162    _plugin_domains = {} 
    103163 
    104     def activate(locale): 
     164    def activate(locale, env_path=None): 
    105165        locale_dir = pkg_resources.resource_filename(__name__, '../locale') 
    106166        _current.translations = Translations.load(locale_dir, locale) 
    107  
     167        if env_path: 
     168            plugin_domains = _plugin_domains.get(env_path) 
     169            if plugin_domains: 
     170                for domain, dirname in plugin_domains: 
     171                    _current.translations.add_domain(domain, dirname) 
     172                 
    108173    _null_translations = NullTranslations() 
    109174 
    110175    def get_translations(): 
     
    112177 
    113178    def deactivate(): 
    114179        del _current.translations 
     180 
     181     
     182    def add_domain(env_path, domain, locales_dir): 
     183        if env_path not in _plugin_domains: 
     184            _plugin_domains[env_path] = [] 
     185        _plugin_domains[env_path].append((domain, locales_dir)) 
    115186 
    116187    def get_available_locales(): 
    117188        """Return a list of locale identifiers of the locales for which 
  • trac/web/api.py

    diff --git a/trac/web/api.py b/trac/web/api.py
    a b  
    339339                    from trac.web.chrome import Chrome 
    340340                    from trac.util import translation 
    341341                    if hasattr(self, 'locale'): 
    342                         translation.activate(self.locale) 
     342                        translation.activate(self.locale, env.path) 
    343343                    try: 
    344344                        data = Chrome(env).render_template(self, template, 
    345345                                                           data, 'text/html') 
  • trac/web/chrome.py

    diff --git a/trac/web/chrome.py b/trac/web/chrome.py
    a b  
    2727 
    2828from genshi import Markup 
    2929from genshi.builder import tag, Element 
    30 from genshi.filters import Translator 
     30from genshi.filters import Translator, setup_i18n 
    3131from genshi.input import HTML, ParseError 
    3232from genshi.core import Attrs, START 
    3333from genshi.output import DocType 
     
    290290        'classes': presentation.classes, 
    291291        'date': datetime.date, 
    292292        'datetime': datetime.datetime, 
     293        'dgettext': translation.dgettext, 
     294        'dngettext': translation.dngettext, 
    293295        'first_last': presentation.first_last, 
    294296        'get_reporter_id': get_reporter_id, 
    295297        'gettext': translation.gettext, 
     
    657659        """ 
    658660        if not self.templates: 
    659661            def _template_loaded(template): 
    660                 template.filters.insert( 
    661                     0, Translator(translation.get_translations()) 
    662                 ) 
     662                translator = Translator(translation.get_translations()) 
     663                setup_i18n(template, translator) 
    663664 
    664665            self.templates = TemplateLoader(self.get_all_templates_dirs(), 
    665666                                            auto_reload=self.auto_reload, 
  • trac/web/main.py

    diff --git a/trac/web/main.py b/trac/web/main.py
    a b  
    163163        try: 
    164164            try: 
    165165                try: 
    166                     translation.activate(req.locale) 
     166                    translation.activate(req.locale, self.env.path) 
    167167 
    168168                    # Select the component that should handle the request 
    169169                    chosen_handler = None