diff --git a/inc-calcul-squel.php3 b/inc-calcul-squel.php3
index 3e45715c1dbc37afd3f97e4ed919738f9e2c11d4..e234edc48316ebbcc895aea0892d2f9636bccc92 100644
--- a/inc-calcul-squel.php3
+++ b/inc-calcul-squel.php3
@@ -1090,7 +1090,7 @@ function calculer_champ($id_champ, $id_boucle, $nom_var)
 		break;
 
 	case 'LANG':
-		$code = "lire_meta('langue_site')";
+		$code = "\$GLOBALS['spip_lang']";
 		break;
 
 	case 'LANG_LEFT':
@@ -1788,7 +1788,6 @@ function calculer_texte($texte)
 		$fichier = $match[2];
 		ereg('^\\{(.*)\\}$', trim($match[3]), $params);
 		$code .= "	\$retour .= '<"."?php ';\n";
-		$code .= "	\$retour .= 'include_ecrire(\'inc_lang.php3\'); lang_select(lire_meta(\'langue_site\'));';\n";
 		$code .= "	\$retour .= '\$contexte_inclus = \'\'; ';\n";
 
 		if ($params) {
@@ -1799,7 +1798,15 @@ function calculer_texte($texte)
 				if (ereg("^([_0-9a-zA-Z]+)[[:space:]]*(=[[:space:]]*([^}]+))?$", $param, $args)) {
 					$var = $args[1];
 					$val = $args[3];
-					if ($val)
+
+					// cas de la langue
+					if ($var == 'lang') {
+						$lang_inclus = "\\'".addslashes($val)."\\'";
+						if (! $val)
+							$val = $lang_inclus = '$GLOBALS[spip_lang]';
+						$code .= "	\$retour .= '\$contexte_inclus[$var] = $val; ';\n";
+					}
+					else if ($val)
 						$code .= "	\$retour .= '\$contexte_inclus[$var] = \'".addslashes($val)."\'; ';\n";
 					else
 						$code .= "	\$retour .= '\$contexte_inclus[$var] = \''.addslashes(\$contexte[$var]).'\'; ';\n";
@@ -1807,6 +1814,9 @@ function calculer_texte($texte)
 			}
 		}
 
+		if (!$lang_inclus) $lang_inclus = 'lire_meta(\\\'langue_site\\\')';
+		$code .= "	\$retour .= 'include_ecrire(\'inc_lang.php3\'); lang_select($lang_inclus);';\n";
+
 		// inclure en priorite dans le dossier_squelettes
 		if ($dossier_squelettes) {
 			$code .= "	\$retour .= '
diff --git a/inc-calcul.php3 b/inc-calcul.php3
index 2f87c7c8e7993c5bf4e041e8f90171b3672e605b..8952eee589046f47816cc6972c4c6f43e585fae1 100644
--- a/inc-calcul.php3
+++ b/inc-calcul.php3
@@ -419,7 +419,7 @@ function chercher_squelette_hierarchie($fond, $id_rubrique, $dossier='') {
 	}
 }
 
-function chercher_squelette($fond, $id_rubrique) {
+function chercher_squelette($fond, $id_rubrique, $lang='') {
 	global $dossier_squelettes;
 
 	// prendre en compte le bon repertoire (pas grave si on a deux / dans l'arborescence)
@@ -428,11 +428,22 @@ function chercher_squelette($fond, $id_rubrique) {
 	// On selectionne, dans l'ordre :
 	// fond=10.html, fond-10.html, fond-<rubriques parentes>.html, fond.html puis fond-dist.html
 	if (($id_rubrique > 0) AND (@file_exists("$dossier$fond=$id_rubrique.html"))) {
-		return "$dossier$fond=$id_rubrique";
+		$squel = "$dossier$fond=$id_rubrique";
 	}
 	else {
-		return chercher_squelette_hierarchie($fond, $id_rubrique, $dossier); // recursif le long de la hierarchie
+		// recursif le long de la hierarchie
+		$squel = chercher_squelette_hierarchie($fond, $id_rubrique, $dossier); 
 	}
+
+
+	// affiner par langue
+	if ($lang == '')
+		$lang = lire_meta('langue_site');
+
+	if (@file_exists("$squel.$lang.html"))
+		$squel = "$squel.$lang";
+
+	return $squel;
 }
 
 
@@ -476,7 +487,7 @@ function calculer_page_globale($fond) {
 	$contexte = '';
 	$contexte_defaut = array('id_parent', 'id_rubrique', 'id_article', 'id_auteur',
 		'id_breve', 'id_forum', 'id_secteur', 'id_syndic', 'id_syndic_article',
-		'id_mot', 'id_groupe', 'id_document', 'lang');
+		'id_mot', 'id_groupe', 'id_document');
 	reset($contexte_defaut);
 	while (list(, $val) = each($contexte_defaut)) {
 		if ($GLOBALS[$val]) {
@@ -488,6 +499,10 @@ function calculer_page_globale($fond) {
 	else
 		$contexte['date'] = $contexte['date_redac'] = date("Y-m-d H:i:s");
 
+	if (eregi("[a-z_]+",$GLOBALS['lang'], $regs) AND (substr(",".$regs[0].",", "-,".lire_meta('langues_utilisees').","))) {
+		$contexte['lang'] = $regs[0];
+		lang_select($regs[0]);
+	}
 
 	// Analyser les URLs personnalisees (inc-urls-...)
 	recuperer_parametres_url($fond, $fichier_requete);
@@ -524,15 +539,12 @@ function calculer_page_globale($fond) {
 	else {
 		$id_rubrique_fond = 0;
 	}
+	// selectionner la langue & affiner le squelette
 	if ($contexte['lang'])
 		$lang = $contexte['lang'];	// si inc-urls veut fixer la langue
-
-	$fond = chercher_squelette($fond, $id_rubrique_fond);
-
-	// selectionner la langue & affiner le squelette
 	lang_select($lang);
-	if (@file_exists("$fond.$lang.html"))
-		$fond = "$fond.$lang";
+
+	$fond = chercher_squelette($fond, $id_rubrique_fond, $lang);
 
 	// Special stats et boutons admin
 	reset($contexte_defaut);
diff --git a/inc-public-global.php3 b/inc-public-global.php3
index 755246ccbe73ae32b42d967e6a4db1b3c3f2c049..ba5a624e2e10b8681bed27ec26d409a3ca619330 100644
--- a/inc-public-global.php3
+++ b/inc-public-global.php3
@@ -25,7 +25,8 @@ function inclure_fichier($fond, $delais, $contexte_inclus = "") {
 	$fichier_requete = $fond;
 	if (is_array($contexte_inclus)) {
 		reset($contexte_inclus);
-		while(list($key, $val) = each($contexte_inclus)) $fichier_requete .= '&'.$key.'='.$val;
+		while(list($key, $val) = each($contexte_inclus))
+			$fichier_requete .= '&'.$key.'='.$val;
 	}
 	$fichier_cache = generer_nom_fichier_cache($fichier_requete);
 	$chemin_cache = "CACHE/$fichier_cache";
@@ -35,7 +36,8 @@ function inclure_fichier($fond, $delais, $contexte_inclus = "") {
 	if (!$use_cache) {
 		include_local("inc-calcul.php3");
 		$timer_a = explode(" ", microtime());
-		$fond = chercher_squelette($fond, $contexte_inclus['id_rubrique']);
+
+		$fond = chercher_squelette($fond, $contexte_inclus['id_rubrique'], $contexte_inclus['lang']);
 		$page = calculer_page($fond, $contexte_inclus);
 		$timer_b = explode(" ", microtime());
 		if ($page) {