--- setup-FR/AntiVirus.cc.orig	2014-05-05 11:32:03.127807900 +0200
+++ setup-FR/AntiVirus.cc	2014-05-05 11:34:25.810074700 +0200
@@ -31,7 +31,11 @@
 /* XXX: Split this into observer and model classes */
 
 /* Default is to leave well enough alone */
+#ifdef LANG_FR
+static BoolOption DisableVirusOption (false, 'A', "disable-buggy-antivirus", "Inhibe les anti-virus à l'exécution.");
+#else
 static BoolOption DisableVirusOption (false, 'A', "disable-buggy-antivirus", "Disable known or suspected buggy anti virus software packages during execution.");
+#endif
 
 static bool KnownAVIsPresent = false;
 static bool AVRunning = true;
--- setup-FR/ChangeLog.orig	2014-05-05 11:35:35.577050700 +0200
+++ setup-FR/ChangeLog	2014-10-27 11:45:10.571409100 +0100
@@ -10926,4 +10926,4 @@
 	* zlib/Makefile.in: Regenerate from Makefile.am
 
 %%% $Id: ChangeLog,v 2.852 2014/10/26 08:04:53 corinna Exp $
-$Revision: 2.852 $
+$Revision: 2.852-FR $
--- setup-FR/choose.cc.orig	2014-05-05 11:32:03.324827600 +0200
+++ setup-FR/choose.cc	2014-05-05 11:34:25.864080100 +0200
@@ -62,8 +62,13 @@
 #include "UserSettings.h"
 
 #include "getopt++/BoolOption.h"
+#ifdef LANG_FR
+static BoolOption UpgradeAlsoOption (false, 'g', "upgrade-also", "Mettre à jour les paquets");
+static BoolOption CleanOrphansOption (false, 'o', "delete-orphans", "Effacer les paquets orphelins");
+#else
 static BoolOption UpgradeAlsoOption (false, 'g', "upgrade-also", "also upgrade installed packages");
 static BoolOption CleanOrphansOption (false, 'o', "delete-orphans", "remove orphaned packages");
+#endif
 
 using namespace std;
 
@@ -270,9 +275,17 @@
   ClearBusy ();
 
   if (source == IDC_SOURCE_DOWNLOAD)
+#ifndef LANG_FR
     setPrompt("Select packages to download ");
+#else
+    setPrompt("Sélectionnez les paquets à télécharger.");
+#endif
   else
+#ifndef LANG_FR
     setPrompt("Select packages to install ");
+#else
+    setPrompt("Sélectionnez les paquets à installer.");
+#endif
   createListview ();
 
   AddTooltip (IDC_CHOOSE_KEEP, IDS_TRUSTKEEP_TOOLTIP);
--- setup-FR/configure.ac.orig	2014-05-05 11:32:03.451840300 +0200
+++ setup-FR/configure.ac	2014-05-05 11:34:25.911084800 +0200
@@ -17,7 +17,7 @@
 dnl
 dnl Process this file with autoconf to produce a configure script.
 
-AC_INIT([setup], [0], [cygwin-apps@cygwin.com])
+AC_INIT([setup],[2.844-FR] , [cygwin-apps@cygwin.com])
 AC_PREREQ(2.60)
 AC_CONFIG_AUX_DIR([cfgaux])
 AM_INIT_AUTOMAKE([1.12 subdir-objects foreign no-define -Wall -Wno-portability])
--- setup-FR/crypto.cc.orig	2014-05-05 11:32:03.523847500 +0200
+++ setup-FR/crypto.cc	2014-05-05 11:34:25.930086700 +0200
@@ -35,6 +35,7 @@
 #include "geturl.h"
 
 #define CRYPTODEBUGGING         (0)
+#define SECONDKEY	        (1)
 
 #if CRYPTODEBUGGING
 #define ERRKIND __asm__ __volatile__ (".byte 0xcc"); note
@@ -45,6 +46,18 @@
 #endif /* CRYPTODEBUGGING */
 
 /*  Command-line options for specifying and controlling extra keys.  */
+#ifdef LANG_FR
+static StringArrayOption ExtraKeyOption ('K', "pubkey",
+			"URL d'une clé publique supplémentaire (format gpg)");
+
+static StringArrayOption SexprExtraKeyOption ('S', "sexpr-pubkey",
+			"Clé publique supplémentaire au format s-expr");
+
+static BoolOption UntrustedKeysOption (false, 'u', "untrusted-keys",
+			"Utiliser les clés non-fiables du fichier last-extrakeys");
+static BoolOption KeepUntrustedKeysOption (false, 'U', "keep-untrusted-keys",
+			"Utiliser les clés non-fiables et les garder");
+#else
 static StringArrayOption ExtraKeyOption ('K', "pubkey",
 			"URL of extra public key file (gpg format)");
 
@@ -55,12 +68,20 @@
 			"Use untrusted keys from last-extrakeys");
 static BoolOption KeepUntrustedKeysOption (false, 'U', "keep-untrusted-keys",
 			"Use untrusted keys and retain all");
+#endif
 
 /*  Embedded public half of Cygwin DSA signing key.  */
 static const char *cygwin_pubkey_sexpr = 
 #include "cyg-pubkey.h"
 ;
 
+#if SECONDKEY
+/*  Embedded public half of second DSA signing key.  */
+static const char *second_pubkey_sexpr = 
+#include "sec-pubkey.h"
+;
+#endif
+
 /*  S-expr template for DSA pubkey.  */
 static const char *dsa_pubkey_templ = "(public-key (dsa (p %m) (q %m) (g %m) (y %m)))";
 
@@ -437,6 +458,9 @@
 {
   /*  DSA public key in s-expr format.  */
   gcry_sexp_t dsa_key;
+#if SECONDKEY
+  gcry_sexp_t dsa_key_second;
+#endif
 
   /*  Data returned from packet walker.  */
   struct sig_data sigdat;
@@ -467,9 +491,23 @@
 #if CRYPTODEBUGGING
   char sexprbuf[GPG_KEY_SEXPR_BUF_SIZE];
   n = gcry_sexp_sprint (dsa_key, GCRYSEXP_FMT_ADVANCED, sexprbuf, GPG_KEY_SEXPR_BUF_SIZE);
-  msg ("key:%d\n'%s'", n, sexprbuf);
+    msg ("key0:%d\n'%s'", n, sexprbuf);
 #endif /* CRYPTODEBUGGING */
 
+#if SECONDKEY
+  /* Next build the second built-in key.  */
+  rv = gcry_sexp_new (&dsa_key_second, second_pubkey_sexpr, strlen (second_pubkey_sexpr), 1);
+  if (rv != GPG_ERR_NO_ERROR)
+    {
+      ERRKIND (owner, IDS_CRYPTO_ERROR, rv, "while creating second pubkey s-expr.");
+    }
+
+  #if CRYPTODEBUGGING
+    n = gcry_sexp_sprint (dsa_key_second, GCRYSEXP_FMT_ADVANCED, sexprbuf, GPG_KEY_SEXPR_BUF_SIZE);
+    msg ("key1:%d\n'%s'", n, sexprbuf);
+  #endif /* CRYPTODEBUGGING */
+#endif
+
   /* Next we should extract the keys from the last-extrakeys
   file, and flush it; we'll only return them to it if they
   get used.  OTOH, should we do this at all?  The extrakeys
@@ -632,6 +670,14 @@
 
       // Well, we're actually there!  Try it against the main key.
       rv = gcry_pk_verify (dsa_sig, dsa_hash, dsa_key);
+#if SECONDKEY
+      // And now try it against the second key.
+      if (rv != GPG_ERR_NO_ERROR)
+	{
+	 MESSAGE ("Testing second pubkey\n");
+         rv = gcry_pk_verify (dsa_sig, dsa_hash, dsa_key_second);
+	}
+#endif
       // If not that, try any supplied on the commandline.
       if (rv != GPG_ERR_NO_ERROR)
 	{
@@ -680,6 +726,9 @@
     }
 
   // Discard the temp data then.
+#if SECONDKEY
+  gcry_sexp_release (dsa_key_second);
+#endif
   gcry_sexp_release (dsa_key);
   if (sigdat.dsa_mpi_r)
     gcry_mpi_release (sigdat.dsa_mpi_r);
--- setup-FR/cygpackage.cc.orig	2014-05-05 11:32:03.634858600 +0200
+++ setup-FR/cygpackage.cc	2014-05-05 11:34:25.959089600 +0200
@@ -77,6 +77,11 @@
   temp->status = newstatus;
   temp->type = newtype;
   temp->setCanonicalVersion (version);
+#ifdef LANG_FR
+#if 0
+  fprintf(stdout,"name='%s' filename='%s' ",pkgname.cstr_oneuse(), filename.cstr_oneuse());
+#endif
+#endif
   return packageversion(temp);
 }
 
@@ -108,6 +113,11 @@
       packagev = "0";
       vendor = version;
     }
+#ifdef LANG_FR
+#if 0
+  fprintf(stdout," Version='%s' pVersion='%s' Vendor='%s'\n",version.cstr_oneuse(),packagev.cstr_oneuse(), vendor.cstr_oneuse());
+#endif
+#endif
 }
 
 cygpackage::~cygpackage ()
--- setup-FR/desktop.cc.orig	2014-05-05 11:32:03.702865400 +0200
+++ setup-FR/desktop.cc	2014-05-05 11:34:25.997093400 +0200
@@ -48,9 +48,15 @@
 #include "PackageSpecification.h"
 #include "LogFile.h"
 
+#ifdef LANG_FR
+static BoolOption NoShortcutsOption (false, 'n', "no-shortcuts", "Pas de création de raccourcis de bureau et de menu");
+static BoolOption NoStartMenuOption (false, 'N', "no-startmenu", "Pas de création de raccourci de menu");
+static BoolOption NoDesktopOption (false, 'd', "no-desktop", "Pas de création de raccourci de bureau");
+#else
 static BoolOption NoShortcutsOption (false, 'n', "no-shortcuts", "Disable creation of desktop and start menu shortcuts");
 static BoolOption NoStartMenuOption (false, 'N', "no-startmenu", "Disable creation of start menu shortcut");
 static BoolOption NoDesktopOption (false, 'd', "no-desktop", "Disable creation of desktop shortcut");
+#endif
 
 /* Lines starting with '@' are conditionals - include 'N' for NT,
    '5' for Win95, '8' for Win98, '*' for all, like this:
@@ -172,7 +178,11 @@
   HRSRC rsrc = FindResource (NULL, resource_name, "FILE");
   if (rsrc == NULL)
     {
+#ifndef LANG_FR
       fatal ("FindResource failed");
+#else
+      fatal ("Echec de FindResource");
+#endif
     }
   HGLOBAL res = LoadResource (NULL, rsrc);
   char *data = (char *) LockResource (res);
@@ -259,8 +269,13 @@
         header_string = eget (h, IDC_STATIC_HEADER_TITLE, header_string);
       if (message_string == NULL) 
         message_string = eget (h, IDC_STATIC_HEADER, message_string);
+#ifdef LANG_FR
+      eset (h, IDC_STATIC_HEADER_TITLE, "Installation terminée");
+      eset (h, IDC_STATIC_HEADER, "Montre l'état de l'installation en mode téléchargement seulement.");
+#else
       eset (h, IDC_STATIC_HEADER_TITLE, "Installation complete");
       eset (h, IDC_STATIC_HEADER, "Shows installation status in download-only mode.");
+#endif
     }
   else
     {
--- setup-FR/geturl.cc.orig	2014-05-05 11:32:03.944889600 +0200
+++ setup-FR/geturl.cc	2014-05-05 11:34:26.022095900 +0200
@@ -69,10 +69,17 @@
 
   string::size_type divide = url.find_last_of('/');
   max_bytes = length;
+#ifdef LANG_FR
+  Progress.SetText1("Télécharge...");
+  Progress.SetText2((url.substr(divide + 1) + " depuis "
+                     + url.substr(0, divide)).c_str());
+  Progress.SetText3("Connexion...");
+#else
   Progress.SetText1("Downloading...");
   Progress.SetText2((url.substr(divide + 1) + " from "
                      + url.substr(0, divide)).c_str());
   Progress.SetText3("Connecting...");
+#endif
   Progress.SetBar1(0);
   start_tics = GetTickCount ();
 }
@@ -98,14 +105,23 @@
     {
       int perc = (int)(100.0 * ((double)bytes) / (double)max_bytes);
       Progress.SetBar1(bytes, max_bytes);
+#ifdef LANG_FR
+      sprintf (buf, "%d %%  (%dk/%dk)  %03.1f ko/s",
+	       perc, bytes / 1000, max_bytes / 1000, kbps);
+#else
       sprintf (buf, "%d %%  (%dk/%dk)  %03.1f kB/s",
 	       perc, bytes / 1000, max_bytes / 1000, kbps);
+#endif
       if (total_download_bytes > 0)
      	  Progress.SetBar2(total_download_bytes_sofar + bytes,
 			   total_download_bytes);
     }
   else
+#ifdef LANG_FR
+    sprintf (buf, "%d  %2.1f ko/s", bytes, kbps);
+#else
     sprintf (buf, "%d  %2.1f kB/s", bytes, kbps);
+#endif
 
   Progress.SetText3(buf);
 }
@@ -231,7 +247,11 @@
     {
       const char *err = strerror (errno);
       if (!err)
+#ifdef LANG_FR
+	err = "(erreur inconnue)";
+#else
 	err = "(unknown error)";
+#endif
       fatal (owner, IDS_ERR_OPEN_WRITE, _filename.c_str(), err);
     }
 
--- setup-FR/ini.cc.orig	2014-05-05 11:32:04.035898700 +0200
+++ setup-FR/ini.cc	2014-05-05 11:37:30.808572700 +0200
@@ -60,7 +60,11 @@
 std::string ini_setup_version;
 std::string current_ini_sig_name;
 
+#ifdef LANG_FR
+static BoolOption NoVerifyOption (false, 'X', "no-verify", "Ne pas vérifier les signatures de setup.ini");
+#else
 static BoolOption NoVerifyOption (false, 'X', "no-verify", "Don't verify setup.ini signatures");
+#endif
 
 extern int yyparse ();
 /*extern int yydebug;*/
@@ -72,7 +76,11 @@
     {
       Progress.SetText2 ("");
       Progress.SetText3 ("");
+#ifndef LANG_FR
       Progress.SetText4 ("Progress:");
+#else
+      Progress.SetText4 ("Avancement :");
+#endif
     }
   virtual void progress(unsigned long const pos, unsigned long const max)
     {
@@ -96,7 +104,11 @@
     }
   virtual void iniName (const std::string& name)
     {
+#ifdef LANG_FR
+      Progress.SetText1 ("Analyse...");
+#else
       Progress.SetText1 ("Parsing...");
+#endif
       Progress.SetText2 (name.c_str());
       Progress.SetText3 ("");
     }
@@ -106,15 +118,27 @@
     }
   virtual void warning (const std::string& message)const
     {
+#ifdef LANG_FR
+      mbox (0, message.c_str(), "Attention", 0);
+#else
       mbox (0, message.c_str(), "Warning", 0);
+#endif
     }
   virtual void error(const std::string& message)const
     {
+#ifdef LANG_FR
+      mbox (0, message.c_str(), "Erreurs d'analyse", 0);
+#else
       mbox (0, message.c_str(), "Parse Errors", 0);
+#endif
     }
   virtual ~ GuiParseFeedback ()
     {
+#ifdef LANG_FR
+      Progress.SetText4("Paquet :");
+#else
       Progress.SetText4("Package:");
+#endif
     }
 private:
   unsigned int lastpct;
@@ -333,8 +357,13 @@
 	}
     }
 
+#ifdef LANG_FR
+  msg ("la version de l'assistant pour le .ini est %s, notre version est %s", ini_setup_version.size() ?
+       ini_setup_version.c_str() : "(vide)",
+#else
   msg (".ini setup_version is %s, our setup_version is %s", ini_setup_version.size() ?
        ini_setup_version.c_str () : "(null)",
+#endif
        setup_version);
   if (ini_setup_version.size ())
     {
--- setup-FR/IniDBBuilderPackage.cc.orig	2014-05-05 11:32:04.066901800 +0200
+++ setup-FR/IniDBBuilderPackage.cc	2014-05-05 11:34:26.100103700 +0200
@@ -57,9 +57,15 @@
 	{
 	  char old_vers[256];
 	  snprintf (old_vers, sizeof old_vers,
+#ifdef LANG_FR
+	    "Ce fichier ini correspond à une version plus récente de setup-FR-%s.exe. "
+	    "Si vous avezs des problèmes lors de l'installation, téléchargez "
+	    "la dernière version depuis http://lassauge.free.fr/cygwin/setup-FR-%s.exe",
+#else
 	    "The current ini file is from a newer version of setup-%s.exe. "
 	    "If you have any trouble installing, please download a fresh "
 	    "version from http://www.cygwin.com/setup-%s.exe",
+#endif
 	    is_64bit ? "x86_64" : "x86",
 	    is_64bit ? "x86_64" : "x86");
 	  _feedback.warning(old_vers);
--- setup-FR/install.cc.orig	2014-05-05 11:32:04.182913400 +0200
+++ setup-FR/install.cc	2014-05-05 11:34:26.128106500 +0200
@@ -73,9 +73,15 @@
 static long long int total_bytes_sofar = 0;
 static int package_bytes = 0;
 
+#ifdef LANG_FR
+static BoolOption NoReplaceOnReboot (false, 'r', "no-replaceonreboot",
+				     "Inhibe le remplacement des fichiers "
+				     "au prochain redémarrage.");
+#else
 static BoolOption NoReplaceOnReboot (false, 'r', "no-replaceonreboot",
 				     "Disable replacing in-use files on next "
 				     "reboot.");
+#endif
 
 struct std_dirs_t {
   const char *name;
@@ -152,7 +158,11 @@
 void
 Installer::preremoveOne (packagemeta & pkg)
 {
+#ifdef LANG_FR
+  Progress.SetText1 ("Lancement du script de pré-désinstallation...");
+#else
   Progress.SetText1 ("Running preremove script...");
+#endif
   Progress.SetText2 (pkg.name.c_str());
   log (LOG_PLAIN) << "Running preremove script for  " << pkg.name << endLog;
   try_run_script ("/etc/preremove/", pkg.name, ".sh");
@@ -162,7 +172,11 @@
 void
 Installer::uninstallOne (packagemeta & pkg)
 {
+#ifdef LANG_FR
+  Progress.SetText1 ("Désinstalle...");
+#else
   Progress.SetText1 ("Uninstalling...");
+#endif
   Progress.SetText2 (pkg.name.c_str());
   log (LOG_PLAIN) << "Uninstalling " << pkg.name << endLog;
   pkg.uninstall ();
@@ -202,7 +216,11 @@
     case HCBT_ACTIVATE:
       hWnd = (HWND)wParam;
       if (GetDlgItem(hWnd, IDCANCEL) != NULL)
+#ifdef LANG_FR
+         SetDlgItemText(hWnd, IDCANCEL, "Continuer");
+#else
          SetDlgItemText(hWnd, IDCANCEL, "Continue");
+#endif
       UnhookWindowsHookEx(hMsgBoxHook);
   }
   return CallNextHookEx(hMsgBoxHook, nCode, wParam, lParam);
@@ -366,15 +384,24 @@
 {
   if (!source.Canonical())
     return;
+#ifdef LANG_FR
+  Progress.SetText1 ("Installation");
+  Progress.SetText2 (source.Base () ? source.Base () : "(inconnu)");
+#else
   Progress.SetText1 ("Installing");
   Progress.SetText2 (source.Base () ? source.Base () : "(unknown)");
+#endif
 
   io_stream *pkgfile = NULL;
 
   if (!source.Cached() || !io_stream::exists (source.Cached ())
       || !(pkgfile = io_stream::open (source.Cached (), "rb", 0)))
     {
+#ifdef LANG_FR
+      note (NULL, IDS_ERR_OPEN_READ, source.Cached (), "Fichier inexistant");
+#else
       note (NULL, IDS_ERR_OPEN_READ, source.Cached (), "No such file");
+#endif
       ++errors;
       return;
     }
@@ -418,7 +445,11 @@
           else
             {
               note (NULL, IDS_ERR_OPEN_READ, source.Cached (),
+#ifdef LANG_FR
+                    "Format tar invalide on non supporté");
+#else
                     "Invalid or unsupported tar format");
+#endif
               ++errors;
             }
           delete try_decompress;
@@ -430,7 +461,11 @@
       /* Not a compressed tarball, not a plain tarball, give up.  */
       delete pkgfile;
       note (NULL, IDS_ERR_OPEN_READ, source.Cached (),
+#ifdef LANG_FR
+            "Format de fichier non reconnu");
+#else
             "Unrecognisable file format");
+#endif
       ++errors;
       return;
     }
@@ -522,7 +557,11 @@
                             // listed processes, or just ignore the problem and schedule the file to be
                             // replaced after a reboot
                             FileInuseDlgData dlg_data;
+#ifdef LANG_FR
+                            dlg_data.msg = ("Impossible d'extraire /" + fn).c_str ();
+#else
                             dlg_data.msg = ("Unable to extract /" + fn).c_str ();
+#endif
                             dlg_data.processlist = plm.c_str ();
                             dlg_data.iteration = iteration;
 
@@ -536,6 +575,15 @@
                             // All we can offer the user is a generic "retry or ignore" choice and a chance
                             // to fix the problem themselves
                             char msg[fn.size() + 300];
+#ifdef LANG_FR
+                            sprintf (msg,
+                                     "Incapable d'extraire /%s\r\n"
+                                     "Le fichier est utilisé ou une autre erreur est survenue.\r\n"
+                                     "Arrêtez tous les processus Cygwin et sélectionnez «Recommencer», ou\r\n"
+                                     "«Continuer» pour poursuivre (il faudra redémarrer).\r\n",
+                                     fn.c_str());
+                            rc = MessageBox (owner, msg, "Erreur à l'écriture du fichier",
+#else
                             sprintf (msg,
                                      "Unable to extract /%s\r\n"
                                      "The file is in use or some other error occurred.\r\n"
@@ -544,6 +592,7 @@
                                      fn.c_str());
 
                             rc = MessageBox (owner, msg, "Error writing file",
+#endif
                                              MB_RETRYCONTINUE | MB_ICONWARNING | MB_TASKMODAL);
                           }
                       }
@@ -603,7 +652,11 @@
                   {
                     char msg[fn.size() + 300];
                     sprintf (msg,
+#ifdef LANG_FR
+                             "Impossible d'extraire /%s -- paquet corrompu ?\r\n",
+#else
                              "Unable to extract /%s -- corrupt package?\r\n",
+#endif
                              fn.c_str());
 
                     // XXX: We should offer the option to retry,
@@ -614,7 +667,11 @@
                     // and ignore all errors is mis-implemented at present
                     // to only apply to errors arising from a single archive,
                     // so we degenerate to the continue option.
+#ifdef LANG_FR
+                    MessageBox (owner, msg, "Erreur extraction fichier",
+#else
                     MessageBox (owner, msg, "File extraction error",
+#endif
                                 MB_OK | MB_ICONWARNING | MB_TASKMODAL);
                   }
 
@@ -660,21 +717,38 @@
 
   char msg[sizeof (buf) + 132];
   sprintf (msg,
+#ifdef LANG_FR
+	   "Une ancienne version de cygwin1.dll a été trouvée ici :\r\n%s\r\nEffacer ?",
+#else
 	   "An old version of cygwin1.dll was found here:\r\n%s\r\nDelete?",
+#endif
 	   buf);
   switch (MessageBox
+#ifdef LANG_FR
+	  (owner, msg, "Qu'est-ce que ça fait là ?",
+#else
 	  (owner, msg, "What's that doing there?",
+#endif
 	   MB_YESNO | MB_ICONQUESTION | MB_TASKMODAL))
     {
     case IDYES:
       if (!DeleteFile (buf))
 	{
+#ifdef LANG_FR
+	  sprintf (msg, "Impossible de supprimer le fichier %s.\r\n"
+		   "La DLL est peut être utilisée par une autre application ?\r\n"
+		   "Vous devriez effacer la vieille version de cygwin1.dll\r\n"
+		   "dès que possible.", buf);
+	  MessageBox (owner, buf, "Impossible d'effacer le fichier",
+		      MB_OK | MB_ICONEXCLAMATION | MB_TASKMODAL);
+#else
 	  sprintf (msg, "Couldn't delete file %s.\r\n"
 		   "Is the DLL in use by another application?\r\n"
 		   "You should delete the old version of cygwin1.dll\r\n"
 		   "at your earliest convenience.", buf);
 	  MessageBox (owner, buf, "Couldn't delete file",
 		      MB_OK | MB_ICONEXCLAMATION | MB_TASKMODAL);
+#endif
 	}
       break;
     default:
@@ -728,7 +802,12 @@
   packagedb db;
 
   /* Calculate the amount of data to md5sum */
+#ifdef LANG_FR
+  Progress.SetText1("Calcul...");
+#else
   Progress.SetText1("Calculating...");
+#endif
+
   long long int md5sum_total_bytes = 0;
   for (packagedb::packagecollection::iterator i = db.packages.begin ();
        i != db.packages.end (); ++i)
@@ -851,8 +930,13 @@
     {
       const char *err = strerror (temperr);
       if (!err)
+#ifdef LANG_FR
+	err = "(erreur inconnue)";
+      fatal (owner, IDS_ERR_OPEN_WRITE, "Base de données des paquets",
+#else
 	err = "(unknown error)";
       fatal (owner, IDS_ERR_OPEN_WRITE, "Package Database",
+#endif
 	  err);
     }
 
@@ -924,9 +1008,15 @@
 
     log (LOG_BABBLE) << "Checking MD5 for " << fullname << endLog;
 
+#ifdef LANG_FR
+    Progress.SetText1 ((std::string ("Vérification MD5 pour ")
+                        + pkgsource.Base ()).c_str ());
+    Progress.SetText4 ("Avancement :");
+#else
     Progress.SetText1 ((std::string ("Checking MD5 for ")
                         + pkgsource.Base ()).c_str ());
     Progress.SetText4 ("Progress:");
+#endif
     Progress.SetBar1 (0);
 
     unsigned char buffer[16384];
--- setup-FR/localdir.cc.orig	2014-05-05 11:32:04.342929400 +0200
+++ setup-FR/localdir.cc	2014-05-05 11:34:26.153109000 +0200
@@ -47,7 +47,11 @@
 extern ThreeBarProgressPage Progress;
 extern LogFile * theLog;
 
+#ifdef LANG_FR
+static StringOption LocalDirOption ("", 'l', "local-package-dir", "Dossier local pour les paquets", false);
+#else
 static StringOption LocalDirOption ("", 'l', "local-package-dir", "Local package directory", false);
+#endif
 
 static ControlAdjuster::ControlInfo LocaldirControlsInfo[] = {
   { IDC_LOCALDIR_GRP,       CP_STRETCH,   CP_TOP },
--- setup-FR/main.cc.orig	2014-05-05 11:32:04.435938700 +0200
+++ setup-FR/main.cc	2014-05-05 11:39:26.719162600 +0200
@@ -91,12 +91,21 @@
 
 HINSTANCE hinstance;
 
+#ifdef LANG_FR
+static StringOption Arch ("", 'a', "arch", "Architecture à installer (x86_64 ou x86)", false);
+static BoolOption UnattendedOption (false, 'q', "quiet-mode", "Assistant sans messages");
+static BoolOption PackageManagerOption (false, 'M', "package-manager", "Mode assistant sélection seulement");
+static BoolOption NoAdminOption (false, 'B', "no-admin", "Ne pas vérifier et forcer à installer en tant qu'administrateur");
+static BoolOption WaitOption (false, 'W', "wait", "Attendre le process fils en mode élévation");
+static BoolOption HelpOption (false, 'h', "help", "Affiche l'aide");
+#else
 static StringOption Arch ("", 'a', "arch", "architecture to install (x86_64 or x86)", false);
 static BoolOption UnattendedOption (false, 'q', "quiet-mode", "Unattended setup mode");
 static BoolOption PackageManagerOption (false, 'M', "package-manager", "Semi-attended chooser-only mode");
 static BoolOption NoAdminOption (false, 'B', "no-admin", "Do not check for and enforce running as Administrator");
 static BoolOption WaitOption (false, 'W', "wait", "When elevating, wait for elevated child process");
 static BoolOption HelpOption (false, 'h', "help", "print help");
+#endif
 
 static void inline
 set_cout ()
@@ -220,6 +229,10 @@
   snprintf(locale, sizeof locale, ".%u", GetACP());
   setlocale(LC_ALL, locale);
 
+#ifdef LANG_FR /* A Bit ugly but to be debugged wrt to above 2 lines */
+  SetThreadLocale(MAKELCID(MAKELANGID(LANG_FRENCH,SUBLANG_FRENCH),SORT_DEFAULT));
+#endif
+
   char **_argv;
   int argc;
   for (argc = 0, _argv = __argv; *_argv; _argv++)
@@ -250,9 +263,15 @@
     else
       {
 	char buff[80 + ((string) Arch).size ()];
+#ifdef LANG_FR
+	sprintf (buff, "Option invalide pour --arch:  \"%s\"", ((string) Arch).c_str ());
+	fprintf (stderr, "*** %s\n", buff);
+	MessageBox (NULL, buff, "Option invalide", MB_ICONEXCLAMATION | MB_OK);
+#else
 	sprintf (buff, "Invalid option for --arch:  \"%s\"", ((string) Arch).c_str ());
 	fprintf (stderr, "*** %s\n", buff);
 	MessageBox (NULL, buff, "Invalid option", MB_ICONEXCLAMATION | MB_OK);
+#endif
 	exit (1);
       }
 
@@ -291,7 +310,11 @@
 
     if (HelpOption)
       GetOption::GetInstance ().ParameterUsage (log (LOG_PLAIN)
+#ifdef LANG_FR
+						<< "\nOptions de ligne de commande :\n");
+#else
 						<< "\nCommand Line Options:\n");
+#endif
     else
       {
 	if (elevate)
--- setup-FR/Makefile.am.orig	2014-05-05 11:32:04.456940800 +0200
+++ setup-FR/Makefile.am	2014-05-05 11:34:26.222115900 +0200
@@ -129,6 +129,7 @@
 	crypto.cc \
 	crypto.h \
 	cyg-pubkey.h \
+	sec-pubkey.h \
 	cygpackage.cc \
 	cygpackage.h \
 	desktop.cc \
@@ -286,7 +287,7 @@
 res.o: @SETUP@.exe.manifest
 
 .rc.o:
-	$(AM_V_GEN)$(WINDRES) --include-dir $(srcdir) -o $@ $<
+	$(AM_V_GEN)$(WINDRES) -DLANG_FR --include-dir $(srcdir) -o $@ $<
 
 # static const char version_store[] = VERSION_PREFIX " 2.686";
 setup-src:
--- setup-FR/msg.cc.orig	2014-05-05 11:32:04.541949300 +0200
+++ setup-FR/msg.cc	2014-05-05 11:34:43.979891500 +0200
@@ -70,7 +70,11 @@
 	    return 0;
 	}
     }
+#ifdef LANG_FR
+  return MessageBox (owner, buf, "Assistant Cygwin", type);
+#else
   return MessageBox (owner, buf, "Cygwin Setup", type);
+#endif
 }
 
 static int
--- setup-FR/net.cc.orig	2014-05-05 11:32:04.565951700 +0200
+++ setup-FR/net.cc	2014-05-05 11:34:44.003893900 +0200
@@ -40,7 +40,11 @@
 #include "ConnectionSetting.h"
 extern ThreeBarProgressPage Progress;
 
+#ifdef LANG_FR
+static StringOption ProxyOption ("", 'p', "proxy", "Proxy HTTP/FTP (serveur:port)", false);
+#else
 static StringOption ProxyOption ("", 'p', "proxy", "HTTP/FTP proxy (host:port)", false);
+#endif
 
 static int rb[] = { IDC_NET_IE5, IDC_NET_DIRECT, IDC_NET_PROXY, 0 };
 static bool doing_loading = false;
--- setup-FR/nio-file.cc.orig	2014-05-05 11:32:04.613956500 +0200
+++ setup-FR/nio-file.cc	2014-05-05 11:34:44.028896400 +0200
@@ -44,7 +44,11 @@
     {
       const char *err = strerror (errno);
       if (!err)
+#ifdef LANG_FR
+	err = "(erreur inconnue)";
+#else
 	err = "(unknown error)";
+#endif
       note (NULL, IDS_ERR_OPEN_READ, path, err);
     }
 }
--- setup-FR/nio-ie5.cc.orig	2014-05-05 11:32:04.702965400 +0200
+++ setup-FR/nio-ie5.cc	2014-05-05 11:34:44.076901200 +0200
@@ -91,7 +91,11 @@
 	  char buf[2000];
 	  DWORD e, l = sizeof (buf);
 	  InternetGetLastResponseInfo (&e, buf, &l);
+#ifndef LANG_FR
 	  MessageBox (0, buf, "Internet Error", 0);
+#else
+	  MessageBox (0, buf, "Erreur Internet", 0);
+#endif
 	}
     }
 
--- setup-FR/package_message.h.orig	2014-05-05 11:32:04.766971800 +0200
+++ setup-FR/package_message.h	2014-05-05 11:34:44.099903500 +0200
@@ -33,7 +33,12 @@
   {
     if (unattended_mode || !id.length () || UserSettings::instance().get (id.c_str ()))
       /* No message or already seen */;
+
+#ifdef LANG_FR
+    else if (MessageBox (NULL, message.c_str (), "Alerte Assistant Cygwin",
+#else
     else if (MessageBox (NULL, message.c_str (), "Setup Alert",
+#endif
 			 MB_OKCANCEL | MB_ICONSTOP | MB_SETFOREGROUND
 			 | MB_TOPMOST) != IDCANCEL)
       UserSettings::instance().set (id.c_str (), "1");
--- setup-FR/package_meta.cc.orig	2014-05-05 11:32:04.777972900 +0200
+++ setup-FR/package_meta.cc	2014-05-05 11:34:44.117905300 +0200
@@ -51,10 +51,17 @@
 
 using namespace std;
 
+#ifdef LANG_FR
+static StringArrayOption DeletePackageOption ('x', "remove-packages", "Spécifie les paquests à désinstaller");
+static StringArrayOption DeleteCategoryOption ('c', "remove-categories", "Spécifie les catégories à désinstaller");
+static StringArrayOption PackageOption ('P', "packages", "Spécifie les paquets à installer");
+static StringArrayOption CategoryOption ('C', "categories", "Spécifie les categories à installer");
+#else
 static StringArrayOption DeletePackageOption ('x', "remove-packages", "Specify packages to uninstall");
 static StringArrayOption DeleteCategoryOption ('c', "remove-categories", "Specify categories to uninstall");
 static StringArrayOption PackageOption ('P', "packages", "Specify packages to install");
 static StringArrayOption CategoryOption ('C', "categories", "Specify entire categories to install");
+#endif
 bool hasManualSelections = 0;
 
 /*****************/
@@ -78,13 +85,29 @@
   switch (_value)
     {
     case 0:
+#ifndef LANG_FR
       return "Default";
+#else
+      return "Défaut";
+#endif
     case 1:
+#ifndef LANG_FR
       return "Install";
+#else
+      return "Installe";
+#endif
     case 2:
+#ifndef LANG_FR
       return "Reinstall";
+#else
+      return "Réinstalle";
+#endif
     case 3:
+#ifndef LANG_FR
       return "Uninstall";
+#else
+      return "Désinstalle";
+#endif
     }
   // Pacify GCC: (all case options are checked above)
   return 0;
@@ -388,16 +411,32 @@
 packagemeta::action_caption () const
 {
   if (!desired && installed)
+#ifdef LANG_FR
+    return "Désinstalle";
+#else
     return "Uninstall";
+#endif
   else if (!desired)
+#ifdef LANG_FR
+    return "Passe";
+#else
     return "Skip";
+#endif
   else if (desired == installed && desired.picked())
+#ifdef LANG_FR
+    return packagedb::task == PackageDB_Install ? "Réinstalle" : "Récupère";
+#else
     return packagedb::task == PackageDB_Install ? "Reinstall" : "Retrieve";
+#endif
   else if (desired == installed && desired.sourcePackage() && desired.sourcePackage().picked())
     /* FIXME: Redo source should come up if the tarball is already present locally */
     return "Source";
   else if (desired == installed)	/* and neither src nor bin */
+#ifdef LANG_FR
+    return "Garde";
+#else
     return "Keep";
+#endif
   else
     return desired.Canonical_version ();
 }
--- setup-FR/PickView.cc.orig	2014-05-05 11:32:04.950990200 +0200
+++ setup-FR/PickView.cc	2014-05-05 11:34:44.142907800 +0200
@@ -30,6 +30,30 @@
 
 using namespace std;
 
+#ifdef LANG_FR
+static PickView::Header pkg_headers[] = {
+    {"Actuel", 0, 0, true},
+    {"Nouveau", 0, 0, true},
+    {"Bin?", 0, 0, false},
+    {"Src?", 0, 0, false},
+    {"Catégories", 0, 0, true},
+    {"Taille", 0, 0, true},
+    {"Paquet", 0, 0, true},
+    {0, 0, 0, false}
+};
+  
+static PickView::Header cat_headers[] = {
+    {"Catégorie", 0, 0, true},
+    {"Actuel", 0, 0, true},
+    {"Nouveau", 0, 0, true},
+    {"Bin?", 0, 0, false},
+    {"Src?", 0, 0, false},
+    {"Taille", 0, 0, true},
+    {"Paquet", 0, 0, true},
+    {0, 0, 0, false}
+};
+
+#else
 static PickView::Header pkg_headers[] = {
   {"Current", 0, 0, true},
   {"New", 0, 0, true},
@@ -51,6 +75,7 @@
   {"Package", 0, 0, true},
   {0, 0, 0, false}
 };
+#endif
 
 // PickView:: views
 const PickView::views PickView::views::Unknown (0);
@@ -237,6 +262,18 @@
 {
   switch (_value)
     {
+#ifdef LANG_FR
+    case 1:
+      return "Tout";
+    case 2:
+      return "En attente";
+    case 3:
+      return "À jour";
+    case 4:
+      return "Non installé";
+    case 5:
+      return "Catégorie";
+#else
     case 1:
       return "Full";
     case 2:
@@ -247,6 +284,7 @@
       return "Not Installed";
     case 5:
       return "Category";
+#endif
     default:
       return "";
     }
@@ -445,8 +483,13 @@
   // FIXME: What's up with the "0"? It's probably a mistake, and should be
   // "". It used to be written as 0, and was subject to a bizarre implicit
   // conversion by the unwise String(int) constructor.
+#ifdef LANG_FR
+  note_width (headers, dc, "0", HMARGIN + 18, bintick_col);
+  note_width (headers, dc, "0", HMARGIN + 18, srctick_col);
+#else
   note_width (headers, dc, "0", HMARGIN + 11, bintick_col);
   note_width (headers, dc, "0", HMARGIN + 11, srctick_col);
+#endif
   
   // accomodate the width of each category name
   packagedb db;
@@ -510,8 +553,13 @@
     }
   
   // ensure that the new_col is wide enough for all the labels
+#ifdef LANG_FR
+  const char *captions[] = { "Désinstalle", "Saute", "Réinstalle", "Récupère", 
+                             "Source", "Garde", NULL };
+#else
   const char *captions[] = { "Uninstall", "Skip", "Reinstall", "Retrieve", 
                              "Source", "Keep", NULL };
+#endif
   for (int i = 0; captions[i]; i++)
     note_width (headers, dc, captions[i], HMARGIN + SPIN_WIDTH, new_col);
 
@@ -911,9 +959,17 @@
 
   if (contents.itemcount () == 0)
     {
+#ifdef LANG_FR
+      static const char *msg = "Rien à Installer/Mettre à jour";
+#else
       static const char *msg = "Nothing to Install/Update";
+#endif
       if (source == IDC_SOURCE_DOWNLOAD)
+#ifdef LANG_FR
+        msg = "Rien à télécharger";
+#else
         msg = "Nothing to Download";
+#endif
       TextOut (hdc, x + HMARGIN, y, msg, strlen (msg));
     }
 
--- setup-FR/postinstall.cc.orig	2014-05-05 11:32:04.975992700 +0200
+++ setup-FR/postinstall.cc	2014-05-05 11:34:44.166910200 +0200
@@ -126,7 +126,11 @@
 static std::string
 do_postinstall_thread (HINSTANCE h, HWND owner)
 {
+#ifndef LANG_FR
   Progress.SetText1 ("Running...");
+#else
+  Progress.SetText1 ("Exécution ...");
+#endif
   Progress.SetText2 ("");
   Progress.SetText3 ("");
   Progress.SetBar1 (0, 1);
--- setup-FR/prereq.cc.orig	2014-05-05 11:32:05.034998600 +0200
+++ setup-FR/prereq.cc	2014-05-05 11:34:44.190912600 +0200
@@ -98,11 +98,19 @@
     {
       // breakage imminent!  danger, danger
       int res = MessageBox (h, 
+#ifdef LANG_FR
+          "Les paquets suivants sont requis en dépendance des paquets à installer"
+          "Nous vous recommandons de laisser l'assistant les installer"
+          "\r\n\r\n"
+          "Voulez vous continuer ?",
+          "ATTENTION - Paquets nécessaires non sélectionnés",
+#else
           "The listed packages are required for packages depending on them to "
           "work.  We strongly recommend that you allow Setup to select them."
           "\r\n\r\n"
           "Are you sure you want to proceed without these packages?",
           "WARNING - Required Packages Not Selected",
+#endif
           MB_YESNO | MB_ICONEXCLAMATION | MB_DEFBUTTON2);
       if (res == IDNO)
         return -1;
@@ -173,7 +181,11 @@
 {
   packagedb db;
 
+#ifdef LANG_FR
+  Progress.SetText1 ("Vérification des dépendances...");
+#else
   Progress.SetText1 ("Checking prerequisites...");
+#endif
   Progress.SetText2 ("");
   Progress.SetText3 ("");
 
@@ -251,7 +263,11 @@
       s = s + i->first->name
 	    + "\t(" + i->first->trustp (theTrust).Canonical_version ()
 	    + ")\r\n\t" + i->first->SDesc ()
+#ifdef LANG_FR
+	    + "\r\n\tRequis par : ";
+#else
 	    + "\r\n\tRequired by: ";
+#endif
       for (unsigned int j = 0; j < i->second.size(); j++)
         {
           s += i->second[j]->name;
--- setup-FR/propsheet.cc.orig	2014-05-05 11:32:05.114006500 +0200
+++ setup-FR/propsheet.cc	2014-05-05 11:34:44.217915300 +0200
@@ -178,8 +178,13 @@
 	break;
     areyousure:
       if (MessageBox(hwnd,
+#ifdef LANG_FR
+		     "Voulez-vous vraiment quitter l'assistant ? Les téléchargements ou installations en cours seront annulés.",
+		     "Quitter l'assistant Cygwin ?", MB_YESNO) == IDNO)
+#else
 		     "Are you sure you want to exit setup? Any current download or installation will be aborted.",
 		     "Exit Cygwin Setup?", MB_YESNO) == IDNO)
+#endif
 	return 0;
       break;
     case WM_SIZE:
--- setup-FR/resource.h.orig	2014-05-05 11:32:05.270022100 +0200
+++ setup-FR/resource.h	2014-05-05 11:34:44.271920700 +0200
@@ -174,3 +174,8 @@
 #define IDC_FILE_INUSE_EDIT               590
 #define IDC_FILE_INUSE_MSG                591
 #define IDC_FILE_INUSE_HELP               592
+
+#ifdef LANG_FR
+  #define IDC_SPLASH_FR_URL               600
+  #define IDC_SPLASH_FR_COPYR             601
+#endif
--- setup-FR/root.cc.orig	2014-05-05 11:32:05.278022900 +0200
+++ setup-FR/root.cc	2014-05-05 11:34:44.289922500 +0200
@@ -44,7 +44,11 @@
 
 using namespace std;
 
+#ifdef LANG_FR
+StringOption RootOption ("", 'R', "root", "Dossier racine de l'installation", false);
+#else
 StringOption RootOption ("", 'R', "root", "Root installation directory", false);
+#endif
 
 static ControlAdjuster::ControlInfo RootControlsInfo[] = {
   { IDC_ROOTDIR_GRP,              CP_STRETCH,           CP_TOP      },
@@ -109,7 +113,11 @@
   memset (&bi, 0, sizeof (bi));
   bi.hwndOwner = h;
   bi.pszDisplayName = name;
+#ifdef LANG_FR
+  bi.lpszTitle = "Choisissez le dossier racine de l'installation";
+#else
   bi.lpszTitle = "Select an installation root directory";
+#endif
   bi.ulFlags = BIF_RETURNONLYFSDIRS;
   bi.lpfn = browse_cb;
   pidl = SHBrowseForFolder (&bi);
@@ -210,6 +218,19 @@
   /* Forestall mixing. */
   const char *setup_ver = is_64bit ? "64" : "32";
   const char *inst_ver = is_64bit ? "32" : "64";
+#ifdef LANG_FR
+  snprintf (text, sizeof text,
+	"Vous essayez d'installer une version %s bits de Cygwin dans un dossier\n"
+	"qui contient une version %s bits de Cygwin.  Si vous insistez, vous aller\n"
+	"casser l'installation existante.\n\n"
+	"Lancez soit http://lassauge.free.fr/cygwin/setup-FR-%s.exe pour mettre à jour \n"
+	"votre installation %s bits de Cygwin, ou choisissez un autre dossier\n"
+	"pour votre installation %s bits.",
+	setup_ver, inst_ver,
+	is_64bit ? "x86" : "x86_64",
+	inst_ver, setup_ver);
+  MessageBox (h, text, "Erreur CPU cible", MB_OK);
+#else
   snprintf (text, sizeof text,
 	"You're trying to install a %s bit version of Cygwin into a directory\n"
 	"containing a %s bit version of Cygwin.  Continuing to do so would\n"
@@ -221,6 +242,7 @@
 	is_64bit ? "x86" : "x86_64",
 	inst_ver, setup_ver);
   MessageBox (h, text, "Target CPU mismatch", MB_OK);
+#endif
   return 1;
 }
 
--- setup-FR/sec-pubkey.h.orig	2014-05-05 11:34:04.449938900 +0200
+++ setup-FR/sec-pubkey.h	2014-05-05 11:34:44.318925400 +0200
@@ -12,3 +12,17 @@
     ")"
 ")"
 
+
+/* Autogenerated from: lassauge.pub
+ *		 by: ./gpg-key-to-s-expr.sh
+ *		 at: Fri Oct 24 13:58:21 2008			*/
+
+"(public-key "
+    "(dsa "
+        "(p #00b6007883a3a60cae36b7ba6577607ecc44e37a07592185cf33e2c2b3336cdf5f6bb8825d29f03de775c0c1b8776667f23a7817220b883ca88f02a308f9b285d558f56606cef41b1775578f2fd740987fe4e171e2575aebecbd3f6d2ff7cf1d6f1f2c456d5a4c09a16c22a4c0abdc1bd34bd0e14f85a06636f29f36db168d46d7#) "
+        "(q #00b3ae2ff5143522fe501b8a68f30dfde44a91644d#) "
+        "(g #08bfa4c476695c78d7398b7526fe21df0b64f2a7472c838d21aca009cd11e7d1ddb41af9823c54693c778fa1863eaadddf7daf030e928865f2474873514aad335839c68c7835fa3c1ad0d3e2a7728ac440e58371177f2c438b1ff577004260eb7e7d3055018eee85c6c163890c461c3e2d71a45d4df32850bcaa44903aba17a4#) "
+        "(y #2252acc47600644271b4bcf93d9b98161b95008c91a906af65011ee771a706c211604aec354df4486aa942cc5366e2a71c83eca84de86fd8345e1b16e3386d923ad9c26534046c442ccae2c56ba7bc595b6ad69a8dd07b8fb037e637c9fb1ec8196dfa510233b7d0b617a93352f0dc1b13a9edeb43b935fa80d27ce800612d9d#)"
+    ")"
+")"
+
--- setup-FR/setup.exe.manifest.orig	2014-05-05 11:32:05.354030500 +0200
+++ setup-FR/setup.exe.manifest	2014-10-27 11:44:23.278680300 +0100
@@ -36,6 +36,8 @@
       
       
        
+      
+      
     
   
 
--- setup-FR/setup64.exe.manifest.orig	2014-05-05 11:32:05.371032200 +0200
+++ setup-FR/setup64.exe.manifest	2014-10-27 11:44:23.323684800 +0100
@@ -36,6 +36,8 @@
       
       
        
+      
+      
     
   
 
--- setup-FR/site.cc.orig	2014-05-05 11:32:05.402035300 +0200
+++ setup-FR/site.cc	2014-05-05 11:34:44.337927300 +0200
@@ -99,9 +99,17 @@
 /* Stale selected sites to warn about and add to cache */
 SiteList dropped_site_list;
 
+#ifdef LANG_FR
+StringArrayOption SiteOption('s', "site", "Site de téléchargement");
+#else
 StringArrayOption SiteOption('s', "site", "Download site");
+#endif
 
+#ifdef LANG_FR
+BoolOption OnlySiteOption(false, 'O', "only-site", "Ignorer tous les sites sauf pour -s");
+#else
 BoolOption OnlySiteOption(false, 'O', "only-site", "Ignore all sites except for -s");
+#endif
 
 SiteSetting::SiteSetting (): saved (false)
 {
@@ -411,10 +419,16 @@
     {
       // Error: Couldn't download the site info.
       // Go back to the Net setup page.
+#ifndef LANG_FR
       MessageBox (h, TEXT ("Can't get list of download sites.\n")
           TEXT("Make sure your network settings are correct and try again."),
           NULL, MB_OK);
 
+#else
+      MessageBox (h, TEXT ("Impossible d'avoir la liste des sites.\n")
+	  TEXT("Vérifiez que vos paramètres réseau sont corrects et réessayez."),
+	  TEXT("Erreur"), MB_OK);
+#endif
       // Tell the progress page that we're done downloading
       Progress.PostMessageNow (WM_APP_SITE_INFO_DOWNLOAD_COMPLETE, 0, IDD_NET);
     }
--- setup-FR/source.cc.orig	2014-05-05 11:32:05.425037600 +0200
+++ setup-FR/source.cc	2014-05-05 11:34:44.362929800 +0200
@@ -38,8 +38,13 @@
 
 #include "getopt++/BoolOption.h"
 
+#ifdef LANG_FR
+static BoolOption DownloadOption (false, 'D', "download", "Télécharger depuis internet");
+static BoolOption LocalOption (false, 'L', "local-install", "Installer depuis un répertoire local");
+#else
 static BoolOption DownloadOption (false, 'D', "download", "Download from internet");
 static BoolOption LocalOption (false, 'L', "local-install", "Install from local directory");
+#endif
 
 static int rb[] =
   { IDC_SOURCE_NETINST, IDC_SOURCE_DOWNLOAD, IDC_SOURCE_LOCALDIR, 0 };
--- setup-FR/splash.cc.orig	2014-05-05 11:32:05.475042600 +0200
+++ setup-FR/splash.cc	2014-05-05 11:34:44.386932200 +0200
@@ -25,8 +25,13 @@
   { IDC_SPLASH_TEXT,        CP_STRETCH,   CP_STRETCH },
   { IDC_SPLASH_ICON,        CP_LEFT,      CP_BOTTOM },
   { IDC_VERSION,            CP_LEFT,      CP_BOTTOM },
+#ifndef LANG_FR
   { IDC_SPLASH_COPYR,       CP_LEFT,      CP_BOTTOM },
   { IDC_SPLASH_URL,         CP_LEFT,      CP_BOTTOM },
+#else
+  { IDC_SPLASH_FR_COPYR,    CP_LEFT,      CP_BOTTOM },
+  { IDC_SPLASH_FR_URL,      CP_LEFT,      CP_BOTTOM },
+#endif
   {0, CP_LEFT, CP_TOP}
 };
 
@@ -45,9 +50,17 @@
 SplashPage::OnInit ()
 {
   std::string ver = "Setup.exe version ";
+#ifdef LANG_FR
+  ver += (setup_version[0] ? setup_version : "[inconnue]");
+  ver += is_64bit ? " (64 bits)" : " (32 bits)";
+#else
   ver += (setup_version[0] ? setup_version : "[unknown]");
   ver += is_64bit ? " (64 bit)" : " (32 bit)";
+#endif
   SetDlgItemFont(IDC_VERSION, "Arial", 10, FW_BOLD);
   ::SetWindowText (GetDlgItem (IDC_VERSION), ver.c_str());
   makeClickable (IDC_SPLASH_URL, "http://www.cygwin.com");
+#ifdef LANG_FR
+  makeClickable (IDC_SPLASH_FR_URL, "http://lassauge.free.fr/cygwin/release");
+#endif
 }
--- setup-FR/threebar.cc.orig	2014-05-05 11:32:05.618056900 +0200
+++ setup-FR/threebar.cc	2014-05-05 11:34:44.410934600 +0200
@@ -110,8 +110,15 @@
 {
   int percent = (int) (100.0 * ((double) progress) / (double) max);
   SendMessage (ins_iprogress, PBM_SETPOS, (WPARAM) percent, 0);
+#ifdef LANG_FR
+  std::string sp = stringify(percent);
+  std::string s="Assistant Cygwin - ";
+  s += sp;
+  s += "%";
+#else
   std::string s = stringify(percent);
   s += "% - Cygwin Setup";
+#endif
   GetOwner ()->SetWindowText (s.c_str());
 }
 
@@ -196,7 +203,11 @@
 	  }
 	else
 	  {
+#ifdef LANG_FR
+	    fatal("Sortie non attendue du thread de téléchargement", NO_ERROR);
+#else
 	    fatal("Unexpected fallthrough from the download thread", NO_ERROR);
+#endif
 	  }
 	break;
       }