diff --git a/ecrire/inc_filtres.php3 b/ecrire/inc_filtres.php3
index 199f380210e435f0d4739c561371653a56f369b2..5f378e78e4af0ca9073e76d58dffe263c4f26df9 100644
--- a/ecrire/inc_filtres.php3
+++ b/ecrire/inc_filtres.php3
@@ -810,15 +810,13 @@ function post_autobr($texte, $delim="\n_ ") {
 }
 
 
-
-// les ci-devant blocs multi sont maintenant traites en amont.
-// garder cette fonction pour de vielles contrib qui l'appelleraient
-
-function extraire_multi ($letexte) {return $letexte;}
+//
+// Gestion des blocs multilingues
+//
 
 //
 // Selection dans un tableau dont les index sont des noms de langues
-// de la valeur associee a la langue en cours (ci-devant bloc multi)
+// de la valeur associee a la langue en cours
 //
 
 function multi_trad ($trads) {
@@ -838,6 +836,55 @@ function multi_trad ($trads) {
 	else  return array_shift($trads);
 }
 
+// analyse un bloc multi
+function extraire_trad ($bloc) {
+	$lang = '';
+
+	while (preg_match("/^(.*?)[\{\[]([a-z_]+)[\}\]]/si", $bloc, $regs)) {
+		$texte = trim($regs[1]);
+		if ($texte OR $lang)
+			$trads[$lang] = $texte;
+		$bloc = substr($bloc, strlen($regs[0]));
+		$lang = $regs[2];
+	}
+	$trads[$lang] = $bloc;
+
+	// faire la traduction avec ces donnees
+	return multi_trad($trads);
+}
+
+// repere les blocs multi dans un texte et extrait le bon
+function extraire_multi ($letexte) {
+	global $flag_pcre;
+
+	if (strpos($letexte, '<multi>') === false) return $letexte; // perf
+	if ($flag_pcre AND preg_match_all("@<multi>(.*?)</multi>@s", $letexte, $regs, PREG_SET_ORDER)) {
+		while (list(,$reg) = each ($regs)) {
+			$letexte = str_replace($reg[0], extraire_trad($reg[1]), $letexte);
+		}
+	}
+	return $letexte;
+}
+
+// popup des blocs multi dans l'espace prive (a ameliorer)
+function ajoute_popup_multi($langue_demandee, $trads, $texte) {
+	static $num_multi=0;
+	global $multi_popup;
+	while (list($lang,$bloc) = each($trads)) {
+		if ($lang != $langue_demandee)
+			$survol .= "[$lang] ".supprimer_tags(couper($bloc,20))."\n";
+		$texte_popup .= "<br /><b>".traduire_nom_langue($lang)."</b> ".ereg_replace("\n+","<br />", supprimer_tags(couper(propre($bloc),200)));
+	}
+
+	if ($survol) {
+		$num_multi ++;
+		$texte .= " <img src=\"" . _DIR_IMG_PACK . "langues-modif-12.gif\" alt=\"(multi)\" title=\"$survol\" height=\"12\" width=\"12\" border=\"0\" onclick=\"return openmulti($num_multi)\" />";
+		$multi_popup .= "textes_multi[$num_multi] = '".addslashes($texte_popup)."';\n";
+	}
+
+	return $texte;
+}
+
 // Raccourci ancre [#ancre<-]
 function avant_propre_ancres($texte) {
 	$regexp = "|\[#?([^][]*)<-\]|";
diff --git a/ecrire/inc_texte.php3 b/ecrire/inc_texte.php3
index 6b25c6bf20734d97d8a47de543225135c8b09b0b..63b0bf75bca2c96d6f044b27f964a0f6cdd97fdd 100644
--- a/ecrire/inc_texte.php3
+++ b/ecrire/inc_texte.php3
@@ -68,6 +68,7 @@ function nettoyer_chapo($chapo){
 // points d'entree de pre- et post-traitement pour propre() et typo()
 function spip_avant_propre ($letexte) {
 	$letexte = avant_propre_ancres($letexte);
+	$letexte = extraire_multi($letexte);
 
 	if (function_exists('avant_propre'))
 		$letexte = avant_propre($letexte);
@@ -83,6 +84,7 @@ function spip_apres_propre ($letexte) {
 }
 
 function spip_avant_typo ($letexte) {
+	$letexte = extraire_multi($letexte);
 	$letexte = avant_typo_smallcaps($letexte);
 
 	if (function_exists('avant_typo'))
@@ -363,7 +365,7 @@ function couper($texte, $taille=50) {
 
 // prendre <intro>...</intro> sinon couper a la longueur demandee
 function couper_intro($texte, $long) {
-	$texte = (eregi_replace("(</?)intro>", "\\1intro>", $texte)); // minuscules
+	$texte = extraire_multi(eregi_replace("(</?)intro>", "\\1intro>", $texte)); // minuscules
 	while ($fin = strpos($texte, "</intro>")) {
 		$zone = substr($texte, 0, $fin);
 		$texte = substr($texte, $fin + strlen("</intro>"));
diff --git a/inc-urls-propres.php3 b/inc-urls-propres.php3
index 0975f428ef6f4714eed1f221786d4a71fd101442..0a28a93bc9055048b95327eaecc1d1f07579a015 100644
--- a/inc-urls-propres.php3
+++ b/inc-urls-propres.php3
@@ -73,7 +73,9 @@ function _generer_url_propre($type, $id_objet) {
 	// Sinon, creer l'URL
 	include_ecrire("inc_filtres.php3");
 	include_ecrire("inc_charsets.php3");
-	$url = translitteration(corriger_caracteres(supprimer_tags(supprimer_numero($row['titre']))));
+	$url = translitteration(corriger_caracteres(
+		supprimer_tags(supprimer_numero(extraire_multi($row['titre'])))
+		));
 	$url = @preg_replace(',[[:punct:][:space:]]+,u', ' ', $url);
 	// S'il reste des caracteres non latins, utiliser l'id a la place
 	if (preg_match(",[^a-zA-Z0-9 ],", $url)) {