diff --git a/htdocs/html.formadmin.class.php b/htdocs/html.formadmin.class.php
index e5f7673380cf0e146f890476d24dcadd9921f069..fa930f3d54275689555fe9af706c8387e9ae6714 100644
--- a/htdocs/html.formadmin.class.php
+++ b/htdocs/html.formadmin.class.php
@@ -52,7 +52,7 @@ class FormAdmin
 	 *    \param      htmlname        Nom de la zone select
 	 *    \param      showauto        Affiche choix auto
 	 */
-	function select_lang($selected='',$htmlname='lang_id',$showauto=0)
+	function select_lang($selected='',$htmlname='lang_id',$showauto=0,$filter=0)
 	{
 		global $langs;
 
@@ -66,23 +66,26 @@ class FormAdmin
 			print '>'.$langs->trans("AutoDetectLang").'</option>';
 		}
 
-		sort($langs_available);
-		$num = count($langs_available);
-		$i = 0;
-		if ($num)
+		asort($langs_available);
+		
+		foreach ($langs_available as $key => $value)
 		{
-			while ($i < $num)
+			if ($filter && is_array($filter))
 			{
-				if ($selected == $langs_available[$i])
+				if ( ! array_key_exists($key, $filter))
 				{
-					print '<option value="'.$langs_available[$i].'" selected="true">'.$langs_available[$i].'</option>';
+					print '<option value="'.$key.'">'.$value.'</option>';
 				}
-				else
-				{
-					print '<option value="'.$langs_available[$i].'">'.$langs_available[$i].'</option>';
-				}
-				$i++;
 			}
+			else if ($selected == $key)
+			{
+				print '<option value="'.$key.'" selected="true">'.$value.'</option>';
+			}
+			else
+			{
+				print '<option value="'.$key.'">'.$value.'</option>';
+			}
+			$i++;
 		}
 		print '</select>';
 	}
diff --git a/htdocs/langs/en_US/languages.lang b/htdocs/langs/en_US/languages.lang
new file mode 100644
index 0000000000000000000000000000000000000000..57c24d8a8b097ec079158f8e60e970037888d14c
--- /dev/null
+++ b/htdocs/langs/en_US/languages.lang
@@ -0,0 +1,25 @@
+# Dolibarr language file - en_US - languages
+CHARSET=UTF-8
+
+Language_ar_AR=Arabe
+Language_ca_ES=ca_ES ?
+Language_da_DA=Danois
+Language_de_DE=Allemand
+Language_en_AU=English (Australie)
+Language_en_GB=English (Royaume-Uni)
+Language_en_US=English (Etats-Unis)
+Language_es_ES=Espagnol
+Language_fi_FI=Finois
+Language_fr_BE=French (Belgique)
+Language_fr_CA=French (Canada)
+Language_fr_CH=French (Suisse)
+Language_fr_FR=French
+Language_it_IT=Italien
+Language_nb_NO=Norvégien (Bokmal)
+Language_nl_BE=Néerlandais (Belgique)
+Language_nl_NL=Néerlandais (Pays-Bas)
+Language_pl_PL=Polonais
+Language_pt_BR=Portugais (Brésil)
+Language_pt_PT=Portugais
+Language_ro_RO=Roumain
+Language_ru_RU=Russe
\ No newline at end of file
diff --git a/htdocs/langs/fr_FR/languages.lang b/htdocs/langs/fr_FR/languages.lang
new file mode 100644
index 0000000000000000000000000000000000000000..28fc56658853f933e4f4988d156b84ba212613ea
--- /dev/null
+++ b/htdocs/langs/fr_FR/languages.lang
@@ -0,0 +1,25 @@
+# Dolibarr language file - fr_FR - languages
+CHARSET=UTF-8
+
+Language_ar_AR=Arabe
+Language_ca_ES=ca_ES ?
+Language_da_DA=Danois
+Language_de_DE=Allemand
+Language_en_AU=Anglais (Australie)
+Language_en_GB=Anglais (Royaume-Uni)
+Language_en_US=Anglais (Etats-Unis)
+Language_es_ES=Espagnol
+Language_fi_FI=Finois
+Language_fr_BE=Français (Belgique)
+Language_fr_CA=Français (Canada)
+Language_fr_CH=Français (Suisse)
+Language_fr_FR=Français
+Language_it_IT=Italien
+Language_nb_NO=Norvégien (Bokmal)
+Language_nl_BE=Néerlandais (Belgique)
+Language_nl_NL=Néerlandais (Pays-Bas)
+Language_pl_PL=Polonais
+Language_pt_BR=Portugais (Brésil)
+Language_pt_PT=Portugais
+Language_ro_RO=Roumain
+Language_ru_RU=Russe
\ No newline at end of file
diff --git a/htdocs/product.class.php b/htdocs/product.class.php
index ad98b48095ed506fcf4946e688e5a02e97f12726..381a07eb087e4992bf50386bd6ef313276b354d5 100644
--- a/htdocs/product.class.php
+++ b/htdocs/product.class.php
@@ -580,14 +580,16 @@ class Product extends CommonObject
 		$langs_available = $langs->get_available_languages();
 		$current_lang = $langs->getDefaultLang();
 
-		foreach ($langs_available as $value)
+		foreach ($langs_available as $key => $value)
 		{
-			$sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."product_lang";
-			$sql.= " WHERE fk_product=".$this->id." AND lang='".$value."'";
+			$sql = "SELECT rowid";
+			$sql.= " FROM ".MAIN_DB_PREFIX."product_lang";
+			$sql.= " WHERE fk_product=".$this->id;
+			$sql.= " AND lang='".$key."'";
 
 			$result = $this->db->query($sql);
 
-			if ($value == $current_lang)
+			if ($key == $current_lang)
 			{
 				if ($this->db->num_rows($result)) // si aucune ligne dans la base
 				{
@@ -595,12 +597,12 @@ class Product extends CommonObject
 					$sql2.= " SET label='".addslashes($this->libelle)."',";
 					$sql2.= " description='".addslashes($this->description)."',";
 					$sql2.= " note='".addslashes($this->note)."'";
-					$sql2.= " WHERE fk_product=".$this->id." AND lang='".$value."'";
+					$sql2.= " WHERE fk_product=".$this->id." AND lang='".$key."'";
 				}
 				else
 				{
 					$sql2 = "INSERT INTO ".MAIN_DB_PREFIX."product_lang (fk_product, lang, label, description, note)";
-					$sql2.= " VALUES(".$this->id.",'".$value."','". addslashes($this->libelle);
+					$sql2.= " VALUES(".$this->id.",'".$key."','". addslashes($this->libelle);
 					$sql2.= "','".addslashes($this->description);
 					$sql2.= "','".addslashes($this->note)."')";
 				}
@@ -611,21 +613,21 @@ class Product extends CommonObject
 				if ($this->db->num_rows($result)) // si aucune ligne dans la base
 				{
 					$sql2 = "UPDATE ".MAIN_DB_PREFIX."product_lang";
-					$sql2.= " SET label='".addslashes($this->multilangs["$value"]["libelle"])."',";
-					$sql2.= " description='".addslashes($this->multilangs["$value"]["description"])."',";
-					$sql2.= " note='".addslashes($this->multilangs["$value"]["note"])."'";
-					$sql2.= " WHERE fk_product=".$this->id." AND lang='".$value."'";
+					$sql2.= " SET label='".addslashes($this->multilangs["$key"]["libelle"])."',";
+					$sql2.= " description='".addslashes($this->multilangs["$key"]["description"])."',";
+					$sql2.= " note='".addslashes($this->multilangs["$key"]["note"])."'";
+					$sql2.= " WHERE fk_product=".$this->id." AND lang='".$key."'";
 				}
 				else
 				{
 					$sql2 = "INSERT INTO ".MAIN_DB_PREFIX."product_lang (fk_product, lang, label, description, note)";
-					$sql2.= " VALUES(".$this->id.",'".$value."','". addslashes($this->multilangs["$value"]["libelle"]);
-					$sql2.= "','".addslashes($this->multilangs["$value"]["description"]);
-					$sql2.= "','".addslashes($this->multilangs["$value"]["note"])."')";
+					$sql2.= " VALUES(".$this->id.",'".$key."','". addslashes($this->multilangs["$key"]["libelle"]);
+					$sql2.= "','".addslashes($this->multilangs["$key"]["description"]);
+					$sql2.= "','".addslashes($this->multilangs["$key"]["note"])."')";
 				}
 
 				// on ne sauvegarde pas des champs vides
-				if ( $this->multilangs["$value"]["libelle"] || $this->multilangs["$value"]["description"] || $this->multilangs["$value"]["note"] )
+				if ( $this->multilangs["$key"]["libelle"] || $this->multilangs["$key"]["description"] || $this->multilangs["$key"]["note"] )
 				if (!$this->db->query($sql2)) return -1;
 			}
 		}
@@ -642,8 +644,8 @@ class Product extends CommonObject
 		$langs_available = $langs->get_available_languages();
 
 		if ( $langue != '')
-		foreach ($langs_available as $value)
-		if ( $value == $langue ) $current_lang = $value; // si $langue est une valeur correcte
+		foreach ($langs_available as $key => $value)
+		if ( $key == $langue ) $current_lang = $key; // si $langue est une valeur correcte
 
 		if ( !$current_lang )
 		$current_lang = $langs->getDefaultLang(); // sinon on choisi la langue par defaut
diff --git a/htdocs/product/traduction.php b/htdocs/product/traduction.php
index 7ac362180e94786fc38cc5186f566a23b2420780..8ea6a566a922ab77212ba1710c776e76961ff98e 100644
--- a/htdocs/product/traduction.php
+++ b/htdocs/product/traduction.php
@@ -31,7 +31,7 @@ require_once(DOL_DOCUMENT_ROOT."/product.class.php");
 require_once(DOL_DOCUMENT_ROOT."/html.formadmin.class.php");
 
 $langs->load("products");
-$langs->load("bills");
+$langs->load("languages");
 
 // Security check
 if (isset($_GET["id"]) || isset($_GET["ref"]))
@@ -80,12 +80,12 @@ $_POST["cancel"] != $langs->trans("Cancel") &&
 	if ( $product->setMultiLangs() > 0 )
 	{
 		$_GET["action"] = '';
-		$mesg = 'Fiche mise � jour';
+		$mesg = 'Fiche mise a jour';
 	}
 	else
 	{
 		$_GET["action"] = 'add';
-		$mesg = 'Fiche non mise � jour !' . "<br>" . $product->mesg_error;
+		$mesg = 'Fiche non mise a jour !' . "<br>" . $product->mesg_error;
 	}
 }
 
@@ -144,6 +144,8 @@ $titre=$langs->trans("CardProduct".$product->type);
 $picto=($product->type==1?'service':'product');
 dol_fiche_head($head, 'translation', $titre, 0, $picto);
 
+if ($mesg) print '<div class="error">'.$mesg.'</div>';
+
 print '<table class="border" width="100%">';
 
 // Reference
@@ -156,14 +158,14 @@ print '</table>';
 
 if ($_GET["action"] == 'edit')
 {
-	print '<form action="" method="post">';
+	print '<form action="" method="POST">';
 	print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
 	print '<input type="hidden" name="action" value="vedit">';
 	print '<input type="hidden" name="id" value="'.$_GET["id"].'">';
 
 	foreach ( $product->multilangs as $key => $value)
 	{
-		print "<br /><b><u>$key :</u></b><br />";
+		print "<br /><b><u>".$langs->trans('Language_'.$key)." :</u></b><br />";
 		print '<table class="border" width="100%">';
 		print '<tr><td valign="top" width="15%">'.$langs->trans('Label').'</td><td><input name="libelle-'.$key.'" size="40" value="'.$product->multilangs[$key]["libelle"].'"></td></tr>';
 		print '<tr><td valign="top" width="15%">'.$langs->trans('Description').'</td><td>';
@@ -207,7 +209,7 @@ else
 	foreach ( $product->multilangs as $key => $value)
 	{
 		$cnt_trans++;
-		print "<br /><b><u>$key :</u></b><br />";
+		print "<br /><b><u>".$langs->trans('Language_'.$key)." :</u></b><br />";
 		print '<table class="border" width="100%">';
 		print '<tr><td width="15%">'.$langs->trans('Label').'</td><td>'.$product->multilangs[$key]["libelle"].'</td></tr>';
 		print '<tr><td width="15%">'.$langs->trans('Description').'</td><td>'.$product->multilangs[$key]["description"].'</td></tr>';
@@ -240,19 +242,8 @@ print "\n</div>\n";
 /*
  * Formulaire d'ajout de traduction
  */
-if ($_GET["action"] == 'add' || ($user->rights->produit->creer || $user->rights->service->creer))
+if ($_GET["action"] == 'add' && ($user->rights->produit->creer || $user->rights->service->creer))
 {
-	$langs_available = $langs->get_available_languages();
-	$current_lang = $langs->getDefaultLang();
-
-
-    // on construit la liste des traduction qui n'existe pas deja
-	$select = '<select class="flat" name="lang">';
-	foreach ($langs_available as $value)
-	if ( !array_key_exists($value, $product->multilangs) ) // si la traduction n'existe pas
-	$select.= "<option value='$value'>$value</option>";
-	$select.='</select>';
-
 	print '<br>';
 	print '<form action="" method="post">';
 	print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
@@ -260,7 +251,7 @@ if ($_GET["action"] == 'add' || ($user->rights->produit->creer || $user->rights-
 	print '<input type="hidden" name="id" value="'.$_GET["id"].'">';
 	print '<table class="border" width="100%">';
 	print '<tr><td valign="top" width="15%">'.$langs->trans('Translation').'</td><td>';
-    $formadmin->select_lang($fuser->conf->MAIN_LANG_DEFAULT,'lang',0);
+    $formadmin->select_lang('','lang',0,$product->multilangs);
 	print '</td></tr>';
 	print '<tr><td valign="top" width="15%">'.$langs->trans('Label').'</td><td><input name="libelle" size="40"></td></tr>';
 	print '<tr><td valign="top" width="15%">'.$langs->trans('Description').'</td><td><textarea name="desc" rows="3" cols="80"></textarea></td></tr>';
diff --git a/htdocs/translate.class.php b/htdocs/translate.class.php
index b2b4361de8b5572411515f8ce7985b64c34f2950..b9881812b7b395743934133a0789e71b8225c52c 100644
--- a/htdocs/translate.class.php
+++ b/htdocs/translate.class.php
@@ -521,13 +521,15 @@ class Translate {
 	function get_available_languages($langdir=DOL_DOCUMENT_ROOT)
 	{
 		// We scan directory langs to detect available languages
-		$handle=opendir($langdir ."/langs");
+		$handle=opendir($langdir."/langs");
 		$langs_available=array();
-		while ($file = trim(readdir($handle)))
+		while ($dir = trim(readdir($handle)))
 		{
-			if (preg_match('/^[a-z]+_[A-Z]+/i',$file))
+			if (preg_match('/^[a-z]+_[A-Z]+/i',$dir))
 			{
-				array_push($langs_available,$file);
+				$this->load("languages");
+				
+				$langs_available[$dir] = $this->trans('Language_'.$dir);
 			}
 		}
 		return $langs_available;