Index: plugins/aboutConfig/locales/fr/help/help.html
===================================================================
--- plugins/aboutConfig/locales/fr/help/help.html	(revision 2322)
+++ plugins/aboutConfig/locales/fr/help/help.html	(revision 2438)
@@ -1,11 +1,21 @@
 <html>
-<head>
-  <title>About:Config</title>
-</head>
+  <head>
+    <title>About:Config</title>
+  </head>
+  
+  <body>    
+    <h4>About:Config</h4>
+    <p>Cette page présente des informations <em>techniques</em> 
+      brutes, relatives à la configuration du blog courant (et communes à tous les blogs).
+      Généralement ces paramètres sont gérés par d'autres pages de l'administration.<br />
+      Ne modifiez quelque chose que si vous savez ce que vous faîtes.</p>
+    
+    <p>Certains paramètres ne sont modifiables que sur cette page.</p>
 
-<body>
+    <p>La page présente deux onglets "Réglages pour le blog courant (nom du blog)" et "Réglages généraux"
+      qui permettent de gérer (et présenter) respectivement les réglages du blog courant et 
+      ceux communs à tous les blogs.</p>
 
-<h4>About:Config</h4>
-
-</body>
+    <p>Vous pouvez accéder directement aux différentes sections de la page avec le menu de sélection.</p>
+  </body>
 </html>
Index: plugins/akismet/locales/fr/help/help.html
===================================================================
--- plugins/akismet/locales/fr/help/help.html	(revision 2322)
+++ plugins/akismet/locales/fr/help/help.html	(revision 2458)
@@ -7,4 +7,9 @@
 
 <h4>Akismet filter</h4>
+<p>Akismet est un service de filtrage du spam particulièrement efficace qui nécessite une clé API pour fonctionner.</p>
+
+<p>Pour obtenir la clé API, rendez vous sur la page d'obtention de clé d'Askimet (en anglais) puis faites le choix de blogs personnels (Personal Blogs), un formulaire s'offre à vous, renseigner bien votre e-mail car il servira à recevoir votre clé. Vous pouvez également utiliser les identifiants de votre compte Wordpress si vous en disposez pour obtenir la clé d'API Askimet. En choisissant blogs personnels, cette clé sera gratuite et utilisable sur un multiblog.</p>
+
+<p>Entrez la clé API obtenue et enregistrez. Si la clé est reconnue, vous devriez voir apparaître le message "Clé API vérifiée. Retournez ensuite à la liste des filtres pour activer Akismet le cas échéant."</p>
 
 </body>
Index: plugins/antispam/locales/fr/help/comments.html
===================================================================
--- plugins/antispam/locales/fr/help/comments.html	(revision 2329)
+++ plugins/antispam/locales/fr/help/comments.html	(revision 2470)
@@ -1,11 +1,27 @@
 <html>
 <head>
-  <title>Modération antispam</title>
+  <title>Modération des indésirables</title>
 </head>
 
 <body>
 
-<h4>Modération antispam</h4>
+<h4>Modération des indésirables</h4>
+<p>Les indésirables ou plus communément appelés spam sont des commentaires
+postés principalement par des robots.</p>
 
+<dl>
+<dt>Afficher les indésirables</dt>
+<dd>Permet de contrôler l'ensemble des commentaires ou
+rétroliens que Dotclear a identifiés comme tels avant toute suppression
+définitive. Il se peut qu'un vrai commentaire soit passé en faux positif.</dd>
+
+<dt>Supprimer tous les indésirables</dt>
+<dd>Grâce à ce bouton, l'ensemble des commentaires ou rétroliens marqués comme tel seront supprimés. Cette action est irrévocable.</dd>
+
+<dt>Modération programmée</dt>
+<dd>Si vous avez indiqué un nombre de jours dans les Paramètres du blog,
+tous les commentaires ou retroliens marqués indésirables seront
+supprimés à l'intervalle renseigné.</dd>
+</dl>
 </body>
 </html>
Index: plugins/antispam/locales/fr/help/filters.html
===================================================================
--- plugins/antispam/locales/fr/help/filters.html	(revision 2322)
+++ plugins/antispam/locales/fr/help/filters.html	(revision 2458)
@@ -7,4 +7,10 @@
 
 <h4>Filtres antispam</h4>
+<dl>
+<dt>Fair Trackbacks</dt>
+<dd>Ce filtre vérifie que les rétroliens entrants comprennent un lien vers votre billet. Si ce n'est pas le cas, l'entrée leur est automatiquement refusée, ce qui implique qu'ils ne figureront pas dans la liste des commentaires indésirables.</dd>
+<dt>Links Lookup</dt>
+<dd>Ce filtre fonctionne un peu comme IP Lookup à la différence qu'au lieu de vérifier l'adresse IP de l'auteur, il va vérifier si les liens contenus dans le commentaire (y compris le site de l'auteur) sont présents sur la liste "multi" surbl.org. Ce filtre n'est pas configurable.</dd>
+</dl>
 
 </body>
Index: plugins/antispam/locales/fr/help/help.html
===================================================================
--- plugins/antispam/locales/fr/help/help.html	(revision 2322)
+++ plugins/antispam/locales/fr/help/help.html	(revision 2472)
@@ -4,8 +4,26 @@
 </head>
 
-<body>
+	<body>
 
 <h4>Antispam</h4>
+	<p>Le spam de commentaires et rétroliens est passé d'anecdotique à un phénomène massif. Il est devenu indispensable de disposer d'un ensemble de filtres permettant de reconnaître si un commentaire est un indésirable ou non, c'est ce que propose le plugin Antispam.
+	</p>
 
-</body>
+<dl>
+	<dt>Informations</dt>
+	<dd>Cliquer sur &#171; Commentaires indésirables &#187; renvoie vers la liste des commentaires indésirables.</dd>
+	<dd>Cliquer sur &#171; Commentaires publiés &#187; renvoie vers la liste de tous les commentaires publiés.</dd>
+	<dd>Le bouton &#171; Supprimer tous les indésirables &#187; permet de supprimer tous les commentaires indésirables d'un seul coup.</dd>
+	
+	<dt>Filtres d'indésirables disponibles</dt>
+	<dd>Par défaut, Dotclear est livré avec six filtres dont deux désactivés. Vous pouvez en rajouter d'autres par la suite.</dd> 
+	<dd>Ordre : Les filtres sont appliqués à partir du premier en partant du haut. Vous pouvez changer l'ordre des filtres. 
+	Certains des filtres par défaut (IP Lookup, Links Lookup et Akismet) ont besoin du réseau ce qui peut-être un peu long. Il est conseillé de les laisser en fin de liste.
+	De même, le filtre IP Filter pouvant décider qu'un message n'est pas un spam, laissez le toujours en deuxième position.</dd>
+	<dd>Actif : Cocher ou décocher la case pour activer ou désactiver le filtre.</dd>
+	<dd>Auto suppr. : Si la case est cochée, les commentaires considérés comme indésirables par le filtre seront automatiquement et définitivement supprimés sans possibilité de repêcher les faux positifs.</dd>
+	<dd>Configuration du filtre : Certains filtres peuvent et même doivent, dans certains cas, être configuré pour être efficace. Cliquer sur l'icône pour accéder à la page de configuration du filtre.</dd> 
+</dl>	
+	</body>
+
 </html>
Index: plugins/antispam/locales/fr/help/ip.html
===================================================================
--- plugins/antispam/locales/fr/help/ip.html	(revision 2322)
+++ plugins/antispam/locales/fr/help/ip.html	(revision 2458)
@@ -8,4 +8,16 @@
 <h4>IP Filter</h4>
 
+<p>Ce filtre permet d'ajouter manuellement des adresses IP en liste noire ou en liste blanche. Un commentaire venant d'un adresse IP en liste noire sera immédiatement classé comme indésirable, inversement, s'il vient d'une adresse IP en liste blanche, il sera considéré comme sûr et stoppera l'action des autres filtres.</p>
+
+<p>Pour ajouter une adresse IP, choisissez d'abord un onglet "Liste noire" ou "Liste blanche" et ajoutez l'adresse. La case à cocher "IP globale" est disponible si vous êtes super administrateur et permet d'ajouter une adresse pour tous les blogs de votre installation.</p>
+
+<p>Vous pouvez ajouter des adresses IP avec masque de réseau pour bloquer ou autoriser toute une série d'adresses. Par exemple :<p>
+<ul>
+    <li>127.0.0.0/255.0.0.0 ou la forme abrégée 127/8 reconnaitra toutes les adresses IP de type 127.xxx.xxx.xxx</li>
+    <li>127.0.0.0/255.255.0.0 ou la forme abrégée 127.0/16 reconnaitra toutes les adresses IP de type 127.0.xxx.xxx</li>
+    <li>127.0.0.0/255.255.255.0 ou la forme abrégée 127.0.0/24 reconnaitra toutes les adresses IP de type 127.0.0.xxx</li>
+</ul>
+
+
 </body>
 </html>
Index: plugins/antispam/locales/fr/help/iplookup.html
===================================================================
--- plugins/antispam/locales/fr/help/iplookup.html	(revision 2322)
+++ plugins/antispam/locales/fr/help/iplookup.html	(revision 2472)
@@ -7,4 +7,7 @@
 
 <h4>IP Lookup Filter</h4>
+<p>IP Lookup est un filtre qui vérifie l'adresse IP de l'auteur du scommentaire sur des listes partagées appelées DNSBL (ou RBL). Par défaut le filtre utilise les serveurs sbl-xbl.spamhaus.org et bsb.spamlookup.net. Retrouvez <a href="http://www.moensted.dk/spam/">une liste de serveurs sur cette page.</a></p>
+
+<p>Vous pouvez ajouter autant de serveurs que vous le souhaitez en les séparant par des virgules. N'oubliez pas de cliquer sur Enregistrer pour sauvegarder vos modifications.</p>
 
 </body>
Index: plugins/antispam/locales/fr/help/words.html
===================================================================
--- plugins/antispam/locales/fr/help/words.html	(revision 2322)
+++ plugins/antispam/locales/fr/help/words.html	(revision 2472)
@@ -1,11 +1,22 @@
 <html>
 <head>
-  <title>Words Filter</title>
+  <title>Bad Words</title>
 </head>
 
 <body>
 
-<h4>Words Filter</h4>
+<h4>Bad Words</h4>
 
+<p>Ce filtre permet de filtrer les commentaires sur la présence de mots dans le nom, l'adresse email, l'adresse du site de l'auteur et le contenu du commentaire.</p>
+
+<dl>
+<dt>Ajouter un mot</dt>
+	<dd>Comme pour le filtrage d'adresses IP, ajoutez simplement le mot que vous souhaitez bloquer dans la liste. De la même manière, vous pouvez, si vous avez les permissions suffisantes, définir des mots globaux qui activeront le filtrage pour tous les blogs de votre installation.</dd> 
+	<dd>Astuce : Vous pouvez ajouter une expression rationnelle à votre liste de mots en faisant commencer et finir votre mot par "/". Par exemple "/foo/" filtrera tous les mots contenant "foo".</dd>
+<dt>Liste de mots interdits</dt>
+	<dd>Liste des mots qui font que le commentaire est considéré comme un indésirable.</dd>
+	<dd>Sélectionner le(s) mot(s) pour le supprimer de la liste.</dd>
+<dt>Créer une liste de mots par défaut</dt>  
+</dl>
 </body>
 </html>
Index: plugins/attachments/_admin.php
===================================================================
--- plugins/attachments/_admin.php	(revision 1620)
+++ plugins/attachments/_admin.php	(revision 2360)
@@ -12,13 +12,28 @@
 if (!defined('DC_CONTEXT_ADMIN')) { return; }
 
-$core->addBehavior ('adminPostFormItems',array('attachmentAdmin','adminPostFormItems'));
-$core->addBehavior ('adminPostAfterForm',array('attachmentAdmin','adminPostAfterForm'));
+$core->addBehavior('adminPostFormItems',array('attachmentAdmin','adminPostFormItems'));
+$core->addBehavior('adminPostAfterForm',array('attachmentAdmin','adminPostAfterForm'));
 $core->addBehavior('adminPostHeaders',array('attachmentAdmin','postHeaders'));
-$core->addBehavior ('adminPageFormItems',array('attachmentAdmin','adminPostFormItems'));
-$core->addBehavior ('adminPageAfterForm',array('attachmentAdmin','adminPostAfterForm'));
+$core->addBehavior('adminPageFormItems',array('attachmentAdmin','adminPostFormItems'));
+$core->addBehavior('adminPageAfterForm',array('attachmentAdmin','adminPostAfterForm'));
 $core->addBehavior('adminPageHeaders',array('attachmentAdmin','postHeaders'));
+$core->addBehavior('adminPageHelpBlock',array('attachmentAdmin','adminPageHelpBlock'));
 
 class attachmentAdmin
 {
+	public static function adminPageHelpBlock($blocks)
+	{
+		$found = false;
+		foreach($blocks as $block) {
+			if ($block == 'core_post') {
+				$found = true;
+				break;
+			}
+		}
+		if (!$found) {
+			return null;
+		}
+		$blocks[] = 'attachments';
+	}
 	public static function postHeaders()
 	{
@@ -54,5 +69,5 @@
 				'<li class="media-action"><a class="attachment-remove" id="attachment-'.$f->media_id.'" '.
 				'href="post_media.php?post_id='.$post->post_id.'&amp;media_id='.$f->media_id.'&amp;remove=1">'.
-				'<img src="images/check-off.png" alt="'.__('remove').'" /></a>'.
+				'<img src="images/trash.png" alt="'.__('remove').'" /></a>'.
 				'</li>'.
 				
Index: plugins/attachments/locales/en/help/help.html
===================================================================
--- plugins/attachments/locales/en/help/help.html	(revision 2359)
+++ plugins/attachments/locales/en/help/help.html	(revision 2359)
@@ -0,0 +1,11 @@
+<html>
+<head>
+  <title>Attachements</title>
+</head>
+
+<body>
+
+<h4>Attachements</h4>
+
+</body>
+</html>
Index: plugins/attachments/locales/en/resources.php
===================================================================
--- plugins/attachments/locales/en/resources.php	(revision 2359)
+++ plugins/attachments/locales/en/resources.php	(revision 2359)
@@ -0,0 +1,18 @@
+<?php
+# -- BEGIN LICENSE BLOCK ---------------------------------------
+#
+# This file is part of Dotclear 2.
+#
+# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Licensed under the GPL version 2.0 license.
+# See LICENSE file or
+# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+#
+# -- END LICENSE BLOCK -----------------------------------------
+
+if (!isset($__resources['help']['attachments']))
+{
+	$__resources['help']['attachments'] = dirname(__FILE__).'/help/help.html';
+}
+
+?>
Index: plugins/attachments/locales/fr/help/help.html
===================================================================
--- plugins/attachments/locales/fr/help/help.html	(revision 2442)
+++ plugins/attachments/locales/fr/help/help.html	(revision 2442)
@@ -0,0 +1,13 @@
+<html>
+<head>
+  <title>Annexes</title>
+</head>
+
+<body>
+
+<h4>Annexes</h4>
+<p>Cliquer sur <strong>Ajouter une annexe</strong> pour joindre au billet un fichier présent dans la médiathèque&nbsp;: le bouton conduit sur la page de la médiathèque dont on peut parcourir l'arborescence ; une fois parvenu au fichier désiré, cliquer sur le signe « + » <span class="hidden">(lien Attacher ce fichier au billet)</span>. On peut aussi le télécharger à cette occasion.</p>
+<p>Pour supprimer une annexe, cliquer sur l'icône de poubelle <span class="hidden">(lien Supprimer la pièce jointe)</span> placée en haut de la boîte de chaque annexe.</p>
+<p>Les fichiers ajoutés en annexe apparaîtront sur le blog à la suite du billet.</p>
+</body>
+</html>
Index: plugins/attachments/locales/fr/resources.php
===================================================================
--- plugins/attachments/locales/fr/resources.php	(revision 2359)
+++ plugins/attachments/locales/fr/resources.php	(revision 2359)
@@ -0,0 +1,18 @@
+<?php
+# -- BEGIN LICENSE BLOCK ---------------------------------------
+#
+# This file is part of Dotclear 2.
+#
+# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Licensed under the GPL version 2.0 license.
+# See LICENSE file or
+# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+#
+# -- END LICENSE BLOCK -----------------------------------------
+
+if (!isset($__resources['help']['attachments']))
+{
+	$__resources['help']['attachments'] = dirname(__FILE__).'/help/help.html';
+}
+
+?>
Index: plugins/blowupConfig/_admin.php
===================================================================
--- plugins/blowupConfig/_admin.php	(revision 1179)
+++ plugins/blowupConfig/_admin.php	(revision 2351)
@@ -21,5 +21,5 @@
 {
 	if ($id == 'default' && $core->auth->check('admin',$core->blog->id)) {
-		return '<p><a href="plugin.php?p=blowupConfig" class="button">'.__('Theme configuration').'</a></p>';
+		return '<p><a href="plugin.php?p=blowupConfig" class="button submit">'.__('Configure theme').'</a></p>';
 	}
 }
Index: plugins/blowupConfig/config.js
===================================================================
--- plugins/blowupConfig/config.js	(revision 2333)
+++ plugins/blowupConfig/config.js	(revision 2358)
@@ -144,4 +144,5 @@
 
 dotclear.blowup_styles = {
+	'Plumetis 2.6'			:'body_bg_c:"#F5F5F5"; body_bg_g:"solid"; body_txt_f:"ss1"; body_txt_s:"14px"; body_txt_c:"#333333"; body_line_height:"24px"; top_image:"plumetis"; blog_title_hide:"0"; blog_title_f:"ss1"; blog_title_s:"36px"; blog_title_c:"#333333"; blog_title_a:"left"; blog_title_p:"20:94"; body_link_c:"#000000"; body_link_f_c:"#D33800"; body_link_v_c:"#333333"; sidebar_position:""; sidebar_text_f:"ss1"; sidebar_text_s:"12px"; sidebar_text_c:""; sidebar_title_f:""; sidebar_title_s:"14px"; sidebar_title_c:"#666666"; sidebar_title2_f:""; sidebar_title2_s:"12px"; sidebar_title2_c:"#000000"; sidebar_line_c:"#A6D9DC"; sidebar_link_c:""; sidebar_link_f_c:"#D33800"; sidebar_link_v_c:""; date_title_f:""; date_title_s:"12px"; date_title_c:"#666666"; post_title_f:"ss1"; post_title_s:"24px"; post_title_c:"#D33800"; post_comment_bg_c:"#E2EDED"; post_comment_c:"#333333"; post_commentmy_bg_c:"#A6D9DC"; post_commentmy_c:"#000000"; prelude_c:"#A6D9DC"; footer_f:""; footer_s:"12px"; footer_c:"#FFFFFF"; footer_l_c:"#FFFFFF"; footer_bg_c:"#999999"; extra_css:"h1, .post-title {font-weight: normal;text-shadow: 1px 1px 0 #fff;}#footer {background-image: none}body {border-top: 72px solid #A6D9DC}#top {margin-top: -36px}.post a {border-bottom: 1px solid #999}.post-title a, .post-info-co a {border-bottom: none}a:hover {background-color: #eee;text-decoration:none;}"',
 	'Forest'			:'body_bg_c:"#80661A"; body_bg_g:"light"; body_txt_f:""; body_txt_s:""; body_txt_c:"#0A0A00"; body_line_height:"1.4em"; top_image:"default"; blog_title_hide:"0"; blog_title_f:"s3"; blog_title_s:"4em"; blog_title_c:"#D9D9BF"; blog_title_a:""; blog_title_p:""; body_link_c:"#666600"; body_link_f_c:"#CC9933"; body_link_v_c:"#8D8D40"; sidebar_position:""; sidebar_text_f:""; sidebar_text_s:""; sidebar_text_c:"#0A0A00"; sidebar_title_f:"s2"; sidebar_title_s:"1.6em"; sidebar_title_c:"#4D4D00"; sidebar_title2_f:"s2"; sidebar_title2_s:""; sidebar_title2_c:"#575700"; sidebar_line_c:"#D9D9BF"; sidebar_link_c:"#40330D"; sidebar_link_f_c:"#666600"; sidebar_link_v_c:"#40330D"; date_title_f:""; date_title_s:""; date_title_c:"#B3B380"; post_title_f:"s2"; post_title_s:"2em"; post_title_c:"#4D4D00"; post_comment_bg_c:"#F0F0E6"; post_comment_c:"#0A0A00"; prelude_c:"#140F05"; footer_f:""; footer_s:""; footer_c:"#FFFFFF"; footer_l_c:"#D9AD2B"; footer_bg_c:"#33260D"',
 	'Flamingo'		:'body_bg_c:"#CC9999"; body_bg_g:"light"; body_txt_f:"ss3"; body_txt_s:"1.2em"; body_txt_c:"#1A1A00"; body_line_height:"1.5em"; top_image:"flamingo"; blog_title_hide:"0"; blog_title_f:"ss1"; blog_title_s:"3.5em"; blog_title_c:"#FFFFFF"; blog_title_a:""; blog_title_p:""; body_link_c:"#AD8282"; body_link_f_c:"#8282D9"; body_link_v_c:"#997373"; sidebar_position:""; sidebar_text_f:""; sidebar_text_s:""; sidebar_text_c:""; sidebar_title_f:"ss4"; sidebar_title_s:"1.4em"; sidebar_title_c:"#8282D9"; sidebar_title2_f:"ss3"; sidebar_title2_s:"1.2em"; sidebar_title2_c:"#AD8282"; sidebar_line_c:"#CDCDFF"; sidebar_link_c:"#262640"; sidebar_link_f_c:"#AD8282"; sidebar_link_v_c:"#262640"; date_title_f:"ss4"; date_title_s:""; date_title_c:"#D9B3B3"; post_title_f:"ss4"; post_title_s:"1.8em"; post_title_c:"#8282D9"; post_comment_bg_c:"#F2E5E5"; post_comment_c:""; prelude_c:"#140F0F"; footer_f:""; footer_s:""; footer_c:"#FFFFFF"; footer_l_c:""; footer_bg_c:"#140F0F"',
@@ -149,5 +150,4 @@
 	'Night'			:'body_bg_c:"#0D1A26"; body_bg_g:"dark"; body_txt_f:"ss3"; body_txt_s:"1.1em"; body_txt_c:"#050A0F"; body_line_height:"1.5em"; top_image:"default"; blog_title_hide:"0"; blog_title_f:"s2"; blog_title_s:"3.5em"; blog_title_c:"#F2F2E5"; blog_title_a:""; body_link_c:"#336699"; body_link_f_c:"#66664D"; body_link_v_c:"#2B5782"; sidebar_position:""; sidebar_text_f:""; sidebar_text_s:""; sidebar_text_c:""; sidebar_title_f:"ss3"; sidebar_title_s:"1.4em"; sidebar_title_c:"#336699"; sidebar_title2_f:"ss3"; sidebar_title2_s:"1.2em"; sidebar_title2_c:"#737300"; sidebar_line_c:"#E6E6CD"; sidebar_link_c:"#66664D"; sidebar_link_f_c:"#336699"; sidebar_link_v_c:"#66664D"; date_title_f:""; date_title_s:""; date_title_c:"#ADAD82"; post_title_f:"s2"; post_title_s:"1.8em"; post_title_c:"#737300"; post_comment_bg_c:"#E6E6CD"; post_comment_c:""; prelude_c:"#070E14"; footer_f:""; footer_s:""; footer_c:"#FFFFFF"; footer_l_c:""; footer_bg_c:"#14140F"; blog_title_p:""',
 	'Peas & Carrots'	:'body_bg_c:"#9DCA25"; body_bg_g:"light"; body_txt_f:"ss1"; body_txt_s:"1.2em"; body_txt_c:"#383839"; body_line_height:"1.5em"; top_image:"butterflies"; blog_title_hide:"0"; blog_title_f:"ss4"; blog_title_s:"3em"; blog_title_c:"#DBDB9D"; blog_title_a:"left"; blog_title_p:""; body_link_c:"#646B10"; body_link_f_c:"#DF6C01"; body_link_v_c:"#919924"; sidebar_position:"left"; sidebar_text_f:""; sidebar_text_s:""; sidebar_text_c:""; sidebar_title_f:"ss4"; sidebar_title_s:""; sidebar_title_c:"#FE9017"; sidebar_title2_f:"s2"; sidebar_title2_s:"1.2em"; sidebar_title2_c:"#826228"; sidebar_line_c:"#D3EB8B"; sidebar_link_c:"#858547"; sidebar_link_f_c:"#FE9017"; sidebar_link_v_c:"#8F9645"; date_title_f:""; date_title_s:""; date_title_c:"#826228"; post_title_f:"ss4"; post_title_s:"1.8em"; post_title_c:"#806432"; post_comment_bg_c:"#EFFDCC"; post_comment_c:"#826228"; prelude_c:"#C8E186"; footer_f:""; footer_s:"1em"; footer_c:"#FFFFFF"; footer_l_c:"#FFFFFF"; footer_bg_c:"#484432"',
-	'Plumetis'			:'body_bg_c:"#F5F5F5"; body_bg_g:"solid"; body_txt_f:"ss1"; body_txt_s:"14px"; body_txt_c:"#333333"; body_line_height:"24px"; top_image:"plumetis"; blog_title_hide:"0"; blog_title_f:"ss1"; blog_title_s:"36px"; blog_title_c:"#333333"; blog_title_a:"left"; blog_title_p:"20:94"; body_link_c:"#000000"; body_link_f_c:"#D33800"; body_link_v_c:"#333333"; sidebar_position:""; sidebar_text_f:"ss1"; sidebar_text_s:"12px"; sidebar_text_c:""; sidebar_title_f:""; sidebar_title_s:"14px"; sidebar_title_c:"#666666"; sidebar_title2_f:""; sidebar_title2_s:"12px"; sidebar_title2_c:"#000000"; sidebar_line_c:"#A6D9DC"; sidebar_link_c:""; sidebar_link_f_c:"#D33800"; sidebar_link_v_c:""; date_title_f:""; date_title_s:"12px"; date_title_c:"#666666"; post_title_f:"ss1"; post_title_s:"24px"; post_title_c:"#D33800"; post_comment_bg_c:"#E2EDED"; post_comment_c:"#333333"; post_commentmy_bg_c:"#A6D9DC"; post_commentmy_c:"#000000"; prelude_c:"#A6D9DC"; footer_f:""; footer_s:"12px"; footer_c:"#FFFFFF"; footer_l_c:"#FFFFFF"; footer_bg_c:"#999999"; extra_css:"h1, .post-title {font-weight: normal;text-shadow: 1px 1px 0 #fff;}#footer {background-image: none}body {border-top: 72px solid #A6D9DC}#top {margin-top: -36px}.post a {border-bottom: 1px solid #999}.post-title a, .post-info-co a {border-bottom: none}a:hover {background-color: #eee;text-decoration:none;}"',
 	'Rabbit'			:'body_bg_c:"#8F9645"; body_bg_g:"solid"; body_txt_f:"ss1"; body_txt_s:"1.2em"; body_txt_c:"#625D47"; body_line_height:"1.4em"; top_image:"rabbit"; blog_title_hide:"0"; blog_title_f:"ss1"; blog_title_s:"3.5em"; blog_title_c:"#DBDB9D"; blog_title_a:""; blog_title_p:"130:70"; body_link_c:"#646B10"; body_link_f_c:"#484C12"; body_link_v_c:"#919924"; sidebar_position:""; sidebar_text_f:""; sidebar_text_s:""; sidebar_text_c:"#858547"; sidebar_title_f:""; sidebar_title_s:""; sidebar_title_c:"#8F9645"; sidebar_title2_f:"s2"; sidebar_title2_s:""; sidebar_title2_c:"#826228"; sidebar_line_c:"#95956B"; sidebar_link_c:"#858547"; sidebar_link_f_c:"#826228"; sidebar_link_v_c:"#8F9645"; date_title_f:"s2"; date_title_s:"1em"; date_title_c:"#826228"; post_title_f:"s2"; post_title_s:"1.6em"; post_title_c:"#806432"; post_comment_bg_c:"#D6DE91"; post_comment_c:"#826228"; prelude_c:"#484432"; footer_f:""; footer_s:"1em"; footer_c:"#A6AF50"; footer_l_c:"#DBDB9D"; footer_bg_c:"#484432"',
 	'Rec Room'		:'body_bg_c:"#9B5E1C"; body_bg_g:"dark"; body_txt_f:"ss3"; body_txt_s:"1.1em"; body_txt_c:"#757575"; body_line_height:"1.5em"; top_image:"default"; blog_title_hide:"0"; blog_title_f:"s2"; blog_title_s:"3em"; blog_title_c:"#F9FAD6"; blog_title_a:""; blog_title_p:""; body_link_c:"#D1BF1D"; body_link_f_c:"#EEE168"; body_link_v_c:"#D1BF1D"; sidebar_position:"left"; sidebar_text_f:""; sidebar_text_s:""; sidebar_text_c:""; sidebar_title_f:"ss3"; sidebar_title_s:"1.2em"; sidebar_title_c:"#689B9C"; sidebar_title2_f:"ss3"; sidebar_title2_s:"1.2em"; sidebar_title2_c:"#737300"; sidebar_line_c:"#E6E6CD"; sidebar_link_c:"#66664D"; sidebar_link_f_c:"#689B9C"; sidebar_link_v_c:"#66664D"; date_title_f:""; date_title_s:""; date_title_c:"#000000"; post_title_f:"s2"; post_title_s:"1.8em"; post_title_c:"#689B9C"; post_comment_bg_c:"#E4E4E2"; post_comment_c:""; prelude_c:"#3B2C16"; footer_f:""; footer_s:""; footer_c:"#FFFFFF"; footer_l_c:""; footer_bg_c:"#3B2C16"',
Index: plugins/blowupConfig/help.html
===================================================================
--- plugins/blowupConfig/help.html	(revision 1956)
+++ 	(revision )
@@ -1,55 +1,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<html>
-<head>
-  <title>Blowup theme configuration</title>
-</head>
-
-<body>
-<p>Modifying Blowup theme configuration allows you to customize your theme very easily. To do so, simply fill in the configuration fields or choose a predefined style.</p>
-
-<h4>Colors</h4>
-
-<p>When you have to enter a color value, you should use the hexadecimal format. For example: "#FF0000" will give you red. You may also use the color picker located next to every color field.</p>
-<p>If you lack inspiration, try and visit the following pages:</p>
-<ul>
- <li><a href="http://en.wikipedia.org/wiki/List_of_colors">Color code list</a> (Wikipedia)</li>
- <li><a href="http://kuler.adobe.com/">Adobe Kuler</a></li>
- <li><a href="http://colorblender.com/">ColorBlender</a></li>
- <li><a href="http://www.colorcombos.com/">ColorCombos</a></li>
-</ul>
-
-<h4>Measurement units</h4>
-
-<p>When you have to indicate a size, it must be followed by a measurement unit. For example: "1em". If you do not include the unit, pixels will be used as default measurement unit.</p>
-<p>The following measurement units are available:</p>
-<ul>
-  <li>px</li>
-  <li>em</li>
-  <li>ex</li>
-  <li>pt</li>
-  <li>%</li>
-</ul>
-
-<h4>Header images</h4>
-
-<p>You can choose a header image among the list to use in place of the default one.</p>
-
-<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong>
-
-<p>If you upload a JPG image, a border will be added to the image, which is not the case with PNG images (the transparency of which will also be kept).</p>
-
-<h4>Predefined styles</h4>
-
-<p>You can choose a predefined style in the "Predefinite styles" drop-down list.
-Once you have chosen the style, you have to submit the form to apply the modifications.</p>
-
-<p>You may then modify the predefined style according to your taste and needs.</p>
-
-<h4>Configuration import / export</h4>
-
-<p>At the end of Blowup options, you can display an area names "Configuration import/export". This text area contains the configuration you are currently using. You can copy it to share it with others.</p>
-
-<p>To apply (import) a configuration, you simply need to replace the content of the text area with the configuration you want to use. Don't forget to click on "apply code".</p>
-
-</body>
-</html>
Index: plugins/blowupConfig/index.php
===================================================================
--- plugins/blowupConfig/index.php	(revision 2335)
+++ plugins/blowupConfig/index.php	(revision 2442)
@@ -316,5 +316,5 @@
 
 	echo
-	'<h5 class="pretty-title">'.__('Top image').'</h4>'.
+	'<h5 class="pretty-title">'.__('Top image').'</h5>'.
 	'<p class="field"><label for="top_image">'.__('Top image').'</label> '.
 	form::combo('top_image',$top_images,($blowup_user['top_image'] ? $blowup_user['top_image'] : 'default')).'</p>'.
Index: plugins/blowupConfig/locales/en/help/help.html
===================================================================
--- plugins/blowupConfig/locales/en/help/help.html	(revision 2368)
+++ plugins/blowupConfig/locales/en/help/help.html	(revision 2368)
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<html>
+<head>
+  <title>Blowup theme configuration</title>
+</head>
+
+<body>
+<p>Modifying Blowup theme configuration allows you to customize your theme very easily. To do so, simply fill in the configuration fields or choose a predefined style.</p>
+
+<h4>Colors</h4>
+
+<p>When you have to enter a color value, you should use the hexadecimal format. For example: "#FF0000" will give you red. You may also use the color picker located next to every color field.</p>
+<p>If you lack inspiration, try and visit the following pages:</p>
+<ul>
+ <li><a href="http://en.wikipedia.org/wiki/List_of_colors">Color code list</a> (Wikipedia)</li>
+ <li><a href="http://kuler.adobe.com/">Adobe Kuler</a></li>
+ <li><a href="http://colorblender.com/">ColorBlender</a></li>
+ <li><a href="http://www.colorcombos.com/">ColorCombos</a></li>
+</ul>
+
+<h4>Measurement units</h4>
+
+<p>When you have to indicate a size, it must be followed by a measurement unit. For example: "1em". If you do not include the unit, pixels will be used as default measurement unit.</p>
+<p>The following measurement units are available:</p>
+<ul>
+  <li>px</li>
+  <li>em</li>
+  <li>ex</li>
+  <li>pt</li>
+  <li>%</li>
+</ul>
+
+<h4>Header images</h4>
+
+<p>You can choose a header image among the list to use in place of the default one.</p>
+
+<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong>
+
+<p>If you upload a JPG image, a border will be added to the image, which is not the case with PNG images (the transparency of which will also be kept).</p>
+
+<h4>Predefined styles</h4>
+
+<p>You can choose a predefined style in the "Predefinite styles" drop-down list.
+Once you have chosen the style, you have to submit the form to apply the modifications.</p>
+
+<p>You may then modify the predefined style according to your taste and needs.</p>
+
+<h4>Configuration import / export</h4>
+
+<p>At the end of Blowup options, you can display an area names "Configuration import/export". This text area contains the configuration you are currently using. You can copy it to share it with others.</p>
+
+<p>To apply (import) a configuration, you simply need to replace the content of the text area with the configuration you want to use. Don't forget to click on "apply code".</p>
+
+</body>
+</html>
Index: plugins/blowupConfig/locales/en/resources.php
===================================================================
--- plugins/blowupConfig/locales/en/resources.php	(revision 2368)
+++ plugins/blowupConfig/locales/en/resources.php	(revision 2368)
@@ -0,0 +1,16 @@
+<?php
+# -- BEGIN LICENSE BLOCK ---------------------------------------
+#
+# This file is part of Dotclear 2.
+#
+# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Licensed under the GPL version 2.0 license.
+# See LICENSE file or
+# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+#
+# -- END LICENSE BLOCK -----------------------------------------
+
+if (!isset($__resources['help']['blowupConfig']))
+{
+	$__resources['help']['blowupConfig'] = dirname(__FILE__).'/help/help.html';
+}
Index: plugins/blowupConfig/locales/fr/help/help.html
===================================================================
--- plugins/blowupConfig/locales/fr/help/help.html	(revision 2441)
+++ plugins/blowupConfig/locales/fr/help/help.html	(revision 2441)
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<html>
+<head>
+  <title>Configuration du thème Blowup</title>
+</head>
+
+<body>
+<p>En modifiant la configuration du thème Blowup, vous pouvez personnaliser votre thème très facilement : il suffit pour cela de renseigner les champs de configuration ou de choisir un style prédéfini.</p>
+
+<h4>Couleurs</h4>
+
+<p>Quand vous devez indiquer une valeur de couleur, celle-ci doit être au format hexadécimal (exemple:"#FF0000" donnera du rouge). Vous pouvez vous aider de la pipette à côté de chaque champ de couleur.</p>
+<p>Afin de vous aider, vous pouvez consulter les liens suivants&nbsp;:</p>
+<ul>
+ <li><a href="http://fr.wikipedia.org/wiki/Liste_De_Couleurs">La liste des codes</a> (Wikipedia),</li>
+ <li><a href="http://kuler.adobe.com/">Adobe Kuler</a>,</li>
+ <li><a href="http://colorblender.com/">ColorBlender</a>,</li>
+ <li><a href="http://www.colorcombos.com/">ColorCombos</a>.</li>
+</ul>
+
+<h4>Unités de mesure</h4>
+
+<p>Quand vous devez indiquer une taille, celle-ci doit être suivie d'une unité
+de mesure. Si elle n'est pas suivie d'une unité, celle-ci sera indiquée en pixel. Les autres unités possibles sont : em, ex, pt, %.</p>
+
+<h4>Images d'en-tête</h4>
+
+<p>Vous pouvez choisir une image d'en-tête parmi la liste proposée
+afin de remplacer celle utilisée par défaut.</p>
+
+<p>En choisissant "Personnalisé..." parmi la liste d'images, vous pourrez
+déposer votre propre image. Celle-ci doit être au format JPG ou PNG et
+avoir une largeur exacte de 800 pixels.</p>
+
+<p>Si vous déposez une image au format JPG, un cadre sera ajouté autours de
+l'image, ce qui n'est pas le cas avec une image au format PNG (dont la
+transparence sera également préservée).</p>
+
+<h4>Styles prédéfinis</h4>
+
+<p>Vous pouvez choisir un style prédéfini dans la liste d'option "Styles prédéfinis".
+Une fois le style choisi, vous devez valider le formulaire pour appliquer les
+changements mais vous en servir de base pour personnaliser.</p>
+
+<h3>Import / export de configuration</h3>
+
+<p>En fin de page, vous pouvez afficher une zone appelée "Import
+/ export de configuration". Dans cette zone de texte se trouve la configuration
+en cours d'utilisation. Vous pouvez la copier pour l'utiliser dans un autre blog sans avoir à faire de nouveau les réglages.</p>
+
+<p>Pour appliquer (importer) une configuration, il suffit simplement de remplacer
+le contenu de la zone de texte par celui que vous voulez utiliser et de veiller à bien cliquer sur le lien "Appliquer le code".</p>
+
+</body>
+</html>
Index: plugins/blowupConfig/locales/fr/resources.php
===================================================================
--- plugins/blowupConfig/locales/fr/resources.php	(revision 2368)
+++ plugins/blowupConfig/locales/fr/resources.php	(revision 2368)
@@ -0,0 +1,16 @@
+<?php
+# -- BEGIN LICENSE BLOCK ---------------------------------------
+#
+# This file is part of Dotclear 2.
+#
+# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Licensed under the GPL version 2.0 license.
+# See LICENSE file or
+# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+#
+# -- END LICENSE BLOCK -----------------------------------------
+
+if (!isset($__resources['help']['blowupConfig']))
+{
+	$__resources['help']['blowupConfig'] = dirname(__FILE__).'/help/help.html';
+}
Index: plugins/buildtools/class.dc.maintenance.buildtools.php
===================================================================
--- plugins/buildtools/class.dc.maintenance.buildtools.php	(revision 2286)
+++ plugins/buildtools/class.dc.maintenance.buildtools.php	(revision 2355)
@@ -55,9 +55,11 @@
 			$main .= $this->fake_l10n($v['label']);
 		}
-		$ws = $this->core->auth->user_prefs->favorites;
-		$main .= "\n# Favorites \n\n";
-		foreach ($ws->dumpPrefs() as $k => $v) {
-			$fav = unserialize($v['value']);
-			$main .= $this->fake_l10n($fav['title']);
+		$ws = $this->core->auth->user_prefs->favorites;	// Favs old school !
+		if ($ws) {
+			$main .= "\n# Favorites \n\n";
+			foreach ($ws->dumpPrefs() as $k => $v) {
+				$fav = unserialize($v['value']);
+				$main .= $this->fake_l10n($fav['title']);
+			}
 		}
 		file_put_contents(dirname($__autoload['dcCore']).'/_fake_l10n.php', $main);
Index: plugins/importExport/inc/class.dc.import.flat.php
===================================================================
--- plugins/importExport/inc/class.dc.import.flat.php	(revision 1559)
+++ plugins/importExport/inc/class.dc.import.flat.php	(revision 2485)
@@ -15,5 +15,5 @@
 {
 	protected $status = false;
-	
+
 	public function setInfo()
 	{
@@ -22,5 +22,5 @@
 		$this->description = __('Imports a blog or a full Dotclear installation from flat file.');
 	}
-	
+
 	public function process($do)
 	{
@@ -29,7 +29,7 @@
 			return;
 		}
-		
+
 		$to_unlink = false;
-		
+
 		# Single blog import
 		$files = $this->getPublicFiles();
@@ -40,5 +40,5 @@
 			$single_upl = true;
 		}
-		
+
 		if ($single_upl !== null)
 		{
@@ -53,5 +53,5 @@
 				$file = $_POST['public_single_file'];
 			}
-			
+
 			try {
 				# Try to unzip file
@@ -64,5 +64,5 @@
 					$bk = new flatImport($this->core,$file);
 				}
-				
+
 				$bk->importSingle();
 			} catch (Exception $e) {
@@ -79,5 +79,5 @@
 			http::redirect($this->getURL().'&do=single');
 		}
-		
+
 		# Full import
 		$full_upl = null;
@@ -87,5 +87,5 @@
 			$full_upl = true;
 		}
-		
+
 		if ($full_upl !== null && $this->core->auth->isSuperAdmin())
 		{
@@ -93,5 +93,5 @@
 				throw new Exception(__('Password verification failed'));
 			}
-			
+
 			if ($full_upl) {
 				files::uploadStatus($_FILES['up_full_file']);
@@ -104,5 +104,5 @@
 				$file = $_POST['public_full_file'];
 			}
-			
+
 			try {
 				# Try to unzip file
@@ -115,5 +115,5 @@
 					$bk = new flatImport($this->core,$file);
 				}
-				
+
 				$bk->importFull();
 			} catch (Exception $e) {
@@ -130,12 +130,12 @@
 			http::redirect($this->getURL().'&do=full');
 		}
-		
+
 		header('content-type:text/plain');
 		var_dump($_POST);
 		exit;
-		
+
 		$this->status = true;
 	}
-	
+
 	public function gui()
 	{
@@ -150,8 +150,8 @@
 			return;
 		}
-		
+
 		$public_files = array_merge(array('-' => ''),$this->getPublicFiles());
 		$has_files = (boolean) (count($public_files) - 1);
-		
+
 		echo
 		'<script type="text/javascript">'."\n".
@@ -178,23 +178,23 @@
 		"//]]>\n".
 		"</script>\n";
-		
+
 		echo
 		'<form action="'.$this->getURL(true).'" method="post" enctype="multipart/form-data" class="fieldset">'.
 		'<h3>'.__('Single blog').'</h3>'.
 		'<p>'.sprintf(__('This will import a single blog backup as new content in the current blog: <strong>%s</strong>.'),html::escapeHTML($this->core->blog->name)).'</p>'.
-		
+
 		'<p><label for="up_single_file">'.__('Upload a backup file').
 		' ('.sprintf(__('maximum size %s'),files::size(DC_MAX_UPLOAD_SIZE)).')'.' </label>'.
 		' <input type="file" id="up_single_file" name="up_single_file" size="20" />'.
 		'</p>';
-		
+
 		if ($has_files) {
-			echo 
+			echo
 			'<p><label for="public_single_file" class="">'.__('or pick up a local file in your public directory').' </label> '.
 			form::combo('public_single_file',$public_files).
 			'</p>';
 		}
-		
-		echo 
+
+		echo
 		'<p>'.
 		$this->core->formNonce().
@@ -202,7 +202,7 @@
 		form::hidden(array('MAX_FILE_SIZE'),DC_MAX_UPLOAD_SIZE).
 		'<input type="submit" value="'.__('Import').'" /></p>'.
-		
+
 		'</form>';
-		
+
 		if ($this->core->auth->isSuperAdmin())
 		{
@@ -211,21 +211,21 @@
 			'<h3>'.__('Multiple blogs').'</h3>'.
 			'<p class="warning">'.__('This will reset all the content of your database, except users.').'</p>'.
-			
+
 			'<p><label for="up_full_file">'.__('Upload a backup file').' '.
 			' ('.sprintf(__('maximum size %s'),files::size(DC_MAX_UPLOAD_SIZE)).')'.' </label>'.
 			'<input type="file" id="up_full_file" name="up_full_file" size="20" />'.
 			'</p>';
-			
+
 			if ($has_files) {
-				echo 
+				echo
 				'<p><label for="public_full_file">'.__('or pick up a local file in your public directory').' </label>'.
 				form::combo('public_full_file',$public_files).
 				'</p>';
 			}
-			
+
 			echo
 			'<p><label for="your_pwd" class="required"><abbr title="'.__('Required field').'">*</abbr> '.__('Your password:').'</label>'.
 			form::password('your_pwd',20,255).'</p>'.
-			
+
 			'<p>'.
 			$this->core->formNonce().
@@ -233,9 +233,9 @@
 			form::hidden(array('MAX_FILE_SIZE'),DC_MAX_UPLOAD_SIZE).
 			'<input type="submit" value="'.__('Import').'" /></p>'.
-			
+
 			'</form>';
 		}
 	}
-	
+
 	protected function getPublicFiles()
 	{
@@ -246,5 +246,5 @@
 			while (($entry = $dir->read()) !== false) {
 				$entry_path = $dir->path.'/'.$entry;
-				
+
 				if (is_file($entry_path) && is_readable($entry_path))
 				{
@@ -261,25 +261,25 @@
 		return $public_files;
 	}
-	
+
 	protected static function checkFileContent($entry_path)
 	{
 		$ret = false;
-		
+
 		$fp = fopen($entry_path,'rb');
 		$ret = strpos(fgets($fp),'///DOTCLEAR|') === 0;
 		fclose($fp);
-		
+
 		return $ret;
 	}
-	
+
 	private function unzip($file)
 	{
 		$zip = new fileUnzip($file);
-		
+
 		if ($zip->isEmpty()) {
 			$zip->close();
 			return false;//throw new Exception(__('File is empty or not a compressed file.'));
 		}
-		
+
 		foreach($zip->getFilesList() as $zip_file)
 		{
@@ -288,5 +288,5 @@
 				continue;
 			}
-			
+
 			# Check zipped file contents
 			$content = $zip->unzip($zip_file);
@@ -295,7 +295,7 @@
 				continue;
 			}
-			
+
 			$target = path::fullFromRoot($zip_file,dirname($file));
-			
+
 			# Check existing files with same name
 			if (file_exists($target)) {
@@ -304,5 +304,5 @@
 				throw new Exception(__('Another file with same name exists.'));
 			}
-			
+
 			# Extract backup content
 			if (file_put_contents($target,$content) === false) {
@@ -311,15 +311,14 @@
 				throw new Exception(__('Failed to extract backup file.'));
 			}
-			
+
 			$zip->close();
 			unset($content);
-			
+
 			# Return extracted file name
 			return $target;
 		}
-		
+
 		$zip->close();
 		throw new Exception(__('No backup in compressed file.'));
 	}
 }
-?>
Index: plugins/importExport/inc/flat/class.flat.import.php
===================================================================
--- plugins/importExport/inc/flat/class.flat.import.php	(revision 1743)
+++ plugins/importExport/inc/flat/class.flat.import.php	(revision 2485)
@@ -17,15 +17,15 @@
 	private $con;
 	private $prefix;
-	
+
 	private $dc_version;
 	private $dc_major;
 	private $mode;
-	
+
 	private $blog_url;
 	private $blog_name;
 	private $blog_desc;
-	
+
 	private $users = array();
-	
+
 	public $old_ids = array(
 		'category' => array(),
@@ -33,5 +33,5 @@
 		'media' => array()
 	);
-	
+
 	public $stack = array(
 		'categories'=>null,
@@ -41,31 +41,32 @@
 		'media_id'=>1,
 		'comment_id'=>1,
-		'link_id'=>1
+		'link_id'=>1,
+		'log_id' => 1
 	);
-	
+
 	public $has_categories = false;
-	
+
 	public function __construct($core,$file)
 	{
 		parent::__construct($file);
-		
+
 		$first_line = fgets($this->fp);
 		if (strpos($first_line,'///DOTCLEAR|') !== 0) {
 			throw new Exception(__('File is not a DotClear backup.'));
 		}
-		
+
 		@set_time_limit(300);
-		
+
 		$l = explode('|',$first_line);
-		
+
 		if (isset($l[1])) {
 			$this->dc_version = $l[1];
 		}
-		
+
 		$this->mode = isset($l[2]) ? strtolower(trim($l[2])) : 'single';
 		if ($this->mode != 'full' && $this->mode != 'single') {
 			$this->mode = 'single';
 		}
-		
+
 		if (version_compare('1.2',$this->dc_version,'<=') &&
 		version_compare('1.3',$this->dc_version,'>')) {
@@ -74,9 +75,9 @@
 			$this->dc_major_version = '2.0';
 		}
-		
+
 		$this->core =& $core;
 		$this->con =& $core->con;
 		$this->prefix = $core->prefix;
-		
+
 		$this->cur_blog        = $this->con->openCursor($this->prefix.'blog');
 		$this->cur_category    = $this->con->openCursor($this->prefix.'category');
@@ -95,9 +96,9 @@
 		$this->cur_spamrule    = $this->con->openCursor($this->prefix.'spamrule');
 		$this->cur_version     = $this->con->openCursor($this->prefix.'version');
-		
+
 		# --BEHAVIOR-- importInit
 		$this->core->callBehavior('importInit',$this,$this->core);
 	}
-	
+
 	public function importSingle()
 	{
@@ -105,11 +106,11 @@
 			throw new Exception(__('File is not a single blog export.'));
 		}
-		
+
 		if (!$this->core->auth->check('admin',$this->core->blog->id)) {
 			throw new Exception(__('Permission denied.'));
 		}
-		
+
 		$this->blog_id = $this->core->blog->id;
-		
+
 		$this->stack['categories'] = $this->con->select(
 			'SELECT cat_id, cat_title, cat_url '.
@@ -117,37 +118,40 @@
 			"WHERE blog_id = '".$this->con->escape($this->blog_id)."' "
 		);
-		
+
 		$rs = $this->con->select('SELECT MAX(cat_id) FROM '.$this->prefix.'category');
 		$this->stack['cat_id'] = ((integer) $rs->f(0))+1;
-		
+
 		$rs = $this->con->select('SELECT MAX(link_id) FROM '.$this->prefix.'link');
 		$this->stack['link_id'] = ((integer) $rs->f(0))+1;
-		
+
 		$rs = $this->con->select('SELECT MAX(post_id) FROM '.$this->prefix.'post');
 		$this->stack['post_id'] = ((integer) $rs->f(0))+1;
-		
+
 		$rs = $this->con->select('SELECT MAX(media_id) FROM '.$this->prefix.'media');
 		$this->stack['media_id'] = ((integer) $rs->f(0))+1;
-		
+
 		$rs = $this->con->select('SELECT MAX(comment_id) FROM '.$this->prefix.'comment');
 		$this->stack['comment_id'] = ((integer) $rs->f(0))+1;
-		
+
+		$rs = $this->con->select('SELECT MAX(log_id) FROM '.$this->prefix.'log');
+		$this->stack['log_id'] = ((integer) $rs->f(0))+1;
+
 		$rs = $this->con->select(
 			'SELECT MAX(cat_rgt) AS cat_rgt FROM '.$this->prefix.'category '.
 			"WHERE blog_id = '".$this->con->escape($this->core->blog->id)."'"
 		);
-		
+
 		if ((integer) $rs->cat_rgt > 0) {
 			$this->has_categories = true;
 			$this->stack['cat_lft'][$this->core->blog->id] = (integer) $rs->cat_rgt + 1;
 		}
-		
+
 		$this->con->begin();
-		
+
 		try
 		{
 			$last_line_name = '';
 			$constrained = array('post', 'meta', 'post_media', 'ping', 'comment');
-			
+
 			while (($line = $this->getLine()) !== false)
 			{
@@ -156,5 +160,5 @@
 					$this->prepareDC12line($line);
 				}
-				
+
 				if ($last_line_name != $line->__name) {
 					if (in_array($last_line_name,$constrained)) {
@@ -163,5 +167,5 @@
 						if ($this->con->driver() == 'pgsql') $this->con->execute('SET CONSTRAINTS ALL DEFERRED');
 					}
-					
+
 					if (in_array($line->__name,$constrained)) {
 						# DEFER
@@ -169,8 +173,8 @@
 						if ($this->con->driver() == 'pgsql') $this->con->execute('SET CONSTRAINTS ALL IMMEDIATE');
 					}
-					
+
 					$last_line_name = $line->__name;
 				}
-				
+
 				switch ($line->__name)
 				{
@@ -200,9 +204,9 @@
 						break;
 				}
-				
+
 				# --BEHAVIOR-- importSingle
 				$this->core->callBehavior('importSingle',$line,$this,$this->core);
 			}
-			
+
 			if ($this->con->driver() == 'mysql' || $this->con->driver() == 'mysqli') $this->con->execute('SET foreign_key_checks = 1');
 			if ($this->con->driver() == 'pgsql') $this->con->execute('SET CONSTRAINTS ALL DEFERRED');
@@ -210,11 +214,12 @@
 		catch (Exception $e)
 		{
+			@fclose($this->fp);
 			$this->con->rollback();
-			throw $e;
-		}
-		
+			throw new Exception($e->getMessage().' - '.sprintf(__('Error raised at line %s'),$line->__line));
+		}
+		@fclose($this->fp);
 		$this->con->commit();
 	}
-	
+
 	public function importFull()
 	{
@@ -222,9 +227,9 @@
 			throw new Exception(__('File is not a full export.'));
 		}
-		
+
 		if (!$this->core->auth->isSuperAdmin()) {
 			throw new Exception(__('Permission denied.'));
 		}
-		
+
 		$this->con->begin();
 		$this->con->execute('DELETE FROM '.$this->prefix.'blog');
@@ -232,5 +237,6 @@
 		$this->con->execute('DELETE FROM '.$this->prefix.'spamrule');
 		$this->con->execute('DELETE FROM '.$this->prefix.'setting');
-		
+		$this->con->execute('DELETE FROM '.$this->prefix.'log');
+
 		try
 		{
@@ -291,15 +297,16 @@
 		catch (Exception $e)
 		{
+			@fclose($this->fp);
 			$this->con->rollback();
-			throw $e;
-		}
-		
+			throw new Exception($e->getMessage().' - '.sprintf(__('Error raised at line %s'),$line->__line));
+		}
+		@fclose($this->fp);
 		$this->con->commit();
 	}
-	
+
 	private function insertBlog($blog)
 	{
 		$this->cur_blog->clean();
-		
+
 		$this->cur_blog->blog_id     = (string) $blog->blog_id;
 		$this->cur_blog->blog_uid    = (string) $blog->blog_uid;
@@ -309,14 +316,14 @@
 		$this->cur_blog->blog_name   = (string) $blog->blog_name;
 		$this->cur_blog->blog_desc   = (string) $blog->blog_desc;
-		
+
 		$this->cur_blog->blog_status = $blog->exists('blog_status') ? (integer) $blog->blog_status : 1;
-		
+
 		$this->cur_blog->insert();
 	}
-	
+
 	private function insertCategory($category)
 	{
 		$this->cur_category->clean();
-		
+
 		$this->cur_category->cat_id       = (string) $category->cat_id;
 		$this->cur_category->blog_id      = (string) $category->blog_id;
@@ -324,5 +331,5 @@
 		$this->cur_category->cat_url      = (string) $category->cat_url;
 		$this->cur_category->cat_desc     = (string) $category->cat_desc;
-		
+
 		if (!$this->has_categories && $category->exists('cat_lft') && $category->exists('cat_rgt')) {
 			$this->cur_category->cat_lft = (integer) $category->cat_lft;
@@ -335,12 +342,12 @@
 			$this->cur_category->cat_rgt = $this->stack['cat_lft'][$category->blog_id]++;
 		}
-		
+
 		$this->cur_category->insert();
 	}
-	
+
 	private function insertLink($link)
 	{
 		$this->cur_link->clean();
-		
+
 		$this->cur_link->link_id       = (integer) $link->link_id;
 		$this->cur_link->blog_id       = (string) $link->blog_id;
@@ -351,12 +358,12 @@
 		$this->cur_link->link_xfn      = (string) $link->link_xfn;
 		$this->cur_link->link_position = (integer) $link->link_position;
-		
+
 		$this->cur_link->insert();
 	}
-	
+
 	private function insertSetting($setting)
 	{
 		$this->cur_setting->clean();
-		
+
 		$this->cur_setting->setting_id    = (string) $setting->setting_id;
 		$this->cur_setting->blog_id       = !$setting->blog_id ? null : (string) $setting->blog_id;
@@ -365,8 +372,8 @@
 		$this->cur_setting->setting_type  = (string) $setting->setting_type;
 		$this->cur_setting->setting_label = (string) $setting->setting_label;
-		
+
 		$this->cur_setting->insert();
 	}
-	
+
 	private function insertPref($pref)
 	{
@@ -374,7 +381,7 @@
 			return;
 		}
-		
+
 		$this->cur_pref->clean();
-		
+
 		$this->cur_pref->pref_id    = (string) $pref->pref_id;
 		$this->cur_pref->user_id    = !$pref->user_id ? null : (string) $pref->user_id;
@@ -383,8 +390,8 @@
 		$this->cur_pref->pref_type  = (string) $pref->pref_type;
 		$this->cur_pref->pref_label = (string) $pref->pref_label;
-		
+
 		$this->cur_pref->insert();
 	}
-	
+
 	private function insertUser($user)
 	{
@@ -392,7 +399,7 @@
 			return;
 		}
-		
+
 		$this->cur_user->clean();
-		
+
 		$this->cur_user->user_id           = (string) $user->user_id;
 		$this->cur_user->user_super        = (integer) $user->user_super;
@@ -410,36 +417,36 @@
 		$this->cur_user->user_creadt       = (string) $user->user_creadt;
 		$this->cur_user->user_upddt        = (string) $user->user_upddt;
-		
+
 		$this->cur_user->user_desc = $user->exists('user_desc') ? (string) $user->user_desc : null;
 		$this->cur_user->user_options = $user->exists('user_options') ? (string) $user->user_options : null;
 		$this->cur_user->user_status = $user->exists('user_status') ? (integer) $user->user_status : 1;
-		
+
 		$this->cur_user->insert();
-		
+
 		$this->stack['users'][$user->user_id] = true;
 	}
-	
+
 	private function insertPermissions($permissions)
 	{
 		$this->cur_permissions->clean();
-		
+
 		$this->cur_permissions->user_id     = (string) $permissions->user_id;
 		$this->cur_permissions->blog_id     = (string) $permissions->blog_id;
 		$this->cur_permissions->permissions = (string) $permissions->permissions;
-		
+
 		$this->cur_permissions->insert();
 	}
-	
+
 	private function insertPost($post)
 	{
 		$this->cur_post->clean();
-		
+
 		$cat_id = (integer) $post->cat_id;
 		if (!$cat_id) {
 			$cat_id = null;
 		}
-		
+
 		$post_password = $post->post_password ? (string) $post->post_password : null;
-		
+
 		$this->cur_post->post_id            = (integer) $post->post_id;
 		$this->cur_post->blog_id            = (string) $post->blog_id;
@@ -468,25 +475,25 @@
 		$this->cur_post->nb_comment         = (integer) $post->nb_comment;
 		$this->cur_post->nb_trackback       = (integer) $post->nb_trackback;
-		
+
 		$this->cur_post->post_tz = $post->exists('post_tz') ? (string) $post->post_tz : 'UTC';
-		
+
 		$this->cur_post->insert();
 	}
-	
+
 	private function insertMeta($meta)
 	{
 		$this->cur_meta->clean();
-		
+
 		$this->cur_meta->meta_id   = (string) $meta->meta_id;
 		$this->cur_meta->meta_type = (string) $meta->meta_type;
 		$this->cur_meta->post_id   = (integer) $meta->post_id;
-		
+
 		$this->cur_meta->insert();
 	}
-	
+
 	private function insertMedia($media)
 	{
 		$this->cur_media->clean();
-		
+
 		$this->cur_media->media_id      = (integer) $media->media_id;
 		$this->cur_media->user_id       = (string) $media->user_id;
@@ -499,26 +506,26 @@
 		$this->cur_media->media_upddt   = (string) $media->media_upddt;
 		$this->cur_media->media_private = (integer) $media->media_private;
-		
+
 		$this->cur_media->media_dir = $media->exists('media_dir') ? (string) $media->media_dir : dirname($media->media_file);
-		
+
 		if (!$this->mediaExists()) {
 			$this->cur_media->insert();
 		}
 	}
-	
+
 	private function insertPostMedia($post_media)
 	{
 		$this->cur_post_media->clean();
-		
+
 		$this->cur_post_media->media_id = (integer) $post_media->media_id;
 		$this->cur_post_media->post_id  = (integer) $post_media->post_id;
-		
+
 		$this->cur_post_media->insert();
 	}
-	
+
 	private function insertLog($log)
 	{
 		$this->cur_log->clean();
-		
+
 		$this->cur_log->log_id    = (integer) $log->log_id;
 		$this->cur_log->user_id   = (string) $log->user_id;
@@ -527,23 +534,23 @@
 		$this->cur_log->log_ip    = (string) $log->log_ip;
 		$this->cur_log->log_msg   = (string) $log->log_msg;
-		
+
 		$this->cur_log->insert();
 	}
-	
+
 	private function insertPing($ping)
 	{
 		$this->cur_ping->clean();
-		
+
 		$this->cur_ping->post_id  = (integer) $ping->post_id;
 		$this->cur_ping->ping_url = (string) $ping->ping_url;
 		$this->cur_ping->ping_dt  = (string) $ping->ping_dt;
-		
+
 		$this->cur_ping->insert();
 	}
-	
+
 	private function insertComment($comment)
 	{
 		$this->cur_comment->clean();
-		
+
 		$this->cur_comment->comment_id          = (integer) $comment->comment_id;
 		$this->cur_comment->post_id             = (integer) $comment->post_id;
@@ -559,29 +566,29 @@
 		$this->cur_comment->comment_spam_status = (integer) $comment->comment_spam_status;
 		$this->cur_comment->comment_trackback   = (integer) $comment->comment_trackback;
-		
+
 		$this->cur_comment->comment_tz = $comment->exists('comment_tz') ? (string) $comment->comment_tz : 'UTC';
 		$this->cur_comment->comment_spam_filter = $comment->exists('comment_spam_filter') ? (integer) $comment->comment_spam_filter : null;
-		
+
 		$this->cur_comment->insert();
 	}
-	
+
 	private function insertSpamRule($spamrule)
 	{
 		$this->cur_spamrule->clean();
-		
+
 		$this->cur_spamrule->rule_id      = (integer) $spamrule->rule_id;
 		$this->cur_spamrule->blog_id      = !$spamrule->blog_id ? null : (string) $spamrule->blog_id;
 		$this->cur_spamrule->rule_type    = (string) $spamrule->rule_type;
 		$this->cur_spamrule->rule_content = (string) $spamrule->rule_content;
-		
+
 		$this->cur_spamrule->insert();
 	}
-	
+
 	private function insertCategorySingle($category)
 	{
 		$this->cur_category->clean();
-		
+
 		$m = $this->searchCategory($this->stack['categories'],$category->cat_url);
-		
+
 		$old_id = $category->cat_id;
 		if ($m !== false)
@@ -594,21 +601,21 @@
 			$category->cat_id = $cat_id;
 			$category->blog_id = $this->blog_id;
-			
+
 			$this->insertCategory($category);
 			$this->stack['cat_id']++;
 		}
-		
+
 		$this->old_ids['category'][(integer) $old_id] = $cat_id;
 	}
-	
+
 	private function insertLinkSingle($link)
 	{
 		$link->blog_id = $this->blog_id;
 		$link->link_id = $this->stack['link_id'];
-		
+
 		$this->insertLink($link);
 		$this->stack['link_id']++;
 	}
-	
+
 	private function insertPostSingle($post)
 	{
@@ -616,15 +623,15 @@
 			$post_id = $this->stack['post_id'];
 			$this->old_ids['post'][(integer) $post->post_id] = $post_id;
-			
+
 			$cat_id = $post->cat_id ? $this->old_ids['category'][(integer) $post->cat_id] : null;
-			
+
 			$post->post_id = $post_id;
 			$post->cat_id = $cat_id;
 			$post->blog_id = $this->blog_id;
-			
+
 			$post->post_url = $this->core->blog->getPostURL(
 				$post->post_url,$post->post_dt,$post->post_title,$post->post_id
 			);
-			
+
 			$this->insertPost($post);
 			$this->stack['post_id']++;
@@ -633,5 +640,5 @@
 		}
 	}
-	
+
 	private function insertMetaSingle($meta)
 	{
@@ -643,19 +650,19 @@
 		}
 	}
-	
+
 	private function insertMediaSingle($media)
 	{
 		$media_id = $this->stack['media_id'];
 		$old_id = $media->media_id;
-		
+
 		$media->media_id = $media_id;
 		$media->media_path = $this->core->blog->settings->system->public_path;
 		$media->user_id = $this->getUserId($media->user_id);
-		
+
 		$this->insertMedia($media);
 		$this->stack['media_id']++;
 		$this->old_ids['media'][(integer) $old_id] = $media_id;
 	}
-	
+
 	private function insertPostMediaSingle($post_media)
 	{
@@ -664,5 +671,5 @@
 			$post_media->media_id = $this->old_ids['media'][(integer) $post_media->media_id];
 			$post_media->post_id = $this->old_ids['post'][(integer) $post_media->post_id];
-			
+
 			$this->insertPostMedia($post_media);
 		} elseif (!isset($this->old_ids['media'][(integer) $post_media->media_id])) {
@@ -672,10 +679,10 @@
 		}
 	}
-	
+
 	private function insertPingSingle($ping)
 	{
 		if (isset($this->old_ids['post'][(integer) $ping->post_id])) {
 			$ping->post_id = $this->old_ids['post'][(integer) $ping->post_id];
-			
+
 			$this->insertPing($ping);
 		} else {
@@ -683,13 +690,13 @@
 		}
 	}
-	
+
 	private function insertCommentSingle($comment)
 	{
 		if (isset($this->old_ids['post'][(integer) $comment->post_id])) {
 			$comment_id = $this->stack['comment_id'];
-			
+
 			$comment->comment_id = $comment_id;
 			$comment->post_id = $this->old_ids['post'][(integer) $comment->post_id];
-			
+
 			$this->insertComment($comment);
 			$this->stack['comment_id']++;
@@ -698,5 +705,5 @@
 		}
 	}
-	
+
 	private static function throwIdError($name,$line,$related)
 	{
@@ -708,5 +715,5 @@
 		));
 	}
-	
+
 	public function searchCategory($rs,$url)
 	{
@@ -717,8 +724,8 @@
 			}
 		}
-		
+
 		return false;
 	}
-	
+
 	public function getUserId($user_id)
 	{
@@ -730,5 +737,5 @@
 				$user_id = preg_replace('/[^A-Za-z0-9]$/','',$user_id);
 				$user_id .= strlen($user_id) < 2 ? '-a' : '';
-				
+
 				# We change user_id, we need to check again
 				if (!$this->userExists($user_id))
@@ -737,7 +744,7 @@
 					$this->cur_user->user_id = (string) $user_id;
 					$this->cur_user->user_pwd = md5(uniqid());
-					
+
 					$this->core->addUser($this->cur_user);
-					
+
 					$this->stack['users'][$user_id] = true;
 				}
@@ -749,8 +756,8 @@
 			}
 		}
-		
+
 		return $user_id;
 	}
-	
+
 	private function userExists($user_id)
 	{
@@ -758,15 +765,15 @@
 			return $this->stack['users'][$user_id];
 		}
-		
+
 		$strReq = 'SELECT user_id '.
 				'FROM '.$this->prefix.'user '.
 				"WHERE user_id = '".$this->con->escape($user_id)."' ";
-		
+
 		$rs = $this->con->select($strReq);
-		
+
 		$this->stack['users'][$user_id] = !$rs->isEmpty();
 		return $this->stack['users'][$user_id];
 	}
-	
+
 	private function prefExists($pref_ws,$pref_id,$user_id)
 	{
@@ -780,10 +787,10 @@
 			$strReq .= "AND user_id = '".$this->con->escape($user_id)."' ";
 		}
-		
+
 		$rs = $this->con->select($strReq);
-		
+
 		return !$rs->isEmpty();
 	}
-	
+
 	private function mediaExists()
 	{
@@ -792,10 +799,10 @@
 				"WHERE media_path = '".$this->con->escape($this->cur_media->media_path)."' ".
 				"AND media_file = '".$this->con->escape($this->cur_media->media_file)."' ";
-		
+
 		$rs = $this->con->select($strReq);
-		
+
 		return !$rs->isEmpty();
 	}
-	
+
 	private function prepareDC12line(&$line)
 	{
@@ -804,5 +811,5 @@
 		'dc_wiki_comments','dc_use_smilies','dc_date_format','dc_time_format',
 		'dc_url_scan');
-		
+
 		switch ($line->__name)
 		{
@@ -830,5 +837,5 @@
 				$line->post_content_xhtml = $line->post_content;
 				$line->post_excerpt_xhtml = $line->post_chapo;
-				
+
 				if ($line->post_format == 'wiki') {
 					$line->post_content = $line->post_content_wiki;
@@ -838,11 +845,11 @@
 					$line->post_excerpt = $line->post_chapo;
 				}
-				
+
 				$line->post_status = (integer) $line->post_pub;
 				$line->post_type = 'post';
 				$line->blog_id = 'default';
-				
+
 				$line->drop('post_titre_url','post_content_wiki','post_chapo','post_chapo_wiki','post_pub');
-				
+
 				break;
 			case 'post_meta':
@@ -862,8 +869,7 @@
 				break;
 		}
-		
+
 		# --BEHAVIOR-- importPrepareDC12
 		$this->core->callBehavior('importPrepareDC12',$line,$this,$this->core);
 	}
 }
-?>
Index: plugins/importExport/index.php
===================================================================
--- plugins/importExport/index.php	(revision 2322)
+++ plugins/importExport/index.php	(revision 2477)
@@ -98,12 +98,12 @@
 
 	echo '<h3>'.__('Import').'</h3>'.listImportExportModules($core,$modules['import']);
-	//echo '<h3>'.__('Export').'</h3>'.listImportExportModules($core,$modules['export']);
+
+	echo
+	'<h3>'.__('Export').'</h3>'.
+	'<p class="info">'.sprintf(
+		__('Export functions are in the page %s.'),
+		'<a href="plugin.php?p=maintenance&amp;tab=backup#backup">'.__('Maintenance').'</a>'
+	).'</p>';
 }
-
-echo
-'<p class="info">'.sprintf(
-	__('Export functions are in the page %s.'),
-	'<a href="plugin.php?p=maintenance&amp;tab=backup#backup">'.__('Maintenance').'</a>'
-).'</p>';
 
 dcPage::helpBlock('import');
Index: plugins/importExport/locales/fr/help/import.html
===================================================================
--- plugins/importExport/locales/fr/help/import.html	(revision 2322)
+++ plugins/importExport/locales/fr/help/import.html	(revision 2438)
@@ -6,5 +6,49 @@
 <body>
 
-<h4>Importation</h4>
+<h4>Importation d'un fichier « à plat »</h4>
+
+<p>Importe un blog ou une installation Dotclear complète depuis un fichier « à plat ».</p>
+
+<h5>Importation d'un blog simple</h5>
+
+<p>Sélectionnez le fichier de sauvegarde (habituellement exporté depuis une installation Dotclear) ou sélectionnez-en un présent dans votre répertoire racine de votre médiathèque puis cliquez ensuite sur le bouton <strong>Importer</strong> pour lancer l'importation.</p>
+
+<p>Notez que cette importation s'ajoutera au contenu existant de votre blog, il n'est donc pas destructeur.</p>
+
+<h5>Tous les blogs</h5>
+
+<p>Sélectionnez le fichier de sauvegarde complet ou sélectionnez-en un présent dans votre répertoire racine de votre médiathèque, indiquez votre mot de passe puis cliquez ensuite sur le bouton <strong>Importer</strong> pour lancer l'importation.</p>
+
+<p><strong>Attention</strong> : Tout le contenu actuel de votre installation sera au préalable supprimé et remplacé par le contenu de la sauvegarde importée, à l'exception des utilisateurs existants qui seront préservés. Les utilisateurs additionnels de la sauvegarde importée seront ajoutés à la liste existante.</p>
+
+<h4>Importation d'un flux RSS ou Atom</h4>
+
+<p>Ajouter les contenus d'un flux au blog.</p>
+
+<p>Indiquez l'URL du flux RSS ou Atom que vous voulez importer puis cliquez sur le bouton <strong>Importer</strong>. Les contenus trouvés dans le flux seront alors ajoutés au contenu existant de votre blog.</p>
+
+<h4>Importation depuis Dotclear 1.2</h4>
+
+<p>Cette fonction permet d'importer une installation Dotclear 1.2 dans votre blog courant. Cette importation remplacera les catégories, la liste des liens, les billets et les commentaires présents dans votre blog.</p>
+
+<p>Indiquez l'URL du serveur où est accessible la base de données de l'installation Dotclear 1.2, indiquez ensuite le nom de la base de données, le nom et le mot de passe de l'utilisateur permettant de s'y connecter et enfin le préfixe de table utilisé pour Dotclear 1.2. Vous pouvez trouver ces informations dans le fichier <code>conf/config.php</code> de votre installation Dotclear 1.2.</p>
+
+<p>Cliquez ensuite sur le bouton <strong>Importer mon blog maintenant</strong> pour lancer le processus.</p>
+
+<p>Vous pouvez réduire (ou augmenter) le nombre de billets importés à chaque passe, positionné à 20 par défaut, en fonction de la vitesse d'accès constatée à votre installation Dotclear 1.2</p>
+
+<h4>Importation Wordpress</h4>
+
+<p>Cette fonction vous permet d'importer une installation WordPress dans le blog courant.</p>
+
+<p>Indiquez l'URL du serveur où est accessible la base de données de l'installation Wordpress, indiquez ensuite le nom de la base de données, le nom et le mot de passe de l'utilisateur permettant de s'y connecter et enfin le préfixe de table utilisé pour Wordpress.</p>
+
+<p>Vous pouvez si nécessaire définir quelques options d'importation à propos de la récupération des catégories et du nombre de billets traités à chaque passe. Vous pouvez également définir la syntaxe utilisée pour le contenu des billets et des commentaires (XHTML, wiki, ou d'autres en fonction des syntaxes installées et actives).</p>
+
+<p>Cliquez ensuite sur le bouton <strong>Importer mon blog maintenant</strong> pour lancer le processus.</p>
+
+<hr />
+
+<p>Note : les fonctions d'export sont désormais dans la page de <a href="plugin.php?p=maintenance&amp;tab=backup#backup">Maintenance</a>.</p>
 
 </body>
Index: plugins/maintenance/_admin.php
===================================================================
--- plugins/maintenance/_admin.php	(revision 2196)
+++ plugins/maintenance/_admin.php	(revision 2394)
@@ -23,6 +23,5 @@
 // Admin behaviors
 $core->addBehavior('dcMaintenanceInit', array('dcMaintenanceAdmin', 'dcMaintenanceInit'));
-$core->addBehavior('adminDashboardFavs', array('dcMaintenanceAdmin', 'adminDashboardFavs'));
-$core->addBehavior('adminDashboardFavsIcon', array('dcMaintenanceAdmin', 'adminDashboardFavsIcon'));
+$core->addBehavior('adminDashboardFavorites', array('dcMaintenanceAdmin', 'adminDashboardFavorites'));
 $core->addBehavior('adminDashboardContents', array('dcMaintenanceAdmin', 'adminDashboardItems'));
 $core->addBehavior('adminDashboardOptionsForm',	array('dcMaintenanceAdmin',	'adminDashboardOptionsForm'));
@@ -74,23 +73,35 @@
 
 	/**
-	 * Dashboard favs.
+	 * Favorites.
 	 *
 	 * @param	$core	<b>dcCore</b>	dcCore instance
 	 * @param	$favs	<b>arrayObject</b>	Array of favs
 	 */
-	public static function adminDashboardFavs($core, $favs)
-	{
-		$favs['maintenance'] = new ArrayObject(array(
-			'maintenance',
-			'Maintenance',
-			'plugin.php?p=maintenance',
-			'index.php?pf=maintenance/icon.png',
-			'index.php?pf=maintenance/icon-big.png',
-			null,null,null
+	public static function adminDashboardFavorites($core, $favs)
+	{
+		$favs->register('maintenance', array(
+			'title' => __('Maintenance'),
+			'url' => 'plugin.php?p=maintenance',
+			'small-icon' => 'index.php?pf=maintenance/icon.png',
+			'large-icon' => 'index.php?pf=maintenance/icon-big.png',
+			'permissions' => 'admin',
+			'active_cb' => array('dcMaintenanceAdmin', 'adminDashboardFavoritesActive'),
+			'dashboard_cb' => array('dcMaintenanceAdmin', 'adminDashboardFavoritesCallback')
 		));
 	}
 
 	/**
-	 * Dashboard favs icon.
+	 * Favorites selection.
+	 *
+	 * @param	$request	<b>string</b>	Requested page
+	 * @param	$params		<b>array</b>	Requested parameters
+	 */
+	public static function adminDashboardFavoritesActive($request, $params)
+	{
+		return $request == 'plugin.php' && isset($params['p']) && $params['p'] == 'maintenance';
+	}
+
+	/**
+	 * Favorites hack.
 	 *
 	 * This updates maintenance fav icon text 
@@ -98,14 +109,8 @@
 	 *
 	 * @param	$core	<b>dcCore</b>	dcCore instance
-	 * @param	$name	<b>string</b>	Current fav name
-	 * @param	$icon	<b>arrayObject</b>	Current fav attributes
-	 */
-	public static function adminDashboardFavsIcon($core, $name, $icon)
-	{
-		// Check icon
-		if ($name !== 'maintenance') {
-			return null;
-		}
-
+	 * @param	$fav	<b>arrayObject</b>	fav attributes
+	 */
+	public static function adminDashboardFavoritesCallback($core, $fav)
+	{
 		// Check user option
 		$core->auth->user_prefs->addWorkspace('maintenance');
@@ -128,6 +133,6 @@
 		}
 
-		$icon[0] .= '<br />'.sprintf(__('One task to execute', '%s tasks to execute', $count), $count);
-		$icon[2] = 'index.php?pf=maintenance/icon-big-update.png';
+		$fav['title'] .= '<br />'.sprintf(__('One task to execute', '%s tasks to execute', $count), $count);
+		$fav['large-icon'] = 'index.php?pf=maintenance/icon-big-update.png';
 	}
 
@@ -198,9 +203,9 @@
 		'<p><label for="maintenance_dashboard_icon" class="classic">'.
 		form::checkbox('maintenance_dashboard_icon', 1, $core->auth->user_prefs->maintenance->dashboard_icon).
-		__('Display count of late tasks on maintenance dashboard icon').'</label></p>'.
+		__('Display overdue tasks counter on maintenance dashboard icon').'</label></p>'.
 
 		'<p><label for="maintenance_dashboard_item" class="classic">'.
 		form::checkbox('maintenance_dashboard_item', 1, $core->auth->user_prefs->maintenance->dashboard_item).
-		__('Display list of late tasks on dashboard items').'</label></p>'.
+		__('Display overdue tasks list on dashboard items').'</label></p>'.
 
 		'</div>';
Index: plugins/maintenance/_config.php
===================================================================
--- plugins/maintenance/_config.php	(revision 2227)
+++ 	(revision )
@@ -1,100 +1,0 @@
-<?php
-# -- BEGIN LICENSE BLOCK ---------------------------------------
-#
-# This file is part of Dotclear 2.
-#
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
-# Licensed under the GPL version 2.0 license.
-# See LICENSE file or
-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
-#
-# -- END LICENSE BLOCK -----------------------------------------
-if (!defined('DC_CONTEXT_MODULE')) { return; }
-
-$core->blog->settings->addNamespace('maintenance');
-$maintenance = new dcMaintenance($core);
-$tasks = $maintenance->getTasks();
-
-$combo_ts = array(
-	__('Never') 			=> 0,
-	__('Every week') 		=> 604800,
-	__('Every two weeks') 	=> 1209600,
-	__('Every month') 		=> 2592000,
-	__('Every two months') 	=> 5184000
-);
-
-if (!empty($_POST['save'])) {
-
-	try {
-		$core->blog->settings->maintenance->put(
-			'plugin_message', 
-			!empty($_POST['settings_plugin_message']), 
-			'boolean', 
-			'Display alert message of late tasks on plugin page', 
-			true, 
-			true
-		);
-
-		foreach($tasks as $t) {
-			if (!empty($_POST['settings_recall_type']) && $_POST['settings_recall_type'] == 'all') {
-				$ts = $_POST['settings_recall_time'];
-			}
-			else {
-				$ts = empty($_POST['settings_ts_'.$t->id()]) ? 0 : $_POST['settings_ts_'.$t->id()];
-			}
-			$core->blog->settings->maintenance->put(
-				'ts_'.$t->id(), 
-				abs((integer) $ts), 
-				'integer', 
-				sprintf('Recall time for task %s', $t->id()), 
-				true, 
-				$t->blog()
-			);
-		}
-
-		dcPage::addSuccessNotice(__('Maintenance plugin has been successfully configured.'));
-		http::redirect($list->getURL('module=maintenance&conf=1'));
-	}
-	catch(Exception $e) {
-		$core->error->add($e->getMessage());
-	}
-}
-
-echo 
-'<p>'.__('Set up reminders for maintenance tasks.').'</p>'.
-
-'<h4 class="pretty-title">'.__('Activation').'</h4>'.
-'<p><label for="settings_plugin_message" class="classic">'.
-form::checkbox('settings_plugin_message', 1, $core->blog->settings->maintenance->plugin_message).
-__('Display alert messages on late tasks').'</label></p>'.
-
-'<p class="info">'.sprintf(
-	__('You can place list of late tasks on your %s.'),
-	'<a href="preferences.php#user-favorites">'.__('Dashboard').'</a>'
-).'</p>'.
-
-'<h4 class="pretty-title vertical-separator">'.__('Frequency').'</h4>'.
-
-'<p class="vertical-separator">'.form::radio(array('settings_recall_type', 'settings_recall_all'), 'all').' '.
-'<label class="classic" for="settings_recall_all">'.
-'<strong>'.__('Use one recall time for all tasks').'</strong></label>'.
-
-'<p class="field wide vertical-separator"><label for="settings_recall_time">'.__('Recall time for all tasks:').'</label>'.
-form::combo('settings_recall_time', $combo_ts, 'seperate', 'recall-for-all').
-'</p>'.
-
-'<p class="vertical-separator">'.form::radio(array('settings_recall_type', 'settings_recall_separate'), 'separate', 1).' '.
-'<label class="classic" for="settings_recall_separate">'.
-'<strong>'.__('Use one recall time per task').'</strong></label>';
-
-foreach($tasks as $t)
-{
-	echo
-	'<div class="two-boxes">'.
-
-	'<p class="field wide"><label for="settings_ts_'.$t->id().'">'.$t->task().'</label>'.
-	form::combo('settings_ts_'.$t->id(), $combo_ts, $t->ts(), 'recall-per-task').
-	'</p>'.
-
-	'</div>';
-}
Index: plugins/maintenance/inc/class.dc.maintenance.task.php
===================================================================
--- plugins/maintenance/inc/class.dc.maintenance.task.php	(revision 2044)
+++ plugins/maintenance/inc/class.dc.maintenance.task.php	(revision 2491)
@@ -56,4 +56,5 @@
 		$this->core = $maintenance->core;
 		$this->init();
+		$this->id = null;
 
 		if ($this->perm() === null && !$this->core->auth->isSuperAdmin()
Index: plugins/maintenance/inc/tasks/class.dc.maintenance.logs.php
===================================================================
--- plugins/maintenance/inc/tasks/class.dc.maintenance.logs.php	(revision 2044)
+++ plugins/maintenance/inc/tasks/class.dc.maintenance.logs.php	(revision 2482)
@@ -14,4 +14,6 @@
 class dcMaintenanceLogs extends dcMaintenanceTask
 {
+	public static $keep_maintenance_logs = true;
+
 	protected $group = 'purge';
 
@@ -19,5 +21,5 @@
 	{
 		$this->task 		= __('Delete all logs');
-		$this->success 		= __('Logs deleted.');
+		$this->success 	= __('Logs deleted.');
 		$this->error 		= __('Failed to delete logs.');
 
@@ -27,5 +29,13 @@
 	public function execute()
 	{
-		$this->core->log->delLogs(null, true);
+		if (dcMaintenanceLogs::$keep_maintenance_logs) {
+			$this->core->con->execute(
+				'DELETE FROM '.$this->core->prefix.'log '.
+				"WHERE log_table <> 'maintenance' "
+			);
+		}
+		else {
+			$this->core->log->delLogs(null, true);
+		}
 
 		return true;
Index: plugins/maintenance/index.php
===================================================================
--- plugins/maintenance/index.php	(revision 2175)
+++ plugins/maintenance/index.php	(revision 2491)
@@ -19,5 +19,4 @@
 $tasks = $maintenance->getTasks();
 
-$msg = '';
 $headers = '';
 $p_url = 'plugin.php?p=maintenance';
@@ -50,8 +49,53 @@
 		if (true === $code) {
 			$maintenance->setLog($task->id());
-			http::redirect($p_url.'&task='.$task->id().'&done=1&tab='.$tab.'#'.$tab);
+
+			dcPage::addSuccessNotice($task->success());
+			http::redirect($p_url.'&task='.$task->id().'&tab='.$tab.'#'.$tab);
 		}
 	}
 	catch (Exception $e) {
+		$core->error->add($e->getMessage());
+	}
+}
+
+// Save settings
+
+if (!empty($_POST['save_settings'])) {
+
+	try {
+		$core->blog->settings->maintenance->put(
+			'plugin_message', 
+			!empty($_POST['settings_plugin_message']), 
+			'boolean', 
+			'Display alert message of late tasks on plugin page', 
+			true, 
+			true
+		);
+
+		foreach($tasks as $t) {
+			if (!$t->id()) {
+				continue;
+			}
+
+			if (!empty($_POST['settings_recall_type']) && $_POST['settings_recall_type'] == 'all') {
+				$ts = $_POST['settings_recall_time'];
+			}
+			else {
+				$ts = empty($_POST['settings_ts_'.$t->id()]) ? 0 : $_POST['settings_ts_'.$t->id()];
+			}
+			$core->blog->settings->maintenance->put(
+				'ts_'.$t->id(), 
+				abs((integer) $ts), 
+				'integer', 
+				sprintf('Recall time for task %s', $t->id()), 
+				true, 
+				$t->blog()
+			);
+		}
+
+		dcPage::addSuccessNotice(__('Maintenance plugin has been successfully configured.'));
+		http::redirect($p_url.'&tab='.$tab.'#'.$tab);
+	}
+	catch(Exception $e) {
 		$core->error->add($e->getMessage());
 	}
@@ -104,13 +148,4 @@
 }
 
-// Success message
-
-if (!empty($_GET['done']) && $tab == 'settings') {
-	$msg = dcPage::success(__('Settings successfully updated'), true, true, false);
-}
-elseif (!empty($_GET['done']) && $task) {
-	$msg = dcPage::success($task->success(), true, true, false);
-}
-
 if ($task && ($res = $task->step()) !== null) {
 
@@ -125,5 +160,8 @@
 	);
 
-	echo $msg;
+	// content
+	if (substr($res, 0, 1) != '<') {
+		$res = sprintf('<p class="step-msg">%s</p>', $res);
+	}
 
 	// Intermediate task (task required several steps)
@@ -132,11 +170,9 @@
 	'<div class="step-box" id="'.$task->id().'">'.
 	'<p class="step-back">'.
-		'<a class="back" href="'.$p_url.'&tab='.$task->tab().'#'.$task->tab().'">'.__('Back').'</a>'.
+		'<a class="back" href="'.$p_url.'&amp;tab='.$task->tab().'#'.$task->tab().'">'.__('Back').'</a>'.
 	'</p>'.
 	'<h3>'.html::escapeHTML($task->name()).'</h3>'.
 	'<form action="'.$p_url.'" method="post">'.
-	'<p class="step-msg">'.
-		$res.
-	'</p>'.
+	$res.
 	'<p class="step-submit">'.
 		'<input type="submit" value="'.$task->task().'" /> '.
@@ -159,6 +195,4 @@
 	);
 
-	echo $msg;
-
 	// Simple task (with only a button to start it)
 
@@ -171,5 +205,6 @@
 			foreach($tasks as $t)
 			{
-				if ($t->group() != $group_obj->id() 
+				if (!$t->id() 
+				 || $t->group() != $group_obj->id() 
 				 || $t->tab() != $tab_obj->id()) {
 					continue;
@@ -233,5 +268,5 @@
 	foreach($tasks as $t)
 	{
-		if ($t->group() !== null) {
+		if (!$t->id() || $t->group() !== null) {
 			continue;
 		}
@@ -249,7 +284,62 @@
 		'</div>';
 	}
+
+	// Settings
+
+	echo 
+	'<div id="settings" class="multi-part" title="'.__('Alert settings').'">'.
+	'<h3>'.__('Alert settings').'</h3>'.
+	'<form action="'.$p_url.'" method="post">'.
+
+	'<h4 class="pretty-title">'.__('Activation').'</h4>'.
+	'<p><label for="settings_plugin_message" class="classic">'.
+	form::checkbox('settings_plugin_message', 1, $core->blog->settings->maintenance->plugin_message).
+	__('Display alert messages on late tasks').'</label></p>'.
+
+	'<p class="info">'.sprintf(
+		__('You can place list of late tasks on your %s.'),
+		'<a href="preferences.php#user-favorites">'.__('Dashboard').'</a>'
+	).'</p>'.
+
+	'<h4 class="pretty-title vertical-separator">'.__('Frequency').'</h4>'.
+
+	'<p class="vertical-separator">'.form::radio(array('settings_recall_type', 'settings_recall_all'), 'all').' '.
+	'<label class="classic" for="settings_recall_all">'.
+	'<strong>'.__('Use one recall time for all tasks').'</strong></label></p>'.
+
+	'<p class="field wide vertical-separator"><label for="settings_recall_time">'.__('Recall time for all tasks:').'</label>'.
+	form::combo('settings_recall_time', $combo_ts, 'seperate', 'recall-for-all').
+	'</p>'.
+
+	'<p class="vertical-separator">'.form::radio(array('settings_recall_type', 'settings_recall_separate'), 'separate', 1).' '.
+	'<label class="classic" for="settings_recall_separate">'.
+	'<strong>'.__('Use one recall time per task').'</strong></label></p>';
+
+	foreach($tasks as $t)
+	{
+		if (!$t->id()) {
+			continue;
+		} 
+		echo
+		'<div class="two-boxes">'.
+
+		'<p class="field wide"><label for="settings_ts_'.$t->id().'">'.$t->task().'</label>'.
+		form::combo('settings_ts_'.$t->id(), $combo_ts, $t->ts(), 'recall-per-task').
+		'</p>'.
+
+		'</div>';
+	}
+
+	echo 
+	'<p class="field wide"><input type="submit" value="'.__('Save').'" /> '.
+	form::hidden(array('tab'), 'settings').
+	form::hidden(array('save_settings'), 1).
+	$core->formNonce().'</p>'.
+	'</form>'.
+	'</div>';
 }
 
 dcPage::helpBlock('maintenance', 'maintenancetasks');
 
-echo '</body></html>';
+echo 
+'</body></html>';
Index: plugins/pages/list.php
===================================================================
--- plugins/pages/list.php	(revision 2495)
+++ plugins/pages/list.php	(revision 2496)
@@ -99,15 +99,15 @@
 	'<p class="col right"><label for="action" class="classic">'.__('Selected pages action:').'</label> '.
 	form::combo('action',$pages_actions_page->getCombo()).
-	'<input type="submit" value="'.__('ok').'" /></p>'.
+	'<input type="submit" value="'.__('ok').'" />'.
 	form::hidden(array('post_type'),'page').
 	form::hidden(array('p'),'pages').
 	form::hidden(array('act'),'list').
-	'</div>'.
 	$core->formNonce().
+	'</p></div>'.
 	'<p class="clear form-note hidden-if-js">'.
 	__('To rearrange pages order, change number at the begining of the line, then click on “Save pages order” button.').'</p>'.
 	'<p class="clear form-note hidden-if-no-js">'.
 	__('To rearrange pages order, move items by drag and drop, then click on “Save pages order” button.').'</p>'.
-	'<input type="submit" value="'.__('Save pages order').'" name="reorder" class="clear"/>'.
+	'<p><input type="submit" value="'.__('Save pages order').'" name="reorder" class="clear" /></p>'.
 	'</form>');
 }
Index: plugins/pages/locales/fr/help/page.html
===================================================================
--- plugins/pages/locales/fr/help/page.html	(revision 2314)
+++ plugins/pages/locales/fr/help/page.html	(revision 2391)
@@ -27,5 +27,5 @@
     <li><strong>En attente</strong>&nbsp;: en attente de publication.</li>
     <li><strong>Programmé</strong>&nbsp;: la page sera mise en ligne à la date et à l'heure
-    indiquées dans le champ <em>Publiée le</em>.</li>
+    indiquée dans le champ <em>Publiée le</em>.</li>
     <li><strong>Non publié</strong>&nbsp;: page hors ligne.</li>
     <li><strong>Publié</strong>&nbsp;: page en ligne.</li>
@@ -35,12 +35,21 @@
   <dt>Publié le</dt>
   <dd>Permet de modifier la date et l'heure de publication de la page. Si vous avez
-  choisi le statut <em>Programmée</em> elle sera mise en ligne aux date et heure
+  choisi le statut <em>Programmée</em> elle sera mise en ligne aux dates et heures
   définis dans ce champ.</dd>
   
-  <dt>Syntaxe de saisie</dt>
+  <dt>Langue de la page</dt>
+  <dd>Code langue de votre page. Par défaut, il s'agit du code de votre
+  langue. Vous pouvez le changer, par le code d'une autre langue, par
+  exemple "en", "fr-qc".</dd>
+  
+  <dt>Formatage du texte</dt>
   <dd>Permet de choisir la syntaxe de saisie de la page. Le wiki est une syntaxe
   simplifiée et sera converti en xhtml valide ; à moins que vous maîtrisiez
   parfaitement le xhtml nous vous conseillons de la choisir de préférence.<br />
   Consultez la référence de la syntaxe Wiki pour plus d'informations.</dd>
+  
+  <dt>Position de la page</dt>
+  <dd>Permet de classer les différentes pages en fonction de leur numéro d'ordre.
+  Ce champ est utilisé par le widget Pages (<em>Trier par position de la page</em>).</dd>
   
   <dt>Accepter les commentaires</dt>
@@ -57,16 +66,6 @@
   recevoir des rétroliens mais ne peut pas en faire.</dd>
 
-  <dt>Masquer</dt>
+  <dt>Ne pas lister dans le widget Pages</dt>
   <dd>Si coché cette page sera active mais non listée dans le widget Pages.</dd>
-
-  <dt>Position de la page</dt>
-  <dd>Permet de classer les différentes pages en fonction de leur numéro d'ordre.
-  Ce champ est utilisé par le widget Pages (<em>Trier par position de la page</em>).</dd>
-
-  <dt>Langue de la page</dt>
-  <dd>Code langue de votre page. Par défaut, il s'agit du code de votre
-  langue. Vous pouvez le changer, par le code d'une autre langue, par
-  exemple "en", "fr-qc". Ce code est libre, il sera utilisé lors de l'affichage
-  des pages.</dd>
   
   <dt>Mot de passe de la page</dt>
@@ -81,9 +80,10 @@
   d'utiliser une URL déjà existante, celle-ci se verra incrémentée d'un chiffre.</dd>
 
-  <dt>Annexes</dt>
-  <dd>Les annexes sont tous les médias attachés à la page. Le lien
-  d'ajout d'une annexe permet de choisir un fichier à ajouter à la page.
-  Pensez à sauvegarder votre page avant de choisir une annexe. Consultez
-  l'aide du gestionnaire de médias pour plus de détails.</dd>
+  <dt>Fichiers attachés</dt>
+  <dd>Les fichiers attachés sont tous les médias ajoutés à la page. Le lien
+  d'ajout d'un fichier attaché permet de choisir un fichier à ajouter à la page.
+  L'option apparaîtra après le première enregistrement de votre 
+  billet 
+  Consultez l'aide du gestionnaire de médias pour plus de détails.</dd>
 </dl>
 
@@ -97,5 +97,5 @@
   
   <dt>Ajouter un commentaire</dt>
-  <dd>Depuis l'onglet <em>Ajouter un commentaire</em> vous pouvez répondre
+  <dd>Depuis l'onglet <em>Ajouter un commentaire</em> vous pouvez ajouter ou répondre
   directement à un commentaire sans passer par votre blog. Cette interface vous
   permet également de saisir votre commentaire en XHTML, sans limitation. Vous
Index: plugins/pages/page.php
===================================================================
--- plugins/pages/page.php	(revision 2314)
+++ plugins/pages/page.php	(revision 2390)
@@ -390,18 +390,18 @@
 			'items' => array(
 				'post_status' => 
-					'<p><label for="post_status" class="ib">'.__('Page status').'</label> '.
+					'<p><label for="post_status">'.__('Page status').'</label> '.
 					form::combo('post_status',$status_combo,$post_status,'','',!$can_publish).
 					'</p>',
 				'post_dt' => 
-					'<p><label for="post_dt" class="ib">'.__('Publication date and hour').'</label>'.
+					'<p><label for="post_dt">'.__('Publication date and hour').'</label>'.
 					form::field('post_dt',16,16,$post_dt,($bad_dt ? 'invalid' : '')).
 					'</p>',
 				'post_lang' =>
-					'<p><label for="post_lang" class="ib">'.__('Page language').'</label>'.
+					'<p><label for="post_lang">'.__('Page language').'</label>'.
 					form::combo('post_lang',$lang_combo,$post_lang).
 					'</p>',
 				'post_format' =>
 					'<div>'.
-					'<h5 id="label_format"><label for="post_format" class="ib">'.__('Text formatting').'</label></h5>'.
+					'<h5 id="label_format"><label for="post_format" class="classic">'.__('Text formatting').'</label></h5>'.
 					'<p>'.form::combo('post_format',$formaters_combo,$post_format,'maximal').
 					'</p>'.
@@ -447,10 +447,10 @@
 					'</p>',
 				'post_password' =>
-					'<p><label for="post_password" class="ib">'.__('Password').'</label>'.
+					'<p><label for="post_password">'.__('Password').'</label>'.
 					form::field('post_password',10,32,html::escapeHTML($post_password),'maximal').
 					'</p>',
 				'post_url' =>
 					'<div class="lockable">'.
-					'<p><label for="post_url" class="ib">'.__('Edit basename').'</label>'.
+					'<p><label for="post_url">'.__('Edit basename').'</label>'.
 					form::field('post_url',10,255,html::escapeHTML($post_url),'maximal').
 					'</p>'.
@@ -462,10 +462,10 @@
 		"post_title" =>
 			'<p class="col">'.
-			'<label class="required no-margin"><abbr title="'.__('Required field').'">*</abbr> '.__('Title:').'</label>'.
+			'<label class="required no-margin bold"><abbr title="'.__('Required field').'">*</abbr> '.__('Title:').'</label>'.
 			form::field('post_title',20,255,html::escapeHTML($post_title),'maximal').
 			'</p>',
 		
 		"post_excerpt" =>
-			'<p class="area" id="excerpt-area"><label for="post_excerpt">'.__('Excerpt:').' <span class="form-note">'.
+			'<p class="area" id="excerpt-area"><label for="post_excerpt" class="bold">'.__('Excerpt:').' <span class="form-note">'.
 			__('Introduction to the page.').'</span></label> '.
 			form::textarea('post_excerpt',50,5,html::escapeHTML($post_excerpt)).
@@ -473,5 +473,5 @@
 		
 		"post_content" =>
-			'<p class="area" id="content-area"><label class="required" '.
+			'<p class="area" id="content-area"><label class="required bold" '.
 			'for="post_content"><abbr title="'.__('Required field').'">*</abbr> '.__('Content:').'</label> '.
 			form::textarea('post_content',50,$core->auth->getOption('edit_size'),html::escapeHTML($post_content)).
@@ -479,5 +479,5 @@
 		
 		"post_notes" =>
-			'<p class="area" id="notes-area"><label for="post_notes">'.__('Personal notes:').' <span class="form-note">'.
+			'<p class="area" id="notes-area"><label for="post_notes" class="bold">'.__('Personal notes:').' <span class="form-note">'.
 			__('Unpublished notes.').'</span></label>'.
 			form::textarea('post_notes',50,5,html::escapeHTML($post_notes)).
Index: plugins/pings/locales/fr/help/pings.html
===================================================================
--- plugins/pings/locales/fr/help/pings.html	(revision 2322)
+++ plugins/pings/locales/fr/help/pings.html	(revision 2438)
@@ -7,5 +7,7 @@
 
 <h4>Signalements (pings)</h4>
-
+<p><a href="http://fr.wikipedia.org/wiki/Ping_%28blogue%29">Qu'est-ce qu'un service de signalement&nbsp;?</a> (“ping”).</p>
+<p>Pour ajouter un service de signalement, remplissez les champs de nom et d'URI puis cliquez sur le bouton <strong>Enregistrer</strong>.</p>
+<p>Pour supprimer un service, videz les champs nom et URI puis enregistrez.</p>
 </body>
 </html>
Index: plugins/pings/locales/fr/help/pings_post.html
===================================================================
--- plugins/pings/locales/fr/help/pings_post.html	(revision 2322)
+++ plugins/pings/locales/fr/help/pings_post.html	(revision 2423)
@@ -7,5 +7,6 @@
 
 <h4>Signalements (pings)</h4>
-
+<p>Cochez les services que vous souhaitez «&nbsp;pinguer&nbsp;» à la publication du billet.</p>
+<p>Pour ajouter ou supprimer des services de signalement, rendez-vous sur la <a href="plugin.php?p=pings">page d'administration des signalements</a>.</p>
 </body>
 </html>
Index: plugins/simpleMenu/index.php
===================================================================
--- plugins/simpleMenu/index.php	(revision 2495)
+++ plugins/simpleMenu/index.php	(revision 2496)
@@ -350,4 +350,5 @@
 				dcPage::jsLoad('index.php?pf=simpleMenu/simplemenu.js');
 		}
+		echo dcPage::jsConfirmClose('additem','menuitems');
 	?>
 </head>
Index: plugins/simpleMenu/locales/en/help/help.html
===================================================================
--- plugins/simpleMenu/locales/en/help/help.html	(revision 1573)
+++ plugins/simpleMenu/locales/en/help/help.html	(revision 2425)
@@ -6,9 +6,11 @@
 <body>
 
-<p>Simple Menu allows you to display on your blog a single level menu, if your theme supports it.</p>
+<p>Simple Menu allows you to display on your blog a single level menu, if 
+your theme supports it.</p>
 <dl>
   <dt>Menu items list</dt>
   <dd>Here are displayed your menu items. 
-  You can reorder this list by dragging its items upwards or downwards. You can also modify label, description and URL of each item.
+  You can reorder this list by dragging its items upwards or downwards. 
+  You can also modify label, description and URL of each item.
   Once done, clic on "Update menu".</dd>
     
@@ -17,10 +19,18 @@
   
   <dt>Add a new menu item</dt>
-  <dd>First select the type of item. Then clic on "Continue…". Then, if necessary, you may have to define a sub-type (category, page, etc). If so, do it and clic on "Continue…". Then finally you can modify proposals done for label, description (not mandatory) and URL of the menu item. Once done, clic on "Add this item".</dd>
+  <dd>First select the type of item. Then clic on "Continue…". Then, if 
+  necessary, you may have to define a sub-type (category, page, etc). If so, 
+  do it and clic on "Continue…". Then finally you can modify proposals done for 
+  label, description (not mandatory) and URL of the menu item. 
+  Once done, clic on "Add this item".</dd>
   <dd>
     <ul>
-      <li><strong>Label : </strong>Type here the anchor text. For example "Archives". This field is mandatory.</li>
-      <li><strong>Description : </strong>Type here a short description for the menu item (will be displayed under Label depending on theme selected). For example "Archives from 2004 to 2011".</li>
-      <li><strong>URL : </strong>Type here the item's destination. This field is mandatory.</li>
+      <li><strong>Label : </strong>type here the anchor text. For example 
+      "Archives". This field is mandatory.</li>
+      <li><strong>Description : </strong>type here a short description for the menu 
+      item (will be displayed under Label depending on theme selected). For example 
+      "Archives from 2004 to 2011".</li>
+      <li><strong>URL : </strong>type here the item's destination. This field is 
+      mandatory.</li>
 	</ul>
   </dd>
Index: plugins/simpleMenu/locales/fr/help/help.html
===================================================================
--- plugins/simpleMenu/locales/fr/help/help.html	(revision 1956)
+++ plugins/simpleMenu/locales/fr/help/help.html	(revision 2425)
@@ -35,5 +35,5 @@
       pour cet item (sera affiché sous le libellé en fonction du thème sélectionné).
       Par exemple "Archives de 2004 à 2011".</li>
-      <li><strong>URL&nbsp;:</strong> indiquez ici la destination. Ce champs est
+      <li><strong>URL&nbsp;:</strong> indiquez ici la destination. Ce champ est
       obligatoire.</li>
     </ul>
Index: plugins/tags/locales/fr/help/tag_post.html
===================================================================
--- plugins/tags/locales/fr/help/tag_post.html	(revision 2322)
+++ plugins/tags/locales/fr/help/tag_post.html	(revision 2379)
@@ -7,5 +7,10 @@
 
 <h4>Tags</h4>
-
+<p>On peut affecter des mots-clés à un billet&nbsp;:</p>
+<ul>
+	<li>en remplissant le champ <strong>Mots-clés</strong>. Ce champ est doté d'une fonction <em>d'auto-complétion</em>&nbsp;: saisissez les premiers caractères, le système proposera les mots-clés existant déjà sur ce blog et comportant ces lettres ;</li>
+	<li>en cliquant sur le lien <strong>Liste des mots-clés</strong> pour choisir parmi ceux existant déjà sur le blog.</li>
+</ul>
+<p>Les mots-clés doivent être séparés par une virgule.</p>
 </body>
 </html>
Index: plugins/tags/locales/fr/help/tag_posts.html
===================================================================
--- plugins/tags/locales/fr/help/tag_posts.html	(revision 2322)
+++ plugins/tags/locales/fr/help/tag_posts.html	(revision 2379)
@@ -1,10 +1,32 @@
 <html>
 <head>
-  <title>Mot-clé : billets</title>
+  <title>Détails d'un mot-clé</title>
 </head>
 
 <body>
 
-<h4>Mot-clé : billets</h4>
+<h4>Actions sur un mot-clé</h4>
+<p>La première partie de la page permet de modifier ou supprimer un mot-clé.</p>
+<dl>
+	<dt>Renommer</dt>
+	<dd>Indiquer un nouveau terme pour le mot-clé puis cliquer sur le bouton <strong>OK</strong>. La modification de ce terme se répercutera sur tous les billets concernés par ce mot-clé.</dd>
+	<dt>Supprimer ce mot-clé</dt>
+	<dd>Ce bouton enlèvera ce mot-clé de tous les billets concernés et le supprimera de la liste des mots-clés.</dd>
+</dl>
+<h4>Liste des billets avec ce mot-clé</h4>
+<p>Depuis la liste des billets on peut procéder à toutes les actions par lot autorisées en fonction des permissions de l'utilisateur&nbsp;:</p>
+<ul>
+  <li><strong>Publier</strong>&nbsp;: mettre le billet en ligne.</li>
+  <li><strong>Hors ligne</strong>&nbsp;: mettre le billet hors ligne.</li>
+  <li><strong>Programmer</strong>&nbsp;: programmer le billet pour mise en ligne à la date de
+  publication.</li>
+  <li><strong>En attente</strong>&nbsp;: en attente de publication.</li>
+  <li><strong>Changer de catégorie</strong>&nbsp;: envoie sur la liste des catégories pour
+  changer celle des billets sélectionnés.</li>
+  <li><strong>Changer l'auteur</strong>&nbsp;: permet de changer l'auteur du billet en indiquant
+  l'identifiant de l'utilisateur qui deviendra le nouvel auteur.</li>
+  <li><strong>Supprimer</strong>&nbsp;: supprime le billet (cette opération est irréversible).</li>
+</ul>
+<p><em>Il se peut que la liste ci-dessus soit plus longue si d'autres actions possibles ont été ajoutées par des plugins activés sur votre installation.</em></p>
 
 </body>
Index: plugins/tags/locales/fr/help/tags.html
===================================================================
--- plugins/tags/locales/fr/help/tags.html	(revision 2322)
+++ plugins/tags/locales/fr/help/tags.html	(revision 2379)
@@ -6,6 +6,8 @@
 <body>
 
-<h4>Mots-clés</h4>
-
+<h4>Liste des mots-clés</h4>
+<p>Cette page affiche la liste des mots-clés utilisés sur le blog, triés dans l'ordre alphabétique.</p>
+<h5>Détails d'un mot-clé</h5>
+<p>En cliquant sur l'intitulé d'un mot-clé dans la liste on accède à la liste des billets auxquels ce mot-clé a été affecté et à la possibilité de le modifier ou supprimer.</p>
 </body>
 </html>
Index: plugins/tags/tag_posts.php
===================================================================
--- plugins/tags/tag_posts.php	(revision 2322)
+++ plugins/tags/tag_posts.php	(revision 2439)
@@ -12,5 +12,5 @@
 if (!defined('DC_CONTEXT_ADMIN')) { return; }
 
-$tag = (!empty($_REQUEST['tag']) || $_REQUEST['tag'] == '0') ? $_REQUEST['tag'] : '';
+$tag = isset($_REQUEST['tag']) ? $_REQUEST['tag'] : '';
 
 $this_url = $p_url.'&amp;m=tag_posts&amp;tag='.rawurlencode($tag);
@@ -21,5 +21,5 @@
 
 # Rename a tag
-if (!empty($_POST['new_tag_id']) || $_POST['new_tag_id'] == '0')
+if (isset($_POST['new_tag_id']))
 {
 	$new_id = dcMeta::sanitizeMetaID($_POST['new_tag_id']);
@@ -124,15 +124,15 @@
 		echo '</div>';
 	}
-	
+
 	# Show posts
 	echo '<h4 class="vertical-separator pretty-title">'.sprintf(__('List of entries with the tag “%s”'),html::escapeHTML($tag)).'</h4>';
 	$post_list->display($page,$nb_per_page,
 	'<form action="plugin.php" method="post" id="form-entries">'.
-	
+
 	'%s'.
-	
+
 	'<div class="two-cols">'.
 	'<p class="col checkboxes-helpers"></p>'.
-	
+
 	'<p class="col right"><label for="action" class="classic">'.__('Selected entries action:').'</label> '.
 	form::combo('action',$posts_actions_page->getCombo()).
Index: plugins/themeEditor/_admin.php
===================================================================
--- plugins/themeEditor/_admin.php	(revision 1609)
+++ plugins/themeEditor/_admin.php	(revision 2370)
@@ -53,5 +53,5 @@
 		'<p><label for="colorsyntax" class="classic">'.
 		form::checkbox('colorsyntax',1,$core->auth->user_prefs->interface->colorsyntax).'</label>'.
-		__('Syntax color for theme editor').
+		__('Syntax highlighting in theme editor').
 		'</p>';
 	}
Index: plugins/themeEditor/help.html
===================================================================
--- plugins/themeEditor/help.html	(revision 989)
+++ 	(revision )
@@ -1,30 +1,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<html>
-<head>
-  <title>Theme Editor</title>
-</head>
-
-<body>
-<p>The Theme Editor lets you modify the template files, the stylesheets and the JavaScript files of the theme you are currently using.</p>
-
-<p>The file list is divided in three sections&nbsp;:</p>
-<ul>
-  <li>Template files : the templates</li>
-  <li>CSS files : the stylesheets</li>
-  <li>JavaScript files</li>
-</ul>
-
-<p>The yellow bullet in front of the name of a file indicates that this file is part of the theme. The red bullet means it is a part of the parent theme. The black bullet means it is a part of the "default" theme.</p>
-
-<p>If you modify a file belonging to the "default" theme, it will be copied into the theme you are currently using.</p>
-
-<p>To edit a file, click on its name to display its content in the edition area. If the file can be written, you will be able to save your modifications by ckicking on "save".</p>
-
-<p>The modifications are applied immediately after saving, so be careful.</p>
-
-<p>To help modify your templates, you may consult the <a href="http://doc.dotclear.net/2.0/resources/templates">template tag list</a>.</p>
-
-<p>Note: You can activate syntax coloration in your preferences (“My options” tab).</p>
-
-</body>
-</html>
Index: plugins/themeEditor/locales/en/help/help.html
===================================================================
--- plugins/themeEditor/locales/en/help/help.html	(revision 2368)
+++ plugins/themeEditor/locales/en/help/help.html	(revision 2368)
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<html>
+<head>
+  <title>Theme Editor</title>
+</head>
+
+<body>
+<p>The Theme Editor lets you modify the template files, the stylesheets and the JavaScript files of the theme you are currently using.</p>
+
+<p>The file list is divided in three sections&nbsp;:</p>
+<ul>
+  <li>Template files : the templates</li>
+  <li>CSS files : the stylesheets</li>
+  <li>JavaScript files</li>
+</ul>
+
+<p>The yellow bullet in front of the name of a file indicates that this file is part of the theme. The red bullet means it is a part of the parent theme. The black bullet means it is a part of the "default" theme.</p>
+
+<p>If you modify a file belonging to the "default" theme, it will be copied into the theme you are currently using.</p>
+
+<p>To edit a file, click on its name to display its content in the edition area. If the file can be written, you will be able to save your modifications by ckicking on "save".</p>
+
+<p>The modifications are applied immediately after saving, so be careful.</p>
+
+<p>To help modify your templates, you may consult the <a href="http://doc.dotclear.net/2.0/resources/templates">template tag list</a>.</p>
+
+<p>Note: You can activate syntax coloration in your preferences (“My options” tab).</p>
+
+</body>
+</html>
Index: plugins/themeEditor/locales/en/resources.php
===================================================================
--- plugins/themeEditor/locales/en/resources.php	(revision 2368)
+++ plugins/themeEditor/locales/en/resources.php	(revision 2368)
@@ -0,0 +1,16 @@
+<?php
+# -- BEGIN LICENSE BLOCK ---------------------------------------
+#
+# This file is part of Dotclear 2.
+#
+# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Licensed under the GPL version 2.0 license.
+# See LICENSE file or
+# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+#
+# -- END LICENSE BLOCK -----------------------------------------
+
+if (!isset($__resources['help']['themeEditor']))
+{
+	$__resources['help']['themeEditor'] = dirname(__FILE__).'/help/help.html';
+}
Index: plugins/themeEditor/locales/fr/help/help.html
===================================================================
--- plugins/themeEditor/locales/fr/help/help.html	(revision 2433)
+++ plugins/themeEditor/locales/fr/help/help.html	(revision 2433)
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<html>
+<head>
+  <title>Éditeur de thème</title>
+</head>
+
+<body>
+<h4>Éditeur de thème</h4>
+<p>L'éditeur de thème vous permet de modifier les différents fichiers du  thème actif.</p>
+
+<p>La colonne de droite listent les fichiers, ils sont groupés en quatre types&nbsp;:</p>
+<ul>
+  <li>fichiers du thème&nbsp;: les templates,</li>
+  <li>fichiers CSS&nbsp;: les feuilles de style,</li>
+  <li>fichiers JavaScript.</li>
+  <li>fichiers de traduction.</li>
+</ul>
+
+<p>A la gauche de chaque fichier, chaque puce se voit attribuée une couleur :</p>
+<ul>
+<li><b>noire</b> indique qu'il se trouve dans le thème "default".</li>
+<li><b>jaune</b> indique qu'il fait partie du thème actif.</li> 
+<li><b>rouge</b> indique qu'il fait partie d'un thème parent.</li>
+</ul>
+
+<h4>Modification des fichiers</h4>
+<p>Pour modifier un fichier, cliquez sur son nom, le contenu s'affichera alors
+dans la zone d'édition. Si le fichier peut-être écrit vous pourrez sauvegarder
+celui-ci en cliquant sur le bouton "Enregistrer".</p>
+
+<p>Les modifications sont immédiatement appliquées lors de la sauvegarde, soyez vigilants.</p>
+
+<p>A noter que si vous modifiez un fichier se trouvant dans le thème "default", celui-ci sera copié dans votre thème en cours d'utilisation.</p>
+
+<h4>Coloration syntaxique</h4>
+<p>Notez que vous pouvez activer la coloration syntaxique dans <a href="preferences.php#user-options">vos préférences</a>
+(onglet « Mes options »).</p>
+
+<h4>Allez plus loin…</h4>
+<p>Pour éditer vos templates, n'hésitez pas à consultez la
+<a href="http://doc.dotclear.net/2.0/resources/templates">liste des marqueurs
+de template</a>.</p>
+
+</body>
+</html>
Index: plugins/themeEditor/locales/fr/resources.php
===================================================================
--- plugins/themeEditor/locales/fr/resources.php	(revision 2368)
+++ plugins/themeEditor/locales/fr/resources.php	(revision 2368)
@@ -0,0 +1,16 @@
+<?php
+# -- BEGIN LICENSE BLOCK ---------------------------------------
+#
+# This file is part of Dotclear 2.
+#
+# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Licensed under the GPL version 2.0 license.
+# See LICENSE file or
+# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+#
+# -- END LICENSE BLOCK -----------------------------------------
+
+if (!isset($__resources['help']['themeEditor']))
+{
+	$__resources['help']['themeEditor'] = dirname(__FILE__).'/help/help.html';
+}
Index: plugins/userPref/locales/fr/help/help.html
===================================================================
--- plugins/userPref/locales/fr/help/help.html	(revision 2322)
+++ plugins/userPref/locales/fr/help/help.html	(revision 2438)
@@ -1,11 +1,18 @@
 <html>
-<head>
-  <title>User:preferences</title>
-</head>
-
-<body>
-
-<h4>User:preferences</h4>
-
-</body>
+  <head>
+    <title>User:preferences</title>
+  </head>
+  
+  <body>    
+    <h4>User:preferences</h4>
+    <p>Cette page présente des informations <em>techniques</em> 
+      brutes généralement gérées par d'autres pages.<br />
+      Ne modifiez quelque chose que si vous savez ce que vous faîtes.</p>
+    <p>Par exemple le paramètre <em>nodragdrop</em> se configure sur la page 
+      "Mes préférences" dans <a href="preferences.php#user-options">l'onglet "Mes options"</a>.</p>
+    <p>La page présente deux onglets "Préférences utilisateurs" et "Préférences globales"
+      qui permettent de gérer (et présenter) respectivement vos préférences et 
+      celles communes à tous les utilisateurs.</p>
+    <p>Vous pouvez accéder directement aux différentes sections de la page avec le menu de sélection.</p>
+  </body>
 </html>
Index: plugins/widgets/class.widgets.php
===================================================================
--- plugins/widgets/class.widgets.php	(revision 2412)
+++ plugins/widgets/class.widgets.php	(revision 2442)
@@ -232,5 +232,5 @@
 		foreach ($this->settings as $id => $s)
 		{
-			$res .= $this->formSetting($id,$s,$pr,$i=0);
+			$res .= $this->formSetting($id,$s,$pr,$i);
 			$i++;
 		}
@@ -285,5 +285,4 @@
 				break;
 		}
-		
 		return $res;
 	}
Index: plugins/widgets/index.php
===================================================================
--- plugins/widgets/index.php	(revision 2495)
+++ plugins/widgets/index.php	(revision 2496)
@@ -212,7 +212,5 @@
 <head>
   <title><?php echo __('Widgets'); ?></title>
-  <style type="text/css">
-  <?php echo file_get_contents(dirname(__FILE__).'/style.css'); ?>
-  </style>
+  <link type="text/css" rel="stylesheet" href="index.php?pf=widgets/style.css"/>
   <?php
 		echo
@@ -268,5 +266,5 @@
 echo
 '</ul>'.
-$core->formNonce().
+'<p>'.$core->formNonce().'</p>'.
 '<p class="remove-if-drag"><input type="submit" name="append" value="'.__('Add widgets to sidebars').'" /></p>'.
 '</form>';
@@ -299,24 +297,5 @@
 
 $widget_elements = new stdClass;
-$widget_elements->content =
-'<h4>'.__('Use of widgets').'</h4>'.
-'<p>'.__('Widgets may be used to add various blocks of content to be displayed on your public pages. To add a widget, '.
-'drag it from the Available widgets list on the left to one of the sidebars on the right of this page. You can order '.
-'your widgets in a sidebar by dragging them up or down. You must update sidebars to apply your changes.').'</p>'.
-'<p>'.__('Once included in a sidebar, widgets have configuration options that you can reach by clicking on the arrow next '.
-'to their name.').'</p>'.
-'<p>'.__('Reset sidebars to get back to default widgets installation.').'</p>'.
-'<h4>'.__('Widget templates tags').'</h4>'.
-'<div id="widgets-tpl">'.
-'<p>'.__('If you are allowed to edit your theme templates, you can directly add widgets as '.
-'templates tags, with their own configuration.').'</p>'.
-'<p>'.__('To add a widget in your template, you need to write code like this:').'</p>'.
-'<pre>&lt;tpl:Widget id="<strong>'.__('Widget ID').'</strong>"&gt;
-  &lt;setting name="<strong>'.__('Setting name').'</strong>"&gt;<strong>'.__('Setting value').'</strong>&lt;/setting&gt;
-  ...
-&lt;/tpl:Widget&gt;</pre>'.
-'<p>'.__('Here are the following available widgets for your blog:').'</p>';
-
-$widget_elements->content .= '<dl>';
+$widget_elements->content = '<dl>';
 foreach ($__widgets->elements() as $w)
 {
@@ -364,5 +343,5 @@
 $widget_elements->content .= '</dl></div>';
 
-dcPage::helpBlock($widget_elements);
+dcPage::helpBlock('widgets',$widget_elements);
 
 function sidebarWidgets($id,$title,$widgets,$pr,$default_widgets,&$j)
@@ -382,7 +361,9 @@
 	foreach ($widgets->elements() as $w)
 	{
-		$upDisabled = $i == 0 ? '" disabled="" src="images/disabled_' : '" src="images/';
-		$downDisabled = $i == count($widgets->elements())-1 ? '" disabled="" src="images/disabled_' : '" src="images/';
-
+		$upDisabled = $i == 0 ? ' disabled" src="images/disabled_' : '" src="images/';
+		$downDisabled = $i == count($widgets->elements())-1 ? ' disabled" src="images/disabled_' : '" src="images/';
+		$altUp = $i == 0 ? ' alt=""' : ' alt="'.__('Up the widget').'"';
+		$altDown = $i == count($widgets->elements())-1 ? ' alt=""' : ' alt="'.__('Down the widget').'"';
+		
 		$iname = 'w['.$pr.']['.$i.']';
 
@@ -393,7 +374,7 @@
 		($w->desc() != '' ? ' <span class="form-note">'.__($w->desc()).'</span>' : '').
 		'<span class="toolsWidget remove-if-drag">'.
-		'<input type="image" class="upWidget'.$upDisabled.'up.png" name="'.$iname.'[_up]" value="'.__('Up the widget').'" />'.
-		'<input type="image" class="downWidget'.$downDisabled.'down.png" name="'.$iname.'[_down]" value="'.__('Down the widget').'" />'.' '.
-		'<input type="image" class="removeWidget" src="images/trash.png" name="'.$iname.'[_rem]" value="'.__('Remove widget').'" />'.
+		'<input type="image" class="upWidget'.$upDisabled.'up.png" name="'.$iname.'[_up]" value="'.__('Up the widget').'"'.$altUp.' /> '.
+		'<input type="image" class="downWidget'.$downDisabled.'down.png" name="'.$iname.'[_down]" value="'.__('Down the widget').'"'.$altDown.' /> '.' '.
+		'<input type="image" class="removeWidget" src="images/trash.png" name="'.$iname.'[_rem]" value="'.__('Remove widget').'" alt="'.__('Remove the widget').'" />'.
 		'</span>'.
 		'<br class="clear"/></p>'.
Index: plugins/widgets/locales/en/help/help.html
===================================================================
--- plugins/widgets/locales/en/help/help.html	(revision 2375)
+++ plugins/widgets/locales/en/help/help.html	(revision 2375)
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<html>
+<head>
+  <title>Widgets</title>
+</head>
+
+<body>
+<h4>Use of widgets</h4>
+
+<p>Widgets may be used to add various blocks of content to be displayed on your public pages. To add a widget, drag it from the Available widgets list on the left to one of the sidebars on the right of this page. You can order your widgets in a sidebar by dragging them up or down. You must update sidebars to apply your changes.</p>
+
+<p>Once included in a sidebar, widgets have configuration options that you can reach by clicking on the arrow next to their name.</p>
+
+<p>Reset sidebars to get back to default widgets installation</p>
+
+<h4>Widget templates tags</h4>
+
+<div id="widgets-tpl">
+
+<p>If you are allowed to edit your theme templates, you can directly add widgets as templates tags, with their own configuration.</p>
+
+<p>To add a widget in your template, you need to write code like this:</p>
+
+<pre>
+&lt;tpl:Widget id="<strong>Widget ID</strong>"&gt;
+  &lt;setting name="<strong>Setting name</strong>"&gt;<strong>Setting value</strong>&lt;/setting&gt;
+  ...
+&lt;/tpl:Widget&gt;
+</pre>
+
+<p>Here are the following available widgets for your blog:</p><!-- the widgets and their descriptions are automatically inserted here -->
+
+</body>
+</html>
Index: plugins/widgets/locales/en/resources.php
===================================================================
--- plugins/widgets/locales/en/resources.php	(revision 2375)
+++ plugins/widgets/locales/en/resources.php	(revision 2375)
@@ -0,0 +1,16 @@
+<?php
+# -- BEGIN LICENSE BLOCK ---------------------------------------
+#
+# This file is part of Dotclear 2.
+#
+# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Licensed under the GPL version 2.0 license.
+# See LICENSE file or
+# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+#
+# -- END LICENSE BLOCK -----------------------------------------
+
+if (!isset($__resources['help']['widgets']))
+{
+	$__resources['help']['widgets'] = dirname(__FILE__).'/help/help.html';
+}
Index: plugins/widgets/locales/fr/help/help.html
===================================================================
--- plugins/widgets/locales/fr/help/help.html	(revision 2426)
+++ plugins/widgets/locales/fr/help/help.html	(revision 2426)
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<html>
+<head>
+  <title>Widgets</title>
+</head>
+
+<body>
+<h4>Utilisation des widgets</h4>
+
+<p>Les widgets sont utilisés pour ajouter des blocs de contenus divers dans vos pages publiques. Pour ajouter un widget, faites-le glisser depuis la liste des widgets disponibles à gauche jusqu'à l'un des volets sur la droite de la page. Vous pouvez ré-ordonner vos widgets dans un volet ou entre les volets en le faisant glisser vers le haut ou vers le bas.</p>
+
+<p>Une fois inclus dans un volet, les widgets ont généralement des options que vous pouvez configurer. Cliquez sur la flèche à côté de leur nom pour y accéder.</p>
+
+<p>Pour supprimer un widget, il suffit de le faire glisser dans une des zones prévues à cet effet.</p>
+
+<p>À chaque changement (ajout, paramétrage, déplacement, suppression), vous devez mettre à jour les volets pour enregistrer les modifications.</p>
+
+<p>Réinitialisez les volets pour retrouver les widgets par défaut de votre installation.</p>
+
+<h4>Balises de widget</h4>
+
+<div id="widgets-tpl">
+
+<p>Si vous êtes autorisé à modifier vos fichiers de thème, vous pouvez ajouter des widgets sous forme de balise, avec leur propre configuration.</p>
+
+<p>Pour ajouter un widget à votre thème, vous devez insérer un code similaire à :</p>
+
+<pre>
+&lt;tpl:Widget id="<strong>ID du widget</strong>"&gt;
+  &lt;setting name="<strong>Nom de l'élément de réglage</strong>"&gt;<strong>Valeur de l'élément de réglage</strong>&lt;/setting&gt;
+  ...
+&lt;/tpl:Widget&gt;
+</pre>
+
+<p>Voici les widgets disponibles pour votre blog :</p><!-- les widgets et leur descriptions sont automatiquement insérés ici -->
+
+</body>
+</html>
Index: plugins/widgets/locales/fr/resources.php
===================================================================
--- plugins/widgets/locales/fr/resources.php	(revision 2375)
+++ plugins/widgets/locales/fr/resources.php	(revision 2375)
@@ -0,0 +1,16 @@
+<?php
+# -- BEGIN LICENSE BLOCK ---------------------------------------
+#
+# This file is part of Dotclear 2.
+#
+# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Licensed under the GPL version 2.0 license.
+# See LICENSE file or
+# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+#
+# -- END LICENSE BLOCK -----------------------------------------
+
+if (!isset($__resources['help']['widgets']))
+{
+	$__resources['help']['widgets'] = dirname(__FILE__).'/help/help.html';
+}
Index: plugins/widgets/style.css
===================================================================
--- plugins/widgets/style.css	(revision 2401)
+++ plugins/widgets/style.css	(revision 2442)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2013 Olivier Meunier and Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
@@ -16,5 +16,5 @@
 #sidebarsWidgets {
 	float: left;
-	width: 47%;
+	width: 49%;
 	margin: 0 0 0 1%;
 	padding: 0 1%;
@@ -118,5 +118,5 @@
 #listWidgets {
 	float: left;
-	width: 46%;
+	width: 49%;
 	background: #eee;
 	padding: 1.5em 1% 0; 
@@ -156,5 +156,7 @@
 	display: none;
 }
-
+.removeWidget {
+	margin-left: 1em;
+}
 /* ------------------------------------------------------------- help */
 #widgets-tpl dt {
