diff --exclude=.svn -Naur trac-0.10.4/AUTHORS trac-0.10.4-PKG/AUTHORS
--- trac-0.10.4/AUTHORS	2007-04-20 15:41:52.000000000 +0200
+++ trac-0.10.4-PKG/AUTHORS	2007-08-24 09:32:19.000000000 +0200
@@ -1,4 +1,4 @@
- * Jonas Borgström <jonas@edgewall.com>
+ * Jonas BorgstrÃ¶m <jonas@edgewall.com>
  * Daniel Lundin <daniel@edgewall.com>
  * Rocky Burt <rocky@carterscove.com>
  * Christopher Lenz <cmlenz@gmx.de>
@@ -6,7 +6,7 @@
  * Mark Rowe <trac@bdash.net.nz> 
  * Matthew Good <trac@matt-good.net>
  * Christian Boos <cboos@neuf.fr>
- * Emmanual Blot <emmanuel.blot@free.fr>
+ * Emmanuel Blot <emmanuel.blot@free.fr>
  * Alec Thomas <alec@swapoff.org>
 
 See also THANKS for people who have contributed to the project.
diff --exclude=.svn -Naur trac-0.10.4/cgi-bin/trac.cgi trac-0.10.4-PKG/cgi-bin/trac.cgi
--- trac-0.10.4/cgi-bin/trac.cgi	2007-04-20 15:41:52.000000000 +0200
+++ trac-0.10.4-PKG/cgi-bin/trac.cgi	2007-08-24 09:32:19.000000000 +0200
@@ -28,10 +28,10 @@
     traceback.print_exc(file=sys.stderr)
 
     print 'Status: 500 Internal Server Error'
-    print 'Content-Type: text/plain'
+    print 'Content-Type: text/plain;charset=utf-8\r\n\r\n'
     print
-    print 'Oops...'
+    print 'Aie...'
     print
-    print 'Trac detected an internal error:', e
+    print 'Trac a dÃ©tectÃ© une erreur interne:', e
     print
     traceback.print_exc(file=sys.stdout)
diff --exclude=.svn -Naur trac-0.10.4/cgi-bin/trac.fcgi trac-0.10.4-PKG/cgi-bin/trac.fcgi
--- trac-0.10.4/cgi-bin/trac.fcgi	2007-04-20 15:41:52.000000000 +0200
+++ trac-0.10.4-PKG/cgi-bin/trac.fcgi	2007-08-24 09:32:19.000000000 +0200
@@ -21,10 +21,10 @@
 except SystemExit:
     raise
 except Exception, e:
-    print 'Content-Type: text/plain\r\n\r\n',
-    print 'Oops...'
+    print 'Content-Type: text/plain;charset=utf-8\r\n\r\n',
+    print 'Aie...'
     print
-    print 'Trac detected an internal error:'
+    print 'Trac a dÃ©tectÃ© une erreur interne :'
     print
     print e
     print
diff --exclude=.svn -Naur trac-0.10.4/htdocs/css/trac.css trac-0.10.4-PKG/htdocs/css/trac.css
--- trac-0.10.4/htdocs/css/trac.css	2007-04-20 15:41:41.000000000 +0200
+++ trac-0.10.4-PKG/htdocs/css/trac.css	2007-08-27 16:41:34.000000000 +0200
@@ -63,7 +63,7 @@
   background: url(../extlink.gif) left center no-repeat;
   padding-left: 16px;
  }
- * html a.ext-link .icon { display: inline-block; }
+ * html a.ext-link .icon { display: inline; }
 }
 
 /* Forms */
@@ -99,7 +99,7 @@
 .buttons { margin: .5em .5em .5em 0 }
 .buttons form, .buttons form div { display: inline }
 .buttons input { margin: 1em .5em .1em 0 }
-.inlinebuttons input { 
+.inlinebuttons input {
  font-size: 70%;
  border-width: 1px;
  border-style: dotted;
@@ -316,12 +316,12 @@
  overflow: auto;
 }
 
-blockquote.citation { 
+blockquote.citation {
  margin: -0.6em 0;
- border-style: solid; 
- border-width: 0 0 0 2px; 
+ border-style: solid;
+ border-width: 0 0 0 2px;
  padding-left: .5em;
- border-color: #b44; 
+ border-color: #b44;
 }
 .citation blockquote.citation { border-color: #4b4; }
 .citation .citation blockquote.citation { border-color: #44b; }
diff --exclude=.svn -Naur trac-0.10.4/htdocs/js/query.js trac-0.10.4-PKG/htdocs/js/query.js
--- trac-0.10.4/htdocs/js/query.js	2007-04-20 15:41:42.000000000 +0200
+++ trac-0.10.4-PKG/htdocs/js/query.js	2007-08-21 11:27:21.000000000 +0200
@@ -106,7 +106,7 @@
     if (select.options[select.selectedIndex].disabled) {
       // Neither IE nor Safari supported disabled options at the time this was
       // written, so alert the user
-      alert("A filter already exists for that property");
+      alert("Un filtre existe dÃ©jÃ  pour cette propriÃ©tÃ©");
       return;
     }
 
diff --exclude=.svn -Naur trac-0.10.4/htdocs/js/wikitoolbar.js trac-0.10.4-PKG/htdocs/js/wikitoolbar.js
--- trac-0.10.4/htdocs/js/wikitoolbar.js	2007-04-20 15:41:42.000000000 +0200
+++ trac-0.10.4-PKG/htdocs/js/wikitoolbar.js	2007-08-24 09:32:19.000000000 +0200
@@ -48,28 +48,28 @@
     }
   }
 
-  addButton("strong", "Bold text: '''Example'''", function() {
+  addButton("strong", "Texte gras: '''Exemple'''", function() {
     encloseSelection("'''", "'''");
   });
-  addButton("em", "Italic text: ''Example''", function() {
+  addButton("em", "Texte italique: ''Exemple''", function() {
     encloseSelection("''", "''");
   });
-  addButton("heading", "Heading: == Example ==", function() {
+  addButton("heading", "En-tÃªte: == Exemple ==", function() {
     encloseSelection("\n== ", " ==\n", "Heading");
   });
-  addButton("link", "Link: [http://www.example.com/ Example]", function() {
+  addButton("link", "Lien: [http://www.exemple.com/ Exemple]", function() {
     encloseSelection("[", "]");
   });
-  addButton("code", "Code block: {{{ example }}}", function() {
+  addButton("code", "Bloc de code: {{{ exemple }}}", function() {
     encloseSelection("\n{{{\n", "\n}}}\n");
   });
-  addButton("hr", "Horizontal rule: ----", function() {
+  addButton("hr", "SÃ©parateur horizontal: ----", function() {
     encloseSelection("\n----\n", "");
   });
-  addButton("np", "New paragraph", function() {
+  addButton("np", "Nouveau paragraphe", function() {
     encloseSelection("\n\n", "");
   });
-  addButton("br", "Line break: [[BR]]", function() {
+  addButton("br", "Retour Ã  la ligne: [[BR]]", function() {
     encloseSelection("[[BR]]\n", "");
   });
 
diff --exclude=.svn -Naur trac-0.10.4/scripts/trac-admin trac-0.10.4-PKG/scripts/trac-admin
--- trac-0.10.4/scripts/trac-admin	2007-04-20 15:41:44.000000000 +0200
+++ trac-0.10.4-PKG/scripts/trac-admin	2007-08-21 11:32:53.000000000 +0200
@@ -1,10 +1,10 @@
 #!/usr/bin/env python
-# -*- coding: iso8859-1 -*-
-__author__ = 'Daniel Lundin <daniel@edgewall.com>, Jonas Borgström <jonas@edgewall.com>'
+# -*- coding: utf-8 -*-
+__author__ = 'Daniel Lundin <daniel@edgewall.com>, Jonas BorgstrÃ¶m <jonas@edgewall.com>'
 __copyright__ = 'Copyright (c) 2005 Edgewall Software'
 __license__ = """
  Copyright (C) 2003, 2004, 2005 Edgewall Software
- Copyright (C) 2003, 2004 Jonas Borgström <jonas@edgewall.com>
+ Copyright (C) 2003, 2004 Jonas BorgstrÃ¶m <jonas@edgewall.com>
  Copyright (C) 2003, 2004 Daniel Lundin <daniel@edgewall.com>
  All rights reserved.
 
diff --exclude=.svn -Naur trac-0.10.4/scripts/tracd trac-0.10.4-PKG/scripts/tracd
--- trac-0.10.4/scripts/tracd	2007-04-20 15:41:44.000000000 +0200
+++ trac-0.10.4-PKG/scripts/tracd	2007-08-21 11:33:27.000000000 +0200
@@ -1,8 +1,8 @@
 #!/usr/bin/env python
-# -*- coding: iso8859-1 -*-
+# -*- coding: utf-8 -*-
 #
 # Copyright (C) 2003-2006 Edgewall Software
-# Copyright (C) 2003-2005 Jonas Borgström <jonas@edgewall.com>
+# Copyright (C) 2003-2005 Jonas BorgstrÃ¶m <jonas@edgewall.com>
 # All rights reserved.
 #
 # This software is licensed as described in the file COPYING, which
@@ -13,7 +13,7 @@
 # individuals. For the exact contribution history, see the revision
 # history and logs, available at http://trac.edgewall.org/log/.
 #
-# Author: Jonas Borgström <jonas@edgewall.com>
+# Author: Jonas BorgstrÃ¶m <jonas@edgewall.com>
 
 if __name__ == '__main__':
     from trac.web.standalone import main
diff --exclude=.svn -Naur trac-0.10.4/templates/about.cs trac-0.10.4-PKG/templates/about.cs
--- trac-0.10.4/templates/about.cs	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/templates/about.cs	2007-08-24 09:32:19.000000000 +0200
@@ -1,14 +1,14 @@
 <?cs include "header.cs"?>
 <div id="ctxtnav" class="nav">
- <h2>About Navigation</h2>
+ <h2>Ã€ propos de la navigation</h2>
  <ul>
   <li class="first<?cs if:!about.config_href ?> last<?cs /if ?>"><a href="<?cs
-    var:trac.href.about ?>">Overview</a></li><?cs
+    var:trac.href.about ?>">RÃ©sumÃ©</a></li><?cs
   if:about.config_href ?>
    <li><a href="<?cs var:about.config_href ?>">Configuration</a></li><?cs
   /if ?><?cs
   if:about.plugins_href ?>
-   <li class="last"><a href="<?cs var:about.plugins_href ?>">Plugins</a></li><?cs
+   <li class="last"><a href="<?cs var:about.plugins_href ?>">Extensions</a></li><?cs
   /if ?>
  </ul>
 </div>
@@ -17,7 +17,7 @@
  <?cs if:about.page == "config"?>
   <h1>Configuration</h1>
   <table><thead><tr><th class="section">Section</th>
-   <th class="name">Name</th><th class="value">Value</th></tr></thead><?cs
+   <th class="name">Nom</th><th class="value">Valeur</th></tr></thead><?cs
   each:section = about.config ?><?cs
    if:len(section.options) ?>
     <tr><th class="section" rowspan="<?cs var:len(section.options) ?>"><?cs var:section.name ?></th><?cs
@@ -29,12 +29,12 @@
    /if ?><?cs
   /each ?></table>
   <div id="help">
-   See <a href="<?cs var:trac.href.wiki ?>/TracIni">TracIni</a> for information about
-   the configuration.
+   Voir <a href="<?cs var:trac.href.wiki ?>/TracIni">TracIni</a> pour obtenir des
+   informations sur la configuration.
   </div>
 
  <?cs elif:about.page == "plugins" ?>
-  <h1>Plugins</h1>
+  <h1>Extensions</h1>
   <dl id="plugins"><?cs
    each:plugin = about.plugins ?>
     <h2 id="<?cs var:plugin.module ?>.<?cs var:plugin.name ?>"><?cs var:plugin.name ?></h2>
@@ -50,7 +50,7 @@
      </tr><?cs /if ?><?cs
      if:len(plugin.extension_points) ?><tr>
       <th class="xtnpts" rowspan="<?cs var:len(plugin.extension_points) ?>">
-       Extension points:</th><?cs
+       Points d'extension:</th><?cs
        each:extension_point = plugin.extension_points ?><?cs
         if:name(extension_point) != 0 ?><tr><?cs /if ?>
         <td class="xtnpts">        
@@ -75,20 +75,20 @@
    <img style="display: block" src="<?cs var:chrome.href ?>/common/trac_banner.png"
      alt="Trac: Integrated SCM &amp; Project Management"/>
   </a>
-  <h1>About Trac <?cs var:trac.version ?></h1>
-  <p>Trac is a web-based software project management and bug/issue tracking
-  system emphasizing ease of use and low ceremony. It provides an integrated
-  Wiki, an interface to version control systems, and a number convenient ways
-  to stay on top of events and changes within a project.</p>
-  <p>Trac is distributed under the modified BSD License. The complete text of
-  the license can be found
-  <a href="http://trac.edgewall.org/wiki/TracLicense">online</a> as well as in
-  the <tt>COPYING</tt> file included in the distribution.</p>
+  <h1>Ã€ propos de Trac <?cs var:trac.version ?></h1>
+  <p>Trac est un systÃ¨me de gestion de projet logiciel et de suivi de dÃ©fauts/bogues via le
+  Web, qui met l'accent sur la facilitÃ© d'utilisation et Ã©vite les chichis.
+  Il propose une interface pour le systÃ¨me de contrÃ´le de source Subversion, un 
+  Wiki intÃ©grÃ©, et un nombre intÃ©ressant d'option permettant de rester au courant des Ã©vÃ¨nements et
+  changements d'un projet.</p>
+  <p>Trac est distribuÃ© sous une licence BSD modifiÃ©e. Le texte entier de la licence peut Ãªtre consultÃ©
+  <a href="http://trac.edgewall.org/wiki/TracLicense">en ligne</a> aussi bien que dans le fichier
+  <tt>COPYING</tt> inclus dans cette distribution.</p>
   <a href="http://www.python.org/" style="border: none; float: right">
    <img style="display: block" src="<?cs var:htdocs_location ?>python.png"
      alt="python powered" width="140" height="56" />
   </a>
-  <p>Please visit the Trac open source project at
+  <p>Merci de consulter le projet open source Trac 
   <a href="http://trac.edgewall.org/">http://trac.edgewall.org/</a>.</p>
   <p>Copyright &copy; 2003-2006 <a href="http://www.edgewall.org/">Edgewall
   Software</a></p>
diff --exclude=.svn -Naur trac-0.10.4/templates/anydiff.cs trac-0.10.4-PKG/templates/anydiff.cs
--- trac-0.10.4/templates/anydiff.cs	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/templates/anydiff.cs	2007-08-24 09:33:31.000000000 +0200
@@ -4,41 +4,42 @@
 
 <div id="content" class="changeset">
  <div id="title">
-    <h1>Select Base and Target for Diff:</h1>
+    <h1>SÃ©lectionnez la base et la cible pour les diffÃ©rences :</h1>
  </div>
 
  <div id="anydiff">
   <form action="<?cs var:anydiff.changeset_href ?>" method="get">
    <table>
     <tr>
-     <th><label for="old_path">From:</label></th>
+     <th><label for="old_path">De :</label></th>
      <td>
       <input type="text" id="old_path" name="old_path" value="<?cs
          var:anydiff.old_path ?>" size="44" />
-      <label for="old_rev">at Revision:</label>
+      <label for="old_rev">Ã  la rÃ©vision :</label>
       <input type="text" id="old_rev" name="old" value="<?cs
          var:anydiff.old_rev ?>" size="4" />
      </td>
     </tr>
     <tr>
-     <th><label for="new_path">To:</label></th>
+     <th><label for="new_path">Ã€ :</label></th>
      <td>
       <input type="text" id="new_path" name="new_path" value="<?cs
          var:anydiff.new_path ?>" size="44" />
-      <label for="new_rev">at Revision:</label>
+      <label for="new_rev">Ã  la rÃ©vision:</label>
       <input type="text" id="new_rev" name="new" value="<?cs
          var:anydiff.new_rev ?>" size="4" />
      </td>
     </tr>
    </table>
    <div class="buttons">
-      <input type="submit" value="View changes" />
+      <input type="submit" value="Afficher les modifications" />
    </div>
   </form>
  </div>
  <div id="help">
-  <strong>Note:</strong> See <a href="<?cs var:trac.href.wiki
-  ?>/TracChangeset#ExaminingDifferencesBetweenBranches">TracChangeset</a> for help on using the arbitrary diff feature.
+  <strong>Remarque :</strong> Consultez la page <a href="<?cs var:trac.href.wiki
+  ?>/TracChangeset#ExaminingDifferencesBetweenBranches">TracChangeset</a> pour plus d'informations
+  sur l'utilisation de la fonction de diffÃ©rence.
  </div>
 </div>
 
diff --exclude=.svn -Naur trac-0.10.4/templates/attachment.cs trac-0.10.4-PKG/templates/attachment.cs
--- trac-0.10.4/templates/attachment.cs	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/templates/attachment.cs	2007-08-24 09:44:59.000000000 +0200
@@ -6,29 +6,29 @@
 <div id="content" class="attachment">
 
 <?cs if:attachment.mode == 'new' ?>
- <h1>Add Attachment to <a href="<?cs var:attachment.parent.href?>"><?cs
+ <h1>Joindre un fichier Ã  <a href="<?cs var:attachment.parent.href?>"><?cs
    var:attachment.parent.name ?></a></h1>
  <form id="attachment" method="post" enctype="multipart/form-data" action="">
   <div class="field">
-   <label>File:<br /><input type="file" name="attachment" /></label>
+   <label>Fichier:<br /><input type="file" name="attachment" /></label>
   </div>
   <fieldset>
-   <legend>Attachment Info</legend>
+   <legend>Info sur le fichier</legend>
    <?cs if:trac.authname == "anonymous" ?>
     <div class="field">
-     <label>Your email or username:<br />
+     <label>Votre courriel ou nom d'utilisateur:<br />
      <input type="text" name="author" size="30" value="<?cs
        var:attachment.author?>" /></label>
     </div>
    <?cs /if ?>
    <div class="field">
-    <label>Description of the file (optional):<br />
+    <label>Description (optionnelle) du fichier:<br />
     <input type="text" name="description" size="60" /></label>
    </div>
    <br />
    <div class="options">
     <label><input type="checkbox" name="replace" />
-    Replace existing attachment of the same name</label>
+    Remplacer une piÃ¨ce jointe existante portant le mÃªme nom</label>
    </div>
    <br />
   </fieldset>
@@ -36,20 +36,20 @@
    <input type="hidden" name="action" value="new" />
    <input type="hidden" name="type" value="<?cs var:attachment.parent.type ?>" />
    <input type="hidden" name="id" value="<?cs var:attachment.parent.id ?>" />
-   <input type="submit" value="Add attachment" />
-   <input type="submit" name="cancel" value="Cancel" />
+   <input type="submit" value="Joindre" />
+   <input type="submit" name="cancel" value="Annuler" />
   </div>
  </form>
 <?cs elif:attachment.mode == 'delete' ?>
  <h1><a href="<?cs var:attachment.parent.href ?>"><?cs
    var:attachment.parent.name ?></a>: <?cs var:attachment.filename ?></h1>
- <p><strong>Are you sure you want to delete this attachment?</strong><br />
- This is an irreversible operation.</p>
+ <p><strong>Etes-vous sÃ»r de vouloir supprimer ce fichier ?</strong><br />
+ Cette opÃ©ration est irrÃ©versible.</p>
  <div class="buttons">
   <form method="post" action=""><div id="delete">
    <input type="hidden" name="action" value="delete" />
-   <input type="submit" name="cancel" value="Cancel" />
-   <input type="submit" value="Delete attachment" />
+   <input type="submit" name="cancel" value="Annuler" />
+   <input type="submit" value="Supprimer le fichier" />
   </div></form>
  </div>
 <?cs elif:attachment.mode == 'list' ?>
@@ -62,7 +62,7 @@
  <table id="info" summary="Description"><tbody><tr>
    <th scope="col">
     File <?cs var:attachment.filename ?>, <?cs var:attachment.size ?> 
-    (added by <?cs var:attachment.author ?>,  <?cs var:attachment.age ?> ago)
+    (ajoÃ»tÃ© par <?cs var:attachment.author ?>, <?cs var:attachment.age ?> auparavant)
    </th></tr><tr>
    <td class="message"><?cs var:attachment.description ?></td>
   </tr>
@@ -71,18 +71,18 @@
   if:attachment.preview ?>
    <?cs var:attachment.preview ?><?cs
   elif:attachment.max_file_size_reached ?>
-   <strong>HTML preview not available</strong>, since the file size exceeds
-   <?cs var:attachment.max_file_size  ?> bytes. You may <a href="<?cs
-     var:attachment.raw_href ?>">download the file</a> instead.<?cs
-  else ?>
-   <strong>HTML preview not available</strong>. To view the file,
-   <a href="<?cs var:attachment.raw_href ?>">download the file</a>.<?cs
+   <strong>PrÃ©visualisation HTML impossible</strong>, car la taille du fichier 
+   dÃ©passe <?cs var:attachment.max_file_size  ?> octets. En revanche, vous 
+   pouvez <a href="<?cs var:attachment.raw_href ?>">tÃ©lÃ©charger</a> le fichier.
+   <?cs else ?>
+   <strong>PrÃ©visualisation HTML impossible</strong>. Pour voir son contenu,
+   <a href="<?cs var:attachment.raw_href ?>">tÃ©lÃ©charge le fichier</a>.<?cs
   /if ?>
  </div>
  <?cs if:attachment.can_delete ?><div class="buttons">
   <form method="get" action=""><div id="delete">
    <input type="hidden" name="action" value="delete" />
-   <input type="submit" value="Delete attachment" />
+   <input type="submit" value="Supprimer le fichier" />
   </div></form>
  </div><?cs /if ?>
 <?cs /if ?>
diff --exclude=.svn -Naur trac-0.10.4/templates/browser.cs trac-0.10.4-PKG/templates/browser.cs
--- trac-0.10.4/templates/browser.cs	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/templates/browser.cs	2007-08-24 09:44:59.000000000 +0200
@@ -4,9 +4,9 @@
 <div id="ctxtnav" class="nav">
  <ul>
   <li class="first"><a href="<?cs var:browser.restr_changeset_href ?>">
-   Last Change</a></li>
+   DerniÃ¨res modifications</a></li>
   <li class="last"><a href="<?cs var:browser.log_href ?>">
-   Revision Log</a></li>
+   Historique des rÃ©visions</a></li>
  </ul>
 </div>
 
@@ -18,7 +18,7 @@
  <div id="jumprev">
   <form action="" method="get">
    <div>
-    <label for="rev">View revision:</label>
+    <label for="rev">Voir la rÃ©vision:</label>
     <input type="text" id="rev" name="rev" value="<?cs
        var:browser.revision ?>" size="4" />
    </div>
@@ -28,8 +28,8 @@
  <?cs def:sortable_th(order, desc, class, title, href) ?>
  <th class="<?cs var:class ?><?cs if:order == class ?> <?cs
    if:desc ?>desc<?cs else ?>asc<?cs /if ?><?cs /if ?>">
-  <a title="Sort by <?cs var:class ?><?cs
-    if:order == class && !desc ?> (descending)<?cs /if ?>" 
+  <a title="Trier par <?cs var:class ?><?cs
+    if:order == class && !desc ?> (dÃ©croissant)<?cs /if ?>" 
      href="<?cs var:href[class] ?>"><?cs var:title ?></a>
  </th>
  <?cs /def ?>
@@ -38,18 +38,18 @@
   <table class="listing" id="dirlist">
    <thead>
     <tr><?cs 
-     call:sortable_th(browser.order, browser.desc, 'name', 'Name', browser.order_href) ?><?cs 
-     call:sortable_th(browser.order, browser.desc, 'size', 'Size', browser.order_href) ?>
-     <th class="rev">Rev</th><?cs 
+     call:sortable_th(browser.order, browser.desc, 'name', 'Nom', browser.order_href) ?><?cs 
+     call:sortable_th(browser.order, browser.desc, 'size', 'Taille', browser.order_href) ?>
+     <th class="rev">RÃ©v</th><?cs 
      call:sortable_th(browser.order, browser.desc, 'date', 'Age', browser.order_href) ?>
-     <th class="change">Last Change</th>
+     <th class="change">DerniÃ¨re modification</th>
     </tr>
    </thead>
    <tbody>
     <?cs if:len(chrome.links.up) ?>
      <tr class="even">
       <td class="name" colspan="5">
-       <a class="parent" title="Parent Directory" href="<?cs
+       <a class="parent" title="RÃ©pertoire parent" href="<?cs
          var:chrome.links.up.0.href ?>">../</a>
       </td>
      </tr>
@@ -59,15 +59,15 @@
      <tr class="<?cs if:name(item) % #2 ?>even<?cs else ?>odd<?cs /if ?>">
       <td class="name"><?cs
        if:item.is_dir ?>
-        <a class="dir" title="Browse Directory" href="<?cs
+        <a class="dir" title="Parcourir le dossier" href="<?cs
           var:item.browser_href ?>"><?cs var:item.name ?></a><?cs
        else ?>
-        <a class="file" title="View File" href="<?cs
+        <a class="file" title="Voir le fichier" href="<?cs
           var:item.browser_href ?>"><?cs var:item.name ?></a><?cs
        /if ?>
       </td>
       <td class="size"><?cs var:item.size ?></td>
-      <td class="rev"><?cs if:item.permission != '' ?><a title="View Revision Log" href="<?cs
+      <td class="rev"><?cs if:item.permission != '' ?><a title="Afficher l'historique des rÃ©visions" href="<?cs
         var:item.log_href ?>"><?cs var:item.rev ?></a><?cs else ?><?cs var:item.rev ?><?cs /if ?></td>
       <td class="age"><span title="<?cs var:browser.changes[item.rev].date ?>"><?cs
         var:browser.changes[item.rev].age ?></span></td>
@@ -82,18 +82,18 @@
  /if ?><?cs
 
  if:len(browser.props) || !browser.is_dir ?>
-  <table id="info" summary="Revision info"><?cs
+  <table id="info" summary="Infos sur la rÃ©vision"><?cs
    if:!browser.is_dir ?><tr>
     <th scope="col">
-     Revision <a href="<?cs var:file.changeset_href ?>"><?cs var:file.rev ?></a>, <?cs var:file.size ?>
-     (checked in by <?cs var:file.author ?>, <?cs var:file.age ?> ago)
+     RÃ©vision <a href="<?cs var:file.changeset_href ?>"><?cs var:file.rev ?></a>, <?cs var:file.size ?>
+     (dÃ©posÃ©e par <?cs var:file.author ?>, <?cs var:file.age ?> auparavant)
     </th></tr><tr>
     <td class="message"><?cs var:file.message ?></td>
    </tr><?cs /if ?><?cs
    if:len(browser.props) ?><tr>
     <td colspan="2"><ul class="props"><?cs
      each:prop = browser.props ?>
-      <li>Property <strong><?cs var:prop.name ?></strong> set to <em><code><?cs
+      <li>PropriÃ©tÃ© <strong><?cs var:prop.name ?></strong> dÃ©finie Ã  <em><code><?cs
       var:prop.value ?></code></em></li><?cs
      /each ?>
     </ul></td></tr><?cs
@@ -106,18 +106,18 @@
    if:file.preview ?><?cs
     var:file.preview ?><?cs
    elif:file.max_file_size_reached ?>
-    <strong>HTML preview not available</strong>, since the file size exceeds
-    <?cs var:file.max_file_size ?> bytes. Try <a href="<?cs
-    var:file.raw_href ?>">downloading</a> the file instead.<?cs
-   else ?><strong>HTML preview not available</strong>. To view, <a href="<?cs
-    var:file.raw_href ?>">download</a> the file.<?cs
+    <strong>PrÃ©visualiation HTML non disponible</strong>, car la taille du 
+    fichier excÃ¨de <?cs var:file.max_file_size ?> octets. Essayez plutÃ´t de 
+    <a href="<?cs var:file.raw_href ?>">tÃ©lÃ©charger</a> le fichier.<?cs
+   else ?><strong>PrÃ©visualiation HTML non disponible</strong>. Pour voir le 
+   contenu du fichier, <a href="<?cs var:file.raw_href ?>">tÃ©lÃ©chargez</a>-le.<?cs
    /if ?>
   </div><?cs
  /if ?>
 
  <div id="help">
-  <strong>Note:</strong> See <a href="<?cs var:trac.href.wiki
-  ?>/TracBrowser">TracBrowser</a> for help on using the browser.
+  <strong>Remarque :</strong> Consulter la page <a href="<?cs var:trac.href.wiki
+  ?>/TracBrowser">TracBrowser</a> pour plus d'informations sur l'utilisation du Navigateur.
  </div>
 
   <div id="anydiff">
@@ -127,7 +127,7 @@
      <input type="hidden" name="old_path" value="<?cs var:browser.path ?>" />
      <input type="hidden" name="new_rev" value="<?cs var:browser.revision ?>" />
      <input type="hidden" name="old_rev" value="<?cs var:browser.revision ?>" />
-     <input type="submit" value="View changes..." title="Prepare an Arbitrary Diff" />
+     <input type="submit" value="Afficher les modifications..." title="PrÃ©parer un fichier de diffÃ©rences" />
     </div>
    </form>
   </div>
diff --exclude=.svn -Naur trac-0.10.4/templates/changeset.cs trac-0.10.4-PKG/templates/changeset.cs
--- trac-0.10.4/templates/changeset.cs	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/templates/changeset.cs	2007-08-24 09:44:59.000000000 +0200
@@ -7,28 +7,32 @@
   <ul><?cs
    if:changeset.chgset ?><?cs
     if:changeset.restricted ?><?cs
-     set:change = "Change" ?><?cs
+     set:change = "Modification" ?><?cs
     else ?><?cs 
-     set:change = "Changeset" ?><?cs
+     set:change = "Version" ?><?cs
     /if ?>
     <li class="first"><?cs
      if:len(links.prev) ?> &larr; 
       <a class="prev" href="<?cs var:links.prev.0.href ?>" title="<?cs
-       var:links.prev.0.title ?>">Previous <?cs var:change ?></a> <?cs 
+        var:links.prev.0.title ?>"><?cs alt:translation[change] ?><?cs 
+        var:change ?><?cs /alt?> prÃ©cÃ©dente</a> <?cs 
      else ?>
-      <span class="missing">&larr; Previous <?cs var:change ?></span><?cs 
+      <span class="missing">&larr; <?cs alt:translation[change] ?><?cs 
+        var:change ?><?cs /alt?> prÃ©cÃ©dente</span><?cs 
      /if ?>
     </li>
     <li class="last"><?cs
      if:len(links.next) ?>
       <a class="next" href="<?cs var:links.next.0.href ?>" title="<?cs
-       var:links.next.0.title ?>">Next <?cs var:change ?></a> &rarr; <?cs 
+       var:links.next.0.title ?>"><?cs alt:translation[change] ?><?cs 
+        var:change ?><?cs /alt?> suivante</a> &rarr; <?cs 
      else ?>
-      <span class="missing">Next <?cs var:change ?> &rarr;</span><?cs
+      <span class="missing"><?cs alt:translation[change] ?><?cs 
+        var:change ?><?cs /alt?> suivante &rarr;</span><?cs
      /if ?>
     </li><?cs
    else ?>
-    <li class="last"><a href="<?cs var:changeset.reverse_href ?>">Reverse Diff</a></li><?cs
+    <li class="last"><a href="<?cs var:changeset.reverse_href ?>">Diff inversÃ©</a></li><?cs
    /if ?>
   </ul><?cs
  /with ?>
@@ -38,29 +42,29 @@
  <div id="title"><?cs
   if:changeset.chgset ?><?cs
    if:changeset.restricted ?>
-    <h1>Changeset <a title="Show full changeset" href="<?cs var:changeset.href.new_rev ?>">
+    <h1>Version <a title="Afficher l'ensemble des changements" href="<?cs var:changeset.href.new_rev ?>">
       <?cs var:changeset.new_rev ?></a> 
-     for <a title="Show entry in browser" href="<?cs var:changeset.href.new_path ?>">
+     pour <a title="Afficher l'Ã©lÃ©ment dans le navigateur" href="<?cs var:changeset.href.new_path ?>">
       <?cs var:changeset.new_path ?></a> 
     </h1><?cs
    else ?>
-    <h1>Changeset <?cs var:changeset.new_rev ?></h1><?cs
+    <h1>Enregistrement <?cs var:changeset.new_rev ?></h1><?cs
    /if ?><?cs
   else ?><?cs
     if:changeset.restricted ?>
-    <h1>Changes in <a title="Show entry in browser" href="<?cs var:changeset.href.new_path ?>">
+    <h1>Modifications dans <a title="Afficher l'Ã©lÃ©ment dans le navigateur" href="<?cs var:changeset.href.new_path ?>">
       <?cs var:changeset.new_path ?></a>
-      <a title="Show revision log" href="<?cs var:changeset.href.log ?>">
+      <a title="Afficher l'historique des rÃ©visions" href="<?cs var:changeset.href.log ?>">
       [<?cs var:changeset.old_rev ?>:<?cs var:changeset.new_rev ?>]</a>
     </h1><?cs
    else ?>
-    <h1>Changes from <a title="Show entry in browser" href="<?cs var:changeset.href.old_path ?>">
+    <h1>Modification de <a title="Show entry in browser" href="<?cs var:changeset.href.old_path ?>">
       <?cs var:changeset.old_path ?></a> 
-     at <a title="Show full changeset" href="<?cs var:changeset.href.old_rev ?>">
+     Ã  <a title="Afficher l'ensemble des changements" href="<?cs var:changeset.href.old_rev ?>">
       r<?cs var:changeset.old_rev ?></a>
-     to <a title="Show entry in browser" href="<?cs var:changeset.href.new_path ?>">
+     vers <a title="Afficher l'Ã©lÃ©ment dans le navigateur" href="<?cs var:changeset.href.new_path ?>">
      <?cs var:changeset.new_path ?></a> 
-     at <a title="Show full changeset" href="<?cs var:changeset.href.new_rev ?>">
+     Ã  <a title="Afficher l'ensemble des changements" href="<?cs var:changeset.href.new_rev ?>">
      r<?cs var:changeset.new_rev ?></a>
     </h1><?cs
    /if ?><?cs
@@ -81,40 +85,40 @@
    <input type="hidden" name="old" value="<?cs var:changeset.old_rev ?>" />
    <input type="hidden" name="new" value="<?cs var:changeset.new_rev ?>" /><?cs
   /if ?>
-  <label for="style">View differences</label>
+  <label for="style">Voir les diffÃ©rences</label>
   <select id="style" name="style">
    <option value="inline"<?cs
      if:diff.style == 'inline' ?> selected="selected"<?cs
-     /if ?>>inline</option>
+     /if ?>>au fil</option>
    <option value="sidebyside"<?cs
      if:diff.style == 'sidebyside' ?> selected="selected"<?cs
-     /if ?>>side by side</option>
+     /if ?>>cÃ´te Ã  cÃ´te</option>
   </select>
   <div class="field">
-   Show <input type="text" name="contextlines" id="contextlines" size="2"
+   Montrer <input type="text" name="contextlines" id="contextlines" size="2"
      maxlength="3" value="<?cs var:diff.options.contextlines ?>" />
-   <label for="contextlines">lines around each change</label>
+   <label for="contextlines">Lignes encadrant chaque changement</label>
   </div>
   <fieldset id="ignore">
-   <legend>Ignore:</legend>
+   <legend>Ignorer:</legend>
    <div class="field">
     <input type="checkbox" id="blanklines" name="ignoreblanklines"<?cs
       if:diff.options.ignoreblanklines ?> checked="checked"<?cs /if ?> />
-    <label for="blanklines">Blank lines</label>
+    <label for="blanklines">Lignes vides</label>
    </div>
    <div class="field">
     <input type="checkbox" id="case" name="ignorecase"<?cs
       if:diff.options.ignorecase ?> checked="checked"<?cs /if ?> />
-    <label for="case">Case changes</label>
+    <label for="case">Changements majuscules/minuscules</label>
    </div>
    <div class="field">
     <input type="checkbox" id="whitespace" name="ignorewhitespace"<?cs
       if:diff.options.ignorewhitespace ?> checked="checked"<?cs /if ?> />
-    <label for="whitespace">White space changes</label>
+    <label for="whitespace">Changements d'espacement</label>
    </div>
   </fieldset>
   <div class="buttons">
-   <input type="submit" name="update" value="Update" />
+   <input type="submit" name="update" value="Actualiser" />
   </div>
  </div>
 </form><?cs /if ?>
@@ -124,22 +128,22 @@
   set:nprops = len(item.props) ?>
   <div class="<?cs var:cl ?>"></div><?cs 
   if:cl == "rem" ?>
-   <a title="Show what was removed (rev. <?cs var:item.rev.old ?>)" href="<?cs
+   <a title="Montrer ce qui a Ã©tÃ© supprimÃ© (rÃ©v. <?cs var:item.rev.old ?>)" href="<?cs
      var:item.browser_href.old ?>"><?cs var:item.path.old ?></a><?cs
   else ?>
-   <a title="Show entry in browser" href="<?cs
-     var:item.browser_href.new ?>"><?cs alt:item.path.new ?>(root)<?cs /alt?></a><?cs
+   <a title="Montrer l'Ã©lÃ©ment dans le navigateur" href="<?cs
+     var:item.browser_href.new ?>"><?cs alt:item.path.new ?>(racine)<?cs /alt?></a><?cs
   /if ?>
   <span class="comment">(<?cs var:kind ?>)</span><?cs
   if:item.path.old && item.change == 'copy' || item.change == 'move' ?>
-   <small><em>(<?cs var:kind ?> from <a href="<?cs
-    var:item.browser_href.old ?>" title="Show original file (rev. <?cs
+   <small><em>(<?cs var:kind ?> depuis <a href="<?cs
+    var:item.browser_href.old ?>" title="Montrer le fichier original (rÃ©v. <?cs
     var:item.rev.old ?>)"><?cs var:item.path.old ?></a>)</em></small><?cs
   /if ?><?cs
   if:item.diff_href ?>
-    (<a href="<?cs var:item.diff_href ?>" title="Show differences">view diffs</a>)<?cs
+    (<a href="<?cs var:item.diff_href ?>" title="Voir les diffÃ©rences">voir diffs</a>)<?cs
   elif:$ndiffs + $nprops > #0 ?>
-    (<a href="#file<?cs var:name(item) ?>" title="Show differences"><?cs
+    (<a href="#file<?cs var:name(item) ?>" title="Voir les diffÃ©rences"><?cs
       if:$ndiffs > #0 ?><?cs var:ndiffs ?>&nbsp;diff<?cs if:$ndiffs > #1 ?>s<?cs /if ?><?cs 
       /if ?><?cs
       if:$ndiffs && $nprops ?>, <?cs /if ?><?cs 
@@ -147,16 +151,16 @@
       /if ?></a>)<?cs
   elif:cl == "mod" ?>
     (<a href="<?cs var:item.browser_href.old ?>"
-        title="Show previous version in browser">previous</a>)<?cs
+        title="Voir les versions antÃ©rieures dans le navigateur">prÃ©cÃ©dent</a>)<?cs
   /if ?>
 <?cs /def ?>
 
 <dl id="overview"><?cs
  if:changeset.chgset ?>
- <dt class="property time">Timestamp:</dt>
+ <dt class="property time">Date:</dt>
  <dd class="time"><?cs var:changeset.time ?> 
-  (<?cs alt:changeset.age ?>less than one hour<?cs /alt ?> ago)</dd>
- <dt class="property author">Author:</dt>
+  (<?cs alt:changeset.age ?>moins d'une heure<?cs /alt ?> auparavant)</dd>
+ <dt class="property author">Auteur:</dt>
  <dd class="author"><?cs var:changeset.author ?></dd>
  <?cs each:prop = changeset.properties ?>
  <dt class="property <?cs var:prop.htmlclass ?>"><?cs var:prop.name ?>:</dt>
@@ -168,24 +172,24 @@
  /if ?>
  <dt class="property files"><?cs 
   if:len(changeset.changes) > #0 ?>
-   Files:<?cs
+   Fichiers:<?cs
   else ?>
-   (No files)<?cs
+   (Pas&nbsp;de&nbsp;fichier)<?cs
   /if ?>
  </dt>
  <dd class="files">
   <ul><?cs each:item = changeset.changes ?>
    <li><?cs
     if:item.change == 'add' ?><?cs
-     call:node_change(item, 'add', 'added') ?><?cs
+     call:node_change(item, 'add', 'ajoutÃ©') ?><?cs
     elif:item.change == 'delete' ?><?cs
-     call:node_change(item, 'rem', 'deleted') ?><?cs
+     call:node_change(item, 'rem', 'supprimÃ©') ?><?cs
     elif:item.change == 'copy' ?><?cs
-     call:node_change(item, 'cp', 'copied') ?><?cs
+     call:node_change(item, 'cp', 'copiÃ©') ?><?cs
     elif:item.change == 'move' ?><?cs
-     call:node_change(item, 'mv', 'moved') ?><?cs
+     call:node_change(item, 'mv', 'dÃ©placÃ©') ?><?cs
     elif:item.change == 'edit' ?><?cs
-     call:node_change(item, 'mod', 'modified') ?><?cs
+     call:node_change(item, 'mod', 'modifiÃ©') ?><?cs
     /if ?>
    </li>
   <?cs /each ?></ul>
@@ -194,47 +198,47 @@
 
 <div class="diff">
  <div id="legend">
-  <h3>Legend:</h3>
+  <h3>LÃ©gende:</h3>
   <dl>
-   <dt class="unmod"></dt><dd>Unmodified</dd>
-   <dt class="add"></dt><dd>Added</dd>
-   <dt class="rem"></dt><dd>Removed</dd>
-   <dt class="mod"></dt><dd>Modified</dd>
-   <dt class="cp"></dt><dd>Copied</dd>
-   <dt class="mv"></dt><dd>Moved</dd>
+   <dt class="unmod"></dt><dd>Non modifiÃ©</dd>
+   <dt class="add"></dt><dd>AjoutÃ©</dd>
+   <dt class="rem"></dt><dd>SupprimÃ©</dd>
+   <dt class="mod"></dt><dd>ModifiÃ©</dd>
+   <dt class="cp"></dt><dd>CopiÃ©</dd>
+   <dt class="mv"></dt><dd>DÃ©placÃ©</dd>
   </dl>
  </div>
  <ul class="entries"><?cs
  each:item = changeset.changes ?><?cs
   if:len(item.diff) || len(item.props) ?><li class="entry" id="file<?cs
    var:name(item) ?>"><h2><a href="<?cs
-   var:item.browser_href.new ?>" title="Show new revision <?cs
-   var:item.rev.new ?> of this file in browser"><?cs
+   var:item.browser_href.new ?>" title="Voir la nouvelle rÃ©vision <?cs
+   var:item.rev.new ?> de ce fichier dans le navigateur"><?cs
    var:item.path.new ?></a></h2><?cs
    if:len(item.props) ?><ul class="props"><?cs
-    each:prop = item.props ?><li>Property <strong><?cs
+    each:prop = item.props ?><li>PropriÃ©tÃ© <strong><?cs
      var:prop.name ?></strong> <?cs
-     if:prop.old && prop.new ?>changed from <?cs
-     elif:!prop.old ?>set<?cs
-     else ?>deleted<?cs
+     if:prop.old && prop.new ?>modifiÃ©e de <?cs
+     elif:!prop.old ?>dÃ©finie<?cs
+     else ?>supprimÃ©e<?cs
      /if ?><?cs
      if:prop.old && prop.new ?><em><tt><?cs var:prop.old ?></tt></em><?cs /if ?><?cs
-     if:prop.new ?> to <em><tt><?cs var:prop.new ?></tt></em><?cs /if ?></li><?cs
+     if:prop.new ?> Ã  <em><tt><?cs var:prop.new ?></tt></em><?cs /if ?></li><?cs
     /each ?></ul><?cs
    /if ?><?cs
    if:len(item.diff) ?><table class="<?cs
-    var:diff.style ?>" summary="Differences" cellspacing="0"><?cs
+    var:diff.style ?>" summary="DiffÃ©rences" cellspacing="0"><?cs
     if:diff.style == 'sidebyside' ?>
      <colgroup class="l"><col class="lineno" /><col class="content" /></colgroup>
      <colgroup class="r"><col class="lineno" /><col class="content" /></colgroup>
      <thead><tr>
       <th colspan="2"><a href="<?cs
-       var:item.browser_href.old ?>" title="Show old rev. <?cs
-       var:item.rev.old ?> of <?cs var:item.path.old ?>">Revision <?cs
+       var:item.browser_href.old ?>" title="Voir ancienne rÃ©v. <?cs
+       var:item.rev.old ?> de <?cs var:item.path.old ?>">RÃ©vision <?cs
        var:item.rev.old ?></a></th>
       <th colspan="2"><a href="<?cs
-       var:item.browser_href.new ?>" title="Show new rev. <?cs
-       var:item.rev.new ?> of <?cs var:item.path.new ?>">Revision <?cs
+       var:item.browser_href.new ?>" title="Voir nouvelle rÃ©v. <?cs
+       var:item.rev.new ?> de <?cs var:item.path.new ?>">RÃ©vision <?cs
        var:item.rev.new ?></a></th>
       </tr>
      </thead><?cs
@@ -247,11 +251,11 @@
     else ?>
      <colgroup><col class="lineno" /><col class="lineno" /><col class="content" /></colgroup>
      <thead><tr>
-      <th title="Revision <?cs var:item.rev.old ?>"><a href="<?cs
-       var:item.browser_href.old ?>" title="Show old version of <?cs
+      <th title="RÃ©vision <?cs var:item.rev.old ?>"><a href="<?cs
+       var:item.browser_href.old ?>" title="Voir l'ancienne rÃ©vision de <?cs
        var:item.path.old ?>">r<?cs var:item.shortrev.old ?></a></th>
-      <th title="Revision <?cs var:item.rev.new ?>"><a href="<?cs
-       var:item.browser_href.new ?>" title="Show new version of <?cs
+      <th title="RÃ©vision <?cs var:item.rev.new ?>"><a href="<?cs
+       var:item.browser_href.new ?>" title="Voir la nouvelle rÃ©vision de <?cs
        var:item.path.new ?>">r<?cs var:item.shortrev.new ?></a></th>
       <th>&nbsp;</th></tr>
      </thead><?cs
diff --exclude=.svn -Naur trac-0.10.4/templates/error.cs trac-0.10.4-PKG/templates/error.cs
--- trac-0.10.4/templates/error.cs	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/templates/error.cs	2007-08-24 09:45:55.000000000 +0200
@@ -9,26 +9,27 @@
   <p class="message"><?cs var:error.message ?></p>
 
  <?cs elif error.type == "internal" ?>
-  <h1>Oops&hellip;</h1>
+  <h1>AÃ¯e&hellip;</h1>
   <div class="message">
-   <strong>Trac detected an internal error:</strong>
+   <strong>Trac a dÃ©tectÃ© une erreur interne :</strong>
    <pre><?cs var:error.message ?></pre>
   </div>
-  <p>If you think this really should work and you can reproduce it, you  should
-   consider reporting this problem to the Trac team.</p>
-  <p>Go to <a href="<?cs var:trac.href.homepage ?>"><?cs
-   var:trac.href.homepage ?></a> and create a new ticket where you describe
-   the problem, how to reproduce it. Don't forget to include the Python
-   traceback found below.</p>
-
+  <p>Si vous pensez que cette action aurait du fonctionner et si vous pouvez 
+   reproduire le problÃ¨me, vous devriez envisager de le rapporter Ã  
+   l'Ã©quipe de Trac.</p>
+  <p>Rendez vous sur <a href="<?cs var:trac.href.homepage ?>"><?cs
+   var:trac.href.homepage ?></a> et crÃ©ez un nouveau ticket oÃ¹ vous dÃ©crirez le 
+   problÃ¨me, et comment le reproduire. N'oubliez pas d'inclure la pile d'appel 
+   Python affichÃ©e ci-dessous.
+  </p>
  <?cs /if ?>
 
  <p>
   <a href="<?cs var:trac.href.wiki ?>/TracGuide">TracGuide</a>
-  &mdash; The Trac User and Administration Guide
+  &mdash; Le Guide de l'utilisateur et de l'administrateur de Trac
  </p>
  <?cs if:error.traceback ?>
-  <h4>Python Traceback</h4>
+  <h4>Pile d'appel Python</h4>
   <pre><?cs var:error.traceback ?></pre>
  <?cs /if ?>
 
diff --exclude=.svn -Naur trac-0.10.4/templates/footer.cs trac-0.10.4-PKG/templates/footer.cs
--- trac-0.10.4/templates/footer.cs	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/templates/footer.cs	2007-08-24 09:46:29.000000000 +0200
@@ -1,6 +1,6 @@
 <script type="text/javascript">searchHighlight()</script><?cs
 if:len(chrome.links.alternate) ?>
-<div id="altlinks"><h3>Download in other formats:</h3><ul><?cs
+<div id="altlinks"><h3>TÃ©lÃ©charger dans d'autres formats:</h3><ul><?cs
  each:link = chrome.links.alternate ?><?cs
   set:isfirst = name(link) == 0 ?><?cs
   set:islast = name(link) == len(chrome.links.alternate) - 1?><li<?cs
@@ -21,9 +21,9 @@
    var:htdocs_location ?>trac_logo_mini.png" height="30" width="107"
    alt="Trac Powered"/></a>
  <p class="left">
-  Powered by <a href="<?cs var:trac.href.about ?>"><strong>Trac <?cs
+  PropulsÃ© par <a href="<?cs var:trac.href.about ?>"><strong>Trac <?cs
   var:trac.version ?></strong></a><br />
-  By <a href="http://www.edgewall.org/">Edgewall Software</a>.
+  d'<a href="http://www.edgewall.org/">Edgewall Software</a>.
  </p>
  <p class="right">
   <?cs var:project.footer ?>
diff --exclude=.svn -Naur trac-0.10.4/templates/header.cs trac-0.10.4-PKG/templates/header.cs
--- trac-0.10.4/templates/header.cs	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/templates/header.cs	2007-08-21 12:35:46.000000000 +0200
@@ -1,7 +1,7 @@
 <!DOCTYPE html
     PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr">
 <head><?cs
  if:project.name_encoded ?>
  <title><?cs if:title ?><?cs var:title ?> - <?cs /if ?><?cs
@@ -39,9 +39,9 @@
 
 <form id="search" action="<?cs var:trac.href.search ?>" method="get">
  <?cs if:trac.acl.SEARCH_VIEW ?><div>
-  <label for="proj-search">Search:</label>
+  <label for="proj-search">Recherche:</label>
   <input type="text" id="proj-search" name="q" size="10" accesskey="f" value="" />
-  <input type="submit" value="Search" />
+  <input type="submit" value="Chercher" />
   <input type="hidden" name="wiki" value="on" />
   <input type="hidden" name="changeset" value="on" />
   <input type="hidden" name="ticket" value="on" />
diff --exclude=.svn -Naur trac-0.10.4/templates/index.cs trac-0.10.4-PKG/templates/index.cs
--- trac-0.10.4/templates/index.cs	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/templates/index.cs	2007-08-21 12:36:33.000000000 +0200
@@ -1,15 +1,15 @@
 <!DOCTYPE html
     PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
-<head><title>Available Projects</title></head>
-<body><h1>Available Projects</h1><ul><?cs
+<html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr">
+<head><title>Projets disponibles</title></head>
+<body><h1>Projets disponibles</h1><ul><?cs
  each:project = projects ?><li><?cs
   if:project.href ?>
    <a href="<?cs var:project.href ?>" title="<?cs var:project.description ?>">
     <?cs var:project.name ?></a><?cs
   else ?>
-   <small><?cs var:project.name ?>: <em>Error</em> <br />
+   <small><?cs var:project.name ?>: <em>Erreur</em> <br />
    (<?cs var:project.description ?>)</small><?cs
   /if ?>
   </li><?cs
diff --exclude=.svn -Naur trac-0.10.4/templates/log_changelog.cs trac-0.10.4-PKG/templates/log_changelog.cs
--- trac-0.10.4/templates/log_changelog.cs	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/templates/log_changelog.cs	2007-08-21 12:37:00.000000000 +0200
@@ -12,11 +12,11 @@
   each:file = changeset.files ?>
 	* <?cs var:file ?> (<?cs
     set:action = changeset.actions[idx] ?><?cs
-    if:action == 'add' ?>added<?cs
-    elif:action == 'delete' ?>deleted<?cs
-    elif:action == 'copy' ?>copied<?cs
-    elif:action == 'move' ?>moved<?cs
-    elif:action == 'edit' ?>modified<?cs
+    if:action == 'add' ?>ajoutÃ©<?cs
+    elif:action == 'delete' ?>supprimÃ©<?cs
+    elif:action == 'copy' ?>copiÃ©<?cs
+    elif:action == 'move' ?>dÃ©placÃ©<?cs
+    elif:action == 'edit' ?>modifiÃ©<?cs
     /if ?>)<?cs
     set:idx = idx + 1 ?><?cs
   /each ?>
diff --exclude=.svn -Naur trac-0.10.4/templates/log.cs trac-0.10.4-PKG/templates/log.cs
--- trac-0.10.4/templates/log.cs	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/templates/log.cs	2007-08-24 09:50:14.000000000 +0200
@@ -4,18 +4,18 @@
 <div id="ctxtnav" class="nav">
  <ul>
   <li class="first <?cs if:len(chrome.links.prev)+len(chrome.links.next) == 0 ?>last<?cs /if ?>">
-   <a href="<?cs var:log.browser_href ?>">View Latest Revision</a>
+   <a href="<?cs var:log.browser_href ?>">Afficher la derniÃ¨re rÃ©vision</a>
   </li><?cs
   if:len(chrome.links.prev) ?>
    <li class="<?cs if:!len(chrome.links.next) ?> last<?cs /if ?>">
     &larr; <a href="<?cs var:chrome.links.prev.0.href ?>" title="<?cs
-      var:chrome.links.prev.0.title ?>">Newer Revisions</a>
+      var:chrome.links.prev.0.title ?>">RÃ©visions postÃ©rieures</a>
    </li><?cs
   /if ?><?cs
   if:len(chrome.links.next) ?>
    <li class="last">
     <a href="<?cs var:chrome.links.next.0.href ?>" title="<?cs
-      var:chrome.links.next.0.title ?>">Older Revisions</a> &rarr;
+      var:chrome.links.next.0.title ?>">RÃ©visions antÃ©rieures</a> &rarr;
    </li><?cs
   /if ?>
  </ul>
@@ -27,70 +27,70 @@
  <form id="prefs" action="<?cs var:browser_current_href ?>" method="get">
   <div>
    <input type="hidden" name="action" value="<?cs var:log.mode ?>" />
-   <label>View log starting at <input type="text" id="rev" name="rev" value="<?cs
-    var:log.items.0.rev ?>" size="5" /></label>
-   <label>and back to <input type="text" id="stop_rev" name="stop_rev" value="<?cs
-    var:log.stop_rev ?>" size="5" /></label>
+   <label>Afficher l'historique du dÃ©pÃ´t Ã  partir de <input type="text" id="rev" name="rev" value="<?cs
+    var:log.items.0.rev ?>" size="5" /></label><br/>
+   <label>et jusqu'Ã  <input type="text" id="stop_rev" name="stop_rev" value="<?cs
+    var:log.stop_rev ?>" size="5" />rÃ©visions prÃ©cÃ©dentes</label>
    <br />
    <div class="choice">
     <fieldset>
-     <legend>Mode:</legend>
+     <legend>Mode :</legend>
      <label for="stop_on_copy">
       <input type="radio" id="stop_on_copy" name="mode" value="stop_on_copy" <?cs
        if:log.mode != "follow_copy" || log.mode != "path_history" ?> checked="checked" <?cs
        /if ?> />
-      Stop on copy 
+      ArrÃªt sur copie 
      </label>
      <label for="follow_copy">
       <input type="radio" id="follow_copy" name="mode" value="follow_copy" <?cs
        if:log.mode == "follow_copy" ?> checked="checked" <?cs /if ?> />
-      Follow copies
+      Suivi des copies
      </label>
      <label for="path_history">
       <input type="radio" id="path_history" name="mode" value="path_history" <?cs
        if:log.mode == "path_history" ?> checked="checked" <?cs /if ?> />
-      Show only adds, moves and deletes
+      Ajouts, dÃ©placements et suppression uniquement
      </label>
     </fieldset>
    </div>
    <label><input type="checkbox" name="verbose" <?cs
     if:log.verbose ?> checked="checked" <?cs
-    /if ?> /> Show full log messages</label>
+    /if ?> /> Afficher l'historique complet</label>
   </div>
   <div class="buttons">
-   <input type="submit" value="Update" 
-          title="Warning: by updating, you will clear the page history" />
+   <input type="submit" value="Actualiser" 
+          title="Remarque : En actualisant, l'historique de la page est remis Ã  zero" />
   </div>
  </form>
 
  <div class="diff">
   <div id="legend">
-   <h3>Legend:</h3>
+   <h3>LÃ©gende :</h3>
    <dl>
-    <dt class="add"></dt><dd>Added</dd><?cs
+    <dt class="add"></dt><dd>AjoutÃ©</dd><?cs
     if:log.mode == "path_history" ?>
-     <dt class="rem"></dt><dd>Removed</dd><?cs
+     <dt class="rem"></dt><dd>SupprimÃ©</dd><?cs
     /if ?>
-    <dt class="mod"></dt><dd>Modified</dd>
-    <dt class="cp"></dt><dd>Copied or renamed</dd>
+    <dt class="mod"></dt><dd>ModifiÃ©</dd>
+    <dt class="cp"></dt><dd>CopiÃ© ou renommÃ©</dd>
    </dl>
   </div>
  </div>
 
  <form  class="printableform" action="<?cs var:log.changeset_href ?>" method="get">
-  <div class="buttons"><input type="submit" value="View changes" 
-       title="Diff from Old Revision to New Revision (select them below)" />
+  <div class="buttons"><input type="submit" value="Voir les modifications" 
+       title="DiffÃ©rences entre ancienne et nouvelle rÃ©vision (sÃ©lectionnez-les ci-dessous)" />
  </div>
  <table id="chglist" class="listing">
   <thead>
    <tr>
     <th class="diff"></th>
     <th class="change"></th>
-    <th class="rev">Rev</th>
-    <th class="chgset">Chgset</th>
+    <th class="rev">RÃ©v.</th>
+    <th class="chgset">Version</th>
     <th class="date">Date</th>
-    <th class="author">Author</th>
-    <th class="summary"><?cs if:!log.verbose ?>Log Message<?cs /if ?></th>
+    <th class="author">Auteur</th>
+    <th class="summary"><?cs if:!log.verbose ?>Description<?cs /if ?></th>
    </tr>
   </thead>
   <tbody><?cs
@@ -105,7 +105,7 @@
     if:item.copyfrom_path ?>
      <tr class="<?cs var:even_odd ?>">
       <td class="copyfrom_path" colspan="7" style="padding-left: <?cs var:indent ?>em">
-       copied from <a href="<?cs var:item.browser_href ?>"><?cs var:item.copyfrom_path ?></a>:
+       copiÃ© depuis <a href="<?cs var:item.browser_href ?>"><?cs var:item.copyfrom_path ?></a>:
       </td>
      </tr><?cs
      set:indent = indent + #1 ?><?cs
@@ -121,18 +121,18 @@
              value="<?cs var:item.path ?>@<?cs var:item.rev ?>" <?cs
           if:idx == #0 ?> checked="checked" <?cs /if ?> /></td>
      <td class="change" style="padding-left:<?cs var:indent ?>em">
-      <a title="View log starting at this revision" href="<?cs var:item.log_href ?>">
+      <a title="Afficher l'historique en commenÃ§ant Ã  partir de la rÃ©vision" href="<?cs var:item.log_href ?>">
        <span class="<?cs var:item.change ?>"></span>
        <span class="comment">(<?cs var:item.change ?>)</span>
       </a>
      </td>
      <td class="rev">
       <a href="<?cs var:item.browser_href ?>" 
-         title="Browse at revision <?cs var:item.rev ?>">@<?cs var:item.rev ?></a>
+         title="Consultez la rÃ©vision <?cs var:item.rev ?>">@<?cs var:item.rev ?></a>
      </td>
      <td class="chgset">
       <a href="<?cs var:item.changeset_href ?>"
-         title="View changeset [<?cs var:item.rev ?>]">[<?cs var:item.rev ?>]</a>
+         title="Voir la version [<?cs var:item.rev ?>]">[<?cs var:item.rev ?>]</a>
      </td>
      <td class="date"><?cs var:log.changes[item.rev].date ?></td>
      <td class="author"><?cs var:log.changes[item.rev].author ?></td>
@@ -149,8 +149,8 @@
   </tbody>
  </table><?cs
  if:len(log.items) > #10 ?>
-  <div class="buttons"><input type="submit" value="View changes" 
-       title="Diff from Old Revision to New Revision (select them above)" />
+  <div class="buttons"><input type="submit" value="Voir les modifications" 
+       title="DiffÃ©rences entre ancienne et nouvelle rÃ©vision (sÃ©lectionnez-les ci-dessous)" />
   </div><?cs
  /if ?>
  </form><?cs
@@ -158,18 +158,18 @@
   if:len(links.prev) ?><li class="first<?cs
    if:!len(links.next) ?> last<?cs /if ?>">&larr; <a href="<?cs
    var:links.prev.0.href ?>" title="<?cs
-   var:links.prev.0.title ?>">Younger Revisions</a></li><?cs
+   var:links.prev.0.title ?>">RÃ©visions postÃ©rieures</a></li><?cs
   /if ?><?cs
   if:len(links.next) ?><li class="<?cs
    if:len(links.prev) ?>first <?cs /if ?>last"><a href="<?cs
    var:links.next.0.href ?>" title="<?cs
-   var:links.next.0.title ?>">Older Revisions</a> &rarr;</li><?cs
+   var:links.next.0.title ?>">RÃ©visions antÃ©rieures</a> &rarr;</li><?cs
   /if ?></ul></div><?cs
  /if ?>
 
  <div id="help">
-  <strong>Note:</strong> See <a href="<?cs var:trac.href.wiki
-  ?>/TracRevisionLog">TracRevisionLog</a> for help on using the revision log.
+  <strong>Remarque :</strong> Consultez la page <a href="<?cs var:trac.href.wiki
+  ?>/TracRevisionLog">TracRevisionLog</a> pour plus d'informations sur l'utilisation de l'historique des rÃ©visions.
  </div>
 
 </div>
diff --exclude=.svn -Naur trac-0.10.4/templates/log_rss.cs trac-0.10.4-PKG/templates/log_rss.cs
--- trac-0.10.4/templates/log_rss.cs	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/templates/log_rss.cs	2007-08-24 09:51:59.000000000 +0200
@@ -3,13 +3,13 @@
 <rss version="2.0">
  <channel><?cs 
   if:project.name_encoded ?>
-   <title><?cs var:project.name_encoded ?>: Revisions of <?cs var:log.path ?></title><?cs 
+   <title><?cs var:project.name_encoded ?>: RÃ©visions de <?cs var:log.path ?></title><?cs 
   else ?>
-   <title>Revisions of <?cs var:log.path ?></title><?cs 
+   <title>RÃ©visions de <?cs var:log.path ?></title><?cs 
   /if ?>
   <link><?cs var:base_host ?><?cs var:log.log_href ?></link>
-  <description>Trac Log - Revisions of <?cs var:log.path ?></description>
-  <language>en-us</language>
+  <description>Journal de Trac - RÃ©visions de <?cs var:log.path ?></description>
+  <language>fr-fr</language>
   <generator>Trac v<?cs var:trac.version ?></generator><?cs
   if:chrome.logo.src ?>
    <image>
@@ -25,12 +25,12 @@
      if:change.author ?><author><?cs var:change.author ?></author><?cs
      /if ?>
      <pubDate><?cs var:change.date ?></pubDate>
-     <title>Revision <?cs var:item.rev ?>: <?cs var:change.shortlog ?></title>
+     <title>RÃ©vision <?cs var:item.rev ?>: <?cs var:change.shortlog ?></title>
      <link><?cs var:base_host ?><?cs var:item.restricted_href ?></link>
      <guid isPermaLink="false"><?cs var:base_host ?><?cs 
 	   var:item.restricted_href ?></guid>
      <description><?cs var:change.message ?></description>
-     <category>Log</category>
+     <category>Historique</category>
     </item><?cs 
    /with ?><?cs 
   /each ?>
diff --exclude=.svn -Naur trac-0.10.4/templates/macros.cs trac-0.10.4-PKG/templates/macros.cs
--- trac-0.10.4/templates/macros.cs	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/templates/macros.cs	2007-08-24 09:51:59.000000000 +0200
@@ -2,8 +2,8 @@
  <select size="1" id="<?cs var:name ?>" name="<?cs var:name ?>"><?cs
   if:optional ?><option></option><?cs /if ?><?cs
   each:option = options ?>
-   <option<?cs if:option == selected ?> selected="selected"<?cs /if ?>><?cs 
-     var:option ?></option><?cs
+   <option value="<?cs var:option ?>"<?cs if:option == selected ?> selected="selected"<?cs /if ?>><?cs 
+     alt:translation[option] ?><?cs var:option ?><?cs /alt ?></option><?cs
   /each ?>
  </select><?cs
 /def?><?cs
@@ -21,9 +21,9 @@
  set:first = #1 ?><?cs
   each:part = path ?><?cs
    set:last = name(part) == len(path) - #1 ?><a<?cs 
-   if:first ?> class="first" title="Go to root directory"<?cs 
+   if:first ?> class="first" title="Retourner au rÃ©pertoire racine"<?cs 
     set:first = #0 ?><?cs 
-   else ?> title="View <?cs var:part.name ?>"<?cs
+   else ?> title="Voir <?cs var:part.name ?>"<?cs
    /if ?> href="<?cs var:part.href ?>"><?cs var:part.name ?></a><?cs
    if:!last ?><span class="sep">/</span><?cs /if ?><?cs 
  /each ?><?cs
@@ -131,13 +131,13 @@
  each c=ticket.custom ?>
   <div class="field custom_<?cs var c.name ?>"><?cs
    if c.type == 'text' ?>
-    <label>
-     <?cs alt c.label ?><?cs var c.name ?><?cs /alt ?>:
+    <label><?cs alt:translation[c.name] ?>
+     <?cs alt c.label ?><?cs var c.name ?><?cs /alt ?><?cs /alt ?>:
      <input type="text" name="custom_<?cs var c.name ?>" value="<?cs var c.value ?>" />
     </label><?cs
    elif c.type == 'textarea' ?>
-    <label>
-     <?cs alt c.label ?><?cs var c.name ?><?cs /alt ?>:<br />
+    <label><?cs alt:translation[c.name] ?>
+     <?cs alt c.label ?><?cs var c.name ?><?cs /alt ?><?cs /alt ?>:<br />
      <textarea cols="<?cs alt c.width ?>60<?cs /alt ?>" rows="<?cs
        alt c.height ?>12<?cs /alt ?>" name="custom_<?cs var c.name ?>"><?cs
        var c.value ?></textarea>
@@ -147,11 +147,12 @@
     <label>
      <input type="checkbox" name="custom_<?cs var c.name ?>" value="1"<?cs
        if c.selected ?> checked="checked"<?cs /if ?> />
-     <?cs alt c.label ?><?cs var c.name ?><?cs /alt ?>
+       <?cs alt:translation[c.name] ?>
+     <?cs alt c.label ?><?cs var c.name ?><?cs /alt ?><?cs /alt ?>
     </label><?cs
    elif c.type == 'select' ?>
-    <label>
-     <?cs alt c.label ?><?cs var c.name ?><?cs /alt ?>:
+    <label><?cs alt:translation[c.name] ?>
+     <?cs alt c.label ?><?cs var c.name ?><?cs /alt ?><?cs /alt ?>:
      <select name="custom_<?cs var c.name ?>"><?cs each v = c.option ?>
       <option<?cs if v.selected ?> selected="selected"<?cs /if ?>><?cs
         var v ?></option><?cs /each ?>
@@ -159,11 +160,11 @@
     </label><?cs
    elif c.type == 'radio' ?>
     <fieldset class="radio">
-     <legend><?cs alt c.label ?><?cs var c.name ?><?cs /alt ?>:</legend><?cs
+     <legend><?cs alt:translation[c.name] ?><?cs alt c.label ?><?cs var c.name ?><?cs /alt ?><?cs /alt ?>:</legend><?cs
      each v = c.option ?>
       <label><input type="radio" name="custom_<?cs var c.name ?>" value="<?cs
          var v ?>"<?cs if v.selected ?> checked="checked"<?cs /if ?> /> <?cs
-         var v ?></label><?cs
+         alt:translation[v] ?><?cs var v ?><?cs /alt ?></label><?cs
      /each ?>
     </fieldset><?cs
    /if ?>
@@ -172,12 +173,12 @@
 /def ?><?cs 
 
 def:list_of_attachments(attachments, attach_href) ?>
-<h2>Attachments</h2><?cs
+<h2>PiÃ©ces jointes</h2><?cs
  if:len(attachments) ?><div id="attachments">
   <dl class="attachments"><?cs each:attachment = attachments ?>
-   <dt><a href="<?cs var:attachment.href ?>" title="View attachment"><?cs
-   var:attachment.filename ?></a> (<?cs var:attachment.size ?>) - added by <em><?cs
-   var:attachment.author ?></em> on <?cs
+   <dt><a href="<?cs var:attachment.href ?>" title="Voir la piÃ¨ce jointe"><?cs
+   var:attachment.filename ?></a> (<?cs var:attachment.size ?>) - ajoutÃ© par <em><?cs
+   var:attachment.author ?></em> le <?cs
    var:attachment.time ?>.</dt><?cs
    if:attachment.description ?>
     <dd><?cs var:attachment.description ?></dd><?cs
@@ -187,7 +188,7 @@
  if:attach_href ?>
   <form method="get" action="<?cs var:attach_href ?>"><div>
    <input type="hidden" name="action" value="new" />
-   <input type="submit" value="Attach File" />
+   <input type="submit" value="Joindre le fichier" />
   </div></form><?cs
  /if ?><?cs if:len(attachments) ?></div><?cs /if ?><?cs
 /def ?><?cs
diff --exclude=.svn -Naur trac-0.10.4/templates/milestone.cs trac-0.10.4-PKG/templates/milestone.cs
--- trac-0.10.4/templates/milestone.cs	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/templates/milestone.cs	2007-08-24 10:07:53.000000000 +0200
@@ -5,13 +5,13 @@
 
 <div id="content" class="milestone">
  <?cs if:milestone.mode == "new" ?>
- <h1>New Milestone</h1>
+ <h1><?cs alt:translation.New_Milestone ?>Nouveau jalon<?cs /alt ?></h1>
  <?cs elif:milestone.mode == "edit" ?>
- <h1>Edit Milestone <?cs var:milestone.name ?></h1>
+ <h1>Editer <?cs alt:translation.Milestone ?>le jalon<?cs /alt ?> <?cs var:milestone.name ?></h1>
  <?cs elif:milestone.mode == "delete" ?>
- <h1>Delete Milestone <?cs var:milestone.name ?></h1>
+ <h1>Supprimer <?cs alt:translation.Milestone ?>le jalon<?cs /alt ?> <?cs var:milestone.name ?></h1>
  <?cs else ?>
- <h1>Milestone <?cs var:milestone.name ?></h1>
+ <h1><?cs alt:translation.Milestone ?>Jalon<?cs /alt ?> <?cs var:milestone.name ?></h1>
  <?cs /if ?>
 
  <?cs if:milestone.mode == "edit" || milestone.mode == "new" ?>
@@ -24,13 +24,13 @@
    <input type="hidden" name="id" value="<?cs var:milestone.name ?>" />
    <input type="hidden" name="action" value="edit" />
    <div class="field">
-    <label>Name of the milestone:<br />
+    <label>Nom <?cs alt:translation.of_milestone ?>du jalon<?cs /alt ?> :<br />
     <input type="text" id="name" name="name" size="32" value="<?cs
       var:milestone.name ?>" /></label>
    </div>
    <fieldset>
-    <legend>Schedule</legend>
-    <label>Due:<br />
+    <legend>Feuille de route</legend>
+    <label>Date limite:<br />
      <input type="text" id="duedate" name="duedate" size="<?cs
        var:len(milestone.date_hint) ?>" value="<?cs
        var:milestone.due_date ?>" title="Format: <?cs var:milestone.date_hint ?>" />
@@ -40,7 +40,7 @@
      <label>
       <input type="checkbox" id="completed" name="completed"<?cs
         if:milestone.completed ?> checked="checked"<?cs /if ?> />
-      Completed:<br />
+      LivrÃ© le:<br />
      </label>
      <label>
       <input type="text" id="completeddate" name="completeddate" size="<?cs
@@ -49,16 +49,16 @@
          var:milestone.datetime_now ?><?cs
         /alt ?>" title="Format: <?cs
         var:milestone.datetime_hint ?>" />
-      <em>Format: <?cs var:milestone.datetime_hint ?></em>
+      <em>Format : <?cs var:milestone.datetime_hint ?></em>
      </label><?cs
      if:len(milestones) ?>
      <br/>
      <input type="checkbox" id="retarget" name="retarget" checked="checked"
             onclick="enableControl('target', this.checked)"/>
      <label>
-      Retarget associated open tickets to milestone
+      RÃ©associer les tickets ouverts <?cs alt:translation.of_milestone ?>au jalon<?cs /alt ?>
       <select id="target" name="target">
-       <option value="">None</option><?cs
+       <option value="">Aucun</option><?cs
        each:name = milestones ?>
        <option><?cs var:name ?></option><?cs
        /each ?>
@@ -80,19 +80,20 @@
    </fieldset>
    <div class="field">
     <fieldset class="iefix">
-     <label for="description">Description (you may use <a tabindex="42" href="<?cs
-       var:trac.href.wiki ?>/WikiFormatting">WikiFormatting</a> here):</label>
+     <label for="description">Description (vous pouvez utiliser ici la syntaxe <a tabindex="42" href="<?cs
+       var:trac.href.wiki ?>/WikiFormatting">Wiki</a>):</label>
      <p><textarea id="description" name="description" class="wikitext" rows="10" cols="78">
 <?cs var:milestone.description_source ?></textarea></p>
     </fieldset>
    </div>
    <div class="buttons">
     <?cs if:milestone.mode == "new"
-     ?><input type="submit" value="Add milestone" /><?cs
+     ?><input type="submit" value="Ajouter <?cs alt:translation.the_milestone ?>le jalon<?cs
+   /alt ?>" /><?cs
     else
-     ?><input type="submit" value="Submit changes" /><?cs
+     ?><input type="submit" value="Enregistrer les modifications" /><?cs
     /if ?>
-    <input type="submit" name="cancel" value="Cancel" />
+    <input type="submit" name="cancel" value="Annuler" />
    </div>
    <script type="text/javascript" src="<?cs
      var:htdocs_location ?>js/wikitoolbar.js"></script>
@@ -101,19 +102,19 @@
   <form action="<?cs var:milestone.href ?>" method="post">
    <input type="hidden" name="id" value="<?cs var:milestone.name ?>" />
    <input type="hidden" name="action" value="delete" />
-   <p><strong>Are you sure you want to delete this milestone?</strong></p>
+   <p><strong>Voulez-vous vraiment dÃ©truire <?cs alt:translation.this_milestone ?>ce jalon<?cs /alt ?> ?</strong></p>
    <input type="checkbox" id="retarget" name="retarget" checked="checked"
        onclick="enableControl('target', this.checked)"/>
-   <label for="target">Retarget associated tickets to milestone</label>
+   <label for="target">RÃ©assigner les tickets associÃ©s sur <?cs alt:translation.this_milestone ?>ce jalon<?cs /alt ?></label>
    <select name="target" id="target">
-    <option value="">None</option><?cs
+    <option value="">Aucun</option><?cs
      each:other = milestones ?><?cs if:other != milestone.name ?>
-      <option><?cs var:other ?></option><?cs 
+      <option><?cs var:other ?></option><?cs
      /if ?><?cs /each ?>
    </select>
    <div class="buttons">
-    <input type="submit" name="cancel" value="Cancel" />
-    <input type="submit" value="Delete milestone" />
+    <input type="submit" name="cancel" value="Annuler" />
+    <input type="submit" value="Supprimer <?cs alt:translation.the_milestone ?>le jalon<?cs /alt ?>" />
    </div>
   </form>
  <?cs else ?>
@@ -121,15 +122,15 @@
   <div class="info">
    <p class="date"><?cs
     if:milestone.completed_date ?>
-     Completed <?cs var:milestone.completed_delta ?> ago (<?cs var:milestone.completed_date ?>)<?cs
+     TerminÃ© <?cs var:milestone.completed_delta ?> avant (<?cs var:milestone.completed_date ?>)<?cs
     elif:milestone.due_date ?><?cs
      if:milestone.late ?>
-      <strong><?cs var:milestone.due_delta ?> late</strong><?cs
+      <strong><?cs var:milestone.due_delta ?> en retard</strong><?cs
      else ?>
-      Due in <?cs var:milestone.due_delta ?><?cs
+      A livrer dans <?cs var:milestone.due_delta ?><?cs
      /if ?> (<?cs var:milestone.due_date ?>)<?cs
     else ?>
-     No date set<?cs
+     Pas de date dÃ©finie<?cs
     /if ?>
    </p><?cs
    with:stats = milestone.stats ?><?cs
@@ -140,24 +141,26 @@
         var:#stats.percent_closed ?>%">
         <a href="<?cs
         var:milestone.queries.closed_tickets ?>" title="<?cs
-        var:#stats.closed_tickets ?> of <?cs
+        var:#stats.closed_tickets ?> sur <?cs
         var:#stats.total_tickets ?> ticket<?cs
-        if:#stats.total_tickets != #1 ?>s<?cs /if ?> closed"></a></td>
+        if:#stats.total_tickets != #1 ?>s<?cs /if ?> fermÃ©<?cs
+        if:#stats.total_tickets != #1 ?>s<?cs /if ?>"></a></td>
       <td class="open" style="width: <?cs
         var:#stats.percent_active ?>%">
         <a href="<?cs
         var:milestone.queries.active_tickets ?>" title="<?cs
-        var:#stats.active_tickets ?> of <?cs
+        var:#stats.active_tickets ?> sur <?cs
         var:#stats.total_tickets ?> ticket<?cs
-        if:#stats.total_tickets != #1 ?>s<?cs /if ?> active"></a>
+        if:#stats.total_tickets != #1 ?>s<?cs /if ?> ouvert<?cs
+        if:#stats.total_tickets != #1 ?>s<?cs /if ?>"></a>
       </tr>
      </table>
      <p class="percent"><?cs var:#stats.percent_closed ?>%</p>
      <dl>
-      <dt>Closed tickets:</dt>
+      <dt>Tickets fermÃ©s :</dt>
       <dd><a href="<?cs var:milestone.queries.closed_tickets ?>"><?cs
         var:stats.closed_tickets ?></a></dd>
-      <dt>Active tickets:</dt>
+      <dt>Tickets ouverts :</dt>
       <dd><a href="<?cs var:milestone.queries.active_tickets ?>"><?cs
         var:stats.active_tickets ?></a></dd>
      </dl><?cs
@@ -167,16 +170,19 @@
   <form id="stats" action="" method="get">
    <fieldset>
     <legend>
-     <label for="by">Ticket status by</label>
+     <label for="by">Statut des tickets par</label>
      <select id="by" name="by" onchange="this.form.submit()"><?cs
      each:group = milestone.stats.available_groups ?>
       <option value="<?cs var:group.name ?>" <?cs
         if:milestone.stats.grouped_by == group.name ?> selected="selected"<?cs
-        /if ?>><?cs var:group.label ?></option><?cs
+        /if ?>><?cs alt:translation[group.label] ?><?cs
+        var:group.label ?><?cs /alt ?></option><?cs
      /each ?></select>
-     <noscript><input type="submit" value="Update" /></noscript>
+     <noscript><input type="submit" value="Actualiser" /></noscript>
     </legend>
-    <table summary="Shows the milestone completion status grouped by <?cs
+    <table summary="Montrer l'Ã©tat de rÃ©alisation des <?cs
+   alt:translation.milestone ?>jalon<?cs
+   /alt ?>s, groupÃ©s par <?cs
       var:milestone.stats.grouped_by ?>"><?cs
      each:group = milestone.stats.groups ?>
       <tr>
@@ -189,16 +195,18 @@
           <td class="closed" style="width: <?cs
             var:#group.percent_closed ?>%"><a href="<?cs
             var:group.queries.closed_tickets ?>" title="<?cs
-           var:group.closed_tickets ?> of <?cs
+           var:group.closed_tickets ?> sur <?cs
            var:group.total_tickets ?> ticket<?cs
-           if:group.total_tickets != #1 ?>s<?cs /if ?> closed"></a>
+           if:group.total_tickets != #1 ?>s<?cs /if ?> fermÃ©<?cs
+           if:group.total_tickets != #1 ?>s<?cs /if ?>"></a>
           </td>
           <td class="open" style="width: <?cs
             var:#group.percent_active ?>%"><a href="<?cs
             var:group.queries.active_tickets ?>" title="<?cs
-           var:group.active_tickets ?> of <?cs
+           var:group.active_tickets ?> sur <?cs
            var:group.total_tickets ?> ticket<?cs
-           if:group.total_tickets != 1 ?>s<?cs /if ?> active"></a>
+           if:group.total_tickets != 1 ?>s<?cs /if ?> ouvert<?cs
+           if:group.total_tickets != #1 ?>s<?cs /if ?>"></a>
           </td>
          </tr>
         </table>
@@ -219,7 +227,9 @@
       if:milestone.id_param ?>
        <input type="hidden" name="id" value="<?cs var:milestone.name ?>" /><?cs
       /if ?>
-      <input type="submit" value="Edit milestone info" accesskey="e" />
+      <input type="submit" value="Editer <?cs
+   alt:translation.the_milestone ?>le jalon<?cs
+   /alt ?>" accesskey="e" />
      </div></form><?cs
     /if ?><?cs
     if:trac.acl.MILESTONE_DELETE ?>
@@ -228,7 +238,9 @@
       if:milestone.id_param ?>
        <input type="hidden" name="id" value="<?cs var:milestone.name ?>" /><?cs
       /if ?>
-      <input type="submit" value="Delete milestone" />
+      <input type="submit" value="Supprimer <?cs
+   alt:translation.the_milestone ?>le jalon<?cs
+   /alt ?>" />
      </div></form><?cs
     /if ?>
    </div><?cs
@@ -236,8 +248,9 @@
  /if ?>
 
  <div id="help">
-  <strong>Note:</strong> See <a href="<?cs
-    var:trac.href.wiki ?>/TracRoadmap">TracRoadmap</a> for help on using the roadmap.
+  <strong>Note :</strong> Voir <a href="<?cs
+    var:trac.href.wiki ?>/TracRoadmap">TracRoadmap</a> pour une aide sur l'utilisation
+    <?cs alt:translation['of_Roadmap'] ?>des Jalons<?cs /alt ?>.
  </div>
 
 </div>
diff --exclude=.svn -Naur trac-0.10.4/templates/newticket.cs trac-0.10.4-PKG/templates/newticket.cs
--- trac-0.10.4/templates/newticket.cs	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/templates/newticket.cs	2007-08-24 10:12:34.000000000 +0200
@@ -7,19 +7,19 @@
 <div id="ctxtnav" class="nav"></div>
 
 <div id="content" class="ticket">
-<h1>Create New Ticket</h1>
+<h1>CrÃ©er un nouveau ticket</h1>
 <?cs include:"site_newticket.cs" ?>
 <form id="newticket" method="post" action="<?cs
   var:trac.href.newticket ?>#preview">
  <?cs if:trac.authname == "anonymous" ?>
   <div class="field">
-   <label for="reporter">Your email or username:</label><br />
+   <label for="reporter">Votre courriel ou nom d'utilisateur :</label><br />
    <input type="text" id="reporter" name="reporter" size="40" value="<?cs
      var:newticket.reporter ?>" /><br />
   </div>
  <?cs /if ?>
  <div class="field">
-  <label for="summary">Short summary:</label><br />
+  <label for="summary">IntitulÃ© :</label><br />
   <input id="summary" type="text" name="summary" size="80" value="<?cs
     var:newticket.summary ?>"/>
  </div><?cs
@@ -30,20 +30,20 @@
   </div><?cs
  /if ?>
  <div class="field">
-  <label for="description">Full description (you may use <a tabindex="42" href="<?cs
-    var:$trac.href.wiki ?>/WikiFormatting">WikiFormatting</a> here):</label><br />
+  <label for="description">Description complÃ¨te (vous pouvez utiliser ici la syntaxe <a tabindex="42" href="<?cs
+    var:$trac.href.wiki ?>/WikiFormatting">Wiki</a>) :</label><br />
   <textarea id="description" name="description" class="wikitext" rows="10" cols="78">
 <?cs var:newticket.description ?></textarea><?cs
   if:newticket.description_preview ?>
    <fieldset id="preview">
-    <legend>Description Preview</legend>
+    <legend>AperÃ§u de la description</legend>
     <?cs var:newticket.description_preview ?>
    </fieldset><?cs
   /if ?>
  </div>
 
  <fieldset id="properties">
-  <legend>Ticket Properties</legend>
+  <legend>PropriÃ©tÃ©s du ticket</legend>
   <input type="hidden" name="action" value="create" />
   <input type="hidden" name="status" value="new" />
   <table><tr><?cs set:num_fields = 0 ?><?cs
@@ -57,7 +57,8 @@
      if:fullrow && idx % 2 ?><?cs set:idx = idx + 1 ?><th class="col2"></th><td></td></tr><tr><?cs /if ?>
      <th class="col<?cs var:idx % 2 + 1 ?>"><?cs
        if:field.type != 'radio' ?><label for="<?cs var:name(field) ?>"><?cs
-       /if ?><?cs alt:field.label ?><?cs var:field.name ?><?cs /alt ?>:<?cs
+       /if ?><?cs alt:translation[name(field)]?><?cs
+       alt:field.label ?><?cs var:field.name ?><?cs /alt ?><?cs /alt ?> :<?cs
        if:field.type != 'radio' ?></label><?cs /if ?></th>
      <td<?cs if:fullrow ?> colspan="3"<?cs /if ?>><?cs
       if:field.type == 'text' ?><input type="text" id="<?cs
@@ -66,9 +67,9 @@
       elif:field.type == 'select' ?><select id="<?cs
         var:name(field) ?>" name="<?cs var:name(field) ?>"><?cs
         if:field.optional ?><option></option><?cs /if ?><?cs
-        each:option = field.options ?><option<?cs
-         if:option == newticket[name(field)] ?> selected="selected"<?cs /if ?>><?cs
-         var:option ?></option><?cs
+        each:option = field.options ?><option value="<?cs var:option ?>"<?cs
+         if:option == newticket[name(field)] ?> selected="selected"<?cs /if ?>><?cs 
+         alt:translation[option]?><?cs var:option ?><?cs /alt ?></option><?cs
         /each ?></select><?cs
       elif:field.type == 'checkbox' ?><input type="hidden" name="checkbox_<?cs
         var:name(field) ?>" /><input type="checkbox" id="<?cs
@@ -105,20 +106,21 @@
  <?cs if newticket.can_attach ?><p>
   <label><input type="checkbox" name="attachment"<?cs
     if:newticket.attachment ?> checked="checked"<?cs /if ?> />
-    I have files to attach to this ticket
+    Joindre des fichiers Ã  ce ticket
   </label>
  </p><?cs
  /if ?>
 
  <div class="buttons">
-  <input type="submit" name="preview" value="Preview" accesskey="r" />&nbsp;
-  <input type="submit" value="Submit ticket" />
+  <input type="submit" name="preview" value="AperÃ§u" accesskey="r" />&nbsp;
+  <input type="submit" value="Enregistrer le ticket" />
  </div>
 </form>
 
-<div id="help">
- <strong>Note:</strong> See <a href="<?cs
-   var:trac.href.wiki ?>/TracTickets">TracTickets</a> for help on using tickets.
+ <div id="help">
+  <strong>Note :</strong> Voir <a href="<?cs var:$trac.href.wiki
+  ?>/TracTickets">TracTickets</a> pour plus d'informations sur l'utilisation des tickets.
+ </div>
 </div>
 </div>
 
diff --exclude=.svn -Naur trac-0.10.4/templates/query.cs trac-0.10.4-PKG/templates/query.cs
--- trac-0.10.4/templates/query.cs	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/templates/query.cs	2007-08-24 10:12:34.000000000 +0200
@@ -4,13 +4,13 @@
 <div id="ctxtnav" class="nav"><?cs
  if:query.report_href ?><ul>
   <li class="first"><a href="<?cs
-    var:query.report_href ?>">Available Reports</a></li>
-  <li class="last">Custom Query</li></ul><?cs
+    var:query.report_href ?>">Rapports disponibles</a></li>
+  <li class="last">RequÃªte personnalisÃ©e</li></ul><?cs
  /if ?>
 </div>
 
 <?cs def:num_matches(v) ?><span class="numrows">(<?cs 
- alt:v ?>No<?cs /alt ?> match<?cs if:v != 1 ?>es<?cs /if ?>)</span><?cs
+ alt:v ?>Pas de<?cs /alt ?> rÃ©sultat<?cs if:v > 1 ?>s<?cs /if ?>)</span><?cs
 /def ?>
 
 <div id="content" class="query">
@@ -18,7 +18,7 @@
 
 <form id="query" method="post" action="<?cs var:trac.href.query ?>">
  <fieldset id="filters">
-  <legend>Filters</legend>
+  <legend>Filtres</legend>
   <?cs def:checkbox_checked(constraint, option) ?><?cs
    set:checked = 0 ?><?cs
    each:value = constraint.values ?><?cs
@@ -28,13 +28,15 @@
    /each ?><?cs
    if:checked ?> checked="checked"<?cs /if ?><?cs
   /def ?>
-  <table summary="Query filters">
+  <table summary="Filtres de requÃªte">
    <tbody><tr style="height: 1px"><td colspan="4"></td></tr></tbody><?cs
    each:field = query.fields ?><?cs
    each:constraint = query.constraints ?><?cs
     if:name(field) == name(constraint) ?>
      <tbody><tr class="<?cs var:name(field) ?>">
-      <th scope="row"><label><?cs var:field.label ?></label></th><?cs
+      <th scope="row"><label>
+      <?cs alt:translation[field.label] ?><?cs var:field.label ?><?cs /alt ?>
+      </label></th><?cs
       if:field.type != "radio" && field.type != "checkbox" ?>
        <td class="mode">
         <select name="<?cs var:name(field) ?>_mode"><?cs
@@ -53,15 +55,16 @@
         each:value = constraint.values ?>
          <select name="<?cs var:name(constraint) ?>"><option></option><?cs
          each:option = field.options ?>
-          <option<?cs if:option == value ?> selected="selected"<?cs /if ?>><?cs
-            var:option ?></option><?cs
+          <option<?cs if:option == value ?> selected="selected"<?cs /if ?>><?cs 
+                alt:translation[option] ?><?cs var:option ?><?cs 
+                /alt ?></option><?cs
          /each ?></select><?cs
          if:name(value) != len(constraint.values) - 1 ?>
           </td>
           <td class="actions"><input type="submit" name="rm_filter_<?cs
              var:name(field) ?>_<?cs var:name(value) ?>" value="-" /></td>
          </tr><tr class="<?cs var:name(field) ?>">
-          <th colspan="2"><label>or</label></th>
+          <th colspan="2"><label>ou</label></th>
           <td class="filter"><?cs
          /if ?><?cs
         /each ?><?cs
@@ -70,18 +73,19 @@
          <input type="checkbox" id="<?cs var:name(field) ?>_<?cs
            var:option ?>" name="<?cs var:name(field) ?>" value="<?cs
            var:option ?>"<?cs call:checkbox_checked(constraint, option) ?> />
-         <label for="<?cs var:name(field) ?>_<?cs var:option ?>"><?cs
-           alt:option ?>none<?cs /alt ?></label><?cs
+         <label for="<?cs var:name(field) ?>_<?cs var:option ?>"><?cs 
+             if:option ?><?cs alt:translation[option] ?><?cs var:option ?><?cs
+             /alt ?><?cs else ?>none<?cs /if?></label><?cs
         /each ?><?cs
        elif:field.type == "checkbox" ?>
         <input type="radio" id="<?cs var:name(field) ?>_on" name="<?cs
           var:name(field) ?>" value="1"<?cs
           if:constraint.mode != '!' ?> checked="checked"<?cs /if ?> />
-        <label for="<?cs var:name(field) ?>_on">yes</label>
+        <label for="<?cs var:name(field) ?>_on">oui</label>
         <input type="radio" id="<?cs var:name(field) ?>_off" name="<?cs
           var:name(field) ?>" value="!1"<?cs
           if:constraint.mode == '!' ?> checked="checked"<?cs /if ?> />
-        <label for="<?cs var:name(field) ?>_off">no</label><?cs
+        <label for="<?cs var:name(field) ?>_off">non</label><?cs
        elif:field.type == "text" ?><?cs
         each:value = constraint.values ?>
         <input type="text" name="<?cs var:name(field) ?>" value="<?cs
@@ -91,7 +95,7 @@
           <td class="actions"><input type="submit" name="rm_filter_<?cs
              var:name(field) ?>_<?cs var:name(value) ?>" value="-" /></td>
          </tr><tr class="<?cs var:name(field) ?>">
-          <th colspan="2"><label>or</label></th>
+          <th colspan="2"><label>ou</label></th>
           <td class="filter"><?cs
          /if ?><?cs
         /each ?><?cs
@@ -107,7 +111,7 @@
    /each ?>
    <tbody><tr class="actions">
     <td class="actions" colspan="4" style="text-align: right">
-     <label for="add_filter">Add filter</label>&nbsp;
+     <label for="add_filter">Ajouter un filtre</label>&nbsp;
      <select name="add_filter" id="add_filter">
       <option></option><?cs
       each:field = query.fields ?>
@@ -115,7 +119,8 @@
          if:field.type == "radio" ?><?cs
           if:len(query.constraints[name(field)]) != 0 ?> disabled="disabled"<?cs
           /if ?><?cs
-         /if ?>><?cs var:field.label ?></option><?cs
+         /if ?>><?cs alt:translation[field.label] ?><?cs var:field.label ?><?cs 
+                /alt ?></option><?cs
       /each ?>	
      </select>
      <input type="submit" name="add" value="+" />
@@ -124,21 +129,22 @@
   </table>
  </fieldset>
  <p class="option">
-  <label for="group">Group results by</label>
+  <label for="group">Grouper les rÃ©sultats par</label>
   <select name="group" id="group">
    <option></option><?cs
    each:field = query.fields ?><?cs
     if:field.type == 'select' || field.type == 'radio' ||
        name(field) == 'owner' ?>
      <option value="<?cs var:name(field) ?>"<?cs
-       if:name(field) == query.group ?> selected="selected"<?cs /if ?>><?cs
-       var:field.label ?></option><?cs
+       if:name(field) == query.group ?> selected="selected"<?cs /if ?>><?cs 
+         alt:translation[field.label] ?><?cs var:field.label ?><?cs 
+         /alt ?></option><?cs
     /if ?><?cs
    /each ?>
   </select>
   <input type="checkbox" name="groupdesc" id="groupdesc"<?cs
     if:query.groupdesc ?> checked="checked"<?cs /if ?> />
-  <label for="groupdesc">descending</label>
+  <label for="groupdesc">dÃ©croissant</label>
   <script type="text/javascript">
     var group = document.getElementById("group");
     var updateGroupDesc = function() {
@@ -151,20 +157,21 @@
  <p class="option">
   <input type="checkbox" name="verbose" id="verbose"<?cs
     if:query.verbose ?> checked="checked"<?cs /if ?> />
-  <label for="verbose">Show full description under each result</label>
+  <label for="verbose">Afficher la description complÃ¨te sous chaque rÃ©sultat</label>
  </p>
  <div class="buttons">
   <input type="hidden" name="order" value="<?cs var:query.order ?>" />
   <?cs if:query.desc ?><input type="hidden" name="desc" value="1" /><?cs /if ?>
-  <input type="submit" name="update" value="Update" />
+  <input type="submit" name="update" value="Actualiser" />
  </div>
  <hr />
 </form>
 <script type="text/javascript"><?cs set:idx = 0 ?>
  var properties={<?cs each:field = query.fields ?><?cs
   var:name(field) ?>:{type:"<?cs var:field.type ?>",label:"<?cs
-  var:field.label ?>",options:[<?cs
-   each:option = field.options ?>"<?cs var:option ?>"<?cs
+  alt:translation[field.label] ?><?cs var:field.label ?><?cs /alt ?>",options:[<?cs
+   each:option = field.options ?>{text:"<?cs alt:translation[option] ?><?cs var:option ?><?cs 
+   /alt ?>",value:"<?cs var:option ?>"}<?cs
     if:name(option) < len(field.options) -1 ?>,<?cs /if ?><?cs
    /each ?>]}<?cs
   set:idx = idx + 1 ?><?cs if:idx < len(query.fields) ?>,<?cs /if ?><?cs
@@ -182,9 +189,10 @@
  <thead><tr><?cs each:header = query.headers ?>
   <th class="<?cs var:header.name ?><?cs if:query.order == header.name ?> <?cs
     if:query.desc ?>desc<?cs else ?>asc<?cs /if ?><?cs /if ?>">
-   <a title="Sort by <?cs var:header.label ?><?cs
-     if:query.order == header.name && !query.desc ?> (descending)<?cs
-     /if ?>" href="<?cs var:header.href ?>"><?cs var:header.label ?></a>
+   <a title="Trier par <?cs var:header.label ?><?cs
+     if:query.order == header.name && !query.desc ?> (dÃ©croissant)<?cs
+     /if ?>" href="<?cs var:header.href ?>"><?cs 
+         alt:translation[header.label] ?><?cs var:header.label ?><?cs /alt ?></a>
   </th><?cs
  /each ?></tr></thead>
 <?cs /def ?>
@@ -209,23 +217,24 @@
   <tr class="<?cs
    if:name(result) % 2 ?>odd<?cs else ?>even<?cs /if ?> prio<?cs
    var:result.priority_value ?><?cs
-   if:result.added ?> added<?cs /if ?><?cs
-   if:result.changed ?> changed<?cs /if ?><?cs
-   if:result.removed ?> removed<?cs /if ?>"><?cs
+   if:result.added ?> ajoutÃ©<?cs /if ?><?cs
+   if:result.changed ?> changÃ©<?cs /if ?><?cs
+   if:result.removed ?> supprimÃ©<?cs /if ?>"><?cs
   each:header = query.headers ?><?cs
    if:name(header) == 0 ?><td class="id"><a href="<?cs
-    var:result.href ?>" title="View ticket"><?cs var:result.id ?></a></td><?cs
+    var:result.href ?>" title="Voir le ticket"><?cs var:result.id ?></a></td><?cs
    else ?><td class="<?cs var:header.name ?>"><?cs
      if:header.name == 'summary' ?><a href="<?cs
-      var:result.href ?>" title="View ticket"><?cs
+      var:result.href ?>" title="Voir ticket"><?cs
       var:result.summary ?></a><?cs
-     else ?><span><?cs var:result[header.name] ?></span><?cs
+     else ?><span><?cs 
+         alt:translation[result[header.name]] ?><?cs var:result[header.name] ?><?cs /alt ?></span><?cs
      /if ?></td><?cs
    /if ?><?cs
   /each ?>
   <?cs if:query.verbose ?>
    </tr><tr class="fullrow"><td colspan="<?cs var:len(query.headers) ?>">
-    <p class="meta">Reported by <strong><?cs var:result.reporter ?></strong>,
+    <p class="meta">RapportÃ© par <strong><?cs var:result.reporter ?></strong>,
     <?cs var:result.time ?><?cs if:result.description ?>:<?cs /if ?></p>
     <?cs if:result.description ?><p><?cs var:result.description ?></p><?cs /if ?>
    </td>
@@ -235,8 +244,8 @@
 /if ?>
 
 <div id="help">
- <strong>Note:</strong> See <a href="<?cs var:trac.href.wiki ?>/TracQuery">TracQuery</a> 
- for help on using queries.
+ <strong>Note:</strong> Voir <a href="<?cs var:trac.href.wiki ?>/TracQuery">TracQuery</a> 
+ pour plus d'informations sur l'utilisation des requÃªtes.
 </div>
 
 </div>
diff --exclude=.svn -Naur trac-0.10.4/templates/query_rss.cs trac-0.10.4-PKG/templates/query_rss.cs
--- trac-0.10.4/templates/query_rss.cs	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/templates/query_rss.cs	2007-08-24 10:13:29.000000000 +0200
@@ -2,15 +2,15 @@
 <rss version="2.0">
  <channel><?cs
   if:project.name_encoded ?>
-   <title><?cs var:project.name_encoded ?>: Ticket Query</title><?cs
+   <title><?cs var:project.name_encoded ?>: RequÃªte de Ticket</title><?cs
   else ?>
-   <title>Ticket Query</title><?cs
+   <title>RequÃªte de Ticket</title><?cs
   /if ?>
   <link><?cs var:query.href ?></link><?cs
   if:project.descr ?>
    <description><?cs var:project.descr ?></description><?cs
   /if ?>
-  <language>en-us</language>
+  <language>fr-fr</language>
   <generator>Trac v<?cs var:trac.version ?></generator><?cs
   if:chrome.logo.src ?>
    <image>
diff --exclude=.svn -Naur trac-0.10.4/templates/report.cs trac-0.10.4-PKG/templates/report.cs
--- trac-0.10.4/templates/report.cs	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/templates/report.cs	2007-08-24 10:15:43.000000000 +0200
@@ -2,14 +2,14 @@
 <?cs include "macros.cs" ?>
 
 <div id="ctxtnav" class="nav">
- <h2>Report Navigation</h2>
+ <h2>Consultation des rapports</h2>
  <ul><li class="first"><?cs
    if:chrome.links.up.0.href ?><a href="<?cs
-    var:chrome.links.up.0.href ?>">Available Reports</a><?cs
-   else ?>Available Reports<?cs
+    var:chrome.links.up.0.href ?>">Rapports disponibles</a><?cs
+   else ?>Rapports disponibles<?cs
   /if ?></li><?cs
   if:report.query_href ?><li class="last"><a href="<?cs
-   var:report.query_href ?>">Custom Query</a></li><?cs
+   var:report.query_href ?>">RequÃªte personnalisÃ©e</a></li><?cs
   /if ?></ul>
 </div>
 
@@ -84,7 +84,7 @@
  <?cs if:report.mode == "list" ?>
   <h1><?cs var:title ?><?cs
    if:report.numrows && report.id != -1 ?><span class="numrows"> (<?cs
-    var:report.numrows ?> matches)</span><?cs
+    var:report.numrows ?> trouvÃ©s)</span><?cs
    /if ?></h1><?cs
    if:report.description ?><div id="description"><?cs
     var:report.description ?></div><?cs
@@ -94,15 +94,15 @@
      <div class="buttons"><?cs
       if:report.can_modify ?><form action="" method="get"><div>
        <input type="hidden" name="action" value="edit" />
-       <input type="submit" value="Edit report" accesskey="e" />
+       <input type="submit" value="Ã‰dition du rapport" accesskey="e" />
       </div></form><?cs /if ?><?cs
       if:report.can_create ?><form action="" method="get"><div>
        <input type="hidden" name="action" value="copy" />
-       <input type="submit" value="Copy report" />
+       <input type="submit" value="Copie du rapport" />
       </div></form><?cs /if ?><?cs
       if:report.can_delete ?><form action="" method="get"><div>
        <input type="hidden" name="action" value="delete" />
-       <input type="submit" value="Delete report" />
+       <input type="submit" value="Suppression du rapport" />
       </div></form><?cs /if ?>
      </div><?cs
     /if ?><?cs
@@ -145,14 +145,14 @@
          <?cs if cell.hidden || cell.hidehtml ?>
          <?cs elif name(cell) == "ticket" || name(cell) == "id" ?>
            <?cs call:report_cell('ticket',
-                                 '<a title="View ticket" href="'+
+                                 '<a title="Voir le ticket" href="'+
                                  $cell.ticket_href+'">#'+$cell+'</a>') ?>
          <?cs elif name(cell) == "summary" && cell.ticket_href ?>
-           <?cs call:report_cell('summary', '<a title="View ticket" href="'+
+           <?cs call:report_cell('summary', '<a title="Voir le ticket" href="'+
                                  $cell.ticket_href+'">'+$cell+'</a>') ?>
          <?cs elif name(cell) == "report" ?>
            <?cs call:report_cell('report',
-                '<a title="View report" href="'+$cell.report_href+'">{'+$cell+'}</a>') ?>
+                '<a title="Voir le rapport" href="'+$cell.report_href+'">{'+$cell+'}</a>') ?>
            <?cs set:report_href=$cell.report_href ?>
          <?cs elif name(cell) == "time" ?>
            <?cs call:report_cell('date', $cell.date) ?>
@@ -164,8 +164,16 @@
            <?cs call:report_cell('', $cell.parsed) ?>
          <?cs elif name(cell) == "title" && $report.id == -1 ?>
            <?cs call:report_cell('title',
-                                 '<a  title="View report" href="'+
+                                 '<a  title="Voir le rapport" href="'+
                                  $report_href+'">'+$cell+'</a>') ?>
+         <?cs elif translation[cell] && (
+                   (name(cell) == "type") || 
+                   (name(cell) == "priority") ||
+                   (name(cell) == "severity") || 
+                   (name(cell) == "resolution") ||
+                   (name(cell) == "status")
+                   ) ?>
+           <?cs call:report_cell(name(cell), translation[cell]) ?>
          <?cs else ?>
            <?cs call:report_cell(name(cell), $cell) ?>
          <?cs /if ?>
@@ -177,13 +185,13 @@
    if:report.id == -1 && report.can_create?><div class="buttons">
     <form action="" method="get"><div>
      <input type="hidden" name="action" value="new" />
-     <input type="submit" value="Create new report" />
+     <input type="submit" value="CrÃ©er un nouveau rapport" />
     </div></form></div><?cs
    /if ?><?cs
    if report.message ?>
     <div class="system-message"><?cs var report.message ?></div><?cs
    elif:idx == #0 ?>
-    <div id="report-notfound">No matches found.</div><?cs
+    <div id="report-notfound">Aucun correspondance trouvÃ©e.</div><?cs
    /if ?>
 
  <?cs elif:report.mode == "delete" ?>
@@ -192,10 +200,10 @@
   <form action="<?cs var:report.href ?>" method="post">
    <input type="hidden" name="id" value="<?cs var:report.id ?>" />
    <input type="hidden" name="action" value="delete" />
-   <p><strong>Are you sure you want to delete this report?</strong></p>
+   <p><strong>Etes-vous certain de vouloir dÃ©truire ce rapport?</strong></p>
    <div class="buttons">
-    <input type="submit" name="cancel" value="Cancel" />
-    <input type="submit" value="Delete report" />
+    <input type="submit" name="cancel" value="Annuler" />
+    <input type="submit" value="Supprimer le rapport" />
    </div>
   </form>
  
@@ -206,27 +214,27 @@
     <div>
      <input type="hidden" name="action" value="<?cs var:report.action ?>" />
      <div class="field">
-      <label for="title">Report Title:</label><br />
+      <label for="title">Titre du rapport :</label><br />
       <input type="text" id="title" name="title"
              value="<?cs var:report.title ?>" size="50" /><br />
      </div>
      <div class="field">
       <label for="description">
-       Description:</label> (You may use <a tabindex="42" href="<?cs
-         var:$trac.href.wiki ?>/WikiFormatting">WikiFormatting</a> here)
-      </label><br />
+       Description :</label> (Vous pouvez utiliser ici la syntaxe <a tabindex="42" href="<?cs
+         var:$trac.href.wiki ?>/WikiFormatting">Wiki</a>)
+      <br />
       <textarea id="description" name="description" class="wikitext" rows="10" cols="78">
 <?cs var:report.description ?></textarea>
      </div>
      <div class="field">
       <label for="query">
-       SQL Query for Report:</label><br />
+       RequÃªte SQL du rapport :</label><br />
       <textarea id="query" name="query" cols="85" rows="20"><?cs
         var:report.sql ?></textarea>
      </div>
      <div class="buttons">
-      <input type="submit" value="Save report" />
-      <input type="submit" name="cancel" value="Cancel" />
+      <input type="submit" value="Enregistrer le rapport" />
+      <input type="submit" name="cancel" value="Annuler" />
      </div>
     </div>
     <script type="text/javascript" src="<?cs
@@ -235,9 +243,9 @@
  <?cs /if?>
  
  <div id="help">
-  <strong>Note:</strong> See <a href="<?cs
-    var:trac.href.wiki ?>/TracReports">TracReports</a> for help on using and
-  creating reports.
+  <strong>Note:</strong> Voir <a href="<?cs
+    var:trac.href.wiki ?>/TracReports">TracReports</a> pour une aide sur 
+  l'utilisation et la crÃ©ation des rapports.
  </div>
  
 </div>
diff --exclude=.svn -Naur trac-0.10.4/templates/report_rss.cs trac-0.10.4-PKG/templates/report_rss.cs
--- trac-0.10.4/templates/report_rss.cs	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/templates/report_rss.cs	2007-08-21 14:51:09.000000000 +0200
@@ -8,8 +8,8 @@
  /if ?>
  <link><?cs var:base_host ?><?cs 
   var:trac.href.report ?>/<?cs var:report.id ?></link>
- <description>Trac Report - <?cs var:report.title ?></description>
- <language>en-us</language>
+ <description>Rapport Trac - <?cs var:report.title ?></description>
+ <language>fr-fr</language>
  <generator>Trac v<?cs var:trac.version ?></generator><?cs
   if:chrome.logo.src ?>
    <image>
@@ -47,7 +47,7 @@
    <link><?cs var:link ?></link>
    <guid isPermaLink="false"><?cs var:link ?></guid>
    <description><?cs var:descr ?></description>
-   <category>Report</category>
+   <category>Rapport</category>
   </item><?cs
  /each ?></channel>
 </rss>
diff --exclude=.svn -Naur trac-0.10.4/templates/roadmap.cs trac-0.10.4-PKG/templates/roadmap.cs
--- trac-0.10.4/templates/roadmap.cs	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/templates/roadmap.cs	2007-08-24 14:18:47.000000000 +0200
@@ -4,35 +4,39 @@
 <div id="ctxtnav" class="nav"></div>
 
 <div id="content" class="roadmap">
- <h1>Roadmap</h1>
+ <h1><?cs alt:translation.Roadmap ?>Feuille de route<?cs /alt ?></h1>
 
  <form id="prefs" method="get" action="">
   <div>
    <input type="checkbox" id="showall" name="show" value="all"<?cs
     if:roadmap.showall ?> checked="checked"<?cs /if ?> />
-   <label for="showall">Show already completed milestones</label>
+   <label for="showall">Montrer les <?cs
+   alt:translation.milestone ?>jalon<?cs
+   /alt ?>s dÃ©jÃ  atteints</label>
   </div>
   <div class="buttons">
-   <input type="submit" value="Update" />
+   <input type="submit" value="Actualiser" />
   </div>
  </form>
 
  <ul class="milestones"><?cs each:milestone = roadmap.milestones ?>
   <li class="milestone">
    <div class="info">
-    <h2><a href="<?cs var:milestone.href ?>">Milestone: <em><?cs
+    <h2><a href="<?cs var:milestone.href ?>"><?cs
+   alt:translation.Milestone ?>Jalon<?cs
+   /alt ?> : <em><?cs
       var:milestone.name ?></em></a></h2>
     <p class="date"<?cs
      if:milestone.completed_date ?> title="<?cs var:milestone.completed_date ?>">
-      Completed <?cs var:milestone.completed_delta ?> ago<?cs
+      Atteint <?cs var:milestone.completed_delta ?> avant<?cs
      elif:milestone.due_date ?> title="<?cs var:milestone.due_date ?>"><?cs
       if:milestone.late ?>
-       <strong><?cs var:milestone.due_delta ?> late</strong><?cs
+       <strong><?cs var:milestone.due_delta ?> en retard</strong><?cs
       else ?>
-       Due in <?cs var:milestone.due_delta ?><?cs
+       PrÃ©vu pour <?cs var:milestone.due_delta ?><?cs
       /if ?> (<?cs var:milestone.due_date ?>)<?cs
      else ?>>
-      No date set<?cs
+      Pas de date dÃ©finie<?cs
      /if ?>
     </p><?cs
     with:stats = milestone.stats ?><?cs
@@ -42,23 +46,25 @@
         <td class="closed" style="width: <?cs
           var:#stats.percent_closed ?>%"><a href="<?cs
           var:milestone.queries.closed_tickets ?>" title="<?cs
-          var:#stats.closed_tickets ?> of <?cs
+          var:#stats.closed_tickets ?> de <?cs
           var:#stats.total_tickets ?> ticket<?cs
-          if:#stats.total_tickets != #1 ?>s<?cs /if ?> closed"></a></td>
+          if:#stats.total_tickets != #1 ?>s<?cs /if ?> fermÃ©<?cs
+          if:#stats.total_tickets != #1 ?>s<?cs /if ?>"></a></td>
         <td class="open" style="width: <?cs
           var:#stats.percent_active ?>%"><a href="<?cs
           var:milestone.queries.active_tickets ?>" title="<?cs
-          var:#stats.active_tickets ?> of <?cs
+          var:#stats.active_tickets ?> sur <?cs
           var:#stats.total_tickets ?> ticket<?cs
-          if:#stats.total_tickets != #1 ?>s<?cs /if ?> active"></a></td>
+          if:#stats.total_tickets != #1 ?>s<?cs /if ?> ouvert<?cs
+          if:#stats.total_tickets != #1 ?>s<?cs /if ?>"></a></td>
        </tr>
       </table>
       <p class="percent"><?cs var:#stats.percent_closed ?>%</p>
       <dl>
-       <dt>Closed tickets:</dt>
+       <dt>Tickets fermÃ©s:</dt>
        <dd><a href="<?cs var:milestone.queries.closed_tickets ?>"><?cs
          var:stats.closed_tickets ?></a></dd>
-       <dt>Active tickets:</dt>
+       <dt>Tickets ouverts :</dt>
        <dd><a href="<?cs var:milestone.queries.active_tickets ?>"><?cs
          var:stats.active_tickets ?></a></dd>
       </dl><?cs
@@ -72,14 +78,15 @@
   <div class="buttons">
    <form method="get" action="<?cs var:trac.href.milestone ?>"><div>
     <input type="hidden" name="action" value="new" />
-    <input type="submit" value="Add new milestone" />
+    <input type="submit" value="CrÃ©er un <?cs alt:translation.new_milestone ?>nouveau jalon<?cs /alt ?>" />
    </div></form>
   </div><?cs
  /if ?>
 
  <div id="help">
-  <strong>Note:</strong> See <a href="<?cs
-    var:trac.href.wiki ?>/TracRoadmap">TracRoadmap</a> for help on using the roadmap.
+  <strong>Note:</strong> Voir <a href="<?cs
+    var:trac.href.wiki ?>/TracRoadmap">TracRoadmap</a> pour une aide sur
+    l'utilisation <?cs alt:translation['of_Roadmap'] ?>du planning<?cs /alt ?>.
  </div>
 
 </div>
diff --exclude=.svn -Naur trac-0.10.4/templates/search.cs trac-0.10.4-PKG/templates/search.cs
--- trac-0.10.4/templates/search.cs	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/templates/search.cs	2007-08-24 10:19:45.000000000 +0200
@@ -23,19 +23,20 @@
 
 <div id="content" class="search">
 
-<h1><label for="q">Search</label></h1>
+<h1><label for="q">Recherche</label></h1>
 <form action="<?cs var:trac.href.search ?>" method="get">
  <p>
   <input type="text" id="q" name="q" size="40" value="<?cs var:search.q ?>" />
   <input type="hidden" name="noquickjump" value="1" />
-  <input type="submit" value="Search" />
+  <input type="submit" value="Rechercher" />
  </p>
  <p><?cs
   each filter=search.filters ?>
    <input type="checkbox" id="<?cs var:filter.name?>" 
           name="<?cs var:filter.name?>" <?cs
      if:filter.active ?>checked="checked"<?cs /if ?> />
-   <label for="<?cs var:filter.name ?>"><?cs var:filter.label?></label><?cs
+   <label for="<?cs var:filter.name ?>"><?cs alt:translation[filter.label] ?>
+   <?cs var:filter.label?><?cs /alt ?></label><?cs
   /each ?>
  </p>
 </form><?cs 
@@ -43,24 +44,24 @@
 if:len(search.result) || len(search.quickjump) ?>
  <hr /><?cs
  if:len(search.result) ?>
- <h2>Search results <?cs
+ <h2>RÃ©sultats de la recherche <?cs
   if:search.n_pages > 1 ?>(<?cs
    var:(search.page-1) * search.page_size + 1 ?> - <?cs
    var:(search.page-1) * search.page_size + len(search.result) ?> 
-   of <?cs var:search.n_hits?>)<?cs
+   sur <?cs var:search.n_hits?>)<?cs
   /if ?></h2><?cs
  /if ?>
  <div id="searchable">
   <dl id="results"><?cs
    if:len(search.quickjump) ?>
-    <dt id=quickjump><a href="<?cs var:search.quickjump.href ?>">Quickjump to <?cs var:search.quickjump.name ?></a></dt>
+    <dt id=quickjump><a href="<?cs var:search.quickjump.href ?>">Raccourci vers <?cs var:search.quickjump.name ?></a></dt>
     <dd><?cs var:search.quickjump.description ?></dd><?cs 
    /if ?><?cs 
    each item=search.result ?>
     <dt><a href="<?cs var:item.href ?>"><?cs var:item.title ?></a></dt>
     <dd><?cs var:item.excerpt ?></dd>
     <dd>
-     <span class="author">By <?cs var:item.author ?></span> &mdash;
+     <span class="author">Par <?cs var:item.author ?></span> &mdash;
      <span class="date"><?cs var:item.date ?></span><?cs
      if:item.keywords ?> &mdash
       <span class="keywords">Keywords: <em><?cs var:item.keywords ?></em></span><?cs
@@ -90,12 +91,12 @@
  /if ?><?cs
 
 elif:search.q && !search.quickjump ?>
- <div id="notfound">No matches found.</div><?cs
+ <div id="notfound">Aucune correspondance trouvÃ©e.</div><?cs
 /if ?>
 
 <div id="help">
- <strong>Note:</strong> See <a href="<?cs
-   var:trac.href.wiki ?>/TracSearch">TracSearch</a>  for help on searching.
+ <strong>Note:</strong> Voir <a href="<?cs
+   var:trac.href.wiki ?>/TracSearch">TracSearch</a> pour une aide sur la recherche.
 </div>
 
 </div>
diff --exclude=.svn -Naur trac-0.10.4/templates/settings.cs trac-0.10.4-PKG/templates/settings.cs
--- trac-0.10.4/templates/settings.cs	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/templates/settings.cs	2007-08-24 10:20:16.000000000 +0200
@@ -5,59 +5,61 @@
 
 <div id="content" class="settings">
 
- <h1>Settings and Session Management</h1>
+ <h1>Configuration et Gestion de session</h1>
 
- <h2>User Settings</h2>
+ <h2>ParamÃ¨tres utilisateur</h2>
  <p>
- This page lets you customize and personalize your Trac settings. Session
- settings are stored on the server and identified using  a 'Session Key'
- stored in a browser cookie. The cookie lets Trac restore your settings.
+ Cette page vous permet de personnaliser les rÃ©glages de Trac.
+ La configuration de la session est mÃ©morisÃ©e sur le serveur, et identifiÃ©e 
+ grÃ¢ce Ã  une 'clef de session' contenue dans un cookie.
+ Ce cookie permet Ã  Trac de rÃ©cupÃ©rer et d'utiliser vos rÃ©glages.
  </p>
  <form method="post" action="">
  <div>
-  <h3>Personal Information</h3>
+  <h3>Informations personnelles</h3>
   <div>
    <input type="hidden" name="action" value="save" />
-   <label for="name">Name:</label>
+   <label for="name">Nom:</label>
    <input type="text" id="name" name="name" class="textwidget" size="30"
           value="<?cs var:settings.name ?>" />
   </div>
   <div>
-   <label for="email">Email:</label>
+   <label for="email">Courriel:</label>
    <input type="text" id="email" name="email" class="textwidget" size="30"
           value="<?cs var:settings.email ?>" />
   </div><?cs
   if:settings.session_id ?>
    <h3>Session</h3>
    <div>
-    <label for="newsid">Session Key:</label>
+    <label for="newsid">Clef de session:</label>
     <input type="text" id="newsid" name="newsid" class="textwidget" size="30"
            value="<?cs var:settings.session_id ?>" />
-    <p>The session key is used to identify stored  custom settings and session
-    data on the server. Automatically generated by default, you may change it
-    to something easier to remember at any time if you wish to use your settings
-    in a different web browser.</p>
+    <p>La clef de session est utilisÃ©e pour identifier les rÃ©glages personnels
+   et les donnÃ©es de session sur le serveur. Par dÃ©faut, elle est gÃ©nÃ©rÃ©e 
+   automatiquement, mais vous pouvez la modifier quand vous le souhaitez, si vous 
+   voulez la rendre plus facilement mÃ©morisable, de maniÃ¨re Ã  l'utiliser sur un 
+   autre navigateur</p>
    </div><?cs
   /if ?>
   <div>
    <br />
-   <input type="submit" value="Submit changes" />
+   <input type="submit" value="Enregistrer les changements" />
   </div >
  </div>
 </form><?cs
 if:settings.session_id ?>
  <hr />
- <h2>Load Session</h2>
- <p>You may load a previously created session by entering the corresponding
- session key below and clicking 'Recover'. This lets you share settings between
- multiple computers and/or web browsers.</p>
+ <h2>Recharger une session</h2>
+ <p>Vous pouvez recharger une session prÃ©cÃ©demment crÃ©Ã©e en entrant votre clef ci-dessous,
+puis en cliquant sur 'Recharger'. Ainsi, vous pouvez partager les rÃ©glages entre
+plusieurs ordinateurs et/ou plusieurs navigateurs.</p>
  <form method="post" action="">
   <div>
    <input type="hidden" name="action" value="load" />
-   <label for="loadsid">Existing Session Key:</label>
+   <label for="loadsid">Clef de session existante:</label>
    <input type="text" id="loadsid" name="loadsid" class="textwidget" size="30"
           value="" />
-   <input type="submit" value="Recover" />
+   <input type="submit" value="Recharger" />
   </div>
  </form><?cs
 /if ?>
diff --exclude=.svn -Naur trac-0.10.4/templates/ticket.cs trac-0.10.4-PKG/templates/ticket.cs
--- trac-0.10.4/templates/ticket.cs	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/templates/ticket.cs	2007-08-24 10:25:26.000000000 +0200
@@ -2,26 +2,26 @@
 <?cs include "macros.cs" ?>
 
 <div id="ctxtnav" class="nav">
- <h2>Ticket Navigation</h2><?cs
+ <h2>Consultation des tickets</h2><?cs
  with:links = chrome.links ?><?cs
   if:len(links.prev) || len(links.up) || len(links.next) ?><ul><?cs
    if:len(links.prev) ?>
     <li class="first<?cs if:!len(links.up) && !len(links.next) ?> last<?cs /if ?>">
      &larr; <a href="<?cs var:links.prev.0.href ?>" title="<?cs
-       var:links.prev.0.title ?>">Previous Ticket</a>
+       var:links.prev.0.title ?>">Ticket prÃ©cÃ©dent</a>
     </li><?cs
    /if ?><?cs
    if:len(links.up) ?>
     <li class="<?cs if:!len(links.prev) ?>first<?cs /if ?><?cs
                     if:!len(links.next) ?> last<?cs /if ?>">
      <a href="<?cs var:links.up.0.href ?>" title="<?cs
-       var:links.up.0.title ?>">Back to Query</a>
+       var:links.up.0.title ?>">Retour Ã  la requÃªte</a>
     </li><?cs
    /if ?><?cs
    if:len(links.next) ?>
     <li class="<?cs if:!len(links.prev) && !len(links.up) ?>first <?cs /if ?>last">
      <a href="<?cs var:links.next.0.href ?>" title="<?cs
-       var:links.next.0.title ?>">Next Ticket</a> &rarr;
+       var:links.next.0.title ?>">Ticket suivant</a> &rarr;
     </li><?cs
    /if ?></ul><?cs
   /if ?><?cs
@@ -31,28 +31,32 @@
 <div id="content" class="ticket">
 
  <h1>Ticket #<?cs var:ticket.id ?> <span class="status">(<?cs 
-  var:ticket.status ?><?cs 
-  if:ticket.type ?> <?cs var:ticket.type ?><?cs 
-  /if ?><?cs 
-  if:ticket.resolution ?>: <?cs var:ticket.resolution ?><?cs 
+  if:ticket.type ?><?cs alt:translation[ticket.type] ?><?cs 
+      var:ticket.type ?> / <?cs /alt ?><?cs 
+  /if ?><?cs
+      alt:translation[ticket.status] ?><?cs 
+      var:ticket.status ?><?cs /alt ?><?cs 
+  if:ticket.resolution ?> : <?cs
+      alt:translation[ticket.resolution] ?><?cs 
+      var:ticket.resolution ?><?cs /alt ?><?cs 
   /if ?>)</span></h1>
 
 <div id="searchable">
 <div id="ticket">
  <div class="date">
-  <p title="<?cs var:ticket.opened ?>">Opened <?cs var:ticket.opened_delta ?> ago</p><?cs
+  <p title="<?cs var:ticket.opened ?>">Ouvert il y a <?cs var:ticket.opened_delta ?></p><?cs
   if:ticket.lastmod ?>
-   <p title="<?cs var:ticket.lastmod ?>">Last modified <?cs var:ticket.lastmod_delta ?> ago</p>
+   <p title="<?cs var:ticket.lastmod ?>">ModifiÃ© il y a <?cs var:ticket.lastmod_delta ?></p>
   <?cs /if ?>
  </div>
  <h2 class="summary"><?cs var:ticket.summary ?></h2>
  <table class="properties">
   <tr>
-   <th id="h_reporter">Reported by:</th>
+   <th id="h_reporter">RapportÃ© par :</th>
    <td headers="h_reporter"><?cs var:ticket.reporter ?></td>
-   <th id="h_owner">Assigned to:</th>
+   <th id="h_owner">AssignÃ© Ã  :</th>
    <td headers="h_owner"><?cs var:ticket.owner ?><?cs
-     if:ticket.status == 'assigned' ?> (accepted)<?cs /if ?></td>
+     if:ticket.status == 'assigned' ?> (acceptÃ©)<?cs /if ?></td>
   </tr><tr><?cs
   each:field = ticket.fields ?><?cs
    if:!field.skip ?><?cs
@@ -63,9 +67,11 @@
   each:field = ticket.fields ?><?cs
    if:!field.skip ?><?cs set:fullrow = field.type == 'textarea' ?><?cs
     if:fullrow && idx % 2 ?><th></th><td></td></tr><tr><?cs /if ?>
-    <th id="h_<?cs var:name(field) ?>"><?cs var:field.label ?>:</th>
+    <th id="h_<?cs var:name(field) ?>"><?cs
+    alt:translation[field.label] ?><?cs var:field.label ?><?cs /alt ?> :</th>
     <td<?cs if:fullrow ?> colspan="3"<?cs /if ?> headers="h_<?cs
-      var:name(field) ?>"><?cs var:ticket[name(field)] ?></td><?cs 
+      var:name(field) ?>"><?cs alt:translation[ticket[name(field)]] ?><?cs 
+      var:ticket[name(field)] ?><?cs /alt ?></td><?cs 
     if:idx % 2 || fullrow ?></tr><tr><?cs 
     elif:idx == num_fields - 1 ?><th></th><td></td><?cs
     /if ?><?cs set:idx = idx + #fullrow + 1 ?><?cs
@@ -79,11 +85,12 @@
      if:trac.acl.TICKET_APPEND ?>
      <span class="inlinebuttons">
       <input type="hidden" name="replyto" value="description" />
-      <input type="submit" value="Reply" title="Reply, quoting this description" />
+      <input type="submit" value="<?cs
+    alt:translation['Reply'] ?>RÃ©pondre<?cs /alt ?>" title="RÃ©pondre en reprenant cette description" />
      </span><?cs
      /if ?>
      Description <?cs
-     if:ticket.description.lastmod ?><span class="lastmod" title="<?cs var:ticket.description.lastmod ?>">(Last modified by <?cs var:ticket.description.author ?>)</span><?cs
+     if:ticket.description.lastmod ?><span class="lastmod" title="<?cs var:ticket.description.lastmod ?>">(DerniÃ¨re modification par <?cs var:ticket.description.author ?>)</span><?cs
      /if ?>
     </h3>
     <?cs var:ticket.description.formatted ?>
@@ -100,7 +107,7 @@
 <a href="#comment:<?cs var:cnum ?>"><small><?cs var:prefix ?><?cs var:cnum ?></small></a>
 <?cs /def ?>
 
-<?cs if:len(ticket.changes) ?><h2>Change History</h2>
+<?cs if:len(ticket.changes) ?><h2>Historique des modifications</h2>
 <div id="changelog"><?cs
  each:change = ticket.changes ?>
  <form method="get" action="<?cs var:ticket.href ?>#comment" class="printableform">
@@ -110,17 +117,17 @@
     if:trac.acl.TICKET_APPEND ?>
     <span class="inlinebuttons">
      <input type="hidden" name="replyto" value="<?cs var:change.cnum ?>" />
-     <input type="submit" value="Reply" title="Reply to comment <?cs var:change.cnum ?>" />
+     <input type="submit" value="RÃ©pondre" title="RÃ©pondre au commentaire <?cs var:change.cnum ?>" />
     </span><?cs
     /if ?>
     <span class="threading"><?cs
      set:nreplies = len(ticket.replies[change.cnum]) ?><?cs
      if:nreplies || change.replyto ?>(<?cs
-      if:change.replyto ?>in reply to: <?cs 
+      if:change.replyto ?>en rÃ©ponse Ã  : <?cs 
        call:commentref('&uarr;&nbsp;', change.replyto) ?><?cs if nreplies ?>; <?cs /if ?><?cs
       /if ?><?cs
       if nreplies ?><?cs
-       call:plural('follow-up', nreplies) ?>: <?cs 
+       call:plural('suivi', nreplies) ?>: <?cs 
        each:reply = ticket.replies[change.cnum] ?><?cs 
         call:commentref('&darr;&nbsp;', reply) ?><?cs 
        /each ?><?cs 
@@ -128,18 +135,21 @@
     /if ?>
     </span><?cs
    /if ?><?cs
-   var:change.date ?> changed by <?cs var:change.author ?>
+   var:change.date ?> modifiÃ© par <?cs var:change.author ?>
   </h3><?cs
   if:len(change.fields) ?>
    <ul class="changes"><?cs
    each:field = change.fields ?>
-    <li><strong><?cs var:name(field) ?></strong> <?cs
-    if:name(field) == 'attachment' ?><em><?cs var:field.new ?></em> added<?cs
-    elif:field.old && field.new ?>changed from <em><?cs
-     var:field.old ?></em> to <em><?cs var:field.new ?></em><?cs
-    elif:!field.old && field.new ?>set to <em><?cs var:field.new ?></em><?cs
-    elif:field.old && !field.new ?>deleted<?cs
-    else ?>changed<?cs
+    <li><strong><?cs alt:translation[name(field)] ?><?cs 
+      var:name(field) ?><?cs /alt ?>&nbsp;:</strong> <?cs
+    if:name(field) == 'attachment' ?><em><?cs var:field.new ?></em> ajoutÃ© <?cs
+    elif:field.old && field.new ?>modifiÃ© de <em><?cs alt:translation[field.old] ?><?cs
+     var:field.old ?><?cs /alt ?></em> Ã  <em><?cs alt:translation[field.new] ?><?cs 
+     var:field.new ?><?cs /alt ?></em><?cs
+    elif:!field.old && field.new ?>dÃ©fini Ã  <em><?cs alt:translation[field.new] ?><?cs 
+     var:field.new ?><?cs /alt ?></em><?cs
+    elif:field.old && !field.new ?>effacÃ©<?cs
+    else ?>modifiÃ©<?cs
     /if ?>.</li>
     <?cs
    /each ?>
@@ -155,53 +165,53 @@
 <?cs if:trac.acl.TICKET_CHGPROP || trac.acl.TICKET_APPEND ?>
 <form action="<?cs var:ticket.href ?>#preview" method="post">
  <hr />
- <h3><a name="edit" onfocus="document.getElementById('comment').focus()">Add/Change #<?cs
+ <h3><a name="edit" onfocus="document.getElementById('comment').focus()">Ajouter/Changer #<?cs
    var:ticket.id ?> (<?cs var:ticket.summary ?>)</a></h3>
  <?cs if:trac.authname == "anonymous" ?>
   <div class="field">
-   <label for="author">Your email or username:</label><br />
+   <label for="author">Votre courriel ou nom d'utilisateur:</label><br />
    <input type="text" id="author" name="author" size="40"
      value="<?cs var:ticket.reporter_id ?>" /><br />
   </div>
  <?cs /if ?>
  <div class="field">
   <fieldset class="iefix">
-   <label for="comment">Comment (you may use <a tabindex="42" href="<?cs
-     var:trac.href.wiki ?>/WikiFormatting">WikiFormatting</a> here):</label><br />
+   <label for="comment">Commentaire (vous pouvez utiliser ici la syntaxe <a tabindex="42" href="<?cs
+     var:trac.href.wiki ?>/WikiFormatting">Wiki</a>) :</label><br />
    <p><textarea id="comment" name="comment" class="wikitext" rows="10" cols="78">
 <?cs var:ticket.comment ?></textarea></p>
   </fieldset><?cs
   if ticket.comment_preview ?>
    <fieldset id="preview">
-    <legend>Comment Preview</legend>
+    <legend>AperÃ§u du commentaire</legend>
     <?cs var:ticket.comment_preview ?>
    </fieldset><?cs
   /if ?>
  </div>
 
  <?cs if:trac.acl.TICKET_CHGPROP ?><fieldset id="properties">
-  <legend>Change Properties</legend>
+  <legend>Modifier les propriÃ©tÃ©s</legend>
   <table><tr>
-   <th><label for="summary">Summary:</label></th>
+   <th><label for="summary">IntitulÃ© :</label></th>
    <td class="fullrow" colspan="3"><input type="text" id="summary" name="summary" value="<?cs
      var:ticket.summary ?>" size="70" /></td>
    </tr><?cs
    if:len(ticket.fields.type.options) ?>
    <tr>
-    <th><label for="type">Type:</label></th>
+    <th><label for="type">Type :</label></th>
     <td><?cs 
      call:hdf_select(ticket.fields.type.options, 'type', ticket.type, 0) ?>
     </td>
    </tr><?cs
    /if ?><?cs
    if:trac.acl.TICKET_ADMIN ?><tr>
-    <th><label for="description">Description:</label></th>
+    <th><label for="description">Description :</label></th>
     <td class="fullrow" colspan="3">
      <textarea id="description" name="description" class="wikitext" rows="10" cols="68">
 <?cs var:ticket.description ?></textarea>
     </td>
    </tr><tr>
-    <th><label for="reporter">Reporter:</label></th>
+    <th><label for="reporter">Rapporteur :</label></th>
     <td class="fullrow" colspan="3"><input type="text" value="<?cs 
       var:ticket.reporter ?>" id="reporter" name="reporter" size="70" /></td>
    </tr><?cs
@@ -217,7 +227,10 @@
      if:fullrow && idx % 2 ?><?cs set:idx = idx + 1 ?><th class="col2"></th><td></td></tr><tr><?cs /if ?>
      <th class="col<?cs var:idx % 2 + 1 ?>"><?cs
        if:field.type != 'radio' ?><label for="<?cs var:name(field) ?>"><?cs
-       /if ?><?cs alt:field.label ?><?cs var:field.name ?><?cs /alt ?>:<?cs
+       /if ?><?cs alt:translation[field.label] ?><?cs
+      alt:translation[field.name] ?><?cs
+      alt:field.label ?><?cs 
+      var:field.name ?><?cs /alt ?><?cs /alt ?><?cs /alt ?> :<?cs
        if:field.type != 'radio' ?></label><?cs /if ?></th>
      <td<?cs if:fullrow ?> colspan="3"<?cs /if ?>><?cs
       if:field.type == 'text' ?><input type="text" id="<?cs
@@ -227,9 +240,9 @@
         var:name(field) ?>" name="<?cs
         var:name(field) ?>"><?cs
         if:field.optional ?><option></option><?cs /if ?><?cs
-        each:option = field.options ?><option<?cs
-         if:option == ticket[name(field)] ?> selected="selected"<?cs /if ?>><?cs
-         var:option ?></option><?cs
+        each:option = field.options ?><option value="<?cs var:option ?>"<?cs
+         if:option == ticket[name(field)] ?> selected="selected"<?cs /if ?>><?cs 
+         alt:translation[option]?><?cs var:option ?><?cs /alt ?></option><?cs
         /each ?></select><?cs
       elif:field.type == 'checkbox' ?><input type="hidden" name="checkbox_<?cs
         var:name(field) ?>" /><input type="checkbox" id="<?cs
@@ -272,28 +285,30 @@
      /if ?> /><?cs
   /def ?>
   <?cs call:action_radio('leave') ?>
-   <label for="leave">leave as <?cs var:ticket.status ?></label><br /><?cs
+   <label for="leave">Conserver en tant que <?cs 
+     alt:translation[ticket.status] ?><?cs var:ticket.status ?><?cs 
+     /alt ?></label><br /><?cs
   if:ticket.actions.accept ?><?cs
    call:action_radio('accept') ?>
-   <label for="accept">accept ticket</label><br /><?cs
+   <label for="accept">Accepter le ticket</label><br /><?cs
   /if ?><?cs
   if:ticket.actions.reopen ?><?cs
    call:action_radio('reopen') ?>
-   <label for="reopen">reopen ticket</label><br /><?cs
+   <label for="reopen">RÃ©ouvrir le ticket</label><br /><?cs
   /if ?><?cs
   if:ticket.actions.resolve ?><?cs
    call:action_radio('resolve') ?>
-   <label for="resolve">resolve</label><?cs
+   <label for="resolve">RÃ©soudre</label><?cs
    if:len(ticket.fields.resolution.options) ?>
-    <label for="resolve_resolution">as:</label>
+    <label for="resolve_resolution">en tant que:</label>
     <?cs call:hdf_select(ticket.fields.resolution.options, "resolve_resolution",
                          ticket.resolve_resolution, 0) ?><br /><?cs
    /if ?><?cs
   /if ?><?cs
   if:ticket.actions.reassign ?><?cs
    call:action_radio('reassign') ?>
-   <label for="reassign">reassign</label>
-   <label>to:<?cs
+   <label for="reassign">RÃ©assigner</label>
+   <label>Ã :<?cs
    if:len(ticket.fields.owner.options) ?><?cs
     call:hdf_select(ticket.fields.owner.options, "reassign_owner",
                     ticket.reassign_owner, 1) ?><?cs
@@ -329,8 +344,8 @@
   <input type="hidden" name="ts" value="<?cs var:ticket.ts ?>" />
   <input type="hidden" name="replyto" value="<?cs var:ticket.replyto ?>" />
   <input type="hidden" name="cnum" value="<?cs var:ticket.cnum ?>" />
-  <input type="submit" name="preview" value="Preview" accesskey="r" />&nbsp;
-  <input type="submit" value="Submit changes" />
+  <input type="submit" name="preview" value="AperÃ§u" accesskey="r" />&nbsp;
+  <input type="submit" value="Enregistrer les modifications" />
  </div>
 </form>
 <?cs /if ?>
diff --exclude=.svn -Naur trac-0.10.4/templates/ticket_notify_email.cs trac-0.10.4-PKG/templates/ticket_notify_email.cs
--- trac-0.10.4/templates/ticket_notify_email.cs	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/templates/ticket_notify_email.cs	2007-08-21 15:17:48.000000000 +0200
@@ -1,23 +1,23 @@
-<?cs var:email.ticket_body_hdr ?>
-<?cs var:email.ticket_props ?><?cs 
-if:ticket.new ?>
-<?cs var:ticket.description ?>
-<?cs else ?><?cs 
- if:email.changes_body ?>
-Changes (by <?cs var:ticket.change.author ?>):
-
-<?cs var:email.changes_body ?><?cs
- /if ?><?cs 
-var:email.changes_descr 
-?><?cs if:ticket.change.comment ?>
-Comment<?cs 
- if:!email.changes_body ?> (by <?cs 
-   var:ticket.change.author ?>)<?cs /if ?>:
-
-<?cs var:ticket.change.comment ?>
-<?cs /if ?><?cs 
-/if ?>
--- 
-Ticket URL: <<?cs var:ticket.link ?>>
-<?cs var:project.name ?> <<?cs var:project.url ?>>
+<?cs var:email.ticket_body_hdr ?>
+<?cs var:email.ticket_props ?><?cs 
+if:ticket.new ?>
+<?cs var:ticket.description ?>
+<?cs else ?><?cs 
+ if:email.changes_body ?>
+Modifications (par <?cs var:ticket.change.author ?>):
+
+<?cs var:email.changes_body ?><?cs
+ /if ?><?cs 
+var:email.changes_descr 
+?><?cs if:ticket.change.comment ?>
+Commentaire<?cs 
+ if:!email.changes_body ?> (par <?cs 
+   var:ticket.change.author ?>)<?cs /if ?>:
+
+<?cs var:ticket.change.comment ?>
+<?cs /if ?><?cs 
+/if ?>
+-- 
+Ticket URL: <<?cs var:ticket.link ?>>
+<?cs var:project.name ?> <<?cs var:project.url ?>>
 <?cs var:project.descr ?>
\ Pas de fin de ligne Ã  la fin du fichier.
diff --exclude=.svn -Naur trac-0.10.4/templates/ticket_rss.cs trac-0.10.4-PKG/templates/ticket_rss.cs
--- trac-0.10.4/templates/ticket_rss.cs	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/templates/ticket_rss.cs	2007-08-24 10:27:47.000000000 +0200
@@ -9,7 +9,7 @@
   /if ?>
   <link><?cs var:base_host ?><?cs var:ticket.href ?></link>
   <description><?cs var:ticket.description.formatted ?></description>
-  <language>en-us</language>
+  <language>fr-fr</language>
   <generator>Trac v<?cs var:trac.version ?></generator><?cs
   if:chrome.logo.src ?>
    <image>
@@ -36,12 +36,12 @@
     &lt;ul&gt;<?cs
     each:field = change.fields ?>
     &lt;li&gt;&lt;strong&gt;<?cs name:field ?>&lt;/strong&gt; <?cs
-     if:!field.old ?>set to &lt;em&gt;<?cs
+     if:!field.old ?>dÃ©fini Ã  &lt;em&gt;<?cs
       var:field.new ?>&lt;/em&gt;<?cs
-     elif:field.new ?>changed from &lt;em&gt;<?cs var:field.old
-      ?>&lt;/em&gt; to &lt;em&gt;<?cs
+     elif:field.new ?>modifiÃ© de &lt;em&gt;<?cs var:field.old
+      ?>&lt;/em&gt; Ã  &lt;em&gt;<?cs
       var:field.new ?>&lt;/em&gt;.<?cs
-     else ?>deleted<?cs
+     else ?>supprimÃ©<?cs
      /if ?>&lt;/li&gt;<?cs
     /each ?>
     &lt;/ul&gt;
diff --exclude=.svn -Naur trac-0.10.4/templates/timeline.cs trac-0.10.4-PKG/templates/timeline.cs
--- trac-0.10.4/templates/timeline.cs	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/templates/timeline.cs	2007-08-24 10:28:22.000000000 +0200
@@ -3,24 +3,25 @@
 <div id="ctxtnav" class="nav"></div>
 
 <div id="content" class="timeline">
-<h1>Timeline</h1>
+ <h1>Historique</h1>
 
 <form id="prefs" method="get" action="<?cs var:trac.href.timeline ?>">
  <div>
-  <label>View changes from <input type="text" size="10" name="from" value="<?cs
-    var:timeline.from ?>" /></label> and
+  <label>Voir les modifications depuis le <input type="text" size="10" name="from" value="<?cs
+    var:timeline.from ?>" /></label> et les
   <label><input type="text" size="3" name="daysback" value="<?cs
-    var:timeline.daysback ?>" /> days back</label>.
+    var:timeline.daysback ?>" /> jours prÃ©cÃ©dents</label>.
  </div>
  <fieldset><?cs
   each:filter = timeline.filters ?>
    <label><input type="checkbox" name="<?cs var:filter.name ?>"<?cs
      if:filter.enabled ?> checked="checked"<?cs /if ?> /> <?cs
-     var:filter.label ?></label><?cs
+     alt:translation[filter.label] ?><?cs
+     var:filter.label ?><?cs /alt ?></label><?cs
   /each ?>
  </fieldset>
  <div class="buttons">
-  <input type="submit" name="update" value="Update" />
+  <input type="submit" name="update" value="Actualiser" />
  </div>
 </form><?cs
 
@@ -43,8 +44,8 @@
 
 <div id="help">
  <hr />
- <strong>Note:</strong> See <a href="<?cs var:trac.href.wiki ?>/TracTimeline">TracTimeline</a> 
- for information about the timeline view.
+ <strong>Note:</strong> Voir <a href="<?cs var:trac.href.wiki ?>/TracTimeline">TracTimeline</a> 
+ pour une information sur l'Historique.
 </div>
 
 </div>
diff --exclude=.svn -Naur trac-0.10.4/templates/timeline_rss.cs trac-0.10.4-PKG/templates/timeline_rss.cs
--- trac-0.10.4/templates/timeline_rss.cs	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/templates/timeline_rss.cs	2007-08-24 10:28:38.000000000 +0200
@@ -7,8 +7,8 @@
    <title><?cs var:title ?></title><?cs
   /if ?>
   <link><?cs var:base_host ?><?cs var:trac.href.timeline ?></link>
-  <description>Trac Timeline</description>
-  <language>en-us</language>
+  <description>Historique Trac</description>
+  <language>fr-fr</language>
   <generator>Trac v<?cs var:trac.version ?></generator><?cs
   if:chrome.logo.src ?>
    <image>
diff --exclude=.svn -Naur trac-0.10.4/templates/wiki.cs trac-0.10.4-PKG/templates/wiki.cs
--- trac-0.10.4/templates/wiki.cs	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/templates/wiki.cs	2007-08-24 10:32:45.000000000 +0200
@@ -2,33 +2,33 @@
 <?cs include "macros.cs" ?>
 
 <div id="ctxtnav" class="nav">
- <h2>Wiki Navigation</h2>
+ <h2>Consultation Documentation</h2>
  <ul><?cs
   if:wiki.action == "diff" ?>
    <li class="first"><?cs
      if:len(chrome.links.prev) ?> &larr;
       <a class="prev" href="<?cs var:chrome.links.prev.0.href ?>" title="<?cs
-       var:chrome.links.prev.0.title ?>">Previous Change</a><?cs
+       var:chrome.links.prev.0.title ?>">Modification prÃ©cÃ©dente</a><?cs
      else ?>
-      <span class="missing">&larr; Previous Change</span><?cs
+      <span class="missing">&larr; Modification prÃ©cÃ©dente</span><?cs
      /if ?>
    </li>
-   <li><a href="<?cs var:wiki.history_href ?>">Page History</a></li>
+   <li><a href="<?cs var:wiki.history_href ?>">Historique</a></li>
    <li class="last"><?cs
      if:len(chrome.links.next) ?>
       <a class="next" href="<?cs var:chrome.links.next.0.href ?>" title="<?cs
-       var:chrome.links.next.0.title ?>">Next Change</a> &rarr; <?cs
+       var:chrome.links.next.0.title ?>">Modification suivante</a> &rarr; <?cs
      else ?>
-      <span class="missing">Next Change &rarr;</span><?cs
+      <span class="missing">Modification suivante &rarr;</span><?cs
      /if ?>
    </li><?cs
   elif:wiki.action == "history" ?>
-   <li class="last"><a href="<?cs var:wiki.current_href ?>">View Latest Version</a></li><?cs
+   <li class="last"><a href="<?cs var:wiki.current_href ?>">Version actuelle</a></li><?cs
   else ?>
-   <li><a href="<?cs var:trac.href.wiki ?>">Start Page</a></li>
-   <li><a href="<?cs var:trac.href.wiki ?>/TitleIndex">Index by Title</a></li>
-   <li><a href="<?cs var:trac.href.wiki ?>/RecentChanges">Index by Date</a></li>
-   <li class="last"><a href="<?cs var:wiki.last_change_href ?>">Last Change</a></li><?cs
+   <li><a href="<?cs var:trac.href.wiki ?>">Page d'accueil</a></li>
+   <li><a href="<?cs var:trac.href.wiki ?>/TitleIndex">Sommaire</a></li>
+   <li><a href="<?cs var:trac.href.wiki ?>/RecentChanges">Modif. rÃ©centes</a></li>
+   <li class="last"><a href="<?cs var:wiki.last_change_href ?>">DerniÃ¨re modif.</a></li><?cs
   /if ?>
  </ul>
  <hr />
@@ -39,25 +39,25 @@
  <?cs if wiki.action == "delete" ?><?cs
   if:wiki.version - wiki.old_version > 1 ?><?cs
    set:first_version = wiki.old_version + 1 ?><?cs
-   set:version_range = "versions "+first_version+" to "+wiki.version+" of " ?><?cs
-   set:delete_what = "those versions" ?><?cs
+   set:version_range = "les versions "+first_version+" Ã  "+wiki.version+" de " ?><?cs
+   set:delete_what = "ces versions" ?><?cs
   elif:wiki.version ?><?cs
-   set:version_range = "version "+wiki.version+" of " ?><?cs
-   set:delete_what = "this version" ?><?cs
+   set:version_range = "la version "+wiki.version+" de " ?><?cs
+   set:delete_what = "cette version" ?><?cs
   else ?><?cs
    set:version_range = "" ?><?cs
    set:delete_what = "page" ?><?cs
   /if ?>
-  <h1>Delete <?cs var:version_range ?><a href="<?cs
+  <h1>Supprimer <?cs var:version_range ?><a href="<?cs
     var:wiki.current_href ?>"><?cs var:wiki.page_name ?></a></h1>
   <form action="<?cs var:wiki.current_href ?>" method="post">
    <input type="hidden" name="action" value="delete" />
-   <p><strong>Are you sure you want to <?cs
-    if:!?wiki.version ?>completely <?cs
-    /if ?>delete <?cs var:version_range ?>this page?</strong><br /><?cs
+   <p><strong>Etes-vous sÃ»r de vouloir <?cs
+    if:!?wiki.version ?>dÃ©finitivement <?cs 
+    /if ?>effacer <?cs var:version_range ?>cette page?</strong><br /><?cs
    if:wiki.only_version ?>
-    This is the only version the page, so the page will be removed
-    completely!<?cs
+    Cette version est la seule de cette page, la page va donc Ãªtre dÃ©finitivement 
+    supprimÃ©e!<?cs
    /if ?><?cs
    if:?wiki.version ?>
     <input type="hidden" name="version" value="<?cs var:wiki.version ?>" /><?cs
@@ -65,95 +65,95 @@
    if:wiki.old_version ?>
     <input type="hidden" name="old_version" value="<?cs var:wiki.old_version ?>" /><?cs
    /if ?>
-   This is an irreversible operation.</p>
+   Cette opÃ©ration est irrÃ©versible.</p>
    <div class="buttons">
-    <input type="submit" name="cancel" value="Cancel" />
-    <input type="submit" value="Delete <?cs var:delete_what ?>" />
+    <input type="submit" name="cancel" value="Annuler" />
+    <input type="submit" value="Supprimer <?cs var:delete_what ?>" />
    </div>
   </form>
 
  <?cs elif:wiki.action == "diff" ?>
-  <h1>Changes <?cs
-    if:wiki.old_version ?>between
-     <a href="<?cs var:wiki.current_href ?>?version=<?cs var:wiki.old_version?>">Version <?cs var:wiki.old_version?></a> and <?cs
-    else ?>from <?cs
+  <h1>Modifications <?cs
+    if:wiki.old_version ?>entre 
+     <a href="<?cs var:wiki.current_href ?>?version=<?cs var:wiki.old_version?>">la version <?cs var:wiki.old_version?></a> et <?cs
+    else ?>de <?cs
     /if ?>
-    <a href="<?cs var:wiki.current_href ?>?version=<?cs var:wiki.version?>">Version <?cs var:wiki.version?></a> of
+    <a href="<?cs var:wiki.current_href ?>?version=<?cs var:wiki.version?>">la version <?cs var:wiki.version?></a> de 
     <a href="<?cs var:wiki.current_href ?>"><?cs var:wiki.page_name ?></a></h1>
   <form method="post" id="prefs" action="<?cs var:wiki.current_href ?>">
    <div>
     <input type="hidden" name="action" value="diff" />
     <input type="hidden" name="version" value="<?cs var:wiki.version ?>" />
     <input type="hidden" name="old_version" value="<?cs var:wiki.old_version ?>" />
-    <label>View differences <select name="style">
+    <label>Afficher les diffÃ©rences <select name="style">
      <option value="inline"<?cs
        if:diff.style == 'inline' ?> selected="selected"<?cs
-       /if ?>>inline</option>
+       /if ?>>au fil</option>
      <option value="sidebyside"<?cs
        if:diff.style == 'sidebyside' ?> selected="selected"<?cs
-       /if ?>>side by side</option>
+       /if ?>>cÃ´te Ã  cÃ´te</option>
     </select></label>
     <div class="field">
-     Show <input type="text" name="contextlines" id="contextlines" size="2"
+     Afficher <input type="text" name="contextlines" id="contextlines" size="2"
        maxlength="3" value="<?cs var:diff.options.contextlines ?>" />
-     <label for="contextlines">lines around each change</label>
+     <label for="contextlines">lignes entourant chaque modification</label>
     </div>
     <fieldset id="ignore">
-     <legend>Ignore:</legend>
+     <legend>Ignorer :</legend>
      <div class="field">
       <input type="checkbox" id="blanklines" name="ignoreblanklines"<?cs
         if:diff.options.ignoreblanklines ?> checked="checked"<?cs /if ?> />
-      <label for="blanklines">Blank lines</label>
+      <label for="blanklines">Lignes vides</label>
      </div>
      <div class="field">
       <input type="checkbox" id="case" name="ignorecase"<?cs
         if:diff.options.ignorecase ?> checked="checked"<?cs /if ?> />
-      <label for="case">Case changes</label>
+      <label for="case">DiffÃ©rences majuscule/minuscule</label>
      </div>
      <div class="field">
       <input type="checkbox" id="whitespace" name="ignorewhitespace"<?cs
         if:diff.options.ignorewhitespace ?> checked="checked"<?cs /if ?> />
-      <label for="whitespace">White space changes</label>
+      <label for="whitespace">DiffÃ©rences d'espacement</label>
      </div>
     </fieldset>
     <div class="buttons">
-     <input type="submit" name="update" value="Update" />
+     <input type="submit" name="update" value="Actualiser" />
     </div>
    </div>
   </form>
   <dl id="overview">
-   <dt class="property author">Author:</dt>
+   <dt class="property author">Auteur :</dt>
    <dd class="author"><?cs
-    if:wiki.num_changes > 1 ?><em class="multi">(multiple changes)</em><?cs
+    if:wiki.num_changes > 1 ?><em class="multi">(modifications multiples)</em><?cs
     else ?><?cs var:wiki.author ?> <span class="ipnr">(IP: <?cs
      var:wiki.ipnr ?>)</span><?cs
     /if ?></dd>
-   <dt class="property time">Timestamp:</dt>
+   <dt class="property time">Date :</dt>
    <dd class="time"><?cs
-    if:wiki.num_changes > 1 ?><em class="multi">(multiple changes)</em><?cs
-    elif:wiki.time ?><?cs var:wiki.time ?> (<?cs var:wiki.time_delta ?> ago)<?cs
+    if:wiki.num_changes > 1 ?><em class="multi">(modifications multiples)</em><?cs
+    elif:wiki.time ?><?cs var:wiki.time ?> (<?cs var:wiki.time_delta ?> auparavant)<?cs
     else ?>--<?cs
     /if ?></dd>
-   <dt class="property message">Comment:</dt>
+   <dt class="property message">Commentaire :</dt>
    <dd class="message"><?cs
-    if:wiki.num_changes > 1 ?><em class="multi">(multiple changes)</em><?cs
+    if:wiki.num_changes > 1 ?><em class="multi">(modifications multiples)</em><?cs
     else ?><?cs var:wiki.comment ?><?cs /if ?></dd>
   </dl>
   <div class="diff">
    <div id="legend">
-    <h3>Legend:</h3>
+    <h3>LÃ©gende :</h3>
     <dl>
-     <dt class="unmod"></dt><dd>Unmodified</dd>
-     <dt class="add"></dt><dd>Added</dd>
-     <dt class="rem"></dt><dd>Removed</dd>
-     <dt class="mod"></dt><dd>Modified</dd>
+     <dt class="unmod"></dt><dd>Non modifiÃ©</dd>
+     <dt class="add"></dt><dd>AjoutÃ©</dd>
+     <dt class="rem"></dt><dd>SupprimÃ©</dd>
+     <dt class="mod"></dt><dd>ModifiÃ©</dd>
     </dl>
    </div>
    <ul class="entries">
     <li class="entry">
      <h2><?cs var:wiki.page_name ?></h2><?cs
       if:diff.style == 'sidebyside' ?>
-      <table class="sidebyside" summary="Differences">
+      <table class="sidebyside" summary="DiffÃ©rences">
        <colgroup class="l"><col class="lineno" /><col class="content" /></colgroup>
        <colgroup class="r"><col class="lineno" /><col class="content" /></colgroup>
        <thead><tr>
@@ -165,7 +165,7 @@
        /each ?>
       </table><?cs
      else ?>
-      <table class="inline" summary="Differences">
+      <table class="inline" summary="DiffÃ©rences">
        <colgroup><col class="lineno" /><col class="lineno" /><col class="content" /></colgroup>
        <thead><tr>
         <th title="Version <?cs var:wiki.old_version ?>">v<?cs
@@ -187,29 +187,29 @@
      <input type="hidden" name="action" value="delete" />
      <input type="hidden" name="version" value="<?cs var:wiki.version ?>" />
      <input type="hidden" name="old_version" value="<?cs var:wiki.old_version ?>" />
-     <input type="submit" name="delete_version" value="Delete <?cs
-     if:wiki.version - wiki.old_version > 1 ?> version <?cs
-      var:wiki.old_version+1 ?> to <?cs
-     /if ?>version <?cs var:wiki.version ?>" />
+     <input type="submit" name="delete_version" value="Supprimer <?cs
+     if:wiki.version - wiki.old_version > 1 ?>les versions <?cs 
+      var:wiki.old_version+1 ?> Ã  <?cs else ?>la version <?cs
+     /if ?><?cs var:wiki.version ?>" />
     </form><?cs
    /if ?>
   </div>
 
  <?cs elif wiki.action == "history" ?>
-  <h1>Change History of <a href="<?cs var:wiki.current_href ?>"><?cs
+  <h1>Historique des modifications de <a href="<?cs var:wiki.current_href ?>"><?cs
     var:wiki.page_name ?></a></h1>
   <?cs if:len(wiki.history) ?><form class="printableform" method="get" action="">
    <input type="hidden" name="action" value="diff" />
    <div class="buttons">
-    <input type="submit" value="View changes" />
+    <input type="submit" value="Voir les modifications" />
    </div>
-   <table id="wikihist" class="listing" summary="Change history">
+   <table id="wikihist" class="listing" summary="Historique des modifications">
     <thead><tr>
      <th class="diff"></th>
      <th class="version">Version</th>
      <th class="date">Date</th>
-     <th class="author">Author</th>
-     <th class="comment">Comment</th>
+     <th class="author">Auteur</th>
+     <th class="comment">Commentaire</th>
     </tr></thead>
     <tbody><?cs each:item = wiki.history ?>
      <tr class="<?cs if:name(item) % #2 ?>even<?cs else ?>odd<?cs /if ?>">
@@ -224,7 +224,7 @@
         var:item.url ?>" title="View this version"><?cs
         var:item.version ?></a></td>
       <td class="date"><?cs var:item.time ?></td>
-      <td class="author" title="IP-Address: <?cs var:item.ipaddr ?>"><?cs
+      <td class="author" title="Adresse IP: <?cs var:item.ipaddr ?>"><?cs
         var:item.author ?></td>
       <td class="comment"><?cs var:item.comment ?></td>
      </tr>
@@ -232,30 +232,30 @@
    </table><?cs
    if:len(wiki.history) > #10 ?>
     <div class="buttons">
-     <input type="submit" value="View changes" />
+     <input type="submit" value="Voir les modifications" />
     </div><?cs
    /if ?>
   </form><?cs /if ?>
 
  <?cs else ?>
   <?cs if wiki.action == "edit" || wiki.action == "preview" || wiki.action == "collision" ?>
-   <h1>Editing "<?cs var:wiki.page_name ?>"</h1><?cs
+   <h1>Edition "<?cs var:wiki.page_name ?>"</h1><?cs
     if wiki.action == "preview" ?>
      <table id="info" summary="Revision info"><tbody><tr>
        <th scope="col">
-        Preview of future version <?cs var:$wiki.version+1 ?> (modified by <?cs var:wiki.author ?>)
+        AperÃ§u de la nouvelle version <?cs var:$wiki.version+1 ?> (modifiÃ© par <?cs var:wiki.author ?>)
        </th></tr><tr>
        <td class="message"><?cs var:wiki.comment_html ?></td>
       </tr>
      </tbody></table>
      <fieldset id="preview">
-      <legend>Preview (<a href="#edit">skip</a>)</legend>
+      <legend>AperÃ§u (<a href="#edit">passer</a>)</legend>
         <div class="wikipage"><?cs var:wiki.page_html ?></div>
      </fieldset><?cs
      elif wiki.action =="collision"?>
      <div class="system-message">
-       Sorry, this page has been modified by somebody else since you started
-       editing. Your changes cannot be saved.
+       DÃ©solÃ©, cette page a Ã©tÃ© modifiÃ©e par quelqu'un d'autre depuis que vous
+       avez dÃ©butÃ© l'Ã©dition. Vos modifications ne peuvent Ãªtre enregistrÃ©es.
      </div><?cs
     /if ?>
    <form id="edit" action="<?cs var:wiki.current_href ?>" method="post">
@@ -265,7 +265,7 @@
      <input type="hidden" id="scroll_bar_pos" name="scroll_bar_pos" value="<?cs
        var:wiki.scroll_bar_pos ?>" />
      <div id="rows">
-      <label for="editrows">Adjust edit area height:</label>
+      <label for="editrows">Ajuster la hauteur de la fenÃªtre d'Ã©dition:</label>
       <select size="1" name="editrows" id="editrows" tabindex="43"
         onchange="resizeTextArea('text', this.options[selectedIndex].value)"><?cs
        loop:rows = 8, 42, 4 ?>
@@ -288,21 +288,21 @@
      </script>
     </fieldset>
     <div id="help">
-     <b>Note:</b> See <a href="<?cs var:$trac.href.wiki
-?>/WikiFormatting">WikiFormatting</a> and <a href="<?cs var:$trac.href.wiki
-?>/TracWiki">TracWiki</a> for help on editing wiki content.
+     <b>Note:</b> Voir l'aide sur le <a href="<?cs var:$trac.href.wiki
+?>/WikiFormatting">format Wiki</a> et le <a href="<?cs var:$trac.href.wiki
+?>/TracWiki">Wiki de Trac</a> pour l'Ã©dition du contenu.
     </div>
     <fieldset id="changeinfo">
-     <legend>Change information</legend>
+     <legend>Informations sur les modifications</legend>
      <?cs if:trac.authname == "anonymous" ?>
       <div class="field">
-       <label>Your email or username:<br />
+       <label>Votre courriel ou nom d'utilisateur:<br />
        <input id="author" type="text" name="author" size="30" value="<?cs
          var:wiki.author ?>" /></label>
       </div>
      <?cs /if ?>
      <div class="field">
-      <label>Comment about this change (optional):<br />
+      <label>Description (optionnelle) des modifications apportÃ©es:<br />
       <input id="comment" type="text" name="comment" size="60" value="<?cs
         var:wiki.comment?>" /></label>
      </div><br />
@@ -310,19 +310,19 @@
       <div class="options">
        <label><input type="checkbox" name="readonly" id="readonly" <?cs
          if wiki.readonly == "1"?>checked="checked"<?cs /if ?> />
-       Page is read-only</label>
+       Page non modifiable</label>
       </div>
      <?cs /if ?>
     </fieldset>
     <div class="buttons"><?cs
      if wiki.action == "collision" ?>
-      <input type="submit" name="preview" value="Preview" disabled="disabled" />&nbsp;
-      <input type="submit" name="save" value="Submit changes" disabled="disabled" />&nbsp;
+      <input type="submit" name="preview" value="AperÃ§u" disabled="disabled" />&nbsp;
+      <input type="submit" name="save" value="Enregistrer les modifications" disabled="disabled" />&nbsp;
      <?cs else ?>
-      <input type="submit" name="preview" value="Preview" accesskey="r" />&nbsp;
-      <input type="submit" name="save" value="Submit changes" />&nbsp;
+      <input type="submit" name="preview" value="AperÃ§u" accesskey="a" />&nbsp;
+      <input type="submit" name="save" value="Enregistrer les modifications" />&nbsp;
      <?cs /if ?>
-     <input type="submit" name="cancel" value="Cancel" />
+     <input type="submit" name="cancel" value="Annuler" />
     </div>
     <script type="text/javascript" src="<?cs
       var:htdocs_location ?>js/wikitoolbar.js"></script>
@@ -332,7 +332,7 @@
    <?cs if:wiki.comment_html ?>
     <table id="info" summary="Revision info"><tbody><tr>
       <th scope="col">
-       Version <?cs var:wiki.version ?> (modified by <?cs var:wiki.author ?>, <?cs var:wiki.age ?> ago)
+       Version <?cs var:wiki.version ?> (modifiÃ© par <?cs var:wiki.author ?>, <?cs var:wiki.age ?> auparavant)
       </th></tr><tr>
       <td class="message"><?cs var:wiki.comment_html ?></td>
      </tr>
@@ -342,13 +342,13 @@
     <div id="searchable"><?cs var:wiki.page_html ?></div>
    </div>
    <?cs if:len(wiki.attachments) ?>
-    <h3 id="tkt-changes-hdr">Attachments</h3>
+    <h3 id="tkt-changes-hdr">PiÃ¨ces jointes</h3>
     <ul class="tkt-chg-list"><?cs
      each:attachment = wiki.attachments ?><li class="tkt-chg-change"><a href="<?cs
       var:attachment.href ?>"><?cs
       var:attachment.filename ?></a> (<?cs var:attachment.size ?>) -<?cs
       if:attachment.description ?><q><?cs var:attachment.description ?></q>,<?cs
-      /if ?> added by <?cs var:attachment.author ?> on <?cs
+      /if ?> ajoutÃ© par <?cs var:attachment.author ?> le <?cs
       var:attachment.time ?>.</li><?cs
      /each ?>
     </ul>
@@ -359,13 +359,13 @@
     if:trac.acl.WIKI_MODIFY ?>
      <form method="get" action="<?cs var:wiki.current_href ?>"><div>
       <input type="hidden" name="action" value="edit" />
-      <input type="submit" value="<?cs if:wiki.exists ?>Edit<?cs
-        else ?>Create<?cs /if ?> this page" accesskey="e" />
+      <input type="submit" value="<?cs if:wiki.exists ?>Editer<?cs
+        else ?>CrÃ©er<?cs /if ?> cette page" accesskey="e" />
      </div></form><?cs
      if:wiki.exists ?>
       <form method="get" action="<?cs var:wiki.attach_href ?>"><div>
        <input type="hidden" name="action" value="new" />
-       <input type="submit" value="Attach file" />
+       <input type="submit" value="Joindre un fichier" />
       </div></form><?cs
      /if ?><?cs
     /if ?><?cs
@@ -374,15 +374,15 @@
       <input type="hidden" name="action" value="delete" />
       <input type="hidden" name="version" value="<?cs var:wiki.version ?>" /><?cs
       if:wiki.version == wiki.latest_version ?>
-       <input type="submit" name="delete_version" value="Delete this version" /><?cs
+       <input type="submit" name="delete_version" value="Supprimer cette version" /><?cs
       /if ?>
-      <input type="submit" value="Delete page" />
+      <input type="submit" value="Supprimer cette page" />
      </div></form>
     <?cs /if ?>
    </div>
   <?cs /if ?>
   <script type="text/javascript">
-   addHeadingLinks(document.getElementById("searchable"), "Link to this section");
+   addHeadingLinks(document.getElementById("searchable"), "Lien vers cette section");
   </script>
  <?cs /if ?>
  <?cs /if ?>
diff --exclude=.svn -Naur trac-0.10.4/THANKS trac-0.10.4-PKG/THANKS
--- trac-0.10.4/THANKS	2007-04-20 15:41:52.000000000 +0200
+++ trac-0.10.4-PKG/THANKS	2007-08-24 12:28:31.000000000 +0200
@@ -50,6 +50,7 @@
  * Noah Slater                    nslater@gmail.com
  * Bill Soudan                    bill@soudan.net
  * Ludvig Strigeus                
+ * Nicolas Ternisien              nicolas.ternisien@gmail.com
  * Alec Thomas                    alec@swapoff.org
  * Jani Tiainen                   redetin@luukku.com
  * Zilvinas Valinskas             zilvinas@gemtek.lt
diff --exclude=.svn -Naur trac-0.10.4/trac/About.py trac-0.10.4-PKG/trac/About.py
--- trac-0.10.4/trac/About.py	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/trac/About.py	2007-08-24 10:33:19.000000000 +0200
@@ -38,7 +38,7 @@
 
     def get_navigation_items(self, req):
         yield ('metanav', 'about',
-               html.a('About Trac', href=req.href.about()))
+               html.a(u'Ã€ propos de Trac', href=req.href.about()))
 
     # IPermissionRequestor methods
 
@@ -56,7 +56,7 @@
 
     def process_request(self, req):
         page = req.args.get('page', 'default')
-        req.hdf['title'] = 'About Trac'
+        req.hdf['title'] = u'Ã€ propos de Trac'
         if req.perm.has_permission('CONFIG_VIEW'):
             req.hdf['about.config_href'] = req.href.about('config')
             req.hdf['about.plugins_href'] = req.href.about('plugins')
@@ -73,7 +73,7 @@
     def _render_config(self, req):
         req.perm.assert_permission('CONFIG_VIEW')
         req.hdf['about.page'] = 'config'
-        
+
         # Export the config table to hdf
         sections = []
         for section in self.config.sections():
@@ -83,7 +83,7 @@
                 default = default_options and default_options.get(name) or ''
                 options.append({
                     'name': name, 'value': value,
-                    'valueclass': (unicode(value) == unicode(default) 
+                    'valueclass': (unicode(value) == unicode(default)
                                    and 'defaultvalue' or 'value')})
             options.sort(lambda x,y: cmp(x['name'], y['name']))
             sections.append({'name': section, 'options': options})
diff --exclude=.svn -Naur trac-0.10.4/trac/attachment.py trac-0.10.4-PKG/trac/attachment.py
--- trac-0.10.4/trac/attachment.py	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/trac/attachment.py	2007-08-24 10:38:54.000000000 +0200
@@ -54,7 +54,7 @@
 class IAttachmentManipulator(Interface):
     """Extension point interface for components that need to manipulate
     attachments.
-    
+
     Unlike change listeners, a manipulator can reject changes being committed
     to the database."""
     def prepare_attachment(req, attachment, fields):
@@ -64,7 +64,7 @@
     def validate_attachment(req, attachment):
         """Validate an attachment after upload but before being stored in Trac
         environment.
-        
+
         Must return a list of `(field, message)` tuples, one for each problem
         detected. `field` can be any of `description`, `username`, `filename`,
         `content`, or `None` to indicate an overall problem with the
@@ -100,8 +100,8 @@
         cursor.close()
         if not row:
             self.filename = filename
-            raise TracError('Attachment %s does not exist.' % (self.title),
-                            'Invalid Attachment')
+            raise TracError(u'La piÃ¨ce jointe %s n\'existe pas.' % (self.title),
+                            u'PiÃ¨ce jointe invalide')
         self.filename = row[0]
         self.description = row[1]
         self.size = row[2] and int(row[2]) or 0
@@ -130,7 +130,7 @@
     title = property(_get_title)
 
     def delete(self, db=None):
-        assert self.filename, 'Cannot delete non-existent attachment'
+        assert self.filename, u'Impossible de supprimer une piÃ¨ce jointe inexistante'
         if not db:
             db = self.env.get_db_cnx()
             handle_ta = True
@@ -149,7 +149,7 @@
                                    self.path, exc_info=True)
                 if handle_ta:
                     db.rollback()
-                raise TracError, 'Could not delete attachment'
+                raise TracError, u'Impossible de supprimer la piÃ¨ce jointe'
 
         self.env.log.info('Attachment removed: %s' % self.title)
         if handle_ta:
@@ -241,7 +241,7 @@
             except OSError:
                 env.log.error("Can't delete attachment directory %s",
                               attachment_dir, exc_info=True)
-            
+
     select = classmethod(select)
     delete_all = classmethod(delete_all)
 
@@ -250,7 +250,7 @@
         try:
             fd = open(self.path, 'rb')
         except IOError:
-            raise TracError('Attachment %s not found' % self.filename)
+            raise TracError(u'PiÃ¨ce jointe %s non trouvÃ©e' % self.filename)
         return fd
 
 
@@ -259,7 +259,7 @@
 def attachments_to_hdf(env, req, db, parent_type, parent_id):
     return [attachment_to_hdf(env, req, db, attachment) for attachment
             in Attachment.select(env, parent_type, parent_id, db)]
-    
+
 def attachment_to_hdf(env, req, db, attachment):
     if not db:
         db = env.get_db_cnx()
@@ -325,8 +325,8 @@
     # IRequestHandler methods
 
     def match_request(self, req):
-        match = re.match(r'^/attachment/(ticket|wiki)(?:[/:](.*))?$',
-                         req.path_info)
+        what = r'^/attachment/(ticket|%s)(?:[/:](.*))?$' % self.env.wiki_base_url
+        match = re.match(what, req.path_info)
         if match:
             req.args['type'] = match.group(1)
             req.args['path'] = match.group(2).replace(':', '/')
@@ -336,9 +336,9 @@
         parent_type = req.args.get('type')
         path = req.args.get('path')
         if not parent_type or not path:
-            raise HTTPBadRequest('Bad request')
-        if not parent_type in ['ticket', 'wiki']:
-            raise HTTPBadRequest('Unknown attachment type')
+            raise HTTPBadRequest(u'Mauvaise requÃªte')
+        if not parent_type in ['ticket', self.env.wiki_base_url]:
+            raise HTTPBadRequest(u'PiÃ¨ce jointe de type inconnu')
 
         action = req.args.get('action', 'view')
         if action == 'new':
@@ -351,7 +351,7 @@
                 self._render_list(req, parent_type, last_segment)
                 return 'attachment.cs', None
             if not last_segment:
-                raise HTTPBadRequest('Bad request')
+                raise HTTPBadRequest(u'Mauvaise requÃªte')
             attachment = Attachment(self.env, parent_type, parent_id,
                                     last_segment)
         parent_link, parent_text = self._parent_to_hdf(
@@ -376,7 +376,7 @@
         # Populate attachment.parent:
         parent_link = req.href(parent_type, parent_id)
         if parent_type == 'ticket':
-            parent_text = 'Ticket #' + parent_id
+            parent_text = u'Ticket #' + parent_id
         else: # 'wiki'
             parent_text = parent_id
         req.hdf['attachment.parent'] = {
@@ -386,7 +386,7 @@
         return parent_link, parent_text
 
     # IWikiSyntaxProvider methods
-    
+
     def get_wiki_syntax(self):
         return []
 
@@ -427,7 +427,7 @@
                 href = req.abs_href
             else:
                 descr = wiki_to_oneliner(descr, self.env, db, shorten=True)
-                title += Markup(' by %s', author)
+                title += Markup(u' par %s', author)
                 href = req.href
             yield('attachment', href.attachment(type, id, filename), title,
                   time, author, descr)
@@ -435,7 +435,7 @@
     # Internal methods
 
     def _do_save(self, req, attachment):
-        perm_map = {'ticket': 'TICKET_APPEND', 'wiki': 'WIKI_MODIFY'}
+        perm_map = {'ticket': 'TICKET_APPEND', self.env.wiki_base_url: 'WIKI_MODIFY'}
         req.perm.assert_permission(perm_map[attachment.parent_type])
 
         if req.args.has_key('cancel'):
@@ -443,7 +443,7 @@
 
         upload = req.args['attachment']
         if not hasattr(upload, 'filename') or not upload.filename:
-            raise TracError('No file uploaded')
+            raise TracError(u'Aucun fichier reÃ§u')
         if hasattr(upload.file, 'fileno'):
             size = os.fstat(upload.file.fileno())[6]
         else:
@@ -451,13 +451,13 @@
             size = upload.file.tell()
             upload.file.seek(0)
         if size == 0:
-            raise TracError("Can't upload empty file")
+            raise TracError(u'Fichier vide')
 
         # Maximum attachment size (in bytes)
         max_size = self.max_size
         if max_size >= 0 and size > max_size:
-            raise TracError('Maximum attachment size: %d bytes' % max_size,
-                            'Upload failed')
+            raise TracError(u'Taille maximum des piÃ¨ces attachÃ©s: %d octets' % \
+                            max_size, u'Ã‰chec du chargement')
 
         # We try to normalize the filename to unicode NFC if we can.
         # Files uploaded from OS X might be in NFD.
@@ -466,7 +466,7 @@
         filename = filename.replace('\\', '/').replace(':', '/')
         filename = os.path.basename(filename)
         if not filename:
-            raise TracError('No file uploaded')
+            raise TracError(u'Aucun fichier reÃ§u')
 
         attachment.description = req.args.get('description', '')
         attachment.author = get_reporter_id(req, 'author')
@@ -476,10 +476,10 @@
         for manipulator in self.manipulators:
             for field, message in manipulator.validate_attachment(req, attachment):
                 if field:
-                    raise InvalidAttachment('Attachment field %s is invalid: %s'
+                    raise InvalidAttachment(u'Le champ attachÃ© %s n\'est pas valable: %s'
                                             % (field, message))
                 else:
-                    raise InvalidAttachment('Invalid attachment: %s' % message)
+                    raise InvalidAttachment(u'PiÃ¨ce jointe non valable : %s' % message)
 
         if req.args.get('replace'):
             try:
@@ -487,7 +487,7 @@
                                             attachment.parent_id, filename)
                 if not (old_attachment.author and req.authname \
                         and old_attachment.author == req.authname):
-                    perm_map = {'ticket': 'TICKET_ADMIN', 'wiki': 'WIKI_DELETE'}
+                    perm_map = {'ticket': 'TICKET_ADMIN', self.env.wiki_base_url: 'WIKI_DELETE'}
                     req.perm.assert_permission(perm_map[old_attachment.parent_type])
                 old_attachment.delete()
             except TracError:
@@ -499,7 +499,7 @@
         req.redirect(attachment.href(req))
 
     def _do_delete(self, req, attachment):
-        perm_map = {'ticket': 'TICKET_ADMIN', 'wiki': 'WIKI_DELETE'}
+        perm_map = {'ticket': 'TICKET_ADMIN', self.env.wiki_base_url: 'WIKI_DELETE'}
         req.perm.assert_permission(perm_map[attachment.parent_type])
 
         if req.args.has_key('cancel'):
@@ -511,22 +511,22 @@
         req.redirect(attachment.parent_href(req))
 
     def _render_confirm(self, req, attachment):
-        perm_map = {'ticket': 'TICKET_ADMIN', 'wiki': 'WIKI_DELETE'}
+        perm_map = {'ticket': 'TICKET_ADMIN', self.env.wiki_base_url: 'WIKI_DELETE'}
         req.perm.assert_permission(perm_map[attachment.parent_type])
 
-        req.hdf['title'] = '%s (delete)' % attachment.title
+        req.hdf['title'] = u'%s (suppression)' % attachment.title
         req.hdf['attachment'] = {'filename': attachment.filename,
                                  'mode': 'delete'}
 
     def _render_form(self, req, attachment):
-        perm_map = {'ticket': 'TICKET_APPEND', 'wiki': 'WIKI_MODIFY'}
+        perm_map = {'ticket': 'TICKET_APPEND', self.env.wiki_base_url: 'WIKI_MODIFY'}
         req.perm.assert_permission(perm_map[attachment.parent_type])
 
         req.hdf['attachment'] = {'mode': 'new',
                                  'author': get_reporter_id(req)}
 
     def _render_view(self, req, attachment):
-        perm_map = {'ticket': 'TICKET_VIEW', 'wiki': 'WIKI_VIEW'}
+        perm_map = {'ticket': 'TICKET_VIEW', self.env.wiki_base_url: 'WIKI_VIEW'}
         req.perm.assert_permission(perm_map[attachment.parent_type])
 
         req.check_modified(attachment.time)
@@ -539,7 +539,7 @@
         req.hdf['attachment.description'] = wiki_to_html(attachment.description,
                                                          self.env, req)
 
-        perm_map = {'ticket': 'TICKET_ADMIN', 'wiki': 'WIKI_DELETE'}
+        perm_map = {'ticket': 'TICKET_ADMIN', self.env.wiki_base_url: 'WIKI_DELETE'}
         if req.perm.has_permission(perm_map[attachment.parent_type]):
             req.hdf['attachment.can_delete'] = 1
 
@@ -550,7 +550,7 @@
             # MIME type detection
             str_data = fd.read(1000)
             fd.seek(0)
-            
+
             binary = is_binary(str_data)
             mime_type = mimeview.get_mimetype(attachment.filename, str_data)
 
@@ -559,7 +559,7 @@
             if format in ('raw', 'txt'):
                 if not self.render_unsafe_content:
                     # Force browser to download files instead of rendering
-                    # them, since they might contain malicious code enabling 
+                    # them, since they might contain malicious code enabling
                     # XSS attacks
                     req.send_header('Content-Disposition', 'attachment')
                 if format == 'txt':
@@ -573,15 +573,15 @@
                 req.send_file(attachment.path, mime_type)
 
             # add ''Plain Text'' alternate link if needed
-            if (self.render_unsafe_content and 
+            if (self.render_unsafe_content and
                 mime_type and not mime_type.startswith('text/plain')):
                 plaintext_href = attachment.href(req, format='txt')
-                add_link(req, 'alternate', plaintext_href, 'Plain Text',
+                add_link(req, 'alternate', plaintext_href, u'Text Standard',
                          mime_type)
 
             # add ''Original Format'' alternate link (always)
             raw_href = attachment.href(req, format='raw')
-            add_link(req, 'alternate', raw_href, 'Original Format', mime_type)
+            add_link(req, 'alternate', raw_href, u'Format original', mime_type)
 
             self.log.debug("Rendering preview of file %s with mime-type %s"
                            % (attachment.filename, mime_type))
@@ -608,7 +608,7 @@
         else:
             # FIXME: the formatter should know which object the text being
             #        formatter belongs to
-            parent_type, parent_id = 'wiki', 'WikiStart'
+            parent_type, parent_id = self.env.wiki_base_url, 'WikiStart'
             if formatter.req:
                 path_info = formatter.req.path_info.split('/', 2)
                 if len(path_info) > 1:
@@ -622,7 +622,7 @@
             if formatter.req:
                 href = attachment.href(formatter.req) + params
             return html.A(label, class_='attachment', href=href,
-                          title='Attachment %s' % attachment.title)
+                          title=u'PiÃ¨ce jointe %s' % attachment.title)
         except TracError:
             return html.A(label, class_='missing attachment', rel='nofollow',
                           href=formatter.href())
diff --exclude=.svn -Naur trac-0.10.4/trac/config.py trac-0.10.4-PKG/trac/config.py
--- trac-0.10.4/trac/config.py	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/trac/config.py	2007-08-24 10:40:41.000000000 +0200
@@ -30,7 +30,7 @@
            'ExtensionOption', 'OrderedExtensionsOption', 'ConfigurationError',
            'default_dir']
 
-_TRUE_VALUES = ('yes', 'true', 'on', 'aye', '1', 1, True)
+_TRUE_VALUES = ('yes', 'oui', 'true', 'vrai', 'on', 'aye', '1', 1, True)
 
 
 class ConfigurationError(TracError):
@@ -72,20 +72,20 @@
 
     def getbool(self, section, name, default=None):
         """Return the specified option as boolean value.
-        
+
         If the value of the option is one of "yes", "true",  "on", or "1", this
         method wll return `True`, otherwise `False`.
-        
+
         (since Trac 0.9.3)
         """
         return self[section].getbool(name, default)
 
     def getint(self, section, name, default=None):
         """Return the value of the specified option as integer.
-        
+
         If the specified option can not be converted to an integer, a
         `ConfigurationError` exception is raised.
-        
+
         (since Trac 0.10)
         """
         return self[section].getint(name, default)
@@ -93,25 +93,25 @@
     def getlist(self, section, name, default=None, sep=',', keep_empty=False):
         """Return a list of values that have been specified as a single
         comma-separated option.
-        
+
         A different separator can be specified using the `sep` parameter. If
         the `keep_empty` parameter is set to `True`, empty elements are
         included in the list.
-        
+
         (since Trac 0.10)
         """
         return self[section].getlist(name, default, sep, keep_empty)
 
     def set(self, section, name, value):
         """Change a configuration value.
-        
+
         These changes are not persistent unless saved with `save()`.
         """
         self[section].set(name, value)
 
     def defaults(self):
         """Returns a dictionary of the default configuration values.
-        
+
         (since Trac 0.10)
         """
         defaults = {}
@@ -122,7 +122,7 @@
     def options(self, section):
         """Return a list of `(name, value)` tuples for every option in the
         specified section.
-        
+
         This includes options that have default values that haven't been
         overridden.
         """
@@ -194,7 +194,7 @@
 
 class Section(object):
     """Proxy for a specific configuration section.
-    
+
     Objects of this class should not be instantiated directly.
     """
     __slots__ = ['config', 'name', 'overridden']
@@ -206,7 +206,7 @@
 
     def __contains__(self, name):
         return self.config.parser.has_option(self.name, name) or \
-               self.config.site_parser.has_option(self.name, name) 
+               self.config.site_parser.has_option(self.name, name)
 
     def __iter__(self):
         options = []
@@ -240,7 +240,7 @@
 
     def getbool(self, name, default=None):
         """Return the value of the specified option as boolean.
-        
+
         This method returns `True` if the option value is one of "yes", "true",
         "on", or "1", ignoring case. Otherwise `False` is returned.
         """
@@ -251,7 +251,7 @@
 
     def getint(self, name, default=None):
         """Return the value of the specified option as integer.
-        
+
         If the specified option can not be converted to an integer, a
         `ConfigurationError` exception is raised.
         """
@@ -261,12 +261,12 @@
         try:
             return int(value)
         except ValueError:
-            raise ConfigurationError('expected integer, got %s' % repr(value))
+            raise ConfigurationError(u'entier attendu, obtenu %s' % repr(value))
 
     def getlist(self, name, default=None, sep=',', keep_empty=True):
         """Return a list of values that have been specified as a single
         comma-separated option.
-        
+
         A different separator can be specified using the `sep` parameter. If
         the `skip_empty` parameter is set to `True`, empty elements are omitted
         from the list.
@@ -287,7 +287,7 @@
 
     def set(self, name, value):
         """Change a configuration value.
-        
+
         These changes are not persistent unless saved with `save()`.
         """
         if not self.config.parser.has_section(self.name):
@@ -308,7 +308,7 @@
 
     def __init__(self, section, name, default=None, doc=''):
         """Create the extension point.
-        
+
         @param section: the name of the configuration section this option
             belongs to
         @param name: the name of the option
@@ -332,7 +332,7 @@
         return None
 
     def __set__(self, instance, value):
-        raise AttributeError, 'can\'t set attribute'
+        raise AttributeError, u'Impossible de dÃ©finir un attribut'
 
     def __repr__(self):
         return '<%s [%s] "%s">' % (self.__class__.__name__, self.section,
@@ -376,9 +376,9 @@
         for impl in self.xtnpt.extensions(instance):
             if impl.__class__.__name__ == value:
                 return impl
-        raise AttributeError('Cannot find an implementation of the "%s" '
-                             'interface named "%s".  Please update the option '
-                             '%s.%s in trac.ini.'
+        raise AttributeError(u'Impossible de trouver une implÃ©mentation d\'interface "%s" '
+                             u'nommÃ©e "%s".  Mettez Ã  jour l\'option '
+                             u'%s.%s dans trac.ini.'
                              % (self.xtnpt.interface.__name__, value,
                                 self.section, self.name))
 
diff --exclude=.svn -Naur trac-0.10.4/trac/core.py trac-0.10.4-PKG/trac/core.py
--- trac-0.10.4/trac/core.py	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/trac/core.py	2007-08-24 10:41:13.000000000 +0200
@@ -39,7 +39,7 @@
 
     def __init__(self, interface):
         """Create the extension point.
-        
+
         @param interface: the `Interface` subclass that defines the protocol
             for the extension point
         """
@@ -61,7 +61,7 @@
 
 class ComponentMeta(type):
     """Meta class for components.
-    
+
     Takes care of component and extension point registration.
     """
     _components = []
@@ -174,11 +174,11 @@
         component = self.components.get(cls)
         if not component:
             if cls not in ComponentMeta._components:
-                raise TracError, 'Component "%s" not registered' % cls.__name__
+                raise TracError, u'Composant "%s" non enregistrÃ©' % cls.__name__
             try:
                 component = cls(self)
             except TypeError, e:
-                raise TracError, 'Unable to instantiate component %r (%s)' \
+                raise TracError, u"Impossible d'instancier le composant %r (%s)" \
                                  % (cls, e)
         return component
 
diff --exclude=.svn -Naur trac-0.10.4/trac/db/api.py trac-0.10.4-PKG/trac/db/api.py
--- trac-0.10.4/trac/db/api.py	2007-04-20 15:41:46.000000000 +0200
+++ trac-0.10.4-PKG/trac/db/api.py	2007-08-24 10:45:06.000000000 +0200
@@ -40,7 +40,7 @@
 
     def get_connection(**kwargs):
         """Create a new connection to the database."""
-        
+
     def init_db(**kwargs):
         """Initialize the database."""
 
@@ -94,7 +94,7 @@
                     candidates[scheme] = (connector, priority)
             connector = candidates.get(scheme, [None])[0]
         if not connector:
-            raise TracError('Unsupported database type "%s"' % scheme)
+            raise TracError(u'Base de donnÃ©es de type "%s" non supportÃ©e' % scheme)
 
         if scheme == 'sqlite':
             # Special case for SQLite to support a path relative to the
@@ -116,8 +116,8 @@
             host = None
             path = rest
         else:
-            raise TracError('Database connection string must start with '
-                            'scheme:/')
+            raise TracError(u'La chaÃ®ne %s de connexion Ã  la base de donnÃ©es "%s" '
+                            u'doit commencer par scheme:/' % db_str)
     else:
         if rest.startswith('/') and not rest.startswith('//'):
             host = None
diff --exclude=.svn -Naur trac-0.10.4/trac/db/mysql_backend.py trac-0.10.4-PKG/trac/db/mysql_backend.py
--- trac-0.10.4/trac/db/mysql_backend.py	2007-04-20 15:41:46.000000000 +0200
+++ trac-0.10.4-PKG/trac/db/mysql_backend.py	2007-08-24 10:46:47.000000000 +0200
@@ -1,4 +1,4 @@
-# -*- coding: iso8859-1 -*-
+# -*- coding: utf-8 -*-
 #
 # Copyright (C) 2005-2006 Edgewall Software
 # Copyright (C) 2005-2006 Christopher Lenz <cmlenz@gmx.de>
@@ -122,7 +122,8 @@
     def _set_character_set(self, cnx, charset):
         vers = tuple([ int(n) for n in cnx.get_server_info().split('.')[:2] ])
         if vers < (4, 1):
-            raise TracError, 'MySQL servers older than 4.1 are not supported!'
+            raise TracError, u'Les serveurs MySQL antÃ©rieurs Ã  4.1 ne sont ' \
+                             u'pas supportÃ©s!'
         cnx.query('SET NAMES %s' % charset)
         cnx.store_result()
         cnx.charset = charset
diff --exclude=.svn -Naur trac-0.10.4/trac/db/pool.py trac-0.10.4-PKG/trac/db/pool.py
--- trac-0.10.4/trac/db/pool.py	2007-04-20 15:41:46.000000000 +0200
+++ trac-0.10.4-PKG/trac/db/pool.py	2007-08-24 10:48:02.000000000 +0200
@@ -50,7 +50,7 @@
 
 def try_rollback(cnx):
     """Resets the Connection in a safe way, returning True when it succeeds.
-    
+
     The rollback we do for safety on a Connection can fail at
     critical times because of a timeout on the Connection.
     """
@@ -104,9 +104,9 @@
                 else:
                     if timeout:
                         if (time.time() - start) >= timeout:
-                            raise TimeoutError('Unable to get database '
-                                               'connection within %d seconds'
-                                                % timeout)
+                            raise TimeoutError(u'Impossible de se connecter Ã '
+                                               u' la base de donnÃ©es sous %d '
+                                               u'secondes' % timeout)
                         self._available.wait(timeout)
                     else: # Warning: without timeout, Trac *might* hang
                         self._available.wait()
diff --exclude=.svn -Naur trac-0.10.4/trac/db/sqlite_backend.py trac-0.10.4-PKG/trac/db/sqlite_backend.py
--- trac-0.10.4/trac/db/sqlite_backend.py	2007-04-20 15:41:46.000000000 +0200
+++ trac-0.10.4-PKG/trac/db/sqlite_backend.py	2007-08-24 10:50:01.000000000 +0200
@@ -116,7 +116,7 @@
         if path != ':memory:':
             # make the directory to hold the database
             if os.path.exists(path):
-                raise TracError, 'Database already exists at %s' % path
+                raise TracError, u'Une base de donnÃ©e existe dÃ©jÃ  sur %s' % path
             os.makedirs(os.path.split(path)[0])
         cnx = sqlite.connect(path, timeout=int(params.get('timeout', 10000)))
         cursor = cnx.cursor()
@@ -141,15 +141,16 @@
         self.cnx = None
         if path != ':memory:':
             if not os.access(path, os.F_OK):
-                raise TracError, 'Database "%s" not found.' % path
+                raise TracError, u'Base de donnÃ©es "%s" non trouvÃ©e.' % path
 
             dbdir = os.path.dirname(path)
             if not os.access(path, os.R_OK + os.W_OK) or \
                    not os.access(dbdir, os.R_OK + os.W_OK):
                 from getpass import getuser
-                raise TracError('The user %s requires read _and_ write ' \
-                                'permission to the database file %s and the ' \
-                                'directory it is located in.' \
+                raise TracError(u"L'utilisateur %s a besoin des permissions "
+                                u"en lecture _et_ en Ã©criture sur la base de "
+                                u"donnÃ©es %s ainsi que sur le rÃ©pertoire "
+                                u"dans lequel elle est situÃ©e."
                                 % (getuser(), path))
 
         if have_pysqlite == 2:
@@ -161,7 +162,7 @@
         else:
             timeout = int(params.get('timeout', 10000))
             cnx = sqlite.connect(path, timeout=timeout, encoding='utf-8')
-            
+
         ConnectionWrapper.__init__(self, cnx)
 
     if have_pysqlite == 2:
diff --exclude=.svn -Naur trac-0.10.4/trac/db_default.py trac-0.10.4-PKG/trac/db_default.py
--- trac-0.10.4/trac/db_default.py	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/trac/db_default.py	2007-10-19 14:43:33.000000000 +0200
@@ -117,7 +117,7 @@
         Column('description'),
         Column('keywords'),
         Index(['time']),
-        Index(['status'])],    
+        Index(['status'])],
     Table('ticket_change', key=('ticket', 'time', 'field'))[
         Column('ticket', type='int'),
         Column('time', type='int'),
@@ -166,72 +166,72 @@
 def get_reports(db):
     owner = db.concat('owner', "' *'")
     return (
-('Active Tickets',
-"""
- * List all active tickets by priority.
- * Color each row based on priority.
- * If a ticket has been accepted, a '*' is appended after the owner's name
+('Tickets ouverts',
+u"""
+ * Liste de tous les tickets ouverts triÃ©s par prioritÃ©.
+ * Les couleurs de lignes sont basÃ©es sur la prioritÃ©.
+ * Si un ticket a Ã©tÃ© acceptÃ©, un '*' est accolÃ© au nom du propriÃ©taire du ticket.
 """,
 """
 SELECT p.value AS __color__,
-   id AS ticket, summary, component, version, milestone, t.type AS type, 
+   id AS ticket, summary, component, version, milestone, t.type AS type,
    (CASE status WHEN 'assigned' THEN %s ELSE owner END) AS owner,
    time AS created,
    changetime AS _changetime, description AS _description,
    reporter AS _reporter
   FROM ticket t
   LEFT JOIN enum p ON p.name = t.priority AND p.type = 'priority'
-  WHERE status IN ('new', 'assigned', 'reopened') 
+  WHERE status IN ('new', 'assigned', 'reopened')
   ORDER BY p.value, milestone, t.type, time
 """ % owner),
 #----------------------------------------------------------------------------
- ('Active Tickets by Version',
-"""
-This report shows how to color results by priority,
-while grouping results by version.
+ ('Tickets ouverts par Version',
+u"""
+Ce rapport montre comment mettre en valeur avec des couleurs les
+rÃ©sultats triÃ©s par prioritÃ©, quand ils sont aussi groupÃ©s par version.
 
-Last modification time, description and reporter are included as hidden fields
-for useful RSS export.
+La date de derniÃ¨re modification, la description et le rapporteur sont aussi
+inclus comme champs cachÃ©s pour une meilleure exportation en flux RSS.
 """,
 """
 SELECT p.value AS __color__,
    version AS __group__,
-   id AS ticket, summary, component, version, t.type AS type, 
+   id AS ticket, summary, component, version, t.type AS type,
    (CASE status WHEN 'assigned' THEN %s ELSE owner END) AS owner,
    time AS created,
    changetime AS _changetime, description AS _description,
    reporter AS _reporter
   FROM ticket t
   LEFT JOIN enum p ON p.name = t.priority AND p.type = 'priority'
-  WHERE status IN ('new', 'assigned', 'reopened') 
+  WHERE status IN ('new', 'assigned', 'reopened')
   ORDER BY (version IS NULL),version, p.value, t.type, time
 """ % owner),
 #----------------------------------------------------------------------------
-('Active Tickets by Milestone',
-"""
-This report shows how to color results by priority,
-while grouping results by milestone.
+('Tous les Tickets par Objectif',
+u"""
+Ce rapport montre comment mettre en valeur avec des couleurs les
+rÃ©sultats triÃ©s par prioritÃ©, quand ils sont aussi groupÃ©s par objectif.
 
-Last modification time, description and reporter are included as hidden fields
-for useful RSS export.
+La date de derniÃ¨re modification, la description et le rapporteur sont aussi
+inclus comme champs cachÃ©s pour une meilleure exportation en flux RSS.
 """,
 """
 SELECT p.value AS __color__,
-   %s AS __group__,
-   id AS ticket, summary, component, version, t.type AS type, 
+   'Objectif : '||milestone AS __group__,
+   id AS ticket, summary, component, version, t.type AS type,
    (CASE status WHEN 'assigned' THEN %s ELSE owner END) AS owner,
    time AS created,
    changetime AS _changetime, description AS _description,
    reporter AS _reporter
   FROM ticket t
   LEFT JOIN enum p ON p.name = t.priority AND p.type = 'priority'
-  WHERE status IN ('new', 'assigned', 'reopened') 
+  WHERE status IN ('new', 'assigned', 'reopened')
   ORDER BY (milestone IS NULL),milestone, p.value, t.type, time
-""" % (db.concat('milestone', "' Release'"), owner)),
+""" % owner ),
 #----------------------------------------------------------------------------
-('Assigned, Active Tickets by Owner',
-"""
-List assigned tickets, group by ticket owner, sorted by priority.
+(u'Tickets assignÃ©s et ouverts par PropriÃ©taire',
+u"""
+Liste des tickets assignÃ©s, groupÃ©s par propriÃ©taire et triÃ©s par prioritÃ©.
 """,
 """
 
@@ -246,10 +246,10 @@
   ORDER BY owner, p.value, t.type, time
 """),
 #----------------------------------------------------------------------------
-('Assigned, Active Tickets by Owner (Full Description)',
-"""
-List tickets assigned, group by ticket owner.
-This report demonstrates the use of full-row display.
+(u'Tickets assignÃ©s et ouverts par PropriÃ©taire (Description complÃ¨te)',
+u"""
+Liste des tickets assignÃ©s, groupÃ©s par propriÃ©taire et triÃ©s par prioritÃ©.
+Ce rapport dÃ©montre l'utilisation de la fonction ligne complÃ¨te.
 """,
 """
 SELECT p.value AS __color__,
@@ -263,37 +263,37 @@
   ORDER BY owner, p.value, t.type, time
 """),
 #----------------------------------------------------------------------------
-('All Tickets By Milestone  (Including closed)',
-"""
-A more complex example to show how to make advanced reports.
+(u'Tous les Tickets par Objectif (fermÃ©s inclus)',
+u"""
+Un exemple plus complexe pour dÃ©montrer comme faire des rapports avancÃ©s.
 """,
 """
 SELECT p.value AS __color__,
    t.milestone AS __group__,
-   (CASE status 
+   (CASE status
       WHEN 'closed' THEN 'color: #777; background: #ddd; border-color: #ccc;'
-      ELSE 
+      ELSE
         (CASE owner WHEN $USER THEN 'font-weight: bold' END)
     END) AS __style__,
-   id AS ticket, summary, component, status, 
+   id AS ticket, summary, component, status,
    resolution,version, t.type AS type, priority, owner,
    changetime AS modified,
    time AS _time,reporter AS _reporter
   FROM ticket t
   LEFT JOIN enum p ON p.name = t.priority AND p.type = 'priority'
-  ORDER BY (milestone IS NULL), milestone DESC, (status = 'closed'), 
-        (CASE status WHEN 'closed' THEN modified ELSE (-1)*p.value END) DESC
+  ORDER BY (milestone IS NULL), milestone DESC, (status = 'closed'),
+        (CASE status WHEN 'closed' THEN changetime ELSE (-1)*p.value END) DESC
 """),
 #----------------------------------------------------------------------------
-('My Tickets',
-"""
-This report demonstrates the use of the automatically set 
-USER dynamic variable, replaced with the username of the
-logged in user when executed.
+('Mes Tickets',
+u"""
+Ce rapport dÃ©montre l'utilisation de la variable dynamique
+USER dÃ©finie automatiquement, pour remplacer le nom d'utilisateur
+par le nom de l'utilisateur connectÃ© quand la requÃªte est exÃ©cutÃ©e.
 """,
-"""
+u"""
 SELECT p.value AS __color__,
-   (CASE status WHEN 'assigned' THEN 'Assigned' ELSE 'Owned' END) AS __group__,
+   (CASE status WHEN 'assigned' THEN 'AcceptÃ©s' ELSE 'AssignÃ©s' END) AS __group__,
    id AS ticket, summary, component, version, milestone,
    t.type AS type, priority, time AS created,
    changetime AS _changetime, description AS _description,
@@ -304,25 +304,25 @@
   ORDER BY (status = 'assigned') DESC, p.value, milestone, t.type, time
 """),
 #----------------------------------------------------------------------------
-('Active Tickets, Mine first',
-"""
- * List all active tickets by priority.
- * Show all tickets owned by the logged in user in a group first.
+(u'Tickets ouverts, les miens d\'abord',
+u"""
+ * Liste de tous les tickets ouverts triÃ©s par prioritÃ©.
+ * Montre tous les tickets de l'utilisateur connectÃ© groupÃ©s en premier
 """,
 """
 SELECT p.value AS __color__,
-   (CASE owner 
-     WHEN $USER THEN 'My Tickets' 
-     ELSE 'Active Tickets' 
+   (CASE owner
+     WHEN $USER THEN 'Mes Tickets'
+     ELSE 'Tickets ouverts'
     END) AS __group__,
-   id AS ticket, summary, component, version, milestone, t.type AS type, 
+   id AS ticket, summary, component, version, milestone, t.type AS type,
    (CASE status WHEN 'assigned' THEN %s ELSE owner END) AS owner,
    time AS created,
    changetime AS _changetime, description AS _description,
    reporter AS _reporter
   FROM ticket t
   LEFT JOIN enum p ON p.name = t.priority AND p.type = 'priority'
-  WHERE status IN ('new', 'assigned', 'reopened') 
+  WHERE status IN ('new', 'assigned', 'reopened')
   ORDER BY (owner = $USER) DESC, p.value, milestone, t.type, time
 """ % owner))
 
diff --exclude=.svn -Naur trac-0.10.4/trac/env.py trac-0.10.4-PKG/trac/env.py
--- trac-0.10.4/trac/env.py	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/trac/env.py	2007-08-29 17:56:33.000000000 +0200
@@ -36,14 +36,14 @@
 
     def environment_needs_upgrade(db):
         """Called when Trac checks whether the environment needs to be upgraded.
-        
+
         Should return `True` if this participant needs an upgrade to be
         performed, `False` otherwise.
         """
 
     def upgrade_environment(db):
         """Actually perform an environment upgrade.
-        
+
         Implementations of this method should not commit any database
         transactions. This is done implicitly after all participants have
         performed the upgrades they need without an error being raised.
@@ -59,12 +59,15 @@
      * an SQLite database (stores tickets, wiki pages...)
      * Project specific templates and wiki macros.
      * wiki and ticket attachments.
-    """   
+    """
     setup_participants = ExtensionPoint(IEnvironmentSetupParticipant)
 
+    wiki_base_url = Option('trac', 'wiki_base_url', 'wiki',
+        """Option PKG pour changer le terme 'wiki' des URLs""")
+
     base_url = Option('trac', 'base_url', '',
         """Base URL of the Trac deployment.
-        
+
         In most configurations, Trac will automatically reconstruct the URL
         that is used to access it automatically. However, in more complex
         setups, usually involving running Trac behind a HTTP proxy, you may
@@ -80,7 +83,7 @@
         """URL of the main project web site.""")
 
     project_footer = Option('project', 'footer',
-                            'Visit the Trac open source project at<br />'
+                            'Visitez le projet Trac open source Ã <br />'
                             '<a href="http://trac.edgewall.org/">'
                             'http://trac.edgewall.org/</a>',
         """Page footer text (right-aligned).""")
@@ -90,7 +93,7 @@
 
     log_type = Option('logging', 'log_type', 'none',
         """Logging facility to use.
-        
+
         Should be one of (`none`, `file`, `stderr`, `syslog`, `winlog`).""")
 
     log_file = Option('logging', 'log_file', 'trac.log',
@@ -98,14 +101,14 @@
 
     log_level = Option('logging', 'log_level', 'DEBUG',
         """Level of verbosity in log.
-        
+
         Should be one of (`CRITICAL`, `ERROR`, `WARN`, `INFO`, `DEBUG`).""")
 
     log_format = Option('logging', 'log_format', None,
         """Custom logging format.
 
         If nothing is set, the following will be used:
-        
+
         Trac[$(module)s] $(levelname)s: $(message)s
 
         In addition to regular key names supported by the Python logger library
@@ -122,9 +125,55 @@
 
          (since 0.11)""")
 
+    tr_fixed = Option('translation', 'fixed', u'corrigÃ©')
+    tr_invalid = Option('translation', 'invalid', u'invalide')
+    tr_wontfix = Option('translation', 'wontfix', u'noncorrigible')
+    tr_duplicate = Option('translation', 'duplicate', u'doublon')
+    tr_worksforme = Option('translation', 'worksforme', u'nonreproductible')
+    tr_new = Option('translation', 'new', u'nouveau')
+    tr_closed = Option('translation', 'closed', u'fermÃ©')
+    tr_assigned = Option('translation', 'assigned', u'assignÃ©')
+    tr_reopened = Option('translation', 'reopened', u'rÃ©ouvert')
+    tr_reassign = Option('translation', 'reassign', u'rÃ©assignÃ©')
+    tr_blocker = Option('translation', 'blocker', u'bloquante')
+    tr_critical = Option('translation', 'critical', u'critique')
+    tr_major = Option('translation', 'major', u'majeure')
+    tr_minor = Option('translation', 'minor', u'mineure')
+    tr_trivial = Option('translation', 'trivial', u'triviale')
+    tr_defect = Option('translation', 'defect', u'dÃ©faut')
+    tr_enhancement = Option('translation', 'enhancement', u'amÃ©lioration')
+    tr_task = Option('translation', 'task', u'tÃ¢che')
+    tr_component = Option('translation', 'component', u'composant')
+    tr_keywords = Option('translation', 'keywords', u'mots clefs')
+    tr_priority = Option('translation', 'priority', u'prioritÃ©')
+    tr_milestone = Option('translation', 'milestone', u'objectif')
+    tr_summary = Option('translation', 'summary', u'intitulÃ©')
+    tr_resolution = Option('translation', 'resolution', u'rÃ©solution')
+    tr_report = Option('translation', 'report', u'rapport')
+    tr_title = Option('translation', 'title', u'titre')
+    tr_owner = Option('translation', 'owner', u'propriÃ©taire')
+    tr_reporter = Option('translation', 'reporter', u'rapporteur')
+    tr_created = Option('translation', 'created', u'crÃ©Ã©')
+    tr_modified = Option('translation', 'modified', u'modifiÃ©')
+    tr_change = Option('translation', 'change', u'modification')
+    tr_changeset = Option('translation', 'changeset', u'version')
+    tr_status = Option('translation', 'status', u'statut')
+    tr_version = Option('translation', 'version', u'version')
+    tr_cc = Option('translation', 'cc', u'cc')
+    tr_line = Option('translation', 'line', u'ligne')
+    tr_reply = Option('translation', 'reply', u'rÃ©pondre')
+    tr_wiki  = Option('translation', 'wiki', 'documentation')
+    tr_roadmap = Option('translation', 'roadmap', u'feuille de route')
+    tr_of_Roadmap = Option('translation', 'of_Roadmap', u'de la Feuille de route')
+    tr_new_milestone = Option('translation', 'new_milestone', u'nouvel objectif')
+    tr_newMilestone = Option('translation', 'new_Milestone', u'nouvel Objectif')
+    tr_the_milestone = Option('translation', 'the_milestone', u'l\'objectif')
+    tr_thisMilestone = Option('translation', 'this_milestone', u'cet objectif')
+    tr_of_milestone = Option('translation', 'of_milestone', u'de l\'objectif')
+
     def __init__(self, path, create=False, options=[]):
         """Initialize the Trac environment.
-        
+
         @param path:   the absolute path to the Trac environment
         @param create: if `True`, the environment is created and populated with
                        default data; otherwise, the environment is expected to
@@ -145,6 +194,8 @@
             self.create(options)
         else:
             self.verify()
+            # Translations initialization
+            self.init_translations()
 
         if create:
             for setup_participant in self.setup_participants:
@@ -152,7 +203,7 @@
 
     def component_activated(self, component):
         """Initialize additional member variables for components.
-        
+
         Every component activated through the `Environment` object gets three
         member variables: `env` (the environment object), `config` (the
         environment configuration) and `log` (a logger object)."""
@@ -163,7 +214,7 @@
     def is_component_enabled(self, cls):
         """Implemented to only allow activation of components that are not
         disabled in the configuration.
-        
+
         This is called by the `ComponentManager` base class when a component is
         about to be activated. If this method returns false, the component does
         not get activated."""
@@ -210,7 +261,7 @@
     def get_repository(self, authname=None):
         """Return the version control repository configured for this
         environment.
-        
+
         @param authname: user name for authorization
         """
         return RepositoryManager(self).get_repository(authname)
@@ -235,8 +286,8 @@
         _create_file(os.path.join(self.path, 'VERSION'),
                      'Trac Environment Version 1\n')
         _create_file(os.path.join(self.path, 'README'),
-                     'This directory contains a Trac environment.\n'
-                     'Visit http://trac.edgewall.org/ for more information.\n')
+                     u'Ce dossier contient un environnement Trac.\n'
+                     u'Veuillez visiter http://trac.edgewall.org/ pour plus d\'informations.\n')
 
         # Setup the default configuration
         os.mkdir(os.path.join(self.path, 'conf'))
@@ -268,6 +319,24 @@
                         value = None
                     self.config.set(section, name, value)
 
+    def init_translations(self):
+        self.translations = {}
+
+        # Charger d'abord les valeurs par dÃ©faut
+        for section, default_options in self.config.defaults().iteritems():
+            if section == 'translation':
+                for name, value in default_options.iteritems():
+                    # Ne garder la valeur par dÃ©faut que si elle n'est pas dÃ©jÃ 
+                    # redÃ©finie dans la configuration
+                    if self.config.get('translation', name) == value:
+                        self.config.set(section, name, value)
+
+        for (k,v) in self.config.options('translation'):
+            self.translations[k] = v
+            ck = k.capitalize()
+            cv = v.capitalize()
+            self.translations[ck] = cv
+
     def get_templates_dir(self):
         """Return absolute path to the templates directory."""
         return os.path.join(self.path, 'templates')
@@ -330,7 +399,8 @@
 
         db_str = self.config.get('trac', 'database')
         if not db_str.startswith('sqlite:'):
-            raise EnvironmentError('Can only backup sqlite databases')
+            raise EnvironmentError(u'Seules les bases de donnÃ©es sqlite '
+                                   u'peuvent Ãªtre sauvegardÃ©es')
         db_name = os.path.join(self.path, db_str[7:])
         if not dest:
             dest = '%s.%i.bak' % (db_name, self.get_version())
@@ -348,7 +418,7 @@
 
     def upgrade(self, backup=False, backup_dest=None):
         """Upgrade database.
-        
+
         Each db version should have its own upgrade module, names
         upgrades/dbN.py, where 'N' is the version number (int).
 
@@ -398,7 +468,8 @@
         if dbver == db_default.db_version:
             return False
         elif dbver > db_default.db_version:
-            raise TracError, 'Database newer than Trac version'
+            raise TracError, u'Base de donnÃ©es plus rÃ©centes que la version ' \
+                             u'de Trac'
         return True
 
     def upgrade_environment(self, db):
@@ -410,7 +481,8 @@
                 upgrades = __import__('upgrades', globals(), locals(), [name])
                 script = getattr(upgrades, name)
             except AttributeError:
-                err = 'No upgrade module for version %i (%s.py)' % (i, name)
+                err = u'Pas de module de mise Ã  jour pour la version %i ' \
+                      u'(%s.py)' % (i, name)
                 raise TracError, err
             script.do_upgrade(self.env, i, cursor)
         cursor.execute("UPDATE system SET value=%s WHERE "
@@ -427,6 +499,8 @@
         for section, options in self.config.defaults().items():
             config.add_section(section)
             for name, value in options.items():
+                if isinstance(value, unicode):
+                    value = value.encode('utf8')
                 config.set(section, name, value)
         filename = os.path.join(self.env.path, 'conf', 'trac.ini.sample')
         try:
@@ -455,12 +529,12 @@
     if not env_path:
         env_path = os.getenv('TRAC_ENV')
     if not env_path:
-        raise TracError, 'Missing environment variable "TRAC_ENV". Trac ' \
-                         'requires this variable to point to a valid Trac ' \
-                         'environment.'
+        raise TracError, \
+              'La variable d\'environment "TRAC_ENV" n\'est pas dÃ©finie. Trac a ' \
+              'besoin que cette variable pointe sur un environnement Trac valide.'
 
     env = Environment(env_path)
     if env.needs_upgrade():
-        raise TracError, 'The Trac Environment needs to be upgraded. Run ' \
-                         'trac-admin %s upgrade"' % env_path
+        raise TracError, u"L'environment Trac doit Ãªtre mis Ã  jour. Utilisez " \
+                         u"trac-admin %s upgrade" % env_path
     return env
diff --exclude=.svn -Naur trac-0.10.4/trac/log.py trac-0.10.4-PKG/trac/log.py
--- trac-0.10.4/trac/log.py	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/trac/log.py	2007-08-21 17:33:35.000000000 +0200
@@ -44,7 +44,7 @@
             format = '%(asctime)s ' + format
     datefmt = ''
     if logtype == 'stderr':
-        datefmt = '%X'        
+        datefmt = '%D %X'
     level = level.upper()
     if level in ('DEBUG', 'ALL'):
         logger.setLevel(logging.DEBUG)
@@ -58,6 +58,6 @@
         logger.setLevel(logging.WARNING)
     formatter = logging.Formatter(format, datefmt)
     hdlr.setFormatter(formatter)
-    logger.addHandler(hdlr) 
+    logger.addHandler(hdlr)
 
     return logger
diff --exclude=.svn -Naur trac-0.10.4/trac/mimeview/api.py trac-0.10.4-PKG/trac/mimeview/api.py
--- trac-0.10.4/trac/mimeview/api.py	2007-04-20 15:41:45.000000000 +0200
+++ trac-0.10.4-PKG/trac/mimeview/api.py	2007-10-19 12:57:29.000000000 +0200
@@ -80,14 +80,14 @@
     'application/x-csh':      ['csh'],
     'application/x-troff':    ['nroff', 'roff', 'troff'],
     'application/x-yaml':     ['yml', 'yaml'],
-    
+
     'application/rss+xml':    ['rss'],
-    
+
     'image/x-icon':           ['ico'],
     'image/svg+xml':          ['svg'],
-    
+
     'model/vrml':             ['vrml', 'wrl'],
-    
+
     'text/css':               ['css'],
     'text/html':              ['html'],
     'text/plain':             ['txt', 'TXT', 'text', 'README', 'INSTALL',
@@ -147,7 +147,7 @@
 
     `filename` is either a filename (the lookup will then use the suffix)
     or some arbitrary keyword.
-    
+
     `content` is either a `str` or an `unicode` string.
     """
     suffix = filename.split('.')[-1]
@@ -249,7 +249,7 @@
         be available through the `filename` or `url` parameters.
         This is useful for renderers that embed objects, using <object> or
         <img> instead of including the content inline.
-        
+
         Can return the generated XHTML text as a single string or as an
         iterable that yields strings. In the latter case, the list will
         be considered to correspond to lines of text in the original content.
@@ -279,21 +279,21 @@
     ----
     NOTE: This api will likely change in the future, e.g.:
 
-    def get_supported_conversions(input): 
+    def get_supported_conversions(input):
         '''Tells whether this converter can handle this `input` type.
 
         Return an iterable of `Conversion` objects, each describing
         how the conversion should be done and what will be the output type.
         '''
 
-    def convert_content(context, conversion, content): 
+    def convert_content(context, conversion, content):
         '''Convert the given `AbstractContent` as specified by `Conversion`.
 
         The conversion takes place in the given formatting `context`.
         A `context` provides at least a `req` property.
         If no other specific context object is available, a
         `ToplevelContext` can be used to wrap the `req` instance.
-        
+
         Return the converted content, which ''must'' be a `MimeContent` object.
         '''
     ----
@@ -338,7 +338,7 @@
 
     def __init__(self):
         self._mime_map = None
-        
+
     # Public API
 
     def get_supported_conversions(self, mimetype):
@@ -376,7 +376,7 @@
         candidates = list(self.get_supported_conversions(mimetype))
         candidates = [c for c in candidates if key in (c[0], c[4])]
         if not candidates:
-            raise TracError('No available MIME conversions from %s to %s' %
+            raise TracError(u'Aucune conversion MIME supportÃ©e de %s Ã  %s' %
                             (mimetype, key))
 
         # First successful conversion wins
@@ -386,7 +386,7 @@
             if not output:
                 continue
             return (output[0], output[1], ext)
-        raise TracError('No available MIME conversions from %s to %s' %
+        raise TracError(u'Aucune conversion MIME supportÃ©e de %s Ã  %s' %
                         (mimetype, key))
 
     def get_annotation_types(self):
@@ -464,7 +464,7 @@
                     return Markup(buf.getvalue())
             except Exception, e:
                 self.log.warning('HTML preview using %s failed (%s)'
-                                 % (renderer, e), exc_info=True)
+                                 % (renderer, to_unicode(e)), exc_info=True)
 
     def _annotate(self, lines, annotations):
         buf = StringIO()
@@ -508,11 +508,11 @@
         """Infer the character encoding from the `content` or the `mimetype`.
 
         `content` is either a `str` or an `unicode` object.
-        
+
         The charset will be determined using this order:
          * from the charset information present in the `mimetype` argument
          * auto-detection of the charset from the `content`
-         * the configured `default_charset` 
+         * the configured `default_charset`
         """
         if mimetype:
             ctpos = mimetype.find('charset=')
@@ -580,13 +580,13 @@
                 self.log.warning("Invalid mapping '%s' specified in '%s' "
                                  "option." % (mapping, option))
         return types
-    
+
     def preview_to_hdf(self, req, content, length, mimetype, filename,
                        url=None, annotations=None):
         """Prepares a rendered preview of the given `content`.
 
         Note: `content` will usually be an object with a `read` method.
-        """        
+        """
         if length >= self.max_preview_size:
             return {'max_file_size_reached': True,
                     'max_file_size': self.max_preview_size,
@@ -605,12 +605,12 @@
                                                          content, selector)
         req.send_response(200)
         req.send_header('Content-Type', output_type)
-        req.send_header('Content-Disposition', 'attachment; filename=%s.%s' % 
+        req.send_header('Content-Disposition', 'attachment; filename=%s.%s' %
                         (filename, ext))
         req.end_headers()
         req.write(content)
-        raise RequestDone        
-        
+        raise RequestDone
+
 
 def _html_splitlines(lines):
     """Tracks open and close tags in lines of HTML text and yields lines that
@@ -654,7 +654,7 @@
     # ITextAnnotator methods
 
     def get_annotation_type(self):
-        return 'lineno', 'Line', 'Line numbers'
+        return 'lineno', 'Ligne', u'NumÃ©rotation des lignes'
 
     def annotate_line(self, number, content):
         return '<th id="L%s"><a href="#L%s">%s</a></th>' % (number, number,
diff --exclude=.svn -Naur trac-0.10.4/trac/mimeview/enscript.py trac-0.10.4-PKG/trac/mimeview/enscript.py
--- trac-0.10.4/trac/mimeview/enscript.py	2007-04-20 15:41:45.000000000 +0200
+++ trac-0.10.4-PKG/trac/mimeview/enscript.py	2007-10-19 12:33:37.000000000 +0200
@@ -137,8 +137,8 @@
 
         np = NaivePopen(cmdline, content.encode('utf-8'), capturestderr=1)
         if np.errorlevel or np.err:
-            err = 'Running (%s) failed: %s, %s.' % (cmdline, np.errorlevel,
-                                                    np.err)
+            err = u"L'exÃ©cution de la commande (%s) a echouÃ©: %s, %s." % \
+                  (cmdline, np.errorlevel, np.err)
             raise Exception, err
         odata = np.out
 
diff --exclude=.svn -Naur trac-0.10.4/trac/mimeview/patch.py trac-0.10.4-PKG/trac/mimeview/patch.py
--- trac-0.10.4/trac/mimeview/patch.py	2007-04-20 15:41:45.000000000 +0200
+++ trac-0.10.4-PKG/trac/mimeview/patch.py	2007-08-24 11:05:28.000000000 +0200
@@ -35,7 +35,7 @@
 <div class="diff"><ul class="entries"><?cs
  each:file = diff.files ?><li class="entry">
   <h2><?cs var:file.filename ?></h2>
-  <table class="inline" summary="Differences" cellspacing="0">
+  <table class="inline" summary="DiffÃ©rences" cellspacing="0">
    <colgroup><col class="lineno" /><col class="lineno" /><col class="content" /></colgroup>
    <thead><tr>
     <th><?cs var:file.oldrev ?></th>
@@ -69,7 +69,7 @@
         d = self._diff_to_hdf(content.splitlines(),
                               Mimeview(self.env).tab_width)
         if not d:
-            raise TracError, 'Invalid unified diff content'
+            raise TracError, u'Contenu diff unifiÃ© invalide'
         hdf = HDFWrapper(loadpaths=[self.env.get_templates_dir(),
                                     self.config.get('trac', 'templates_dir')])
         hdf['diff.files'] = d
diff --exclude=.svn -Naur trac-0.10.4/trac/mimeview/php.py trac-0.10.4-PKG/trac/mimeview/php.py
--- trac-0.10.4/trac/mimeview/php.py	2007-04-20 15:41:45.000000000 +0200
+++ trac-0.10.4-PKG/trac/mimeview/php.py	2007-08-24 11:05:53.000000000 +0200
@@ -41,7 +41,7 @@
         # the first span after a set of 1+ "<br />" to before them.
         r_fixeol = re.compile(r"((?:<br />)+)(</(?:font|span)>)")
         indata = r_fixeol.sub(lambda m: m.group(2) + m.group(1), indata)
-        
+
         # Now call superclass implementation that handles the dirty work
         # of applying css classes.
         return Deuglifier.format(self, indata)
@@ -83,17 +83,16 @@
         content = content.encode('utf-8')
         np = NaivePopen(cmdline, content, capturestderr=1)
         if (os.name != 'nt' and np.errorlevel) or np.err:
-            msg = 'Running (%s) failed: %s, %s.' % (cmdline,
-                                                    np.errorlevel,
-                                                    np.err)
+            msg = u'L\'exÃ©cution de la commande (%s) a echouÃ© : %s, %s.' \
+                        % (cmdline, np.errorlevel, np.err)
             raise Exception(msg)
 
         odata = ''.join(np.out.splitlines()[1:-1])
         if odata.startswith('X-Powered-By:') or \
                 odata.startswith('Content-type:'):
-            raise TracError('You appear to be using the PHP CGI '
-                            'binary. Trac requires the CLI version '
-                            'for syntax highlighting.')
+            raise TracError(u'Apparemment, vous utilisez la version CGI de PHP. '
+                            u'Trac a besoin de la version CLI pour rÃ©aliser la '
+                            u'coloration syntaxique.')
 
         epilogues = ["</span>", "</font>"]
         for e in epilogues:
diff --exclude=.svn -Naur trac-0.10.4/trac/mimeview/rst.py trac-0.10.4-PKG/trac/mimeview/rst.py
--- trac-0.10.4/trac/mimeview/rst.py	2007-04-20 15:41:45.000000000 +0200
+++ trac-0.10.4-PKG/trac/mimeview/rst.py	2007-08-24 11:07:14.000000000 +0200
@@ -52,9 +52,9 @@
             from docutils.parsers import rst
             from docutils import __version__
         except ImportError:
-            raise TracError, 'Docutils not found'
+            raise TracError, u'La bibliothÃ¨que Docutils est introuvable'
         if StrictVersion(__version__) < StrictVersion('0.3.9'):
-            raise TracError, 'Docutils version >= %s required, %s found' \
+            raise TracError, u'Une version >= %s de Docutils est requise, la version %s a Ã©tÃ© dÃ©tectÃ©e' \
                              % ('0.3.9', __version__)
 
         def trac_get_reference(rawtext, target, text):
@@ -74,7 +74,7 @@
             else:
                 uri = req.href.wiki(target)
                 missing = not WikiSystem(self.env).has_page(target)
-            if uri:                    
+            if uri:
                 reference = nodes.reference(rawtext, text or target)
                 reference['refuri']= uri
                 if missing:
@@ -84,8 +84,8 @@
 
         def trac(name, arguments, options, content, lineno,
                  content_offset, block_text, state, state_machine):
-            """Inserts a `reference` node into the document 
-            for a given `TracLink`_, based on the content 
+            """Inserts a `reference` node into the document
+            for a given `TracLink`_, based on the content
             of the arguments.
 
             Usage::
@@ -113,7 +113,7 @@
             # didn't find a match (invalid TracLink),
             # report a warning
             warning = state_machine.reporter.warning(
-                    '%s is not a valid TracLink' % (arguments[0]),
+                    u'%s n\'est pas un lien Trac correct' % (arguments[0]),
                     nodes.literal_block(block_text, block_text),
                     line=lineno)
             return [warning]
@@ -130,7 +130,7 @@
             if reference:
                 return [reference], []
             warning = nodes.warning(None, nodes.literal_block(text,
-                'WARNING: %s is not a valid TracLink' % rawtext))
+                u'ATTENTION: %s n\'est pas un lien Trac correct' % rawtext))
             return warning, []
 
         # 1 required arg, 1 optional arg, spaces allowed in last arg
@@ -146,7 +146,7 @@
             html = processor.process(req, text)
             raw = nodes.raw('', html, format='html')
             return raw
-        
+
         def code_role(name, rawtext, text, lineno, inliner, options={},
                       content=[]):
             language = options.get('language')
@@ -159,7 +159,7 @@
                     text = ''
             reference = code_formatter(language, text)
             return [reference], []
-        
+
         def code_block(name, arguments, options, content, lineno,
                        content_offset, block_text, state, state_machine):
             """
@@ -170,7 +170,7 @@
             If the language can be syntax highlighted it will be.
             """
             language = arguments[0]
-            text = '\n'.join(content)        
+            text = '\n'.join(content)
             reference = code_formatter(language, text)
             return [reference]
 
@@ -180,7 +180,7 @@
             1, # Number of required arguments.
             0, # Number of optional arguments.
             0) # True if final argument may contain whitespace.
-    
+
         # A mapping from option name to conversion function.
         code_role.options = code_block.options = {
             'language' :
@@ -195,7 +195,7 @@
         _parser = rst.Parser(inliner=_inliner)
         content = content_to_unicode(self.env, content, mimetype)
         parts = publish_parts(content, writer_name='html', parser=_parser,
-                              settings_overrides={'halt_level': 6, 
-                                                  'file_insertion_enabled': 0, 
+                              settings_overrides={'halt_level': 6,
+                                                  'file_insertion_enabled': 0,
                                                   'raw_enabled': 0})
         return parts['html_body']
diff --exclude=.svn -Naur trac-0.10.4/trac/notification.py trac-0.10.4-PKG/trac/notification.py
--- trac-0.10.4/trac/notification.py	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/trac/notification.py	2007-08-24 11:08:57.000000000 +0200
@@ -58,13 +58,13 @@
     smtp_always_bcc = Option('notification', 'smtp_always_bcc', '',
         """Email address(es) to always send notifications to,
            addresses do not appear publicly (Bcc:). (''since 0.10'').""")
-           
+
     smtp_default_domain = Option('notification', 'smtp_default_domain', '',
         """Default host/domain to append to address that do not specify one""")
-           
+
     mime_encoding = Option('notification', 'mime_encoding', 'base64',
         """Specifies the MIME encoding scheme for emails.
-        
+
         Valid options are 'base64' for Base64 encoding, 'qp' for
         Quoted-Printable, and 'none' for no encoding. Note that the no encoding
         means that non-ASCII characters in text are going to cause problems
@@ -72,31 +72,31 @@
 
     use_public_cc = BoolOption('notification', 'use_public_cc', 'false',
         """Recipients can see email addresses of other CC'ed recipients.
-        
+
         If this option is disabled (the default), recipients are put on BCC
         (''since 0.10'').""")
 
     use_short_addr = BoolOption('notification', 'use_short_addr', 'false',
         """Permit email address without a host/domain (i.e. username only)
-        
+
         The SMTP server should accept those addresses, and either append
         a FQDN or use local delivery (''since 0.10'').""")
-        
+
     use_tls = BoolOption('notification', 'use_tls', 'false',
         """Use SSL/TLS to send notifications (''since 0.10'').""")
-    
+
     smtp_subject_prefix = Option('notification', 'smtp_subject_prefix',
-                                 '__default__', 
-        """Text to prepend to subject line of notification emails. 
-        
+                                 '__default__',
+        """Text to prepend to subject line of notification emails.
+
         If the setting is not defined, then the [$project_name] prefix.
-        If no prefix is desired, then specifying an empty option 
+        If no prefix is desired, then specifying an empty option
         will disable it.(''since 0.10.1'').""")
 
 
 class Notify(object):
     """Generic notification class for Trac.
-    
+
     Subclass this to implement different methods.
     """
 
@@ -117,7 +117,7 @@
 
     def get_recipients(self, resid):
         """Return a pair of list of subscribers to the resource 'resid'.
-        
+
         First list represents the direct recipients (To:), second list
         represents the recipients in carbon copy (Cc:).
         """
@@ -125,7 +125,7 @@
 
     def begin_send(self):
         """Prepare to send messages.
-        
+
         Called before sending begins.
         """
 
@@ -135,7 +135,7 @@
 
     def finish_send(self):
         """Clean up after sending all messages.
-        
+
         Called after sending all messages.
         """
 
@@ -166,7 +166,7 @@
         for username, name, email in self.env.get_known_users(self.db):
             if email:
                 self.email_map[username] = email
-                
+
     def _init_pref_encoding(self):
         from email.Charset import Charset, QP, BASE64
         self._charset = Charset()
@@ -190,7 +190,7 @@
             self._charset.input_codec = None
             self._charset.output_charset = 'ascii'
         else:
-            raise TracError, 'Invalid email encoding setting: %s' % pref
+            raise TracError, u'Configuration encodage courriel invalide: %s' % pref
 
     def notify(self, resid, subject):
         self.subject = subject
@@ -203,11 +203,11 @@
         self.replyto_email = self.config['notification'].get('smtp_replyto')
         self.from_email = self.from_email or self.replyto_email
         if not self.from_email and not self.replyto_email:
-            raise TracError(Markup('Unable to send email due to identity '
-                                   'crisis.<p>Neither <b>notification.from</b> '
-                                   'nor <b>notification.reply_to</b> are '
-                                   'specified in the configuration.</p>'),
-                            'SMTP Notification Error')
+            raise TracError(Markup(u'Impossible d\'envoyer un courriel.<br />'
+                                   u'Ni <b>notification.from</b> ni'
+                                   u' <b>notification.reply_to</b> ne sont'
+                                   u' dÃ©finis dans la configuration.'),
+                            u'Erreur de notification SMTP')
 
         # Authentication info (optional)
         self.user_name = self.config['notification'].get('smtp_user')
@@ -220,7 +220,7 @@
         maxlength = MAXHEADERLEN-(len(key)+2)
         # Do not sent ridiculous short headers
         if maxlength < 10:
-            raise TracError, "Header length is too short"
+            raise TracError, u"Erreur interne: En-tÃªte trop court"
         try:
             tmp = name.encode('ascii')
             header = Header(tmp, 'ascii', maxlinelen=maxlength)
@@ -280,7 +280,8 @@
         if self._use_tls:
             self.server.ehlo()
             if not self.server.esmtp_features.has_key('starttls'):
-                raise TracError, "TLS enabled but server does not support TLS"
+                raise TracError, u"TLS activÃ© mais le server ne supporte " \
+                                 u"pas les communications sÃ©curisÃ©es TLS"
             self.server.starttls()
             self.server.ehlo()
         if self.user_name:
@@ -330,7 +331,7 @@
         (ccaddrs, recipients) = remove_dup(ccaddrs, recipients)
         (accaddrs, recipients) = remove_dup(accaddrs, recipients)
         (bccaddrs, recipients) = remove_dup(bccaddrs, recipients)
-        
+
         # if there is not valid recipient, leave immediately
         if len(recipients) < 1:
             self.env.log.info('no recipient for a ticket notification')
@@ -349,8 +350,8 @@
             try:
                 dummy = body.encode('ascii')
             except UnicodeDecodeError:
-                raise TracError, "Ticket contains non-Ascii chars. " \
-                                 "Please change encoding setting"
+                raise TracError, u"Le ticket contient des caractÃ¨res non Ascii" \
+                                 u"Veuillez changer les paramÃ¨tres d'encodage"
         msg = MIMEText(body, 'plain')
         # Message class computes the wrong type from MIMEText constructor,
         # which does not take a Charset object as initializer. Reset the
diff --exclude=.svn -Naur trac-0.10.4/trac/perm.py trac-0.10.4-PKG/trac/perm.py
--- trac-0.10.4/trac/perm.py	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/trac/perm.py	2007-08-24 11:09:40.000000000 +0200
@@ -32,7 +32,7 @@
         self.action = action
 
     def __str__ (self):
-        return '%s privileges are required to perform this operation' % self.action
+        return u'Les privilÃ¨ges %s sont nÃ©cessaires pour exÃ©cuter cette opÃ©ration' % self.action
 
 
 class IPermissionRequestor(Interface):
@@ -40,7 +40,7 @@
 
     def get_permission_actions():
         """Return a list of actions defined by this component.
-        
+
         The items in the list may either be simple strings, or
         `(string, sequence)` tuples. The latter are considered to be "meta
         permissions" that group several simple actions under one name for
@@ -54,7 +54,7 @@
 
     def get_user_permissions(username):
         """Return all permissions for the user with the specified name.
-        
+
         The permissions are returned as a dictionary where the key is the name
         of the permission, and the value is either `True` for granted
         permissions or `False` for explicitly denied permissions."""
@@ -84,7 +84,7 @@
 
 class DefaultPermissionStore(Component):
     """Default implementation of permission storage and simple group management.
-    
+
     This component uses the `PERMISSION` table in the database to store both
     permissions and groups.
     """
@@ -95,7 +95,7 @@
     def get_user_permissions(self, username):
         """Retrieve the permissions for the given user and return them in a
         dictionary.
-        
+
         The permissions are stored in the database as (username, action)
         records. There's simple support for groups by using lowercase names for
         the action column: such a record represents a group and not an actual
@@ -185,7 +185,7 @@
         """Grant the user with the given name permission to perform to specified
         action."""
         if action.isupper() and action not in self.get_actions():
-            raise TracError, '%s is not a valid action.' % action
+            raise TracError, u"%s n'est pas une action valide" % action
 
         self.store.grant_permission(username, action)
 
@@ -205,7 +205,7 @@
 
     def get_user_permissions(self, username=None):
         """Return the permissions of the specified user.
-        
+
         The return value is a dictionary containing all the actions as keys, and
         a boolean value. `True` means that the permission is granted, `False`
         means the permission is denied."""
diff --exclude=.svn -Naur trac-0.10.4/trac/scripts/admin.py trac-0.10.4-PKG/trac/scripts/admin.py
--- trac-0.10.4/trac/scripts/admin.py	2007-10-19 14:48:30.000000000 +0200
+++ trac-0.10.4-PKG/trac/scripts/admin.py	2007-08-24 11:10:28.000000000 +0200
@@ -1200,7 +1200,7 @@
                 arg = content.split(' ', 1)[0]
                 doc = getattr(TracAdmin, '_help_' + arg)
             except AttributeError:
-                raise TracError('Unknown trac-admin command "%s"' % content)
+                raise TracError(u'Commande trac-admin inconnue "%s"' % content)
             if arg != content:
                 for cmd, help in doc:
                     if cmd.startswith(content):
diff --exclude=.svn -Naur trac-0.10.4/trac/Search.py trac-0.10.4-PKG/trac/Search.py
--- trac-0.10.4/trac/Search.py	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/trac/Search.py	2007-08-24 11:12:06.000000000 +0200
@@ -74,7 +74,7 @@
     parameters. The result is returned as a (string, params) tuple.
     """
     if len(columns) < 1 or len(terms) < 1:
-        raise TracError('Empty search attempt, this should really not happen.')
+        raise TracError(u'Tentative de recherche vide: ceci ne devrait pas arriver.')
 
     likes = ['%s %s' % (i, db.like()) for i in columns]
     c = ' OR '.join(likes)
@@ -109,7 +109,7 @@
     if beg < len(text)-maxlen:
         msg = msg + ' ...'
     return msg
-    
+
 
 class SearchModule(Component):
 
@@ -117,7 +117,7 @@
                IWikiSyntaxProvider)
 
     search_sources = ExtensionPoint(ISearchSource)
-    
+
     RESULTS_PER_PAGE = 10
 
     min_query_length = IntOption('search', 'min_query_length', 3,
@@ -132,7 +132,7 @@
         if not req.perm.has_permission('SEARCH_VIEW'):
             return
         yield ('mainnav', 'search',
-               html.A('Search', href=req.href.search(), accesskey=4))
+               html.A(u'Rechercher', href=req.href.search(), accesskey=4))
 
     # IPermissionRequestor methods
 
@@ -150,19 +150,19 @@
         available_filters = []
         for source in self.search_sources:
             available_filters += source.get_search_filters(req)
-            
+
         filters = [f[0] for f in available_filters if req.args.has_key(f[0])]
         if not filters:
             filters = [f[0] for f in available_filters
                        if len(f) < 3 or len(f) > 2 and f[2]]
-                
+
         req.hdf['search.filters'] = [
             { 'name': filter[0],
               'label': filter[1],
               'active': filter[0] in filters
             } for filter in available_filters]
-                
-        req.hdf['title'] = 'Search'
+
+        req.hdf['title'] = u'Recherche'
 
         query = req.args.get('q')
         if query:
@@ -173,9 +173,10 @@
             terms = search_terms(query)
             # Refuse queries that obviously would result in a huge result set
             if len(terms) == 1 and len(terms[0]) < self.min_query_length:
-                raise TracError('Search query too short. '
-                                'Query must be at least %d characters long.' % \
-                                self.min_query_length, 'Search Error')
+                raise TracError(u'La requÃªte de recherche est trop courte. '
+                                u'La requÃªte doit contenir au moins %d '
+                                u'caractÃ¨res.' % self.min_query_length, 
+                                u'Erreur de recherche')
             results = []
             for source in self.search_sources:
                 results += list(source.get_search_results(req, terms, filters))
@@ -185,7 +186,7 @@
             n_pages = (n-1) / page_size + 1
             results = results[(page-1) * page_size: page * page_size]
 
-            req.hdf['title'] = 'Search Results'
+            req.hdf['title'] = u'RÃ©sultats de la recherche'
             req.hdf['search.q'] = req.args.get('q')
             req.hdf['search.page'] = page
             req.hdf['search.n_hits'] = n
@@ -195,12 +196,12 @@
                 next_href = req.href.search(zip(filters, ['on'] * len(filters)),
                                             q=req.args.get('q'), page=page + 1,
                                             noquickjump=1)
-                add_link(req, 'next', next_href, 'Next Page')
+                add_link(req, 'next', next_href, u'Page suivante')
             if page > 1:
                 prev_href = req.href.search(zip(filters, ['on'] * len(filters)),
                                             q=req.args.get('q'), page=page - 1,
                                             noquickjump=1)
-                add_link(req, 'prev', prev_href, 'Previous Page')
+                add_link(req, 'prev', prev_href, u'Page prÃ©cÃ©dente')
             req.hdf['search.page_href'] = req.href.search(
                 zip(filters, ['on'] * len(filters)), q=req.args.get('q'),
                 noquickjump=1)
@@ -222,7 +223,7 @@
         if kwd[0] == '/':
             quickjump_href = req.href.browser(kwd)
             name = kwd
-            description = 'Browse repository path ' + kwd
+            description = u'Naviguer dans le chemin du dÃ©pÃ´t ' + kwd
         else:
             link = wiki_to_link(kwd, self.env, req)
             if isinstance(link, Element):
@@ -240,10 +241,10 @@
                 req.redirect(quickjump_href)
 
     # IWikiSyntaxProvider methods
-    
+
     def get_wiki_syntax(self):
         return []
-    
+
     def get_link_resolvers(self):
         yield ('search', self._format_link)
 
diff --exclude=.svn -Naur trac-0.10.4/trac/Settings.py trac-0.10.4-PKG/trac/Settings.py
--- trac-0.10.4/trac/Settings.py	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/trac/Settings.py	2007-08-24 11:12:43.000000000 +0200
@@ -33,7 +33,7 @@
 
     def get_navigation_items(self, req):
         yield ('metanav', 'settings',
-               html.A('Settings', href=req.href.settings()))
+               html.A(u'RÃ©glages', href=req.href.settings()))
 
     # IRequestHandler methods
 
@@ -49,7 +49,7 @@
             elif action == 'load':
                 self._do_load(req)
 
-        req.hdf['title'] = 'Settings'
+        req.hdf['title'] = u'ParamÃ©trage'
         req.hdf['settings'] = req.session
         if req.authname == 'anonymous':
             req.hdf['settings.session_id'] = req.session.sid
diff --exclude=.svn -Naur trac-0.10.4/trac/ticket/api.py trac-0.10.4-PKG/trac/ticket/api.py
--- trac-0.10.4/trac/ticket/api.py	2007-04-20 15:41:46.000000000 +0200
+++ trac-0.10.4-PKG/trac/ticket/api.py	2007-08-24 11:15:59.000000000 +0200
@@ -21,7 +21,7 @@
 from trac.perm import IPermissionRequestor, PermissionSystem
 from trac.Search import ISearchSource, search_to_sql, shorten_result
 from trac.util.html import html, Markup
-from trac.util.text import shorten_line
+from trac.util.text import shorten_line, translate
 from trac.wiki import IWikiSyntaxProvider, Formatter
 
 
@@ -34,7 +34,7 @@
 
     def ticket_changed(ticket, comment, author, old_values):
         """Called when a ticket is modified.
-        
+
         `old_values` is a dictionary containing the previous values of the
         fields that have changed.
         """
@@ -52,7 +52,7 @@
 
     def validate_ticket(req, ticket):
         """Validate a ticket after it's been populated from user input.
-        
+
         Must return a list of `(field, message)` tuples, one for each problem
         detected. `field` can be `None` to indicate an overall problem with the
         ticket. Therefore, a return value of `[]` means everything is OK."""
@@ -96,7 +96,7 @@
             fields.append(field)
 
         # Owner field, can be text or drop-down depending on configuration
-        field = {'name': 'owner', 'label': 'Owner'}
+        field = {'name': 'owner', 'label': 'PropriÃ©taire'}
         if self.restrict_owner:
             field['type'] = 'select'
             users = []
@@ -125,7 +125,9 @@
                 # Fields without possible values are treated as if they didn't
                 # exist
                 continue
-            field = {'name': name, 'type': 'select', 'label': name.title(),
+            # de Trac 0.10.4: field = {'name': name, 'type': 'select', 'label': name.title(),
+            field = {'name': name, 'type': 'select', 
+                     'label': translate(self.env, name, True),
                      'value': self.config.get('ticket', 'default_' + name),
                      'options': options}
             if name in ('status', 'resolution'):
@@ -137,7 +139,9 @@
 
         # Advanced text fields
         for name in ('keywords', 'cc', ):
-            field = {'name': name, 'type': 'text', 'label': name.title()}
+            # de Trac 0.10.4: field = {'name': name, 'type': 'text', 'label': name.title()}
+            field = {'name': name, 'type': 'text', 
+                     'label': translate(self.env, name, True)}
             fields.append(field)
 
         for field in self.get_custom_fields():
@@ -184,8 +188,8 @@
     def get_permission_actions(self):
         return ['TICKET_APPEND', 'TICKET_CREATE', 'TICKET_CHGPROP',
                 'TICKET_VIEW',
-                ('TICKET_MODIFY', ['TICKET_APPEND', 'TICKET_CHGPROP']),  
-                ('TICKET_ADMIN', ['TICKET_CREATE', 'TICKET_MODIFY',  
+                ('TICKET_MODIFY', ['TICKET_APPEND', 'TICKET_CHGPROP']),
+                ('TICKET_ADMIN', ['TICKET_CREATE', 'TICKET_MODIFY',
                                   'TICKET_VIEW'])]
 
     # IWikiSyntaxProvider methods
@@ -244,10 +248,10 @@
                     cnum = target
         if href:
             return html.A(label, href="%s#comment:%s" % (href, cnum),
-                          title="Comment %s for %s:%s" % (cnum, type, id))
+                          title= u"Commentaire %s pour %s:%s" % (cnum, type, id))
         else:
             return label
- 
+
     # ISearchSource methods
 
     def get_search_filters(self, req):
diff --exclude=.svn -Naur trac-0.10.4/trac/ticket/model.py trac-0.10.4-PKG/trac/ticket/model.py
--- trac-0.10.4/trac/ticket/model.py	2007-04-20 15:41:46.000000000 +0200
+++ trac-0.10.4-PKG/trac/ticket/model.py	2007-08-24 11:20:44.000000000 +0200
@@ -25,6 +25,7 @@
 from trac.core import TracError
 from trac.ticket import TicketSystem
 from trac.util import sorted, embedded_numbers
+from trac.util.text import translate
 
 __all__ = ['Ticket', 'Type', 'Status', 'Resolution', 'Priority', 'Severity',
            'Component', 'Milestone', 'Version']
@@ -83,8 +84,8 @@
                        % ','.join(std_fields), (tkt_id,))
         row = cursor.fetchone()
         if not row:
-            raise TracError('Ticket %d does not exist.' % tkt_id,
-                            'Invalid Ticket Number')
+            raise TracError(u'Le ticket %d n\'existe pas.' % tkt_id,
+                            u'NumÃ©ro de ticket invalide')
 
         self.id = tkt_id
         for i in range(len(std_fields)):
@@ -131,7 +132,7 @@
 
     def insert(self, when=0, db=None):
         """Add ticket to database"""
-        assert not self.exists, 'Cannot insert an existing ticket'
+        assert not self.exists, u'Impossible d\'insÃ©rer un ticket existant'
         db, handle_ta = self._get_db_for_write(db)
 
         # Add a timestamp
@@ -187,7 +188,7 @@
         the database.  Returns False if there were no changes to save, True
         otherwise.
         """
-        assert self.exists, 'Cannot update a new ticket'
+        assert self.exists, u'Impossible de mettre Ã  jour un nouveau ticket'
 
         if not self._old and not comment:
             return False # Not modified
@@ -225,7 +226,7 @@
         custom_fields = [f['name'] for f in self.fields if f.get('custom')]
         for name in self._old.keys():
             if name in custom_fields:
-                cursor.execute("SELECT * FROM ticket_custom " 
+                cursor.execute("SELECT * FROM ticket_custom "
                                "WHERE ticket=%s and name=%s", (self.id, name))
                 if cursor.fetchone():
                     cursor.execute("UPDATE ticket_custom SET value=%s "
@@ -331,7 +332,7 @@
                            (self.type, name))
             row = cursor.fetchone()
             if not row:
-                raise TracError, '%s %s does not exist.' % (self.type, name)
+                raise TracError, '%s %s n\'existe pas.' % (self.type, name)
             self.value = self._old_value = row[0]
             self.name = self._old_name = name
         else:
@@ -341,7 +342,7 @@
     exists = property(fget=lambda self: self._old_value is not None)
 
     def delete(self, db=None):
-        assert self.exists, 'Cannot deleting non-existent %s' % self.type
+        assert self.exists, u'Impossible d\'effacer %s (inexistant)' % self.type
         if not db:
             db = self.env.get_db_cnx()
             handle_ta = True
@@ -359,8 +360,8 @@
         self.name = self._old_name = None
 
     def insert(self, db=None):
-        assert not self.exists, 'Cannot insert existing %s' % self.type
-        assert self.name, 'Cannot create %s with no name' % self.type
+        assert not self.exists, u"Impossible d'ajouter %s (existe dÃ©ja)" % self.type
+        assert self.name, u"Impossible de crÃ©er %s (anonyme)" % self.type
         self.name = self.name.strip()
         if not db:
             db = self.env.get_db_cnx()
@@ -384,8 +385,8 @@
         self._old_value = self.value
 
     def update(self, db=None):
-        assert self.exists, 'Cannot update non-existent %s' % self.type
-        assert self.name, 'Cannot update %s with no name' % self.type
+        assert self.exists, u'Impossible de mettre Ã  jour %s (inexistant)' % self.type
+        assert self.name, u'Impossible de mettre Ã  jour %s (anonyme)' % self.type
         self.name = self.name.strip()
         if not db:
             db = self.env.get_db_cnx()
@@ -457,7 +458,7 @@
                            "WHERE name=%s", (name,))
             row = cursor.fetchone()
             if not row:
-                raise TracError, 'Component %s does not exist.' % name
+                raise TracError, u'Le composant %s n\'existe pas' % name
             self.name = self._old_name = name
             self.owner = row[0] or None
             self.description = row[1] or ''
@@ -469,7 +470,7 @@
     exists = property(fget=lambda self: self._old_name is not None)
 
     def delete(self, db=None):
-        assert self.exists, 'Cannot deleting non-existent component'
+        assert self.exists, u'Impossible de supprimer un composant inexistant'
         if not db:
             db = self.env.get_db_cnx()
             handle_ta = True
@@ -486,8 +487,8 @@
             db.commit()
 
     def insert(self, db=None):
-        assert not self.exists, 'Cannot insert existing component'
-        assert self.name, 'Cannot create component with no name'
+        assert not self.exists, u"Impossible d'ajouter un composant dÃ©jÃ  existant"
+        assert self.name, u'Impossible de crÃ©er un composant sans nom'
         self.name = self.name.strip()
         if not db:
             db = self.env.get_db_cnx()
@@ -505,8 +506,8 @@
             db.commit()
 
     def update(self, db=None):
-        assert self.exists, 'Cannot update non-existent component'
-        assert self.name, 'Cannot update component with no name'
+        assert self.exists, u'Impossible de mettre Ã  jour un composant inexistant'
+        assert self.name, u'Impossible de mettre Ã  jour un composant anonyme'
         self.name = self.name.strip()
         if not db:
             db = self.env.get_db_cnx()
@@ -564,8 +565,8 @@
                        "FROM milestone WHERE name=%s", (name,))
         row = cursor.fetchone()
         if not row:
-            raise TracError('Milestone %s does not exist.' % name,
-                            'Invalid Milestone Name')
+            raise TracError(u'%s %s n\'existe pas.' % ( translate(self.env,'The_milestone',True), name),
+                            u'Nom de %s invalide' % translate(self.env,'milestone'))
         self.name = row[0]
         self.due = row[1] and int(row[1]) or 0
         self.completed = row[2] and int(row[2]) or 0
@@ -594,14 +595,14 @@
         for tkt_id in tkt_ids:
             ticket = Ticket(self.env, tkt_id, db)
             ticket['milestone'] = retarget_to
-            ticket.save_changes(author, 'Milestone %s deleted' % self.name,
+            ticket.save_changes(author, u'%s %s effacÃ©' % (translate(self.env,'Milestone',True), self.name),
                                 now, db=db)
 
         if handle_ta:
             db.commit()
 
     def insert(self, db=None):
-        assert self.name, 'Cannot create milestone with no name'
+        assert self.name, u'Impossible de crÃ©er un %s sans nom' % translate(self.env,'milestone')
         self.name = self.name.strip()
         if not db:
             db = self.env.get_db_cnx()
@@ -619,7 +620,7 @@
             db.commit()
 
     def update(self, db=None):
-        assert self.name, 'Cannot update milestone with no name'
+        assert self.name, u'Impossible de mettre Ã  jour un %s sans nom' % translate(self.env,'milestone')
         self.name = self.name.strip()
         if not db:
             db = self.env.get_db_cnx()
@@ -678,7 +679,7 @@
                            "WHERE name=%s", (name,))
             row = cursor.fetchone()
             if not row:
-                raise TracError, 'Version %s does not exist.' % name
+                raise TracError, u"La version %s n'existe pas." % name
             self.name = self._old_name = name
             self.time = row[0] and int(row[0]) or None
             self.description = row[1] or ''
@@ -690,7 +691,7 @@
     exists = property(fget=lambda self: self._old_name is not None)
 
     def delete(self, db=None):
-        assert self.exists, 'Cannot deleting non-existent version'
+        assert self.exists, u'Impossible de supprimer une version inexistante'
         if not db:
             db = self.env.get_db_cnx()
             handle_ta = True
@@ -707,8 +708,8 @@
             db.commit()
 
     def insert(self, db=None):
-        assert not self.exists, 'Cannot insert existing version'
-        assert self.name, 'Cannot create version with no name'
+        assert not self.exists, u"Impossible d'ajouter une version dÃ©jÃ  existante"
+        assert self.name, u'Impossible de crÃ©er une version anonyme'
         self.name = self.name.strip()
         if not db:
             db = self.env.get_db_cnx()
@@ -726,8 +727,8 @@
             db.commit()
 
     def update(self, db=None):
-        assert self.exists, 'Cannot update non-existent version'
-        assert self.name, 'Cannot update version with no name'
+        assert self.exists, u'Impossible de mettre Ã  jour une version inexistante'
+        assert self.name, u'Impossible de mettre Ã  jour une version anonyme'
         self.name = self.name.strip()
         if not db:
             db = self.env.get_db_cnx()
diff --exclude=.svn -Naur trac-0.10.4/trac/ticket/query.py trac-0.10.4-PKG/trac/ticket/query.py
--- trac-0.10.4/trac/ticket/query.py	2007-04-20 15:41:46.000000000 +0200
+++ trac-0.10.4-PKG/trac/ticket/query.py	2007-08-24 11:22:31.000000000 +0200
@@ -67,11 +67,11 @@
         for filter in filters:
             filter = filter.split('=')
             if len(filter) != 2:
-                raise QuerySyntaxError, 'Query filter requires field and ' \
-                                        'constraints separated by a "="'
+                raise QuerySyntaxError, u'Le filtre de requÃªte impose que les champs et les ' \
+                                        u'contraintes soient sÃ©parÃ©s par un "="'
             field,values = filter
             if not field:
-                raise QuerySyntaxError, 'Query filter requires field name'
+                raise QuerySyntaxError, u'Le filtre de requÃªte a besoin d\'un nom de champ'
             values = values.split('|')
             mode, neg = '', ''
             if field[-1] in ('~', '^', '$'):
@@ -164,9 +164,9 @@
             for i in range(1, len(columns)):
                 name, val = columns[i], row[i]
                 if name == self.group:
-                    val = val or 'None'
+                    val = val or 'Aucun'
                 elif name == 'reporter':
-                    val = val or 'anonymous'
+                    val = val or 'Anonyme'
                 elif name in ['changetime', 'time']:
                     val = int(val)
                 elif val is None:
@@ -352,11 +352,11 @@
 
     # IContentConverter methods
     def get_supported_conversions(self):
-        yield ('rss', 'RSS Feed', 'xml',
+        yield ('rss', u'Flux RSS', 'xml',
                'trac.ticket.Query', 'application/rss+xml', 8)
-        yield ('csv', 'Comma-delimited Text', 'csv',
+        yield ('csv', u'Texte dÃ©limitÃ© par des virgules', 'csv',
                'trac.ticket.Query', 'text/csv', 8)
-        yield ('tab', 'Tab-delimited Text', 'tsv',
+        yield ('tab', u'Texte dÃ©limitÃ© par des tabulations', 'tsv',
                'trac.ticket.Query', 'text/tab-separated-values', 8)
 
     def convert_content(self, req, mimetype, query, key):
@@ -377,7 +377,7 @@
         if req.perm.has_permission('TICKET_VIEW') and \
                 not self.env.is_component_enabled(ReportModule):
             yield ('mainnav', 'tickets',
-                   html.A('View Tickets', href=req.href.query()))
+                   html.A(u'Voir les tickets', href=req.href.query()))
 
     # IRequestHandler methods
 
@@ -485,21 +485,21 @@
     def _get_constraint_modes(self):
         modes = {}
         modes['text'] = [
-            {'name': "contains", 'value': "~"},
-            {'name': "doesn't contain", 'value': "!~"},
-            {'name': "begins with", 'value': "^"},
-            {'name': "ends with", 'value': "$"},
-            {'name': "is", 'value': ""},
-            {'name': "is not", 'value': "!"}
+            {'name': u"contient", 'value': "~"},
+            {'name': u"ne contient pas", 'value': "!~"},
+            {'name': u"dÃ©bute par", 'value': "^"},
+            {'name': u"fini par", 'value': "$"},
+            {'name': u"est", 'value': ""},
+            {'name': u"n'est pas", 'value': "!"}
         ]
         modes['select'] = [
-            {'name': "is", 'value': ""},
-            {'name': "is not", 'value': "!"}
+            {'name': u"est", 'value': ""},
+            {'name': u"n'est pas", 'value': "!"}
         ]
         return modes
 
     def display_html(self, req, query):
-        req.hdf['title'] = 'Custom Query'
+        req.hdf['title'] = u'RequÃªte personnalisÃ©e'
         add_stylesheet(req, 'common/css/report.css')
         add_script(req, 'common/js/query.js')
 
@@ -652,10 +652,10 @@
         return (req.hdf.render('query_rss.cs'), 'application/rss+xml')
 
     # IWikiSyntaxProvider methods
-    
+
     def get_wiki_syntax(self):
         return []
-    
+
     def get_link_resolvers(self):
         yield ('query', self._format_link)
 
@@ -673,20 +673,22 @@
 
 
 class TicketQueryMacro(WikiMacroBase):
-    """Macro that lists tickets that match certain criteria.
+    u"""Macro listant les tickets rÃ©pondant Ã  certains critÃ¨res.
     
-    This macro accepts two parameters, the second of which is optional.
+    Cette macro accepte deux paramÃ¨tres, le second Ã©tant optionnel.
     
-    The first parameter is the query itself, and uses the same syntax as for
-    `query:` wiki links (but '''not''' the variant syntax starting with "?").
-
-    The second parameter determines how the list of tickets is presented:
-    the default presentation is to list the ticket ID next to the summary,
-    with each ticket on a separate line.
-    If the second parameter is given, it must be one of:
-     - '''compact''' -- the tickets are presented as a comma-separated
-       list of ticket IDs. 
-     - '''count''' -- only the count of matching tickets is displayed
+    Le premier paramÃ¨tre est la requÃªte elle-mÃªme, et utilise la mÃªme syntaxe que
+    celle des `query:` liens wiki (cependant la syntaxe alternative commenÃ§ant par
+    "?" '''n'est pas''' gÃ©rÃ©e).
+    
+    Le second paramÃ¨tre sÃ©lectionne comment la liste des tickets est presentÃ©e:
+    la prÃ©sentation par dÃ©faut est de lister
+    l'identifiant du ticket juste Ã  cotÃ© de son intitulÃ©, chaque ticket Ã©tant
+    affichÃ© sur une ligne distincte.
+    Si le second paramÃ¨tre est spÃ©cifiÃ©, il doit alors correspondre Ã  :
+     - '''compact''' -- les tickets sont prÃ©sentÃ©s comme une liste
+       d'identifiants des tickets, sÃ©parÃ©s par des virgules.
+     - '''count''' -- seul le nombre de tickets correspondants est affichÃ©.
     """
 
     def render_macro(self, req, name, content):
@@ -717,7 +719,7 @@
                 return html.SPAN(alist[0], *[(', ', a) for a in alist[1:]])
             elif count:
                 cnt = len(tickets)
-                return html.SPAN(cnt, title='%d tickets for which %s' % 
+                return html.SPAN(cnt, title=u'%d tickets pour chaque %s' %
                                  (cnt, query_string))
             else:
                 return html.DL([(html.DT(ticket_anchor(ticket)),
diff --exclude=.svn -Naur trac-0.10.4/trac/ticket/report.py trac-0.10.4-PKG/trac/ticket/report.py
--- trac-0.10.4/trac/ticket/report.py	2007-04-20 15:41:46.000000000 +0200
+++ trac-0.10.4-PKG/trac/ticket/report.py	2007-10-19 12:48:58.000000000 +0200
@@ -27,7 +27,7 @@
 from trac.util.datefmt import format_date, format_time, format_datetime, \
                                http_date
 from trac.util.html import html
-from trac.util.text import unicode_urlencode
+from trac.util.text import to_unicode, unicode_urlencode, translate
 from trac.web import IRequestHandler
 from trac.web.chrome import add_link, add_stylesheet, INavigationContributor
 from trac.wiki import wiki_to_html, IWikiSyntaxProvider, Formatter
@@ -46,14 +46,14 @@
         if not req.perm.has_permission('REPORT_VIEW'):
             return
         yield ('mainnav', 'tickets',
-               html.A('View Tickets', href=req.href.report()))
+               html.A(u'Voir les tickets', href=req.href.report()))
 
-    # IPermissionRequestor methods  
+    # IPermissionRequestor methods
 
-    def get_permission_actions(self):  
-        actions = ['REPORT_CREATE', 'REPORT_DELETE', 'REPORT_MODIFY',  
-                   'REPORT_SQL_VIEW', 'REPORT_VIEW']  
-        return actions + [('REPORT_ADMIN', actions)]  
+    def get_permission_actions(self):
+        actions = ['REPORT_CREATE', 'REPORT_DELETE', 'REPORT_MODIFY',
+                   'REPORT_SQL_VIEW', 'REPORT_VIEW']
+        return actions + [('REPORT_ADMIN', actions)]
 
     # IRequestHandler methods
 
@@ -93,7 +93,7 @@
                return resp
 
         if id != -1 or action == 'new':
-            add_link(req, 'up', req.href.report(), 'Available Reports')
+            add_link(req, 'up', req.href.report(), u'Rapports disponibles')
 
             # Kludge: Reset session vars created by query module so that the
             # query navigation links on the ticket page don't confuse the user
@@ -163,9 +163,9 @@
         cursor.execute("SELECT title FROM report WHERE id = %s", (id,))
         row = cursor.fetchone()
         if not row:
-            raise TracError('Report %s does not exist.' % id,
-                            'Invalid Report Number')
-        req.hdf['title'] = 'Delete Report {%s} %s' % (id, row[0])
+            raise TracError(u"Le rapport %s n'existe pas." % id,
+                            u'NumÃ©ro de rapport invalide')
+        req.hdf['title'] = u'Supprimer le rapport {%s} %s' % (id, row[0])
         req.hdf['report'] = {
             'id': id,
             'mode': 'delete',
@@ -184,21 +184,21 @@
                            "WHERE id=%s", (id,))
             row = cursor.fetchone()
             if not row:
-                raise TracError('Report %s does not exist.' % id,
-                                'Invalid Report Number')
+                raise TracError(u"Le rapport %s n'existe pas." % id,
+                                u'NumÃ©ro de rapport invalide')
             title = row[0] or ''
             description = row[1] or ''
             query = row[2] or ''
 
         if copy:
-            title += ' (copy)'
+            title += u' (copie)'
 
         if copy or id == -1:
-            req.hdf['title'] = 'Create New Report'
+            req.hdf['title'] = u'CrÃ©er un nouveau rapport'
             req.hdf['report.href'] = req.href.report()
             req.hdf['report.action'] = 'new'
         else:
-            req.hdf['title'] = 'Edit Report {%d} %s' % (id, title)
+            req.hdf['title'] = u'Ã‰diter le rapport {%d} %s' % (id, title)
             req.hdf['report.href'] = req.href.report(id)
             req.hdf['report.action'] = 'edit'
 
@@ -223,7 +223,7 @@
         try:
             args = self.get_var_args(req)
         except ValueError,e:
-            raise TracError, 'Report failed: %s' % e
+            raise TracError, u'Ã‰chec du rapport: %s' % to_unicode(e.message)
 
         title, description, sql = self.get_info(db, id, args)
 
@@ -245,7 +245,8 @@
         try:
             cols, rows = self.execute_report(req, db, id, sql, args)
         except Exception, e:
-            req.hdf['report.message'] = 'Report execution failed: %s' % e
+            req.hdf['report.message'] = \
+                u"Ã‰chec de l'exÃ©cution du rapport: %s" % to_unicode(e.message)
             return 'report.cs', None
 
         # Convert the header info to HDF-format
@@ -264,7 +265,7 @@
             elif title[-1] == '_':
                 title = title[:-1]
                 req.hdf[prefix + '.breakrow'] = 1
-            req.hdf[prefix] = title
+            req.hdf[prefix] = translate(self.env, title, True)
             idx = idx + 1
 
         if req.args.has_key('sort'):
@@ -381,20 +382,20 @@
         href = ''
         if params:
             href = '&' + unicode_urlencode(params)
-        add_link(req, 'alternate', '?format=rss' + href, 'RSS Feed',
+        add_link(req, 'alternate', '?format=rss' + href, u'Flux RSS',
                  'application/rss+xml', 'rss')
         add_link(req, 'alternate', '?format=csv' + href,
-                 'Comma-delimited Text', 'text/plain')
+                 u'Texte dÃ©limitÃ© par des virgules', 'text/plain')
         add_link(req, 'alternate', '?format=tab' + href,
-                 'Tab-delimited Text', 'text/plain')
+                 u'Texte dÃ©limitÃ© par des tabulations', 'text/plain')
         if req.perm.has_permission('REPORT_SQL_VIEW'):
-            add_link(req, 'alternate', '?format=sql', 'SQL Query',
+            add_link(req, 'alternate', '?format=sql', u'RequÃªte SQL',
                      'text/plain')
 
     def execute_report(self, req, db, id, sql, args):
         sql, args = self.sql_sub_vars(req, sql, args, db)
         if not sql:
-            raise TracError('Report %s has no SQL query.' % id)
+            raise TracError(u'Le rapport %s ne contient pas de requÃªte SQL.' % id)
         if sql.find('__group__') == -1:
             req.hdf['report.sorting.enabled'] = 1
 
@@ -415,17 +416,17 @@
         if id == -1:
             # If no particular report was requested, display
             # a list of available reports instead
-            title = 'Available Reports'
+            title = u'Rapports disponibles'
             sql = 'SELECT id AS report, title FROM report ORDER BY report'
-            description = 'This is a list of reports available.'
+            description = u'Liste des rapports disponibles'
         else:
             cursor = db.cursor()
             cursor.execute("SELECT title,query,description from report "
                            "WHERE id=%s", (id,))
             row = cursor.fetchone()
             if not row:
-                raise TracError('Report %d does not exist.' % id,
-                                'Invalid Report Number')
+                raise TracError(u"Le rapport %s n'existe pas." % id,
+                                u'NumÃ©ro de rapport invalide')
             title = row[0] or ''
             sql = row[1]
             description = row[2] or ''
@@ -453,8 +454,7 @@
             try:
                 arg = args[aname]
             except KeyError:
-                raise TracError("Dynamic variable '$%s' not defined." \
-                                % aname)
+                raise TracError(u"La variable dynamique '$%s' n'est pas dÃ©finie." % aname)
             req.hdf['report.var.' + aname] = arg
             values.append(arg)
 
@@ -515,9 +515,9 @@
         if description:
             req.write('-- %s\n\n' % '\n-- '.join(description.splitlines()))
         req.write(sql)
-        
+
     # IWikiSyntaxProvider methods
-    
+
     def get_link_resolvers(self):
         yield ('report', self._format_link)
 
diff --exclude=.svn -Naur trac-0.10.4/trac/ticket/roadmap.py trac-0.10.4-PKG/trac/ticket/roadmap.py
--- trac-0.10.4/trac/ticket/roadmap.py	2007-04-20 15:41:46.000000000 +0200
+++ trac-0.10.4-PKG/trac/ticket/roadmap.py	2007-08-24 11:45:26.000000000 +0200
@@ -24,7 +24,7 @@
 from trac.util.datefmt import format_date, format_datetime, parse_date, \
                                pretty_timedelta
 from trac.util.html import html, unescape, Markup
-from trac.util.text import shorten_line, CRLF, to_unicode
+from trac.util.text import shorten_line, CRLF, to_unicode, translate
 from trac.ticket import Milestone, Ticket, TicketSystem
 from trac.Timeline import ITimelineEventProvider
 from trac.web import IRequestHandler
@@ -129,7 +129,7 @@
         if not req.perm.has_permission('ROADMAP_VIEW'):
             return
         yield ('mainnav', 'roadmap',
-               html.a('Roadmap', href=req.href.roadmap(), accesskey=3))
+               html.a(translate(self.env,'Roadmap',True), href=req.href.roadmap(), accesskey=3))
 
     # IPermissionRequestor methods
 
@@ -143,7 +143,7 @@
 
     def process_request(self, req):
         req.perm.assert_permission('ROADMAP_VIEW')
-        req.hdf['title'] = 'Roadmap'
+        req.hdf['title'] = translate(self.env,'Roadmap',True)
 
         showall = req.args.get('show') == 'all'
         req.hdf['roadmap.showall'] = showall
@@ -151,7 +151,7 @@
         db = self.env.get_db_cnx()
         milestones = [milestone_to_hdf(self.env, db, req, m)
                       for m in Milestone.select(self.env, showall, db)]
-        req.hdf['roadmap.milestones'] = milestones        
+        req.hdf['roadmap.milestones'] = milestones
 
         for idx, milestone in enumerate(milestones):
             milestone_name = unescape(milestone['name']) # Kludge
@@ -206,7 +206,7 @@
                 else: return 'CANCELLED'
             else: return ''
 
-        def escape_value(text): 
+        def escape_value(text):
             s = ''.join(map(lambda c: (c in ';,\\') and '\\' + c or c, text))
             return '\\n'.join(re.split(r'[\r\n]+', s))
 
@@ -236,7 +236,7 @@
                    % __version__)
         write_prop('METHOD', 'PUBLISH')
         write_prop('X-WR-CALNAME',
-                   self.config.get('project', 'name') + ' - Roadmap')
+                   self.config.get('project', 'name') + ' - ' + translate(self.env,'Roadmap',True))
         for milestone in milestones:
             uid = '<%s/milestone/%s@%s>' % (req.base_path, milestone['name'],
                                             host)
@@ -306,7 +306,7 @@
 
     def get_timeline_filters(self, req):
         if req.perm.has_permission('MILESTONE_VIEW'):
-            yield ('milestone', 'Milestones')
+            yield ('milestone', translate(self.env,'Milestones',True))
 
     def get_timeline_events(self, req, start, stop, filters):
         if 'milestone' in filters:
@@ -317,7 +317,7 @@
                            "WHERE completed>=%s AND completed<=%s",
                            (start, stop,))
             for completed, name, description in cursor:
-                title = Markup('Milestone <em>%s</em> completed', name)
+                title = Markup(translate(self.env,'Milestone',True) + u' <em>%s</em> complÃ©tÃ©', name)
                 if format == 'rss':
                     href = req.abs_href.milestone(name)
                     message = wiki_to_html(description, self.env, req, db,
@@ -340,10 +340,10 @@
 
     def process_request(self, req):
         milestone_id = req.args.get('id')
-            
+
         req.perm.assert_permission('MILESTONE_VIEW')
 
-        add_link(req, 'up', req.href.roadmap(), 'Roadmap')
+        add_link(req, 'up', req.href.roadmap(), translate(self.env,'Roadmap',True))
 
         db = self.env.get_db_cnx()
         milestone = Milestone(self.env, milestone_id, db)
@@ -391,23 +391,23 @@
             req.perm.assert_permission('MILESTONE_CREATE')
 
         if not req.args.has_key('name'):
-            raise TracError('You must provide a name for the milestone.',
-                            'Required Field Missing')
+            raise TracError(u'Vous devez indiquer un nom pour le %s.' % translate(self.env,'milestone',True),
+                            u'Champ requis manquant')
 
         due = req.args.get('duedate', '')
         try:
             milestone.due = due and parse_date(due) or 0
         except ValueError, e:
-            raise TracError(to_unicode(e), 'Invalid Date Format')
+            raise TracError(to_unicode(e), 'Format de date non valable')
         if req.args.has_key('completed'):
             completed = req.args.get('completeddate', '')
             try:
                 milestone.completed = completed and parse_date(completed) or 0
             except ValueError, e:
-                raise TracError(to_unicode(e), 'Invalid Date Format')
+                raise TracError(to_unicode(e), 'Format de date non valable')
             if milestone.completed > time():
-                raise TracError('Completion date may not be in the future',
-                                'Invalid Completion Date')
+                raise TracError(u'La date de livraison ne peut pas Ãªtre dans le futur',
+                                u'Date de livraison non valable')
             retarget_to = req.args.get('target')
             if req.args.has_key('retarget'):
                 cursor = db.cursor()
@@ -415,7 +415,7 @@
                                "milestone=%s and status != 'closed'",
                                 (retarget_to, milestone.name))
                 self.env.log.info('Tickets associated with milestone %s '
-                                  'retargeted to %s' % 
+                                  'retargeted to %s' %
                                   (milestone.name, retarget_to))
         else:
             milestone.completed = 0
@@ -435,7 +435,7 @@
     def _render_confirm(self, req, db, milestone):
         req.perm.assert_permission('MILESTONE_DELETE')
 
-        req.hdf['title'] = 'Milestone %s' % milestone.name
+        req.hdf['title'] = u'%s %s' % ( translate(self.env,'Milestone',True), milestone.name )
         req.hdf['milestone'] = milestone_to_hdf(self.env, db, req, milestone)
         req.hdf['milestone.mode'] = 'delete'
 
@@ -447,14 +447,14 @@
     def _render_editor(self, req, db, milestone):
         if milestone.exists:
             req.perm.assert_permission('MILESTONE_MODIFY')
-            req.hdf['title'] = 'Milestone %s' % milestone.name
+            req.hdf['title'] = u'%s %s' % ( translate(self.env,'Milestone',True), milestone.name )
             req.hdf['milestone.mode'] = 'edit'
             req.hdf['milestones'] = [m.name for m in
                                      Milestone.select(self.env)
                                      if m.name != milestone.name]
         else:
             req.perm.assert_permission('MILESTONE_CREATE')
-            req.hdf['title'] = 'New Milestone'
+            req.hdf['title'] = translate(self.env,'new_Milestone',True)
             req.hdf['milestone.mode'] = 'new'
 
         from trac.util.datefmt import get_date_format_hint, \
@@ -465,7 +465,7 @@
         req.hdf['milestone.datetime_now'] = format_datetime()
 
     def _render_view(self, req, db, milestone):
-        req.hdf['title'] = 'Milestone %s' % milestone.name
+        req.hdf['title'] = u'%s %s' % ( translate(self.env,'Milestone',True), milestone.name )
         req.hdf['milestone.mode'] = 'view'
 
         req.hdf['milestone'] = milestone_to_hdf(self.env, db, req, milestone)
diff --exclude=.svn -Naur trac-0.10.4/trac/ticket/web_ui.py trac-0.10.4-PKG/trac/ticket/web_ui.py
--- trac-0.10.4/trac/ticket/web_ui.py	2007-04-20 15:41:46.000000000 +0200
+++ trac-0.10.4-PKG/trac/ticket/web_ui.py	2007-08-24 11:50:49.000000000 +0200
@@ -29,7 +29,7 @@
 from trac.util import get_reporter_id
 from trac.util.datefmt import format_datetime, pretty_timedelta, http_date
 from trac.util.html import html, Markup
-from trac.util.text import CRLF
+from trac.util.text import CRLF, translate
 from trac.web import IRequestHandler
 from trac.web.chrome import add_link, add_stylesheet, INavigationContributor
 from trac.wiki import wiki_to_html, wiki_to_oneliner
@@ -57,10 +57,10 @@
                 value = ticket[name]
                 if value:
                     if value not in field['options']:
-                        raise InvalidTicket('"%s" is not a valid value for '
-                                            'the %s field.' % (value, name))
+                        raise InvalidTicket(u'"%s" n\'est pas une valeur valide pour '
+                                            u'le champ %s.' % (value, name))
                 elif not field.get('optional', False):
-                    raise InvalidTicket('field %s must be set' % name)
+                    raise InvalidTicket(u'Le champ %s doit Ãªtre dÃ©fini' % name)
 
         try:
             # comment index must be a number
@@ -70,16 +70,16 @@
             if replyto != 'description':
                 int(replyto or 0)
         except ValueError:
-            raise InvalidTicket('Invalid comment threading identifier')
+            raise InvalidTicket(u'Identifiant de fil de commentaire invalide')
 
         # Custom validation rules
         for manipulator in self.ticket_manipulators:
             for field, message in manipulator.validate_ticket(req, ticket):
                 if field:
-                    raise InvalidTicket("The ticket %s field is invalid: %s" %
+                    raise InvalidTicket(u"Le champ %s du ticket est invalide: %s" %
                                         (field, message))
                 else:
-                    raise InvalidTicket("Invalid ticket: %s" % message)
+                    raise InvalidTicket(u"Ticket invalide: %s" % message)
 
 
 class NewticketModule(TicketModuleBase):
@@ -117,8 +117,8 @@
     def get_navigation_items(self, req):
         if not req.perm.has_permission('TICKET_CREATE'):
             return
-        yield ('mainnav', 'newticket', 
-               html.A('New Ticket', href=req.href.newticket(), accesskey=7))
+        yield ('mainnav', 'newticket',
+               html.A(u'Nouveau ticket', href=req.href.newticket(), accesskey=7))
 
     # IRequestHandler methods
 
@@ -145,7 +145,7 @@
             description = wiki_to_html(ticket['description'], self.env, req, db)
             req.hdf['newticket.description_preview'] = description
 
-        req.hdf['title'] = 'New Ticket'
+        req.hdf['title'] = u'Nouveau ticket'
         req.hdf['newticket'] = ticket.values
 
         field_names = [field['name'] for field in ticket.fields
@@ -167,7 +167,7 @@
                         'resolution'):
                 field['skip'] = True
             elif name == 'owner':
-                field['label'] = 'Assign to'
+                field['label'] = u'Assigner Ã '
                 if not req.perm.has_permission('TICKET_MODIFY'):
                     field['skip'] = True
             elif name == 'milestone':
@@ -178,6 +178,7 @@
                     if milestone.is_completed:
                         options.remove(option)
                 field['options'] = options
+            field['label'] = translate(self.env, field['label'])
             req.hdf['newticket.fields.' + name] = field
 
         if req.perm.has_permission('TICKET_APPEND'):
@@ -191,7 +192,7 @@
 
     def _do_create(self, req, db):
         if not req.args.get('summary'):
-            raise TracError('Tickets must contain a summary.')
+            raise TracError(u'Les tickets doivent contenir un intitulÃ©.')
 
         ticket = Ticket(self.env, db=db)
         ticket.populate(req.args)
@@ -206,8 +207,8 @@
             tn = TicketNotifyEmail(self.env)
             tn.notify(ticket, newticket=True)
         except Exception, e:
-            self.log.exception("Failure sending notification on creation of "
-                               "ticket #%s: %s" % (ticket.id, e))
+            self.log.exception(u"Impossible d'envoyer une notification sur la crÃ©ation du "
+                               u"ticket #%s: %s" % (ticket.id, e))
 
         # Redirect the user to the newly created ticket
         if req.args.get('attachment'):
@@ -243,11 +244,11 @@
     # IContentConverter methods
 
     def get_supported_conversions(self):
-        yield ('csv', 'Comma-delimited Text', 'csv',
+        yield ('csv', u'Texte dÃ©limitÃ© par des virgules', 'csv',
                'trac.ticket.Ticket', 'text/csv', 8)
-        yield ('tab', 'Tab-delimited Text', 'tsv',
+        yield ('tab', u'Texte dÃ©limitÃ© par des tabulations', 'tsv',
                'trac.ticket.Ticket', 'text/tab-separated-values', 8)
-        yield ('rss', 'RSS Feed', 'xml',
+        yield ('rss', u'Flux RSS', 'xml',
                'trac.ticket.Ticket', 'application/rss+xml', 8)
 
     def convert_content(self, req, mimetype, ticket, key):
@@ -326,14 +327,14 @@
                 idx = tickets.index(str(ticket.id))
                 if idx > 0:
                     add_link(req, 'first', req.href.ticket(tickets[0]),
-                             'Ticket #%s' % tickets[0])
+                             u'Ticket #%s' % tickets[0])
                     add_link(req, 'prev', req.href.ticket(tickets[idx - 1]),
-                             'Ticket #%s' % tickets[idx - 1])
+                             u'Ticket #%s' % tickets[idx - 1])
                 if idx < len(tickets) - 1:
                     add_link(req, 'next', req.href.ticket(tickets[idx + 1]),
-                             'Ticket #%s' % tickets[idx + 1])
+                             u'Ticket #%s' % tickets[idx + 1])
                     add_link(req, 'last', req.href.ticket(tickets[-1]),
-                             'Ticket #%s' % tickets[-1])
+                             u'Ticket #%s' % tickets[-1])
                 add_link(req, 'up', req.session['query_href'])
 
         add_stylesheet(req, 'common/css/ticket.css')
@@ -350,17 +351,17 @@
 
     def get_timeline_filters(self, req):
         if req.perm.has_permission('TICKET_VIEW'):
-            yield ('ticket', 'Ticket changes')
+            yield ('ticket', u'Modification du ticket')
             if self.timeline_details:
-                yield ('ticket_details', 'Ticket details', False)
+                yield ('ticket_details', u'DÃ©tails du ticket', False)
 
     def get_timeline_events(self, req, start, stop, filters):
         format = req.args.get('format')
 
-        status_map = {'new': ('newticket', 'created'),
-                      'reopened': ('newticket', 'reopened'),
-                      'closed': ('closedticket', 'closed'),
-                      'edit': ('editedticket', 'updated')}
+        status_map = {'new': ('newticket', u'crÃ©Ã©'),
+                      'reopened': ('newticket', u'rÃ©ouvert'),
+                      'closed': ('closedticket', u'fermÃ©'),
+                      'edit': ('editedticket', u'mis Ã  jour')}
 
         href = format == 'rss' and req.abs_href or req.href
 
@@ -368,10 +369,10 @@
                     comment, cid):
             if status == 'edit':
                 if 'ticket_details' in filters:
-                    info = ''
+                    info = u''
                     if len(fields) > 0:
-                        info = ', '.join(['<i>%s</i>' % f for f in \
-                                          fields.keys()]) + ' changed<br />'
+                        info = u', '.join([u'<i>%s</i>' % f for f in \
+                                          fields.keys()]) + u' modifiÃ©<br />'
                 else:
                     return None
             elif 'ticket' in filters:
@@ -385,16 +386,16 @@
                 return None
             kind, verb = status_map[status]
             if format == 'rss':
-                title = 'Ticket #%s (%s %s): %s' % \
-                        (id, type.lower(), verb, summary)
+                title = u'Ticket #%s (%s %s): %s' % \
+                        (id, translate(self.env, type).lower(), verb, summary)
             else:
-                title = Markup('Ticket <em title="%s">#%s</em> (%s) %s by %s',
-                               summary, id, type, verb, author)
+                title = Markup(u'Ticket <em title="%s">#%s</em> (%s) %s par %s',
+                               summary, id, translate(self.env, type), verb, author)
             ticket_href = href.ticket(id)
             if cid:
                 ticket_href += '#comment:' + cid
             if status == 'new':
-                message = summary
+                message = unicode(summary)
             else:
                 message = Markup(info)
                 if comment:
@@ -439,7 +440,7 @@
                 ev = produce(previous_update, status, fields, comment, cid)
                 if ev:
                     yield ev
-            
+
             # New tickets
             if 'ticket' in filters:
                 cursor.execute("SELECT id,time,reporter,type,summary"
@@ -470,7 +471,7 @@
                                  .replace('\n', '\\n').replace('\r', '\\r')
                                  for f in ticket.fields]) + CRLF)
         return (content.getvalue(), '%s;charset=utf-8' % mimetype)
-        
+
     def export_rss(self, req, ticket):
         db = self.env.get_db_cnx()
         changes = []
@@ -509,7 +510,7 @@
         if req.perm.has_permission('TICKET_CHGPROP'):
             # TICKET_CHGPROP gives permission to edit the ticket
             if not req.args.get('summary'):
-                raise TracError('Tickets must contain summary.')
+                raise TracError(u'Les tickets doivent contenir un intitulÃ©.')
 
             if req.args.has_key('description') or req.args.has_key('reporter'):
                 req.perm.assert_permission('TICKET_ADMIN')
@@ -520,15 +521,15 @@
 
         # Mid air collision?
         if int(req.args.get('ts')) != ticket.time_changed:
-            raise TracError("Sorry, can not save your changes. "
-                            "This ticket has been modified by someone else "
-                            "since you started", 'Mid Air Collision')
+            raise TracError(u"DÃ©solÃ©, impossible d'enregistrer vos modifications. "
+                            u"Ce ticket a Ã©tÃ© modifiÃ© par quelqu'un d'autre "
+                            u"depuis que vous avez commencÃ©", u'Collision en plein vol')
 
         # Do any action on the ticket?
         action = req.args.get('action')
         actions = TicketSystem(self.env).get_available_actions(ticket, req.perm)
         if action not in actions:
-            raise TracError('Invalid action')
+            raise TracError(u'Action invalide')
 
         # TODO: this should not be hard-coded like this
         if action == 'accept':
@@ -547,7 +548,7 @@
         self._validate_ticket(req, ticket)
 
         now = int(time.time())
-        cnum = req.args.get('cnum')        
+        cnum = req.args.get('cnum')
         replyto = req.args.get('replyto')
         internal_cnum = cnum
         if cnum and replyto: # record parent.child relationship
@@ -579,7 +580,7 @@
             }
 
         # -- Ticket fields
-        
+
         for field in TicketSystem(self.env).get_ticket_fields():
             if field['type'] in ('radio', 'select'):
                 value = ticket.values.get(field['name'])
@@ -617,8 +618,8 @@
         def quote_original(author, original, link):
             if not 'comment' in req.args: # i.e. the comment was not yet edited
                 req.hdf['ticket.comment'] = '\n'.join(
-                    ['Replying to [%s %s]:' % (link, author)] +
-                    ['> %s' % line for line in original.splitlines()] + [''])
+                    [u'En rÃ©ponse Ã  [%s %s]:' % (link, author)] +
+                    [u'> %s' % line for line in original.splitlines()] + [''])
 
         if replyto == 'description':
             quote_original(ticket['reporter'], ticket['description'],
@@ -647,7 +648,7 @@
                 change['fields']['description'] = ''
                 description_lastmod = change['date']
                 description_author = change['author']
-                
+
         req.hdf['ticket'] = {
             'changes': changes,
             'replies': replies,
diff --exclude=.svn -Naur trac-0.10.4/trac/Timeline.py trac-0.10.4-PKG/trac/Timeline.py
--- trac-0.10.4/trac/Timeline.py	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/trac/Timeline.py	2007-08-24 11:51:46.000000000 +0200
@@ -37,7 +37,7 @@
 
     def get_timeline_filters(self, req):
         """Return a list of filters that this event provider supports.
-        
+
         Each filter must be a (name, label) tuple, where `name` is the internal
         name, and `label` is a human-readable name for display.
 
@@ -49,7 +49,7 @@
     def get_timeline_events(self, req, start, stop, filters):
         """Return a list of events in the time range given by the `start` and
         `stop` parameters.
-        
+
         The `filters` parameters is a list of the enabled filters, each item
         being the name of the tuples returned by `get_timeline_filters`.
 
@@ -77,7 +77,7 @@
         if not req.perm.has_permission('TIMELINE_VIEW'):
             return
         yield ('mainnav', 'timeline',
-               html.A('Timeline', href=req.href.timeline(), accesskey=2))
+               html.A(u'Historique', href=req.href.timeline(), accesskey=2))
 
     # IPermissionRequestor methods
 
@@ -151,7 +151,7 @@
         if maxrows and len(events) > maxrows:
             del events[maxrows:]
 
-        req.hdf['title'] = 'Timeline'
+        req.hdf['title'] = u'Historique'
 
         # Get the email addresses of all known users
         email_map = {}
@@ -192,7 +192,7 @@
         add_stylesheet(req, 'common/css/timeline.css')
         rss_href = req.href.timeline([(f, 'on') for f in filters],
                                      daysback=90, max=50, format='rss')
-        add_link(req, 'alternate', rss_href, 'RSS Feed', 'application/rss+xml',
+        add_link(req, 'alternate', rss_href, u'Flux RSS', 'application/rss+xml',
                  'rss')
         for idx,fltr in enumerate(available_filters):
             req.hdf['timeline.filters.%d' % idx] = {'name': fltr[0],
@@ -216,8 +216,9 @@
                                                'daysback')]
         href = req.href.timeline(args+[(f, 'on') for f in other_filters])
         raise TracError(Markup(
-            '%s  event provider (<tt>%s</tt>) failed:<br /><br />'
-            '%s: %s'
-            '<p>You may want to see the other kind of events from the '
-            '<a href="%s">Timeline</a></p>', 
+            u'Le gestionnaire d\'Ã©vÃ¨nements %s (<tt>%s</tt>) a echouÃ©:'
+            u'<br /><br /> %s: %s'
+            u'<p>Vous voulez probablement consulter les '
+            u'autres types d\'Ã©vÃ¨nements de l\''
+            u'<a href="%s">Historique</a></p>', 
             ", ".join(guilty_kinds), ep_name, exc_name, to_unicode(exc), href))
diff --exclude=.svn -Naur trac-0.10.4/trac/util/datefmt.py trac-0.10.4-PKG/trac/util/datefmt.py
--- trac-0.10.4/trac/util/datefmt.py	2007-04-20 15:41:50.000000000 +0200
+++ trac-0.10.4-PKG/trac/util/datefmt.py	2007-08-24 11:52:41.000000000 +0200
@@ -30,17 +30,17 @@
     if not time2: time2 = time.time()
     if time1 > time2:
         time2, time1 = time1, time2
-    units = ((3600 * 24 * 365, 'year',   'years'),
-             (3600 * 24 * 30,  'month',  'months'),
-             (3600 * 24 * 7,   'week',   'weeks'),
-             (3600 * 24,       'day',    'days'),
-             (3600,            'hour',   'hours'),
-             (60,              'minute', 'minutes'))
+    units = ((3600 * 24 * 365, u'an',      u'ans'),
+             (3600 * 24 * 30,  u'mois',    u'mois'),
+             (3600 * 24 * 7,   u'semaine', u'semaines'),
+             (3600 * 24,       u'jour',    u'jours'),
+             (3600,            u'heure',   u'heures'),
+             (60,              u'minute',  u'minutes'))
     age_s = int(time2 - time1)
     if resolution and age_s < resolution:
         return ''
     if age_s < 60:
-        return '%i second%s' % (age_s, age_s != 1 and 's' or '')
+        return u'%i seconde%s' % (age_s, age_s != 1 and 's' or '')
     for u, unit, unit_plural in units:
         r = float(age_s) / float(u)
         if r >= 0.9:
@@ -111,5 +111,5 @@
         except ValueError:
             continue
     if seconds == None:
-        raise ValueError, '%s is not a known date format.' % text
+        raise ValueError, u'%s n\'est pas un format de date connu.' % text
     return seconds
diff --exclude=.svn -Naur trac-0.10.4/trac/util/__init__.py trac-0.10.4-PKG/trac/util/__init__.py
--- trac-0.10.4/trac/util/__init__.py	2007-04-20 15:41:50.000000000 +0200
+++ trac-0.10.4-PKG/trac/util/__init__.py	2007-08-24 11:54:57.000000000 +0200
@@ -30,7 +30,7 @@
 from trac.core import TracError
 from trac.util.html import escape, unescape, Markup, Deuglifier
 from trac.util.text import CRLF, to_utf8, to_unicode, shorten_line, \
-                           wrap, pretty_size
+                           wrap, pretty_size, translate
 from trac.util.datefmt import pretty_timedelta, format_datetime, \
                               format_date, format_time, \
                               get_date_format_hint, \
@@ -60,7 +60,7 @@
 except NameError:
     def reversed(x):
         if hasattr(x, 'keys'):
-            raise ValueError('mappings do not support reverse iteration')
+            raise ValueError(u'les dictionnaires ne supportent pas l\'itÃ©ration inversÃ©e')
         i = len(x)
         while i > 0:
             i -= 1
@@ -109,7 +109,7 @@
             idx += 1
             # A sanity check
             if idx > 100:
-                raise Exception('Failed to create unique name: ' + path)
+                raise Exception(u'Impossible de crÃ©er le nom de fichier unique : ' + path)
             path = '%s.%d%s' % (parts[0], idx, parts[1])
 
 
@@ -119,7 +119,7 @@
 
     The optional `input`, which must be a `str` object, is first written
     to a temporary file from which the process will read.
-    
+
     (`capturestderr` may not work under Windows 9x.)
 
     Example: print Popen3('grep spam','\n\nhere spam\n\n').out
@@ -166,10 +166,10 @@
 def safe__import__(module_name):
     """
     Safe imports: rollback after a failed import.
-    
+
     Initially inspired from the RollbackImporter in PyUnit,
     but it's now much simpler and works better for our needs.
-    
+
     See http://pyunit.sourceforge.net/notes/reloading.html
     """
     already_imported = sys.modules.copy()
diff --exclude=.svn -Naur trac-0.10.4/trac/util/text.py trac-0.10.4-PKG/trac/util/text.py
--- trac-0.10.4/trac/util/text.py	2007-04-20 15:41:50.000000000 +0200
+++ trac-0.10.4-PKG/trac/util/text.py	2007-08-24 11:53:39.000000000 +0200
@@ -69,7 +69,7 @@
 
 def unicode_unquote(value):
     """A unicode aware version of urllib.unquote.
-    
+
     Take `str` value previously obtained by `unicode_quote`.
     """
     return unquote(value).decode('utf-8')
@@ -143,12 +143,20 @@
 
     jump = 512
     if size < jump:
-        return '%d bytes' % size
+        return u'%d octets' % size
 
-    units = ['kB', 'MB', 'GB', 'TB']
+    units = [u'ko', u'Mo', u'Go', u'To']
     i = 0
     while size >= jump and i < len(units):
         i += 1
         size /= 1024.
 
     return '%.1f %s' % (size, units[i - 1])
+
+# -- Translation
+
+def translate(env, name, capitalize=False):
+    if capitalize:
+        return env.translations.get(name.lower().capitalize(), name.capitalize())
+    else:
+        return env.translations.get(name.lower(), name)
diff --exclude=.svn -Naur trac-0.10.4/trac/versioncontrol/api.py trac-0.10.4-PKG/trac/versioncontrol/api.py
--- trac-0.10.4/trac/versioncontrol/api.py	2007-04-20 15:41:47.000000000 +0200
+++ trac-0.10.4-PKG/trac/versioncontrol/api.py	2007-08-24 11:57:09.000000000 +0200
@@ -35,7 +35,7 @@
 
         Yields `(repotype, priority)` pairs, where `repotype` is used to
         match against the configured `[trac] repository_type` value in TracIni.
-        
+
         If multiple provider match a given type, the `priority` is used to
         choose between them (highest number is highest priority).
         """
@@ -68,7 +68,7 @@
     # IRequestFilter methods
 
     def pre_process_request(self, req, handler):
-        from trac.web.chrome import Chrome        
+        from trac.web.chrome import Chrome
         if handler is not Chrome(self.env):
             self.get_repository(req.authname).sync()
         return handler
@@ -88,9 +88,9 @@
                         continue
                     heappush(candidates, (-prio, connector))
             if not candidates:
-                raise TracError('Unsupported version control system "%s". '
-                                'Check that the Python bindings for "%s" are '
-                                'correctly installed.' %
+                raise TracError(u'SystÃ¨me de contrÃ´le de version "%s" non supportÃ©. '
+                                u'ContrÃ´lez que les librairies Python pour "%s" sont '
+                                u'correctement installÃ©es.' %
                                 ((self.repository_type,)*2))
             self._connector = heappop(candidates)[1]
         db = self.env.get_db_cnx() # prevent possible deadlock, see #4465
@@ -119,11 +119,12 @@
 
 class NoSuchChangeset(TracError):
     def __init__(self, rev):
-        TracError.__init__(self, "No changeset %s in the repository" % rev)
+        TracError.__init__(self, u"Aucune version %s n'est rÃ©pertoriÃ©e dans le dÃ©pÃ´t" \
+                                 % rev)
 
 class NoSuchNode(TracError):
     def __init__(self, path, rev, msg=None):
-        TracError.__init__(self, "%sNo node %s at revision %s" \
+        TracError.__init__(self, u"%sLe chemin %s n'existe pas en rÃ©vision %s" \
                            % (msg and '%s: ' % msg or '', path, rev))
 
 class Repository(object):
@@ -148,10 +149,10 @@
 
     def sync(self, rev_callback=None):
         """Perform a sync of the repository cache, if relevant.
-        
+
         If given, `rev_callback` must be a callable taking a `rev` parameter.
         The backend will call this function for each `rev` it decided to
-        synchronize, once the synchronization changes are committed to the 
+        synchronize, once the synchronization changes are committed to the
         cache.
         """
         pass
@@ -186,8 +187,8 @@
             self.get_node(path, rev)
             return True
         except TracError:
-            return False        
-    
+            return False
+
     def get_node(self, path, rev=None):
         """Retrieve a Node from the repository at the given path.
 
@@ -219,7 +220,7 @@
 
     def rev_older_than(self, rev1, rev2):
         """Provides a total order over revisions.
-        
+
         Return `True` if `rev1` is older than `rev2`, i.e. if `rev1`
         comes before `rev2` in the revision sequence.
         """
@@ -227,7 +228,7 @@
 
     def get_youngest_rev_in_cache(self, db):
         """Return the youngest revision currently cached.
-        
+
         The way revisions are sequenced is version control specific.
         By default, one assumes that the revisions are sequenced in time
         (... which is ''not'' correct for most VCS, including Subversion).
@@ -255,11 +256,11 @@
     def normalize_rev(self, rev):
         """Return a canonical representation of a revision.
 
-        It's up to the backend to decide which string values of `rev` 
-        (usually provided by the user) should be accepted, and how they 
+        It's up to the backend to decide which string values of `rev`
+        (usually provided by the user) should be accepted, and how they
         should be normalized. Some backends may for instance want to match
         against known tags or branch names.
-        
+
         In addition, if `rev` is `None` or '', the youngest revision should
         be returned.
         """
@@ -268,11 +269,11 @@
     def short_rev(self, rev):
         """Return a compact representation of a revision in the repos."""
         return self.normalize_rev(rev)
-        
+
     def get_changes(self, old_path, old_rev, new_path, new_rev,
                     ignore_ancestry=1):
         """Generates changes corresponding to generalized diffs.
-        
+
         Generator that yields change tuples (old_node, new_node, kind, change)
         for each node change between the two arbitrary (path,rev) pairs.
 
@@ -293,12 +294,12 @@
     #
     # Those properties must be set by subclasses.
     #
-    created_rev = None   
+    created_rev = None
     created_path = None
 
     def __init__(self, path, rev, kind):
         assert kind in (Node.DIRECTORY, Node.FILE), \
-               "Unknown node kind %s" % kind
+               u"Type du noeud inconnu %s" % kind
         self.path = unicode(path)
         self.rev = rev
         self.kind = kind
@@ -321,7 +322,7 @@
 
     def get_history(self, limit=None):
         """Provide backward history for this Node.
-        
+
         Generator that yields `(path, rev, chg)` tuples, one for each revision
         in which the node was changed. This generator will follow copies and
         moves of a node (if the underlying version control system supports
@@ -409,7 +410,7 @@
 
         Warning: API will be improved (see #1601 and #2545).
         """
-        
+
     def get_changes(self):
         """Generator that produces a tuple for every change in the changeset
 
@@ -433,7 +434,7 @@
 
 class Authorizer(object):
     """Controls the view access to parts of the repository.
-    
+
     Base class for authorizers that are responsible to granting or denying
     access to view certain parts of a repository.
     """
@@ -441,12 +442,12 @@
     def assert_permission(self, path):
         if not self.has_permission(path):
             raise PermissionDenied, \
-                  'Insufficient permissions to access %s' % path
+                  u"Droits d'accÃ¨s insuffisants pour accÃ¨der Ã  %s" % path
 
     def assert_permission_for_changeset(self, rev):
         if not self.has_permission_for_changeset(rev):
             raise PermissionDenied, \
-                  'Insufficient permissions to access changeset %s' % rev
+                  'Permissions insuffisantes pour accÃ©der Ã  l\'enregistrement %s' % rev
 
     def has_permission(self, path):
         return True
diff --exclude=.svn -Naur trac-0.10.4/trac/versioncontrol/cache.py trac-0.10.4-PKG/trac/versioncontrol/cache.py
--- trac-0.10.4/trac/versioncontrol/cache.py	2007-04-20 15:41:47.000000000 +0200
+++ trac-0.10.4-PKG/trac/versioncontrol/cache.py	2007-08-24 11:58:52.000000000 +0200
@@ -63,7 +63,7 @@
                        "WHERE rev=%s", (cset.date, cset.author, cset.message,
                                         (str(cset.rev))))
         self.db.commit()
-        
+
     def sync(self, feedback=None):
         cursor = self.db.cursor()
 
@@ -72,16 +72,16 @@
         metadata = {}
         for name, value in cursor:
             metadata[name] = value
-        
+
         # -- check that we're populating the cache for the correct repository
         repository_dir = metadata.get(CACHE_REPOSITORY_DIR)
         if repository_dir:
             if repository_dir != self.name:
                 self.log.info("'repository_dir' has changed from %r to %r"
                               % (repository_dir, self.name))
-                raise TracError("The 'repository_dir' has changed, "
-                                "a 'trac-admin resync' operation is needed.")
-        elif repository_dir is None: # 
+                raise TracError(u"Le chemin du dÃ©pÃ´t a changÃ©, une operation "
+                                u"'trac-admin resync' est nÃ©cessaire.")
+        elif repository_dir is None: #
             self.log.info('Storing initial "repository_dir": %s' % self.name)
             cursor.execute("INSERT INTO system (name,value) VALUES (%s,%s)",
                            (CACHE_REPOSITORY_DIR, self.name,))
@@ -94,8 +94,8 @@
 
         # -- retrieve the youngest revision cached so far
         if CACHE_YOUNGEST_REV not in metadata:
-            raise TracError('Missing "youngest_rev" in cache metadata')
-        
+            raise TracError(u'"youngest_rev" est manquant dans le cache des mÃ©tadonnÃ©es')
+
         self.youngest = metadata[CACHE_YOUNGEST_REV]
 
         if self.youngest:
@@ -149,7 +149,7 @@
 
             try:
                 while next_youngest is not None:
-                    
+
                     # 1.1 Attempt to resync the 'revision' table
                     self.log.info("Trying to sync revision [%s]" %
                                   next_youngest)
@@ -160,7 +160,7 @@
                                        "VALUES (%s,%s,%s,%s)",
                                        (str(next_youngest), cset.date,
                                         cset.author, cset.message))
-                    except Exception, e: # *another* 1.1. resync attempt won 
+                    except Exception, e: # *another* 1.1. resync attempt won
                         self.log.warning('Revision %s already cached: %s' %
                                          (next_youngest, e))
                         # also potentially in progress, so keep ''previous''
@@ -186,7 +186,7 @@
                                         path, kind, action, bpath, brev))
 
                     # 1.3. iterate (1.1 should always succeed now)
-                    self.youngest = next_youngest                    
+                    self.youngest = next_youngest
                     next_youngest = self.repos.next_rev(next_youngest)
 
                     # 1.4. update 'youngest_rev' metadata (minimize failures at 0.)
diff --exclude=.svn -Naur trac-0.10.4/trac/versioncontrol/svn_fs.py trac-0.10.4-PKG/trac/versioncontrol/svn_fs.py
--- trac-0.10.4/trac/versioncontrol/svn_fs.py	2007-04-20 15:41:47.000000000 +0200
+++ trac-0.10.4-PKG/trac/versioncontrol/svn_fs.py	2007-08-24 12:00:38.000000000 +0200
@@ -65,7 +65,7 @@
         def apr_pool_clear(): pass
         Editor = object
     delta = core = dummy_svn()
-    
+
 
 _kindmap = {core.svn_node_dir: Node.DIRECTORY,
             core.svn_node_file: Node.FILE}
@@ -78,11 +78,11 @@
     Returns an UTF-8 encoded string suitable for the Subversion python bindings.
     """
     return '/'.join([path.strip('/') for path in args]).encode('utf-8')
-    
+
 def _from_svn(path):
     """Expect an UTF-8 encoded string and transform it to an `unicode` object"""
     return path and path.decode('utf-8')
-    
+
 def _normalize_path(path):
     """Remove leading "/", except for the root."""
     return path and path.strip('/') or '/'
@@ -121,7 +121,7 @@
     apr_pool_destroy = staticmethod(core.apr_pool_destroy)
     apr_terminate = staticmethod(core.apr_terminate)
     apr_pool_clear = staticmethod(core.apr_pool_clear)
-    
+
     def __init__(self, parent_pool=None):
         """Create a new memory pool"""
 
@@ -237,7 +237,7 @@
             authz = SubversionAuthorizer(self.env, crepos, authname)
             repos.authz = crepos.authz = authz
         return crepos
-            
+
 
 
 class SubversionRepository(Repository):
@@ -249,24 +249,24 @@
         self.path = path # might be needed by __del__()/close()
         self.log = log
         if core.SVN_VER_MAJOR < 1:
-            raise TracError("Subversion >= 1.0 required: Found %d.%d.%d" % \
+            raise TracError(u"Subversion >= 1.0 requis: version %d.%d.%d trouvÃ©e" % \
                             (core.SVN_VER_MAJOR,
                              core.SVN_VER_MINOR,
                              core.SVN_VER_MICRO))
         self.pool = Pool()
-        
+
         # Remove any trailing slash or else subversion might abort
         if isinstance(path, unicode):
             path = path.encode('utf-8')
         path = os.path.normpath(path).replace('\\', '/')
         self.path = repos.svn_repos_find_root_path(path, self.pool())
         if self.path is None:
-            raise TracError("%s does not appear to be a Subversion repository." \
+            raise TracError(u"%s ne semble pas Ãªtre un dÃ©pot Subversion." \
                             % path)
 
         self.repos = repos.svn_repos_open(self.path, self.pool())
         self.fs_ptr = repos.svn_repos_fs(self.repos)
-        
+
         uuid = fs.get_uuid(self.fs_ptr, self.pool())
         name = 'svn:%s:%s' % (uuid, _from_svn(path))
 
@@ -365,7 +365,7 @@
                     core.SubversionException): # in 1.3.x
                 pass
         return None
-    
+
 
     def get_oldest_rev(self):
         if self.oldest is None:
@@ -394,7 +394,7 @@
         youngest = self.youngest_rev
         subpool = Pool(self.pool)
         while next <= youngest:
-            subpool.clear()            
+            subpool.clear()
             try:
                 for _, next in self._history(_to_svn(self.scope, path),
                                              rev+1, next, subpool):
@@ -469,16 +469,17 @@
         if self.has_node(old_path, old_rev):
             old_node = self.get_node(old_path, old_rev)
         else:
-            raise NoSuchNode(old_path, old_rev, 'The Base for Diff is invalid')
+            raise NoSuchNode(old_path, old_rev, 'La Base pour le Diff est invalide')
         if self.has_node(new_path, new_rev):
             new_node = self.get_node(new_path, new_rev)
         else:
-            raise NoSuchNode(new_path, new_rev, 'The Target for Diff is invalid')
+            raise NoSuchNode(new_path, new_rev, 'La Cible pour le Diff est invalide')
         if new_node.kind != old_node.kind:
-            raise TracError('Diff mismatch: Base is a %s (%s in revision %s) '
-                            'and Target is a %s (%s in revision %s).' \
-                            % (old_node.kind, old_path, old_rev,
-                               new_node.kind, new_path, new_rev))
+            raise TracError(u'Erreur de calcul des diffÃ©rences: La base est un'
+                            u'%s (%s en rÃ©vision %s) '
+                            u'et la cible est un %s (%s en rÃ©vision %s).' \
+                              % (old_node.kind, old_path, old_rev,
+                                 new_node.kind, new_path, new_rev))
         subpool = Pool(self.pool)
         if new_node.isdir:
             editor = DiffChangeEditor()
@@ -670,7 +671,7 @@
         changes = []
         revroots = {}
         for path, change in editor.changes.items():
-            
+
             # Filtering on `path`
             if not (_is_path_within_scope(self.scope, path) and \
                     self.authz.has_permission(path)):
@@ -712,7 +713,7 @@
                     revroots[base_rev] = b_root
                 tmp.clear()
                 cbase_path = fs.node_created_path(b_root, base_path, tmp())
-                cbase_rev = fs.node_created_rev(b_root, base_path, tmp()) 
+                cbase_rev = fs.node_created_rev(b_root, base_path, tmp())
                 # give up if the created path is outside the scope
                 if _is_path_within_scope(self.scope, cbase_path):
                     base_path, base_rev = cbase_path, cbase_rev
@@ -751,11 +752,11 @@
 # Note 2: the 'dir_baton' is the path of the parent directory
 #
 
-class DiffChangeEditor(delta.Editor): 
+class DiffChangeEditor(delta.Editor):
 
     def __init__(self):
         self.deltas = []
-    
+
     # -- svn.delta.Editor callbacks
 
     def open_root(self, base_revision, dir_pool):
diff --exclude=.svn -Naur trac-0.10.4/trac/versioncontrol/web_ui/browser.py trac-0.10.4-PKG/trac/versioncontrol/web_ui/browser.py
--- trac-0.10.4/trac/versioncontrol/web_ui/browser.py	2007-04-20 15:41:47.000000000 +0200
+++ trac-0.10.4-PKG/trac/versioncontrol/web_ui/browser.py	2007-08-24 12:04:21.000000000 +0200
@@ -51,7 +51,7 @@
     downloadable_paths = ListOption('browser', 'downloadable_paths',
                                     '/trunk, /branches/*, /tags/*', doc=
         """List of repository paths that can be downloaded.
-        
+
         Leave the option empty if you want to disable all downloads, otherwise
         set it to a comma-separated list of authorized paths (those paths are
         glob patterns, i.e. "*" can be used as a wild card)
@@ -61,14 +61,14 @@
                                         'false',
         """Whether attachments should be rendered in the browser, or
         only made downloadable.
- 
+
         Pretty much any file may be interpreted as HTML by the browser,
         which allows a malicious user to attach a file containing cross-site
         scripting attacks.
-        
+
         For public sites where anonymous users can create attachments it is
         recommended to leave this option disabled (which is the default).""")
- 
+
     # INavigationContributor methods
 
     def get_active_navigation_item(self, req):
@@ -78,7 +78,7 @@
         if not req.perm.has_permission('BROWSER_VIEW'):
             return
         yield ('mainnav', 'browser',
-               html.A('Browse Source', href=req.href.browser()))
+               html.A(u'Explorateur', href=req.href.browser()))
 
     # IPermissionRequestor methods
 
@@ -135,7 +135,7 @@
 
         path_links = get_path_links(req.href, path, rev)
         if len(path_links) > 1:
-            add_link(req, 'up', path_links[-2]['href'], 'Parent directory')
+            add_link(req, 'up', path_links[-2]['href'], u'RÃ©pertoire parent')
         req.hdf['browser.path'] = path_links
 
         if node.isdir:
@@ -200,7 +200,7 @@
                filter(None, [fnmatchcase(node.path, p) for p in patterns]):
             zip_href = req.href.changeset(rev or repos.youngest_rev, node.path,
                                           old=rev, old_path='/', format='zip')
-            add_link(req, 'alternate', zip_href, 'Zip Archive',
+            add_link(req, 'alternate', zip_href, u'Archive Zip',
                      'application/zip', 'zip')
 
         req.hdf['browser'] = {'order': order, 'desc': desc and 1 or 0,
@@ -230,7 +230,7 @@
             req.send_header('Last-Modified', http_date(node.last_modified))
             if not self.render_unsafe_content:
                 # Force browser to download files instead of rendering
-                # them, since they might contain malicious code enabling 
+                # them, since they might contain malicious code enabling
                 # XSS attacks
                 req.send_header('Content-Disposition', 'attachment')
             req.end_headers()
@@ -241,7 +241,7 @@
                 req.write(chunk)
                 chunk = content.read(CHUNK_SIZE)
         else:
-            # The changeset corresponding to the last change on `node` 
+            # The changeset corresponding to the last change on `node`
             # is more interesting than the `rev` changeset.
             changeset = repos.get_changeset(node.rev)
 
@@ -260,17 +260,17 @@
                 'size': pretty_size(node.content_length),
                 'author': changeset.author or 'anonymous',
                 'message': message
-            } 
+            }
 
             # add ''Plain Text'' alternate link if needed
             if not is_binary(chunk) and mime_type != 'text/plain':
                 plain_href = req.href.browser(node.path, rev=rev, format='txt')
-                add_link(req, 'alternate', plain_href, 'Plain Text',
+                add_link(req, 'alternate', plain_href, u'Texte brut',
                          'text/plain')
 
             # add ''Original Format'' alternate link (always)
             raw_href = req.href.browser(node.path, rev=rev, format='raw')
-            add_link(req, 'alternate', raw_href, 'Original Format', mime_type)
+            add_link(req, 'alternate', raw_href, u'Format original', mime_type)
 
             self.log.debug("Rendering preview of node %s@%s with mime-type %s"
                            % (node.name, str(rev), mime_type))
diff --exclude=.svn -Naur trac-0.10.4/trac/versioncontrol/web_ui/changeset.py trac-0.10.4-PKG/trac/versioncontrol/web_ui/changeset.py
--- trac-0.10.4/trac/versioncontrol/web_ui/changeset.py	2007-04-20 15:41:47.000000000 +0200
+++ trac-0.10.4-PKG/trac/versioncontrol/web_ui/changeset.py	2007-08-24 12:04:21.000000000 +0200
@@ -88,7 +88,7 @@
     wiki_format_messages = BoolOption('changeset', 'wiki_format_messages',
                                       'true',
         """Whether wiki formatting should be applied to changeset messages.
-        
+
         If this option is disabled, changeset messages will be rendered as
         pre-formatted text.""")
 
@@ -229,17 +229,17 @@
             rpath = new_path.replace('/','_')
             if chgset:
                 if restricted:
-                    filename = 'changeset_%s_r%s' % (rpath, new)
+                    filename = 'enregistrement_%s_r%s' % (rpath, new)
                 else:
-                    filename = 'changeset_r%s' % new
+                    filename = 'enregistrement_r%s' % new
             else:
                 if restricted:
-                    filename = 'diff-%s-from-r%s-to-r%s' \
+                    filename = 'diff-%s-de-r%s-a-r%s' \
                                   % (rpath, old, new)
                 elif old_path == '/': # special case for download (#238)
                     filename = '%s-r%s' % (rpath, old)
                 else:
-                    filename = 'diff-from-%s-r%s-to-%s-r%s' \
+                    filename = 'diff-de-%s-r%s-a-%s-r%s' \
                                % (old_path.replace('/','_'), old, rpath, new)
             if format == 'diff':
                 self._render_diff(req, filename, repos, diff_args,
@@ -259,9 +259,9 @@
                                              'new': new,
                                              'old_path': old_path,
                                              'old': old})
-        add_link(req, 'alternate', '?format=diff&'+diff_params, 'Unified Diff',
+        add_link(req, 'alternate', '?format=diff&'+diff_params, u'Diff unifiÃ©',
                  'text/plain', 'diff')
-        add_link(req, 'alternate', '?format=zip&'+diff_params, 'Zip Archive',
+        add_link(req, 'alternate', '?format=zip&'+diff_params, u'Archive Zip',
                  'application/zip', 'zip')
         add_stylesheet(req, 'common/css/changeset.css')
         add_stylesheet(req, 'common/css/diff.css')
@@ -304,9 +304,9 @@
 
             def _changeset_title(rev):
                 if restricted:
-                    return 'Changeset %s for %s' % (rev, path)
+                    return u'Version %s pour %s' % (rev, path)
                 else:
-                    return 'Changeset %s' % rev
+                    return u'Version %s' % rev
 
             title = _changeset_title(rev)
             properties = []
@@ -335,7 +335,7 @@
                         prev_path = prev_rev = None
                 else:
                     add_link(req, 'first', req.href.changeset(oldest_rev),
-                             'Changeset %s' % oldest_rev)
+                             u'Version %s' % oldest_rev)
                     prev_path = diff.old_path
                     prev_rev = repos.previous_rev(chgset.rev)
                     if prev_rev:
@@ -353,7 +353,7 @@
                             next_href = req.href.changeset(next_rev)
                 else:
                     add_link(req, 'last', req.href.changeset(youngest_rev),
-                             'Changeset %s' % youngest_rev)
+                             u'Version %s' % youngest_rev)
                     next_rev = repos.next_rev(chgset.rev)
                     if next_rev:
                         next_href = req.href.changeset(next_rev)
@@ -614,11 +614,11 @@
 
     def title_for_diff(self, diff):
         if diff.new_path == diff.old_path: # ''diff between 2 revisions'' mode
-            return 'Diff r%s:%s for %s' \
+            return u'Diff r%s:%s pour %s' \
                    % (diff.old_rev or 'latest', diff.new_rev or 'latest',
                       diff.new_path or '/')
         else:                              # ''arbitrary diff'' mode
-            return 'Diff from %s@%s to %s@%s' \
+            return u'Diff de %s@%s Ã  %s@%s' \
                    % (diff.old_path or '/', diff.old_rev or 'latest',
                       diff.new_path or '/', diff.new_rev or 'latest')
 
@@ -626,7 +626,7 @@
 
     def get_timeline_filters(self, req):
         if req.perm.has_permission('CHANGESET_VIEW'):
-            yield ('changeset', 'Repository checkins')
+            yield ('changeset', u'Ajouts au dÃ©pÃ´t')
 
     def get_timeline_events(self, req, start, stop, filters):
         if 'changeset' in filters:
@@ -644,7 +644,7 @@
                     shortlog = shorten_line(message)
 
                 if format == 'rss':
-                    title = Markup('Changeset [%s]: %s', chgset.rev, shortlog)
+                    title = Markup(u'Version [%s]: %s', chgset.rev, shortlog)
                     href = req.abs_href.changeset(chgset.rev)
                     if wiki_format:
                         message = wiki_to_html(message, self.env, req, db,
@@ -652,7 +652,7 @@
                     else:
                         message = html.PRE(message)
                 else:
-                    title = Markup('Changeset <em>[%s]</em> by %s', chgset.rev,
+                    title = Markup(u'Version <em>[%s]</em> par %s', chgset.rev,
                                    chgset.author)
                     href = req.href.changeset(chgset.rev)
 
@@ -750,7 +750,7 @@
 
     def get_search_filters(self, req):
         if req.perm.has_permission('CHANGESET_VIEW'):
-            yield ('changeset', 'Changesets')
+            yield ('changeset', u'Versions')
 
     def get_search_results(self, req, terms, filters):
         if not 'changeset' in filters:
diff --exclude=.svn -Naur trac-0.10.4/trac/versioncontrol/web_ui/log.py trac-0.10.4-PKG/trac/versioncontrol/web_ui/log.py
--- trac-0.10.4/trac/versioncontrol/web_ui/log.py	2007-04-20 15:41:47.000000000 +0200
+++ trac-0.10.4-PKG/trac/versioncontrol/web_ui/log.py	2007-08-24 12:05:20.000000000 +0200
@@ -78,7 +78,7 @@
             stop_rev = unicode(repos.normalize_rev(stop_rev))
             if repos.rev_older_than(rev, stop_rev):
                 rev, stop_rev = stop_rev, rev
-            
+
         req.hdf['title'] = path + ' (log)'
         req.hdf['log'] = {
             'mode': mode,
@@ -94,11 +94,11 @@
         path_links = get_path_links(req.href, path, rev)
         req.hdf['log.path'] = path_links
         if path_links:
-            add_link(req, 'up', path_links[-1]['href'], 'Parent directory')
+            add_link(req, 'up', path_links[-1]['href'], u'RÃ©pertoire parent')
 
         # The `history()` method depends on the mode:
-        #  * for ''stop on copy'' and ''follow copies'', it's `Node.history()` 
-        #  * for ''show only add, delete'' it's`Repository.get_path_history()` 
+        #  * for ''stop on copy'' and ''follow copies'', it's `Node.history()`
+        #  * for ''show only add, delete'' it's`Repository.get_path_history()`
         if mode == 'path_history':
             def history(limit):
                 for h in repos.get_path_history(path, rev, limit):
@@ -134,9 +134,9 @@
             previous_path = old_path
         if info == []:
             # FIXME: we should send a 404 error here
-            raise TracError("The file or directory '%s' doesn't exist "
-                            "at revision %s or at any previous revision."
-                            % (path, rev), 'Nonexistent path')
+            raise TracError(u"Le fichier ou le rÃ©pertoire '%s' n'existe pas "
+                            u"en rÃ©vision %s ou pour toute rÃ©vision prÃ©cÃ©dente."
+                            % (path, rev), u'Chemin inexistant')
 
         def make_log_href(path, **args):
             link_rev = rev
@@ -152,11 +152,11 @@
             next_rev = info[-1]['rev']
             next_path = info[-1]['path']
             add_link(req, 'next', make_log_href(next_path, rev=next_rev),
-                     'Revision Log (restarting at %s, rev. %s)'
+                     u'Journal des rÃ©visions (repartant de %s, rÃ©v. %s)'
                      % (next_path, next_rev))
             # now, only show 'limit' results
             del info[-1]
-        
+
         req.hdf['log.items'] = info
 
         revs = [i['rev'] for i in info]
@@ -202,18 +202,18 @@
         add_stylesheet(req, 'common/css/diff.css')
 
         rss_href = make_log_href(path, format='rss', stop_rev=stop_rev)
-        add_link(req, 'alternate', rss_href, 'RSS Feed', 'application/rss+xml',
+        add_link(req, 'alternate', rss_href, u'Flux RSS', 'application/rss+xml',
                  'rss')
         changelog_href = make_log_href(path, format='changelog',
                                        stop_rev=stop_rev)
-        add_link(req, 'alternate', changelog_href, 'ChangeLog', 'text/plain')
+        add_link(req, 'alternate', changelog_href, u'ChangeLog', 'text/plain')
 
         return 'log.cs', None
 
     # IWikiSyntaxProvider methods
 
     REV_RANGE = "%s[-:]%s" % ((ChangesetModule.CHANGESET_ID,)*2)
-    
+
     def get_wiki_syntax(self):
         yield (
             # [...] form, starts with optional intertrac: [T... or [trac ...
diff --exclude=.svn -Naur trac-0.10.4/trac/versioncontrol/web_ui/util.py trac-0.10.4-PKG/trac/versioncontrol/web_ui/util.py
--- trac-0.10.4/trac/versioncontrol/web_ui/util.py	2007-04-20 15:41:47.000000000 +0200
+++ trac-0.10.4-PKG/trac/versioncontrol/web_ui/util.py	2007-10-19 12:50:23.000000000 +0200
@@ -22,7 +22,7 @@
 from trac.core import TracError
 from trac.util.datefmt import format_datetime, pretty_timedelta
 from trac.util.html import escape, html, Markup
-from trac.util.text import shorten_line
+from trac.util.text import to_unicode, shorten_line
 from trac.versioncontrol.api import NoSuchNode, NoSuchChangeset
 from trac.wiki import wiki_to_html, wiki_to_oneliner
 
@@ -94,14 +94,14 @@
     return path, rev, line
 
 def get_existing_node(req, repos, path, rev):
-    try: 
-        return repos.get_node(path, rev) 
+    try:
+        return repos.get_node(path, rev)
     except NoSuchNode, e:
-        raise TracError(Markup('%s<br><p>You can <a href="%s">search</a> ' 
-                               'in the repository history to see if that path '
-                               'existed but was later removed.</p>', e.message,
-                               req.href.log(path, rev=rev,
-                                            mode='path_history')))
+        raise TracError(Markup(u'%s<br><p>Vous pouvez <a href="%s">rechercher</a> '
+                               u'dans l\'historique du dÃ©pÃ´t pour voir si le '
+                               u'chemin a existÃ© mais a ensuite Ã©tÃ© supprimÃ©.</p>',
+                               to_unicode(e.message), req.href.log(path, rev=rev,
+                                                       mode='path_history')))
 
 def render_node_property(env, name, value):
     """Renders a node property value to HTML.
diff --exclude=.svn -Naur trac-0.10.4/trac/web/api.py trac-0.10.4-PKG/trac/web/api.py
--- trac-0.10.4/trac/web/api.py	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/trac/web/api.py	2007-08-24 12:07:43.000000000 +0200
@@ -119,7 +119,7 @@
 
 class Request(object):
     """Represents a HTTP request/response pair.
-    
+
     This class provides a convenience API over WSGI.
     """
     args = None
@@ -131,7 +131,7 @@
 
     def __init__(self, environ, start_response):
         """Create the request wrapper.
-        
+
         @param environ: The WSGI environment dict
         @param start_response: The WSGI callback for starting the response
         """
@@ -337,7 +337,7 @@
         self.end_headers()
 
         if self.method != 'HEAD':
-            self.write('Redirecting...')
+            self.write(u'Redirection...')
         raise RequestDone
 
     def display(self, template, content_type='text/html', status=200):
@@ -345,7 +345,7 @@
         `template` parameter, which can be either the name of the template file,
         or an already parsed `neo_cs.CS` object.
         """
-        assert self.hdf, 'HDF dataset not available'
+        assert self.hdf, u'DonnÃ©es HDF non disponibles'
         if self.args.has_key('hdfdump'):
             # FIXME: the administrator should probably be able to disable HDF
             #        dumps
@@ -399,7 +399,7 @@
 
     def send_file(self, path, mimetype=None):
         """Send a local file to the browser.
-        
+
         This method includes the "Last-Modified", "Content-Type" and
         "Content-Length" headers in the response, corresponding to the file
         attributes. It also checks the last modification time of the local file
@@ -407,7 +407,7 @@
         "304 Not Modified" response if it matches.
         """
         if not os.path.isfile(path):
-            raise HTTPNotFound("File %s not found" % path)
+            raise HTTPNotFound(u"Fichier %s non trouvÃ©" % path)
 
         stat = os.stat(path)
         last_modified = http_date(stat.st_mtime)
@@ -475,11 +475,11 @@
     # implementing classes should set this property to `True` if they
     # don't need session and authentication related information
     anonymous_request = False
-    
+
     # implementing classes should set this property to `False` if they
     # don't need the HDF data and don't produce content using a template
     use_template = True
-    
+
     def match_request(req):
         """Return whether the handler wants to process the given request."""
 
@@ -502,14 +502,14 @@
     def pre_process_request(req, handler):
         """Called after initial handler selection, and can be used to change
         the selected handler or redirect request.
-        
+
         Always returns the request handler, even if unchanged.
         """
 
     def post_process_request(req, template, content_type):
         """Do any post-processing the request might need; typically adding
         values to req.hdf, or changing template or mime type.
-        
+
         Always returns a tuple of (template, content_type), even if
         unchanged.
         """
diff --exclude=.svn -Naur trac-0.10.4/trac/web/auth.py trac-0.10.4-PKG/trac/web/auth.py
--- trac-0.10.4/trac/web/auth.py	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/trac/web/auth.py	2007-08-24 12:07:43.000000000 +0200
@@ -29,7 +29,7 @@
 import time
 import urllib2
 
-from trac.config import BoolOption
+from trac.config import BoolOption, Option
 from trac.core import *
 from trac.web.api import IAuthenticator, IRequestHandler
 from trac.web.chrome import INavigationContributor
@@ -59,6 +59,9 @@
     ignore_case = BoolOption('trac', 'ignore_auth_case', 'false',
         """Whether case should be ignored for login names (''since 0.9'').""")
 
+    logout_redirect = Option('trac', 'logout_redirect', '',
+        """URL de redirection sur le logout""")
+
     # IAuthenticator methods
 
     def authenticate(self, req):
@@ -83,12 +86,12 @@
 
     def get_navigation_items(self, req):
         if req.authname and req.authname != 'anonymous':
-            yield ('metanav', 'login', 'logged in as %s' % req.authname)
+            yield ('metanav', 'login', u'ConnectÃ© sous %s' % req.authname)
             yield ('metanav', 'logout',
-                   html.A('Logout', href=req.href.logout()))
+                   html.A(u'DÃ©connexion', href=req.href.logout()))
         else:
             yield ('metanav', 'login',
-                   html.A('Login', href=req.href.login()))
+                   html.A(u'Connexion', href=req.href.login()))
 
     # IRequestHandler methods
 
@@ -112,17 +115,17 @@
         cookie identifying the user on subsequent requests is sent back to the
         client.
 
-        If the Authenticator was created with `ignore_case` set to true, then 
+        If the Authenticator was created with `ignore_case` set to true, then
         the authentication name passed from the web server in req.remote_user
         will be converted to lower case before being used. This is to avoid
         problems on installations authenticating against Windows which is not
         case sensitive regarding user names and domain names
         """
         if not req.remote_user:
-            raise TracError(html("Authentication information not available. "
-                                 "Please refer to the ",
-                                 html.a('installation documentation',
-                                        title="Configuring Authentication",
+            raise TracError(html(u"Pas d'information d'authentification disponible. "
+                                 u"Merci de vous rÃ©fÃ©rer Ã  la ",
+                                 html.a(u"documentation d'installation",
+                                        title="Configuration de l'authentification",
                                         href=req.href.wiki('TracInstall') +
                                         "#ConfiguringAuthentication"), "."))
         remote_user = req.remote_user
@@ -130,13 +133,15 @@
             remote_user = remote_user.lower()
 
         assert req.authname in ('anonymous', remote_user), \
-               'Already logged in as %s.' % req.authname
+               u'DÃ©jÃ  connectÃ© sous %s.' % req.authname
 
         cookie = hex_entropy()
         db = self.env.get_db_cnx()
         cursor = db.cursor()
-        cursor.execute("INSERT INTO auth_cookie (cookie,name,ipnr,time) "
-                       "VALUES (%s, %s, %s, %s)", (cookie, remote_user,
+        # Effacer aussi tout cookie prÃ©-existant de l'utilisateur en cas de non logout
+        cursor.execute("DELETE FROM auth_cookie WHERE name=%s ; "
+                       "INSERT INTO auth_cookie (cookie,name,ipnr,time) "
+                       "VALUES (%s, %s, %s, %s)", (remote_user, cookie, remote_user,
                        req.remote_addr, int(time.time())))
         db.commit()
 
@@ -191,10 +196,12 @@
 
     def _redirect_back(self, req):
         """Redirect the user back to the URL she came from."""
-        referer = req.get_header('Referer')
-        if referer and not referer.startswith(req.base_url):
-            # only redirect to referer if it is from the same site
-            referer = None
+        referer = self.logout_redirect
+        if not req.path_info.startswith('/logout') or not referer:
+            referer = req.get_header('Referer')
+            if referer and not referer.startswith(req.base_url):
+                # only redirect to referer if it is from the same site
+                referer = None
         req.redirect(referer or req.abs_href())
 
 
@@ -311,7 +318,7 @@
                 self.hash[u] = a1
         if self.hash == {}:
             print >> sys.stderr, "Warning: found no users in realm:", self.realm
-        
+
     def parse_auth_header(self, authorization):
         values = {}
         for value in urllib2.parse_http_list(authorization):
diff --exclude=.svn -Naur trac-0.10.4/trac/web/chrome.py trac-0.10.4-PKG/trac/web/chrome.py
--- trac-0.10.4/trac/web/chrome.py	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/trac/web/chrome.py	2007-08-24 12:07:58.000000000 +0200
@@ -84,7 +84,7 @@
     def get_active_navigation_item(req):
         """This method is only called for the `IRequestHandler` processing the
         request.
-        
+
         It should return the name of the navigation item that should be
         highlighted as active/current.
         """
@@ -107,7 +107,7 @@
         Each item in the list must be a `(prefix, abspath)` tuple. The
         `prefix` part defines the path in the URL that requests to these
         resources are prefixed with.
-        
+
         The `abspath` is the absolute path to the directory containing the
         resources on the local file system.
         """
@@ -231,7 +231,7 @@
                     req.send_file(path, mimeview.get_mimetype(path))
 
         self.log.warning('File %s not found in any of %s', filename, dirs)
-        raise HTTPNotFound('File %s not found', filename)
+        raise HTTPNotFound(u'Fichier %s non trouvÃ©', filename)
 
     # ITemplateProvider methods
 
@@ -244,10 +244,10 @@
         return [self.env.get_templates_dir(), self.templates_dir]
 
     # IWikiSyntaxProvider methods
-    
+
     def get_wiki_syntax(self):
         return []
-    
+
     def get_link_resolvers(self):
         yield ('htdocs', self._format_link)
 
diff --exclude=.svn -Naur trac-0.10.4/trac/web/clearsilver.py trac-0.10.4-PKG/trac/web/clearsilver.py
--- trac-0.10.4/trac/web/clearsilver.py	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/trac/web/clearsilver.py	2007-08-24 12:08:14.000000000 +0200
@@ -77,7 +77,7 @@
     Traceback (most recent call last):
         ...
     KeyError: 'undef'
-    
+
     It may be preferable to return a default value if the given key does not exit.
     It will return 'None' when the specified key is not present:
 
@@ -110,7 +110,7 @@
 
     def __init__(self, loadpaths=[]):
         """Create a new HDF dataset.
-        
+
         The loadpaths parameter can be used to specify a sequence of paths under
         which ClearSilver will search for template files:
 
@@ -132,7 +132,8 @@
             import neo_util
             self.hdf = neo_util.HDF()
         except ImportError, e:
-            raise TracError, "ClearSilver not installed (%s)" % e
+            raise TracError, \
+                u"ClearSilver n'est pas installÃ© (%s)" % e
         
         self['hdf.loadpaths'] = loadpaths
 
@@ -159,7 +160,7 @@
 
     def __setitem__(self, name, value):
         """Add data to the HDF dataset.
-        
+
         The `name` parameter is the path of the node in dotted syntax. The
         `value` parameter can be a simple value such as a string or number, but
         also data structures such as dicts and lists.
@@ -195,16 +196,16 @@
         KeyError: 'test.none'
         """
         self.set_value(name, value, True)
-        
+
     def set_unescaped(self, name, value):
         """
         Add data to the HDF dataset.
-        
+
         This method works the same way as `__setitem__` except that `value`
         is not escaped if it is a string.
         """
         self.set_value(name, value, False)
-        
+
     def set_value(self, name, value, do_escape=True):
         """
         Add data to the HDF dataset.
@@ -213,7 +214,7 @@
             self.hdf.setValue(prefix.encode('utf-8'), value.encode('utf-8'))
         def set_str(prefix, value):
             self.hdf.setValue(prefix.encode('utf-8'), str(value))
-            
+
         def add_value(prefix, value):
             if value is None:
                 return
diff --exclude=.svn -Naur trac-0.10.4/trac/web/_fcgi.py trac-0.10.4-PKG/trac/web/_fcgi.py
--- trac-0.10.4/trac/web/_fcgi.py	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/trac/web/_fcgi.py	2007-08-24 12:16:21.000000000 +0200
@@ -1,4 +1,4 @@
-# -*- coding: iso-8859-1 -*-
+# -*- coding: utf-8 -*-
 #
 # Copyright (c) 2002, 2003, 2005, 2006 Allan Saddi <allan@saddi.com>
 # All rights reserved.
diff --exclude=.svn -Naur trac-0.10.4/trac/web/href.py trac-0.10.4-PKG/trac/web/href.py
--- trac-0.10.4/trac/web/href.py	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/trac/web/href.py	2007-08-21 22:27:21.000000000 +0200
@@ -113,6 +113,9 @@
     def __init__(self, base):
         self.base = base
         self._derived = {}
+        # Initialisation pour remplacer 'wiki' dans l'URL
+        self._wiki = None
+        self._replace_wiki = False
 
     def __call__(self, *args, **kw):
         href = self.base
@@ -138,9 +141,27 @@
                     add_param(k, v)
                 args = args[:-1]
 
+        # ContrÃ´le de la traduction du chemin 'wiki'
+        _args = []
+        _replace = False
+        for arg in args:
+            if arg == 'replace_wiki':
+                # L'argument suivant est l'URL de remplacement
+                self._replace_wiki = True
+                _replace = True
+            elif self._replace_wiki and _replace:
+                # Mettre Ã  jour la valeur de remplacement
+                self._wiki = arg
+                _replace = False
+            elif self._replace_wiki and self._wiki != None and arg == 'wiki':
+                # Remplacer 'wiki' par la valeur mise Ã  jour
+                _args.append(self._wiki)
+            elif arg != None:
+                # Partie normale de l'URL
+                _args.append(arg)
+
         # build the path
-        path = '/'.join([unicode_quote(unicode(arg).strip('/')) for arg in args
-                         if arg != None])
+        path = '/'.join([unicode_quote(unicode(arg).strip('/')) for arg in _args])
         if path:
             href += '/' + path
 
diff --exclude=.svn -Naur trac-0.10.4/trac/web/main.py trac-0.10.4-PKG/trac/web/main.py
--- trac-0.10.4/trac/web/main.py	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/trac/web/main.py	2007-10-19 12:50:51.000000000 +0200
@@ -86,6 +86,9 @@
         'url': env.project_url
     }
 
+    # InsÃ©rer les traductions
+    hdf['translation'] = env.translations
+
     if req:
         hdf['trac.href'] = {
             'wiki': req.href.wiki(),
@@ -131,11 +134,10 @@
     filters = OrderedExtensionsOption('trac', 'request_filters', IRequestFilter,
         doc="""Ordered list of filters to apply to all requests
             (''since 0.10'').""")
-
     default_handler = ExtensionOption('trac', 'default_handler',
                                       IRequestHandler, 'WikiModule',
         """Name of the component that handles requests to the base URL.
-        
+
         Options include `TimelineModule`, `RoadmapModule`, `BrowserModule`,
         `QueryModule`, `ReportModule` and `NewticketModule` (''since 0.9'').""")
 
@@ -152,7 +154,7 @@
     def dispatch(self, req):
         """Find a registered handler that matches the request and let it process
         it.
-        
+
         In addition, this method initializes the HDF data set and adds the web
         site chrome.
         """
@@ -161,6 +163,10 @@
         # FIXME in 0.11: self.env.abs_href = Href(self.env.base_url)
         self.env.abs_href = req.abs_href
 
+        # Remplacer l'url wiki par sa traduction pour l'API URL
+        self.env.href.replace_wiki(self.env.config.get('trac', 'wiki_base_url'))
+        self.env.abs_href.replace_wiki(self.env.config.get('trac', 'wiki_base_url'))
+
         # Select the component that should handle the request
         chosen_handler = None
         early_error = None
@@ -191,9 +197,9 @@
             chosen_handler = self._pre_process_request(req, chosen_handler)
         except:
             early_error = sys.exc_info()
-            
+
         if not chosen_handler and not early_error:
-            early_error = (HTTPNotFound('No handler matched request to %s',
+            early_error = (HTTPNotFound(u'Aucun composant ne peut gÃ©rer la requÃªte %s' %
                                         req.path_info),
                            None, None)
 
@@ -231,8 +237,10 @@
                     if ctype in ('application/x-www-form-urlencoded',
                                  'multipart/form-data') and \
                             req.args.get('__FORM_TOKEN') != req.form_token:
-                        raise HTTPBadRequest('Missing or invalid form token. '
-                                             'Do you have cookies enabled?')
+                        raise HTTPBadRequest(u'Jeton de formulaire manquant '
+                                             u'ou invalide. Votre navigateur '
+                                             u'est-il configurÃ© pour utiliser'
+                                             u' les cookies ?')
 
                 resp = chosen_handler.process_request(req)
                 if resp:
@@ -256,13 +264,13 @@
         except PermissionError, e:
             raise HTTPForbidden(to_unicode(e))
         except TracError, e:
-            raise HTTPInternalError(e.message)
+            raise HTTPInternalError(to_unicode(e.message))
 
     def _pre_process_request(self, req, chosen_handler):
         for f in self.filters:
             chosen_handler = f.pre_process_request(req, chosen_handler)
         return chosen_handler
-                
+
     def _post_process_request(self, req, template=None, content_type=None):
         for f in reversed(self.filters):
             template, content_type = f.post_process_request(req, template,
@@ -276,7 +284,7 @@
         By requiring that every POST form to contain this value we're able to
         protect against CSRF attacks. Since this value is only known by the
         user and not by an attacker.
-        
+
         If the the user does not have a `trac_form_token` cookie a new
         one is generated.
         """
@@ -286,11 +294,11 @@
             req.outcookie['trac_form_token'] = hex_entropy(24)
             req.outcookie['trac_form_token']['path'] = req.base_path
             return req.outcookie['trac_form_token'].value
-        
+
 
 def dispatch_request(environ, start_response):
     """Main entry point for the Trac web interface.
-    
+
     @param environ: the WSGI environment dict
     @param start_response: the WSGI callback for starting the response
     """
@@ -322,8 +330,8 @@
             root_uri = options['TracUriRoot'].rstrip('/')
             request_uri = environ['REQUEST_URI'].split('?', 1)[0]
             if not request_uri.startswith(root_uri):
-                raise ValueError('TracUriRoot set to %s but request URL '
-                                 'is %s' % (root_uri, request_uri))
+                raise ValueError(u'TracUriRoot dÃ©fini pour %s mais la requÃ¨te '
+                                 u'pointe sur %s' % (root_uri, request_uri))
             environ['SCRIPT_NAME'] = root_uri
             environ['PATH_INFO'] = urllib.unquote(request_uri[len(root_uri):])
 
@@ -375,15 +383,16 @@
                 env_path = get_environments(environ).get(env_name)
 
             if not env_path or not os.path.isdir(env_path):
-                start_response('404 Not Found', [])
-                return ['Environment not found']
+                start_response(u'404 Non trouvÃ©', [])
+                return [u'Environnement non trouvÃ©']
 
     if not env_path:
-        raise EnvironmentError('The environment options "TRAC_ENV" or '
-                               '"TRAC_ENV_PARENT_DIR" or the mod_python '
-                               'options "TracEnv" or "TracEnvParentDir" are '
-                               'missing. Trac requires one of these options '
-                               'to locate the Trac environment(s).')
+        raise EnvironmentError(u'Les options d\'environnement "TRAC_ENV" ou '
+                               u'"TRAC_ENV_PARENT_DIR", ou bien les options '
+                               u'mod_python "TracEnv" ou "TracEnvParentDir" ne '
+                               u'sont pas dÃ©finies. Trac a besoin d\'une de ces '
+                               u'options pour localiser le ou les environnements '
+                               u'Trac.')
     run_once = environ['wsgi.run_once']
 
     env = env_error = None
@@ -397,7 +406,7 @@
     req = Request(environ, start_response)
     try:
         if not env and env_error:
-            from trac.config import default_dir            
+            from trac.config import default_dir
             req.hdf = HDFWrapper([default_dir('templates')])
             raise HTTPInternalError(env_error.message)
         try:
@@ -415,9 +424,9 @@
         if env:
             env.log.warn(e)
         if req.hdf:
-            req.hdf['title'] = e.reason or 'Error'
+            req.hdf['title'] = e.reason or u'Erreur'
             req.hdf['error'] = {
-                'title': e.reason or 'Error',
+                'title': e.reason or u'Erreur',
                 'type': 'TracError',
                 'message': e.message
             }
@@ -430,9 +439,9 @@
         env.log.exception(e)
 
         if req.hdf:
-            req.hdf['title'] = to_unicode(e) or 'Error'
+            req.hdf['title'] = to_unicode(e) or u'Erreur'
             req.hdf['error'] = {
-                'title': to_unicode(e) or 'Error',
+                'title': to_unicode(e) or u'Erreur',
                 'type': 'internal',
                 'traceback': get_last_traceback()
             }
diff --exclude=.svn -Naur trac-0.10.4/trac/web/session.py trac-0.10.4-PKG/trac/web/session.py
--- trac-0.10.4/trac/web/session.py	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/trac/web/session.py	2007-08-24 12:15:35.000000000 +0200
@@ -53,7 +53,7 @@
             self.get_session(req.authname, authenticated=True)
 
     def bake_cookie(self, expires=PURGE_AGE):
-        assert self.sid, 'Session ID not set'
+        assert self.sid, u'ID de session non dÃ©fini'
         self.req.outcookie[COOKIE_KEY] = self.sid
         self.req.outcookie[COOKIE_KEY]['path'] = self.req.base_path
         self.req.outcookie[COOKIE_KEY]['expires'] = expires
@@ -91,17 +91,18 @@
 
     def change_sid(self, new_sid):
         assert self.req.authname == 'anonymous', \
-               'Cannot change ID of authenticated session'
-        assert new_sid, 'Session ID cannot be empty'
+               u"Impossible de changer l'identifiant d'une session authentifiÃ©e"
+        assert new_sid, u"L'identifiant de session ne peut Ãªtre vide"
         if new_sid == self.sid:
             return
         db = self.env.get_db_cnx()
         cursor = db.cursor()
         cursor.execute("SELECT sid FROM session WHERE sid=%s", (new_sid,))
         if cursor.fetchone():
-            raise TracError(Markup('Session "%s" already exists.<br />'
-                                   'Please choose a different session ID.',
-                                   new_sid), 'Error renaming session')
+            raise TracError(Markup(u"La session '%s' existe dÃ©jÃ .<br />"
+                                   u"Merci de choisir un identifiant de session "
+                                   u"diffÃ©rent." % new_sid), \
+                                   u'Erreur de renommage de session')
         self.env.log.debug('Changing session ID %s to %s' % (self.sid, new_sid))
         cursor.execute("UPDATE session SET sid=%s WHERE sid=%s "
                        "AND authenticated=0", (new_sid, self.sid))
@@ -117,14 +118,14 @@
         is no preexisting session data for that user name.
         """
         assert self.req.authname != 'anonymous', \
-               'Cannot promote session of anonymous user'
+               u'La promotion d\'une session d\'un utilisateur anonyme impossible'
 
         db = self.env.get_db_cnx()
         cursor = db.cursor()
         cursor.execute("SELECT authenticated FROM session "
                        "WHERE sid=%s OR sid=%s ", (sid, self.req.authname))
         authenticated_flags = [row[0] for row in cursor.fetchall()]
-        
+
         if len(authenticated_flags) == 2:
             # There's already an authenticated session for the user, we
             # simply delete the anonymous session
diff --exclude=.svn -Naur trac-0.10.4/trac/web/standalone.py trac-0.10.4-PKG/trac/web/standalone.py
--- trac-0.10.4/trac/web/standalone.py	2007-04-20 15:41:51.000000000 +0200
+++ trac-0.10.4-PKG/trac/web/standalone.py	2007-08-24 12:16:13.000000000 +0200
@@ -113,7 +113,7 @@
     def _auth_callback(option, opt_str, value, parser, cls):
         info = value.split(',', 3)
         if len(info) != 3:
-            raise OptionValueError("Incorrect number of parameters for %s"
+            raise OptionValueError(u"Nombre de parametres incorrects pour %s"
                                    % option)
 
         env_name, filename, realm = info
diff --exclude=.svn -Naur trac-0.10.4/trac/wiki/api.py trac-0.10.4-PKG/trac/wiki/api.py
--- trac-0.10.4/trac/wiki/api.py	2007-04-20 15:41:49.000000000 +0200
+++ trac-0.10.4-PKG/trac/wiki/api.py	2007-08-23 22:26:07.000000000 +0200
@@ -50,7 +50,7 @@
 class IWikiPageManipulator(Interface):
     """Extension point interface for components that need to to specific
     pre and post processing of wiki page changes.
-    
+
     Unlike change listeners, a manipulator can reject changes being committed
     to the database.
     """
@@ -61,7 +61,7 @@
 
     def validate_wiki_page(req, page):
         """Validate a wiki page after it's been populated from user input.
-        
+
         Must return a list of `(field, message)` tuples, one for each problem
         detected. `field` can be `None` to indicate an overall problem with the
         page. Therefore, a return value of `[]` means everything is OK."""
@@ -82,7 +82,7 @@
 
 
 class IWikiSyntaxProvider(Interface):
- 
+
     def get_wiki_syntax():
         """Return an iterable that provides additional wiki syntax.
 
@@ -91,7 +91,7 @@
         which will be called if there's a match.
         That function is of the form cb(formatter, ns, match).
         """
- 
+
     def get_link_resolvers():
         """Return an iterable over (namespace, formatter) tuples.
 
@@ -100,7 +100,7 @@
         return some HTML fragment.
         The `label` is already HTML escaped, whereas the `target` is not.
         """
- 
+
 
 class WikiSystem(Component):
     """Represents the wiki system."""
@@ -203,7 +203,9 @@
             helper_re = re.compile(r'\?P<([a-z\d_]+)>')
             for rule in syntax:
                 helpers += helper_re.findall(rule)[1:]
-            rules = re.compile('(?:' + '|'.join(syntax) + ')')
+            to_compile = '(?:' + '|'.join(syntax) + ')'
+            self.log.debug('Compilation de l\'expression rÃ©guliÃ¨re "%s"' % to_compile)
+            rules = re.compile(to_compile)
             self._external_handlers = handlers
             self._helper_patterns = helpers
             self._compiled_rules = rules
@@ -246,7 +248,7 @@
         if self.split_page_names:
             return re.sub(r"([a-z])([A-Z][a-z])", r"\1 \2", page)
         return page
-    
+
     def get_wiki_syntax(self):
         from trac.wiki.formatter import Formatter
         wiki_page_name = (
@@ -254,13 +256,13 @@
             r"(?:#%s)?" % self.XML_NAME + # optional fragment id
             r"(?=:(?:\Z|\s)|[^:a-zA-Z]|\s|\Z)" # what should follow it
             )
-        
+
         # Regular WikiPageNames
         def wikipagename_link(formatter, match, fullmatch):
             return self._format_link(formatter, 'wiki', match,
                                      self.format_page_name(match),
                                      self.ignore_missing_pages)
-        
+
         yield (r"!?(?<!/)\b" + # start at a word boundary but not after '/'
                wiki_page_name, wikipagename_link)
 
@@ -273,10 +275,10 @@
                                               Formatter.QUOTED_STRING),
                wikipagename_with_label_link)
 
-        # MoinMoin's ["internal free link"] 
-        def internal_free_link(fmt, m, fullmatch): 
-            return self._format_link(fmt, 'wiki', m[2:-2], m[2:-2], False) 
-        yield (r"!?\[(?:%s)\]" % Formatter.QUOTED_STRING, internal_free_link) 
+        # MoinMoin's ["internal free link"]
+        def internal_free_link(fmt, m, fullmatch):
+            return self._format_link(fmt, 'wiki', m[2:-2], m[2:-2], False)
+        yield (r"!?\[(?:%s)\]" % Formatter.QUOTED_STRING, internal_free_link)
 
     def get_link_resolvers(self):
         def link_resolver(formatter, ns, target, label):
diff --exclude=.svn -Naur trac-0.10.4/trac/wiki/formatter.py trac-0.10.4-PKG/trac/wiki/formatter.py
--- trac-0.10.4/trac/wiki/formatter.py	2007-04-20 15:41:49.000000000 +0200
+++ trac-0.10.4-PKG/trac/wiki/formatter.py	2007-08-24 12:18:49.000000000 +0200
@@ -53,7 +53,7 @@
         builtin_processors = {'html': self._html_processor,
                               'default': self._default_processor,
                               'comment': self._comment_processor}
-        
+
         self.processor = builtin_processors.get(name)
         if not self.processor:
             # Find a matching wiki macro
@@ -72,7 +72,7 @@
                 self.processor = self._mimeview_processor
             else:
                 self.processor = self._default_processor
-                self.error = "No macro or processor named '%s' found" % name
+                self.error = u"Aucune macro nommÃ©e '%s' ne peut Ãªtre trouvÃ©e" % name
 
     # builtin processors
 
@@ -90,7 +90,7 @@
             return Markup(text).sanitize()
         except HTMLParseError, e:
             self.env.log.warn(e)
-            return system_message('HTML parsing error: %s' % escape(e.msg),
+            return system_message(u'Erreur d\'analyse HTML: %s' % escape(e.msg),
                                   text.splitlines()[e.lineno - 1].strip())
 
     # generic processors
@@ -107,8 +107,9 @@
 
     def process(self, req, text, in_paragraph=False):
         if self.error:
-            text = system_message(Markup('Error: Failed to load processor '
-                                         '<code>%s</code>', self.name),
+            text = system_message(Markup(u'Erreur : Ã‰chec de chargement du' 
+                                         u'transformateur <code>%s</code>', 
+                                         self.name),
                                   self.error)
         else:
             text = self.processor(req, text)
@@ -160,7 +161,7 @@
     STARTBLOCK = "{{{"
     ENDBLOCK_TOKEN = r"\}\}\}"
     ENDBLOCK = "}}}"
-    
+
     LINK_SCHEME = r"[\w.+-]+" # as per RFC 2396
     INTERTRAC_SCHEME = r"[a-zA-Z.+-]*?" # no digits (support for shorthand links)
 
@@ -172,7 +173,7 @@
 
     LHREF_RELATIVE_TARGET = r"[/.#][^\s[\]]*"
 
-    XML_NAME = r"[\w:](?<!\d)[\w:.-]*?" # See http://www.w3.org/TR/REC-xml/#id 
+    XML_NAME = r"[\w:](?<!\d)[\w:.-]*?" # See http://www.w3.org/TR/REC-xml/#id
 
     # Sequence of regexps used by the engine
 
@@ -215,7 +216,7 @@
         r"(?P<hanchor>#%s)?$)" % XML_NAME,
         #  * list
         r"(?P<list>^(?P<ldepth>\s+)(?:[-*]|\d+\.|[a-zA-Z]\.|[ivxIVX]{1,5}\.) )",
-        # definition:: 
+        # definition::
         r"(?P<definition>^\s+((?:%s[^%s]*%s|%s.*?%s|[^%s%s:]|:[^:])+::)(?:\s+|$))"
         % (INLINE_TOKEN, INLINE_TOKEN, INLINE_TOKEN,
            STARTBLOCK_TOKEN, ENDBLOCK_TOKEN, INLINE_TOKEN, STARTBLOCK[0]),
@@ -258,7 +259,7 @@
         return (target, query, fragment)
 
     # -- Pre- IWikiSyntaxProvider rules (Font styles)
-    
+
     def tag_open_p(self, tag):
         """Do we currently have any open tag with `tag` as end-tag?"""
         return tag in self._open_tags
@@ -354,7 +355,7 @@
                     label = ns+':'+target   #  use `http://target`
                 else:                       # for `wiki:target`
                     label = target          #  use only `target`
-            else: # e.g. `[search:]` 
+            else: # e.g. `[search:]`
                 label = ns
         else:
             label = self._unquote(label)
@@ -388,7 +389,7 @@
                 sep = target.find(':')
                 if sep != -1:
                     url = '%s/%s/%s' % (url, target[:sep], target[sep + 1:])
-                else: 
+                else:
                     url = '%s/search?q=%s' % (url, urllib.quote_plus(target))
             else:
                 url = '%s/intertrac/%s' % (url, urllib.quote(target))
@@ -408,7 +409,7 @@
         return None
 
     def _make_interwiki_link(self, ns, target, label):
-        from trac.wiki.interwiki import InterWikiMap        
+        from trac.wiki.interwiki import InterWikiMap
         interwiki = InterWikiMap(self.env)
         if ns in interwiki:
             url, title = interwiki.url(ns, target)
@@ -430,7 +431,7 @@
             return html.A(text, href=url)
 
     # WikiMacros
-    
+
     def _macro_formatter(self, match, fullmatch):
         name = fullmatch.group('macroname')
         if name.lower() == 'br':
@@ -442,7 +443,7 @@
         except Exception, e:
             self.env.log.error('Macro %s(%s) failed' % (name, args),
                                exc_info=True)
-            return system_message('Error: Macro %s(%s) failed' % (name, args),
+            return system_message(u'Erreur : Ã‰chec de la macro %s(%s)' % (name, args),
                                   e)
 
     # Headings
@@ -502,7 +503,7 @@
         self._tabstops = tabstops
 
     # Lists
-    
+
     def _list_formatter(self, match, fullmatch):
         ldepth = len(fullmatch.group('ldepth'))
         listid = match[ldepth]
@@ -523,7 +524,7 @@
                 class_ = 'upperalpha'
         self._set_list_depth(ldepth, type_, class_, start)
         return ''
-        
+
     def _get_list_depth(self):
         """Return the space offset associated to the deepest opened list."""
         return self._list_stack and self._list_stack[-1][1] or 0
@@ -658,7 +659,7 @@
             self.in_quote = True
 
     # Table
-    
+
     def _last_table_cell_formatter(self, match, fullmatch):
         return ''
 
@@ -715,7 +716,7 @@
             self.paragraph_open = 0
 
     # Code blocks
-    
+
     def handle_code_block(self, line):
         if line.strip() == Formatter.STARTBLOCK:
             self.in_code_block += 1
@@ -741,7 +742,7 @@
                 name = match.group(1)
                 self.code_processor = WikiProcessor(self.env, name)
             else:
-                self.code_text += line + os.linesep 
+                self.code_text += line + os.linesep
                 self.code_processor = WikiProcessor(self.env, 'default')
         else:
             self.code_text += line + os.linesep
@@ -751,7 +752,7 @@
             self.handle_code_block(Formatter.ENDBLOCK)
 
     # -- Wiki engine
-    
+
     def handle_match(self, fullmatch):
         for itype, match in fullmatch.groupdict().items():
             if match and not itype in self.wiki.helper_patterns:
@@ -929,7 +930,7 @@
 class OutlineFormatter(Formatter):
     """Special formatter that generates an outline of all the headings."""
     flavor = 'outline'
-    
+
     def __init__(self, env, absurls=False, db=None):
         Formatter.__init__(self, env, None, absurls, db)
 
@@ -976,16 +977,16 @@
 class LinkFormatter(OutlineFormatter):
     """Special formatter that focuses on TracLinks."""
     flavor = 'link'
-    
+
     def __init__(self, env, absurls=False, db=None):
         OutlineFormatter.__init__(self, env, absurls, db)
-        
+
     def _heading_formatter(self, match, fullmatch):
          return ''
-    
+
     def match(self, wikitext):
         """Return the Wiki match found at the beginning of the `wikitext`"""
-        self.reset()        
+        self.reset()
         match = re.match(self.wiki.rules, wikitext)
         if match:
             return self.handle_match(match)
diff --exclude=.svn -Naur trac-0.10.4/trac/wiki/intertrac.py trac-0.10.4-PKG/trac/wiki/intertrac.py
--- trac-0.10.4/trac/wiki/intertrac.py	2007-04-20 15:41:49.000000000 +0200
+++ trac-0.10.4-PKG/trac/wiki/intertrac.py	2007-08-24 12:20:07.000000000 +0200
@@ -41,13 +41,13 @@
     def process_request(self, req):
         link = req.args.get('link', '')
         if not link:
-            raise TracError('No TracLinks given')
+            raise TracError(u'Aucun lien TracLinks fourni')
         link_elt = wiki_to_link(link, self.env, req)
         if isinstance(link_elt, Element):
             href = link_elt.attr['href']
             if href:
                 req.redirect(href)
-        raise TracError('"%s" is not a TracLinks' % link)
+        raise TracError(u'"%s" n\'est pas un lien TracLinks' % link)
 
 
     # IWikiMacroProvider methods
@@ -56,7 +56,7 @@
         yield 'InterTrac'
 
     def get_macro_description(self, name): 
-        return "Provide a list of known InterTrac prefixes."
+        return u"Fournit une liste des prÃ©fixes InterTrac connus."
 
     def render_macro(self, req, name, content):
         intertracs = {}
@@ -73,7 +73,7 @@
             intertrac = intertracs[prefix]
             if isinstance(intertrac, basestring):
                 yield html.TR(html.TD(html.B(prefix)),
-                              html.TD('Alias for ', html.B(intertrac)))
+                              html.TD(u'Alias pour ', html.B(intertrac)))
             else:
                 url = intertrac.get('url', '')
                 if url:
@@ -83,5 +83,5 @@
                                   html.TD(html.A(title, href=url)))
 
         return html.TABLE(class_="wiki intertrac")(
-            html.TR(html.TH(html.EM('Prefix')), html.TH(html.EM('Trac Site'))),
+            html.TR(html.TH(html.EM('Prefix')), html.TH(html.EM(u'Site Trac'))),
             [generate_prefix(p) for p in sorted(intertracs.keys())])
diff --exclude=.svn -Naur trac-0.10.4/trac/wiki/interwiki.py trac-0.10.4-PKG/trac/wiki/interwiki.py
--- trac-0.10.4/trac/wiki/interwiki.py	2007-04-20 15:41:49.000000000 +0200
+++ trac-0.10.4-PKG/trac/wiki/interwiki.py	2007-08-24 12:20:19.000000000 +0200
@@ -131,7 +131,8 @@
         yield 'InterWiki'
 
     def get_macro_description(self, name): 
-        return "Provide a description list for the known InterWiki prefixes."
+        return u'Fournit une liste descriptive des differents prÃ©fixes ' \
+               u'InterWiki connus.'
 
     def render_macro(self, req, name, content):
         from trac.util import sorted
diff --exclude=.svn -Naur trac-0.10.4/trac/wiki/macros.py trac-0.10.4-PKG/trac/wiki/macros.py
--- trac-0.10.4/trac/wiki/macros.py	2007-04-20 15:41:49.000000000 +0200
+++ trac-0.10.4-PKG/trac/wiki/macros.py	2007-08-24 12:24:16.000000000 +0200
@@ -35,8 +35,7 @@
 
 
 class WikiMacroBase(Component):
-    """Abstract base class for wiki macros."""
-
+    u"""Classe abstraite de base pour toutes les macros Wiki."""
     implements(IWikiMacroProvider)
     abstract = True
 
@@ -56,11 +55,11 @@
 
 
 class TitleIndexMacro(WikiMacroBase):
-    """Inserts an alphabetic list of all wiki pages into the output.
-
-    Accepts a prefix string as parameter: if provided, only pages with names
-    that start with the prefix are included in the resulting list. If this
-    parameter is omitted, all pages are listed.
+    u"""InsÃ¨re une liste alphabetique de toutes les pages Wiki
+    
+    Accepte un paramÃ¨tre prÃ©cisant le prÃ©fixe: s'il est fourni, seules les
+    pages commencant par ce prefix seront incluses dans la liste rÃ©sultante.
+    S'il n'est pas fournit, toutes les pages seront listÃ©es.
     """
 
     def render_macro(self, req, name, content):
@@ -74,16 +73,17 @@
 
 
 class RecentChangesMacro(WikiMacroBase):
-    """Lists all pages that have recently been modified, grouping them by the
-    day they were last modified.
+    u"""Liste toutes les pages qui ont Ã©tÃ© modifiÃ©es rÃ©cemment, en les regroupant
+    par le jour de leur derniÃ¨re modification.
 
-    This macro accepts two parameters. The first is a prefix string: if
-    provided, only pages with names that start with the prefix are included in
-    the resulting list. If this parameter is omitted, all pages are listed.
-
-    The second parameter is a number for limiting the number of pages returned.
-    For example, specifying a limit of 5 will result in only the five most
-    recently changed pages to be included in the list.
+    La macro accepte deux paramÃ¨tres. Le premier est un prÃ©fixe: s'il est 
+    fourni, seules les pages dont le nom dÃ©bute par ce prÃ©fixe seront incluses
+    dans la liste rÃ©sultante. Si ce paramÃ¨tre est omis, toutes les pages sont
+    listÃ©es.
+
+    Le second paramÃ¨tre est une valeur limitant le nombre de pages retournÃ©es.
+    Par exemple, en spÃ©cifiant une limite de 5, seules les derniÃ¨res 5 pages 
+    rÃ©cemment changÃ©es seront incluses dans la liste.
     """
 
     def render_macro(self, req, name, content):
@@ -127,7 +127,7 @@
              html.UL([html.LI(
             html.A(wiki.format_page_name(name), href=req.href.wiki(name)),
             ' ',
-            version > 1 and 
+            version > 1 and
             html.SMALL('(', html.A('diff',
                                    href=req.href.wiki(name, action='diff',
                                                       version=version)), ')') \
@@ -137,24 +137,28 @@
 
 
 class PageOutlineMacro(WikiMacroBase):
-    """Displays a structural outline of the current wiki page, each item in the
-    outline being a link to the corresponding heading.
-
-    This macro accepts three optional parameters:
-    
-     * The first is a number or range that allows configuring the minimum and
-       maximum level of headings that should be included in the outline. For
-       example, specifying "1" here will result in only the top-level headings
-       being included in the outline. Specifying "2-3" will make the outline
-       include all headings of level 2 and 3, as a nested list. The default is
-       to include all heading levels.
-     * The second parameter can be used to specify a custom title (the default
-       is no title).
-     * The third parameter selects the style of the outline. This can be
-       either `inline` or `pullout` (the latter being the default). The `inline`
-       style renders the outline as normal part of the content, while `pullout`
-       causes the outline to be rendered in a box that is by default floated to
-       the right side of the other content.
+    u"""
+    Affiche la structure de la page Wiki courante, chaque Ã©lement de la 
+    structure intÃ©grant un lien vers la section correspondante.
+
+    Cette macro accepte trois paramÃ¨tes optionnels: 
+
+     * Le premier est un nombre ou un intervalle qui permet de configurer 
+       les niveaux minimal et maximal des sous-sections qui doivent etre   
+       inclus dans la structure generee. Par exemple, l'utilisation
+       de "1" permettra de n'inclure que les sous-sections de premier 
+       niveau dans la structure. L'utilisation de "2-3" gÃ©nÃ©rera une 
+       structure contenant toutes les sous-sections de niveau 2 et 3, 
+       sous forme d'une liste imbriquÃ©e. Par dÃ©faut, toutes les 
+       sous-sections sont incluses.
+     * Le second paramÃ¨tre peut Ãªtre utilisÃ© pour prÃ©ciser un titre (par dÃ©faut,
+       aucun titre).
+     * Le troisiÃ¨me paramÃ¨tre permet de choisir le style de la prÃ©sentation. Il 
+       peut prendre les valeurs '''inline''' ou '''pullout''' (par dÃ©faut, 
+       '''pullout'''). Le style '''inline''' permet d'intÃ©grer la prÃ©sentation 
+       au contenu de la page, alors que '''pullout''' permet de placer la 
+       structure dans un cadre qui est accollÃ© sur la droite du reste du 
+       contenu de la page.
     """
 
     def render_macro(self, req, name, content):
@@ -193,54 +197,54 @@
 
 
 class ImageMacro(WikiMacroBase):
-    """Embed an image in wiki-formatted text.
-    
-    The first argument is the file specification. The file specification may
-    reference attachments or files in three ways:
-     * `module:id:file`, where module can be either '''wiki''' or '''ticket''',
-       to refer to the attachment named ''file'' of the specified wiki page or
-       ticket.
-     * `id:file`: same as above, but id is either a ticket shorthand or a Wiki
-       page name.
-     * `file` to refer to a local attachment named 'file'. This only works from
-       within that wiki page or a ticket.
-    
-    Also, the file specification may refer to repository files, using the
-    `source:file` syntax (`source:file@rev` works also).
-    
-    The remaining arguments are optional and allow configuring the attributes
-    and style of the rendered `<img>` element:
-     * digits and unit are interpreted as the size (ex. 120, 25%)
-       for the image
-     * `right`, `left`, `top` or `bottom` are interpreted as the alignment for
-       the image
-     * `nolink` means without link to image source.
-     * `key=value` style are interpreted as HTML attributes or CSS style
-        indications for the image. Valid keys are:
-        * align, border, width, height, alt, title, longdesc, class, id
-          and usemap
-        * `border` can only be a number
+    u"""
+    IntÃ¨gre une image dans du texte wiki.
+
+    Le premier argument spÃ©cifie le fichier image. Le fichier image peut 
+    rÃ©fÃ©rencer des piÃ¨ces jointes ou des fichier de trois faÃ§ons diffÃ©rentes:
+     * `module:id:file`, oÃ¹ le module peut Ãªtre soit '''wiki''' soit '''ticket''',
+       pour rÃ©fÃ©rencer la piÃ¨ce jointe nommÃ©e ''file'' Ã  la page wiki ou au 
+       ticket spÃ©cifiÃ©.
+     * `id:file`: mÃªme utilisation le premier point, mais 'id' est soit une 
+       rÃ©fÃ©rence ticket soit le nom d'une page Wiki.
+     * `file` rÃ©fÃ©rence une piÃ¨ce jointe nommÃ©e 'file'. Cette syntaxe ne 
+       fonctionne que depuis une page Wiki ou un ticket.
+
+    De plus, la spÃ©cification du fichier peut se rÃ©fÃ©rer Ã  des fichiers du 
+    dÃ©pÃ´t, en utilisant la syntaxe `source:file` (`source:file@rev` fonctionne
+    Ã©galement).
+
+    Les arguments restants sont optionnels and permette de configurer les
+    attributs et le style de l'Ã©lÃ©ment image (<img>):
+     * les nombres et unitÃ©s sont interprÃ©tÃ©s comme la taille (ex. 120, 25%)
+       de l'image
+     * `right`, `left`, `top` or `bottom` sont interprÃ©tÃ©s comme le 
+       positionnement de l'image, respectivement droite, gauche, haut et bas.
+     * `nolink` dÃ©sactive le lien vers l'image source
+     * le style `key=value` est interprÃ©tÃ© comme des attributs HTML de l'image
+     * le style `key:value` est interprÃ©tÃ© comme des indicateurs CSS de l'image
     
-    Examples:
+     Exemples:
     {{{
-        [[Image(photo.jpg)]]                           # simplest
-        [[Image(photo.jpg, 120px)]]                    # with size
-        [[Image(photo.jpg, right)]]                    # aligned by keyword
-        [[Image(photo.jpg, nolink)]]                   # without link to source
-        [[Image(photo.jpg, align=right)]]              # aligned by attribute
+        [[Image(photo.jpg)]]                           # le plus simple
+        [[Image(photo.jpg, 120px)]]                    # avec la taille
+        [[Image(photo.jpg, right)]]                    # alignÃ© par mot clef
+        [[Image(photo.jpg, nolink)]]                   # sans lien vers la source
+        [[Image(photo.jpg, align=right)]]              # alignÃ© par un style HTML
     }}}
     
-    You can use image from other page, other ticket or other module.
+    Vous pouvez utiliser une image jointe Ã  une autre page, un autre ticket ou
+    un autre module.
     {{{
-        [[Image(OtherPage:foo.bmp)]]    # if current module is wiki
-        [[Image(base/sub:bar.bmp)]]     # from hierarchical wiki page
-        [[Image(#3:baz.bmp)]]           # if in a ticket, point to #3
+        [[Image(OtherPage:foo.bmp)]]    # depuis une page wiki
+        [[Image(base/sub:bar.bmp)]]     # depuis une page sous-page wiki
+        [[Image(#3:baz.bmp)]]           # depuis un ticket, #3 ticket
         [[Image(ticket:36:boo.jpg)]]
-        [[Image(source:/images/bee.jpg)]] # straight from the repository!
-        [[Image(htdocs:foo/bar.png)]]   # image file in project htdocs dir.
+        [[Image(source:/images/bee.jpg)]] # rÃ©fÃ©rence le dÃ©pÃ´t
+        [[Image(htdocs:foo/bar.png)]]   # fichier image depuis le rÃ©p. statique.
     }}}
     
-    ''Adapted from the Image.py macro created by Shun-ichi Goto
+    ''BasÃ© sur une adaptation de la macro Image.py crÃ©Ã©e par Shun-ichi Goto
     <gotoh@taiyo.co.jp>''
     """
 
@@ -252,7 +256,7 @@
         # we expect the 1st argument to be a filename (filespec)
         args = content.split(',')
         if len(args) == 0:
-            raise Exception("No argument.")
+            raise Exception(u"Aucun argument")
         filespec = args[0]
         size_re = re.compile('[0-9]+%?$')
         attr_re = re.compile('(align|border|width|height|alt'
@@ -289,15 +293,17 @@
         # parse filespec argument to get module and id if contained.
         parts = filespec.split(':')
         url = None
+        wiki = self.env.config.get('trac', 'wiki_base_url')
         if len(parts) == 3:                 # module:id:attachment
-            if parts[0] in ['wiki', 'ticket']:
+            if parts[0] in [wiki, 'ticket']:
                 module, id, file = parts
             else:
-                raise Exception("%s module can't have attachments" % parts[0])
+                raise Exception(u"Le module %s ne peut pas possÃ©der de fichiers "
+                                "joints" % parts[0])
         elif len(parts) == 2:
             from trac.versioncontrol.web_ui import BrowserModule
             try:
-                browser_links = [link for link,_ in 
+                browser_links = [link for link,_ in
                                  BrowserModule(self.env).get_link_resolvers()]
             except Exception:
                 browser_links = []
@@ -321,23 +327,27 @@
                 elif id in ('http', 'https', 'ftp'): # external URLs
                     raw_url = url = desc = id+':'+file
                 else:
-                    module = 'wiki'
+                    module = wiki
         elif len(parts) == 1:               # attachment
             # determine current object
             # FIXME: should be retrieved from the formatter...
             # ...and the formatter should be provided to the macro
             file = filespec
-            module, id = 'wiki', 'WikiStart'
+            module, id = wiki, 'WikiStart'
             path_info = req.path_info.split('/',2)
             if len(path_info) > 1:
                 module = path_info[1]
             if len(path_info) > 2:
                 id = path_info[2]
-            if module not in ['wiki', 'ticket']:
-                raise Exception('Cannot reference local attachment from here')
+            if module not in [wiki, 'ticket']:
+                raise Exception(u'Impossible de rÃ©fÃ©rencer un fichier joint '
+                                u'depuis cet endroit')
         else:
-            raise Exception('No filespec given')
+            raise Exception(u'Pas de dÃ©finition de fichier reÃ§ue')
         if not url: # this is an attachment
+            # VÃ©rifier & mettre Ã  jour le contenu de module dans le cas wiki
+            if wiki and module == 'wiki' and wiki != module:
+                module = wiki
             from trac.attachment import Attachment
             attachment = Attachment(self.env, module, id, file)
             url = attachment.href(req)
@@ -356,14 +366,15 @@
 
 
 class MacroListMacro(WikiMacroBase):
-    """Displays a list of all installed Wiki macros, including documentation if
-    available.
+    u"""Affiche une liste de toutes les macros Wiki installÃ©es, en incluant leur
+    Ã©ventuelle documentation.
     
-    Optionally, the name of a specific macro can be provided as an argument. In
-    that case, only the documentation for that macro will be rendered.
+    Il est Ã©galement possible d'indiquer le nom d'une macro particuliÃ¨re comme 
+    argument. Dans ce cas, seule la documentation de cette macro sera affichÃ©e.
     
-    Note that this macro will not be able to display the documentation of
-    macros if the `PythonOptimize` option is enabled for mod_python!
+    Si l'option `PythonOptimize` est activÃ©e pour mod_python, cette macro 
+    ne sera pas capable d'afficher quelque documentation que ce soit sur les 
+    autres macros. 
     """
 
     def render_macro(self, req, name, content):
@@ -380,7 +391,7 @@
                         descr = wiki_to_html(descr or '', self.env, req)
                     except Exception, e:
                         descr = Markup(system_message(
-                            "Error: Can't get description for macro %s" \
+                            u"Erreur: Impossible de trouver la description de la macro %s" \
                             % macro_name, e))
                     yield (macro_name, descr)
 
@@ -391,12 +402,13 @@
 
 
 class TracIniMacro(WikiMacroBase):
-    """Produce documentation for Trac configuration file.
+    u"""GÃ©nÃ¨re la documentation pour le fichier de configuration de Trac.
 
-    Typically, this will be used in the TracIni page.
-    Optional arguments are a configuration section filter,
-    and a configuration option name filter: only the configuration
-    options whose section and name start with the filters are output.
+    Cette macro est typiquement utilisÃ©e dans la page TracIni.
+    Les arguments optionnels permettre de filtrer une section particuliÃ¨re
+    de configuration et le nom d'une option de cette section.
+    Seules les options dont la section et le nom commencent par les filtres
+    indiquÃ©s sont documentÃ©s. 
     """
 
     def render_macro(self, req, name, filter):
@@ -419,9 +431,9 @@
 
 
 class UserMacroProvider(Component):
-    """Adds macros that are provided as Python source files in the
-    `wiki-macros` directory of the environment, or the global macros
-    directory.
+    u"""Ajoute les macros fournies sous forme de fichiers source Python Ã  partir
+    du rÃ©pertoire `wiki-macros` de l'environnement Trac, ou du rÃ©pertoire 
+    global des macros
     """
     implements(IWikiMacroProvider)
 
@@ -466,4 +478,4 @@
             macro_file = os.path.join(path, name + '.py')
             if os.path.isfile(macro_file):
                 return imp.load_source(name, macro_file)
-        raise TracError, 'Macro %s not found' % name
+        raise TracError, u'Macro %s non trouvÃ©e' % name
diff --exclude=.svn -Naur trac-0.10.4/trac/wiki/model.py trac-0.10.4-PKG/trac/wiki/model.py
--- trac-0.10.4/trac/wiki/model.py	2007-04-20 15:41:49.000000000 +0200
+++ trac-0.10.4-PKG/trac/wiki/model.py	2007-08-24 12:24:26.000000000 +0200
@@ -68,7 +68,7 @@
     exists = property(fget=lambda self: self.version > 0)
 
     def delete(self, version=None, db=None):
-        assert self.exists, 'Cannot delete non-existent page'
+        assert self.exists, u'Impossible de supprimer une page inexistante'
         if not db:
             db = self.env.get_db_cnx()
             handle_ta = True
@@ -131,7 +131,7 @@
             cursor.execute("UPDATE wiki SET readonly=%s WHERE name=%s",
                            (self.readonly, self.name))
         else:
-            raise TracError('Page not modified')
+            raise TracError(u'Aucune modification apportÃ©e Ã  la page')
 
         if handle_ta:
             db.commit()
diff --exclude=.svn -Naur trac-0.10.4/trac/wiki/web_ui.py trac-0.10.4-PKG/trac/wiki/web_ui.py
--- trac-0.10.4/trac/wiki/web_ui.py	2007-04-20 15:41:49.000000000 +0200
+++ trac-0.10.4-PKG/trac/wiki/web_ui.py	2007-08-24 12:28:31.000000000 +0200
@@ -28,7 +28,7 @@
 from trac.util import get_reporter_id
 from trac.util.datefmt import format_datetime, pretty_timedelta
 from trac.util.html import html, Markup
-from trac.util.text import shorten_line
+from trac.util.text import shorten_line, translate
 from trac.versioncontrol.diff import get_diff_options, hdf_diff
 from trac.web.chrome import add_link, add_stylesheet, INavigationContributor
 from trac.web import HTTPNotFound, IRequestHandler
@@ -51,7 +51,7 @@
 
     # IContentConverter methods
     def get_supported_conversions(self):
-        yield ('txt', 'Plain Text', 'txt', 'text/x-trac-wiki', 'text/plain', 9)
+        yield ('txt', u'Texte standard', 'txt', 'text/x-trac-wiki', 'text/plain', 9)
 
     def convert_content(self, req, mimetype, content, key):
         return (content, 'text/plain;charset=utf-8')
@@ -65,9 +65,9 @@
         if not req.perm.has_permission('WIKI_VIEW'):
             return
         yield ('mainnav', 'wiki',
-               html.A('Wiki', href=req.href.wiki(), accesskey=1))
+               html.A(translate(self.env,'Wiki',True), href=req.href.wiki(), accesskey=1))
         yield ('metanav', 'help',
-               html.A('Help/Guide', href=req.href.wiki('TracGuide'),
+               html.A(u'Aide/Guide', href=req.href.wiki('TracGuide'),
                       accesskey=6))
 
     # IPermissionRequestor methods
@@ -79,7 +79,9 @@
     # IRequestHandler methods
 
     def match_request(self, req):
-        match = re.match(r'^/wiki(?:/(.*))?', req.path_info)
+        wiki_base_url = self.config.get('trac', 'wiki_base_url')
+        match_url = r'^/' + wiki_base_url + r'(?:/(.*))?'
+        match = re.match(match_url, req.path_info)
         if match:
             if match.group(1):
                 req.args['page'] = match.group(1)
@@ -127,7 +129,7 @@
         elif action == 'history':
             self._render_history(req, db, page)
         else:
-            req.perm.assert_permission('WIKI_VIEW')            
+            req.perm.assert_permission('WIKI_VIEW')
             format = req.args.get('format')
             if format:
                 Mimeview(self.env).send_converted(req, 'text/x-trac-wiki',
@@ -142,7 +144,7 @@
 
     def get_timeline_filters(self, req):
         if req.perm.has_permission('WIKI_VIEW'):
-            yield ('wiki', 'Wiki changes')
+            yield ('wiki', u'Modifications %s' % translate(self.env,'wiki',False))
 
     def get_timeline_events(self, req, start, stop, filters):
         if 'wiki' in filters:
@@ -155,7 +157,7 @@
                            "FROM wiki WHERE time>=%s AND time<=%s",
                            (start, stop))
             for t,name,comment,author,version in cursor:
-                title = Markup('<em>%s</em> edited by %s',
+                title = Markup(u'<em>%s</em> Ã©ditÃ© par %s',
                                wiki.format_page_name(name), author)
                 diff_link = html.A('diff', href=href.wiki(name, action='diff',
                                                           version=version))
@@ -230,10 +232,10 @@
         for manipulator in self.page_manipulators:
             for field, message in manipulator.validate_wiki_page(req, page):
                 if field:
-                    raise InvalidWikiPage("The Wiki page field %s is invalid: %s"
-                                          % (field, message))
+                    raise InvalidWikiPage(u"Le champ %s de la page %s n'est pas valide: %s"
+                                          % (field, translate(self.env,'wiki',False), message))
                 else:
-                    raise InvalidWikiPage("Invalid Wiki page: %s" % message)
+                    raise InvalidWikiPage(u"Page %s non valide: %s" % (translate(self.env,'wiki',False),message))
 
         page.save(get_reporter_id(req, 'author'), req.args.get('comment'),
                   req.remote_addr)
@@ -266,7 +268,7 @@
         req.perm.assert_permission('WIKI_VIEW')
 
         if not page.exists:
-            raise TracError("Version %s of page %s does not exist" %
+            raise TracError(u"La version %s de la page %s n'existe pas" %
                             (req.args.get('version'), page.name))
 
         add_stylesheet(req, 'common/css/diff.css')
@@ -397,7 +399,7 @@
         req.perm.assert_permission('WIKI_VIEW')
 
         if not page.exists:
-            raise TracError, "Page %s does not exist" % page.name
+            raise TracError, u"La page %s n'existe pas" % page.name
 
         self._set_title(req, page, 'history')
 
@@ -455,21 +457,22 @@
                     }
         else:
             if not req.perm.has_permission('WIKI_CREATE'):
-                raise HTTPNotFound('Page %s not found', page.name)
-            req.hdf['wiki.page_html'] = html.P('Describe "%s" here' % page_name)
+                raise HTTPNotFound(u'La page %s n\'existe pas', page.name)
+            req.hdf['wiki.page_html'] = html.P(u'CrÃ©er la page "%s" ici' % page_name)
 
         # Show attachments
+        wiki_base = self.env.config.get('trac', 'wiki_base_url')
         req.hdf['wiki.attachments'] = attachments_to_hdf(self.env, req, db,
-                                                         'wiki', page.name)
+                                                         wiki_base, page.name)
         if req.perm.has_permission('WIKI_MODIFY'):
-            attach_href = req.href.attachment('wiki', page.name)
+            attach_href = req.href.attachment(wiki_base, page.name)
             req.hdf['wiki.attach_href'] = attach_href
 
     # ISearchSource methods
 
     def get_search_filters(self, req):
         if req.perm.has_permission('WIKI_VIEW'):
-            yield ('wiki', 'Wiki')
+            yield ('wiki', translate(self.env,'Wiki',True))
 
     def get_search_results(self, req, terms, filters):
         if not 'wiki' in filters:
diff --exclude=.svn -Naur trac-0.10.4/wiki-macros/FootNote.py trac-0.10.4-PKG/wiki-macros/FootNote.py
--- trac-0.10.4/wiki-macros/FootNote.py	1970-01-01 01:00:00.000000000 +0100
+++ trac-0.10.4-PKG/wiki-macros/FootNote.py	2007-08-24 15:13:33.000000000 +0200
@@ -0,0 +1,73 @@
+"""Collates and generates foot-notes. Call the macro with the
+foot-note content as the only argument:
+{{{
+   [[FootNote(This is a footnote)]]
+}}}
+Foot-notes are numbered by the order in which they appear. To create a
+reference to an existing foot-note, pass the footnote number as
+argument to the macro:
+{{{
+   [[FootNote(1)]]
+}}}
+In addition, identical foot-notes are coalesced into one entry. The
+following will generate one footnote entry with two references:
+{{{
+   Some text[[FootNote(A footnote)]] and some more text [[FootNote(A footnote)]].
+}}}
+A list of footnotes generated by one or more of the above commands is
+produced by calling the macro without arguments:
+{{{
+   [[FootNote]]
+}}}
+Once a set of footnotes has been displayed, a complete new set of
+footnotes can be created. This allows multiple sets of footnotes per
+page.
+
+"""
+
+from StringIO import StringIO
+from trac.util.html import escape
+from trac.wiki.formatter import wiki_to_oneliner
+
+def unescape(text):
+    """Un-escapes &, <, > and \""""
+    if not text:
+        return ''
+    return str(text).replace('&amp;', '&') \
+        .replace('&lt;', '<') \
+        .replace('&gt;', '>') \
+        .replace('&#34;', '"')
+
+def execute(hdf, args, env):
+    if not hasattr(hdf, 'footnotes'):
+        hdf.footnotes = []
+        hdf.footnote_set = 1
+    # Display and clear footnotes...
+    if not args:
+        out = StringIO()
+        out.write('<div class="footnotes">\n');
+        out.write('<hr style="width: 10%; padding: 0; margin: 2em 0 1em 0;"/>\n');
+        out.write('<ol style="padding: 0 0 0 1em; margin: 0;">\n')
+        for i, v in enumerate(hdf.footnotes):
+            id = "%i.%i" % (hdf.footnote_set, i + 1)
+            out.write(u'<li style="list-style: none;" id="FootNote%s"><a style="font-weight: bold;" href="#FootNoteRef%s">%i.</a> %s</li>\n' % (id, id, i + 1, wiki_to_oneliner(unescape(v), env)))
+        out.write('</ol>\n')
+        out.write('</div>\n');
+        hdf.footnotes = []
+        hdf.footnote_set += 1
+        return out.getvalue()
+    else:
+        id = len(hdf.footnotes) + 1
+        try:
+            id = int(args)
+        except ValueError:
+            existing = None
+            for index, note in enumerate(hdf.footnotes):
+                if args == note:
+                    existing = note
+                    id = index + 1
+                    break
+            if not existing:
+                hdf.footnotes.append(args)
+        full_id = "%i.%i" % (hdf.footnote_set, id)
+        return u'<sup><a title="%s" style="font-size: 8pt; font-weight: bold;" id="FootNoteRef%s" href="#FootNote%s">%i</a></sup>' % (args[:60] + "...", full_id, full_id, id)
diff --exclude=.svn -Naur trac-0.10.4/wiki-macros/HelloWorld.py trac-0.10.4-PKG/wiki-macros/HelloWorld.py
--- trac-0.10.4/wiki-macros/HelloWorld.py	2007-04-20 15:41:43.000000000 +0200
+++ trac-0.10.4-PKG/wiki-macros/HelloWorld.py	2007-09-03 17:10:44.000000000 +0200
@@ -1,4 +1,5 @@
-"""Example macro."""
+# -*- coding: utf-8 -*-
+u"""Exemple de macro."""
 from trac.util import escape
 
 def execute(hdf, txt, env):
@@ -6,10 +7,10 @@
     # From a wiki page
     if hdf:
         hdf['wiki.macro.greeting'] = 'Hello World'
-        
+
     # args will be `None` if the macro is called without parenthesis.
-    args = txt or 'No arguments'
+    args = txt or 'Pas d\'argument'
 
     # then, as `txt` comes from the user, it's important to guard against
     # the possibility to inject malicious HTML/Javascript, by using `escape()`:
-    return 'Hello World, args = ' + escape(args)
+    return u'Bonjour tout le monde !! arguments = ' + escape(args)
diff --exclude=.svn -Naur trac-0.10.4/wiki-macros/Timestamp.py trac-0.10.4-PKG/wiki-macros/Timestamp.py
--- trac-0.10.4/wiki-macros/Timestamp.py	2007-04-20 15:41:43.000000000 +0200
+++ trac-0.10.4-PKG/wiki-macros/Timestamp.py	2007-08-24 12:31:18.000000000 +0200
@@ -1,4 +1,5 @@
-"""Inserts the current time (in seconds) into the wiki page."""
+# -*- coding: utf-8 -*-
+u"""InsÃ¨re la date actuelle (en secondes) sur la page Wiki."""
 
 import time
 def execute(hdf, txt, env):
diff --exclude=.svn -Naur trac-0.10.4/wiki-macros/TracGuideToc.py trac-0.10.4-PKG/wiki-macros/TracGuideToc.py
--- trac-0.10.4/wiki-macros/TracGuideToc.py	2007-04-20 15:41:43.000000000 +0200
+++ trac-0.10.4-PKG/wiki-macros/TracGuideToc.py	2007-08-24 12:32:15.000000000 +0200
@@ -1,7 +1,6 @@
 # -*- coding: utf-8 -*-
-"""
-This macro shows a quick and dirty way to make a table-of-contents for a set
-of wiki pages.
+u"""
+Cette macro affiche d'une faÃ§on simple et efficace la table des matiÃ¨res d'un ensemble de pages Wiki.
 """
 
 TOC = [('TracGuide',                    'Index'),
@@ -29,7 +28,7 @@
 
 def execute(hdf, args, env):
     html = '<div class="wiki-toc">' \
-           '<h4>Table of Contents</h4>' \
+           '<h4>Sommaire</h4>' \
            '<ul>'
     curpage = '%s' % hdf.getValue('wiki.page_name', '')
     lang, page = '/' in curpage and curpage.split('/', 1) or ('', curpage)
