mirror of
https://github.com/spiral-project/ihatemoney.git
synced 2025-05-01 10:42:24 +02:00
Improve error handling when sending emails (#595)
In one case, we were not catching a family of possible exceptions (socket.error), and in the two other cases there was no error handling at all. Sending emails can easily fail if no email server is configured, so it is really necessary to handle these errors instead of crashing with a HTTP 500 error. Refactor email sending code and add proper error handling. Show alert messages that tell the user if an email was sent or if there was an error. When sending a password reminder email or inviting people by email, we don't proceed to the next step in case of error, because sending emails is the whole point of these actions.
This commit is contained in:
parent
e10ea6c776
commit
df6ffc7d86
18 changed files with 549 additions and 104 deletions
|
@ -157,13 +157,24 @@ msgstr ""
|
|||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr ""
|
||||
|
||||
msgid "Error while sending reminder email"
|
||||
msgid "A reminder email has just been sent to you"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"We tried to send you an reminder email, but there was an error. You can "
|
||||
"still use the project normally."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "The project identifier is %(project)s"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while sending you an email with password reset "
|
||||
"instructions. Please check the email configuration of the server or "
|
||||
"contact the administrator."
|
||||
msgstr ""
|
||||
|
||||
msgid "No token provided"
|
||||
msgstr ""
|
||||
|
||||
|
@ -192,6 +203,12 @@ msgstr ""
|
|||
msgid "Your invitations have been sent"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while trying to send the invitation emails. "
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "%(member)s has been added"
|
||||
msgstr ""
|
||||
|
|
|
@ -5,6 +5,8 @@ import io
|
|||
import json
|
||||
import os
|
||||
import re
|
||||
import smtplib
|
||||
import socket
|
||||
from time import sleep
|
||||
import unittest
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
@ -51,10 +53,10 @@ class BaseTestCase(TestCase):
|
|||
follow_redirects=True,
|
||||
)
|
||||
|
||||
def post_project(self, name):
|
||||
def post_project(self, name, follow_redirects=True):
|
||||
"""Create a fake project"""
|
||||
# create the project
|
||||
self.client.post(
|
||||
return self.client.post(
|
||||
"/create",
|
||||
data={
|
||||
"name": name,
|
||||
|
@ -63,6 +65,7 @@ class BaseTestCase(TestCase):
|
|||
"contact_email": f"{name}@notmyidea.org",
|
||||
"default_currency": "USD",
|
||||
},
|
||||
follow_redirects=follow_redirects,
|
||||
)
|
||||
|
||||
def create_project(self, name):
|
||||
|
@ -141,10 +144,15 @@ class BudgetTestCase(IhatemoneyTestCase):
|
|||
self.login("raclette")
|
||||
|
||||
self.post_project("raclette")
|
||||
self.client.post(
|
||||
"/raclette/invite", data={"emails": "zorglub@notmyidea.org"}
|
||||
resp = self.client.post(
|
||||
"/raclette/invite",
|
||||
data={"emails": "zorglub@notmyidea.org"},
|
||||
follow_redirects=True,
|
||||
)
|
||||
|
||||
# success notification
|
||||
self.assertIn("Your invitations have been sent", resp.data.decode("utf-8"))
|
||||
|
||||
self.assertEqual(len(outbox), 2)
|
||||
self.assertEqual(outbox[0].recipients, ["raclette@notmyidea.org"])
|
||||
self.assertEqual(outbox[1].recipients, ["zorglub@notmyidea.org"])
|
||||
|
@ -225,7 +233,15 @@ class BudgetTestCase(IhatemoneyTestCase):
|
|||
self.create_project("raclette")
|
||||
# Get password resetting link from mail
|
||||
with self.app.mail.record_messages() as outbox:
|
||||
self.client.post("/password-reminder", data={"id": "raclette"})
|
||||
resp = self.client.post(
|
||||
"/password-reminder", data={"id": "raclette"}, follow_redirects=True
|
||||
)
|
||||
# Check that we are redirected to the right page
|
||||
self.assertIn(
|
||||
"A link to reset your password has been sent to you",
|
||||
resp.data.decode("utf-8"),
|
||||
)
|
||||
# Check that an email was sent
|
||||
self.assertEqual(len(outbox), 1)
|
||||
url_start = outbox[0].body.find("You can reset it here: ") + 23
|
||||
url_end = outbox[0].body.find(".\n", url_start)
|
||||
|
@ -250,17 +266,26 @@ class BudgetTestCase(IhatemoneyTestCase):
|
|||
def test_project_creation(self):
|
||||
with self.app.test_client() as c:
|
||||
|
||||
# add a valid project
|
||||
c.post(
|
||||
"/create",
|
||||
data={
|
||||
"name": "The fabulous raclette party",
|
||||
"id": "raclette",
|
||||
"password": "party",
|
||||
"contact_email": "raclette@notmyidea.org",
|
||||
"default_currency": "USD",
|
||||
},
|
||||
)
|
||||
with self.app.mail.record_messages() as outbox:
|
||||
# add a valid project
|
||||
resp = c.post(
|
||||
"/create",
|
||||
data={
|
||||
"name": "The fabulous raclette party",
|
||||
"id": "raclette",
|
||||
"password": "party",
|
||||
"contact_email": "raclette@notmyidea.org",
|
||||
"default_currency": "USD",
|
||||
},
|
||||
follow_redirects=True,
|
||||
)
|
||||
# an email is sent to the owner with a reminder of the password
|
||||
self.assertEqual(len(outbox), 1)
|
||||
self.assertEqual(outbox[0].recipients, ["raclette@notmyidea.org"])
|
||||
self.assertIn(
|
||||
"A reminder email has just been sent to you",
|
||||
resp.data.decode("utf-8"),
|
||||
)
|
||||
|
||||
# session is updated
|
||||
self.assertTrue(session["raclette"])
|
||||
|
@ -2265,6 +2290,78 @@ class ModelsTestCase(IhatemoneyTestCase):
|
|||
self.assertEqual(bill.pay_each(), pay_each_expected)
|
||||
|
||||
|
||||
class EmailFailureTestCase(IhatemoneyTestCase):
|
||||
def test_creation_email_failure_smtp(self):
|
||||
self.login("raclette")
|
||||
with patch.object(
|
||||
self.app.mail, "send", MagicMock(side_effect=smtplib.SMTPException)
|
||||
):
|
||||
resp = self.post_project("raclette")
|
||||
# Check that an error message is displayed
|
||||
self.assertIn(
|
||||
"We tried to send you an reminder email, but there was an error",
|
||||
resp.data.decode("utf-8"),
|
||||
)
|
||||
# Check that we were redirected to the home page anyway
|
||||
self.assertIn(
|
||||
'You probably want to <a href="/raclette/members/add"',
|
||||
resp.data.decode("utf-8"),
|
||||
)
|
||||
|
||||
def test_creation_email_failure_socket(self):
|
||||
self.login("raclette")
|
||||
with patch.object(self.app.mail, "send", MagicMock(side_effect=socket.error)):
|
||||
resp = self.post_project("raclette")
|
||||
# Check that an error message is displayed
|
||||
self.assertIn(
|
||||
"We tried to send you an reminder email, but there was an error",
|
||||
resp.data.decode("utf-8"),
|
||||
)
|
||||
# Check that we were redirected to the home page anyway
|
||||
self.assertIn(
|
||||
'You probably want to <a href="/raclette/members/add"',
|
||||
resp.data.decode("utf-8"),
|
||||
)
|
||||
|
||||
def test_password_reset_email_failure(self):
|
||||
self.create_project("raclette")
|
||||
for exception in (smtplib.SMTPException, socket.error):
|
||||
with patch.object(self.app.mail, "send", MagicMock(side_effect=exception)):
|
||||
resp = self.client.post(
|
||||
"/password-reminder", data={"id": "raclette"}, follow_redirects=True
|
||||
)
|
||||
# Check that an error message is displayed
|
||||
self.assertIn(
|
||||
"there was an error while sending you an email",
|
||||
resp.data.decode("utf-8"),
|
||||
)
|
||||
# Check that we were not redirected to the success page
|
||||
self.assertNotIn(
|
||||
"A link to reset your password has been sent to you",
|
||||
resp.data.decode("utf-8"),
|
||||
)
|
||||
|
||||
def test_invitation_email_failure(self):
|
||||
self.login("raclette")
|
||||
self.post_project("raclette")
|
||||
for exception in (smtplib.SMTPException, socket.error):
|
||||
with patch.object(self.app.mail, "send", MagicMock(side_effect=exception)):
|
||||
resp = self.client.post(
|
||||
"/raclette/invite",
|
||||
data={"emails": "toto@notmyidea.org"},
|
||||
follow_redirects=True,
|
||||
)
|
||||
# Check that an error message is displayed
|
||||
self.assertIn(
|
||||
"there was an error while trying to send the invitation emails",
|
||||
resp.data.decode("utf-8"),
|
||||
)
|
||||
# Check that we are still on the same page (no redirection)
|
||||
self.assertIn(
|
||||
"Invite people to join this project", resp.data.decode("utf-8"),
|
||||
)
|
||||
|
||||
|
||||
def em_surround(string, regex_escape=False):
|
||||
if regex_escape:
|
||||
return r'<em class="font-italic">%s<\/em>' % string
|
||||
|
|
|
@ -3,7 +3,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-05-09 21:41+0200\n"
|
||||
"POT-Creation-Date: 2020-05-18 15:11+0200\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Automatically generated\n"
|
||||
"Language: cs\n"
|
||||
|
@ -12,7 +12,7 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Generated-By: Babel 2.7.0\n"
|
||||
"Generated-By: Babel 2.8.0\n"
|
||||
|
||||
msgid ""
|
||||
"Not a valid amount or expression. Only numbers and + - * / operators are "
|
||||
|
@ -173,13 +173,24 @@ msgstr ""
|
|||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr ""
|
||||
|
||||
msgid "Error while sending reminder email"
|
||||
msgid "A reminder email has just been sent to you"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"We tried to send you an reminder email, but there was an error. You can "
|
||||
"still use the project normally."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "The project identifier is %(project)s"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while sending you an email with password reset "
|
||||
"instructions. Please check the email configuration of the server or "
|
||||
"contact the administrator."
|
||||
msgstr ""
|
||||
|
||||
msgid "No token provided"
|
||||
msgstr ""
|
||||
|
||||
|
@ -208,6 +219,12 @@ msgstr ""
|
|||
msgid "Your invitations have been sent"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while trying to send the invitation emails. "
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "%(member)s has been added"
|
||||
msgstr ""
|
||||
|
@ -757,3 +774,6 @@ msgstr ""
|
|||
#~ msgid "each"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Error while sending reminder email"
|
||||
#~ msgstr ""
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-05-09 21:41+0200\n"
|
||||
"POT-Creation-Date: 2020-05-18 15:11+0200\n"
|
||||
"PO-Revision-Date: 2020-02-12 10:50+0000\n"
|
||||
"Last-Translator: flolilo <flolilo@mailbox.org>\n"
|
||||
"Language: de\n"
|
||||
|
@ -13,7 +13,7 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Generated-By: Babel 2.7.0\n"
|
||||
"Generated-By: Babel 2.8.0\n"
|
||||
|
||||
msgid ""
|
||||
"Not a valid amount or expression. Only numbers and + - * / operators are "
|
||||
|
@ -182,13 +182,24 @@ msgstr ""
|
|||
"Du hast gerade das Projekt '%(project)s' erstellt, um deine Ausgaben zu "
|
||||
"teilen"
|
||||
|
||||
msgid "Error while sending reminder email"
|
||||
msgid "A reminder email has just been sent to you"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"We tried to send you an reminder email, but there was an error. You can "
|
||||
"still use the project normally."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "The project identifier is %(project)s"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while sending you an email with password reset "
|
||||
"instructions. Please check the email configuration of the server or "
|
||||
"contact the administrator."
|
||||
msgstr ""
|
||||
|
||||
msgid "No token provided"
|
||||
msgstr "Kein Token zur Verfügung gestellt"
|
||||
|
||||
|
@ -217,6 +228,12 @@ msgstr "Du wurdest eingeladen, deine Ausgaben für %(project)s zu teilen"
|
|||
msgid "Your invitations have been sent"
|
||||
msgstr "Deine Einladungen wurden versendet"
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while trying to send the invitation emails. "
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "%(member)s has been added"
|
||||
msgstr ""
|
||||
|
@ -785,3 +802,6 @@ msgstr ""
|
|||
#~ msgid "each"
|
||||
#~ msgstr "alles"
|
||||
|
||||
#~ msgid "Error while sending reminder email"
|
||||
#~ msgstr ""
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-05-09 21:41+0200\n"
|
||||
"POT-Creation-Date: 2020-05-18 15:11+0200\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Automatically generated\n"
|
||||
"Language: el\n"
|
||||
|
@ -12,7 +12,7 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Generated-By: Babel 2.7.0\n"
|
||||
"Generated-By: Babel 2.8.0\n"
|
||||
|
||||
msgid ""
|
||||
"Not a valid amount or expression. Only numbers and + - * / operators are "
|
||||
|
@ -173,13 +173,24 @@ msgstr ""
|
|||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr ""
|
||||
|
||||
msgid "Error while sending reminder email"
|
||||
msgid "A reminder email has just been sent to you"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"We tried to send you an reminder email, but there was an error. You can "
|
||||
"still use the project normally."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "The project identifier is %(project)s"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while sending you an email with password reset "
|
||||
"instructions. Please check the email configuration of the server or "
|
||||
"contact the administrator."
|
||||
msgstr ""
|
||||
|
||||
msgid "No token provided"
|
||||
msgstr ""
|
||||
|
||||
|
@ -208,6 +219,12 @@ msgstr ""
|
|||
msgid "Your invitations have been sent"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while trying to send the invitation emails. "
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "%(member)s has been added"
|
||||
msgstr ""
|
||||
|
@ -757,3 +774,6 @@ msgstr ""
|
|||
#~ msgid "each"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Error while sending reminder email"
|
||||
#~ msgstr ""
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-05-09 21:41+0200\n"
|
||||
"POT-Creation-Date: 2020-05-18 15:11+0200\n"
|
||||
"PO-Revision-Date: 2020-05-03 15:20+0000\n"
|
||||
"Last-Translator: Fabian Rodriguez <fabian@fabianrodriguez.com>\n"
|
||||
"Language: es_419\n"
|
||||
|
@ -13,7 +13,7 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Generated-By: Babel 2.7.0\n"
|
||||
"Generated-By: Babel 2.8.0\n"
|
||||
|
||||
msgid ""
|
||||
"Not a valid amount or expression. Only numbers and + - * / operators are "
|
||||
|
@ -182,13 +182,24 @@ msgstr "Este código privado no es el correcto"
|
|||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr "Acabas de crear '%(project)s' para compartir tus gastos"
|
||||
|
||||
msgid "Error while sending reminder email"
|
||||
msgid "A reminder email has just been sent to you"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"We tried to send you an reminder email, but there was an error. You can "
|
||||
"still use the project normally."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "The project identifier is %(project)s"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while sending you an email with password reset "
|
||||
"instructions. Please check the email configuration of the server or "
|
||||
"contact the administrator."
|
||||
msgstr ""
|
||||
|
||||
msgid "No token provided"
|
||||
msgstr "No se proporciono ningún token"
|
||||
|
||||
|
@ -217,6 +228,12 @@ msgstr "Usted ha sido invitado a compartir sus gastos para %(project)s"
|
|||
msgid "Your invitations have been sent"
|
||||
msgstr "Sus invitaciones han sido enviadas"
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while trying to send the invitation emails. "
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "%(member)s has been added"
|
||||
msgstr "Se añadieron %(member)s"
|
||||
|
@ -806,3 +823,6 @@ msgstr "Período"
|
|||
#~ msgid "each"
|
||||
#~ msgstr "Cada"
|
||||
|
||||
#~ msgid "Error while sending reminder email"
|
||||
#~ msgstr ""
|
||||
|
||||
|
|
|
@ -7,18 +7,17 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PROJECT VERSION\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2020-05-09 21:41+0200\n"
|
||||
"POT-Creation-Date: 2020-05-18 15:11+0200\n"
|
||||
"PO-Revision-Date: 2020-05-15 20:41+0000\n"
|
||||
"Last-Translator: Glandos <bugs-github@antipoul.fr>\n"
|
||||
"Language-Team: French <https://hosted.weblate.org/projects/i-hate-money/"
|
||||
"i-hate-money/fr/>\n"
|
||||
"Language: fr\n"
|
||||
"Language-Team: French <https://hosted.weblate.org/projects/i-hate-money/i"
|
||||
"-hate-money/fr/>\n"
|
||||
"Plural-Forms: nplurals=2; plural=n > 1\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n > 1;\n"
|
||||
"X-Generator: Weblate 4.1-dev\n"
|
||||
"Generated-By: Babel 2.7.0\n"
|
||||
"Generated-By: Babel 2.8.0\n"
|
||||
|
||||
msgid ""
|
||||
"Not a valid amount or expression. Only numbers and + - * / operators are "
|
||||
|
@ -185,13 +184,24 @@ msgstr "Le code que vous avez entré n’est pas correct"
|
|||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr "Vous venez de créer « %(project)s » pour partager vos dépenses"
|
||||
|
||||
msgid "Error while sending reminder email"
|
||||
msgstr "Erreur lors de l’envoi du courriel de rappel"
|
||||
msgid "A reminder email has just been sent to you"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"We tried to send you an reminder email, but there was an error. You can "
|
||||
"still use the project normally."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "The project identifier is %(project)s"
|
||||
msgstr "L’identifiant de ce projet est %(project)s"
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while sending you an email with password reset "
|
||||
"instructions. Please check the email configuration of the server or "
|
||||
"contact the administrator."
|
||||
msgstr ""
|
||||
|
||||
msgid "No token provided"
|
||||
msgstr "Aucun token n’a été fourni"
|
||||
|
||||
|
@ -220,6 +230,12 @@ msgstr "Vous avez été invité à partager vos dépenses pour %(project)s"
|
|||
msgid "Your invitations have been sent"
|
||||
msgstr "Vos invitations ont bien été envoyées"
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while trying to send the invitation emails. "
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "%(member)s has been added"
|
||||
msgstr "%(member)s a été ajouté"
|
||||
|
@ -1019,3 +1035,7 @@ msgstr "Période"
|
|||
|
||||
#~ msgid "each"
|
||||
#~ msgstr "chacun"
|
||||
|
||||
#~ msgid "Error while sending reminder email"
|
||||
#~ msgstr "Erreur lors de l’envoi du courriel de rappel"
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-05-09 21:41+0200\n"
|
||||
"POT-Creation-Date: 2020-05-18 15:11+0200\n"
|
||||
"PO-Revision-Date: 2019-11-16 10:04+0000\n"
|
||||
"Last-Translator: Muhammad Fauzi <fauzi.padlaw@gmail.com>\n"
|
||||
"Language: id\n"
|
||||
|
@ -13,7 +13,7 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Generated-By: Babel 2.7.0\n"
|
||||
"Generated-By: Babel 2.8.0\n"
|
||||
|
||||
msgid ""
|
||||
"Not a valid amount or expression. Only numbers and + - * / operators are "
|
||||
|
@ -178,13 +178,24 @@ msgstr "Kode pribadi ini tidak benar"
|
|||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr "Anda baru saja membuat %(project)s untuk membagikan harga Anda"
|
||||
|
||||
msgid "Error while sending reminder email"
|
||||
msgid "A reminder email has just been sent to you"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"We tried to send you an reminder email, but there was an error. You can "
|
||||
"still use the project normally."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "The project identifier is %(project)s"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while sending you an email with password reset "
|
||||
"instructions. Please check the email configuration of the server or "
|
||||
"contact the administrator."
|
||||
msgstr ""
|
||||
|
||||
msgid "No token provided"
|
||||
msgstr "Belum ada token diberikan"
|
||||
|
||||
|
@ -213,6 +224,12 @@ msgstr "Anda telah diundang untuk membagikan harga Anda untuk %(project)s"
|
|||
msgid "Your invitations have been sent"
|
||||
msgstr "Undangan Anda telah dikirim"
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while trying to send the invitation emails. "
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "%(member)s has been added"
|
||||
msgstr ""
|
||||
|
@ -785,3 +802,6 @@ msgstr ""
|
|||
#~ msgid "each"
|
||||
#~ msgstr "setiap"
|
||||
|
||||
#~ msgid "Error while sending reminder email"
|
||||
#~ msgstr ""
|
||||
|
||||
|
|
|
@ -1,19 +1,19 @@
|
|||
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-05-09 21:41+0200\n"
|
||||
"POT-Creation-Date: 2020-05-18 15:11+0200\n"
|
||||
"PO-Revision-Date: 2020-05-18 13:02+0000\n"
|
||||
"Last-Translator: Anonymous <noreply@weblate.org>\n"
|
||||
"Language-Team: Italian <https://hosted.weblate.org/projects/i-hate-money/"
|
||||
"i-hate-money/it/>\n"
|
||||
"Language: it\n"
|
||||
"Language-Team: Italian <https://hosted.weblate.org/projects/i-hate-"
|
||||
"money/i-hate-money/it/>\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 4.1-dev\n"
|
||||
"Generated-By: Babel 2.7.0\n"
|
||||
"Generated-By: Babel 2.8.0\n"
|
||||
|
||||
msgid ""
|
||||
"Not a valid amount or expression. Only numbers and + - * / operators are "
|
||||
|
@ -167,12 +167,13 @@ msgstr "Troppi tentativi di accesso non riusciti. Riprova più tardi."
|
|||
#, python-format
|
||||
msgid "This admin password is not the right one. Only %(num)d attempts left."
|
||||
msgstr ""
|
||||
"Questa password di amministrazione non è corretta. Solo %(num)d tentativi "
|
||||
"rimasti."
|
||||
"Questa password di amministrazione non è corretta. Solo %(num)d tentativi"
|
||||
" rimasti."
|
||||
|
||||
msgid "You either provided a bad token or no project identifier."
|
||||
msgstr ""
|
||||
"Hai fornito un token invalido o l'identificatore del progetto non è valido."
|
||||
"Hai fornito un token invalido o l'identificatore del progetto non è "
|
||||
"valido."
|
||||
|
||||
msgid "This private code is not the right one"
|
||||
msgstr "Questo codice privato non è quello corretto"
|
||||
|
@ -181,13 +182,24 @@ msgstr "Questo codice privato non è quello corretto"
|
|||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr "Hai appena creato '%(project)s' per condividere le tue spese"
|
||||
|
||||
msgid "Error while sending reminder email"
|
||||
msgstr "Errore durante l'invio dell'email di promemoria"
|
||||
msgid "A reminder email has just been sent to you"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"We tried to send you an reminder email, but there was an error. You can "
|
||||
"still use the project normally."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "The project identifier is %(project)s"
|
||||
msgstr "L'identificatore del progetto è %(project)s"
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while sending you an email with password reset "
|
||||
"instructions. Please check the email configuration of the server or "
|
||||
"contact the administrator."
|
||||
msgstr ""
|
||||
|
||||
msgid "No token provided"
|
||||
msgstr "Nessun token fornito"
|
||||
|
||||
|
@ -216,6 +228,12 @@ msgstr "Sei stato invitato a condividere le tue spese per %(project)s"
|
|||
msgid "Your invitations have been sent"
|
||||
msgstr "I tuoi inviti sono stati spediti"
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while trying to send the invitation emails. "
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "%(member)s has been added"
|
||||
msgstr "%(member)s è stato aggiunto"
|
||||
|
@ -764,3 +782,7 @@ msgstr ""
|
|||
|
||||
#~ msgid "each"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Error while sending reminder email"
|
||||
#~ msgstr "Errore durante l'invio dell'email di promemoria"
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-05-09 21:41+0200\n"
|
||||
"POT-Creation-Date: 2020-05-18 15:11+0200\n"
|
||||
"PO-Revision-Date: 2019-11-12 09:04+0000\n"
|
||||
"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n"
|
||||
"Language: nb_NO\n"
|
||||
|
@ -13,7 +13,7 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Generated-By: Babel 2.7.0\n"
|
||||
"Generated-By: Babel 2.8.0\n"
|
||||
|
||||
msgid ""
|
||||
"Not a valid amount or expression. Only numbers and + - * / operators are "
|
||||
|
@ -182,13 +182,24 @@ msgstr "Denne private koden er ikke rett"
|
|||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr "Du har akkurat opprettet \"%(project)s\" for å dele dine utgifter"
|
||||
|
||||
msgid "Error while sending reminder email"
|
||||
msgid "A reminder email has just been sent to you"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"We tried to send you an reminder email, but there was an error. You can "
|
||||
"still use the project normally."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "The project identifier is %(project)s"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while sending you an email with password reset "
|
||||
"instructions. Please check the email configuration of the server or "
|
||||
"contact the administrator."
|
||||
msgstr ""
|
||||
|
||||
msgid "No token provided"
|
||||
msgstr "Inget symbol angitt"
|
||||
|
||||
|
@ -221,6 +232,12 @@ msgstr ""
|
|||
msgid "Your invitations have been sent"
|
||||
msgstr "Invitasjonene dine har blitt sendt"
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while trying to send the invitation emails. "
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "%(member)s has been added"
|
||||
msgstr ""
|
||||
|
@ -916,3 +933,6 @@ msgstr ""
|
|||
#~ msgid "each"
|
||||
#~ msgstr "hver"
|
||||
|
||||
#~ msgid "Error while sending reminder email"
|
||||
#~ msgstr ""
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2020-05-09 21:41+0200\n"
|
||||
"POT-Creation-Date: 2020-05-18 15:11+0200\n"
|
||||
"PO-Revision-Date: 2019-10-07 22:56+0000\n"
|
||||
"Last-Translator: Heimen Stoffels <vistausss@outlook.com>\n"
|
||||
"Language: nl\n"
|
||||
|
@ -13,7 +13,7 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Generated-By: Babel 2.7.0\n"
|
||||
"Generated-By: Babel 2.8.0\n"
|
||||
|
||||
msgid ""
|
||||
"Not a valid amount or expression. Only numbers and + - * / operators are "
|
||||
|
@ -176,13 +176,24 @@ msgstr ""
|
|||
"Je hebt zojuist het project '%(project)s' aangemaakt om je uitgaven te "
|
||||
"verdelen"
|
||||
|
||||
msgid "Error while sending reminder email"
|
||||
msgid "A reminder email has just been sent to you"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"We tried to send you an reminder email, but there was an error. You can "
|
||||
"still use the project normally."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "The project identifier is %(project)s"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while sending you an email with password reset "
|
||||
"instructions. Please check the email configuration of the server or "
|
||||
"contact the administrator."
|
||||
msgstr ""
|
||||
|
||||
msgid "No token provided"
|
||||
msgstr "Geen toegangssleutel opgegeven"
|
||||
|
||||
|
@ -211,6 +222,12 @@ msgstr "Je bent uitgenodigd om je uitgaven te delen met %(project)s"
|
|||
msgid "Your invitations have been sent"
|
||||
msgstr "Je uitnodigingen zijn verstuurd"
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while trying to send the invitation emails. "
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "%(member)s has been added"
|
||||
msgstr ""
|
||||
|
@ -774,3 +791,6 @@ msgstr ""
|
|||
#~ msgid "each"
|
||||
#~ msgstr "per persoon"
|
||||
|
||||
#~ msgid "Error while sending reminder email"
|
||||
#~ msgstr ""
|
||||
|
||||
|
|
|
@ -1,20 +1,20 @@
|
|||
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-05-09 21:41+0200\n"
|
||||
"POT-Creation-Date: 2020-05-18 15:11+0200\n"
|
||||
"PO-Revision-Date: 2020-05-13 15:41+0000\n"
|
||||
"Last-Translator: Szylu <chipolade@gmail.com>\n"
|
||||
"Language-Team: Polish <https://hosted.weblate.org/projects/i-hate-money/"
|
||||
"i-hate-money/pl/>\n"
|
||||
"Language: pl\n"
|
||||
"Language-Team: Polish <https://hosted.weblate.org/projects/i-hate-money/i"
|
||||
"-hate-money/pl/>\n"
|
||||
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && "
|
||||
"(n%100<10 || n%100>=20) ? 1 : 2\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
|
||||
"|| n%100>=20) ? 1 : 2;\n"
|
||||
"X-Generator: Weblate 4.1-dev\n"
|
||||
"Generated-By: Babel 2.7.0\n"
|
||||
"Generated-By: Babel 2.8.0\n"
|
||||
|
||||
msgid ""
|
||||
"Not a valid amount or expression. Only numbers and + - * / operators are "
|
||||
|
@ -179,13 +179,24 @@ msgstr "Ten prywatny kod jest niewłaściwy"
|
|||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr "Właśnie utworzyłeś „%(project)s”, aby podzielić się wydatkami"
|
||||
|
||||
msgid "Error while sending reminder email"
|
||||
msgstr "Błąd podczas wysyłania wiadomości e-mail z przypomnieniem"
|
||||
msgid "A reminder email has just been sent to you"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"We tried to send you an reminder email, but there was an error. You can "
|
||||
"still use the project normally."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "The project identifier is %(project)s"
|
||||
msgstr "Identyfikator projektu to %(project)s"
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while sending you an email with password reset "
|
||||
"instructions. Please check the email configuration of the server or "
|
||||
"contact the administrator."
|
||||
msgstr ""
|
||||
|
||||
msgid "No token provided"
|
||||
msgstr "Nie podano tokena"
|
||||
|
||||
|
@ -214,6 +225,12 @@ msgstr "Zostałeś zaproszony do podzielenia się swoimi wydatkami w %(project)s
|
|||
msgid "Your invitations have been sent"
|
||||
msgstr "Twoje zaproszenia zostały wysłane"
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while trying to send the invitation emails. "
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "%(member)s has been added"
|
||||
msgstr "%(member)s został dodany"
|
||||
|
@ -799,3 +816,7 @@ msgstr "Okres"
|
|||
|
||||
#~ msgid "each"
|
||||
#~ msgstr "każdy"
|
||||
|
||||
#~ msgid "Error while sending reminder email"
|
||||
#~ msgstr "Błąd podczas wysyłania wiadomości e-mail z przypomnieniem"
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-05-09 21:41+0200\n"
|
||||
"POT-Creation-Date: 2020-05-18 15:11+0200\n"
|
||||
"PO-Revision-Date: 2020-04-28 07:11+0000\n"
|
||||
"Last-Translator: Vsevolod <sevauserg.com@gmail.com>\n"
|
||||
"Language: ru\n"
|
||||
|
@ -14,7 +14,7 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Generated-By: Babel 2.7.0\n"
|
||||
"Generated-By: Babel 2.8.0\n"
|
||||
|
||||
msgid ""
|
||||
"Not a valid amount or expression. Only numbers and + - * / operators are "
|
||||
|
@ -181,13 +181,24 @@ msgstr "Этот приватный код не подходит"
|
|||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr "Вы только что создали '%(project)s' , чтобы разделить расходы"
|
||||
|
||||
msgid "Error while sending reminder email"
|
||||
msgid "A reminder email has just been sent to you"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"We tried to send you an reminder email, but there was an error. You can "
|
||||
"still use the project normally."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "The project identifier is %(project)s"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while sending you an email with password reset "
|
||||
"instructions. Please check the email configuration of the server or "
|
||||
"contact the administrator."
|
||||
msgstr ""
|
||||
|
||||
msgid "No token provided"
|
||||
msgstr "Не предоставлен токен"
|
||||
|
||||
|
@ -216,6 +227,12 @@ msgstr "Вас пригласили разделить расходы в про
|
|||
msgid "Your invitations have been sent"
|
||||
msgstr "Ваш код приглашения был отправлен"
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while trying to send the invitation emails. "
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "%(member)s has been added"
|
||||
msgstr "%(member)s был добавлен"
|
||||
|
@ -795,3 +812,6 @@ msgstr "Период"
|
|||
#~ msgid "each"
|
||||
#~ msgstr "каждый"
|
||||
|
||||
#~ msgid "Error while sending reminder email"
|
||||
#~ msgstr ""
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-05-09 21:41+0200\n"
|
||||
"POT-Creation-Date: 2020-05-18 15:11+0200\n"
|
||||
"PO-Revision-Date: 2019-08-07 13:24+0000\n"
|
||||
"Last-Translator: Mesut Akcan <makcan@gmail.com>\n"
|
||||
"Language: tr\n"
|
||||
|
@ -13,7 +13,7 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Generated-By: Babel 2.7.0\n"
|
||||
"Generated-By: Babel 2.8.0\n"
|
||||
|
||||
msgid ""
|
||||
"Not a valid amount or expression. Only numbers and + - * / operators are "
|
||||
|
@ -178,13 +178,24 @@ msgstr ""
|
|||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr ""
|
||||
|
||||
msgid "Error while sending reminder email"
|
||||
msgid "A reminder email has just been sent to you"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"We tried to send you an reminder email, but there was an error. You can "
|
||||
"still use the project normally."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "The project identifier is %(project)s"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while sending you an email with password reset "
|
||||
"instructions. Please check the email configuration of the server or "
|
||||
"contact the administrator."
|
||||
msgstr ""
|
||||
|
||||
msgid "No token provided"
|
||||
msgstr ""
|
||||
|
||||
|
@ -213,6 +224,12 @@ msgstr ""
|
|||
msgid "Your invitations have been sent"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while trying to send the invitation emails. "
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "%(member)s has been added"
|
||||
msgstr ""
|
||||
|
@ -762,3 +779,6 @@ msgstr ""
|
|||
#~ msgid "each"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Error while sending reminder email"
|
||||
#~ msgstr ""
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-05-09 21:41+0200\n"
|
||||
"POT-Creation-Date: 2020-05-18 15:11+0200\n"
|
||||
"PO-Revision-Date: 2019-12-08 16:26+0000\n"
|
||||
"Last-Translator: Tymofij Lytvynenko <till.svit@gmail.com>\n"
|
||||
"Language: uk\n"
|
||||
|
@ -14,7 +14,7 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Generated-By: Babel 2.7.0\n"
|
||||
"Generated-By: Babel 2.8.0\n"
|
||||
|
||||
msgid ""
|
||||
"Not a valid amount or expression. Only numbers and + - * / operators are "
|
||||
|
@ -175,13 +175,24 @@ msgstr ""
|
|||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr ""
|
||||
|
||||
msgid "Error while sending reminder email"
|
||||
msgid "A reminder email has just been sent to you"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"We tried to send you an reminder email, but there was an error. You can "
|
||||
"still use the project normally."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "The project identifier is %(project)s"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while sending you an email with password reset "
|
||||
"instructions. Please check the email configuration of the server or "
|
||||
"contact the administrator."
|
||||
msgstr ""
|
||||
|
||||
msgid "No token provided"
|
||||
msgstr ""
|
||||
|
||||
|
@ -210,6 +221,12 @@ msgstr ""
|
|||
msgid "Your invitations have been sent"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while trying to send the invitation emails. "
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "%(member)s has been added"
|
||||
msgstr ""
|
||||
|
@ -759,3 +776,6 @@ msgstr ""
|
|||
#~ msgid "each"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Error while sending reminder email"
|
||||
#~ msgstr ""
|
||||
|
||||
|
|
|
@ -1,19 +1,20 @@
|
|||
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-05-09 21:41+0200\n"
|
||||
"POT-Creation-Date: 2020-05-18 15:11+0200\n"
|
||||
"PO-Revision-Date: 2020-05-13 15:41+0000\n"
|
||||
"Last-Translator: Muge Niu <mugeniu12138@gmail.com>\n"
|
||||
"Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/"
|
||||
"i-hate-money/i-hate-money/zh_Hans/>\n"
|
||||
"Language: zh_HANS-CN\n"
|
||||
"Language: zh_HANS_CN\n"
|
||||
"Language-Team: Chinese (Simplified) "
|
||||
"<https://hosted.weblate.org/projects/i-hate-money/i-hate-money/zh_Hans/>"
|
||||
"\n"
|
||||
"Plural-Forms: nplurals=1; plural=0\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Weblate 4.1-dev\n"
|
||||
"Generated-By: Babel 2.7.0\n"
|
||||
"Generated-By: Babel 2.8.0\n"
|
||||
|
||||
msgid ""
|
||||
"Not a valid amount or expression. Only numbers and + - * / operators are "
|
||||
|
@ -174,13 +175,24 @@ msgstr "专用码不正确"
|
|||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr "你新建了一个‘%(project)s'来分担你的花费"
|
||||
|
||||
msgid "Error while sending reminder email"
|
||||
msgstr "发送提醒邮件时出错"
|
||||
msgid "A reminder email has just been sent to you"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"We tried to send you an reminder email, but there was an error. You can "
|
||||
"still use the project normally."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "The project identifier is %(project)s"
|
||||
msgstr "项目的标识符是%(project)s"
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while sending you an email with password reset "
|
||||
"instructions. Please check the email configuration of the server or "
|
||||
"contact the administrator."
|
||||
msgstr ""
|
||||
|
||||
msgid "No token provided"
|
||||
msgstr "没有符号"
|
||||
|
||||
|
@ -209,6 +221,12 @@ msgstr "你被邀请进入 %(project)s来分担你的花费"
|
|||
msgid "Your invitations have been sent"
|
||||
msgstr "你的申请已发出"
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while trying to send the invitation emails. "
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "%(member)s has been added"
|
||||
msgstr "已添加%(member)s"
|
||||
|
@ -771,3 +789,7 @@ msgstr "期间"
|
|||
|
||||
#~ msgid "each"
|
||||
#~ msgstr "每一个·"
|
||||
|
||||
#~ msgid "Error while sending reminder email"
|
||||
#~ msgstr "发送提醒邮件时出错"
|
||||
|
||||
|
|
|
@ -7,6 +7,8 @@ from json import JSONEncoder, dumps
|
|||
import operator
|
||||
import os
|
||||
import re
|
||||
import smtplib
|
||||
import socket
|
||||
|
||||
from babel import Locale
|
||||
from babel.numbers import get_currency_name, get_currency_symbol
|
||||
|
@ -28,6 +30,22 @@ def slugify(value):
|
|||
return re.sub(r"[-\s]+", "-", value)
|
||||
|
||||
|
||||
def send_email(mail_message):
|
||||
"""Send an email using Flask-Mail, with proper error handling.
|
||||
|
||||
Return True if everything went well, and False if there was an error.
|
||||
"""
|
||||
# Since Python 3.4, SMTPException and socket.error are actually
|
||||
# identical, but this was not the case before. Also, it is more clear
|
||||
# to check for both.
|
||||
try:
|
||||
current_app.mail.send(mail_message)
|
||||
except (smtplib.SMTPException, socket.error):
|
||||
return False
|
||||
# Email was sent successfully
|
||||
return True
|
||||
|
||||
|
||||
class Redirect303(HTTPException, RoutingException):
|
||||
|
||||
"""Raise if the map requests a redirect. This is for example the case if
|
||||
|
|
|
@ -12,7 +12,6 @@ from datetime import datetime
|
|||
from functools import wraps
|
||||
import json
|
||||
import os
|
||||
from smtplib import SMTPRecipientsRefused
|
||||
|
||||
from dateutil.parser import parse
|
||||
from dateutil.relativedelta import relativedelta
|
||||
|
@ -60,6 +59,7 @@ from ihatemoney.utils import (
|
|||
list_of_dicts2json,
|
||||
render_localized_template,
|
||||
same_bill,
|
||||
send_email,
|
||||
)
|
||||
|
||||
main = Blueprint("main", __name__)
|
||||
|
@ -308,11 +308,21 @@ def create_project():
|
|||
msg = Message(
|
||||
message_title, body=message_body, recipients=[project.contact_email]
|
||||
)
|
||||
try:
|
||||
current_app.mail.send(msg)
|
||||
except SMTPRecipientsRefused:
|
||||
flash(_("Error while sending reminder email"), category="danger")
|
||||
|
||||
success = send_email(msg)
|
||||
if success:
|
||||
flash(
|
||||
_("A reminder email has just been sent to you"), category="success"
|
||||
)
|
||||
else:
|
||||
# Display the error as a simple "info" alert, because it's
|
||||
# not critical and doesn't prevent using the project.
|
||||
flash(
|
||||
_(
|
||||
"We tried to send you an reminder email, but there was an error. "
|
||||
"You can still use the project normally."
|
||||
),
|
||||
category="info",
|
||||
)
|
||||
# redirect the user to the next step (invite)
|
||||
flash(_("The project identifier is %(project)s", project=project.id))
|
||||
return redirect(url_for(".list_bills", project_id=project.id))
|
||||
|
@ -328,17 +338,25 @@ def remind_password():
|
|||
# get the project
|
||||
project = Project.query.get(form.id.data)
|
||||
# send a link to reset the password
|
||||
current_app.mail.send(
|
||||
Message(
|
||||
"password recovery",
|
||||
body=render_localized_template(
|
||||
"password_reminder", project=project
|
||||
),
|
||||
recipients=[project.contact_email],
|
||||
)
|
||||
remind_message = Message(
|
||||
"password recovery",
|
||||
body=render_localized_template("password_reminder", project=project),
|
||||
recipients=[project.contact_email],
|
||||
)
|
||||
return redirect(url_for(".password_reminder_sent"))
|
||||
|
||||
success = send_email(remind_message)
|
||||
if success:
|
||||
return redirect(url_for(".password_reminder_sent"))
|
||||
else:
|
||||
flash(
|
||||
_(
|
||||
"Sorry, there was an error while sending you an email "
|
||||
"with password reset instructions. "
|
||||
"Please check the email configuration of the server "
|
||||
"or contact the administrator."
|
||||
),
|
||||
category="danger",
|
||||
)
|
||||
# Fall-through: we stay on the same page and display the form again
|
||||
return render_template("password_reminder.html", form=form)
|
||||
|
||||
|
||||
|
@ -585,10 +603,20 @@ def invite():
|
|||
body=message_body,
|
||||
recipients=[email.strip() for email in form.emails.data.split(",")],
|
||||
)
|
||||
current_app.mail.send(msg)
|
||||
flash(_("Your invitations have been sent"))
|
||||
return redirect(url_for(".list_bills"))
|
||||
|
||||
success = send_email(msg)
|
||||
if success:
|
||||
flash(_("Your invitations have been sent"), category="success")
|
||||
return redirect(url_for(".list_bills"))
|
||||
else:
|
||||
flash(
|
||||
_(
|
||||
"Sorry, there was an error while trying to send the invitation emails. "
|
||||
"Please check the email configuration of the server "
|
||||
"or contact the administrator."
|
||||
),
|
||||
category="danger",
|
||||
)
|
||||
# Fall-through: we stay on the same page and display the form again
|
||||
return render_template("send_invites.html", form=form)
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue