diff --git a/ecrire/action/redirect.php b/ecrire/action/redirect.php
index 368c94d18966d0ec715eb2fc5d687cbfb49a5476..04246accc3ba9bc88aa37002ade9a2476ff579c6 100644
--- a/ecrire/action/redirect.php
+++ b/ecrire/action/redirect.php
@@ -21,6 +21,7 @@ charger_generer_url();
 function action_redirect_dist()
 {
   global $redirect;
+  $redirect = _request('redirect');
 
   if ($mode = _request('var_mode')) $mode = "var_mode=$mode";
 
diff --git a/ecrire/inc/lang.php b/ecrire/inc/lang.php
index 594bdc2f0697af9ae0844111e8a3dfe0992dcff7..2e911e87beb22629d693e08942375a3be07a71c3 100644
--- a/ecrire/inc/lang.php
+++ b/ecrire/inc/lang.php
@@ -77,11 +77,17 @@ function lang_dir($lang='', $droitier='ltr', $gaucher='rtl') {
 // http://doc.spip.org/@lang_typo
 function lang_typo($lang='') {
 	if (!$lang) {
-		$lang = isset($GLOBALS['lang_objet']) ? $GLOBALS['lang_objet'] : $GLOBALS['spip_lang'];
+		$lang = isset($GLOBALS['lang_objet'])
+			? $GLOBALS['lang_objet']
+			: $GLOBALS['spip_lang'];
 	}
-	if ($lang == 'eo' OR $lang == 'fr' OR substr($lang, 0, 3) == 'fr_' OR $lang == 'cpf')
+	if ($lang == 'eo'
+	OR $lang == 'fr'
+	OR substr($lang, 0, 3) == 'fr_'
+	OR $lang == 'cpf')
 		return 'fr';
-	else	return 'en';
+	else
+		return 'en';
 }
 
 // gestion de la globale $lang_objet pour que les textes soient affiches
diff --git a/ecrire/inc/texte.php b/ecrire/inc/texte.php
index 931a94e8d7f1da9d9056a4ca36e2e0e4c518a869..56ef7a88fd856ed3d3ae8230496e2821a122a75b 100644
--- a/ecrire/inc/texte.php
+++ b/ecrire/inc/texte.php
@@ -457,28 +457,31 @@ function typo($letexte, $echapper=true) {
 	// Caracteres de controle "illegaux"
 	$letexte = corriger_caracteres($letexte);
 
-	// Proteger les caracteres typographiques a l'interieur des tags html
-	$protege = "!':;?~%";
-	$illegal = "\x1\x2\x3\x4\x5\x6\x7";
-	if (preg_match_all(",</?[a-z!][^<>]*[!':;\?~%][^<>]*>,imsS",
-	$letexte, $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, $protege, $illegal);
-			$letexte = str_replace($reg[0], $insert, $letexte);
+	// Charger & appliquer la fonction de typographie
+	if ($typographie = charger_fonction(lang_typo(), 'typographie')) {
+
+		// Proteger les caracteres typographiques a l'interieur des tags html
+		$protege = "!':;?~%";
+		$illegal = "\x1\x2\x3\x4\x5\x6\x7";
+		if (preg_match_all(",</?[a-z!][^<>]*[!':;\?~%][^<>]*>,imsS",
+		$letexte, $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, $protege, $illegal);
+				$letexte = str_replace($reg[0], $insert, $letexte);
+			}
 		}
-	}
 
 
-	$lang = lang_typo();
-	lang_select($lang);
-	$typographie = charger_fonction($lang, 'typographie');
+		$letexte = $typographie($letexte);
+
+		// Retablir les caracteres proteges
+		$letexte = strtr($letexte, $illegal, $protege);
+
+	}
 
-	$letexte = $typographie($letexte);
-	// Retablir les caracteres proteges
-	$letexte = strtr($letexte, $illegal, $protege);
 
 	//
 	// Installer les modeles, notamment images et documents ;
@@ -495,9 +498,6 @@ function typo($letexte, $echapper=true) {
 	if (function_exists('apres_typo'))
 		$letexte = apres_typo($letexte);
 
-	// remettre la langue precedente
-	if ($lang) lang_select();
-
 	// reintegrer les echappements
 	if ($echapper)
 		$letexte = echappe_retour($letexte, 'TYPO');
diff --git a/ecrire/public.php b/ecrire/public.php
index c6c7353f1cf1517b5fe7522d74473626300a5c87..e17ef8f403bbacae7f81e7de778626990fd0bf52 100644
--- a/ecrire/public.php
+++ b/ecrire/public.php
@@ -56,8 +56,9 @@ if (defined('_INC_PUBLIC')) {
 		include_spip('inc/headers');
 		$var_f = charger_fonction($action, 'action');
 		$var_f();
-		if (_request('redirect'))
-			redirige_par_entete(urldecode(_request('redirect')));
+		if ($GLOBALS['redirect']
+		OR $GLOBALS['redirect'] = _request('redirect'))
+			redirige_par_entete(urldecode($GLOBALS['redirect']));
 		if (!headers_sent())
 			http_status(204); // No Content
 		exit;