diff --git a/inc/salvatore_ecriveur.php b/inc/salvatore_ecriveur.php
index 2f1387ec9152c9c57e716507e53165e9a6c809b6..79558a16b7d50c5874ffa552bf7a6b1fbc8bd4c7 100644
--- a/inc/salvatore_ecriveur.php
+++ b/inc/salvatore_ecriveur.php
@@ -60,352 +60,365 @@ function salvatore_ecrire($liste_sources, $dir_modules = null, $message_commit='
 		$dir_module = $dir_modules . $source['dir_module'];
 
 		if ($autre_gestionnaire = salvatore_verifier_gestionnaire_traduction($dir_module, $module)){
-			salvatore_fail("[Lecteur] Erreur sur $module", "Erreur : import impossible, le fichier est traduit autre part : $autre_gestionnaire\n");
+			salvatore_fail("[Ecriveur] Erreur sur $module", "Erreur : export impossible, le fichier est traduit autre part : $autre_gestionnaire\n");
 		}
 
-		$id_tradlang_module = sql_getfetsel('id_tradlang_module', 'spip_tradlang_modules', 'module = ' . sql_quote($source[1]));
-
-		// url de l'interface de traduction d'un module
-		$url_trad = url_absolue(generer_url_entite($id_tradlang_module, 'tradlang_module'), $url_gestionnaire);
-		export_trad_module($source, $url_gestionnaire, $url_trad, $message_commit);
+		$id_tradlang_module = sql_getfetsel('id_tradlang_module', 'spip_tradlang_modules', 'dir_module = ' . sql_quote($source['dir_module']));
+		if (!$id_tradlang_module) {
+			salvatore_fail("[Ecriveur] Erreur sur $module", "Erreur : export impossible, le module n'est pas en base\n");
+		}
+		else {
+			// url de l'interface de traduction d'un module
+			$url_trad_module = url_absolue(generer_url_entite($id_tradlang_module, 'tradlang_module'), $url_gestionnaire);
+			salvatore_exporter_module($id_tradlang_module, $source, $url_gestionnaire, $url_trad_module, $message_commit);
+		}
 	}
 }
 
-//
-// Genere les fichiers de traduction d'un module
-// TODO
-//
-function export_trad_module($source, $url_site, $url_trad, $message_commit = ''){
-	global $tmp;
+/**
+ * Genere les fichiers de traduction d'un module
+ *
+ * @param int $id_tradlang_module
+ * @param array $source
+ * @param string $url_site
+ * @param string $url_trad_module
+ * @param string $dir_modules
+ * @param string $message_commit
+ */
+function salvatore_exporter_module($id_tradlang_module, $source, $url_site, $url_trad_module, $dir_modules, $message_commit = ''){
 
-	// sanity check
-	if (!is_dir($tmp . $source[1] . '/')){
+	$url_repo = $source['url'];
+
+	$row_module = sql_fetsel('*', 'spip_tradlang_modules', 'id_tradlang_module=' . intval($id_tradlang_module));
+	if (!$row_module) {
+		$module = $source['module'];
+		salvatore_log("<error>Le module #$id_tradlang_module $module n'existe pas</error>");
 		return false;
 	}
+	$lang_ref = $row_module['lang_mere'];
+	$dir_module = $dir_modules . $row_module['dir_module'];
+	$module = $row_module['module'];
 
-	$module = sql_fetsel('id_tradlang_module,limite_trad,lang_mere', 'spip_tradlang_modules', 'module = ' . sql_quote($source[1]));
-
-	$seuil_export = 50;
-	if (is_numeric($module['limite_trad']) and $module['limite_trad']>0){
-		$seuil_export = $module['limite_trad'];
-	} elseif (function_exists('lire_config')) {
-		$seuil_export = lire_config('tradlang/seuil_export_tradlang', 50);
+	if (is_numeric($row_module['limite_trad']) and $row_module['limite_trad']>0){
+		$seuil_export = $row_module['limite_trad'];
+	}
+	else {
+		$seuil_export = lire_config('tradlang/seuil_export_tradlang', _SALVATORE_SEUIL_EXPORT);
 	}
-	if (intval($module['id_tradlang_module'])>=1){
-		// charger la langue originale, pour la copier si necessaire
-		$count_original = 0;
-		$res = sql_allfetsel('id, id_tradlang_module,str,comm,statut', 'spip_tradlangs', 'id_tradlang_module = ' . intval($module['id_tradlang_module']) . ' AND lang = ' . sql_quote($module['lang_mere']) . ' AND statut="OK"', 'id');
-		foreach ($res as $row){
-			$row['statut'] = 'NEW';
-			$lorigine[$row['id']] = $row;
-			$id_tradlang_module = $row['id_tradlang_module'];
-			$count_original++;
-		}
 
-		$liste_lang = $liste_lang_non_exportees = $liste_lang_supprimer = array();
-		$minimal = ceil((($count_original*$seuil_export)/100));
-		salvatore_log("\nMinimal = $minimal ($seuil_export %)\n");
+	// charger la langue originale, pour la copier si necessaire
+	// TODO : simplifier ? aucune reference a $trad_reference
+	$trad_reference = [];
+	$count_trad_reference = 0;
+	$rows = sql_allfetsel('id, id_tradlang_module,str,comm,statut', 'spip_tradlangs', 'id_tradlang_module=' . intval($id_tradlang_module) . ' AND lang=' . sql_quote($row_module['lang_mere']) . " AND statut='OK'", 'id');
+	foreach ($rows as $row){
+		$row['statut'] = 'NEW';
+		$trad_reference[$row['id']] = $row;
+		$count_trad_reference++;
+	}
 
-		$res = sql_allfetsel('lang,COUNT(*) as N', 'spip_tradlangs', 'module = ' . sql_quote($source[1]) . ' AND statut != "NEW" AND statut != "attic"', 'lang', 'lang');
-		foreach ($res as $row){
+	$liste_lang = $liste_lang_non_exportees = $liste_lang_a_supprimer = array();
+	$minimal = ceil((($count_trad_reference*$seuil_export)/100));
+	salvatore_log("Minimal = $minimal ($seuil_export %)");
+
+	$langues = sql_allfetsel('lang,COUNT(*) as count', 'spip_tradlangs', 'id_tradlang_module=' . intval($id_tradlang_module) . " AND statut != 'NEW' AND statut != 'attic'", 'lang', 'lang');
+	foreach ($langues as $langue){
+		/**
+		 * Le fichier est il suffisamment traduit
+		 */
+		if ($langue['count']>=$minimal){
+			$liste_lang[] = $langue['lang'];
+		} 
+		else {
 			/**
-			 * Le fichier est il suffisamment traduit
+			 * Le fichier n'est pas suffisamment traduit et n'existe pas, on ne fera donc rien
 			 */
-			if ($row['N']>=$minimal){
-				$liste_lang[] = $row['lang'];
+			if (!file_exists($dir_module . '/' . $module . '_' . $row['lang'] . '.php')){
+				$liste_lang_non_exportees[] = $row['lang'];
 			} else {
 				/**
-				 * Le fichier n'est pas suffisamment traduit et n'existe pas, on ne fera donc rien
+				 * Il n'est pas suffisamment traduit, cependant, il existe déjà
+				 * On ne va donc pas le supprimer à la barbare, mais on le met à jour quand même
 				 */
-				if (!file_exists($tmp . $source[1] . '/' . $source[1] . '_' . $row['lang'] . '.php')){
-					$liste_lang_non_exportees[] = $row['lang'];
-				} else {
-					/**
-					 * Il n'est pas suffisamment traduit, cependant, il existe déjà
-					 * On ne va donc pas le supprimer à la barbare, mais on le met à jour quand même
-					 */
-					$liste_lang[] = $row['lang'];
-					$liste_lang_supprimer[] = $row['lang'];
-					$percent = (($row['N']/$count_original)*100);
-					if ($percent<($seuil_export-15)){
-						$message_commit .= "La langue '" . $row['lang'] . "' devrait être supprimée car trop peu traduite (" . number_format($percent, 2) . " %)\n";
-					}
+				$liste_lang[] = $langue['lang'];
+				$liste_lang_a_supprimer[] = $langue['lang'];
+				$percent = (($row['N']/$count_trad_reference)*100);
+				if ($percent<($seuil_export-15)){
+					$message_commit .= "La langue '" . $langue['lang'] . "' devrait être supprimée car trop peu traduite (" . number_format($percent, 2) . " %)\n";
 				}
 			}
 		}
+	}
 
-		// traiter chaque langue
-		$infos = $commiteurs = array();
-		foreach ($liste_lang as $lang){
-			salvatore_log("Generation de la langue $lang ");
-			// Proteger les caracteres typographiques a l'interieur des tags html
-			$typo = (in_array($lang, array('eo', 'fr', 'cpf')) || strncmp($lang, 'fr_', 3)==0) ? 'fr' : 'en';
-			$typographie = charger_fonction($typo, 'typographie');
-			$tab = "\t";
-
-			$x = $tous = $tradlangs = array();
-			$prev = '';
-			$traduits = $modifs = $relire = 0;
-
-			// On ne prend que les MODIF, les RELIRE et les OK pour ne pas rendre les sites multilingues en français
-			$res = sql_allfetsel('id_tradlang,id,str,comm,statut,md5', 'spip_tradlangs', 'module = "' . $source[1] . '" AND lang = "' . $lang . '" AND statut != "NEW" AND statut != "attic"', 'id');
-			foreach ($res as $row){
-				$tradlangs[] = $row['id_tradlang'];
-				$tous[$row['id']] = $row;
+	// traiter chaque langue
+	$infos = $commiteurs = array();
+	foreach ($liste_lang as $lang){
+		salvatore_log("Generation de la langue $lang ");
+		// Proteger les caracteres typographiques a l'interieur des tags html
+		$typo = (in_array($lang, array('eo', 'fr', 'cpf')) || strncmp($lang, 'fr_', 3)==0) ? 'fr' : 'en';
+		$typographie = charger_fonction($typo, 'typographie');
+		$tab = "\t";
+
+		$x = $tous = $tradlangs = array();
+		$prev = '';
+		$traduits = $modifs = $relire = 0;
+
+		// On ne prend que les MODIF, les RELIRE et les OK pour ne pas rendre les sites multilingues en français
+		$res = sql_allfetsel('id_tradlang,id,str,comm,statut,md5', 'spip_tradlangs', 'module = "' . $module . '" AND lang = "' . $lang . '" AND statut != "NEW" AND statut != "attic"', 'id');
+		foreach ($res as $row){
+			$tradlangs[] = $row['id_tradlang'];
+			$tous[$row['id']] = $row;
+		}
+		ksort($tous);
+
+		foreach ($tous as $row){
+			if ($row['statut']=='OK'){
+				$traduits++;
+			} elseif ($row['statut']=='MODIF') {
+				$modifs++;
+			} elseif ($row['statut']=='RELIRE') {
+				$relire++;
 			}
-			ksort($tous);
-
-			foreach ($tous as $row){
-				if ($row['statut']=='OK'){
-					$traduits++;
-				} elseif ($row['statut']=='MODIF') {
-					$modifs++;
-				} elseif ($row['statut']=='RELIRE') {
-					$relire++;
-				}
 
-				if (strlen($row['comm'])>1){
-					// On remplace les sauts de lignes des commentaires sinon ça crée des erreurs php
-					$row['comm'] = str_replace(array("\r\n", "\n", "\r"), ' ', $row['comm']);
-					// Conversion des commentaires en utf-8
-					$row['comm'] = unicode_to_utf_8(html_entity_decode(preg_replace('/&([lg]t;)/S', '&amp;\1', $row['comm']), ENT_NOQUOTES, 'utf-8'));
-				}
+			if (strlen($row['comm'])>1){
+				// On remplace les sauts de lignes des commentaires sinon ça crée des erreurs php
+				$row['comm'] = str_replace(array("\r\n", "\n", "\r"), ' ', $row['comm']);
+				// Conversion des commentaires en utf-8
+				$row['comm'] = unicode_to_utf_8(html_entity_decode(preg_replace('/&([lg]t;)/S', '&amp;\1', $row['comm']), ENT_NOQUOTES, 'utf-8'));
+			}
 
-				if ($prev!=strtoupper($row['id'][0])){
-					$x[] = "\n$tab// " . strtoupper($row['id'][0]);
-				}
-				$prev = strtoupper($row['id'][0]);
+			if ($prev!=strtoupper($row['id'][0])){
+				$x[] = "\n$tab// " . strtoupper($row['id'][0]);
+			}
+			$prev = strtoupper($row['id'][0]);
 
-				if (strlen($row['statut']) and ($row['statut']!='OK')){
-					$row['comm'] .= ' ' . $row['statut'];
-				}
-				if (trim($row['comm'])){
-					$row['comm'] = ' # ' . trim($row['comm']); // on rajoute les commentaires ?
-				}
+			if (strlen($row['statut']) and ($row['statut']!='OK')){
+				$row['comm'] .= ' ' . $row['statut'];
+			}
+			if (trim($row['comm'])){
+				$row['comm'] = ' # ' . trim($row['comm']); // on rajoute les commentaires ?
+			}
 
-				$str = $row['str'];
+			$str = $row['str'];
 
-				/**
-				 * On enlève les sauts de lignes windows pour des sauts de ligne linux
-				 */
-				$str = str_replace("\r\n", "\n", $str);
+			/**
+			 * On enlève les sauts de lignes windows pour des sauts de ligne linux
+			 */
+			$str = str_replace("\r\n", "\n", $str);
 
-				/**
-				 * protection dans les balises genre <a href="..." ou <img src="..."
-				 * cf inc/filtres
-				 */
-				if (preg_match_all(_TYPO_BALISE, $str, $regs, PREG_SET_ORDER)){
-					foreach ($regs as $reg){
-						$insert = $reg[0];
-						// hack: on transforme les caracteres a proteger en les remplacant
-						// par des caracteres "illegaux". (cf corriger_caracteres())
-						$insert = strtr($insert, _TYPO_PROTEGER, _TYPO_PROTECTEUR);
-						$str = str_replace($reg[0], $insert, $str);
-					}
+			/**
+			 * protection dans les balises genre <a href="..." ou <img src="..."
+			 * cf inc/filtres
+			 */
+			if (preg_match_all(_TYPO_BALISE, $str, $regs, PREG_SET_ORDER)){
+				foreach ($regs as $reg){
+					$insert = $reg[0];
+					// hack: on transforme les caracteres a proteger en les remplacant
+					// par des caracteres "illegaux". (cf corriger_caracteres())
+					$insert = strtr($insert, _TYPO_PROTEGER, _TYPO_PROTECTEUR);
+					$str = str_replace($reg[0], $insert, $str);
 				}
+			}
 
-				/**
-				 * Protéger le contenu des balises <html> <code> <cadre> <frame> <tt> <pre>
-				 */
-				define('_PROTEGE_BLOCS_HTML', ',<(html|code|cadre|pre|tt)(\s[^>]*)?>(.*)</\1>,UimsS');
-				if ((strpos($str, '<')!==false) and preg_match_all(_PROTEGE_BLOCS_HTML, $str, $matches, PREG_SET_ORDER)){
-					foreach ($matches as $reg){
-						$insert = $reg[0];
-						// hack: on transforme les caracteres a proteger en les remplacant
-						// par des caracteres "illegaux". (cf corriger_caracteres())
-						$insert = strtr($insert, _TYPO_PROTEGER, _TYPO_PROTECTEUR);
-						$str = str_replace($reg[0], $insert, $str);
-					}
+			/**
+			 * Protéger le contenu des balises <html> <code> <cadre> <frame> <tt> <pre>
+			 */
+			define('_PROTEGE_BLOCS_HTML', ',<(html|code|cadre|pre|tt)(\s[^>]*)?>(.*)</\1>,UimsS');
+			if ((strpos($str, '<')!==false) and preg_match_all(_PROTEGE_BLOCS_HTML, $str, $matches, PREG_SET_ORDER)){
+				foreach ($matches as $reg){
+					$insert = $reg[0];
+					// hack: on transforme les caracteres a proteger en les remplacant
+					// par des caracteres "illegaux". (cf corriger_caracteres())
+					$insert = strtr($insert, _TYPO_PROTEGER, _TYPO_PROTECTEUR);
+					$str = str_replace($reg[0], $insert, $str);
 				}
+			}
 
-				/**
-				 * On applique la typographie de la langue
-				 */
-				$str = $typographie($str);
-				/**
-				 * On remet les caractères normaux sur les caractères illégaux
-				 */
-				$str = strtr($str, _TYPO_PROTECTEUR, _TYPO_PROTEGER);
-
-				$str = unicode_to_utf_8(html_entity_decode(preg_replace('/&([lg]t;)/S', '&amp;\1', $str), ENT_NOQUOTES, 'utf-8'));
+			/**
+			 * On applique la typographie de la langue
+			 */
+			$str = $typographie($str);
+			/**
+			 * On remet les caractères normaux sur les caractères illégaux
+			 */
+			$str = strtr($str, _TYPO_PROTECTEUR, _TYPO_PROTEGER);
 
-				/**
-				 * Calcul du nouveau md5
-				 */
-				$newmd5 = md5($str);
+			$str = unicode_to_utf_8(html_entity_decode(preg_replace('/&([lg]t;)/S', '&amp;\1', $str), ENT_NOQUOTES, 'utf-8'));
 
-				/**
-				 * Si le md5 ou la chaine à changé, on la met à jour dans la base
-				 */
-				if (($row['md5']!=$newmd5) || ($str!=$row['str'])){
-					$r = sql_updateq('spip_tradlangs', array('md5' => $newmd5, 'str' => $str), 'id_tradlang = ' . intval($row['id_tradlang']));
-				}
+			/**
+			 * Calcul du nouveau md5
+			 */
+			$newmd5 = md5($str);
 
-				$x[] = $tab . var_export($row['id'], 1) . ' => ' . var_export($str, 1) . ',' . $row['comm'];
+			/**
+			 * Si le md5 ou la chaine à changé, on la met à jour dans la base
+			 */
+			if (($row['md5']!=$newmd5) || ($str!=$row['str'])){
+				$r = sql_updateq('spip_tradlangs', array('md5' => $newmd5, 'str' => $str), 'id_tradlang = ' . intval($row['id_tradlang']));
 			}
-			$orig = ($lang==$source[2]) ? $source[0] : false;
-
-			salvatore_log(" - traduction ($traduits/$count_original OK | $relire/$count_original RELIRE | $modifs/$count_original MODIFS), export\n");
-			// historiquement les fichiers de lang de spip_loader ne peuvent pas etre securises
-			$secure = ($source[1]=='tradloader')
-				? ''
-				: "if (!defined('_ECRIRE_INC_VERSION')) {
-	return;
+
+			$x[] = $tab . var_export($row['id'], 1) . ' => ' . var_export($str, 1) . ',' . $row['comm'];
+		}
+		$orig = ($lang==$lang_ref) ? $url_repo : false;
+
+		salvatore_log(" - traduction ($traduits/$count_trad_reference OK | $relire/$count_trad_reference RELIRE | $modifs/$count_trad_reference MODIFS), export\n");
+		// historiquement les fichiers de lang de spip_loader ne peuvent pas etre securises
+		$secure = ($module=='tradloader')
+			? ''
+			: "if (!defined('_ECRIRE_INC_VERSION')) {
+return;
 }\n\n";
 
-			$fd = fopen($tmp . $source[1] . '/' . $source[1] . '_' . $lang . '.php', 'w');
+		$fd = fopen($dir_module . '/' . $module . '_' . $lang . '.php', 'w');
 
-			# supprimer la virgule du dernier item
-			$x[count($x)-1] = preg_replace('/,([^,]*)$/', '\1', $x[count($x)-1]);
+		# supprimer la virgule du dernier item
+		$x[count($x)-1] = preg_replace('/,([^,]*)$/', '\1', $x[count($x)-1]);
 
-			$contenu = join("\n", $x);
+		$contenu = join("\n", $x);
 
-			// L'URL du site de traduction
-			$url_trad = parametre_url($url_trad, 'lang_cible', $lang);
-			/**
-			 * Ecrire le fichier de langue complet
-			 */
-			fwrite(
-				$fd,
-				'<' . '?php
+		// L'URL du site de traduction
+		$url_trad_module = parametre_url($url_trad_module, 'lang_cible', $lang);
+		/**
+		 * Ecrire le fichier de langue complet
+		 */
+		fwrite(
+			$fd,
+			'<' . '?php
 // This is a SPIP language file  --  Ceci est un fichier langue de SPIP
 '
 
-				. ($orig
-					? '// Fichier source, a modifier dans ' . $orig
-					: '// extrait automatiquement de ' . $url_trad . '
+			. ($orig
+				? '// Fichier source, a modifier dans ' . $orig
+				: '// extrait automatiquement de ' . $url_trad_module . '
 // ** ne pas modifier le fichier **
 '
-				)
-				. "\n" . $secure . '$GLOBALS[$GLOBALS[\'idx_lang\']] = array(
+			)
+			. "\n" . $secure . '$GLOBALS[$GLOBALS[\'idx_lang\']] = array(
 '
-				. $contenu
-				. '
+			. $contenu
+			. '
 );
 '
-			);
-			fclose($fd);
-
-			// noter la langue et les traducteurs pour lang/module.xml
-			$infos[$lang] = $people_unique = array();
-			$infos[$lang]['traducteurs'] = array();
-			$infos[$lang]['traduits'] = $traduits;
-			$infos[$lang]['modifs'] = $modifs;
-			$infos[$lang]['relire'] = $relire;
-			if (defined('_ID_AUTEUR_SALVATORE') and intval(_ID_AUTEUR_SALVATORE)>0){
-				$people_unique[] = _ID_AUTEUR_SALVATORE;
-			}
-			$s = sql_allfetsel('DISTINCT(traducteur)', 'spip_tradlangs', 'id_tradlang_module = ' . intval($module['id_tradlang_module']) . ' AND lang = ' . sql_quote($lang));
-			foreach ($s as $t){
-				$traducteurs_lang = explode(',', $t['traducteur']);
-				foreach ($traducteurs_lang as $traducteur){
-					if (!in_array($traducteur, $people_unique)){
-						if (is_numeric($traducteur) and $id_auteur = intval($traducteur)){
-							$traducteur_supp['nom'] = extraire_multi(sql_getfetsel('nom', 'spip_auteurs', 'id_auteur = ' . $id_auteur));
-							$traducteur_supp['lien'] = url_absolue(generer_url_entite($id_auteur, 'auteur'), $url_site);
-						} elseif (trim(strlen($traducteur))>0) {
-							$traducteur_supp['nom'] = trim($traducteur);
-							$traducteur_supp['lien'] = '';
-						}
-						if (isset($traducteur_supp['nom'])){
-							$infos[$lang]['traducteurs'][strtolower($traducteur_supp['nom'])] = $traducteur_supp;
-						}
-						unset($traducteur_supp);
-						$people_unique[] = $traducteur;
+		);
+		fclose($fd);
+
+		// noter la langue et les traducteurs pour lang/module.xml
+		$infos[$lang] = $people_unique = array();
+		$infos[$lang]['traducteurs'] = array();
+		$infos[$lang]['traduits'] = $traduits;
+		$infos[$lang]['modifs'] = $modifs;
+		$infos[$lang]['relire'] = $relire;
+		if (defined('_ID_AUTEUR_SALVATORE') and intval(_ID_AUTEUR_SALVATORE)>0){
+			$people_unique[] = _ID_AUTEUR_SALVATORE;
+		}
+		$s = sql_allfetsel('DISTINCT(traducteur)', 'spip_tradlangs', 'id_tradlang_module = ' . intval($row_module['id_tradlang_module']) . ' AND lang = ' . sql_quote($lang));
+		foreach ($s as $t){
+			$traducteurs_lang = explode(',', $t['traducteur']);
+			foreach ($traducteurs_lang as $traducteur){
+				if (!in_array($traducteur, $people_unique)){
+					if (is_numeric($traducteur) and $id_auteur = intval($traducteur)){
+						$traducteur_supp['nom'] = extraire_multi(sql_getfetsel('nom', 'spip_auteurs', 'id_auteur = ' . $id_auteur));
+						$traducteur_supp['lien'] = url_absolue(generer_url_entite($id_auteur, 'auteur'), $url_site);
+					} elseif (trim(strlen($traducteur))>0) {
+						$traducteur_supp['nom'] = trim($traducteur);
+						$traducteur_supp['lien'] = '';
+					}
+					if (isset($traducteur_supp['nom'])){
+						$infos[$lang]['traducteurs'][strtolower($traducteur_supp['nom'])] = $traducteur_supp;
 					}
+					unset($traducteur_supp);
+					$people_unique[] = $traducteur;
 				}
 			}
-			unset($people_unique);
-
-			if (substr(exec('svn status ' . _DIR_SALVATORE_TMP . $source[1] . '/' . $source[1] . '_' . $lang . '.php'), 0, 1)=='?'){
-				if ($module['limite_trad']==0){
-					passthru('svn add ' . _DIR_SALVATORE_TMP . $source[1] . '/' . $source[1] . "_$lang.php 2> /dev/null") ? salvatore_log("$log\n") : '';
-				} elseif (!in_array($source[1], array('ecrire', 'spip', 'public'))) {
-					if ((intval(($infos[$lang]['traduits']/$count_original)*100)>$seuil_export)){
-						passthru('svn add ' . _DIR_SALVATORE_TMP . $source[1] . '/' . $source[1] . "_$lang.php* 2> /dev/null") ? salvatore_log("$log\n") : '';
-					}
+		}
+		unset($people_unique);
+
+		if (substr(exec('svn status ' . _DIR_SALVATORE_TMP . $module . '/' . $module . '_' . $lang . '.php'), 0, 1)=='?'){
+			if ($row_module['limite_trad']==0){
+				passthru('svn add ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php 2> /dev/null") ? salvatore_log("$log\n") : '';
+			} elseif (!in_array($module, array('ecrire', 'spip', 'public'))) {
+				if ((intval(($infos[$lang]['traduits']/$count_trad_reference)*100)>$seuil_export)){
+					passthru('svn add ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php* 2> /dev/null") ? salvatore_log("$log\n") : '';
 				}
 			}
-			/**
-			 * Le fichier a été modifié ou ajouté (svn status A ou M)
-			 *
-			 * On récupère la date de dernier changement avec svn info
-			 * On cherche toutes les dernières modifications dans la base de donnée
-			 * Si un seul auteur de révisions (Hors salvatore et -1) on l'ajoute comme commiteur
-			 * Si plusieurs auteurs le commiteur sera Salvatore
-			 */
-			if (in_array(substr(exec('svn status ' . _DIR_SALVATORE_TMP . $source[1] . '/' . $source[1] . "_$lang.php"), 0, 1), array('A', 'M'))){
-				$last_change = exec('env LC_MESSAGES=en_US.UTF-8 svn info ' . _DIR_SALVATORE_TMP . $source[1] . '/' . $source[1] . "_$lang.php | awk '/^Last Changed Date/ { print $4 \" \" $5 }'");
-				$auteur_versions = sql_allfetsel('id_auteur', 'spip_versions', 'objet="tradlang" AND date > ' . sql_quote($last_change) . ' AND ' . sql_in('id_objet', $tradlangs) . ' AND id_auteur != "-1" AND id_auteur !=' . intval(_ID_AUTEUR_SALVATORE), 'id_auteur');
-				if (count($auteur_versions)==1){
-					$email = sql_getfetsel('email', 'spip_auteurs', 'id_auteur = ' . intval($auteur_versions[0]['id_auteur']));
-					if ($email){
-						$commiteurs[$lang] = $email;
-					}
-					salvatore_log("\nLe commiteur sera pour la langue $lang : " . $commiteurs[$lang] . " \n");
+		}
+		/**
+		 * Le fichier a été modifié ou ajouté (svn status A ou M)
+		 *
+		 * On récupère la date de dernier changement avec svn info
+		 * On cherche toutes les dernières modifications dans la base de donnée
+		 * Si un seul auteur de révisions (Hors salvatore et -1) on l'ajoute comme commiteur
+		 * Si plusieurs auteurs le commiteur sera Salvatore
+		 */
+		if (in_array(substr(exec('svn status ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php"), 0, 1), array('A', 'M'))){
+			$last_change = exec('env LC_MESSAGES=en_US.UTF-8 svn info ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php | awk '/^Last Changed Date/ { print $4 \" \" $5 }'");
+			$auteur_versions = sql_allfetsel('id_auteur', 'spip_versions', 'objet="tradlang" AND date > ' . sql_quote($last_change) . ' AND ' . sql_in('id_objet', $tradlangs) . ' AND id_auteur != "-1" AND id_auteur !=' . intval(_ID_AUTEUR_SALVATORE), 'id_auteur');
+			if (count($auteur_versions)==1){
+				$email = sql_getfetsel('email', 'spip_auteurs', 'id_auteur = ' . intval($auteur_versions[0]['id_auteur']));
+				if ($email){
+					$commiteurs[$lang] = $email;
 				}
+				salvatore_log("\nLe commiteur sera pour la langue $lang : " . $commiteurs[$lang] . " \n");
 			}
 		}
+	}
 
-		// ecrire lang/module.xml
-		$xml = "<traduction module=\"$source[1]\" gestionnaire=\"salvatore\" url=\"$url_site\" source=\"$source[0]\" reference=\"$source[2]\">\n";
-		foreach ($infos as $lang => $info){
-			if (count($info['traducteurs']>0)){
-				$xml .= "	<langue code=\"$lang\" url=\"" . parametre_url($url_trad, 'lang_cible', $lang) . "\" total=\"$count_original\" traduits=\"" . $info['traduits'] . '" relire="' . $info['relire'] . '" modifs="' . $info['modifs'] . '" nouveaux="' . ($count_original-($info['modifs']+$info['traduits']+$info['relire'])) . '" pourcent="' . number_format((($info['traduits']/$count_original)*100), 2) . "\">\n";
-				ksort($info['traducteurs']);
-				foreach ($info['traducteurs'] as $nom => $people){
-					$xml .= '		<traducteur nom="' . entites_html($people['nom']) . '" lien="' . entites_html($people['lien']) . "\" />\n";
-				}
-				$xml .= "	</langue>\n";
-			} else {
-				$xml .= "	<langue code=\"$lang\" url=\"" . parametre_url($url_trad, 'lang_cible', $lang) . "\" />\n";
+	// ecrire lang/module.xml
+	$xml = "<traduction module=\"$module\" gestionnaire=\"salvatore\" url=\"$url_site\" source=\"$url_repo\" reference=\"$lang_ref\">\n";
+	foreach ($infos as $lang => $info){
+		if (count($info['traducteurs']>0)){
+			$xml .= "	<langue code=\"$lang\" url=\"" . parametre_url($url_trad_module, 'lang_cible', $lang) . "\" total=\"$count_trad_reference\" traduits=\"" . $info['traduits'] . '" relire="' . $info['relire'] . '" modifs="' . $info['modifs'] . '" nouveaux="' . ($count_trad_reference-($info['modifs']+$info['traduits']+$info['relire'])) . '" pourcent="' . number_format((($info['traduits']/$count_trad_reference)*100), 2) . "\">\n";
+			ksort($info['traducteurs']);
+			foreach ($info['traducteurs'] as $nom => $people){
+				$xml .= '		<traducteur nom="' . entites_html($people['nom']) . '" lien="' . entites_html($people['lien']) . "\" />\n";
 			}
+			$xml .= "	</langue>\n";
+		} else {
+			$xml .= "	<langue code=\"$lang\" url=\"" . parametre_url($url_trad_module, 'lang_cible', $lang) . "\" />\n";
 		}
-		unset($traducteurs[$source[2]]);
-		$xml .= "</traduction>\n";
+	}
+	unset($traducteurs[$lang_ref]);
+	$xml .= "</traduction>\n";
 
-		ecrire_fichier($tmp . $source[1] . '/' . $source[1] . '.xml', $xml);
+	ecrire_fichier($dir_module . '/' . $module . '.xml', $xml);
 
-		if (isset($liste_lang_non_exportees) and (count($liste_lang_non_exportees)>0)){
-			$liste_lang_non_exportees_string = implode(', ', $liste_lang_non_exportees);
-			salvatore_log("\nLes langues suivantes ne sont pas exportées car trop peu traduites:\n");
-			salvatore_log("$liste_lang_non_exportees_string\n");
-		}
-		if (isset($liste_lang_supprimer) and (count($liste_lang_supprimer)>0)){
-			$liste_lang_supprimer_string = implode(', ', $liste_lang_supprimer);
-			salvatore_log("\nLes langues suivantes devraient être supprimées car trop peu traduites:\n");
-			salvatore_log("$liste_lang_supprimer_string\n");
+	if (isset($liste_lang_non_exportees) and (count($liste_lang_non_exportees)>0)){
+		$liste_lang_non_exportees_string = implode(', ', $liste_lang_non_exportees);
+		salvatore_log("\nLes langues suivantes ne sont pas exportées car trop peu traduites:\n");
+		salvatore_log("$liste_lang_non_exportees_string\n");
+	}
+	if (isset($liste_lang_a_supprimer) and (count($liste_lang_a_supprimer)>0)){
+		$liste_lang_a_supprimer_string = implode(', ', $liste_lang_a_supprimer);
+		salvatore_log("\nLes langues suivantes devraient être supprimées car trop peu traduites:\n");
+		salvatore_log("$liste_lang_a_supprimer_string\n");
+	}
+	if ($row_module['limite_trad']==0){
+		foreach ($liste_lang as $lang){
+			passthru('svn add ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php* 2> /dev/null") ? salvatore_log("$log\n") : '';
 		}
-		if ($module['limite_trad']==0){
-			foreach ($liste_lang as $lang){
-				passthru('svn add ' . _DIR_SALVATORE_TMP . $source[1] . '/' . $source[1] . "_$lang.php* 2> /dev/null") ? salvatore_log("$log\n") : '';
-			}
-		} elseif (!in_array($source[1], array('ecrire', 'spip', 'public'))) {
-			salvatore_log('Limite trad = ' . $seuil_export);
-			foreach ($liste_lang as $lang){
-				if ((intval(($infos[$lang]['traduits']/$count_original)*100)>$seuil_export)
-					and (substr(exec('svn status ' . _DIR_SALVATORE_TMP . $source[1] . '/' . $source[1] . "_$lang.php"), 0, 1)=='?')){
-					passthru('svn add ' . _DIR_SALVATORE_TMP . $source[1] . '/' . $source[1] . "_$lang.php* 2> /dev/null") ? salvatore_log("$log\n") : '';
-				}
+	} elseif (!in_array($module, array('ecrire', 'spip', 'public'))) {
+		salvatore_log('Limite trad = ' . $seuil_export);
+		foreach ($liste_lang as $lang){
+			if ((intval(($infos[$lang]['traduits']/$count_trad_reference)*100)>$seuil_export)
+				and (substr(exec('svn status ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php"), 0, 1)=='?')){
+				passthru('svn add ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php* 2> /dev/null") ? salvatore_log("$log\n") : '';
 			}
 		}
-		salvatore_log("\n" . passthru('svn status ' . _DIR_SALVATORE_TMP . $source[1] . '/') . "\n");
-		if (strlen($message_commit)>1 || count($commiteurs)>0){
-			$fd = fopen($tmp . $source[1] . '/message_commit.inc', 'w');
-			# ecrire le fichier
-			fwrite(
-				$fd,
-				'<' . '?php
+	}
+	salvatore_log("\n" . passthru('svn status ' . _DIR_SALVATORE_TMP . $module . '/') . "\n");
+	if (strlen($message_commit)>1 || count($commiteurs)>0){
+		$fd = fopen($dir_module . '/message_commit.inc', 'w');
+		# ecrire le fichier
+		fwrite(
+			$fd,
+			'<' . '?php
 $message_commit = "' . $message_commit . '";
 
 $commiteurs = ' . var_export($commiteurs, 1) . ';
 
 ?' . '>
 '
-			);
-			fclose($fd);
-		}
-	} else {
-		salvatore_log("\n Ce module n'existe pas\n");
+		);
+		fclose($fd);
 	}
 }