diff --git a/salvatore/ecriveur.php b/salvatore/ecriveur.php
index a29c2247eaf7a0994de09c517b815994a15aca4d..f4176279de45ec05238bd26d01b29664049990dd 100644
--- a/salvatore/ecriveur.php
+++ b/salvatore/ecriveur.php
@@ -76,8 +76,7 @@ function salvatore_ecrire($liste_sources, $message_commit = '', $dir_modules = n
 		$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 {
+		} else {
 			// url de l'interface de traduction d'un module
 			$url_trad_module = url_absolue(generer_objet_url($id_tradlang_module, 'tradlang_module'), $url_gestionnaire);
 			$nb = salvatore_exporter_module($id_tradlang_module, $source, $url_gestionnaire, $url_trad_module, $dir_modules, $dir_depots, $message_commit);
@@ -119,14 +118,15 @@ function salvatore_exporter_module($id_tradlang_module, $source, $url_site, $url
 		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'];
+	$type_export = $row_module['type_export'];
 
 	if (is_numeric($row_module['limite_trad']) && $row_module['limite_trad'] > 0) {
 		$seuil_export = $row_module['limite_trad'];
-	}
-	else {
+	} else {
 		$seuil_export = lire_config('tradlang/seuil_export_tradlang', _SALVATORE_SEUIL_EXPORT);
 	}
 
@@ -206,7 +206,7 @@ function salvatore_exporter_module($id_tradlang_module, $source, $url_site, $url
 				$comment = ' # ' . trim($comment); // on rajoute les commentaires ?
 			}
 
-			// nettoyger la chaine de langue et calcul du md5
+			// nettoyer la chaine de langue et calcul du md5
 			$str = salvatore_nettoyer_chaine_langue($chaine['str'], $lang);
 			$newmd5 = md5($str);
 
@@ -221,7 +221,13 @@ function salvatore_exporter_module($id_tradlang_module, $source, $url_site, $url
 		}
 
 		salvatore_log(' - traduction (' . $total_chaines['OK'] . "/$count_trad_reference OK | " . $total_chaines['RELIRE'] . "/$count_trad_reference RELIRE | " . $total_chaines['MODIF'] . "/$count_trad_reference MODIFS), export");
-		$file_name = salvatore_exporter_fichier_php($dir_module, $module, $lang, $php_lines, $url_trad_module, ($lang == $lang_ref) ? $url_repo : false);
+
+		$salvatore_exporter_fichier_php = 'salvatore_exporter_fichier_php_' . $type_export;
+		if (!function_exists($salvatore_exporter_fichier_php)) {
+			salvatore_log("<error>Pas de fonction pour l’export '$type_export'</error>");
+			$salvatore_exporter_fichier_php = 'salvatore_exporter_fichier_php_spip5';
+		}
+		$file_name = $salvatore_exporter_fichier_php($dir_module, $module, $lang, $php_lines, $url_trad_module, ($lang == $lang_ref) ? $url_repo : false);
 
 		// noter la langue et les traducteurs pour lang/module.xml
 		$people_unique = [];
@@ -386,7 +392,13 @@ function salvatore_clean_comment($comment) {
 
 
 /**
- * Generer un fichier de langue a partir de ses lignes php
+ * Generer un fichier de langue (SPIP < 5) a partir de ses lignes php
+ *
+ * À partir de SPIP 4.1, les fichiers de langues SPIP peuvent retourner
+ * directement un array (plus propre que de peupler une globale).
+ * Cette méthode d’écriture sera donc à déprécier / supprimer dans quelques années
+ * pour utiliser uniquement `spip5`
+ *
  * @param string $dir_module
  * @param string $module
  * @param string $lang
@@ -395,7 +407,7 @@ function salvatore_clean_comment($comment) {
  * @param $origin
  * @return string
  */
-function salvatore_exporter_fichier_php($dir_module, $module, $lang, $php_lines, $url_trad_module, $origin) {
+function salvatore_exporter_fichier_php_spip($dir_module, $module, $lang, $php_lines, $url_trad_module, $origin) {
 	$file_name = $dir_module . '/' . $module . '_' . $lang . '.php';
 	$file_content = '<?php
 // This is a SPIP language file  --  Ceci est un fichier langue de SPIP
@@ -431,6 +443,37 @@ function salvatore_exporter_fichier_php($dir_module, $module, $lang, $php_lines,
 }
 
 
+/**
+ * Generer un fichier de langue (SPIP >= 4.1) a partir de ses lignes php
+ * @param string $dir_module
+ * @param string $module
+ * @param string $lang
+ * @param array $php_lines
+ * @param string $url_trad_module
+ * @param $origin
+ * @return string
+ */
+function salvatore_exporter_fichier_php_spip5($dir_module, $module, $lang, $php_lines, $url_trad_module, $origin) {
+	$file_name = $dir_module . '/' . $module . '_' . $lang . '.php';
+	$file_content = '<?php' . "\n";
+	$file_content .= '// This is a SPIP language file  --  Ceci est un fichier langue de SPIP' . "\n";
+
+	if ($origin) {
+		$file_content .= '// Fichier source, a modifier dans ' . $origin . "\n\n";
+	} else {
+		$url_trad_module = parametre_url($url_trad_module, 'lang_cible', $lang, '&');
+		$file_content .= '// extrait automatiquement de ' . $url_trad_module . "\n";
+		$file_content .= '// ** ne pas modifier le fichier **' . "\n\n";
+	}
+
+	$file_content .= 'return [' . "\n" . implode("\n", $php_lines) . "\n];\n";
+	file_put_contents($file_name, $file_content);
+	// et on fixe le chmod au passage
+	chmod($file_name, 0644);
+	return $file_name;
+}
+
+
 /**
  * Lire la date de derniere modif d'un fichier de langue
  * @param string $file_name