diff --git a/htdocs/admin/ihm.php b/htdocs/admin/ihm.php
index 68a5a56077f9fb300ae73d3ec2a717c089e6aec1..9fff190773906251b586fff4b73864de2cc82a75 100644
--- a/htdocs/admin/ihm.php
+++ b/htdocs/admin/ihm.php
@@ -96,7 +96,7 @@ if (isset($_GET["action"]) && $_GET["action"] == 'edit')
     $var=!$var;
     print '<tr '.$bc[$var].'><td width="35%">'.$langs->trans("DefaultLanguage").'</td><td>';
     $html=new Form($db);
-    $html->select_lang($conf->global->MAIN_LANG_DEFAULT,'main_lang_default');
+    $html->select_lang($conf->global->MAIN_LANG_DEFAULT,'main_lang_default',1);
     print '</td></tr>';
 
 
@@ -200,7 +200,7 @@ else
     print '<tr class="liste_titre"><td>'.$langs->trans("Parameter").'</td><td>'.$langs->trans("Value").'</td></tr>';
 
     $var=!$var;
-    print '<tr '.$bc[$var].'><td width="35%">'.$langs->trans("DefaultLanguage").'</td><td>' . $conf->global->MAIN_LANG_DEFAULT . '</td></tr>';
+    print '<tr '.$bc[$var].'><td width="35%">'.$langs->trans("DefaultLanguage").'</td><td>' . ($conf->global->MAIN_LANG_DEFAULT=='auto'?$langs->trans("AutoDetectLang"):$conf->global->MAIN_LANG_DEFAULT) . '</td></tr>';
 
     $var=!$var;
     print '<tr '.$bc[$var].'><td>'.$langs->trans("DefaultMaxSizeList").'</td><td>' . $conf->global->SIZE_LISTE_LIMIT . '</td></tr>';
@@ -279,7 +279,7 @@ else
     print '<tr class="liste_titre"><td>'.$langs->trans("Parameter").'</td><td>'.$langs->trans("Value").'</td></tr>';
     $var=!$var;
     print '<tr '.$bc[$var].'><td width="35%">'.$langs->trans("MessageOfDay").'</td><td>' . stripslashes(nl2br($conf->global->MAIN_MOTD)) . '</td></tr>';
-    print '</table><br>';
+    print '</table>';
 
     print '<div class="tabsAction">';
     print '<a class="tabAction" href="ihm.php?action=edit">'.$langs->trans("Edit").'</a>';
diff --git a/htdocs/html.form.class.php b/htdocs/html.form.class.php
index da3e34b0d526152c2e23837e0dfd09de3a53f0b2..c8636d3779bfe6430dfad68ac280392cfa3c0fa7 100644
--- a/htdocs/html.form.class.php
+++ b/htdocs/html.form.class.php
@@ -240,37 +240,44 @@ class Form
   }
 
 
-  /**
-   *    \brief      Retourne la liste d�roulante des langues disponibles
-   *    \param      selected        Langue pr�s�lectionn�e
-   *    \param      htmlname        Nom de la zone select
-   */
-  function select_lang($selected='',$htmlname='lang_id')
-  {
-    global $langs;
-
-    $langs_available=$langs->get_available_languages();
+    /**
+     *    \brief      Retourne la liste d�roulante des langues disponibles
+     *    \param      selected        Langue pr�s�lectionn�e
+     *    \param      htmlname        Nom de la zone select
+     *    \param      showauto        Affiche choix auto
+     */
+    function select_lang($selected='',$htmlname='lang_id',$showauto=0)
+    {
+        global $langs;
     
-    print '<select class="flat" name="'.$htmlname.'">';
-    $num = count($langs_available);
-    $i = 0;
-    if ($num)
-      {
-	while ($i < $num)
-	  {
-	    if ($selected == $langs_available[$i])
-	      {
-		print '<option value="'.$langs_available[$i].'" selected="true">'.$langs_available[$i].'</option>';
-	      }
-	    else
-	      {
-		print '<option value="'.$langs_available[$i].'">'.$langs_available[$i].'</option>';
-	      }
-	    $i++;
-	  }
-      }
-    print '</select>';
-  }
+        $langs_available=$langs->get_available_languages();
+    
+        print '<select class="flat" name="'.$htmlname.'">';
+        if ($showauto)
+        {
+            print '<option value="auto"';
+            if ($selected == 'auto') print ' selected="true"';
+            print '>'.$langs->trans("AutoDetectLang").'</option>';
+        }
+        $num = count($langs_available);
+        $i = 0;
+        if ($num)
+        {
+            while ($i < $num)
+            {
+                if ($selected == $langs_available[$i])
+                {
+                    print '<option value="'.$langs_available[$i].'" selected="true">'.$langs_available[$i].'</option>';
+                }
+                else
+                {
+                    print '<option value="'.$langs_available[$i].'">'.$langs_available[$i].'</option>';
+                }
+                $i++;
+            }
+        }
+        print '</select>';
+    }
 
 
     /**
diff --git a/htdocs/install/index.php b/htdocs/install/index.php
index 543cd0c91661991192b40d05d6432e56da2f7b02..89590a6d7f5c52fe6aba00b7696dbf1dbb1712e7 100644
--- a/htdocs/install/index.php
+++ b/htdocs/install/index.php
@@ -29,6 +29,7 @@
 */
 
 include_once("./inc.php");
+include_once("../html.form.class.php");
 
 
 $err = 0;
@@ -38,6 +39,7 @@ $err = 0;
 if (file_exists($conffile))
 {
     header("Location: check.php");
+    exit;
 }
 
 
@@ -51,28 +53,14 @@ $langs->load("admin");
 $langs_available=$langs->get_available_languages("..");
 $selected=$langs->defaultlang;
 
+define('DOL_DOCUMENT_ROOT','..');
+
 print '<br><br>';
 print '<table><tr>';
-print '<td>'.$langs->trans("DefaultLanguage").' : </td><td align="left"> &nbsp;';
-print '<select name="selectlang">';
-$num = count($langs_available);
-$i = 0;
-if ($num)
-  {
-while ($i < $num)
-  {
-    if ($selected == $langs_available[$i])
-      {
-	print '<option value="'.$langs_available[$i].'" selected="true">'.$langs_available[$i].'</option>';
-      }
-    else
-      {
-	print '<option value="'.$langs_available[$i].'">'.$langs_available[$i].'</option>';
-      }
-    $i++;
-  }
-  }
-print '</select></td>';
+print '<td>'.$langs->trans("DefaultLanguage").' : </td><td align="left">';
+$html=new Form('');
+$html->select_lang($selected,'selectlang',1);
+print '</td>';
 print '</tr></table>';
 
 
diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang
index 8b9a06e431de1d08f47d219559a7a4980af605aa..d1d7a0988c5db8dd1eed12a3d48698161bce506a 100644
--- a/htdocs/langs/en_US/admin.lang
+++ b/htdocs/langs/en_US/admin.lang
@@ -31,6 +31,7 @@ System=System
 SystemInfo=System informations
 Yes=Yes
 No=No
+AutoDetectLang=Autodetect (browser language)
 Rights=Permissions
 BoxesDesc=Boxes are screen area that show some informations on some pages. You can choose between showing or not a such box by selecting target page en clicking 'Activate', or by clicking the dustbin to disable it. Only boxes about enabled <a href="modules.php">modules</a> are shown.
 ModulesDesc=Dolibarr modules define which functionality is enabled in software. Some modules require permissions you must grant to users, after enabling module.
diff --git a/htdocs/langs/fr_FR/admin.lang b/htdocs/langs/fr_FR/admin.lang
index 0430b63167c6a7c55b817bf42309a37e6d2345d0..6d2d0f4b60bdacf1b5dcdd5c5758f44100d3a121 100644
--- a/htdocs/langs/fr_FR/admin.lang
+++ b/htdocs/langs/fr_FR/admin.lang
@@ -31,6 +31,7 @@ System=Syst
 SystemInfo=Infos Syst�me
 Yes=Oui
 No=Non
+AutoDetectLang=Detection auto (langue navigateur)
 Rights=Permissions
 BoxesDesc=Les bo�tes sont des zones d'information r�duites qui s'affichent sur certaines pages. Vous pouvez choisir ou non d'activer une bo�te en s�lectionnant la page cible et en cliquant sur 'Activer', ou en cliquant sur la poubelle pour la d�sactiver. Seules les bo�tes en rapport avec un <a href="modules.php">module</a> actif sont pr�sent�es.
 ModulesDesc=Les modules Dolibarr d�finissent les fonctionnalit�s disponibles dans l'application. Certains modules n�cessitent des droits qu'il vous faudra affecter aux utilisateurs pour qu'ils puissent acc�der � leurs fonctionnalit�s.
diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php
index c15c268d2c540661f6c7fe7c59a624d6b4765c86..81fc1e527b3ebcd5aefdfa1b71efe4b389932b8f 100644
--- a/htdocs/main.inc.php
+++ b/htdocs/main.inc.php
@@ -3,7 +3,7 @@
  * Copyright (C) 2003      Xavier Dutoit        <doli@sydesy.com>
  * Copyright (C) 2004-2005 Laurent Destailleur  <eldy@users.sourceforge.net>
  * Copyright (C) 2004      Sebastien Di Cintio  <sdicintio@ressource-toi.org>
- * Copyright (C) 2004      Benoit Mortier	<benoit.mortier@opensides.be>
+ * Copyright (C) 2004      Benoit Mortier       <benoit.mortier@opensides.be>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
diff --git a/htdocs/translate.class.php b/htdocs/translate.class.php
index a94de46ad6e2e9c9115bc0731125b5329911df66..3f833916daad52a13787a90f6bab0a5a97134d09 100644
--- a/htdocs/translate.class.php
+++ b/htdocs/translate.class.php
@@ -42,22 +42,27 @@ class Translate {
 
     /**
      *  \brief      Constructeur de la classe
-     *  \param      dir             repertoire racine des fichiers de traduction
-     *  \param      defaultlang     langue par defaut � utiliser
+     *  \param      dir             Repertoire racine des fichiers de traduction
+     *  \param      defaultlang     Langue par defaut � utiliser
      */
-		
-    function Translate($dir = "", $defaultlang = "") {
+    function Translate($dir = "", $defaultlang = "")
+    {
         $this->dir=$dir;
-        $this->defaultlang=$defaultlang;
+        if ($defaultlang == 'auto')
+        {
+            $listlang=split('[,;]',$_SERVER["HTTP_ACCEPT_LANGUAGE"]);
+            $defaultlang=ereg_replace('-','_',$listlang[0]);
+        }
+        if (strlen($defaultlang) <= 3) $defaultlang=$defaultlang."_".$defaultlang;
+        $this->defaultlang=strtolower($defaultlang);
     }
 
     /**
 	 *  \brief      Charge en m�moire le tableau de traduction pour un domaine particulier
      *              Si le domaine est deja charg�, la fonction ne fait rien
      *  \param      domain      Nom du domain (fichier lang) � charger
-     *  \param      alt         Charge le fichier alternatif meme si fichier dans la langue est trouv�
+     *  \param      alt         Utilise le fichier alternatif meme si fichier dans la langue est trouv�e
      */
-		
     function Load($domain,$alt=0)
     {
         if (isset($this->tab_loaded[$domain]) && $this->tab_loaded[$domain]) { return; }    // Le fichier de ce domaine est deja charg�
@@ -65,47 +70,52 @@ class Translate {
         // Repertoire de traduction
         $scandir = $this->dir."/".$this->defaultlang;
         $file_lang =  $scandir . "/$domain.lang";
+        $filelangexists=is_file($file_lang);
 
-        if ($alt || ! is_file($file_lang)) {
+        if ($alt || ! $filelangexists)
+        {
             // Repertoire de la langue alternative
             if ($this->defaultlang != "en_US") $scandiralt = $this->dir."/en_US";   
             else $scandiralt = $this->dir."/fr_FR";
             $file_lang = $scandiralt . "/$domain.lang";
+            $filelangexists=is_file($file_lang);
             $alt=1;
         }
         
-        $i = 0;
-        if(is_file($file_lang)) {
-            if($fp = @fopen($file_lang,"rt")){
+        if ($filelangexists)
+        {
+            if($fp = @fopen($file_lang,"rt"))
+            {
                 $finded = 0;
-                while (($ligne = fgets($fp,4096)) && ($finded == 0)){
-                    if ($ligne[0] != "\n" && $ligne[0] != " " && $ligne[0] != "#") {
+                while (($ligne = fgets($fp,4096)) && ($finded == 0))
+                {
+                    if ($ligne[0] != "\n" && $ligne[0] != " " && $ligne[0] != "#")
+                    {
                         $tab=split('=',$ligne,2);
                         //print "Domain=$domain, found a string for $tab[0] with value $tab[1]<br>";
-                        if (! isset($this->tab_translate[$tab[0]])) $this->tab_translate[$tab[0]]=trim($tab[1]);
+                        if (! isset($this->tab_translate[$tab[0]])) $this->tab_translate[$tab[0]]=trim(isset($tab[1])?$tab[1]:'');
                     }
                 }
                 fclose($fp);
 
                 // Pour les langues aux fichiers parfois incomplets, on charge la langue alternative
-                if (! $alt && $this->defaultlang != "fr_FR" && $this->defaultlang != "en_US") {
+                if (! $alt && $this->defaultlang != "fr_FR" && $this->defaultlang != "en_US")
+                {
                     dolibarr_syslog("translate::load loading alternate translation file");
                     $this->load($domain,1);
                 }
 
                 $this->tab_loaded[$domain]=1;           // Marque ce fichier comme charg�
             }
-        
         }
-        
    }
 
     /**     
      *	\brief      Retourne la liste des domaines charg�es en memoire
      *  \return     array       Tableau des domaines charg�es
      */
-		
-    function list_domainloaded() {
+    function list_domainloaded()
+    {
         return join(",",array_keys($this->tab_loaded));
     }
     
@@ -120,8 +130,8 @@ class Translate {
      *  \param       param3      chaine de param1
      *  \return      string      chaine traduite
      */
-		 
-    function trans($str, $param1='', $param2='', $param3='') {
+    function trans($str, $param1='', $param2='', $param3='')
+    {
         return $this->transnoentities($str,htmlentities($param1),htmlentities($param2),htmlentities($param3));
     }
 
diff --git a/htdocs/user/param_ihm.php b/htdocs/user/param_ihm.php
index b37c6d30a98966428501698bce14c91853812871..d3baddb5d36483eef6da745ec75c07cc6a0296ef 100644
--- a/htdocs/user/param_ihm.php
+++ b/htdocs/user/param_ihm.php
@@ -142,23 +142,23 @@ if ($_GET["action"] == 'edit')
     $var=true;
     
     print '<table class="noborder" width="100%">';
-    print '<tr class="liste_titre"><td width="35%">'.$langs->trans("Parameter").'</td><td width="25%">'.$langs->trans("DefaultValue").'</td><td>&nbsp;</td><td>'.$langs->trans("PersonalValue").'</td></tr>';
+    print '<tr class="liste_titre"><td width="25%">'.$langs->trans("Parameter").'</td><td width="25%">'.$langs->trans("DefaultValue").'</td><td>&nbsp;</td><td>'.$langs->trans("PersonalValue").'</td></tr>';
 
     // Langue par defaut
     $var=!$var;
     print '<tr '.$bc[$var].'><td>'.$langs->trans("Language").'</td>';
-    print '<td>'.$conf->global->MAIN_LANG_DEFAULT.'</td>';
-    print '<td align="left"><input name="check_MAIN_LANG_DEFAULT" type="checkbox" '.($fuser->conf->MAIN_LANG_DEFAULT?" checked":"").'> '.$langs->trans("UsePersonalValue").'</td>';
+    print '<td>'.($conf->global->MAIN_LANG_DEFAULT=='auto'?$langs->trans("AutoDetectLang"):$conf->global->MAIN_LANG_DEFAULT).'</td>';
+    print '<td align="left" nowrap="nowrap" width="20%"><input name="check_MAIN_LANG_DEFAULT" type="checkbox" '.($fuser->conf->MAIN_LANG_DEFAULT?" checked":"").'> '.$langs->trans("UsePersonalValue").'</td>';
     print '<td>';
     $html=new Form($db);
-    $html->select_lang($fuser->conf->MAIN_LANG_DEFAULT,'main_lang_default');
+    $html->select_lang($fuser->conf->MAIN_LANG_DEFAULT,'main_lang_default',1);
     print '</td></tr>';
 
     // Taille max des listes
     $var=!$var;
     print '<tr '.$bc[$var].'><td>'.$langs->trans("MaxSizeList").'</td>';
     print '<td>'.$conf->global->SIZE_LISTE_LIMIT.'</td>';
-    print '<td align="left"><input name="check_SIZE_LISTE_LIMIT" type="checkbox" '.($fuser->conf->SIZE_LISTE_LIMIT?" checked":"").'> '.$langs->trans("UsePersonalValue").'</td>';
+    print '<td align="left" nowrap="nowrap" width="20%"><input name="check_SIZE_LISTE_LIMIT" type="checkbox" '.($fuser->conf->SIZE_LISTE_LIMIT?" checked":"").'> '.$langs->trans("UsePersonalValue").'</td>';
     print '<td><input class="flat" name="size_liste_limit" size="4" value="' . $fuser->conf->SIZE_LISTE_LIMIT . '"></td></tr>';
 
     print '</table><br>';
@@ -182,18 +182,18 @@ else
     $var=true;
 
     print '<table class="noborder" width="100%">';
-    print '<tr class="liste_titre"><td width="35%">'.$langs->trans("Parameter").'</td><td width="25%">'.$langs->trans("DefaultValue").'</td><td>&nbsp;</td><td>'.$langs->trans("PersonalValue").'</td></tr>';
+    print '<tr class="liste_titre"><td width="25%">'.$langs->trans("Parameter").'</td><td width="25%">'.$langs->trans("DefaultValue").'</td><td>&nbsp;</td><td>'.$langs->trans("PersonalValue").'</td></tr>';
 
     $var=!$var;
     print '<tr '.$bc[$var].'><td>'.$langs->trans("Language").'</td>';
-    print '<td>'.$conf->global->MAIN_LANG_DEFAULT.'</td>';
-    print '<td align="left"><input type="checkbox" disabled '.($fuser->conf->MAIN_LANG_DEFAULT?" checked":"").'> '.$langs->trans("UsePersonalValue").'</td>';
-    print '<td>' . $fuser->conf->MAIN_LANG_DEFAULT . '</td></tr>';
+    print '<td>'.($conf->global->MAIN_LANG_DEFAULT=='auto'?$langs->trans("AutoDetectLang"):$conf->global->MAIN_LANG_DEFAULT).'</td>';
+    print '<td align="left" nowrap="nowrap" width="20%"><input type="checkbox" disabled '.($fuser->conf->MAIN_LANG_DEFAULT?" checked":"").'> '.$langs->trans("UsePersonalValue").'</td>';
+    print '<td>'.($fuser->conf->MAIN_LANG_DEFAULT=='auto'?$langs->trans("AutoDetectLang"):$fuser->conf->MAIN_LANG_DEFAULT).'</td></tr>';
 
     $var=!$var;
     print '<tr '.$bc[$var].'><td>'.$langs->trans("MaxSizeList").'</td>';
     print '<td>'.$conf->global->SIZE_LISTE_LIMIT.'</td>';
-    print '<td align="left"><input type="checkbox" disabled '.($fuser->conf->SIZE_LISTE_LIMIT?" checked":"").'> '.$langs->trans("UsePersonalValue").'</td>';
+    print '<td align="left" nowrap="nowrap" width="20%"><input type="checkbox" disabled '.($fuser->conf->SIZE_LISTE_LIMIT?" checked":"").'> '.$langs->trans("UsePersonalValue").'</td>';
     print '<td>' . $fuser->conf->SIZE_LISTE_LIMIT . '</td></tr>';
 
     print '</table><br>';
@@ -225,13 +225,13 @@ function show_theme($fuser,$edit=0)
     $thumbsbyrow=6;
     
     print '<table class="noborder" width="100%">';
-    print '<tr class="liste_titre"><td width="35%">'.$langs->trans("Parameter").'</td><td width="25%">'.$langs->trans("DefaultValue").'</td><td colspan="2">&nbsp;</td></tr>';
+    print '<tr class="liste_titre"><td width="25%">'.$langs->trans("Parameter").'</td><td width="25%">'.$langs->trans("DefaultValue").'</td><td colspan="2">&nbsp;</td></tr>';
 
     $var=false;
 
     print '<tr '.$bc[$var].'><td>'.$langs->trans("DefaultSkin").'</td>';
     print '<td>'.$conf->global->MAIN_THEME.'</td>';
-    print '<td '.$bc[$var].' align="left"><input name="check_MAIN_THEME"'.($edit?'':' disabled').' type="checkbox" '.($fuser->conf->MAIN_THEME?" checked":"").'> '.$langs->trans("UsePersonalValue").'</td>';
+    print '<td '.$bc[$var].' align="left" nowrap="nowrap" width="20%"><input name="check_MAIN_THEME"'.($edit?'':' disabled').' type="checkbox" '.($fuser->conf->MAIN_THEME?" checked":"").'> '.$langs->trans("UsePersonalValue").'</td>';
     print '<td '.$bc[$var].'>&nbsp;</td></tr>';
 
     $var=!$var;