Commits

remram committed 0d55db9

Translated to French.

Comments (0)

Files changed (43)

 Bas Verhoeven (soczol) <bas@bserved.nl>
 Tom Wesley (tomaw) <tom@tomaw.org>
 Jason Hill (SecretAgent) <secrtagnt@gmail.com>
+
+French translation:
+
+RĂŠmi Rampin (Remram) <remirampin@gmail.com>
 #!/usr/bin/env python
+# coding: utf-8
+
 import dependencies
 dependencies.vcheck()
 
     p = subprocess.Popen(["java", "-jar", "bin/yuicompressor-2.4.2.jar", src], stdout=subprocess.PIPE)
   except Exception, e:
     if hasattr(e, "errno") and e.errno == 2:
-      raise MinifyException, "unable to run java"
+      raise MinifyException, "impossible de lancer java"
     raise
   data = p.communicate()[0]
   if p.wait() != 0:
-    raise MinifyException, "an error occured"
+    raise MinifyException, "une erreur a eu lieu"
   return data
 
 JAVA_WARNING_SURPRESSED = False
     global JAVA_WARNING_SURPRESSED
     if not JAVA_WARNING_SURPRESSED:
       JAVA_WARNING_SURPRESSED = True
-      print >>sys.stderr, "warning: minify: %s (not minifying -- javascript will be HUGE)." % e
+      print >>sys.stderr, "avertissement: minify: %s (pas de minification -- le javascript va ętre ENORME)." % e
     try:
       f = open(o, "rb")
       compiled = f.read()
   if has_compiled():
     return
     
-  print >>sys.stderr, "error: not yet compiled, run compile.py first."
+  print >>sys.stderr, "erreur: pas encore compilé, lancez compile.py d'abord."
   sys.exit(1)
   
 if __name__ == "__main__":

bin/dependencies.py

+# coding: utf-8
+
 import sys
 
 def check_dependencies():
     
   major, minor = sys.version_info[:2]
   if major >= 3:
-    fail("qwebirc cannot run on python >=3 yet, install python 2.6.X:\nhttp://www.python.org/download/")
+    fail("qwebirc ne peut pas tourner sous python >=3 pour l'instant, installez python 2.6.X :\nhttp://www.python.org/download/")
     
   if major < 2 or minor < 5:
-    fail("qwebirc requires python 2.5, you have: %s, install python 2.6.X:\nhttp://www.python.org/download/" % ".".join(map(str, sys.version_info[:3])))
+    fail("qwebirc nĂŠcessite python 2.5, vous avez : %s, installez python 2.6.X :\nhttp://www.python.org/download/" % ".".join(map(str, sys.version_info[:3])))
 	
   # this is done so we can use Python 2.5 syntax...
   import dependencies_b
   
 def vcheck():
   if not has_checked():
-    sys.stderr.write("first run, checking dependencies...\n")
+    sys.stderr.write("premier lancement, vĂŠrification des dĂŠpendances...\n")
     sys.stderr.flush()
     check_dependencies()
 

bin/dependencies_b.py

+# coding: utf-8
 # this is seperate to allow us to use python 2.5 syntax without
 # the dependency checker breaking on earlier versions.
 
   sys.exit(1)
   
 def warn(*message):
-  print >>sys.stderr, "warning:", "\nwarning: ".join(message), "\n"
+  print >>sys.stderr, "avertissement:", "\avertissement: ".join(message), "\n"
 
 def check_dependencies():
   i = 0
   i+=check_java()
   i+=check_hg()
   
-  print "0 errors, %d warnings." % i
+  print "0 erreurs, %d avertissements." % i
   
   if i == 0:
-    print "looks like you've got everything you need to run qwebirc!"
+    print "apparemment vous avez tout ce qu'il faut pour lancer qwebirc !"
   else:
-    print "you can run qwebirc despite these."
+    print "vous pouvez lancer qwebirc malgré cela."
 
   f = open(".checked", "w")
   f.close()
   try:
     import win32con
   except ImportError:
-    fail("qwebirc requires pywin32, see:", "http://sourceforge.net/project/showfiles.php?group_id=78018")
+    fail("qwebirc nécessite pywin32, cf :", "http://sourceforge.net/project/showfiles.php?group_id=78018")
   
 def check_java():
   def java_warn(specific):
-    warn(specific, "java is not required, but allows qwebirc to compress output,", "making it faster to download.", "you can get java at http://www.java.com/")
+    warn(specific, "java n'est pas nécessaire, mais permet ŕ qwebirc d'utiliser la compression,", "rendant les téléchargements plus rapides.", "vous pouvez obtenir java ŕ http://www.java.com/")
     
   try:
     p = subprocess.Popen(["java", "-version"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
     p.communicate()
     if p.wait() != 0:
-      java_warn("something went wrong looking for java.")
+      java_warn("il y a eu un problčme pendant la recherche de java.")
       return 1
   except: # ugh
-    java_warn("couldn't find java.")
+    java_warn("impossible de trouver java.")
     return 1
     
   return 0
   
 def check_hg():
   def hg_warn(specific):
-    warn(specific, "mercurial (hg) is not required, but allows qwebirc to save bandwidth by versioning.", "you can get hg at http://www.selenic.com/mercurial/")
+    warn(specific, "mercurial (hg) n'est pas nécessaire, mais permet ŕ qwebirc d'économiser de la bande passante en versionnant.", "vous pouvez obtenir hg ŕ http://www.selenic.com/mercurial/")
     
   try:
     p = subprocess.Popen(["hg", "id"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
     p.communicate()
     if p.wait() != 0:
-      hg_warn("something went wrong looking for mercurial.")
+      hg_warn("il y a eu un problčme pendant la recherche de mercurial.")
       return 1
   except: # ugh
-    hg_warn("couldn't find mercurial.")
+    hg_warn("impossible de trouver mercurial.")
     return 1
     
   return 0
     from zope.interface import Interface
   except ImportError:
     if sys.platform.startswith("win"):
-      fail("qwebirc requires zope interface",
-           "see pypi: http://pypi.python.org/pypi/zope.interface")
+      fail("qwebirc nécessite l'interface zope.",
+           "cf pypi : http://pypi.python.org/pypi/zope.interface")
     else:
-      fail("qwebirc requires zope interface.",
-           "this should normally come with twisted, but can be downloaded",
-           "from pypi: http://pypi.python.org/pypi/zope.interface")
+      fail("qwebirc nécessite l'interface zope.",
+           "cela devrait ętre inclu avec twisted, mais peut ętre téléchargé",
+           "depuis pypi : http://pypi.python.org/pypi/zope.interface")
            
 def check_twisted():
   try:
     import twisted
   except ImportError:
-    fail("qwebirc requires twisted (at least 8.2.0), see http://twistedmatrix.com/")
+    fail("qwebirc nécessite twisted (au moins 8.2.0), voyez http://twistedmatrix.com/")
 
   def twisted_fail(x, y=None):
-    fail("you don't seem to have twisted's %s module." % x,
-         "your distro is most likely modular, look for a twisted %s package%s." % (x, " %s" % y if y else "",))
+    fail("vous n'avez pas l'air d'avoir le module twisted %s." % x,
+         "votre distribution est probablement modulaire, cherchez un package twisted %s%s." % (x, " %s" % y if y else "",))
 
   try:
     import twisted.names
   try:
     import twisted.web
   except ImportError:
-    twisted_fail("web", "(not web2)")
+    twisted_fail("web", "(pas web2)")
 
   try:
     import twisted.words
 def check_json():
   import qwebirc.util.qjson
   if qwebirc.util.qjson.slow:
-    warn("simplejson module with C speedups not installed.",
-         "using embedded module (slower); consider installing simplejson from:",
+    warn("le module simplejson avec les accélérations C n'est pas installé.",
+         "utilisation d'un module plus lent ; considérez l'installation de simplejson depuis :",
          "http://pypi.python.org/pypi/simplejson/")
     return 1
   return 0
 #!/usr/bin/env python
+# coding: utf-8
 import compile, pages, sys, os, shutil, compileall
 
 def trymkdir(*dir):
         
 def main():
   if len(sys.argv) < 2:
-    print >>sys.stderr, "syntax: %s [destination directory]" % sys.argv[0]
+    print >>sys.stderr, "syntaxe : %s [répertoire de destination]" % sys.argv[0]
     sys.exit(0)
   DEST = sys.argv[1]
   
   copy("config.py.example", DEST)
   
   if os.path.exists("config.py"):
-    print "NOT copying current config.py!"
+    print "PAS de copie du config.py actuel !"
     #copy("config.py", DEST)
   
 if __name__ == "__main__":
+# coding: utf-8
 import os, sys, pages, subprocess, re, optionsgen, config
 
 class HGException(Exception):
     p = subprocess.Popen(["hg", "id"], stdout=subprocess.PIPE)
   except Exception, e:
     if hasattr(e, "errno") and e.errno == 2:
-      raise HGException, "unable to execute"
-    raise HGException, "unknown exception running hg: %s" % repr(e)
+      raise HGException, "impossible d'exécuter"
+    raise HGException, "exception inconnue en lançant hg : %s" % repr(e)
     
   data = p.communicate()[0]
   if p.wait() != 0:
     try:
       HGID =  _gethgid()
     except HGException, e:
-      print >>sys.stderr, "warning: hg: %s (using a random id)." % e
+      print >>sys.stderr, "avertissement: hg: %s (utilisation d'un id aléatoire)." % e
       HGID = os.urandom(10).encode("hex")
   return HGID
     

dummyauthgate/__init__.py

+# coding: utf-8
+
 class DummyImplementation(object):
   def __init__(self, *args, **kwargs):
     pass
     
   def __getattr__(self, *args, **kwargs):
-    raise Exception, "Not implemented."
+    raise Exception, "Non implémenté."
     
   def login_optional(self, *args, **kwargs):
     return None

esimplejson/__init__.py

+# coding: utf-8
+
 r"""
 A simple, fast, extensible JSON encoder and decoder
 
     demjson, python-cjson API compatibility hook. Use loads(s) instead.
     """
     import warnings
-    warnings.warn("simplejson.loads(s) should be used instead of decode(s)",
+    warnings.warn("simplejson.loads(s) devrait ętre utilisé au lieu de decode(s)",
         DeprecationWarning)
     return loads(s)
 
     demjson, python-cjson compatibility hook. Use dumps(s) instead.
     """
     import warnings
-    warnings.warn("simplejson.dumps(s) should be used instead of encode(s)",
+    warnings.warn("simplejson.dumps(s) devrait ętre utilisé au lieu de encode(s)",
         DeprecationWarning)
     return dumps(obj)
 
     Use loads(s) instead.
     """
     import warnings
-    warnings.warn("simplejson.loads(s) should be used instead of read(s)",
+    warnings.warn("simplejson.loads(s) devrait ętre utilisé au lieu de read(s)",
         DeprecationWarning)
     return loads(s)
 
     Use dumps(s) instead.
     """
     import warnings
-    warnings.warn("simplejson.dumps(s) should be used instead of write(s)",
+    warnings.warn("simplejson.dumps(s) devrait ętre utilisé au lieu de write(s)",
         DeprecationWarning)
     return dumps(obj)
 
         infile = open(sys.argv[1], 'rb')
         outfile = open(sys.argv[2], 'wb')
     else:
-        raise SystemExit("%s [infile [outfile]]" % (sys.argv[0],))
+        raise SystemExit("%s [source [cible]]" % (sys.argv[0],))
     try:
         obj = load(infile)
     except ValueError, e:

esimplejson/decoder.py

+# coding: utf-8
+
 """
 Implementation of JSONDecoder
 """
 def errmsg(msg, doc, pos, end=None):
     lineno, colno = linecol(doc, pos)
     if end is None:
-        return '%s: line %d column %d (char %d)' % (msg, lineno, colno, pos)
+        return '%s: ligne %d colonne %d (caractčre %d)' % (msg, lineno, colno, pos)
     endlineno, endcolno = linecol(doc, end)
-    return '%s: line %d column %d - line %d column %d (char %d - %d)' % (
+    return '%s: ligne %d colonne %d - ligne %d colonne %d (caractčre %d - %d)' % (
         msg, lineno, colno, endlineno, endcolno, pos, end)
 
 
         chunk = _m(s, end)
         if chunk is None:
             raise ValueError(
-                errmsg("Unterminated string starting at", s, begin))
+                errmsg("Chaîne non-terminée commençant ŕ", s, begin))
         end = chunk.end()
         content, terminator = chunk.groups()
         if content:
             break
         elif terminator != '\\':
             if strict:
-                raise ValueError(errmsg("Invalid control character %r at", s, end))
+                raise ValueError(errmsg("Caractčre de contrôle invalide %r ŕ", s, end))
             else:
                 _append(terminator)
                 continue
             esc = s[end]
         except IndexError:
             raise ValueError(
-                errmsg("Unterminated string starting at", s, begin))
+                errmsg("Chaîne non-terminée commençant ŕ", s, begin))
         if esc != 'u':
             try:
                 m = _b[esc]
             except KeyError:
                 raise ValueError(
-                    errmsg("Invalid \\escape: %r" % (esc,), s, end))
+                    errmsg("\\Echappement invalide : %r" % (esc,), s, end))
             end += 1
         else:
             esc = s[end + 1:end + 5]
             next_end = end + 5
-            msg = "Invalid \\uXXXX escape"
+            msg = "Echappement \\uXXXX invalide"
             try:
                 if len(esc) != 4:
                     raise ValueError
                 uni = int(esc, 16)
                 if 0xd800 <= uni <= 0xdbff and sys.maxunicode > 65535:
-                    msg = "Invalid \\uXXXX\\uXXXX surrogate pair"
+                    msg = "Séquence de deux octets \\uXXXX\\uXXXX invalide"
                     if not s[end + 5:end + 7] == '\\u':
                         raise ValueError
                     esc2 = s[end + 7:end + 11]
     if nextchar == '}':
         return pairs, end + 1
     if nextchar != '"':
-        raise ValueError(errmsg("Expecting property name", s, end))
+        raise ValueError(errmsg("Nom de propriété attendu", s, end))
     end += 1
     encoding = getattr(context, 'encoding', None)
     strict = getattr(context, 'strict', True)
         key, end = scanstring(s, end, encoding, strict)
         end = _w(s, end).end()
         if s[end:end + 1] != ':':
-            raise ValueError(errmsg("Expecting : delimiter", s, end))
+            raise ValueError(errmsg("Délimiteur : attendu", s, end))
         end = _w(s, end + 1).end()
         try:
             value, end = iterscan(s, idx=end, context=context).next()
         except StopIteration:
-            raise ValueError(errmsg("Expecting object", s, end))
+            raise ValueError(errmsg("Objet attendu", s, end))
         pairs[key] = value
         end = _w(s, end).end()
         nextchar = s[end:end + 1]
         if nextchar == '}':
             break
         if nextchar != ',':
-            raise ValueError(errmsg("Expecting , delimiter", s, end - 1))
+            raise ValueError(errmsg("Délimiteur , attendu", s, end - 1))
         end = _w(s, end).end()
         nextchar = s[end:end + 1]
         end += 1
         if nextchar != '"':
-            raise ValueError(errmsg("Expecting property name", s, end - 1))
+            raise ValueError(errmsg("Nom de propriété attendu", s, end - 1))
     object_hook = getattr(context, 'object_hook', None)
     if object_hook is not None:
         pairs = object_hook(pairs)
         try:
             value, end = iterscan(s, idx=end, context=context).next()
         except StopIteration:
-            raise ValueError(errmsg("Expecting object", s, end))
+            raise ValueError(errmsg("Objet attendu", s, end))
         values.append(value)
         end = _w(s, end).end()
         nextchar = s[end:end + 1]
         if nextchar == ']':
             break
         if nextchar != ',':
-            raise ValueError(errmsg("Expecting , delimiter", s, end))
+            raise ValueError(errmsg("Délimiteur , attendu", s, end))
         end = _w(s, end).end()
     return values, end
 pattern(r'\[')(JSONArray)
         obj, end = self.raw_decode(s, idx=_w(s, 0).end())
         end = _w(s, end).end()
         if end != len(s):
-            raise ValueError(errmsg("Extra data", s, end, len(s)))
+            raise ValueError(errmsg("Données supplémentaires", s, end, len(s)))
         return obj
 
     def raw_decode(self, s, **kw):
         try:
             obj, end = self._scanner.iterscan(s, **kw).next()
         except StopIteration:
-            raise ValueError("No JSON object could be decoded")
+            raise ValueError("Aucun objet JSON n'a pu ętre décodé")
         return obj, end
 
 __all__ = ['JSONDecoder']

esimplejson/encoder.py

+# coding: utf-8
+
 """
 Implementation of JSONEncoder
 """
         return FLOAT_REPR(o)
 
     if not allow_nan:
-        raise ValueError("Out of range float values are not JSON compliant: %r"
+        raise ValueError("Les floats en dehors des limits ne sont pas conformes en JSON : %r"
             % (o,))
 
     return text
         if markers is not None:
             markerid = id(lst)
             if markerid in markers:
-                raise ValueError("Circular reference detected")
+                raise ValueError("Référence circulaire détectée")
             markers[markerid] = lst
         yield '['
         if self.indent is not None:
         if markers is not None:
             markerid = id(dct)
             if markerid in markers:
-                raise ValueError("Circular reference detected")
+                raise ValueError("Référence circulaire détectée")
             markers[markerid] = dct
         yield '{'
         key_separator = self.key_separator
             elif self.skipkeys:
                 continue
             else:
-                raise TypeError("key %r is not a string" % (key,))
+                raise TypeError("la clef %r n'est pas une chaîne" % (key,))
             if first:
                 first = False
             else:
             if markers is not None:
                 markerid = id(o)
                 if markerid in markers:
-                    raise ValueError("Circular reference detected")
+                    raise ValueError("Référence circulaire détectée")
                 markers[markerid] = o
             for chunk in self._iterencode_default(o, markers):
                 yield chunk
                     return list(iterable)
                 return JSONEncoder.default(self, o)
         """
-        raise TypeError("%r is not JSON serializable" % (o,))
+        raise TypeError("%r n'est pas sérialisable en JSON" % (o,))
 
     def encode(self, o):
         """

js/irc/baseircclient.js

 
 qwebirc.irc.RegisteredCTCPs = {
   "VERSION": function(x) {
-    return "qwebirc v" + qwebirc.VERSION + ", copyright (C) 2008-2011 Chris Porter and the qwebirc project -- " + qwebirc.util.browserVersion();
+    return "qwebirc v" + qwebirc.VERSION + ", copyright (C) 2008-2011 Chris Porter and the qwebirc project, French translation by RĂŠmi Rampin -- " + qwebirc.util.browserVersion();
   },
   "USERINFO": function(x) { return "qwebirc"; },
   "TIME": function(x) { return qwebirc.irc.IRCDate(new Date()); },
       this.connected();
     } else if(message == "disconnect") {
       if(data.length == 0) {
-        this.disconnected("No error!");
+        this.disconnected("Pas d'erreur !");
       } else {
         this.disconnected(data[1]);
       }

js/irc/commandparser.js

       
       var w = this.getActiveWindow();
       if(activewin && ((w.type != qwebirc.ui.WINDOW_CHANNEL) && (w.type != qwebirc.ui.WINDOW_QUERY))) {
-        w.errorMessage("Can't use this command in this window");
+        w.errorMessage("Vous ne pouvez pas utiliser de commande dans cette fenĂŞtre");
         return;
       }
     
            ((args != undefined) && (minargs > args.length)) ||
            ((args == undefined) && (minargs > 0))
          )) {
-        w.errorMessage("Insufficient arguments for command.");
+        w.errorMessage("Pas assez d'arguments pour cette commande");
         return;
       }
       
     
     var window = this.getActiveWindow();
     if(window.type != qwebirc.ui.WINDOW_CHANNEL && window.type != qwebirc.ui.WINDOW_QUERY && window.type != qwebirc.ui.WINDOW_STATUS) {
-      w.errorMessage("Can't use this command in this window");
+      w.errorMessage("Vous ne pouvez pas utiliser de commande dans cette fenĂŞtre");
       return;
     }
     

js/irc/commands.js

   newUIWindow: function(property) {
     var p = this.parentObject.ui[property];
     if(!$defined(p)) {
-      this.getActiveWindow().errorMessage("Current UI does not support that command.");
+      this.getActiveWindow().errorMessage("L'UI actuelle ne suppose pas cette commande.");
     } else {
       p.bind(this.parentObject.ui)();
     }
   }],
   cmd_QUERY: [false, 2, 1, function(args) {
     if(this.parentObject.isChannel(args[0])) {
-      this.getActiveWindow().errorMessage("Can't target a channel with this command.");
+      this.getActiveWindow().errorMessage("Impossible de viser un salon avec cette commande.");
       return;
     }
 
   cmd_CYCLE: [true, 1, 0, function(args) {
     var c = this.getActiveWindow().name;
     
-    this.send("PART " + c + " :" + (args?args[0]:"rejoining. . ."));
+    this.send("PART " + c + " :" + (args?args[0]:"je reviens..."));
     this.send("JOIN " + c);
   }],
   cmd_JOIN: [false, 2, 1, function(args) {
 
     if(warn) {
       var delayinfo = function() {
-        this.getActiveWindow().infoMessage("Channel names begin with # (corrected automatically).");
+        this.getActiveWindow().infoMessage("Les noms de salons commence par # (corrigĂŠ automatiquement).");
       }.bind(this).delay(250);
     }
       
     
     if(w.type != qwebirc.ui.WINDOW_CHANNEL) {
       if(!args || args.length == 0) {
-        w.errorMessage("Insufficient arguments for command.");
+        w.errorMessage("Pas assez d'arguments pour cette commande.");
         return;
       }
       channel = args[0];  

js/irc/ircclient.js

       if(qwebirc.auth.loggedin() && this.ui.uiOptions.USE_HIDDENHOST) {
         var d = function() {
           if($defined(this.activeTimers.autojoin))
-            this.ui.getActiveWindow().infoMessage("Waiting for login before joining channels...");
+            this.ui.getActiveWindow().infoMessage("En attente de login avant de rejoindre les salons...");
         }.delay(5, this);
         this.activeTimers.autojoin = function() {
           var w = this.ui.getActiveWindow();
-          w.errorMessage("No login response in 10 seconds.");
-          w.errorMessage("You may want to try authing manually and then type: /autojoin (if you don't auth your host may be visible).");
+          w.errorMessage("Pas de rĂŠponse au login en 10 secondes.");
+          w.errorMessage("Vous pourriez vouloir vous identifier manuellement puis entrer : /autojoin (si vous ne vous enregistrez pas, votre hĂ´te pourrait ĂŞtre visible).");
         }.delay(10000, this);
         return;
       }
       if($defined(this.loginRegex) && message.match(this.loginRegex)) {
         $clear(this.activeTimers.autojoin);
         delete this.activeTimers["autojoin"];
-        this.ui.getActiveWindow().infoMessage("Joining channels...");
+        this.ui.getActiveWindow().infoMessage("EntrĂŠe dans les salons...");
         this.exec("/AUTOJOIN");
       }
     }

js/irc/ircconnection.js

       
     if(floodProtection && !this.disconnected && this.__isFlooding()) {
       this.disconnect();
-      this.__error("BUG: uncontrolled flood detected -- disconnected.");
+      this.__error("BUG : flood incontrĂ´lĂŠ dĂŠtectĂŠ -- dĂŠconnectĂŠ.");
     }
     
     var asynchronous = true;
         
         if(!this.disconnected) {
           this.disconnected = true;
-          this.__error("An error occured: " + o[1]);
+          this.__error("Une erreur a eu lieu : " + o[1]);
         }
         return false;
       }
     if(o[0] == false) {
       if(!this.disconnected) {
         this.disconnected = true;
-        this.__error("An error occured: " + o[1]);
+        this.__error("Une erreur a eu lieu : " + o[1]);
       }
       return false;
     }
     if(this.__retryAttempts++ >= this.options.maxRetries && !this.disconnected) {
       this.disconnect();
       
-      this.__error("Error: connection closed after several requests failed.");
+      this.__error("Erreur : connexion terminÊe après l'Êchec de plusieurs requêtes.");
       return false;
     }
     
     r.addEvent("complete", function(o) {
       if(!o) {
         this.disconnected = true;
-        this.__error("Couldn't connect to remote server.");
+        this.__error("Impossible de se connecter au serveur.");
         return;
       }
       if(o[0] == false) {
         this.disconnect();
-        this.__error("An error occured: " + o[1]);
+        this.__error("Une erreur a eu lieu : " + o[1]);
         return;
       }
       this.sessionid = o[1];
 qwebirc.irc.IRCDate = function(d) {
   var pad = qwebirc.util.pad;
   
-  return qwebirc.util.DaysOfWeek[d.getDay()] + " " + qwebirc.util.MonthsOfYear[d.getMonth()] + " " + pad(d.getDate()) + " "  + pad(d.getHours()) + ":" + pad(d.getMinutes()) + ":" + pad(d.getSeconds()) + " " + d.getFullYear();
+  return qwebirc.util.DaysOfWeek[d.getDay()] + " " + pad(d.getDate()) + " " + qwebirc.util.MonthsOfYear[d.getMonth()] + " " + d.getFullYear() + " "  + pad(d.getHours()) + ":" + pad(d.getMinutes()) + ":" + pad(d.getSeconds());
 }
 
 qwebirc.irc.toIRCCompletion = function(client, data) {
 }
 
 qwebirc.util.DaysOfWeek = {
-  0: "Sun",
-  1: "Mon",
-  2: "Tue",
-  3: "Wed",
-  4: "Thu",
-  5: "Fri",
-  6: "Sat"
+  0: "Dim",
+  1: "Lun",
+  2: "Ma",
+  3: "Me",
+  4: "Je",
+  5: "Ve",
+  6: "Sam"
 };
 
 qwebirc.util.MonthsOfYear = {
   0: "Jan",
-  1: "Feb",
-  2: "Mar",
-  3: "Apr",
-  4: "May",
-  5: "Jun",
-  6: "Jul",
-  7: "Aug",
+  1: "Fev",
+  2: "Mars",
+  3: "Avr",
+  4: "Mai",
+  5: "Juin",
+  6: "Juil",
+  7: "AoĂťt",
   8: "Sep",
   9: "Oct",
   10: "Nov",
-  11: "Dec"
+  11: "DĂŠc"
 };
 
 qwebirc.util.NBSPCreate = function(text, element) {
   var hours = Math.floor((l % (3600 * 24)) / 3600);
   var days = Math.floor(l / (24*3600));
   
-  return days + " days " + hours + " hours " + minutes + " minutes " + seconds + " seconds";
+  return days + " jours " + hours + " heures " + minutes + " minutes " + seconds + " secondes";
 }
 
 qwebirc.util.pad = function(x) {

js/qwebircinterface.js

 function qwebirc_ui_onbeforeunload(e) { /* IE sucks */
-  var message = "This action will close all active IRC connections.";
+  var message = "Cette action va fermer toutes les connexions IRC actives.";
   var e = e || window.event;
   if(e)
     e.returnValue = message;
   options: {
     initialNickname: "qwebirc" + Math.ceil(Math.random() * 100000),
     initialChannels: "",
-    networkName: "ExampleNetwork",
+    networkName: "ReseauDExemple",
     networkServices: [],
     loginRegex: null,
-    appTitle: "ExampleNetwork Web IRC",
+    appTitle: "ReseauDExemple Web IRC",
     searchURL: true,
     theme: undefined,
     baseURL: null,
         IRC.connect();
         window.onbeforeunload = qwebirc_ui_onbeforeunload;
         window.addEvent("unload", function() {
-          IRC.quit("Page closed");
+          IRC.quit("Page fermĂŠe");
         });
       };
 
       return;
     var schemeComponents = url.splitMax(":", 2);
     if(schemeComponents[0].toLowerCase() != "irc" && schemeComponents[0].toLowerCase() != "ircs") {
-      alert("Bad IRC URL scheme.");
+      alert("Mauvais schĂŠma d'URL IRC.");
       return;
     }
 
     
     if(needkey) {
       if(!$defined(key))
-        key = prompt("Please enter the password for channel " + channel + ":");
+        key = prompt("Merci d'entrer le mot de passe pour le canal " + channel + " :");
       if($defined(key))
         channel = channel + " " + key;
     }
     
     if(not_supported.length > 0)
-      alert("The following IRC URL components were not accepted: " + not_supported.join(", ") + ".");
+      alert("Les composants d'URL IRC n'ont pas ĂŠtĂŠ acceptĂŠs : " + not_supported.join(", ") + ".");
     
     return channel;
   }
       w.addLine("", "Copyright (C) 2008-2011 Chris Porter and the qwebirc project.");
       w.addLine("", "http://www.qwebirc.org");
       w.addLine("", "Licensed under the GNU General Public License, Version 2.");
+      w.addLine("", "French translation by RĂŠmi Rampin.");
     }
     return w;
   },
     d.setSubWindow(ew);
   },
   embeddedWindow: function() {
-    this.addCustomWindow("Add webchat to your site", qwebirc.ui.EmbedWizard, "embeddedwizard", {baseURL: this.options.baseURL, uiOptions: this.uiOptions, optionsCallback: function() {
+    this.addCustomWindow("Ajoutez un webchat Ă  votre site", qwebirc.ui.EmbedWizard, "embeddedwizard", {baseURL: this.options.baseURL, uiOptions: this.uiOptions, optionsCallback: function() {
       this.optionsWindow();
     }.bind(this)});
   },
     this.addCustomWindow("Options", qwebirc.ui.OptionsPane, "optionspane", this.uiOptions);
   },
   aboutWindow: function() {
-    this.addCustomWindow("About", qwebirc.ui.AboutPane, "aboutpane", this.uiOptions);
+    this.addCustomWindow("A propos", qwebirc.ui.AboutPane, "aboutpane", this.uiOptions);
   },
   privacyWindow: function() {
-    this.addCustomWindow("Privacy policy", qwebirc.ui.PrivacyPolicyPane, "privacypolicypane", this.uiOptions);
+    this.addCustomWindow("ConfidentialitĂŠ", qwebirc.ui.PrivacyPolicyPane, "privacypolicypane", this.uiOptions);
   },
   feedbackWindow: function() {
-    this.addCustomWindow("Feedback", qwebirc.ui.FeedbackPane, "feedbackpane", this.uiOptions);
+    this.addCustomWindow("Remarques", qwebirc.ui.FeedbackPane, "feedbackpane", this.uiOptions);
   },
   faqWindow: function() {
     this.addCustomWindow("FAQ", qwebirc.ui.FAQPane, "faqpane", this.uiOptions);
     this.postInitialize();
 
     /* I'd prefer something shorter and snappier! */
-    var w = this.newCustomWindow("Connection details", true, qwebirc.ui.WINDOW_CONNECT);
+    var w = this.newCustomWindow("Infos de connexion", true, qwebirc.ui.WINDOW_CONNECT);
     var callback = function(args) {
       w.close();
       callbackfn(args);
   logout: function() {
     if(!qwebirc.auth.loggedin())
       return;
-    if(confirm("Log out?")) {
+    if(confirm("Se dĂŠconnecter ?")) {
       for(var client in this.clients) {
         this.clients[client].quit("Logged out");
       };

js/ui/frontends/qui.js

   __createDropdownHint: function() {
     var dropdownhint = new Element("div");
     dropdownhint.addClass("dropdownhint");
-    dropdownhint.set("text", "Click the icon for the main menu.");
+    dropdownhint.set("text", "Cliquez l'icĂ´ne pour le menu principal.");
     dropdownhint.setStyle("top", this.outerTabs.getSize().y + 5);
 
     this.parentElement.appendChild(dropdownhint);
     if(!this.client.nickOnChanHasPrefix(this.client.nickname, this.name, "@")) {
 /*      var cmodes = this.client.getChannelModes(channel);
       if(cmodes.indexOf("t")) {*/
-        alert("Sorry, you need to be a channel operator to change the topic!");
+        alert("DĂŠsolĂŠ, vous devez ĂŞtre opĂŠrateur du salon pour changer le sujet !");
         return;
       /*}*/
     }
-    var newTopic = prompt("Change topic of " + this.name + " to:", this.topic.topicText);
+    var newTopic = prompt("Changement de sujet de " + this.name + " pour :", this.topic.topicText);
     if(newTopic === null)
       return;
 
     } else {
       t.topicText = topic;
       var e = new Element("div");
-      e.set("text", "(no topic set)");
+      e.set("text", "(pas de sujet)");
       e.addClass("emptytopic");
       t.appendChild(e);
     }

js/ui/menuitems.js

 qwebirc.ui.UI_COMMANDS = [
   ["Options", "options"],
-  ["Add webchat to your site", "embedded"],
-  ["Privacy policy", "privacy"],
-  ["Feedback", "feedback"],
-  ["Frequently asked questions", "faq"],
-  ["About qwebirc", "about"]
+  ["Ajoutez un webchat Ă  votre site", "embedded"],
+  ["ConfidentialitĂŠ", "privacy"],
+  ["Remarques", "feedback"],
+  ["Questions frĂŠquentes", "faq"],
+  ["A propos de qwebirc", "about"]
 ];
 
 qwebirc.ui.MENU_ITEMS = function() {
     },
     {
       text: "kick", /* TODO: disappear when we're deopped */
-      fn: function(nick) { this.client.exec("/KICK " + nick + " wibble"); },
+      fn: function(nick) { this.client.exec("/KICK " + nick + " Dehors !"); },
       predicate: isOpped
     },
     {

js/ui/notifications.js

     var flashA = function() {
       this.hideFavIcon();
       this.canUpdateTitle = false;
-      document.title = "Activity!";
+      document.title = "Activité !";
       
       this.flasher = flashB.delay(500);
     }.bind(this);

js/ui/panes/about.js

 qwebirc.ui.AboutPane = new Class({
   Implements: [Events],
   initialize: function(parent) {
-    var delayfn = function() { parent.set("html", "<div class=\"loading\">Loading. . .</div>"); };
+    var delayfn = function() { parent.set("html", "<div class=\"loading\">Chargement. . .</div>"); };
     var cb = delayfn.delay(500);
     
     var r = qwebirc.ui.RequestTransformHTML({url: qwebirc.global.staticBaseURL + "panes/about.html", update: parent, onSuccess: function() {

js/ui/panes/connect.js

   
   var c = initialChannels.split(" ")[0].split(",");
   
-  text.appendChild(document.createTextNode("To connect to " + networkName + " IRC and join channel" + ((c.length>1)?"s":"") + " "));
+  var tr_plural = ((c.length>1)?"s":"");
+  text.appendChild(document.createTextNode("Pour vous connecter Ă  l'IRC " + networkName + " et rejoindre le" + tr_plural + " salon" + tr_plural + " "));
 
   for(var i=0;i<c.length;i++) {
     if((c.length > 1) && (i == c.length - 1)) {
     text.appendChild(nick);
   }
   
-  text.appendChild(document.createTextNode(" click 'Connect'."));
+  text.appendChild(document.createTextNode(" cliquez sur 'Se connecter'."));
   text.appendChild(new Element("br"));
   if(qwebirc.auth.enabled() && qwebirc.auth.quakeNetAuth() && !qwebirc.auth.loggedin())
-    text.appendChild(document.createTextNode("If you'd like to connect using your Q auth click 'Log in'."));
+    text.appendChild(document.createTextNode("Si vous voulez vous authentifier auprès de Q auth cliquez sur 'S'enregistrer'."));
 
   var tr = new Element("tr");
   tbody.appendChild(tr);
   
   var td = new Element("td");
   tr.appendChild(td);
-  td.set("html", "<h1>Connect to " + networkName + " IRC</h1>");  
+  td.set("html", "<h1>Se connecter Ă  l'IRC " + networkName + "</h1>");  
     
   var tr = new Element("tr");
   tbody.appendChild(tr);
   }
 
   var nick = new Element("input");
-  createRow("Nickname:", nick);
+  createRow("Nom :", nick);
   
   var chanStyle = null;
   if(qwebirc.auth.enabled() && qwebirc.auth.bouncerAuth())
     chanStyle = {display: "none"};
   
   var chan = new Element("input");
-  createRow("Channels:", chan, chanStyle);
+  createRow("Salons :", chan, chanStyle);
 
   if(qwebirc.auth.enabled()) {
     if(qwebirc.auth.passAuth()) {
-      var authRow = createRow("Auth to services:");
+      var authRow = createRow("Authentification auprès des services :");
       var authCheckBox = qwebirc.util.createInput("checkbox", authRow, "connect_auth_to_services", false);
     
       var usernameBox = new Element("input");
-      var usernameRow = createRow("Username:", usernameBox, {display: "none"})[0];
+      var usernameRow = createRow("Utilisateur :", usernameBox, {display: "none"})[0];
     
-      var passwordRow = createRow("Password:", null, {display: "none"});
+      var passwordRow = createRow("Mot de passe :", null, {display: "none"});
       var passwordBox = qwebirc.util.createInput("password", passwordRow[1], "connect_auth_password");
 
       authCheckBox.addEvent("click", function(e) { qwebirc.ui.authShowHide(authCheckBox, authRow, usernameBox, usernameRow, passwordRow[0]) });
     } else if(qwebirc.auth.bouncerAuth()) {
-      var passwordRow = createRow("Password:");
+      var passwordRow = createRow("Mot de passe :");
       var passwordBox = qwebirc.util.createInput("password", passwordRow, "connect_auth_password");
     }
   }
   
   var connbutton = new Element("input", {"type": "submit"});
-  connbutton.set("value", "Connect");
+  connbutton.set("value", "Se connecter");
   var r = createRow(undefined, connbutton);
   
   if(qwebirc.auth.enabled() && qwebirc.auth.quakeNetAuth() && !qwebirc.auth.loggedin()) {
       chans = "";
 
     if(!nickname) {
-      alert("You must supply a nickname.");
+      alert("Vous devez fournir un nom.");
       nick.focus();
       return;
     }
     var stripped = qwebirc.global.nicknameValidator.validate(nickname);
     if(stripped != nickname) {
       nick.value = stripped;
-      alert("Your nickname was invalid and has been corrected; please check your altered nickname and press Connect again.");
+      alert("Votre nom ĂŠtait invalide et a ĂŠtĂŠ corrigĂŠ ; merci de le vĂŠrifier et d'essayer Ă  nouveau.");
       nick.focus();
       return;
     }
     if(qwebirc.auth.enabled()) {
       if(qwebirc.auth.passAuth() && authCheckBox.checked) {
           if(!usernameBox.value || !passwordBox.value) {
-            alert("You must supply your username and password in auth mode.");
+            alert("Vous devez entrer un nom d'utilisateur et un mot de passe pour vous enregistrer.");
             if(!usernameBox.value) {
               usernameBox.focus();
             } else {
           data["serverPassword"] = usernameBox.value + " " + passwordBox.value;
       } else if(qwebirc.auth.bouncerAuth()) {
         if(!passwordBox.value) {
-          alert("You must supply a password.");
+          alert("Vous devez fournir un mot de passe.");
           passwordBox.focus();
           return;
         }

js/ui/panes/embed.js

     nextRow.addClass("wizardcontrols");
     var backBtn = new Element("input");
     backBtn.type = "submit";
-    backBtn.value = "< Back";
+    backBtn.value = "< PrĂŠcĂŠdent";
     backBtn.addEvent("click", this.back.bind(this));
     nextRow.appendChild(backBtn);
     
     var nextBtn = new Element("input");
     nextBtn.type = "submit";
-    nextBtn.value = "Next >";
+    nextBtn.value = "Suivant >";
     nextRow.appendChild(nextBtn);
     nextBtn.addEvent("click", this.next.bind(this));
     
     };
   
     this.welcome = this.newStep({
-      "title": "Add webchat to your website",
-      "first": "This wizard will help you create an embedded client by asking you questions then giving you the code to add to your website.<br/><br/>You can use the <b>Next</b> and <b>Back</b> buttons to navigate through the wizard; click <b>Next</b> to continue."
+      "title": "Ajoutez un webchat Ă  votre site",
+      "first": "Cet assistant va vous aider Ă  crĂŠer un client intĂŠgrĂŠ en vous posant des questions puis en vous fournissant le code Ă  ajouter Ă  votre site web.<br/><br/>Vous pouvez utiliser les boutons <b>Suivant</b> et <b>PrĂŠcĂŠdent</b> pour naviguer dans cet assistant ; cliquez sur <b>Suivant</b> pour continuer."
     });
     
     this.chanBox = new Element("input");
     this.chanBox.addClass("text");
     this.chans = this.newStep({
-      "title": "Set channels",
-      "first": "Enter the channels you would like the client to join on startup:",
-      "hint": "You can supply multiple channels by seperating them with a comma, e.g.:",
+      "title": "DĂŠfinir les salons",
+      "first": "Entrez les salons que vous souhaitez voir le client rejoindre au dĂŠmarrage :",
+      "hint": "Vous pouvez entrer plusieurs salons en les sĂŠparants par une virgule, ex. :",
       "example": "#rogue,#eu-mage",
       middle: this.chanBox
     }).addEvent("show", af.bind(this.chanBox));
     
     var customnickDiv = new Element("div");
     this.customnick = this.newStep({
-      "title": "Choose a nickname mode",
-      "first": "At startup would you like the client to use a random nickname, a preset nickname or a nickname of the users choice?",
-      "hint": "It is recommended that you only use a preset nickname if the client is for your own personal use.",
+      "title": "Choisissez un mode de nommage",
+      "first": "Au lancement, voulez-vous que le client ait un nom alĂŠatoire, prĂŠdĂŠfini ou bien qu'il puisse le choisir ?",
+      "hint": "Il est recommendĂŠ d'utiliser un nom prĂŠdĂŠfini seulement si ce client est pour votre utilisation personnelle.",
       middle: customnickDiv
     });
 
-    this.choosenick = this.newRadio(customnickDiv, "Make the user choose a nickname.", "nick", true);
-    this.randnick = this.newRadio(customnickDiv, "Use a random nickname, e.g. qwebirc12883.", "nick");
-    this.presetnick = this.newRadio(customnickDiv, "Use a preset nickname of your choice.", "nick");
+    this.choosenick = this.newRadio(customnickDiv, "Laisser l'utilisateur choisir un nom.", "nick", true);
+    this.randnick = this.newRadio(customnickDiv, "Utiliser un nom alĂŠatoire, ex. qwebirc12883.", "nick");
+    this.presetnick = this.newRadio(customnickDiv, "Utiliser un nom prĂŠdĂŠfini de votre choix.", "nick");
     
     var promptdiv = new Element("form");
     this.connectdialog = this.newStep({
-      "title": "Display connect dialog?",
-      "first": "Do you want the user to be shown the connect dialog (with the values you have supplied pre-entered) or just a connect confirmation?",
+      "title": "Afficher la boĂŽte de dialogue de connexion ?",
+      "first": "Voulez-vous que la boĂŽte de dialogue de connexion (avec les valeurs que vous avez fournies prĂŠ-rentrĂŠes) soit affichĂŠe ou juste une confirmation ?",
       middle: promptdiv,
-      "hint": "You need to display the dialog if you want the user to be able to set their nickname before connecting."
+      "hint": "Vous devez afficher la boĂŽte de dialogue si vous voulez que l'utilisateur puisse choisir son nom avant de se connecter."
     });
 
     var changeOptions = new Element("div");
-    this.currentLF = this.newRadio(changeOptions, "Use the current look and feel (", "lookandfeel", true);
+    this.currentLF = this.newRadio(changeOptions, "Utiliser le thème actuel (", "lookandfeel", true);
 
     var alterButton = new Element("input");
     alterButton.type = "submit";
-    alterButton.value = "alter";
+    alterButton.value = "changer";
     alterButton.addEvent("click", this.options.optionsCallback);
     changeOptions.firstChild.appendChild(alterButton);
     changeOptions.firstChild.appendChild(document.createTextNode(")."));
     
-    this.defaultLF = this.newRadio(changeOptions, "Use the default look and feel.", "lookandfeel");
+    this.defaultLF = this.newRadio(changeOptions, "Utiliser le thème par dÊfaut.", "lookandfeel");
     
     this.lookandfeel = this.newStep({
-      "title": "Configure look and feel",
-      "first": "The look and feel will be copied from the current settings.",
+      "title": "Configurer le thème",
+      "first": "Le thème sera copiÊ des paramètres actuels.",
       middle: changeOptions
     });
     
-    var autoconnect = this.newRadio(promptdiv, "Connect without displaying the dialog.", "prompt", true);
-    this.connectdialogr = this.newRadio(promptdiv, "Show the connect dialog.", "prompt");
+    var autoconnect = this.newRadio(promptdiv, "Se connecter sans afficher la boĂŽte de dialogue.", "prompt", true);
+    this.connectdialogr = this.newRadio(promptdiv, "Afficher la boĂŽte de dialogue de connexion.", "prompt");
     
     this.nicknameBox = new Element("input");
     this.nicknameBox.addClass("text");
     this.nickname = this.newStep({
-      "title": "Set nickname",
-      "first": "Enter the nickname you would like the client to use by default:",
+      "title": "DĂŠfinir le nom",
+      "first": "Entrez le nom que vous voulez voir les clients utiliser par dĂŠfaut :",
       "premove": function() {
         if(this.nicknameBox.value == "") {
-          alert("You must supply a nickname.");
+          alert("Vous devez entrer un nom.");
           this.nicknameBox.focus();
           return false;
         }
         var v = qwebirc.global.nicknameValidator.validate(this.nicknameBox.value, true);
         if(v != this.nicknameBox.value) {
           this.nicknameBox.value = v;
-          alert("The supplied nickname was invalid and has been corrected.");
+          alert("Le nom entrĂŠ ĂŠtait invalide et a ĂŠtĂŠ corrigĂŠ.");
           this.nicknameBox.focus();
           return false;
          }
         return true;
       }.bind(this),
       middle: this.nicknameBox,
-      hint: "If you use a . (dot/period) then it will be substituted with a random number."
+      hint: "Si vous utilisez un . (point) alors il sera remplacĂŠ par un chiffre alĂŠatoire."
     }).addEvent("show", af.bind(this.nicknameBox));
 
     var codeDiv = new Element("div");
     this.finish = this.newStep({
-      "title": "Finished!",
-      "first": "Your custom link is:",
+      "title": "TerminĂŠ !",
+      "first": "Votre lien personnalisĂŠ est :",
       middle: codeDiv
     }).addEvent("show", function() {
       var alink = new Element("a");
       var mBox = [
         alink,
         new Element("br"), new Element("br"),
-        document.createTextNode("You can embed this into your page with the following code:"),
+        document.createTextNode("Vous pouvez utiliser le code suivant pour intĂŠgrer ceci dans votre page :"),
         new Element("br"),
         abox
       ];
   showStep: function() {
     this.backBtn.disabled = !(this.step > 0);
     
-    this.nextBtn.value = (this.step >= this.steps.length - 1)?"Close":"Next >";
+    this.nextBtn.value = (this.step >= this.steps.length - 1)?"Fermer":"Suivant >";
       
     this.steps[this.step].show();
   },

js/ui/panes/faq.js

 qwebirc.ui.FAQPane = new Class({
   Implements: [Events],
   initialize: function(parent) {
-    var delayfn = function() { parent.set("html", "<div class=\"loading\">Loading. . .</div>"); };
+    var delayfn = function() { parent.set("html", "<div class=\"loading\">Chargement. . .</div>"); };
     var cb = delayfn.delay(500);
     
     var r = qwebirc.ui.RequestTransformHTML({url: qwebirc.global.staticBaseURL + "panes/faq.html", update: parent, onSuccess: function() {

js/ui/panes/feedback.js

   Implements: [Events],
   initialize: function(parent) {
     this.textboxVisible = false;
-    var delayfn = function() { parent.set("html", "<div class=\"loading\">Loading. . .</div>"); };
+    var delayfn = function() { parent.set("html", "<div class=\"loading\">Chargement. . .</div>"); };
     var cb = delayfn.delay(500);
     
     this.addEvent("select", this.onSelect);
     
     if(text.length < 25) {
       /* TODO: lie and throw away */
-      mainText.set("text", "I don't suppose you could enter a little bit more? Thanks!");
+      mainText.set("text", "Je suppose que vous pourriez prĂŠciser un peu plus ? Merci !");
       textbox.focus();
       return;
     }
       checksum = ((checksum + 1) % 256) ^ (text.charCodeAt(i) % 256);
 
     var r = new Request({url: qwebirc.global.dynamicBaseURL + "feedback", onSuccess: function() {
-      messageText.set("text", "Submitted successfully, thanks for the feedback!");
+      messageText.set("text", "EnvoyÊ avec succès, merci pour votre commentaire !");
       messageClose.setStyle("display", "");
     }, onFailure: function() {
       this.textboxVisible = true;
       messageBody.setStyle("display", "none");
       mainBody.setStyle("display", "");
-      mainText.set("text", "Looks like something went wrong submitting :(");
+      mainText.set("text", "On dirait que l'envoi s'est mal passĂŠ :(");
     }.bind(this)}).send("feedback=" + text + "&c=" + checksum);
   }
 });

js/ui/panes/options.js

  * settableByURL...
  */
 qwebirc.config.DEFAULT_OPTIONS = [
-  [1, "BEEP_ON_MENTION", "Beep when nick mentioned or on query activity (requires Flash)", true, {
+  [1, "BEEP_ON_MENTION", "Beeper quand votre nom est mentionnĂŠ ou lors de messages privĂŠs (nĂŠcessite Flash)", true, {
     enabled: function() {
       if(!$defined(Browser.Plugins.Flash) || Browser.Plugins.Flash.version < 8)
         return [false, false]; /* [disabled, default_value] */
         ui.setBeepOnMention(value);
     }
   }],
-  [7, "FLASH_ON_MENTION", "Flash titlebar when nick mentioned or on query activity", true, {
+  [7, "FLASH_ON_MENTION", "Faire clignoter le titre quand votre nom est mentionnĂŠ ou lors de messages privĂŠs", true, {
     enabled: qwebirc.ui.supportsFocus
   }],
-  [2, "DEDICATED_MSG_WINDOW", "Send privmsgs to dedicated messages window", false],
-  [4, "DEDICATED_NOTICE_WINDOW", "Send notices to dedicated message window", false],
-  [3, "NICK_OV_STATUS", "Show status (@/+) before nicknames in channel lines", true],
-  [5, "ACCEPT_SERVICE_INVITES", "Automatically join channels when invited by Q", true, {
+  [2, "DEDICATED_MSG_WINDOW", "Afficher les messages privĂŠs dans des fenĂŞtres sĂŠparĂŠes", false],
+  [4, "DEDICATED_NOTICE_WINDOW", "Afficher les notices dans des fenĂŞtres sĂŠparĂŠes", false],
+  [3, "NICK_OV_STATUS", "Afficher le statut (@/+) avant les noms dans les lignes des salons", true],
+  [5, "ACCEPT_SERVICE_INVITES", "Rejoindre automatiquement les salons lorsque invitĂŠ par Q", true, {
     settableByURL: false
   }],
-  [6, "USE_HIDDENHOST", "Hide your hostmask when authed to Q (+x)", true, {
+  [6, "USE_HIDDENHOST", "Cacher votre hôte quand enregistrÊ auprès de Q (+x)", true, {
     settableByURL: false
   }],
-  [8, "LASTPOS_LINE", "Show a last position indicator for each window", true, {
+  [8, "LASTPOS_LINE", "Afficher un indicateur de dernière position dans chaque fenêtre", true, {
     enabled: qwebirc.ui.supportsFocus
   }],
-  [9, "NICK_COLOURS", "Automatically colour nicknames", false],
-  [10, "HIDE_JOINPARTS", "Hide JOINS/PARTS/QUITS", false],
-  [11, "STYLE_HUE", "Adjust user interface hue", function() {
+  [9, "NICK_COLOURS", "Colorier automatiquement les noms", false],
+  [10, "HIDE_JOINPARTS", "Cacher les JOINS/PARTS/QUITS", false],
+  [11, "STYLE_HUE", "Ajuster la teinte de l'interface", function() {
     return {class_: qwebirc.config.HueOption, default_: 210};
   }, {
     applyChanges: function(value, ui) {
       ui.setModifiableStylesheetValues({hue: value});
     }
   }],
-  [12, "QUERY_ON_NICK_CLICK", "Query on nickname click in channel", false],
-  [13, "SHOW_NICKLIST", "Show nickname list in channels", true],
-  [14, "SHOW_TIMESTAMPS", "Show timestamps", true] /* we rely on the hue update */
+  [12, "QUERY_ON_NICK_CLICK", "Conversation privĂŠe lors d'un client sur un nom dans un salon", false],
+  [13, "SHOW_NICKLIST", "Afficher la liste des noms dans un salon", true],
+  [14, "SHOW_TIMESTAMPS", "Afficher les heures", true] /* we rely on the hue update */
 ];
 
 qwebirc.config.DefaultOptions = null;
     var cella = FE("td", r);
     var cellb = FE("td", r);
     var save = qwebirc.util.createInput("submit", cellb);
-    save.value = "Save";
+    save.value = "Enregistrer";
     
     save.addEvent("click", function() {
       this.save();
     }.bind(this));
     
     var cancel = qwebirc.util.createInput("submit", cellb);
-    cancel.value = "Cancel";
+    cancel.value = "Annuler";
     cancel.addEvent("click", function() {
       this.cancel();
       this.fireEvent("close");

js/ui/panes/privacypolicy.js

 qwebirc.ui.PrivacyPolicyPane = new Class({
   Implements: [Events],
   initialize: function(parent) {
-    var delayfn = function() { parent.set("html", "<div class=\"loading\">Loading. . .</div>"); };
+    var delayfn = function() { parent.set("html", "<div class=\"loading\">Chargement. . .</div>"); };
     var cb = delayfn.delay(500);
     
     var r = qwebirc.ui.RequestTransformHTML({url: qwebirc.global.staticBaseURL + "panes/privacypolicy.html", update: parent, onSuccess: function() {
 
 qwebirc.ui.themes.Default = {
   "PREFIX": ["$C4==$O "],
-  "SIGNON": ["Signed on!", true],
-  "CONNECT": ["Connected to server.", true],
+  "SIGNON": ["EnregistrĂŠ !", true],
+  "CONNECT": ["ConnectĂŠ au serveur.", true],
   "RAW": ["$m", true],
-  "DISCONNECT": ["Disconnected from server: $m", true],
-  "ERROR": ["ERROR: $m", true],
+  "DISCONNECT": ["DĂŠconnectĂŠ du serveur : $m", true],
+  "ERROR": ["ERREUR: $m", true],
   "SERVERNOTICE": ["$m", true],
-  "JOIN": ["${$N$} [$h] has joined $c", true],
-  "OURJOIN": ["${$N$} [$h] has joined $c", true],
-  "PART": ["${$N$} [$h] has left $c [$m]", true],
-  "KICK": ["${$v$} was kicked from $c by ${$N$} [$m]", true],
-  "MODE": ["mode/$c [$m] by ${$N$}", true],
-  "QUIT": ["${$N$} [$h] has quit [$m]", true],
-  "NICK": ["${$n$} has changed nick to ${$[$w$]$}", true],
-  "TOPIC": ["${$N$} changed the topic of $c to: $m", true],
-  "UMODE": ["Usermode change: $m", true],
-  "INVITE": ["$N invites you to join $c", true],
+  "JOIN": ["${$N$} [$h] a rejoint $c", true],
+  "OURJOIN": ["${$N$} [$h] a rejoint $c", true],
+  "PART": ["${$N$} [$h] est parti de $c [$m]", true],
+  "KICK": ["${$v$} a ĂŠtĂŠ expulsĂŠ de $c par ${$N$} [$m]", true],
+  "MODE": ["mode/$c [$m] par ${$N$}", true],
+  "QUIT": ["${$N$} [$h] a quittĂŠ [$m]", true],
+  "NICK": ["${$n$} a changĂŠ de de nom pour ${$[$w$]$}", true],
+  "TOPIC": ["${$N$} a changĂŠ le sujet de $c pour : $m", true],
+  "UMODE": ["Changement de mode utilisateur: $m", true],
+  "INVITE": ["$N vous a invitĂŠ Ă  rejoindre $c", true],
   "HILIGHT": ["$C4"],
   "HILIGHTEND": ["$O"],
   "CHANMSG": ["<${$@$($N$)$}> $m"],
   "OURPRIVACTION": [" * $N $m"],
   "CHANACTION": [" * ${$($N$)$} $m"],
   "PRIVACTION": [" * $($N$) $m"],
-  "CHANCTCP": ["$N [$h] requested CTCP $x from $c: $m"],
-  "PRIVCTCP": ["$N [$h] requested CTCP $x from $-: $m"],
-  "CTCPREPLY": ["CTCP $x reply from $N: $m"],
+  "CHANCTCP": ["$N [$h] a envoyĂŠ une requĂŞte CTCP $x depuis $c : $m"],
+  "PRIVCTCP": ["$N [$h] a envoyĂŠ une requĂŞte CTCP $x depuis $- : $m"],
+  "CTCPREPLY": ["RĂŠponse CTCP $x de $N : $m"],
   "OURCHANCTCP": ["[ctcp($t)] $x $m"],
   "OURPRIVCTCP": ["[ctcp($t)] $x $m"],
   "OURTARGETEDCTCP": ["[ctcp($t)] $x $m"],
   "WHOISUSER": ["$B$N$B [$h]", true],
-  "WHOISREALNAME": [" realname : $m", true],
-  "WHOISCHANNELS": [" channels : $m", true],
-  "WHOISSERVER": [" server   : $x [$m]", true],
-  "WHOISACCOUNT": [" account  : qwebirc://qwhois/$m", true],
-  "WHOISIDLE": [" idle     : $x [connected: $m]", true],
-  "WHOISAWAY": [" away     : $m", true],
+  "WHOISREALNAME": [" vrai nom : $m", true],
+  "WHOISCHANNELS": [" salons   : $m", true],
+  "WHOISSERVER": [" serveur  : $x [$m]", true],
+  "WHOISACCOUNT": [" compte   : qwebirc://qwhois/$m", true],
+  "WHOISIDLE": [" inactif  : $x [connected: $m]", true],
+  "WHOISAWAY": [" absent   : $m", true],
   "WHOISOPER": ["          : $BIRC Operator$B", true],
-  "WHOISOPERNAME": [" operedas : $m", true],
-  "WHOISACTUALLY": [" realhost : $m [ip: $x]", true],
-  "WHOISGENERICTEXT": ["          : $m", true],
-  "WHOISEND": ["End of WHOIS", true],
-  "AWAY": ["$N is away: $m", true],
-  "GENERICERROR": ["$m: $t", true],
+  "WHOISOPERNAME": [" oper    : $m", true],
+  "WHOISACTUALLY": [" hĂ´te    : $m [ip: $x]", true],
+  "WHOISGENERICTEXT": ["         : $m", true],
+  "WHOISEND": ["Fin du WHOIS", true],
+  "AWAY": ["$N est absent : $m", true],
+  "GENERICERROR": ["$m:  $t", true],
   "GENERICMESSAGE": ["$m", true],
-  "WALLOPS": ["WALLOP $n: $t", true],
-  "CHANNELCREATIONTIME": ["Channel $c was created at: $m", true],
-  "CHANNELMODEIS": ["Channel modes on $c are: $m", true]
+  "WALLOPS": ["WALLOP $n : $t", true],
+  "CHANNELCREATIONTIME": ["Le salon $c a ĂŠtĂŠ crĂŠĂŠ le : $m", true],
+  "CHANNELMODEIS": ["Modes du salon $c : $m", true]
 };
 
 qwebirc.ui.Theme = new Class({
+# coding: utf-8
+
 from twisted.names import client
 from twisted.internet import reactor, defer
 
     answer, auth, add = result
 
     if len(answer) == 0:
-      raise LookupException, "No ANSWERS in PTR response for %s." % repr(ip)
+      raise LookupException, "Pas de rĂŠponse PTR pour %s." % repr(ip)
     return str(answer[0].payload.name)
 
   ptr = ".".join(ip.split(".")[::-1]) + ".in-addr.arpa."
   def callback(result):
     answer, auth, add = result
     if len(answer) == 0:
-      raise LookupException, "No ANSWERS in A response for %s." % repr(hostname)
+      raise LookupException, "Pas de rĂŠponse A pour %s." % repr(hostname)
     return [x.payload.dottedQuad() for x in answer]
 
   return client.lookupAddress(hostname, *args, **kwargs).addCallback(callback)
       if ip in a_records:
         d.callback(ptr)
       else:
-        raise VerificationException("IP mismatch: %s != %s%s" % (repr(ip), repr(ptr), repr(a_records)))
+        raise VerificationException("L'IP diffère : %s != %s%s" % (repr(ip), repr(ptr), repr(a_records)))
     lookupAs(ptr, *args, **kwargs).addCallback(gotAResult).addErrback(d.errback)
 
   lookupPTR(ip, *args, **kwargs).addCallback(gotPTRResult).addErrback(d.errback)

qwebirc/engines/adminengine.py

+# coding: utf-8
+
 from twisted.web import resource, server, static
 from cgi import escape
 from urllib import urlencode
 import config, copy, time
 
 HEADER = """
-<html><head><link rel="stylesheet" href="/css/qui.css"></link><link rel="stylesheet" href="/css/dialogs.css"></link></head><body class="qwebirc-qui">
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><link rel="stylesheet" href="/css/qui.css"></link><link rel="stylesheet" href="/css/dialogs.css"></link></head><body class="qwebirc-qui">
 <div class="qwebirc-aboutpane lines" style="bottom: 0px; top: 0px; position: absolute; right: 0px; left: 0px;">
 <div class="header"> 
   <table> 
   @property
   def adminEngine(self):
     return {
-      "Permitted hosts": (config.ADMIN_ENGINE_HOSTS,),
-      "Started": ((time.asctime(time.localtime(self.__creation_time)),),),
-      "Running for": (("%d seconds" % int(time.time() - self.__creation_time),),),
-      "CPU time used (UNIX only)": (("%.2f seconds" % time.clock(),),)
+      "HĂ´tes autorisĂŠs": (config.ADMIN_ENGINE_HOSTS,),
+      "DĂŠmarrĂŠ": ((time.asctime(time.localtime(self.__creation_time)),),),
+      "Tourne depuis": (("%d secondes" % int(time.time() - self.__creation_time),),),
+      "Temps CPU utilisĂŠ (UNIX seulement)": (("%.2f secondes" % time.clock(),),)
     }
       
   def process_action(self, args):
       
       obj = self.__services[engine].adminEngine[heading][pos]
     except KeyError:
-      raise AdminEngineException("Bad action description.")
+      raise AdminEngineException("Description d'action invalide.")
       
     if uniqid is None:
       obj[pos2].function()
           x.function(uniqid)
           break
       else:
-        raise AdminEngineException("Action does not exist.")
+        raise AdminEngineException("L'action n'existe pas.")
     
   def render_GET(self, request):
     if request.getClientIP() not in config.ADMIN_ENGINE_HOSTS:
-      raise AdminEngineException("Access denied")
+      raise AdminEngineException("Accès refusÊ")
   
     args = request.args.get("engine")
     if args:

qwebirc/engines/ajaxengine.py

+# coding: utf-8
+
 from twisted.web import resource, server, static, error as http_error
 from twisted.names import client
 from twisted.internet import reactor, error
 
     nick = request.args.get("nick")
     if not nick:
-      raise AJAXException, "Nickname not supplied."
+      raise AJAXException, "Nom non-spĂŠcifiĂŠ."
     nick = ircclient.irc_decode(nick[0])
 
     password = request.args.get("password")
     return id
   
   def getSession(self, request):
-    bad_session_message = "Invalid session, this most likely means the server has restarted; close this dialog and then try refreshing the page."
+    bad_session_message = "Session invalide, cela veut signifie probablement que le serveur a redĂŠmarrĂŠ ; fermez cette fenĂŞtre et essayez de rafraĂŽchir la page."
     
     sessionid = request.args.get("s")
     if sessionid is None:
   def push(self, request):
     command = request.args.get("c")
     if command is None:
-      raise AJAXException, "No command specified."
+      raise AJAXException, "Pas de commande spĂŠcifiĂŠe."
     self.__total_hit()
     
     decoded = ircclient.irc_decode(command[0])
 
     if len(decoded) > config.MAXLINELEN:
       session.disconnect()
-      raise AJAXException, "Line too long."
+      raise AJAXException, "Ligne trop longue."
 
     try:
       session.push(decoded)
     except AttributeError: # occurs when we haven't noticed an error
       session.disconnect()
-      raise AJAXException, "Connection closed by server; try reconnecting by reloading the page."
+      raise AJAXException, "Connexion fermĂŠe par le serveur ; essayez de vous reconnectez en rafraĂŽchissant la page."
     except Exception, e: # catch all
       session.disconnect()        
       traceback.print_exc(file=sys.stderr)
-      raise AJAXException, "Unknown error."
+      raise AJAXException, "Erreur inconnue."
   
     return True
   
     s = Sessions.get(k)
     if s is None:
       return
-    s.client.client.error("Closed by admin interface")
+    s.client.client.error("DĂŠconnectĂŠ par l'interface d'administration")
     
   @property
   def adminEngine(self):

qwebirc/engines/authgateengine.py

+# coding: utf-8
+
 from twisted.web import resource, server, static
 import config, urlparse, urllib, hashlib, re
 import qwebirc.util.rijndael, qwebirc.util.ciphers
   def decrypt(data):
     l = len(data)
     if l < BLOCK_SIZE * 2 or l % BLOCK_SIZE != 0:
-      raise Exception("Bad qticket.")
+      raise Exception("qticket invalide.")
     
     iv, data = data[:16], data[16:]
     cbc = qwebirc.util.ciphers.CBC(cipher, iv)

qwebirc/engines/feedbackengine.py

+# coding: utf-8
+
 from twisted.web import resource, server, static
 from twisted.mail.smtp import SMTPSenderFactory, ESMTPSenderFactory
 from twisted.internet import defer, reactor
     
     sentchecksum = int(request.args.get("c", [0])[0])
     if checksum != sentchecksum:
-      raise FeedbackException("Bad checksum: %d vs. %d" % (sentchecksum, checksum))
+      raise FeedbackException("Somme de contrĂ´le incorrecte : %d vs. %d" % (sentchecksum, checksum))
       
     msg = MIMEText(text.encode("utf-8"), _charset="utf-8")
-    msg["Subject"] = "qwebirc feedback from %s" % request.getClientIP()
+    msg["Subject"] = "qwebirc feedback depuis %s" % request.getClientIP()
     msg["From"] = config.FEEDBACK_FROM
     msg["To"] = config.FEEDBACK_TO
     email = StringIO(msg.as_string())

qwebirc/ircclient.py

+# coding: utf-8
+
 import twisted, sys, codecs, traceback
 from twisted.words.protocols import irc
 from twisted.internet import reactor, protocol, abstract
 class QWebIRCClient(basic.LineReceiver):
   delimiter = "\n"
   def __init__(self, *args, **kwargs):
-    self.__nickname = "(unregistered)"
+    self.__nickname = "(non-enregistrĂŠ)"
     
   def dataReceived(self, data):
     basic.LineReceiver.dataReceived(self, data.replace("\r", ""))
     
   def connectionLost(self, reason):
     if self.lastError:
-      self.disconnect("Connection to IRC server lost: %s" % self.lastError)
+      self.disconnect("Connexion au serveur IRC perdue : %s" % self.lastError)
     else:
-      self.disconnect("Connection to IRC server lost.")
+      self.disconnect("Connexion au serveur IRC perdue.")
     self.factory.client = None
     basic.LineReceiver.connectionLost(self, reason)
 
   def error(self, message):
     self.lastError = message
-    self.write("QUIT :qwebirc exception: %s" % message)
+    self.write("QUIT :exception de qwebirc : %s" % message)
     self.transport.loseConnection()
 
   def disconnect(self, reason):

qwebirc/util/hitcounter.py

   def __str__(self):
     delta = time.time() - self.__start_time
     
-    return "Total: %d hits/s: %.2f" % (self.__hits, self.__hits / delta)
+    return "Total : %d req/s: %.2f" % (self.__hits, self.__hits / delta)
     

qwebirc/util/rijndael.py

+# coding: utf-8
+
 """
 A pure python (slow) implementation of rijndael with a decent interface
 
         t = i + 1
         while AA[t][i] == 0 and t < 4:
             t += 1
-            assert t != 4, 'G matrix must be invertible'
+            assert t != 4, 'La matrice G doit ĂŞtre inversible'
             for j in xrange(8):
                 AA[i][j], AA[t][j] = AA[t][j], AA[i][j]
             pivot = AA[i][i]
 class rijndael:
     def __init__(self, key, block_size = 16):
         if block_size != 16 and block_size != 24 and block_size != 32:
-            raise ValueError('Invalid block size: ' + str(block_size))
+            raise ValueError('Taille de bloc invalide : ' + str(block_size))
         if len(key) != 16 and len(key) != 24 and len(key) != 32:
-            raise ValueError('Invalid key size: ' + str(len(key)))
+            raise ValueError('Taille de clef invalide : ' + str(len(key)))
         self.block_size = block_size
 
         ROUNDS = num_rounds[len(key)][block_size]
 
     def encrypt(self, plaintext):
         if len(plaintext) != self.block_size:
-            raise ValueError('wrong block length, expected ' + str(self.block_size) + ' got ' + str(len(plaintext)))
+            raise ValueError('longueur de bloc invalide, ' + str(self.block_size) + ' attendu, ' + str(len(plaintext)) + ' trouvĂŠ')
         Ke = self.Ke
 
         BC = self.block_size / 4
 
     def decrypt(self, ciphertext):
         if len(ciphertext) != self.block_size:
-            raise ValueError('wrong block length, expected ' + str(self.block_size) + ' got ' + str(len(ciphertext)))
+            raise ValueError('longueur de bloc invalide, ' + str(self.block_size) + ' attendu, ' + str(len(ciphertext)) + ' trouvĂŠ')
         Kd = self.Kd
 
         BC = self.block_size / 4
 #!/usr/bin/env python
+# coding: utf-8
 # this entire thing is a hack and badly needs reimplementing
 import bin.compile
 bin.compile.vcheck()
 DEFAULT_REACTOR = "select" if os.name == "nt" else "poll"  
 
 parser = OptionParser()
-parser.add_option("-n", "--no-daemon", help="Don't run in the background.", action="store_false", dest="daemonise", default=True)
-parser.add_option("--help-reactors", help="Display a list of reactor names.", action="callback", callback=help_reactors)
-parser.add_option("-b", "--debug", help="Run in the Python Debugger.", action="store_true", dest="debug", default=False)
-parser.add_option("-t", "--tracebacks", help="Display tracebacks in error pages (this reveals a LOT of information, do NOT use in production!)", action="store_true", dest="tracebacks", default=False)
-parser.add_option("-r", "--reactor", help="Which reactor to use (see --help-reactors for a list).", dest="reactor", default=DEFAULT_REACTOR)
-parser.add_option("-p", "--port", help="Port to start the server on.", type="int", dest="port", default=DEFAULT_PORT)
-parser.add_option("-i", "--ip", help="IP address to listen on.", dest="ip", default="0.0.0.0")
-parser.add_option("-l", "--logfile", help="Path to twisted log file.", dest="logfile")
-parser.add_option("-c", "--clf", help="Path to web CLF (Combined Log Format) log file.", dest="clogfile")
-parser.add_option("-C", "--certificate", help="Path to SSL certificate.", dest="sslcertificate")
-parser.add_option("-k", "--key", help="Path to SSL key.", dest="sslkey")
-parser.add_option("-H", "--certificate-chain", help="Path to SSL certificate chain file.", dest="sslchain")
-parser.add_option("-P", "--pidfile", help="Path to store PID file", dest="pidfile")
-parser.add_option("-s", "--syslog", help="Log to syslog", action="store_true", dest="syslog", default=False)
-parser.add_option("--profile", help="Run in profile mode, dumping results to this file", dest="profile")
-parser.add_option("--profiler", help="Name of profiler to use", dest="profiler")
-parser.add_option("--syslog-prefix", help="Syslog prefix", dest="syslog_prefix", default="qwebirc")
+parser.add_option("-n", "--no-daemon", help="Ne pas se lancer en arrière-plan.", action="store_false", dest="daemonise", default=True)
+parser.add_option("--help-reactors", help="Afficher une liste des rĂŠacteurs.", action="callback", callback=help_reactors)
+parser.add_option("-b", "--debug", help="Lancer dans le dĂŠbogueur Python.", action="store_true", dest="debug", default=False)
+parser.add_option("-t", "--tracebacks", help="Afficher les traces dans les pages d'erreur (ceci rÊvèle un TAS d'informations, ne PAS utiliser en production !)", action="store_true", dest="tracebacks", default=False)
+parser.add_option("-r", "--reactor", help="Quel rĂŠacteur utiliser (voyez --help-reactors pour une liste).", dest="reactor", default=DEFAULT_REACTOR)
+parser.add_option("-p", "--port", help="Port sur lequel dĂŠmarrer le serveur.", type="int", dest="port", default=DEFAULT_PORT)
+parser.add_option("-i", "--ip", help="Adresse IP sur laquelle ĂŠcouter.", dest="ip", default="0.0.0.0")
+parser.add_option("-l", "--logfile", help="Chemin vers le fichier de log twisted.", dest="logfile")
+parser.add_option("-c", "--clf", help="Chemin vers le fichier de log web CLF (Combined Log Format).", dest="clogfile")
+parser.add_option("-C", "--certificate", help="Chemin vers le certificat SSL.", dest="sslcertificate")
+parser.add_option("-k", "--key", help="Chemin vers la clef SSL.", dest="sslkey")
+parser.add_option("-H", "--certificate-chain", help="Chemin vers la chaĂŽne de certificats SSL.", dest="sslchain")
+parser.add_option("-P", "--pidfile", help="Chemin oĂš stocker le fichier PID.", dest="pidfile")
+parser.add_option("-s", "--syslog", help="Logger via syslog.", action="store_true", dest="syslog", default=False)
+parser.add_option("--profile", help="Lancer en mode de profilage, en enregistrant les rĂŠsultats dans ce fichier.", dest="profile")
+parser.add_option("--profiler", help="Nom du profileur Ă  utiliser.", dest="profiler")
+parser.add_option("--syslog-prefix", help="PrĂŠfixe de syslog.", dest="syslog_prefix", default="qwebirc")
 
 sargs = sys.argv[1:]
 if "ARGS" in dir(config):

static/panes/about.html

 </div>
 <div class="mainbody">
   Copyright &copy; 2008-2011 Chris Porter and the qwebirc project.<br/>All rights reserved.<br/><br/>
-  Licensed under the GNU General Public License, version 2 only.
+  Licensed under the GNU General Public License, version 2 only.<br/><br/>
+  Translation by RĂŠmi Rampin.
   <p>
     <a href="http://www.qwebirc.org/" target="_blank">http://www.qwebirc.org/</a><br/>
   </p>

static/panes/faq.html

   </table>
 </div>
 <div class="mainbody">
-  <h2>Can I make the widget autoconnect?</h2>
-  <p>No, if this was allowed then bad people could IFRAME lots and lots of copies, which would get you glined for having too many clones.<br/>However you can prefill the channel/nickname information (type /EMBED in the main window).</p>
+  <h2>Puis-je faire en sorte que le widget se connecte automatiquement ?</h2>
+  <p>Non, si c'ĂŠtait autorisĂŠ, des personnes mal intentionnĂŠes pourraient placer beaucoup de copies dans des IFRAMEs, et vous seriez glinĂŠ pour avoir trop de clones.<br/>Par contre, vous pouvez prĂŠ-rentrer les informations de salons/nom (entrez /EMBED dans la fenĂŞtre principale).</p>
 
-  <p>To be continued...</p>
+  <p>A continuer...</p>
   <input type="submit" value="Close" class="close" />
 </div>

static/panes/feedback.html

     <tr>
       <td><img transform_attr="src" transform_value="images/qwebircsmall.png" alt="qwebirc" title="qwebirc"/></td>
       <td>&nbsp;&nbsp;&nbsp;&nbsp;</td>
-      <td><div class="title">qwebirc</div><div>Feedback</div></td>
+      <td><div class="title">qwebirc</div><div>Remarques</div></td>
     </tr>
   </table>
 </div>
 <div class="mainbody">
   <div class="enterarea">
-    <p class="maintext">We'd love to hear what you think about our web IRC client (in English please):</p>
+    <p class="maintext">Nous aimerions beaucoup entendre ce que vous pensez de nos client IRC web (en anglais, merci) :</p>
     <p><textarea cols="80" rows="10" class="mainarea"></textarea></p>
-    <p>Include your name if you'd like us to get back to you!</p>
+    <p>Précisez votre nom si vous souhaitez une réponse !</p>
   
     <input type="submit" value="Submit" class="submitfeedback" />
     <input type="submit" value="Close" class="close" />

twisted/plugins/webirc.py

+# coding: utf-8
+
 from zope.interface import implements
 
 from twisted.python import usage
 from qwebirc.root import RootSite
 
 class Options(usage.Options):
-  optParameters = [["port", "p", "9090","Port to start the server on."],
-    ["ip", "i", "0.0.0.0", "IP address to listen on."],
-    ["logfile", "l", None, "Path to web CLF (Combined Log Format) log file."],
-    ["https", None, None, "Port to listen on for Secure HTTP."],
-    ["certificate", "c", "server.pem", "SSL certificate to use for HTTPS. "],
-    ["privkey", "k", "server.pem", "SSL certificate to use for HTTPS."],
-    ["certificate-chain", "C", None, "Chain SSL certificate"],
-    ["staticpath", "s", "static", "Path to static content"],
+  optParameters = [["port", "p", "9090","Port sur lequel dĂŠmarrer le serveur."],
+    ["ip", "i", "0.0.0.0", "Adresse IP sur laquelle ĂŠcouter."],
+    ["logfile", "l", None, "Chemin du fichier de log web CLF (Combined Log Format)."],
+    ["https", None, None, "Port sur lequel ĂŠcouter pour les connexions HTTP sĂŠcurisĂŠes."],
+    ["certificate", "c", "server.pem", "Certificat SSL Ă  utiliser pour HTTPS. "],
+    ["privkey", "k", "server.pem", "Clef SSL Ă  utiliser pour HTTPS."],
+    ["certificate-chain", "C", None, "ChaĂŽne de certificats SSL."],
+    ["staticpath", "s", "static", "Chemin vers le contenu statique."],
   ]
 
-  optFlags = [["notracebacks", "n", "Display tracebacks in broken web pages. " +
-              "Displaying tracebacks to users may be security risk!"],
+  optFlags = [["notracebacks", "n", "Ne pas afficher les traces dans les pages web cassĂŠes. " +
+              "Montrer les traces aux utilisateurs peut prĂŠsenter un risque de sĂŠcuritĂŠ !"],
              ]
 
   def postOptions(self):
       try:
         get_ssl_factory_factory()
       except ImportError:
-        raise usage.UsageError("SSL support not installed")
+        raise usage.UsageError("Le support de SSL n'est pas installĂŠ")
         
 class QWebIRCServiceMaker(object):
   implements(IServiceMaker, IPlugin)
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.