From 02a4cb04321cdbe1514d63230f7c5a0566a7d29d Mon Sep 17 00:00:00 2001
From: =?utf8?q?Beno=C3=AEt=20Pin?= <benoit.pin@gmail.com>
Date: Sun, 19 Jan 2014 10:55:24 +0100
Subject: [PATCH] =?utf8?q?Il=20est=20maintenant=20possible=20d=E2=80=99ent?=
 =?utf8?q?rer=20son=20adresse=20email=20pour=20la=20r=C3=A9initialisation?=
 =?utf8?q?=20de=20mot=20de=20passe.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=utf8
Content-Transfer-Encoding: 8bit

---
 RegistrationTool.py                           |  11 ++
 locales/en/LC_MESSAGES/plinn.mo               | Bin 2348 -> 2348 bytes
 locales/en/LC_MESSAGES/plinn.po               | 123 +++++++++-----
 locales/fr/LC_MESSAGES/plinn.mo               | Bin 40619 -> 41715 bytes
 locales/fr/LC_MESSAGES/plinn.po               | 151 ++++++++++++------
 locales/plinn.pot                             | 124 +++++++++-----
 skins/custom_generic/login_form.pt            |   4 +-
 .../request_password_reset_template.pt        |   5 +-
 8 files changed, 291 insertions(+), 127 deletions(-)

diff --git a/RegistrationTool.py b/RegistrationTool.py
index 1417f30..bddd44b 100644
--- a/RegistrationTool.py
+++ b/RegistrationTool.py
@@ -32,8 +32,10 @@ from AccessControl.Permission import Permission
 from BTrees.OOBTree import OOBTree
 from Products.CMFCore.permissions import ManagePortal, AddPortalMember
 from Products.CMFCore.exceptions import AccessControl_Unauthorized
+from Products.CMFDefault.exceptions import EmailAddressInvalid
 from Products.CMFCore.utils import getToolByName
 from Products.CMFCore.utils import getUtilityByInterfaceName
+from Products.CMFDefault.utils import checkEmailAddress
 from Products.GroupUserFolder.GroupsToolPermissions import ManageGroups
 from Products.Plinn.utils import Message as _
 from Products.Plinn.utils import translate
@@ -200,6 +202,15 @@ class RegistrationTool(BaseRegistrationTool) :
         self.clearExpiredPasswordResetRequests()
         mtool = getUtilityByInterfaceName('Products.CMFCore.interfaces.IMembershipTool')
         member = mtool.getMemberById(userid)
+        if not member :
+            try :
+                checkEmailAddress(userid)
+                member = mtool.searchMembers('email', userid)
+                if member :
+                    userid = member[0]['username']
+                    member = mtool.getMemberById(userid)
+            except EmailAddressInvalid :
+                pass
         if member :
             uuid = str(uuid4())
             while self._passwordResetRequests.has_key(uuid) :
diff --git a/locales/en/LC_MESSAGES/plinn.mo b/locales/en/LC_MESSAGES/plinn.mo
index 5be7fed0759d868a854f1dfb9bf07487e716e388..1dd78a1639100546fb358d4e6092ba86186bc007 100644
GIT binary patch
delta 37
scmZ1@v_@!yGn+(kX`X^tVxEGbrGlY>m5HU5sgZ(_fuYIfXts+?0LqsN9smFU

delta 37
scmZ1@v_@!yGn+(6MyY~dewl)ig@U26m4T&|k*R`_fuZr{Xts+?0L)+tF#rGn

diff --git a/locales/en/LC_MESSAGES/plinn.po b/locales/en/LC_MESSAGES/plinn.po
index 8a1cd66..df0b49d 100644
--- a/locales/en/LC_MESSAGES/plinn.po
+++ b/locales/en/LC_MESSAGES/plinn.po
@@ -1,7 +1,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: Plinn 2.0\n"
-"POT-Creation-Date: Thu Nov 28 13:09:25 2013\n"
+"POT-Creation-Date: Sun Jan 19 10:49:52 2014\n"
 "PO-Revision-Date: 2013-11-28 13:12+0100\n"
 "Last-Translator:  Benoît PIN\n"
 "Language-Team: CRI http://cri.ensmp.fr\n"
@@ -20,31 +20,31 @@ msgstr ""
 msgid "Object deleted"
 msgstr ""
 
-#: n/Folder.py:162
+#: n/Folder.py:164
 msgid "Please rename each listed object."
 msgstr ""
 
-#: n/RegistrationTool.py:217
+#: n/RegistrationTool.py:228
 msgid "How to reset your password on the %s website"
 msgstr ""
 
-#: n/RegistrationTool.py:232
+#: n/RegistrationTool.py:243
 msgid "Unknown user name. Please retry."
 msgstr ""
 
-#: n/RegistrationTool.py:247
+#: n/RegistrationTool.py:258
 msgid "Invalid reset password request."
 msgstr ""
 
-#: n/RegistrationTool.py:253
+#: n/RegistrationTool.py:264
 msgid "Your reset password request has expired. You can ask a new one."
 msgstr ""
 
-#: n/RegistrationTool.py:262
+#: n/RegistrationTool.py:273
 msgid "Password successfully reset."
 msgstr ""
 
-#: n/RegistrationTool.py:264
+#: n/RegistrationTool.py:275
 msgid "\"%s\" username not found."
 msgstr ""
 
@@ -143,8 +143,21 @@ msgstr ""
 msgid "search between %s and %s"
 msgstr ""
 
+#: n/skins/content/folder_factories.pt:18 n/skins/generic/gruf_macros.pt:256
+#: n/skins/generic/gruf_macros.pt:378 n/skins/generic/last_member_logs.pt:23
+#: n/skins/generic/pending_members.pt:13
+msgid "Name"
+msgstr ""
+
+#: n/skins/content/folder_factories.pt:34
+#: n/skins/content/topic_edit_template.pt:51
+#: n/skins/generic/gruf_macros.pt:288 n/skins/generic/gruf_macros.pt:327
+msgid "Add"
+msgstr ""
+
 #: n/skins/content/folder_notifications_template.pt:23
 #: n/skins/content/topic_edit_template.pt:26
+#: n/skins/custom_content/document_edit_template.pt:23
 #: n/skins/custom_content/event_edit_template.pt:135
 #: n/skins/generic/search_results_template.pt:87
 msgid "Save"
@@ -191,11 +204,6 @@ msgstr ""
 msgid "Type:"
 msgstr ""
 
-#: n/skins/content/topic_edit_template.pt:51
-#: n/skins/generic/gruf_macros.pt:288 n/skins/generic/gruf_macros.pt:327
-msgid "Add"
-msgstr ""
-
 #: n/skins/control/restore_revision.py:9
 msgid "%(type)s restored."
 msgstr ""
@@ -380,27 +388,29 @@ msgstr ""
 msgid "%d item moved down.%d items moved down."
 msgstr ""
 
-#: n/skins/custom_control/folder_rename_control.py:13
+#: n/skins/custom_control/folder_rename_control.py:24
+#: n/skins/custom_control/folder_rename_control.py:42
 msgid "Item renamed."
 msgstr ""
 
-#: n/skins/custom_control/folder_rename_control.py:15
+#: n/skins/custom_control/folder_rename_control.py:26
+#: n/skins/custom_control/folder_rename_control.py:44
 msgid "Items renamed."
 msgstr ""
 
-#: n/skins/custom_control/folder_rename_control.py:18
+#: n/skins/custom_control/folder_rename_control.py:29
 msgid "This item has not been renamed: \"%s\""
 msgstr ""
 
-#: n/skins/custom_control/folder_rename_control.py:21
+#: n/skins/custom_control/folder_rename_control.py:32
 msgid "These items have not been renamed: %s"
 msgstr ""
 
-#: n/skins/custom_control/folder_rename_control.py:24
+#: n/skins/custom_control/folder_rename_control.py:35
 msgid "Rename failed."
 msgstr ""
 
-#: n/skins/custom_control/folder_rename_control.py:26
+#: n/skins/custom_control/folder_rename_control.py:39
 msgid "Nothing to change."
 msgstr ""
 
@@ -433,6 +443,14 @@ msgstr ""
 msgid "Bottom"
 msgstr ""
 
+#: n/skins/custom_generic/folder_rename_template.pt:6
+msgid "Rename Items"
+msgstr ""
+
+#: n/skins/custom_generic/folder_rename_template.pt:16
+msgid "URL"
+msgstr ""
+
 #: n/skins/custom_generic/logged_in.py:28
 #: n/skins/custom_generic/logged_in_template.pt:9
 msgid "Login failure"
@@ -491,6 +509,50 @@ msgstr ""
 msgid "Change password"
 msgstr ""
 
+#: n/skins/custom_generic/login_form.pt:11
+msgid "Log in"
+msgstr ""
+
+#. Default: "Login"
+#: n/skins/custom_generic/login_form.pt:22
+msgid "user_name"
+msgstr ""
+
+#: n/skins/custom_generic/login_form.pt:28 n/skins/generic/gruf_macros.pt:268
+#: n/skins/generic/gruf_macros.pt:390
+#: n/skins/generic/password_reset_template.pt:28
+msgid "Password"
+msgstr ""
+
+#: n/skins/custom_generic/login_form.pt:37
+msgid "Remember my name."
+msgstr ""
+
+#: n/skins/custom_generic/login_form.pt:43
+#: n/skins/generic/password_reset_form.py:26
+msgid " Login "
+msgstr ""
+
+#: n/skins/custom_generic/login_form.pt:49
+msgid "Forgot your login or password?"
+msgstr ""
+
+#: n/skins/custom_generic/login_form.pt:51
+msgid ""
+"Having trouble logging in? Make sure to enable cookies in your web browser."
+msgstr ""
+
+#: n/skins/custom_generic/login_form.pt:55
+msgid "Don't forget to logout or exit your browser when you're done."
+msgstr ""
+
+#: n/skins/custom_generic/login_form.pt:58
+msgid ""
+"Setting the 'Remember my name' option will set a cookie with your username, "
+"so that when you next log in, your user name will already be filled in for "
+"you."
+msgstr ""
+
 #: n/skins/custom_generic/mail_password_template.py:30
 msgid "${portal_title}: Membership reminder"
 msgstr ""
@@ -847,21 +909,10 @@ msgstr ""
 msgid "Login"
 msgstr ""
 
-#: n/skins/generic/gruf_macros.pt:256 n/skins/generic/gruf_macros.pt:378
-#: n/skins/generic/last_member_logs.pt:23
-#: n/skins/generic/pending_members.pt:13
-msgid "Name"
-msgstr ""
-
 #: n/skins/generic/gruf_macros.pt:262 n/skins/generic/gruf_macros.pt:384
 msgid "Given Name"
 msgstr ""
 
-#: n/skins/generic/gruf_macros.pt:268 n/skins/generic/gruf_macros.pt:390
-#: n/skins/generic/password_reset_template.pt:28
-msgid "Password"
-msgstr ""
-
 #: n/skins/generic/gruf_macros.pt:274 n/skins/generic/gruf_macros.pt:396
 #: n/skins/generic/password_reset_template.pt:34
 msgid "Confirm"
@@ -1039,10 +1090,6 @@ msgstr ""
 msgid "Exit boxes editing"
 msgstr ""
 
-#: n/skins/generic/password_reset_form.py:26
-msgid " Login "
-msgstr ""
-
 #: n/skins/generic/password_reset_mail.py:4
 msgid "Hi %(fullName)s,"
 msgstr ""
@@ -1162,18 +1209,18 @@ msgstr ""
 
 #: n/skins/generic/request_password_reset_template.pt:12
 msgid ""
-"Enter your username below and click on the \"Send\" button. You will receive "
-"an email with a link to reset your password."
+"Enter your email or your username below and click on the \"Send\" button. "
+"You will receive an email with a link to reset your password."
 msgstr ""
 
-#: n/skins/generic/request_password_reset_template.pt:18
+#: n/skins/generic/request_password_reset_template.pt:19
 msgid ""
 "If this will not work for you (for example, if you forget your username or "
 "didn't enter your email address) send email to ${admin_email}."
 msgstr ""
 
 #. Default: "Send"
-#: n/skins/generic/request_password_reset_template.pt:25
+#: n/skins/generic/request_password_reset_template.pt:26
 msgid " Send "
 msgstr ""
 
diff --git a/locales/fr/LC_MESSAGES/plinn.mo b/locales/fr/LC_MESSAGES/plinn.mo
index d2398329c4a8af0982c3a1f574ed8d2ad8e9c9bf..8ed1dc2509122ea9e855362c624425fd22a7f45d 100644
GIT binary patch
delta 13950
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
N0N?H`ZM81rzW@WaWRm~@

delta 12889
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
Ok#pVs=T2NX;Qs)z_5z^*

diff --git a/locales/fr/LC_MESSAGES/plinn.po b/locales/fr/LC_MESSAGES/plinn.po
index 21249ec..fe1b82d 100755
--- a/locales/fr/LC_MESSAGES/plinn.po
+++ b/locales/fr/LC_MESSAGES/plinn.po
@@ -1,8 +1,8 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: Plinn 2.0\n"
-"POT-Creation-Date: Thu Nov 28 13:09:25 2013\n"
-"PO-Revision-Date: 2013-08-02 10:29+0200\n"
+"POT-Creation-Date: Sun Jan 19 10:49:52 2014\n"
+"PO-Revision-Date: 2014-01-19 10:51+0100\n"
 "Last-Translator:  Benoît PIN\n"
 "Language-Team: CRI http://cri.ensmp.fr\n"
 "Language: \n"
@@ -20,33 +20,33 @@ msgstr ""
 msgid "Object deleted"
 msgstr "Objet supprimé"
 
-#: n/Folder.py:162
+#: n/Folder.py:164
 msgid "Please rename each listed object."
 msgstr "Veuillez renommer tous les éléments listés."
 
-#: n/RegistrationTool.py:217
+#: n/RegistrationTool.py:228
 msgid "How to reset your password on the %s website"
 msgstr "Comment réinitialiser votre mot de passe sur le site %s"
 
-#: n/RegistrationTool.py:232
+#: n/RegistrationTool.py:243
 msgid "Unknown user name. Please retry."
 msgstr "Nom d'utilisateur inconnu. Veuillez réessayer."
 
-#: n/RegistrationTool.py:247
+#: n/RegistrationTool.py:258
 msgid "Invalid reset password request."
 msgstr "Demande de réinitialisation de mot de passe invalide."
 
-#: n/RegistrationTool.py:253
+#: n/RegistrationTool.py:264
 msgid "Your reset password request has expired. You can ask a new one."
 msgstr ""
 "Votre demande de réinitialisation de mot de passe a expiré. Vous pouvez en "
 "demander une nouvelle."
 
-#: n/RegistrationTool.py:262
+#: n/RegistrationTool.py:273
 msgid "Password successfully reset."
 msgstr "Mot de passe correctement réinitialisé."
 
-#: n/RegistrationTool.py:264
+#: n/RegistrationTool.py:275
 msgid "\"%s\" username not found."
 msgstr "Nom : « %s » non trouvé."
 
@@ -68,9 +68,8 @@ msgid ""
 "the community.\n"
 msgstr ""
 "\n"
-"Vous venez d'être inscrit en tant que membre du portail "
-"« %(portal_title)s », ce qui vous permet de participer à la rédaction des "
-"contenus.\n"
+"Vous venez d'être inscrit en tant que membre du portail « %(portal_title)"
+"s », ce qui vous permet de participer à la rédaction des contenus.\n"
 
 #: n/profiles/default/workflows/member_workflow/scripts/sendNotificationEmail.py:43
 #: n/profiles/photo/workflows/member_workflow/scripts/sendNotificationEmail.py:43
@@ -151,8 +150,21 @@ msgstr "recherche depuis le %s jusqu'à la fin du monde"
 msgid "search between %s and %s"
 msgstr "recherche entre le %s et le %s"
 
+#: n/skins/content/folder_factories.pt:18 n/skins/generic/gruf_macros.pt:256
+#: n/skins/generic/gruf_macros.pt:378 n/skins/generic/last_member_logs.pt:23
+#: n/skins/generic/pending_members.pt:13
+msgid "Name"
+msgstr "Nom"
+
+#: n/skins/content/folder_factories.pt:34
+#: n/skins/content/topic_edit_template.pt:51
+#: n/skins/generic/gruf_macros.pt:288 n/skins/generic/gruf_macros.pt:327
+msgid "Add"
+msgstr "Ajouter"
+
 #: n/skins/content/folder_notifications_template.pt:23
 #: n/skins/content/topic_edit_template.pt:26
+#: n/skins/custom_content/document_edit_template.pt:23
 #: n/skins/custom_content/event_edit_template.pt:135
 #: n/skins/generic/search_results_template.pt:87
 msgid "Save"
@@ -199,11 +211,6 @@ msgstr "Nom :"
 msgid "Type:"
 msgstr "Type :"
 
-#: n/skins/content/topic_edit_template.pt:51
-#: n/skins/generic/gruf_macros.pt:288 n/skins/generic/gruf_macros.pt:327
-msgid "Add"
-msgstr "Ajouter"
-
 #: n/skins/control/restore_revision.py:9
 msgid "%(type)s restored."
 msgstr "%(type)s restauré."
@@ -390,27 +397,29 @@ msgstr "%d élément déplacé en bas.%d éléments déplacés en bas."
 msgid "%d item moved down.%d items moved down."
 msgstr "%d élément déplacé vers le bas.%d éléments déplacés vers le bas."
 
-#: n/skins/custom_control/folder_rename_control.py:13
+#: n/skins/custom_control/folder_rename_control.py:24
+#: n/skins/custom_control/folder_rename_control.py:42
 msgid "Item renamed."
 msgstr "Élément renommé."
 
-#: n/skins/custom_control/folder_rename_control.py:15
+#: n/skins/custom_control/folder_rename_control.py:26
+#: n/skins/custom_control/folder_rename_control.py:44
 msgid "Items renamed."
 msgstr "Éléments renommés."
 
-#: n/skins/custom_control/folder_rename_control.py:18
+#: n/skins/custom_control/folder_rename_control.py:29
 msgid "This item has not been renamed: \"%s\""
 msgstr "Cet élément n'a pas été renommé : \"%s\""
 
-#: n/skins/custom_control/folder_rename_control.py:21
+#: n/skins/custom_control/folder_rename_control.py:32
 msgid "These items have not been renamed: %s"
 msgstr "Ces éléments n'ont pas été renommés : %s"
 
-#: n/skins/custom_control/folder_rename_control.py:24
+#: n/skins/custom_control/folder_rename_control.py:35
 msgid "Rename failed."
 msgstr "Renommage échoué."
 
-#: n/skins/custom_control/folder_rename_control.py:26
+#: n/skins/custom_control/folder_rename_control.py:39
 msgid "Nothing to change."
 msgstr "Aucun changement."
 
@@ -443,6 +452,14 @@ msgstr "Premier"
 msgid "Bottom"
 msgstr "Dernier"
 
+#: n/skins/custom_generic/folder_rename_template.pt:6
+msgid "Rename Items"
+msgstr "Renommer des éléments"
+
+#: n/skins/custom_generic/folder_rename_template.pt:16
+msgid "URL"
+msgstr "URL"
+
 #: n/skins/custom_generic/logged_in.py:28
 #: n/skins/custom_generic/logged_in_template.pt:9
 msgid "Login failure"
@@ -510,6 +527,57 @@ msgstr "Confirmation"
 msgid "Change password"
 msgstr "Changer le mot de passe"
 
+#: n/skins/custom_generic/login_form.pt:11
+msgid "Log in"
+msgstr "Connexion"
+
+#. Default: "Login"
+#: n/skins/custom_generic/login_form.pt:22
+msgid "user_name"
+msgstr "Login"
+
+#: n/skins/custom_generic/login_form.pt:28 n/skins/generic/gruf_macros.pt:268
+#: n/skins/generic/gruf_macros.pt:390
+#: n/skins/generic/password_reset_template.pt:28
+msgid "Password"
+msgstr "Mot de passe"
+
+#: n/skins/custom_generic/login_form.pt:37
+msgid "Remember my name."
+msgstr "Se souvenir de mon login."
+
+#: n/skins/custom_generic/login_form.pt:43
+#: n/skins/generic/password_reset_form.py:26
+msgid " Login "
+msgstr "Connexion"
+
+#: n/skins/custom_generic/login_form.pt:49
+msgid "Forgot your login or password?"
+msgstr "Login ou mot de passe oublié ?"
+
+#: n/skins/custom_generic/login_form.pt:51
+msgid ""
+"Having trouble logging in? Make sure to enable cookies in your web browser."
+msgstr ""
+"Vous rencontrez des difficultés pour la connexion ? Vérifiez que votre "
+"navigateur accepte les cookies."
+
+#: n/skins/custom_generic/login_form.pt:55
+msgid "Don't forget to logout or exit your browser when you're done."
+msgstr ""
+"N'oubliez pas de vous déconnecter ou de fermer votre navigateur à la fin de "
+"la session."
+
+#: n/skins/custom_generic/login_form.pt:58
+msgid ""
+"Setting the 'Remember my name' option will set a cookie with your username, "
+"so that when you next log in, your user name will already be filled in for "
+"you."
+msgstr ""
+"L'option « Se souvenir de mon login » permet de le sauvegarder dans un "
+"cookie : vous n’aurez pas à le saisir de nouveau lors de votre prochaine "
+"visite."
+
 #: n/skins/custom_generic/mail_password_template.py:30
 msgid "${portal_title}: Membership reminder"
 msgstr "${portal_title} : rappel du mot de passe"
@@ -892,21 +960,10 @@ msgstr "Nouveau membre"
 msgid "Login"
 msgstr "Login"
 
-#: n/skins/generic/gruf_macros.pt:256 n/skins/generic/gruf_macros.pt:378
-#: n/skins/generic/last_member_logs.pt:23
-#: n/skins/generic/pending_members.pt:13
-msgid "Name"
-msgstr "Nom"
-
 #: n/skins/generic/gruf_macros.pt:262 n/skins/generic/gruf_macros.pt:384
 msgid "Given Name"
 msgstr "Prénom"
 
-#: n/skins/generic/gruf_macros.pt:268 n/skins/generic/gruf_macros.pt:390
-#: n/skins/generic/password_reset_template.pt:28
-msgid "Password"
-msgstr "Mot de passe"
-
 #: n/skins/generic/gruf_macros.pt:274 n/skins/generic/gruf_macros.pt:396
 #: n/skins/generic/password_reset_template.pt:34
 msgid "Confirm"
@@ -1084,10 +1141,6 @@ msgstr "Coller"
 msgid "Exit boxes editing"
 msgstr "Quitter l'édition des boîtes"
 
-#: n/skins/generic/password_reset_form.py:26
-msgid " Login "
-msgstr "Connexion"
-
 #: n/skins/generic/password_reset_mail.py:4
 msgid "Hi %(fullName)s,"
 msgstr "Bonjour %(fullName)s,"
@@ -1217,13 +1270,11 @@ msgstr "Réinitialisation de mot de passe"
 
 #: n/skins/generic/request_password_reset_template.pt:12
 msgid ""
-"Enter your username below and click on the \"Send\" button. You will receive "
-"an email with a link to reset your password."
-msgstr ""
-"Entrez votre login ci-dessous et cliquez sur « Envoyer ». Vous recevrez un "
-"email contenant un lien pour réinitialiser votre mot de passe."
+"Enter your email or your username below and click on the \"Send\" button. "
+"You will receive an email with a link to reset your password."
+msgstr "Entrez votre email ou votre login ci-dessous et cliquez sur « Envoyer ». Vous recevrez un email contenant un lien pour réinitialiser votre mot de passe."
 
-#: n/skins/generic/request_password_reset_template.pt:18
+#: n/skins/generic/request_password_reset_template.pt:19
 msgid ""
 "If this will not work for you (for example, if you forget your username or "
 "didn't enter your email address) send email to ${admin_email}."
@@ -1233,7 +1284,7 @@ msgstr ""
 "un email à ${admin_email}."
 
 #. Default: "Send"
-#: n/skins/generic/request_password_reset_template.pt:25
+#: n/skins/generic/request_password_reset_template.pt:26
 msgid " Send "
 msgstr " Envoyer "
 
@@ -2291,6 +2342,16 @@ msgstr "Ceci est la page d'accueil par défaut."
 msgid "Huge Folder"
 msgstr "Dossier"
 
+#~ msgid ""
+#~ "Enter your username below and click on the \"Send\" button. You will "
+#~ "receive an email with a link to reset your password."
+#~ msgstr ""
+#~ "Entrez votre login ci-dessous et cliquez sur « Envoyer ». Vous recevrez "
+#~ "un email contenant un lien pour réinitialiser votre mot de passe."
+
+#~ msgid "Forgot your password?"
+#~ msgstr "Mot de passe oublié ?"
+
 #~ msgid "Structured text"
 #~ msgstr "Texte structuré"
 
diff --git a/locales/plinn.pot b/locales/plinn.pot
index c4bfcfb..6a60223 100644
--- a/locales/plinn.pot
+++ b/locales/plinn.pot
@@ -14,7 +14,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: 2.0 beta 1\n"
-"POT-Creation-Date: Thu Nov 28 13:09:25 2013\n"
+"POT-Creation-Date: Sun Jan 19 10:49:52 2014\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: Zope 3 Developers <zope-dev@zope.org>\n"
@@ -27,31 +27,31 @@ msgstr ""
 msgid "Object deleted"
 msgstr ""
 
-#: n/Folder.py:162
+#: n/Folder.py:164
 msgid "Please rename each listed object."
 msgstr ""
 
-#: n/RegistrationTool.py:217
+#: n/RegistrationTool.py:228
 msgid "How to reset your password on the %s website"
 msgstr ""
 
-#: n/RegistrationTool.py:232
+#: n/RegistrationTool.py:243
 msgid "Unknown user name. Please retry."
 msgstr ""
 
-#: n/RegistrationTool.py:247
+#: n/RegistrationTool.py:258
 msgid "Invalid reset password request."
 msgstr ""
 
-#: n/RegistrationTool.py:253
+#: n/RegistrationTool.py:264
 msgid "Your reset password request has expired. You can ask a new one."
 msgstr ""
 
-#: n/RegistrationTool.py:262
+#: n/RegistrationTool.py:273
 msgid "Password successfully reset."
 msgstr ""
 
-#: n/RegistrationTool.py:264
+#: n/RegistrationTool.py:275
 msgid "\"%s\" username not found."
 msgstr ""
 
@@ -151,8 +151,24 @@ msgstr ""
 msgid "search between %s and %s"
 msgstr ""
 
+#: n/skins/content/folder_factories.pt:18
+#: n/skins/generic/gruf_macros.pt:256
+#: n/skins/generic/gruf_macros.pt:378
+#: n/skins/generic/last_member_logs.pt:23
+#: n/skins/generic/pending_members.pt:13
+msgid "Name"
+msgstr ""
+
+#: n/skins/content/folder_factories.pt:34
+#: n/skins/content/topic_edit_template.pt:51
+#: n/skins/generic/gruf_macros.pt:288
+#: n/skins/generic/gruf_macros.pt:327
+msgid "Add"
+msgstr ""
+
 #: n/skins/content/folder_notifications_template.pt:23
 #: n/skins/content/topic_edit_template.pt:26
+#: n/skins/custom_content/document_edit_template.pt:23
 #: n/skins/custom_content/event_edit_template.pt:135
 #: n/skins/generic/search_results_template.pt:87
 msgid "Save"
@@ -200,12 +216,6 @@ msgstr ""
 msgid "Type:"
 msgstr ""
 
-#: n/skins/content/topic_edit_template.pt:51
-#: n/skins/generic/gruf_macros.pt:288
-#: n/skins/generic/gruf_macros.pt:327
-msgid "Add"
-msgstr ""
-
 #: n/skins/control/restore_revision.py:9
 msgid "%(type)s restored."
 msgstr ""
@@ -390,27 +400,29 @@ msgstr ""
 msgid "%d item moved down.%d items moved down."
 msgstr ""
 
-#: n/skins/custom_control/folder_rename_control.py:13
+#: n/skins/custom_control/folder_rename_control.py:24
+#: n/skins/custom_control/folder_rename_control.py:42
 msgid "Item renamed."
 msgstr ""
 
-#: n/skins/custom_control/folder_rename_control.py:15
+#: n/skins/custom_control/folder_rename_control.py:26
+#: n/skins/custom_control/folder_rename_control.py:44
 msgid "Items renamed."
 msgstr ""
 
-#: n/skins/custom_control/folder_rename_control.py:18
+#: n/skins/custom_control/folder_rename_control.py:29
 msgid "This item has not been renamed: \"%s\""
 msgstr ""
 
-#: n/skins/custom_control/folder_rename_control.py:21
+#: n/skins/custom_control/folder_rename_control.py:32
 msgid "These items have not been renamed: %s"
 msgstr ""
 
-#: n/skins/custom_control/folder_rename_control.py:24
+#: n/skins/custom_control/folder_rename_control.py:35
 msgid "Rename failed."
 msgstr ""
 
-#: n/skins/custom_control/folder_rename_control.py:26
+#: n/skins/custom_control/folder_rename_control.py:39
 msgid "Nothing to change."
 msgstr ""
 
@@ -443,6 +455,14 @@ msgstr ""
 msgid "Bottom"
 msgstr ""
 
+#: n/skins/custom_generic/folder_rename_template.pt:6
+msgid "Rename Items"
+msgstr ""
+
+#: n/skins/custom_generic/folder_rename_template.pt:16
+msgid "URL"
+msgstr ""
+
 #: n/skins/custom_generic/logged_in.py:28
 #: n/skins/custom_generic/logged_in_template.pt:9
 msgid "Login failure"
@@ -495,6 +515,47 @@ msgstr ""
 msgid "Change password"
 msgstr ""
 
+#: n/skins/custom_generic/login_form.pt:11
+msgid "Log in"
+msgstr ""
+
+#: n/skins/custom_generic/login_form.pt:22
+#. Default: "Login"
+msgid "user_name"
+msgstr ""
+
+#: n/skins/custom_generic/login_form.pt:28
+#: n/skins/generic/gruf_macros.pt:268
+#: n/skins/generic/gruf_macros.pt:390
+#: n/skins/generic/password_reset_template.pt:28
+msgid "Password"
+msgstr ""
+
+#: n/skins/custom_generic/login_form.pt:37
+msgid "Remember my name."
+msgstr ""
+
+#: n/skins/custom_generic/login_form.pt:43
+#: n/skins/generic/password_reset_form.py:26
+msgid " Login "
+msgstr ""
+
+#: n/skins/custom_generic/login_form.pt:49
+msgid "Forgot your login or password?"
+msgstr ""
+
+#: n/skins/custom_generic/login_form.pt:51
+msgid "Having trouble logging in? Make sure to enable cookies in your web browser."
+msgstr ""
+
+#: n/skins/custom_generic/login_form.pt:55
+msgid "Don't forget to logout or exit your browser when you're done."
+msgstr ""
+
+#: n/skins/custom_generic/login_form.pt:58
+msgid "Setting the 'Remember my name' option will set a cookie with your username, so that when you next log in, your user name will already be filled in for you."
+msgstr ""
+
 #: n/skins/custom_generic/mail_password_template.py:30
 msgid "${portal_title}: Membership reminder"
 msgstr ""
@@ -854,24 +915,11 @@ msgstr ""
 msgid "Login"
 msgstr ""
 
-#: n/skins/generic/gruf_macros.pt:256
-#: n/skins/generic/gruf_macros.pt:378
-#: n/skins/generic/last_member_logs.pt:23
-#: n/skins/generic/pending_members.pt:13
-msgid "Name"
-msgstr ""
-
 #: n/skins/generic/gruf_macros.pt:262
 #: n/skins/generic/gruf_macros.pt:384
 msgid "Given Name"
 msgstr ""
 
-#: n/skins/generic/gruf_macros.pt:268
-#: n/skins/generic/gruf_macros.pt:390
-#: n/skins/generic/password_reset_template.pt:28
-msgid "Password"
-msgstr ""
-
 #: n/skins/generic/gruf_macros.pt:274
 #: n/skins/generic/gruf_macros.pt:396
 #: n/skins/generic/password_reset_template.pt:34
@@ -1054,10 +1102,6 @@ msgstr ""
 msgid "Exit boxes editing"
 msgstr ""
 
-#: n/skins/generic/password_reset_form.py:26
-msgid " Login "
-msgstr ""
-
 #: n/skins/generic/password_reset_mail.py:4
 msgid "Hi %(fullName)s,"
 msgstr ""
@@ -1171,14 +1215,14 @@ msgid "Password reset"
 msgstr ""
 
 #: n/skins/generic/request_password_reset_template.pt:12
-msgid "Enter your username below and click on the \"Send\" button. You will receive an email with a link to reset your password."
+msgid "Enter your email or your username below and click on the \"Send\" button. You will receive an email with a link to reset your password."
 msgstr ""
 
-#: n/skins/generic/request_password_reset_template.pt:18
+#: n/skins/generic/request_password_reset_template.pt:19
 msgid "If this will not work for you (for example, if you forget your username or didn't enter your email address) send email to ${admin_email}."
 msgstr ""
 
-#: n/skins/generic/request_password_reset_template.pt:25
+#: n/skins/generic/request_password_reset_template.pt:26
 #. Default: "Send"
 msgid " Send "
 msgstr ""
diff --git a/skins/custom_generic/login_form.pt b/skins/custom_generic/login_form.pt
index 3ab0724..09d9729 100644
--- a/skins/custom_generic/login_form.pt
+++ b/skins/custom_generic/login_form.pt
@@ -6,7 +6,7 @@
     <meta http-equiv="content-type" content="text/html;charset=UTF-8"/>
   </head>
   <body>
-    <div metal:fill-slot="main_no_tabs" i18n:domain="cmf_default">
+    <div metal:fill-slot="main_no_tabs" i18n:domain="plinn">
       <div id="Desktop">
         <h1 i18n:translate="">Log in</h1>
         <form action="" method="post" tal:attributes="action string:${here/portal_url}/logged_in">
@@ -46,7 +46,7 @@
           </table>
         </form>
         <p>
-          <a href="" tal:attributes="href string:${here/portal_url}/request_password_reset_form" i18n:translate="">Forgot your password?</a>
+          <a href="" tal:attributes="href string:${here/portal_url}/request_password_reset_form" i18n:translate="">Forgot your login or password?</a>
         </p>
         <p i18n:translate="">
           Having trouble logging in? Make sure to enable cookies in your web
diff --git a/skins/generic/request_password_reset_template.pt b/skins/generic/request_password_reset_template.pt
index 46106ca..3604a2b 100644
--- a/skins/generic/request_password_reset_template.pt
+++ b/skins/generic/request_password_reset_template.pt
@@ -10,8 +10,9 @@
       <div id="Desktop" tal:define="ptool here/portal_properties">
         <h1 i18n:translate="">Password reset</h1>
         <p i18n:translate="">
-          Enter your username below and click on the "Send" button. You will
-          receive an email with a link to reset your password.
+          Enter your email or your username below and click on the "Send"
+          button. You will receive an email with a link to reset your
+          password.
         </p>
         <p i18n:translate="">
           If this will not work for you (for example, if you forget your
-- 
2.20.1