Software Freedom Law Center

Changeset 106

Show
Ignore:
Timestamp:
05/03/08 21:38:55 (7 months ago)
Author:
bkuhn
Message:

r135@hughes: bkuhn | 2008-05-03 21:34:30 -0400

  • Merged in upstream r7002 with: svk smerge /loblaw/local/branches/trac.upstream-r7002 .
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/trac/setup.cfg

    r46 r106  
    55[bdist_wininst] 
    66bitmap = setup_wininst.bmp 
     7 
     8[extract_messages] 
     9add_comments = TRANSLATOR: 
     10copyright_holder = Edgewall Software 
     11msgid_bugs_address = trac-dev@googlegroups.com 
     12output_file = trac/locale/messages.pot 
     13 
     14[init_catalog] 
     15input_file = trac/locale/messages.pot 
     16output_dir = trac/locale 
     17 
     18[compile_catalog] 
     19directory = trac/locale 
     20 
     21[update_catalog] 
     22input_file = trac/locale/messages.pot 
     23output_dir = trac/locale 
  • trunk/trac/setup.py

    r103 r106  
    1414 
    1515from setuptools import setup, find_packages 
     16 
     17extra = {} 
     18 
     19try: 
     20    import babel 
     21    extra['message_extractors'] = { 
     22        'trac': [ 
     23            ('**.py',                'python', None), 
     24            ('**/templates/**.html', 'genshi', None), 
     25            ('**/templates/**.txt',  'genshi', { 
     26                'template_class': 'genshi.template:TextTemplate' 
     27            }) 
     28        ], 
     29    } 
     30except ImportError: 
     31    pass 
    1632 
    1733setup( 
     
    4561        '': ['templates/*'], 
    4662        'trac': ['htdocs/*.*', 'htdocs/README', 'htdocs/js/*', 'htdocs/css/*', 
    47                  'htdocs/guide/*'], 
     63                 'htdocs/guide/*', 'locale/*.*', 'locale/*/LC_MESSAGES/*.*'], 
    4864        'trac.wiki': ['default-pages/*'], 
    4965        'trac.ticket': ['workflows/*.ini'], 
     
    5773        'Genshi>=0.4.1' 
    5874    ], 
    59  
    6075    extras_require = { 
     76        'Babel': ['Babel>=0.9.2'], 
    6177        'Pygments': ['Pygments>=0.6'], 
    6278        'reST': ['docutils>=0.3'], 
     
    99115        trac.wiki.web_ui = trac.wiki.web_ui 
    100116    """, 
     117 
     118    **extra 
    101119) 
  • trunk/trac/THANKS

    r57 r106  
    1010 * Eli Carter                     eli.carter@commprove.com 
    1111 * Michele Cella 
     12 * Sergey S. Chernov              sergeych@tancher.com 
    1213 * Felix Colins                   felix@keyghost.com 
    1314 * Wesley Crucius                 wcrucius@sandc.com 
     
    2122 * Shun-ichi Goto                 gotoh@taiyo.co.jp 
    2223 * Chris Green                    cmgreen@uab.edu 
     24 * Gruffudd Prys                  cbs201@bangor.ac.uk 
    2325 * Mikael Hallendal               micke@imendio.com 
    2426 * Stephen Hansen                 shansen@advpubtech.com 
     
    2729 * Tim Hatch                      trac@timhatch.com 
    2830 * Michael Hope                   michael.hope@hamjet.co.nz 
     31 * Zheng Hui Hu                   huzhengh@gmail.com 
    2932 * Richard Hult                   richard@imendio.com 
    3033 * Paul Irish                     paul.irishEWWSPAM@gmail.com 
     
    3235 * Waldemar Kornewald             wkornew@gmx.net 
    3336 * Nuutti Kotivuori               naked@iki.fi 
     37 * Jasmin Lapalme 
    3438 * Ian Leader                     ian.leader@line.co.uk 
    3539 * Christopher Lenz               cmlenz@gmx.de 
     40 * Richard Liao 
    3641 * Ivo Looser                     ivo.looser@gmail.com 
    3742 * Rui Lopes                      rgl ruilopes com 
     
    4045 * James Moger                    jamesm@transonic.com 
    4146 * Tim Moloney                    moloney@mrsl.com 
     47 * Ramiro Morales                 cramm0@gmail.com 
     48 * Manuel Muradas 
    4249 * Jennifer Murtell               jen@jmurtell.com 
    4350 * Jacob Norda                    jacobnorda@gmail.com 
     51 * Seungseo Park                  sseopark@gmail.com 
     52 * Jeroen Ruigrok van der Werven  asmodai@in-nomine.org 
    4453 * Juracy Filho                   juracy@gmail.com 
    4554 * Cap Petschulat                 cap@cdres.com 
     
    5968 * Ludvig Strigeus                 
    6069 * Markus Tacker                  m@tacker.org 
     70 * Kim Taedong                    tdkim@unimo.co.kr 
     71 * Kyosuke Takayama               support@mc.neweb.ne.jp 
     72 * Rayentray Tappa 
    6173 * Alec Thomas                    alec@swapoff.org 
    6274 * Jani Tiainen                   redetin@luukku.com 
     75 * Ghassem Tofighi                tofighi@gmail.com 
    6376 * Zilvinas Valinskas             zilvinas@gemtek.lt 
    6477 * Jason Vasquez                  jason@mugfu.com 
     78 * Leslie H. Watter 
    6579 * Jeff Weiss                     trac@jeffweiss.org 
    6680 * Dmitry Yusupov                 dmitry_yus@yahoo.com 
  • trunk/trac/trac/admin/templates/admin_components.html

    r103 r106  
    44<html xmlns="http://www.w3.org/1999/xhtml" 
    55      xmlns:xi="http://www.w3.org/2001/XInclude" 
    6       xmlns:py="http://genshi.edgewall.org/"> 
     6      xmlns:py="http://genshi.edgewall.org/" 
     7      xmlns:i18n="http://genshi.edgewall.org/i18n"> 
    78  <xi:include href="admin.html" /> 
    89  <head> 
     
    3940          <div class="field"> 
    4041            <fieldset class="iefix"> 
    41               <label for="description"
     42              <label for="description" i18n:msg=""
    4243                Description (you may use 
    4344                <a tabindex="42" href="${href.wiki('WikiFormatting')}">WikiFormatting</a> 
  • trunk/trac/trac/admin/templates/admin_milestones.html

    r103 r106  
    44<html xmlns="http://www.w3.org/1999/xhtml" 
    55      xmlns:xi="http://www.w3.org/2001/XInclude" 
    6       xmlns:py="http://genshi.edgewall.org/"> 
     6      xmlns:py="http://genshi.edgewall.org/" 
     7      xmlns:i18n="http://genshi.edgewall.org/i18n"> 
    78  <xi:include href="admin.html" /> 
    89  <head> 
     
    5253          <div class="field"> 
    5354            <fieldset class="iefix"> 
    54               <label for="description"
     55              <label for="description" i18n:msg=""
    5556                Description (you may use <a tabindex="42" href="${href.wiki('WikiFormatting')}">WikiFormatting</a> here): 
    5657              </label> 
  • trunk/trac/trac/admin/templates/admin_versions.html

    r103 r106  
    44<html xmlns="http://www.w3.org/1999/xhtml" 
    55      xmlns:xi="http://www.w3.org/2001/XInclude" 
    6       xmlns:py="http://genshi.edgewall.org/"> 
     6      xmlns:py="http://genshi.edgewall.org/" 
     7      xmlns:i18n="http://genshi.edgewall.org/i18n"> 
    78  <xi:include href="admin.html" /> 
    89  <head> 
     
    3233          <div class="field"> 
    3334            <fieldset class="iefix"> 
    34               <label for="description"
     35              <label for="description" i18n:msg=""
    3536                Description (you may use <a tabindex="42" href="${href.wiki('WikiFormatting')}">WikiFormatting</a> here): 
    3637              </label> 
  • trunk/trac/trac/core.py

    r103 r106  
    3939        self.show_traceback = show_traceback 
    4040 
     41    def __unicode__(self): 
     42        return unicode(self.message) 
    4143 
    4244class Interface(object): 
  • trunk/trac/trac/db/api.py

    r46 r106  
    9595        connector = candidates.get(scheme, [None])[0] 
    9696        if not connector: 
    97             raise TracError('Unsupported database type "%s"' % scheme) 
     97            raise TracError(_('Unsupported database type "%(scheme)s"', 
     98                              scheme=scheme)) 
    9899 
    99100        if scheme == 'sqlite': 
     
    117118            path = rest 
    118119        else: 
    119             raise TracError('Database connection string must start with ' 
    120                             'scheme:/'
     120            raise TracError(_('Database connection string must start with ' 
     121                              'scheme:/')
    121122    else: 
    122123        if not rest.startswith('//'): 
  • trunk/trac/trac/db/mysql_backend.py

    r103 r106  
    146146        vers = tuple([ int(n) for n in cnx.get_server_info().split('.')[:2] ]) 
    147147        if vers < (4, 1): 
    148             raise TracError, 'MySQL servers older than 4.1 are not supported!' 
     148            raise TracError(_('MySQL servers older than 4.1 are not ' 
     149                              'supported!')) 
    149150        cnx.query('SET NAMES %s' % charset) 
    150151        cnx.store_result() 
  • trunk/trac/trac/db/pool.py

    r46 r106  
    105105                    if timeout: 
    106106                        if (time.time() - start) >= timeout: 
    107                             raise TimeoutError('Unable to get database ' 
    108                                                'connection within %d seconds
    109                                                 % timeout
     107                            raise TimeoutError(_('Unable to get database ' 
     108                                                 'connection within %(time)d
     109                                                'seconds', time=timeout)
    110110                        self._available.wait(timeout) 
    111111                    else: # Warning: without timeout, Trac *might* hang 
  • trunk/trac/trac/db/sqlite_backend.py

    r46 r106  
    129129            # make the directory to hold the database 
    130130            if os.path.exists(path): 
    131                 raise TracError('Database already exists at %s' % path) 
     131                raise TracError(_('Database already exists at %(path)s', 
     132                                  path=path)) 
    132133            os.makedirs(os.path.split(path)[0]) 
    133134        if isinstance(path, unicode): # needed with 2.4.0 
     
    156157        if path != ':memory:': 
    157158            if not os.access(path, os.F_OK): 
    158                 raise TracError('Database "%s" not found.' % path
     159                raise TracError(_('Database "%(path)s" not found.', path=path)
    159160 
    160161            dbdir = os.path.dirname(path) 
     
    162163                   not os.access(dbdir, os.R_OK + os.W_OK): 
    163164                from getpass import getuser 
    164                 raise TracError('The user %s requires read _and_ write ' \ 
    165                                 'permission to the database file %s and the ' \ 
    166                                 'directory it is located in.' \ 
    167                                 % (getuser(), path)) 
     165                raise TracError(_('The user %(user)s requires read _and_ write ' 
     166                                  'permission to the database file %(path)s ' 
     167                                  'and the directory it is located in.', 
     168                                  user=getuser(), path=path)) 
    168169 
    169170        if have_pysqlite == 2: 
  • trunk/trac/trac/mimeview/tests/patch.py

    r46 r106  
    3232        env = EnvironmentStub(enable=[Chrome, PatchRenderer]) 
    3333        req = Mock(base_path='',chrome={}, args={}, 
    34                    abs_href=Href('/'), href=Href('/'), 
     34                   abs_href=Href('/'), href=Href('/'), locale='', 
    3535                   perm=MockPerm(), authname=None, tz=None) 
    3636        self.context = Context.from_request(req) 
  • trunk/trac/trac/prefs/templates/prefs_datetime.html

    r57 r106  
    3535      <p class="hint"> 
    3636        Note: Universal Co-ordinated Time (UTC) is also known as Greenwich Mean Time (GMT). <br /> 
    37         A positive offset is used to indicate a timezone at the east of Greenwhich, i.e. ahead of Universal Time. 
     37        A positive offset is used to indicate a timezone at the east of Greenwich, i.e. ahead of Universal Time. 
    3838      </p> 
    3939 
  • trunk/trac/trac/prefs/web_ui.py

    r103 r106  
    1919import re 
    2020 
     21try: 
     22    from babel.core import Locale 
     23except ImportError: 
     24    Locale = None 
     25 
    2126from genshi.builder import tag 
    2227 
    2328from trac.core import * 
    2429from trac.prefs.api import IPreferencePanelProvider 
     30from trac.util.compat import sorted 
    2531from trac.util.datefmt import all_timezones, get_timezone, localtz 
    26 from trac.util.translation import _ 
     32from trac.util.translation import _, get_available_locales 
    2733from trac.web import HTTPNotFound, IRequestHandler 
    2834from trac.web.chrome import add_stylesheet, INavigationContributor, \ 
     
    3743               IRequestHandler, ITemplateProvider) 
    3844 
    39     _form_fields = ['newsid', 'name', 'email', 'tz', 'accesskeys'] 
     45    _form_fields = ['newsid', 'name', 'email', 'tz', 'language', 'accesskeys'] 
    4046 
    4147    # INavigationContributor methods 
     
    8086 
    8187    def get_preference_panels(self, req): 
     88        global Locale 
    8289        yield (None, _('General')) 
    8390        yield ('datetime', _('Date & Time')) 
    8491        yield ('keybindings', _('Keyboard Shortcuts')) 
     92        if Locale: 
     93            yield ('language', _('Language')) 
    8594        if not req.authname or req.authname == 'anonymous': 
    8695            yield ('advanced', _('Advanced')) 
    8796 
    8897    def render_preference_panel(self, req, panel): 
     98        global Locale 
    8999        if req.method == 'POST': 
    90100            if 'restore' in req.args: 
     
    94104            req.redirect(req.href.prefs(panel or None)) 
    95105 
    96         return 'prefs_%s.html' % (panel or 'general'),
     106        data =
    97107            'settings': {'session': req.session, 'session_id': req.session.sid}, 
    98108            'timezones': all_timezones, 'timezone': get_timezone, 
    99109            'localtz': localtz 
    100110        } 
     111 
     112        if Locale: 
     113            locales = map(Locale.parse, get_available_locales()) 
     114            languages = sorted([(str(locale).replace('_','-'), 
     115                                 locale.display_name) for locale in locales]) 
     116            data['locales'] = locales 
     117            data['languages'] = languages 
     118 
     119        return 'prefs_%s.html' % (panel or 'general'), data 
    101120 
    102121    # ITemplateProvider methods 
  • trunk/trac/trac/resource.py

    r103 r106  
    314314    >>> main = Resource('generic', 'Main') 
    315315    >>> get_resource_description(env, main) 
    316     'generic:Main' 
     316    u'generic:Main' 
    317317     
    318318    >>> get_resource_description(env, main(version=3)) 
    319     'generic:Main' 
     319    u'generic:Main' 
    320320 
    321321    >>> get_resource_description(env, main(version=3), format='summary') 
    322     'generic:Main at version 3' 
     322    u'generic:Main at version 3' 
    323323     
    324324    """ 
    325325    manager = ResourceSystem(env).get_resource_manager(resource.realm) 
    326326    if not manager or not hasattr(manager, 'get_resource_description'): 
    327         name = '%s:%s' % (resource.realm, resource.id) 
     327        name = u'%s:%s' % (resource.realm, resource.id) 
    328328        if format == 'summary': 
    329329            name += _(' at version %(version)s', version=resource.version) 
  • trunk/trac/trac/ticket/admin.py

    r103 r106  
    8585                        req.redirect(req.href.admin(cat, page)) 
    8686                    else: 
    87                         raise TracError(_('Component %s already exists.') % name) 
     87                        raise TracError(_('Component %(name)s already exists.', 
     88                                          name=name)) 
    8889 
    8990                # Remove components 
     
    180181                        req.redirect(req.href.admin(cat, page)) 
    181182                    else: 
    182                         raise TracError(_('Milestone %s already exists.') % name) 
     183                        raise TracError(_('Milestone %(name)s already exists.', 
     184                                          name=name)) 
    183185 
    184186                # Remove milestone 
     
    259261                        req.redirect(req.href.admin(cat, page)) 
    260262                    else: 
    261                         raise TracError(_('Version %s already exists.') % name) 
     263                        raise TracError(_('Version %(name)s already exists.', 
     264                                          name=name)) 
    262265                          
    263266                # Remove versions 
     
    337340                        req.redirect(req.href.admin(cat, page)) 
    338341                    else: 
    339                         raise TracError(_('%s %s already exists') % (self._type.title(), name)) 
     342                        raise TracError(_('%(type)s %(name)s already exists', 
     343                                          type=self._type.title(), name=name)) 
    340344                          
    341345                # Remove enums 
  • trunk/trac/trac/ticket/default_workflow.py

    r103 r106  
    178178        allowed_actions = [] 
    179179        for action_name, action_info in self.actions.items(): 
    180             if 'hidden' in action_info['operations']: 
    181                 continue 
    182180            oldstates = action_info['oldstates'] 
    183181            if oldstates == ['*'] or status in oldstates: 
     
    251249                control.append(tag('to %s ' % owners[0])) 
    252250                if ticket['owner'] != owners[0]: 
    253                     hints.append(_("The owner will change to %s") % owners[0]) 
     251                    hints.append(_("The owner will change to %(name)s", 
     252                                   name=owners[0])) 
    254253            else: 
    255254                control.append(tag([_("to "), tag.select( 
     
    260259        if 'set_owner_to_self' in operations and \ 
    261260            ticket['owner'] != req.authname: 
    262             hints.append(_("The owner will change to %s") % req.authname) 
     261            hints.append(_("The owner will change to %(name)s", 
     262                           name=req.authname)) 
    263263        if 'set_resolution' in operations: 
    264264            if this_action.has_key('set_resolution'): 
     
    271271            if len(resolutions) == 1: 
    272272                control.append(tag('as %s' % resolutions[0])) 
    273                 hints.append(_("The resolution will be set to %s") % 
    274                              resolutions[0]
     273                hints.append(_("The resolution will be set to %(name)s", 
     274                               name=resolutions[0])
    275275            else: 
    276276                id = action + '_resolve_resolution' 
     
    286286        else: 
    287287            if status != '*': 
    288                 hints.append(_("Next status will be '%s'") % status
     288                hints.append(_("Next status will be '%(name)s'", name=status)
    289289        return (this_action['name'], tag(*control), '. '.join(hints)) 
    290290 
     
    327327                updated['resolution'] = newresolution 
    328328 
    329             # leave_status and hidden are just no-ops here, so we don't look 
    330             # for them. 
     329            # leave_status is just a no-op here, so we don't look for it. 
    331330        return updated 
    332331 
     
    362361 
    363362        If state='*' (the default), all actions with the given operation are 
    364         returned (including those that are 'hidden')
     363        returned
    365364        """ 
    366365        actions = [(info['default'], action) for action, info 
  • trunk/trac/trac/ticket/model.py

    r103 r106  
    360360            if not row: 
    361361                raise ResourceNotFound(_('%(type)s %(name)s does not exist.', 
    362                                   type=self.type, name=name)) 
     362                                         type=self.type, name=name)) 
    363363            self.value = self._old_value = row[0] 
    364364            self.name = self._old_name = name 
     
    504504            if not row: 
    505505                raise ResourceNotFound(_('Component %(name)s does not exist.', 
    506                                   name=name)) 
     506                                         name=name)) 
    507507            self.name = self._old_name = name 
    508508            self.owner = row[0] or None 
     
    734734            if not row: 
    735735                raise ResourceNotFound(_('Version %(name)s does not exist.', 
    736                                   name=name)) 
     736                                         name=name)) 
    737737            self.name = self._old_name = name 
    738738            self.time = row[0] and datetime.fromtimestamp(int(row[0]), utc) or None 
  • trunk/trac/trac/ticket/roadmap.py

    r103 r106  
    426426                write_utctime('DTSTAMP', milestone.due) 
    427427                write_date('DTSTART', milestone.due) 
    428                 write_prop('SUMMARY', _('Milestone %(name)s') % { 
    429                     'name': milestone.name 
    430                 }) 
     428                write_prop('SUMMARY', _('Milestone %(name)s', 
     429                                        name=milestone.name)) 
    431430                write_prop('URL', req.base_url + '/milestone/' + 
    432431                           milestone.name) 
     
    446445                    write_prop('RELATED-TO', uid) 
    447446                    write_date('DUE', milestone.due) 
    448                 write_prop('SUMMARY', _('Ticket #%(num)s: %(summary)s') % { 
    449                     'num': ticket.id, 'summary': ticket['summary'] 
    450                 }
     447                write_prop('SUMMARY', _('Ticket #%(num)s: %(summary)s', 
     448                                        num=ticket.id, 
     449                                        summary=ticket['summary'])
    451450                write_prop('URL', req.abs_href.ticket(ticket.id)) 
    452451                write_prop('DESCRIPTION', ticket['description']) 
  • trunk/trac/trac/ticket/templates/milestone_edit.html

    r103 r106  
    44<html xmlns="http://www.w3.org/1999/xhtml" 
    55      xmlns:py="http://genshi.edgewall.org/" 
     6      xmlns:i18n="http://genshi.edgewall.org/i18n" 
    67      xmlns:xi="http://www.w3.org/2001/XInclude"> 
    78  <xi:include href="layout.html" /> 
     
    7980        <div class="field"> 
    8081          <fieldset class="iefix"> 
    81             <label for="description">Description (you may use <a tabindex="42" 
     82            <label for="description" i18n:msg="">Description (you may use <a tabindex="42" 
    8283                   href="${href.wiki('WikiFormatting')}">WikiFormatting</a> here):</label> 
    8384            <p><textarea id="description" name="description" class="wikitext" rows="10" cols="78"> 
  • trunk/trac/trac/ticket/templates/report_edit.html

    r103 r106  
    44<html xmlns="http://www.w3.org/1999/xhtml" 
    55      xmlns:py="http://genshi.edgewall.org/" 
     6      xmlns:i18n="http://genshi.edgewall.org/i18n" 
    67      xmlns:xi="http://www.w3.org/2001/XInclude"> 
    78  <xi:include href="layout.html" /> 
     
    2223          </div> 
    2324          <div class="field"> 
    24             <label for="description"
     25            <label for="description" i18n:msg=""
    2526              Description: (you may use <a tabindex="42" href="${href.wiki('WikiFormatting')}">WikiFormatting</a> here) 
    2627            </label> 
  • trunk/trac/trac/ticket/templates/ticket.html

    r103 r106  
    33    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
    44<html xmlns="http://www.w3.org/1999/xhtml" 
     5      xmlns:xi="http://www.w3.org/2001/XInclude" 
    56      xmlns:py="http://genshi.edgewall.org/" 
    6       xmlns:xi="http://www.w3.org/2001/XInclude"> 
     7      xmlns:i18n="http://genshi.edgewall.org/i18n"> 
    78  <xi:include href="layout.html" /> 
    89  <xi:include href="macros.html" /> 
     
    257258        <div py:if="ticket.exists" class="field"> 
    258259          <fieldset class="iefix"> 
    259             <label for="comment">Comment (you may use 
     260            <label for="comment" i18n:msg="">Comment (you may use 
    260261              <a tabindex="42" href="${href.wiki('WikiFormatting')}">WikiFormatting</a> 
    261262              here): 
  • trunk/trac/trac/ticket/tests/conversion.py

    r46 r106  
    2424                        abs_href=Href('http://example.org/trac.cgi'), 
    2525                        environ={}, perm=[], authname='-', args={}, tz=None, 
    26                         session=None, form_token=None) 
     26                        locale='', session=None, form_token=None) 
    2727 
    2828    def _create_a_ticket(self): 
  • trunk/trac/trac/util/translation.py

    r103 r106  
    1212# history and logs, available at http://trac.edgewall.org/log/. 
    1313