diff --git a/ecrire/exec/lang_raccourcis.php b/ecrire/exec/lang_raccourcis.php
index b97865ab08eb1e90014830c8611f33a661bd822e..0fa1f61ef40df4065522b69d86936cc5cc47f183 100644
--- a/ecrire/exec/lang_raccourcis.php
+++ b/ecrire/exec/lang_raccourcis.php
@@ -13,109 +13,93 @@
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
 include_spip('inc/presentation');
+include_spip('inc/lang');
 
-function exec_lang_raccourcis_dist()
-{
-  global $changer_config, $couleur_foncee,  $spip_lang, $spip_lang_left;
+function exec_lang_raccourcis_dist() {
+	global $changer_config, $couleur_foncee,  $spip_lang, $spip_lang_left;
 
-  $module = $changer_config ? $changer_config : "public";
 
+	##### a revoir : des repertoires lang, il peut y en avoir plusieurs
+	$modules = array();
+	$fichiers = preg_files(repertoire_lang().'[a-z_]+\.php[3]?$');
+	foreach ($fichiers as $fichier) {
+		if (preg_match(',/([a-z]+)_([a-z_]+)\.php[3]?$,', $fichier, $r))
+			$modules[$r[1]] ++;
+	}
 
-debut_page(_T('module_fichier_langue').": $module", "administration", "langues");
+	$modules = array_keys($modules);
 
-echo "<br><br><br>";
-gros_titre(_T('module_fichier_langue').": $module");
+	if (!in_array($module = _request('module'), $modules))
+		$module = 'public';
 
-barre_onglets("config_lang", "fichiers");
+	debut_page(_T('module_fichier_langue').": $module",
+		"administration", "langues");
 
+	echo "<br><br><br>";
+	gros_titre(_T('module_fichier_langue').": $module");
 
-debut_gauche();
-	
-$modules = array();
-
-##### a revoir : des repertoires lang, il peut y en avoir partout sur le chemin
-##### cf. aussi fonction ci-dessous
-if (!$d = @opendir(_DIR_LANG)) return;
-while (($f = readdir($d)) !== false) {
-	if (ereg('^([a-z_]+)\.php[3]?$', $f, $regs))
-		$nom_module = $regs[1];
-		if (!ereg('^(spip|ecrire)\_', $nom_module) && ereg("^([a-zA-Z]+)\_".$spip_lang."$", $nom_module, $reps))
-			$modules[] = $reps[1];
-}
-closedir($d);
+	barre_onglets("config_lang", "fichiers");
 
-if (count($modules) > 1) {
-	echo debut_cadre_relief();
-	echo "<div class='verdana3' style='background-color: $couleur_foncee; color: white; padding: 3px;'><b>"._T('module_fichiers_langues').":</b></div><br>\n";
 
-	reset($modules);
-	while (list(, $nom_module) = each($modules)) {
-		if ($nom_module == $module) echo "<div style='padding-$spip_lang_left: 10px;' class='verdana3'><b>$nom_module</b></div>";
-		else echo "<div style='padding-$spip_lang_left: 10px;' class='verdana3'><a href='" . generer_url_ecrire("lang_raccourcis","module=$nom_module") . "'>$nom_module</a></div>";
+	debut_gauche();
+
+	if (count($modules) > 1) {
+		echo debut_cadre_relief();
+		echo "<div class='verdana3' style='background-color: $couleur_foncee; color: white; padding: 3px;'><b>"._T('module_fichiers_langues').":</b></div><br>\n";
+
+		foreach ($modules as $nom_module) {
+			if ($nom_module == $module) echo "<div style='padding-$spip_lang_left: 10px;' class='verdana3'><b>$nom_module</b></div>";
+			else echo "<div style='padding-$spip_lang_left: 10px;' class='verdana3'><a href='" . generer_url_ecrire("lang_raccourcis","module=$nom_module") . "'>$nom_module</a></div>";
+		}
+		echo fin_cadre_relief();
 	}
-	echo fin_cadre_relief();
-}
 
-$module = array_pop($modules);
 
+	debut_droite();
 
-debut_droite();
+	afficher_raccourcis($module);
 
-afficher_raccourcis($module);
 
+	fin_page();
 
-fin_page();
 }
 
-##### a revoir aussi (cf. commentaire ci-dessus)
 function afficher_raccourcis($module = "public") {
 	global $spip_lang;
 	global $couleur_foncee;
 	
-	$lang = $module.'_'.$spip_lang;
-	if ($fichier_lang = find_in_path($lang._EXTENSION_PHP, _DIR_LANG)) {
-		$GLOBALS['idx_lang'] = 'i18n_' . $lang;
-		include_local($fichier_lang);
-	
-		$tableau = $GLOBALS['i18n_' . $lang];
-		ksort($tableau);
-		
-		if ($module != "public" AND $module != "local") $aff_nom_module = "$module:";
-		
-		echo "<div class='arial2'>"._T('module_texte_explicatif')."</div>";
-		echo "<div>&nbsp;</div>";
-
-		if (!$d = @opendir(_DIR_LANG)) return;
-		while (($f = readdir($d)) !== false) {
-			if (ereg("^".$module."\_([a-z_]+)\.php[3]?$", $f, $regs))
+	charger_langue($spip_lang, $module);
+
+	$tableau = $GLOBALS['i18n_' . $module . '_' . $spip_lang];
+	ksort($tableau);
+
+	if ($module != "public" AND $module != "local")
+		$aff_nom_module = "$module:";
+
+	echo "<div class='arial2'>"._T('module_texte_explicatif')."</div>";
+	echo "<div>&nbsp;</div>";
+
+	foreach (preg_files(repertoire_lang().$module.'_[a-z_]+\.php[3]?$') as $f)
+		if (ereg("^".$module."\_([a-z_]+)\.php[3]?$", $f, $regs))
 				$langue_module[$regs[1]] = traduire_nom_langue($regs[1]);
-		}
-		if ($langue_module) {
-			ksort($langue_module);
-			echo "<div class='arial2'>"._T('module_texte_traduction', array('module' => $module));
-			echo " ".join(", ", $langue_module).".";
-			echo "</div><div>&nbsp;</div>";
-		}
-		
-		closedir($d);
-		
-		echo "<table cellpadding='3' cellspacing='1' border='0'>";
-		echo "<tr bgcolor='$couleur_foncee' style='color:white;'><td class='verdana1'><b>"._T('module_raccourci')."</b></td><td class='verdana2'><b>"._T('module_texte_affiche')."</b></td></tr>\n";
-	
-		for (reset($tableau); $raccourci = key($tableau); next($tableau)) {
-			if ($i == 1) {
-				$i = 0;
-				$bgcolor = '#eeeeee';	
-			} else {
-				$i = 1;
-				$bgcolor= 'white';
-			}
-		
-			$texte  = pos($tableau);
-			echo "<tr bgcolor='$bgcolor'><td class='verdana2'><b><:$aff_nom_module$raccourci:></b></td><td class='arial2'>$texte</td></tr>\n";
-		}
-		echo "</table>";
+
+	if ($langue_module) {
+		ksort($langue_module);
+		echo "<div class='arial2'>"._T('module_texte_traduction',
+			array('module' => $module));
+		echo " ".join(", ", $langue_module).".";
+		echo "</div><div>&nbsp;</div>";
 	}
+
+	echo "<table cellpadding='3' cellspacing='1' border='0'>";
+	echo "<tr bgcolor='$couleur_foncee' style='color:white;'><td class='verdana1'><b>"._T('module_raccourci')."</b></td><td class='verdana2'><b>"._T('module_texte_affiche')."</b></td></tr>\n";
+
+	foreach ($tableau as $raccourci => $val) {
+		$bgcolor = alterner($i++, '#eeeeee','white');
+		echo "<tr bgcolor='$bgcolor'><td class='verdana2'><b><:$aff_nom_module$raccourci:></b></td><td class='arial2'>".$val."</td></tr>\n";
+	}
+
+	echo "</table>";
 }
 
 ?>
diff --git a/ecrire/inc/cron.php b/ecrire/inc/cron.php
index 72a5381ae731e2915890732edf28f3f2e697a55c..c8e2e79d0c41349400955dc44970a74312e71278 100644
--- a/ecrire/inc/cron.php
+++ b/ecrire/inc/cron.php
@@ -49,7 +49,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 // Les taches les plus longues sont tronconnees, ce qui impose d'antidater
 // le fichier de verrouillage (avec la valeur absolue du code de retour).
 // La fonction executant la tache est un homonyme de prefixe "cron_"
-// Le fichier homonyme de prefixe "inc_" et de suffixe _EXTENSION_PHP
+// Le fichier homonyme de prefixe "inc_"
 // est automatiquement charge si besoin, et est supposee la definir si ce
 // n'est fait ici.
 
diff --git a/ecrire/inc/lang.php b/ecrire/inc/lang.php
index 8428bcf7398a617c9886391ab93477c10e73c37e..a4133f687d60a2e8ae8107be745b3be0972ac146 100644
--- a/ecrire/inc/lang.php
+++ b/ecrire/inc/lang.php
@@ -376,6 +376,21 @@ function utiliser_langue_visiteur() {
 		changer_langue($_COOKIE[$cookie_lang]);
 }
 
+// Une fonction qui donne le repertoire ou trouver des fichiers de langue
+// note : pourrait en donner une liste... complique
+function repertoire_lang($module='spip', $lang='fr') {
+	# valeur forcee (par ex.sur spip.net), old style, a faire disparaitre
+	if (defined('_DIR_LANG'))
+		return _DIR_LANG;
+
+	# regarder s'il existe une v.f. qq part
+	if ($f = include_spip('lang/'.$module.'_'.$lang));
+		return dirname($f).'/';
+
+	# sinon, je ne sais trop pas quoi dire...
+	return _DIR_INCLUDE.'lang/';
+}
+
 //
 // Initialisation
 //
@@ -392,7 +407,7 @@ function init_langues() {
 
 	$toutes_langs = Array();
 	if (!$all_langs || !$langue_site || !_DIR_RESTREINT) {
-		if (!$d = @opendir(_DIR_LANG)) return;
+		if (!$d = @opendir(repertoire_lang())) return;
 		while (($f = readdir($d)) !== false) {
 			if (ereg('^spip_([a-z_]+)\.php[3]?$', $f, $regs))
 				$toutes_langs[] = $regs[1];
diff --git a/ecrire/inc_utils.php b/ecrire/inc_utils.php
index f30e7c22dfec9d97bcab793fd5f26860a03f3d8a..b9e531aa8c091cfc9bcb31ca6771dafcb14267b3 100644
--- a/ecrire/inc_utils.php
+++ b/ecrire/inc_utils.php
@@ -31,7 +31,7 @@ function include_local ($file, $silence=false) {
 		include($f);
 		return true;
 	}
-	else if (is_readable($f = $nom . _EXTENSION_PHP)) {
+	else if (is_readable($f = $nom . '.php3')) {
 		include($f);
 		return true;
 	}
@@ -782,28 +782,15 @@ function get_spip_script($default='') {
 
 function generer_url_public($script, $args="", $no_entities=false) {
 
-	if (!$script) {
-		$action = get_spip_script();
-
-	} else {
-		// transition : s'agit-il d'un fichier existant ?
-		$fichier = $script . (ereg('[.]php[3]?$', $script) ? 
-		'' : _EXTENSION_PHP);
-		if (@file_exists(_DIR_RACINE . $fichier)) {
-			$action = $fichier;
-		}
-
-		// sinon utiliser _SPIP_SCRIPT?page=script
-		else {
-			$action = get_spip_script() . '?page=' . $script;
-		}
-	}
-
 	// si le script est une action (spip_pass, spip_inscription),
 	// utiliser generer_url_action [hack temporaire pour faire
 	// fonctionner #URL_PAGE{spip_pass} ]
 	if (preg_match(',^spip_(.*),', $script, $regs))
-		return generer_url_action($regs[1],$args,true);
+		return generer_url_action($regs[1],$args,true); # attention a la recursivite !!
+
+	$action = get_spip_script();
+	if ($script)
+		$action = parametre_url($action, 'page', $script, '&');
 
 	if ($args)
 		$action .=
@@ -935,9 +922,6 @@ function spip_initialisation() {
 	define('_ROOT_IMG_PACK', (dirname(__FILE__) . '/img_pack/'));
 	define('_ROOT_IMG_ICONES_DIST', (dirname(__FILE__) . '/img_pack/icones/'));
 
-	// Fichiers de langue
-	define('_DIR_LANG', (_DIR_RESTREINT . 'lang/'));
-
 	// Le charset par defaut lors de l'installation
 	define('_DEFAULT_CHARSET', 'utf-8');