Edgewall Software

Ticket #7497: plugin_i18n_support-r7676.patch

File plugin_i18n_support-r7676.patch, 7.4 KB (added by cboos, 8 weeks ago)

Updated patch - applies cleanly on current trunk, normal translations are working but I've not yet tested add_domain

  • trac/web/api.py

     
    369369                    from trac.web.chrome import Chrome 
    370370                    from trac.util import translation 
    371371                    if hasattr(self, 'locale'): 
    372                         translation.activate(self.locale) 
     372                        translation.activate(self.locale, env.path) 
    373373                    try: 
    374374                        data = Chrome(env).render_template(self, template, 
    375375                                                           data, 'text/html') 
  • trac/web/chrome.py

     
    2626 
    2727from genshi import Markup 
    2828from genshi.builder import tag, Element 
    29 from genshi.filters import Translator 
     29from genshi.filters import Translator, setup_i18n 
    3030from genshi.input import HTML, ParseError 
    3131from genshi.core import Attrs, START 
    3232from genshi.output import DocType 
     
    293293        'classes': presentation.classes, 
    294294        'date': datetime.date, 
    295295        'datetime': datetime.datetime, 
     296        'dgettext': translation.dgettext, 
     297        'dngettext': translation.dngettext, 
    296298        'first_last': presentation.first_last, 
    297299        'get_reporter_id': get_reporter_id, 
    298300        'gettext': translation.gettext, 
     
    660662        """ 
    661663        if not self.templates: 
    662664            def _template_loaded(template): 
    663                 template.filters.insert(0, Translator(translation.gettext)) 
     665                translator = Translator(translation.get_translations()) 
     666                setup_i18n(template, translator) 
    664667 
    665668            self.templates = TemplateLoader(self.get_all_templates_dirs(), 
    666669                                            auto_reload=self.auto_reload, 
  • trac/web/main.py

     
    164164        try: 
    165165            try: 
    166166                try: 
    167                     translation.activate(req.locale) 
     167                    translation.activate(req.locale, self.env.path) 
    168168 
    169169                    # Select the component that should handle the request 
    170170                    chosen_handler = None 
  • trac/util/translation.py

     
    1414"""Utilities for text translation with gettext.""" 
    1515 
    1616import re 
     17import sys  
    1718try: 
    1819    import threading 
    1920except ImportError: 
     
    6364        def _gettext(): 
    6465            trans = get_translations().ugettext(string) 
    6566            return kwargs and trans % kwargs or trans 
     67        domain = sys._getframe(1).f_globals.get('domain') 
     68        if domain: 
     69            # It has, use that domain 
     70            return dgettext(domain, string, **kwargs) 
    6671        if not hasattr(_current, 'translations'): 
    6772            return LazyProxy(_gettext) 
    6873        return _gettext() 
    6974    _ = gettext 
     75     
     76    def dgettext(domain, string, **kwargs): 
     77        def _dgettext(): 
     78            trans = get_translations().dugettext(domain, string) 
     79            return kwargs and trans % kwargs or trans 
     80        if not hasattr(_current, 'translations'): 
     81            return LazyProxy(_dgettext) 
     82        return _dgettext() 
    7083 
    7184    def ngettext(singular, plural, num, **kwargs): 
    7285        kwargs = kwargs.copy() 
    7386        kwargs.setdefault('num', num) 
     87        # The caller is a plugin with domain variable defined ??? 
     88        domain = sys._getframe(1).f_globals.get('domain') 
     89        if domain: 
     90            # It has, use that domain 
     91            return dngettext(domain, singular, plural, num, **kwargs) 
    7492        def _ngettext(): 
    7593            trans = get_translations().ungettext(singular, plural, num) 
    7694            return trans % kwargs 
     
    7896            return LazyProxy(_ngettext) 
    7997        return _ngettext() 
    8098 
     99    def dngettext(domain, singular, plural, num, **kwargs): 
     100        kwargs = kwargs.copy() 
     101        kwargs.setdefault('num', num) 
     102        def _dngettext(): 
     103            trans = get_translations().dungettext(domain, singular, plural, num) 
     104            return trans % kwargs 
     105        if not hasattr(_current, 'translations'): 
     106            return LazyProxy(_dngettext) 
     107        return _dngettext() 
     108 
    81109    def tgettext(string, **kwargs): 
    82110        def _tgettext(): 
    83111            trans = get_translations().ugettext(string) 
    84112            return kwargs and _tag_kwargs(trans, kwargs) or trans 
     113        # The caller is a plugin with domain variable defined ??? 
     114        domain = sys._getframe(1).f_globals.get('domain') 
     115        if domain: 
     116            # It has, use that domain 
     117            return dtgettext(domain, string, **kwargs) 
    85118        if not hasattr(_current, 'translations'): 
    86119            return LazyProxy(_tgettext) 
    87120        return _tgettext() 
    88121    tag_ = tgettext 
     122     
     123    def dtgettext(domain, string, **kwargs): 
     124        def _dtgettext(): 
     125            trans = get_translations().dugettext(domain, string) 
     126            return kwargs and _tag_kwargs(trans, kwargs) or trans 
     127        if not hasattr(_current, 'translations'): 
     128            return LazyProxy(_dtgettext) 
     129        return _dtgettext() 
    89130 
    90131    def tngettext(singular, plural, num, **kwargs): 
    91132        kwargs = kwargs.copy() 
     
    93134        def _tngettext(): 
    94135            trans = get_translations().ungettext(singular, plural, num) 
    95136            return _tag_kwargs(trans, kwargs) 
     137        # The caller is a plugin with domain variable defined ??? 
     138        domain = sys._getframe(1).f_globals.get('domain') 
     139        if domain: 
     140            # It has, use that domain 
     141            return dtngettext(domain, singular, plural, num, **kwargs) 
    96142        if not hasattr(_current, 'translations'): 
    97143            return LazyProxy(_tngettext) 
    98144        return _tngettext() 
    99145 
    100     def activate(locale): 
     146    def dtngettext(domain, singular, plural, num, **kwargs): 
     147        kwargs = kwargs.copy() 
     148        def _dtngettext(): 
     149            trans = get_translations().dungettext(domain, singular, plural, num) 
     150            if '%(num)' in trans: 
     151                kwargs.update(num=num) 
     152            return kwargs and _tag_kwargs(trans, kwargs) or trans 
     153        if not hasattr(_current, 'translations'): 
     154            return LazyProxy(_dtngettext) 
     155        return _dtngettext() 
     156     
     157    _plugin_domains = {} 
     158 
     159    def activate(locale, env_path=None): 
    101160        locale_dir = pkg_resources.resource_filename(__name__, '../locale') 
    102161        _current.translations = Translations.load(locale_dir, locale) 
    103  
     162        if env_path: 
     163            plugin_domains = _plugin_domains.get(env_path) 
     164            if plugin_domains: 
     165                for domain, dirname in plugin_domains: 
     166                    dt = Translations.load(dirname, locale, domain) 
     167                    _current.translations.add(dt) 
     168                 
    104169    _null_translations = NullTranslations() 
    105170 
    106171    def get_translations(): 
     
    108173 
    109174    def deactivate(): 
    110175        del _current.translations 
     176     
     177    def add_domain(env_path, domain, locales_dir): 
     178        if env_path not in _plugin_domains: 
     179            _plugin_domains[env_path] = [] 
     180        _plugin_domains[env_path].append((domain, locales_dir)) 
    111181 
    112182    def get_available_locales(): 
    113183        """Return a list of locale identifiers of the locales for which