diff --git a/README.md b/README.md
index cf417a3..f70e342 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,22 @@
-# topWriter
-Classement des plus prolifiques rédacteurs et/ou commentateurs
+# README
+
+## WHAT IS POSTINFOWIDGET ?
+
+postInfoWidget "Entry information list" is a plugin for the open-source
+web publishing software called Dotclear.
+
+Show entry details in a widget.
+
+## REQUIREMENTS
+
+ postInfoWidget requires:
+
+ * permissions to manage widgets
+ * Dotclear 2.6
+
+## USAGE
+
+First install postInfoWidget, manualy from a zip package or from
+Dotaddict repository. (See Dotclear's documentation to know how do this)
+
+Add and configure "Entry information list" from widgets manager.
diff --git a/_admin.php b/_admin.php
new file mode 100644
index 0000000..5e05a70
--- /dev/null
+++ b/_admin.php
@@ -0,0 +1,19 @@
+registerModule(
+ /* Name */
+ "topWriter",
+ /* Description*/
+ "Ranking of the most prolific writers and/or commentators",
+ /* Author */
+ "Jean-Christian Denis, Pierre Van Glabeke",
+ /* Version */
+ '0.7',
+ array(
+ 'permissions' => 'admin',
+ 'type' => 'plugin',
+ 'dc_min' => '2.6',
+ 'support' => 'http://forum.dotclear.org/viewtopic.php?pid=333002#p333002',
+ 'details' => 'http://plugins.dotaddict.org/dc2/details/topWriter'
+ )
+);
\ No newline at end of file
diff --git a/_public.php b/_public.php
new file mode 100644
index 0000000..8d3fcca
--- /dev/null
+++ b/_public.php
@@ -0,0 +1,19 @@
+addBehavior('initWidgets', array('topWriterWidget', 'init'));
+
+class topWriterWidget
+{
+ public static function init($w)
+ {
+ #Top comments widget
+ $w->create(
+ 'topcom',
+ __('Top Writer: top comments'),
+ array('topWriterWidget', 'topCom'),
+ null,
+ __('List users who write more comments')
+ );
+ $w->topcom->setting(
+ 'title',
+ __('Title:'),
+ __('Top comments'),
+ 'text'
+ );
+ $w->topcom->setting(
+ 'text',
+ __('Text:'),
+ '%author% (%count%)',
+ 'text'
+ );
+ $w->topcom->setting(
+ 'period',
+ __('Period:'),
+ 'year',
+ 'combo',
+ array(
+ __('day') => 'day',
+ __('week') => 'week',
+ __('month') => 'month',
+ __('year') => 'year',
+ __('from begining') => ''
+ )
+ );
+ $w->topcom->setting(
+ 'sort',
+ __('Sort:'),
+ 'desc',
+ 'combo',
+ array(
+ __('Ascending') => 'asc',
+ __('Descending') => 'desc'
+ )
+ );
+ $w->topcom->setting(
+ 'limit',
+ __('Limit:'),
+ '10',
+ 'text'
+ );
+ $w->topcom->setting(
+ 'exclude',
+ __('Exclude post writer from list'),
+ 0,
+ 'check'
+ );
+ $w->topcom->setting(
+ 'homeonly',
+ __('Display on:'),
+ 0,
+ 'combo',
+ array(
+ __('All pages') => 0,
+ __('Home page only') => 1,
+ __('Except on home page') => 2
+ )
+ );
+ $w->topcom->setting('content_only',__('Content only'),0,'check');
+ $w->topcom->setting('class',__('CSS class:'),'');
+ $w->topcom->setting('offline',__('Offline'),0,'check');
+
+ #Top entries widget
+ $w->create(
+ 'toppost',
+ __('Top Writer: top entries'),
+ array('topWriterWidget', 'topPost'),
+ null,
+ __('List users who write more posts')
+ );
+ $w->toppost->setting(
+ 'title',
+ __('Title:'),
+ __('Top entries'),
+ 'text'
+ );
+ $w->toppost->setting(
+ 'text',
+ __('Text:'),
+ '%author% (%count%)',
+ 'text'
+ );
+ $w->toppost->setting(
+ 'period',
+ __('Period:'),
+ 'year',
+ 'combo',
+ array(
+ __('day') => 'day',
+ __('week') => 'week',
+ __('month') => 'month',
+ __('year') => 'year',
+ __('from begining') => ''
+ )
+ );
+ $w->toppost->setting(
+ 'sort',
+ __('Sort:'),'desc',
+ 'combo',
+ array(
+ __('Ascending') => 'asc',
+ __('Descending') => 'desc'
+ )
+ );
+ $w->toppost->setting(
+ 'limit',
+ __('Limit:'),
+ '10',
+ 'text'
+ );
+ $w->toppost->setting(
+ 'homeonly',
+ __('Display on:'),
+ 0,
+ 'combo',
+ array(
+ __('All pages') => 0,
+ __('Home page only') => 1,
+ __('Except on home page') => 2
+ )
+ );
+ $w->toppost->setting('content_only',__('Content only'),0,'check');
+ $w->toppost->setting('class',__('CSS class:'),'');
+ $w->toppost->setting('offline',__('Offline'),0,'check');
+ }
+
+ public static function topCom($w)
+ {
+ global $core;
+
+ if ($w->offline)
+ return;
+
+ if ($w->homeonly == 1 && $core->url->type != 'default'
+ || $w->homeonly == 2 && $core->url->type == 'default'
+ ) {
+ return null;
+ }
+
+ $req =
+ 'SELECT COUNT(*) AS count, comment_email '.
+ "FROM ".$core->prefix."post P, ".$core->prefix."comment C ".
+ 'WHERE P.post_id=C.post_id '.
+ "AND blog_id='".$core->con->escape($core->blog->id)."' ".
+ 'AND post_status=1 AND comment_status=1 '.
+ self::period('comment_dt',$w->period);
+
+ if ($w->exclude) {
+ $req .=
+ 'AND comment_email NOT IN ('.
+ ' SELECT U.user_email '.
+ ' FROM '.$core->prefix.'user U'.
+ ' INNER JOIN '.$core->prefix.'post P ON P.user_id = U.user_id '.
+ " WHERE blog_id='".$core->con->escape($core->blog->id)."' ".
+ ' GROUP BY U.user_email) ';
+ }
+
+ $req .=
+ 'GROUP BY comment_email '.
+ 'ORDER BY count '.($w->sort == 'asc' ? 'ASC' : 'DESC').' '.
+ $core->con->limit(abs((integer) $w->limit));
+
+ $rs = $core->con->select($req);
+
+ if ($rs->isEmpty()) {
+
+ return null;
+ }
+
+ $content = '';
+ $i = 0;
+ while($rs->fetch()) {
+ $user = $core->con->select(
+ "SELECT * FROM ".$core->prefix."comment ".
+ "WHERE comment_email='".$rs->comment_email."' ".
+ 'ORDER BY comment_dt DESC'
+ );
+
+ if (!$user->comment_author) {
+ continue;
+ }
+
+ $i++;
+ $rank = '';
+
+ if ($user->comment_site) {
+ $author = ''.$user->comment_author.'';
+ }
+ else {
+ $author = $user->comment_author;
+ }
+ $author = '';
+
+ if ($rs->count == 0) {
+ $count = __('no comment');
+ }
+ else {
+ $count = sprintf(__('one comment', '%s comments', $rs->count), $rs->count);
+ }
+
+ $content .= '
'.str_replace(
+ array('%rank%', '%author%', '%count%'),
+ array($rank, $author, $count),
+ $w->text
+ ).'';
+ }
+
+ if ($i < 1) {
+
+ return null;
+ }
+
+ $res =
+ ($w->title ? $w->renderTitle(html::escapeHTML($w->title)) : '').
+ '';
+
+ return $w->renderDiv($w->content_only,'topcomments '.$w->class,'',$res);
+ }
+
+ public static function topPost($w)
+ {
+ global $core;
+
+ if ($w->offline)
+ return;
+
+ if ($w->homeonly == 1 && $core->url->type != 'default'
+ || $w->homeonly == 2 && $core->url->type == 'default'
+ ) {
+ return null;
+ }
+
+ $rs = $core->con->select(
+ 'SELECT COUNT(*) AS count, U.user_id '.
+ "FROM ".$core->prefix."post P ".
+ 'INNER JOIN '.$core->prefix.'user U ON U.user_id = P.user_id '.
+ "WHERE blog_id='".$core->con->escape($core->blog->id)."' ".
+ 'AND post_status=1 AND user_status=1 '.
+ self::period('post_dt',$w->period).
+ 'GROUP BY U.user_id '.
+ 'ORDER BY count '.($w->sort == 'asc' ? 'ASC' : 'DESC').', U.user_id ASC '.
+ $core->con->limit(abs((integer) $w->limit)));
+
+ if ($rs->isEmpty()) {
+
+ return null;
+ }
+
+ $content = '';
+ $i = 0;
+ while($rs->fetch()) {
+ $user = $core->con->select(
+ "SELECT * FROM ".$core->prefix."user WHERE user_id='".$rs->user_id."' "
+ );
+
+ $author = dcUtils::getUserCN($user->user_id,$user->user_name,
+ $user->user_firstname,$user->user_displayname);
+
+ if (empty($author)) {
+ continue;
+ }
+
+ $i++;
+ $rank = ''.$i.'';
+
+ $core->blog->settings->addNamespace('authormode');
+ if ($core->blog->settings->authormode->authormode_active) {
+ $author = 'user_id.'" '.
+ 'title="'.__('Author posts').'">'.$author.'';
+ }
+ elseif ($user->user_url) {
+ $author = ''.$author.'';
+ }
+ $author = ''.$author.'';
+
+ if ($rs->count == 0) {
+ $count = __('no post');
+ }
+ else {
+ $count = sprintf(__('one post', '%s posts', $rs->count), $rs->count);
+ }
+
+ $content .= ''.str_replace(
+ array('%rank%', '%author%', '%count%'),
+ array($rank, $author, $count),
+ $w->text
+ ).'';
+ }
+
+ if ($i < 1) {
+
+ return null;
+ }
+
+ $res =
+ ($w->title ? $w->renderTitle(html::escapeHTML($w->title)) : '').
+ '';
+
+ return $w->renderDiv($w->content_only,'topentries '.$w->class,'',$res);
+ }
+
+ private static function period($t,$p)
+ {
+ $pat = '%Y-%m-%d %H:%M:%S';
+ switch($p) {
+ case 'day':
+
+ return
+ "AND $t > TIMESTAMP '".dt::str($pat, time() - 3600*24)."' ";
+ break;
+
+ case 'week':
+
+ return
+ "AND $t > TIMESTAMP '".dt::str($pat, time() - 3600*24*7)."' ";
+ break;
+
+ case 'month':
+
+ return
+ "AND $t > TIMESTAMP '".dt::str($pat, time() - 3600*24*30)."' ";
+ break;
+
+ case 'year':
+
+ return
+ "AND $t > TIMESTAMP '".dt::str($pat, time() - 3600*24*30*12)."' ";
+ break;
+ }
+
+ return '';
+ }
+}
\ No newline at end of file
diff --git a/changelog b/changelog
new file mode 100644
index 0000000..f85f83f
--- /dev/null
+++ b/changelog
@@ -0,0 +1,25 @@
+topWriter x.x - xxxx-xx-xx
+ * literal rank of writer depending of num of com
+
+topWriter 0.7 - 25-04-2015 - Pierre Van Glabeke
+ * Modification url support
+
+topWriter 0.6 - 23-01-2015 - Pierre Van Glabeke
+ * Modifications locales pour widget
+
+topWriter 0.5 - 19-01-2015 - Pierre Van Glabeke
+ * Compatibilité dc2.7
+
+topWriter 0.4 - 2013-11-12
+ * Switch to Dotclear 2.6
+ * Add widget options
+ * Use plural forms
+
+topWriter 0.3 - 2010-10-06
+ * Switched to DC 2.2
+ * Fixed list order (thanks to Atv')
+
+topWriter 0.2 - 2009-08-10
+ * Fixed php 5.3 compatibility
+ * Fixed PostGreSQL compatibility
+ * Added option to exclude post authors from comment list
\ No newline at end of file
diff --git a/locales/fr/main.po b/locales/fr/main.po
new file mode 100644
index 0000000..75c40f3
--- /dev/null
+++ b/locales/fr/main.po
@@ -0,0 +1,101 @@
+msgid ""
+msgstr ""
+"Content-Type: text/plain; charset=UTF-8\n"
+"Project-Id-Version: topWriter 0.4\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2013-11-12T17:15:44+00:00\n"
+"Last-Translator: Jean-Christian Denis\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: _widgets.php:26
+msgid "Top Writer: top comments"
+msgstr "Top Writer : top commentaires"
+
+#: _widgets.php:34
+msgid "Top comments"
+msgstr "Top commentaires"
+
+#: _widgets.php:29
+msgid "List users who write more posts"
+msgstr "Liste les utilisateurs qui ont écrit le plus de billets"
+
+#: _widgets.php:45
+#: _widgets.php:122
+msgid "Period:"
+msgstr "Période :"
+
+#: _widgets.php:49
+#: _widgets.php:126
+msgid "day"
+msgstr "jour"
+
+#: _widgets.php:50
+#: _widgets.php:127
+msgid "week"
+msgstr "semaine"
+
+#: _widgets.php:51
+#: _widgets.php:128
+msgid "month"
+msgstr "mois"
+
+#: _widgets.php:52
+#: _widgets.php:129
+msgid "year"
+msgstr "année"
+
+#: _widgets.php:53
+#: _widgets.php:130
+msgid "from begining"
+msgstr "depuis le début"
+
+#: _widgets.php:68
+#: _widgets.php:144
+msgid "Limit:"
+msgstr "Limite :"
+
+#: _widgets.php:74
+msgid "Exclude post writer from list"
+msgstr "Exclure de la liste les auteurs de billets"
+
+#: _widgets.php:99
+msgid "Top Writer: top entries"
+msgstr "Top Writer : top billets"
+
+#: _widgets.php:111
+msgid "Top entries"
+msgstr "Top billets"
+
+#: _widgets.php:106
+msgid "List users who write more comments"
+msgstr "Liste les utilisateurs qui ont écrit le plus de commentaires"
+
+#: _widgets.php:230
+#: _widgets.php:318
+msgid "Author link"
+msgstr "Lien vers l'auteur"
+
+#: _widgets.php:244
+msgid "one comment"
+msgid_plural "%s comments"
+msgstr[0] "un commentaire"
+msgstr[1] "%s commentaires"
+
+#: _widgets.php:314
+msgid "Author posts"
+msgstr "Billets de l'auteur"
+
+#: _widgets.php:323
+msgid "no post"
+msgstr "pas de billet"
+
+#: _widgets.php:326
+msgid "one post"
+msgid_plural "%s posts"
+msgstr[0] "un billet"
+msgstr[1] "%s billets"
+
+msgid "Ranking of the most prolific writers and/or commentators"
+msgstr "Classement des plus prolifiques rédacteurs et/ou commentateurs"