diff --git a/.gitattributes b/.gitattributes
index 364274721a7fd6060aefd5ff1d923854f46c1d55..a82cbfaf7507fb45ed88097c95835a6c20ef8797 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -133,6 +133,7 @@ ecrire/img_pack/jauge-rouge.gif -text
 ecrire/img_pack/jauge-vert.gif -text
 ecrire/img_pack/langues-12.gif -text
 ecrire/img_pack/langues-24.gif -text
+ecrire/img_pack/langues-modif-12.gif -text
 ecrire/img_pack/langues-off-12.gif -text
 ecrire/img_pack/logo-spip.gif -text
 ecrire/img_pack/m_envoi.gif -text
diff --git a/ecrire/img_pack/langues-modif-12.gif b/ecrire/img_pack/langues-modif-12.gif
new file mode 100644
index 0000000000000000000000000000000000000000..e4c9ef95e09863f81b92d845b755604f416f6da8
Binary files /dev/null and b/ecrire/img_pack/langues-modif-12.gif differ
diff --git a/ecrire/inc_presentation.php3 b/ecrire/inc_presentation.php3
index 868853a8925bcb899e63370339e85000725a316a..aeb44d416b01e3c67bf1c6067a09929bc05020bd 100644
--- a/ecrire/inc_presentation.php3
+++ b/ecrire/inc_presentation.php3
@@ -1423,6 +1423,7 @@ function debut_page($titre = "", $rubrique = "asuivre", $sous_rubrique = "asuivr
 	if ($rubrique == "asuivre"){
 		icone_bandeau_secondaire (_T('icone_a_suivre'), "index.php3", "asuivre-24.gif", "asuivre", $sous_rubrique);
 		icone_bandeau_secondaire (_T('icone_site_entier'), "articles_tous.php3", "tout-site-24.gif", "tout-site", $sous_rubrique);
+		icone_bandeau_secondaire (_T('icone_etat_traductions'), "plan_trad.php3", "langues-24.gif", "plan-trad", $sous_rubrique);
 	}
 	else if ($rubrique == "documents"){
 		icone_bandeau_secondaire (_T('icone_rubriques'), "naviguer.php3", "rubrique-24.gif", "rubriques", $sous_rubrique);
diff --git a/ecrire/lang/spip_fr.php3 b/ecrire/lang/spip_fr.php3
index de61a605ca8abf59ae002d466b0f38f4144aa6b2..4e413dde4294acc1d8ce4b00e35837fd9376d35f 100644
--- a/ecrire/lang/spip_fr.php3
+++ b/ecrire/lang/spip_fr.php3
@@ -395,6 +395,7 @@ Merci de votre participation
 'icone_ecrire_nouvel_article' => 'Les brèves contenues dans cette rubrique',
 'icone_edition_site' => 'Édition du site',
 'icone_envoyer_message' => 'Envoyer ce message',
+'icone_etat_traductions' => 'État des traductions',
 'icone_evolution_visites' => '&Eacute;volution des visites<br>@visites@ visites@aff_ref@',
 'icone_evolution_visites_2' => 'Evolution des visites',
 'icone_forum_administrateur' => 'Forum des administrateurs',
@@ -1446,6 +1447,16 @@ r&eacute;installation de SPIP pour recr&eacute;er une nouvelle base ainsi qu\'un
 'texte_nouvelle_version_spip_1' => 'Vous avez install&eacute; une nouvelle version de SPIP.',
 'texte_nouvelle_version_spip_2' => 'Cette nouvelle version n&eacute;cessite une mise &agrave; jour plus compl&egrave;te qu\'&agrave; l\'accoutum&eacute;e. Si vous &ecirc;tes webmestre du site, veuillez effacer le fichier <tt>inc_connect.php3</tt> du r&eacute;pertoire <tt>ecrire</tt> et reprendre l\'installation afin de mettre &agrave; jour vos param&egrave;tres de connexion &agrave; la base de donn&eacute;es.<p> (NB.&nbsp;: si vous avez oubli&eacute; vos param&egrave;tres de connexion, jetez un oeil au fichier <tt>inc_connect.php3</tt> avant de le supprimer...)',
 'texte_operation_echec' => 'Retournez &agrave; la page pr&eacute;c&eacute;dente, s&eacute;lectionnez une autre base ou cr&eacute;ez-en une nouvelle. V&eacute;rifiez les informations fournies par votre h&eacute;bergeur.',
+'texte_plan_trad' => 'Cette page vous permet de visualiser l\'&eacute;tat des traductions pour la langue choisie. 
+		La page affiche les articles dont la traduction est en cours, les articles dont la traduction doit &ecirc;tre mise &agrave jour, 
+		ainsi que les articles qui n\'ont pas encore &eacute;t&eacute; traduits. ',
+'texte_plan_trad_en_cours' => 'Ce symbole indique qu\'un article est en cours de traduction&nbsp;: cela veut dire qu\'une traduction 
+		a &eacute;t&eacute; commenc&eacute;e mais n\'est pas encore publi&eacute;e. Cliquez sur le symbole pour acc&eacute;der
+		&agrave; la traduction. ',
+'texte_plan_trad_modif' => 'Ce symbole indique que des modifications ont &eacute;t&eacute; apport&eacute;es &agrave 
+		un article d&eacute;j&agrave; traduit. Dans ce cas il est conseill&eacute; de mettre &agrave; jour la
+		traduction en fonction des modifications apport&eacute;es &agrave; l\'article original. ',
+'texte_plan_trad_note' => 'Note&nbsp;: seuls les articles publi&eacute;s sont affich&eacute;s dans cette page.',
 'texte_plus_trois_car' => 'plus de 3 caract&egrave;res',
 'texte_plusieurs_articles' => 'Plusieurs auteurs trouv&eacute;s pour "@cherche_auteur@":',
 'texte_port_annuaire' => '(La valeur indiqu&eacute;e par d&eacute;faut convient g&eacute;n&eacute;ralement.)',
@@ -1557,6 +1568,7 @@ avez fait des modifications importantes de graphisme ou de structure du site.',
 'titre_breve_refusee' => 'Br&egrave;ve refus&eacute;e',
 'titre_breves' => 'Les br&egrave;ves',
 'titre_cadre_afficher_article' => 'Afficher les articles',
+'titre_cadre_afficher_traductions' => 'Afficher l\'&eacute;tat des traductions pour cette langue',
 'titre_cadre_ajouter_auteur' => 'AJOUTER UN AUTEUR :',
 'titre_cadre_forum_administrateur' => 'Forum priv&eacute; des administrateurs',
 'titre_cadre_forum_interne' => 'Forum interne',
@@ -1613,6 +1625,7 @@ avez fait des modifications importantes de graphisme ou de structure du site.',
 'titre_page_controle_petition' => 'Suivi des p&eacute;titions',
 'titre_page_delete_all' => 'suppression totale et irr&eacute;versible',
 'titre_page_documents_liste' => 'Les documents des rubriques',
+'titre_page_etat_traductions' => '&Eacute;tat des traductions',
 'titre_page_forum' => 'Forum des administrateurs',
 'titre_page_forum_envoi' => 'Envoyer un message',
 'titre_page_forum_suivi' => 'Suivi des forums',
diff --git a/ecrire/plan_trad.php3 b/ecrire/plan_trad.php3
new file mode 100644
index 0000000000000000000000000000000000000000..81c042433eddc4c2cdde08ee137e933e7f54370c
--- /dev/null
+++ b/ecrire/plan_trad.php3
@@ -0,0 +1,215 @@
+<?php
+
+include ("inc.php3");
+
+debut_page(_T('titre_page_etat_traductions'), "asuivre", "plan-trad");
+debut_gauche();
+
+if (!$trad_lang) $trad_lang = $spip_lang;
+
+
+//debut_cadre_relief('langues-24.gif');
+echo "<p>";
+debut_cadre_formulaire();
+
+$link = new Link();
+
+echo "<font face='Arial,Sans,sans-serif'>";
+echo _T('titre_cadre_afficher_traductions')."&nbsp;: <p>";
+echo menu_langues('trad_lang', $trad_lang);
+echo "</font>";
+
+//fin_cadre_relief();
+fin_cadre_formulaire();
+
+
+debut_boite_info();
+
+echo _T('texte_plan_trad');
+
+echo "<p>"."<IMG SRC='img_pack/langues-off-12.gif' WIDTH='12' HEIGHT='12' BORDER='0'> "._T('texte_plan_trad_en_cours');
+
+echo "<p>"."<IMG SRC='img_pack/langues-modif-12.gif' WIDTH='12' HEIGHT='12' BORDER='0'> "._T('texte_plan_trad_modif');
+
+echo "<p><i>"._T('texte_plan_trad_note')."</i>";
+
+fin_boite_info();
+
+
+debut_droite();
+
+
+function afficher_rubrique($id_parent, $marge = 0, $cond = '', $afficher = true) {
+	global $deplier;
+	global $liste_rubs;
+	global $trad_lang;
+	global $couleur_foncee;
+	global $dir_lang;
+	static $total_articles = 0;
+	static $rubriques_actives;
+
+	if (!$rubriques_actives) {
+		$rubriques_actives[0] = true;
+	
+		$query = "SELECT DISTINCT a.id_rubrique ".
+			"FROM spip_articles AS a LEFT JOIN spip_articles AS t ".
+			"ON (a.id_article = t.id_trad AND t.lang = '$trad_lang') ".
+			"WHERE a.statut='publie' AND a.lang!='$trad_lang' AND (a.id_trad=0 OR a.id_trad=a.id_article) ".
+			"AND (t.id_article IS NULL OR t.statut!='publie' OR t.date_modif < a.date_modif)";
+		$result = spip_query($query);
+		while ($row = spip_fetch_array($result)) {
+			$rubriques_actives[$row['id_rubrique']] = true;
+		}
+	}
+	
+	if (!$cond) $cond = array();
+	$vide = !$rubriques_actives[$id_parent];
+	if (!$vide) {
+		echo $cond['avant'];
+	}
+
+	//
+	// Afficher les articles a traduire
+	//
+
+	if ($id_parent AND !$vide AND $afficher) {
+		$query = "SELECT a.id_article, a.titre, a.date, a.descriptif, a.lang, t.id_article AS trad_id_article, t.statut AS trad_statut, (t.date_modif >= a.date_modif) AS trad_a_jour ".
+			"FROM spip_articles AS a LEFT JOIN spip_articles AS t ".
+			"ON (a.id_article = t.id_trad AND t.lang = '$trad_lang') ".
+			"WHERE a.id_rubrique=$id_parent AND a.statut='publie' AND a.lang!='$trad_lang' AND (a.id_trad=0 OR a.id_trad=a.id_article) ".
+			"AND (t.id_article IS NULL OR t.statut!='publie' OR t.date_modif < a.date_modif) ".
+			"ORDER BY t.statut='publie' DESC, trad_a_jour DESC, a.titre";
+		$result = spip_query($query);
+
+		$table = '';
+	
+		while ($row = spip_fetch_array($result)) {
+			$total_articles ++;
+			if ($lang = $row['lang']) changer_typo($lang);
+			$id_article = $row['id_article'];
+			$titre = typo($row['titre']);
+			$date = $row['date'];
+			$id_article_traduit = $row['trad_id_article'];
+			$statut_traduit = $row['trad_statut'];
+			$a_jour = $row['trad_a_jour'];
+			$descriptif = $row['descriptif'];
+			if ($descriptif) $descriptif = ' title="'.attribut_html(typo($descriptif)).'"';
+			
+			$vals = '';
+
+			$popularite = ceil(min(100,100 * $row['popularite'] / max(1, 0 + lire_meta('popularite_max'))));
+			$petition = $row['petition'];
+
+			$s = "";
+			if ($id_article_traduit) {
+				$s .= "<a href='articles.php3?id_article=$id_article_traduit'>";
+				if ($a_jour AND $statut_traduit == 'publie') {
+					$puce = 'langues-12.gif';
+					$puce_title = "Traduction &agrave; jour";
+				}
+				else if ($statut_traduit == 'publie') {
+					$puce = 'langues-modif-12.gif';
+					$puce_title = "L'article original a &eacute;t&eacute; modifi&eacute, la traduction n'est plus &agrave; jour";
+				}
+				else {
+					$puce = 'langues-off-12.gif';
+					$puce_title = "Traduction en cours";
+				}
+				$s .= "<img src='img_pack/$puce' width='12' height='12' border='0' title=\"".attribut_html($puce_title)."\">";
+				$s .= "</a>&nbsp;&nbsp;";
+			}
+			
+			$s .= "<a href=\"articles.php3?id_article=$id_article\"$descriptif><span $dir_lang>".typo($titre)."</span></a>";
+			$s .= " &nbsp; <font size='1' color='#666666'>(".traduire_nom_langue($lang).")</font>";
+
+			$vals[] = $s;
+
+			$s = affdate($date);
+			$vals[] = $s;
+
+			$table[] = $vals;
+		}
+		spip_free_result($result);
+
+		if ($table) {
+			echo "<table width=100% cellpadding=0 cellspacing=0 border=0><tr><td width=100% background=''>";
+			echo "<table width=100% cellpadding=3 cellspacing=0 border=0>";
+			$largeurs = array('', 90);
+			$styles = array('arial2', 'arial1');
+			afficher_liste($largeurs, $table, $styles);
+			echo "</table></td></tr></table>";
+		}
+	}
+	
+	if (!$vide)
+		echo $cond['apres'];
+
+	//
+	// Parcourir les sous-rubriques
+	//
+
+	if ($vide OR $afficher) {
+		$query_parent = "SELECT id_rubrique, titre FROM spip_rubriques WHERE id_parent=$id_parent ORDER BY titre";
+		$result_parent = spip_query($query_parent);
+	
+		while ($row_parent = spip_fetch_array($result_parent)) {
+			$id_rubrique = $row_parent['id_rubrique'];
+			$titre_rubrique = typo($row_parent['titre']);
+	
+			if ($deplier == 'oui')
+				$afficher_fils = !$liste_rubs[$id_rubrique];
+			else if ($deplier == 'non')
+				$afficher_fils = $liste_rubs[$id_rubrique];
+			else $afficher_fils = ($total_articles < 30) || $liste_rubs[$id_rubrique];
+
+			$rubs = $liste_rubs;
+			if ($rubs[$id_rubrique])
+				unset($rubs[$id_rubrique]);
+			else
+				$rubs[$id_rubrique] = $id_rubrique;
+			$lien = new Link();
+			$lien->addVar('rubs', join(',', $rubs));
+
+			$bandeau = "<div style='width: 100%; margin: 0px; padding: 3px; border: none; background: $couleur_foncee;'>\n" .
+				"<b><a href='".$lien->getUrl()."'><img src='img_pack/".($afficher_fils ? 'triangle-bleu-bas.gif' : 'triangle-bleu.gif')."' alt='' width='14' height='14' border='0'></a> ".
+				"<a href='naviguer.php3?coll=$id_rubrique'><font color='white' face='Verdana,Arial,Sans,sans-serif'>$titre_rubrique</font></a></b>\n".
+				"</div>\n";
+
+			if ($afficher) {
+				$cond_fils['avant'] = "<div style='margin: 0px; margin-left: ".$marge."px; padding: 0px; background: none;'>\n".$bandeau;
+				$cond_fils['apres'] = "</div>\n";
+				if (!$id_parent) $cond_fils['avant'] = "<p>".$cond_fils['avant'];
+			}
+			if ($vide) {
+				$cond_fils['avant'] = $cond['avant'].$cond['apres'].$cond_fils['avant'];
+			}
+			afficher_rubrique($id_rubrique, $marge + 20, $cond_fils, $afficher_fils);
+		}
+	}
+}
+
+
+echo "<p>";
+$lien = new Link();
+$lien->delVar('rubs');
+$lien->addVar('deplier', 'oui');
+echo "<a href='".$lien->getUrl()."'>"._T('lien_tout_deplier')."</a>";
+$lien->addVar('deplier', 'non');
+echo " | <a href='".$lien->getUrl()."'>"._T('lien_tout_replier')."</a>";
+echo "<p>";
+
+$liste_rubs = array();
+if ($rubs) {
+	$t = explode(',', $rubs);
+	while (list(, $rub) = each($t)) {
+		$liste_rubs[$rub] = $rub;
+	}
+}
+
+afficher_rubrique(0);
+
+
+fin_page();
+
+?>
+
diff --git a/ecrire/spip_style.php3 b/ecrire/spip_style.php3
index f3d198589cb22a124f1e37dfaeee890917d63066..de3db536f962d1a0d9a8e4307ee1173c6599a3b4 100644
--- a/ecrire/spip_style.php3
+++ b/ecrire/spip_style.php3
@@ -217,17 +217,17 @@ td {
 	-moz-border-radius: 5px;
 }
 .cellule36 a span, .cellule48 a span {
-	color: #666666; display: block; margin: 2px;
+	color: #666666; display: block; margin: 1px;
 	filter: DropShadow(Color=white, OffX=1, OffY=1, Positive=1) DropShadow(Color=#cccccc, OffX=-1, OffY=-1, Positive=1);
-	width: 100%
+	width: 100%;
 }
 .cellule36 a:hover span, .cellule48 a:hover span {
-	color: #000000; display: block; margin: 2px;
+	color: #000000; display: block; margin: 1px;
 	filter: DropShadow(Color=white, OffX=1, OffY=1, Positive=1) DropShadow(Color=#cccccc, OffX=-1, OffY=-1, Positive=1);
 	width: 100%;
 }
 .cellule36 a.selection span, .cellule48 a.selection span {
-	color: #000000; display: block; margin: 2px;
+	color: #000000; display: block; margin: 1px;
 	filter: DropShadow(Color=white, OffX=-1, OffY=-1, Positive=1) DropShadow(Color=#cccccc, OffX=1, OffY=1, Positive=1);
 	width: 100%;
 }