From 56c3deca574fc4501cc9b51128b4f3b0467d24c9 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Fri, 5 Mar 2021 18:20:56 +0100 Subject: [PATCH 01/12] Added mail templates for forgotten selfservice links ref #5 --- src/templates/runner_link.html | 396 +++++++++++++++++++++++++++++++++ src/templates/runner_link.txt | 15 ++ 2 files changed, 411 insertions(+) create mode 100644 src/templates/runner_link.html create mode 100644 src/templates/runner_link.txt diff --git a/src/templates/runner_link.html b/src/templates/runner_link.html new file mode 100644 index 0000000..460b8e0 --- /dev/null +++ b/src/templates/runner_link.html @@ -0,0 +1,396 @@ + + + + + Your {{event_name}} profile<title> <!-- The title tag shows in email notifications, like Android 4.4. --> + <meta charset="utf-8"> <!-- utf-8 works for most cases --> + <meta http-equiv="Content-Type" content="text/html charset=UTF-8" /> + <meta name="viewport" content="width=device-width"> <!-- Forcing initial-scale shouldn't be necessary --> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> <!-- Use the latest (edge) version of IE rendering engine --> + <meta name="x-apple-disable-message-reformatting"> <!-- Disable auto-scale in iOS 10 Mail entirely --> + <meta name="format-detection" content="telephone=no,address=no,email=no,date=no,url=no"> <!-- Tell iOS not to automatically link certain text strings. --> + + <!-- CSS Reset : BEGIN --> + <style> + /* What it does: Remove spaces around the email design added by some email clients. */ + /* Beware: It can remove the padding / margin and add a background color to the compose a reply window. */ + html, + body { + margin: 0 auto !important; + padding: 0 !important; + height: 100% !important; + width: 100% !important; + } + + /* What it does: Stops email clients resizing small text. */ + * { + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; + } + + /* What it does: Centers email on Android 4.4 */ + div[style*="margin: 16px 0"] { + margin:0 !important; + } + + /* What it does: Stops Outlook from adding extra spacing to tables. */ + table, + td { + mso-table-lspace: 0pt !important; + mso-table-rspace: 0pt !important; + } + + /* What it does: Fixes webkit padding issue. */ + table { + border: 0; + border-spacing: 0; + border-collapse: collapse + } + + /* What it does: Forces Samsung Android mail clients to use the entire viewport. */ + #MessageViewBody, + #MessageWebViewDiv{ + width: 100% !important; + } + + /* What it does: Uses a better rendering method when resizing images in IE. */ + img { + -ms-interpolation-mode:bicubic; + } + + /* What it does: Prevents Windows 10 Mail from underlining links despite inline CSS. Styles for underlined links should be inline. */ + a { + text-decoration: none; + } + + /* What it does: A work-around for email clients automatically linking certain text strings. */ + /* iOS */ + a[x-apple-data-detectors], + .unstyle-auto-detected-links a, + .aBn { + border-bottom: 0 !important; + cursor: default !important; + color: inherit !important; + text-decoration: none !important; + font-size: inherit !important; + font-family: inherit !important; + font-weight: inherit !important; + line-height: inherit !important; + } + u + #body a, /* Gmail */ + #MessageViewBody a /* Samsung Mail */ + { + color: inherit; + text-decoration: none; + font-size: inherit; + font-family: inherit; + font-weight: inherit; + line-height: inherit; + } + + /* What it does: Prevents Gmail from changing the text color in conversation threads. */ + .im { + color: inherit !important; + } + + /* What it does: Prevents Gmail from displaying an download button on large, non-linked images. */ + .a6S { + display: none !important; + opacity: 0.01 !important; + } + /* If the above doesn't work, add a .g-img class to any image in question. */ + img.g-img + div { + display:none !important; + } + + /* What it does: Removes right gutter in Gmail iOS app: https://github.com/TedGoas/Cerberus/issues/89 */ + /* Create one of these media queries for each additional viewport size you'd like to fix */ + + /* iPhone 4, 4S, 5, 5S, 5C, and 5SE */ + @media only screen and (min-device-width: 320px) and (max-device-width: 374px) { + u ~ div .email-container { + min-width: 320px !important; + } + } + /* iPhone 6, 6S, 7, 8, and X */ + @media only screen and (min-device-width: 375px) and (max-device-width: 413px) { + u ~ div .email-container { + min-width: 375px !important; + } + } + /* iPhone 6+, 7+, and 8+ */ + @media only screen and (min-device-width: 414px) { + u ~ div .email-container { + min-width: 414px !important; + } + } + </style> + <!-- What it does: Helps DPI scaling in Outlook 2007-2013 --> + <!--[if gte mso 9]> + <xml> + <o:OfficeDocumentSettings> + <o:AllowPNG/> + <o:PixelsPerInch>96</o:PixelsPerInch> + </o:OfficeDocumentSettings> + </xml> + <![endif]--> + + <!-- CSS Reset : END --> + + <!-- Progressive Enhancements : BEGIN --> + <style> + /* What it does: Hover styles for buttons and tags */ + .s-btn__primary:hover { + background: #0077CC !important; + border-color: #0077CC !important; + } + .s-btn__white:hover { + background: #EFF0F1 !important; + border-color: #EFF0F1 !important; + } + .s-btn__outlined:hover { + background: rgba(0,119,204,.05) !important; + color: #005999 !important; + } + .s-tag:hover, + .post-tag:hover { + border-color: #cee0ed !important; + background: #cee0ed !important; + } + + /* What it does: Styles markdown links that we can't write inline CSS for. */ + .has-markdown a, + .has-markdown a:visited { + color: #0077CC !important; + text-decoration: none !important; + } + + /* What it does: Styles markdown code blocks that we can't write inline CSS for. */ + code { + padding: 1px 5px; + background-color: #EFF0F1; + color: #242729; + font-size: 13px; + line-height: inherit; + font-family: Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, sans-serif; + } + pre { + margin: 0 0 15px; + line-height: 17px; + background-color: #EFF0F1; + padding: 4px 8px; + border-radius: 3px; + overflow-x: auto; + } + pre code { + margin: 0 0 15px; + padding: 0; + line-height: 17px; + background-color: none; + } + + /* What it does: Styles markdown blockquotes that we can't write inline CSS for. */ + blockquote { + margin: 0 0 15px; + padding: 4px 10px; + background-color: #FFF8DC; + border-left: 2px solid #ffeb8e; + } + blockquote p { + padding: 4px 0; + margin: 0; + overflow-wrap: break-word; + } + + /* What it does: Rounds corners in email clients that support it */ + .bar { + border-radius: 5px; + } + .btr { + border-top-left-radius: 5px; + border-top-right-radius: 5px; + } + .bbr { + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + } + + @media screen and (max-width: 680px) { + /* What it does: Forces table cells into full-width rows. */ + .stack-column, + .stack-column-center { + display: block !important; + width: 100% !important; + max-width: 100% !important; + direction: ltr !important; + } + /* And center justify these ones. */ + .stack-column-center { + text-align: center !important; + } + + /* Hides things in small viewports. */ + .hide-on-mobile { + display: none !important; + max-height: 0 !important; + overflow: hidden !important; + visibility: hidden !important; + } + + /* What it does: Utility classes to reduce spacing for smaller viewports. */ + .sm-p-none {padding: 0 !important;} + .sm-pt-none {padding-top: 0 !important;} + .sm-pb-none {padding-bottom: 0 !important;} + .sm-pr-none {padding-right: 0 !important;} + .sm-pl-none {padding-left: 0 !important;} + .sm-px-none {padding-left: 0 !important; padding-right: 0 !important;} + .sm-py-none {padding-top: 0 !important; padding-bottom: 0 !important;} + + .sm-p {padding: 20px !important;} + .sm-pt {padding-top: 20px !important;} + .sm-pb {padding-bottom: 20px !important;} + .sm-pr {padding-right: 20px !important;} + .sm-pl {padding-left: 20px !important;} + .sm-px {padding-left: 20px !important; padding-right: 20px !important;} + .sm-py {padding-top: 20px !important; padding-bottom: 20px !important;} + .sm-mb {margin-bottom: 20px !important;} + + /* What it does: Utility classes to kill border radius for smaller viewports. Used mainly on the email's main container(s). */ + .bar, + .btr, + .bbr { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + } + } + </style> + <!-- Progressive Enhancements : END --> +</head> + +<!-- + The email background color is defined in three places, just below. If you change one, remember to change the others. + 1. body tag: for most email clients + 2. center tag: for Gmail and Inbox mobile apps and web versions of Gmail, GSuite, Inbox, Yahoo, AOL, Libero, Comcast, freenet, Mail.ru, Orange.fr + 3. mso conditional: For Windows 10 Mail +--> +<body width="100%" style="margin: 0; padding: 0 !important; background: #f3f3f5; mso-line-height-rule: exactly;"> + <center style="width: 100%; background: #f3f3f5;"> + <!--[if mso | IE]> + <table role="presentation" border="0" cellpadding="0" cellspacing="0" width="100%" style="background-color: #f3f3f5;"> + <tr> + <td> + <![endif]--> + + <!-- Visually Hidden Preview Text : BEGIN --> + <div style="display: none; font-size: 1px; line-height: 1px; max-height: 0px; max-width: 0px; opacity: 0; overflow: hidden; mso-hide: all; font-family: sans-serif;"> + Your {{event_name}} profile + </div> + <!-- Visually Hidden Preview Text : END --> + + <div class="email-container" style="max-width: 680px; margin: 0 auto;"> + <!--[if mso]> + <table role="presentation" cellspacing="0" cellpadding="0" border="0" width="680" align="center"> + <tr> + <td> + <![endif]--> + <table border="0" cellpadding="0" cellspacing="0" role="presentation" style="max-width: 680px; width:100%"> + <tr> + <td style="padding: 30px; background-color: #ffffff;" class="sm-p bar"> + <table border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;"> + <tr> + <td style="padding-bottom: 15px; font-family: arial, sans-serif; font-size: 15px; line-height: 21px; color: #3C3F44; text-align: left;"> + <h1 style="font-weight: bold; font-size: 27px; line-height: 27px; color: #0C0D0E; margin: 0 0 15px 0;">{{event_name}}</h1> + </td> + </tr> + <tr> + <td style="padding-bottom: 15px; font-family: arial, sans-serif; font-size: 15px; line-height: 21px; color: #3C3F44; text-align: left;"> + <h1 style="font-weight: bold; font-size: 21px; line-height: 21px; color: #0C0D0E; margin: 0 0 15px 0;">Your Profile</h1> + <p style="margin: 0 0 15px;" class="has-markdown"> + Thank you for requesting a new link to your {{event_name}} runner profile.<br> + {{__ "you-can-view-your-registration-code-lap-times-and-much-more-by-visiting-our-selfservice"}} + </p> + </td> + </tr> + <!-- Button Row : BEGIN --> + <tr> + <td> + <!-- Button : BEGIN --> + <table align="left" border="0" cellpadding="0" cellspacing="0" role="presentation"> + <tr> + <td class="s-btn s-btn__primary" style="border-radius: 4px; background: #0095ff;"> + <a class="s-btn s-btn__primary" href="{{selfservice_link}}" target="_parent" style="background: #0095FF; border: 1px solid #0077cc; box-shadow: inset 0 1px 0 0 rgba(102,191,255,.75); font-family: arial, sans-serif; font-size: 17px; line-height: 17px; color: #ffffff; text-align: center; text-decoration: none; padding: 13px 17px; display: block; border-radius: 4px; white-space: nowrap;">{{__ "view-my-data"}}</a> + </td> + </tr> + </table> + <!-- Button : END --> + </td> + </tr> + <tr> + <td style="padding-bottom: 15px; font-family: arial, sans-serif; font-size: 15px; line-height: 21px; color: #3C3F44; text-align: left;"> + <p>Link: <a href="{{selfservice_link}}">{{selfservice_link}}</a><br> + {{__ "if-you-ever-loose-the-link-you-can-request-a-new-one-by-visiting-our-website"}} <a href="{{forgot_link}}">{{forgot_link}}</a></p></td> + </tr> + <!-- Button Row : END --> + </table> + </td> + </tr> + + <!----------------------------- + + EMAIL BODY : END + + ------------------------------> + + <!-- Footer : BEGIN --> + <tr> + <td style="padding: 30px;" class="sm-p"> + <table align="left" border="0" cellpadding="0" cellspacing="0" role="presentation" width="100%"> + <!-- Subscription Info : BEGIN --> + <tr> + <td style="padding-bottom: 10px; font-size: 12px; line-height: 15px; font-family: arial, sans-serif; color: #9199A1; text-align: left;"> + Copyright © {{copyright_owner}}. {{__ "all-rights-reserved"}} + </td> + </tr> + <tr> + <td style="font-size: 12px; line-height: 15px; font-family: arial, sans-serif; color: #9199A1; text-align: left;"> + <a href="{{link_imprint}}" + style="color: #9199A1; text-decoration: underline;">{{__ "imprint"}}</a>     + <a href="{{link_privacy}}" style="color: #9199A1; text-decoration: underline;">{{__ "privacy"}}</a> + </td> + </tr> + <!-- Subscription Info : BEGIN --> + <!-- HR line : BEGIN --> + <tr> + <td style="padding: 30px 0;" width="100%" class="sm-py"> + <table aria-hidden="true" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%"> + <tr> + <td height="1" width="100%" style="font-size: 0; line-height: 0; border-top: 1px solid #D6D8DB;"> </td> + </tr> + </table> + </td> + </tr> + <!-- HR line : END --> + <tr> + <td style="padding-bottom: 5px; font-size: 12px; line-height: 15px; font-family: arial, sans-serif; color: #9199A1; text-align: left;"> + This mail was sent to you, because someone requested a new link to access your profile for the {{event_name}}.<br> + To prevent spam you can only request a new link every 24hrs.<br> + {{__ "if-you-didnt-register-yourself-you-should-contact-us-to-get-your-data-removed-from-our-systems"}} <a href="mailto:{{contact_mail}}">{{contact_mail}}</a> + </td> + </tr> + <!-- Sender Info : END --> + </table> + </td> + </tr> + <!-- Footer : END --> + </table> + </div> + <!--[if mso | IE]> + </td> + </tr> + </table> + <![endif]--> + </center> +</body> +</html> \ No newline at end of file diff --git a/src/templates/runner_link.txt b/src/templates/runner_link.txt new file mode 100644 index 0000000..75d3e32 --- /dev/null +++ b/src/templates/runner_link.txt @@ -0,0 +1,15 @@ +Your {{event_name}} profile + +Thank you for requesting a new link to your {{event_name}} runner profile. +{{__ "you-can-view-your-registration-code-lap-times-and-much-more-by-visiting-our-selfservice"}} + +{{selfservice_link}} + +{{__ "if-you-ever-loose-the-link-you-can-request-a-new-one-by-visiting-our-website"}} {{forgot_link}} + + +Copyright © {{copyright_owner}}. {{__ "all-rights-reserved"}}. +{{__ "imprint"}}: {{link_imprint}} | {{__ "privacy"}}: {{link_privacy}} +This mail was sent to you, because someone requested a new link to access your profile for the {{event_name}}. +To prevent spam you can only request a new link every 24hrs. +{{__ "if-you-didnt-register-yourself-you-should-contact-us-to-get-your-data-removed-from-our-systems"}} {{contact_mail}} \ No newline at end of file From 1d4d1d18d85349b6f877fa5f1df82fe0d9dafe79 Mon Sep 17 00:00:00 2001 From: Nicolai Ort <info@nicolai-ort.com> Date: Fri, 5 Mar 2021 18:23:52 +0100 Subject: [PATCH 02/12] Added translation keys ref #5 --- src/locales/en.json | 55 ++++++++++++++++++---------------- src/templates/runner_link.html | 12 ++++---- 2 files changed, 36 insertions(+), 31 deletions(-) diff --git a/src/locales/en.json b/src/locales/en.json index 627914c..4cd63bf 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -1,26 +1,31 @@ { - "a-password-reset-for-your-account-got-requested": "A password reset for your account got requested.", - "all-rights-reserved": "All rights reserved.", - "event_name-registration": "{{event_name}} Registration", - "if-you-didnt-register-yourself-you-should-contact-us-to-get-your-data-removed-from-our-systems": "If you didn't register yourself you should contact us to get your data removed from our systems:", - "if-you-didnt-request-the-reset-please-ignore-this-mail": "If you didn't request the reset please ignore this mail.", - "if-you-ever-loose-the-link-you-can-request-a-new-one-by-visiting-our-website": "If you ever loose the link you can request a new one by visiting our website:", - "imprint": "Imprint", - "lfk-mail-test": "{{copyright_owner}} - Mail test", - "lfk-password-reset": "{{copyright_owner}} - Password reset", - "password-reset": "Password reset", - "privacy": "Privacy", - "reset-password": "Reset password", - "test-mail": "Test mail", - "thanks-for-registering-and-welcome-to-the-event_name": "Thanks for registering and welcome to the {{event_name}}!", - "the-only-thing-you-have-to-do-now-is-to-bring-your-registration-code-with-you": "The only thing you have to do now is to bring your registration code with you.", - "this-is-a-test-mail-triggered-by-an-admin-in-the-lfk-backend": "This is a test mail triggered by an admin in the LfK! backend.", - "this-mail-was-sent-to-recipient_mail-because-someone-request-a-mail-test-for-this-mail-address": "This mail was sent to you because someone request a mail test for this mail address.", - "this-mail-was-sent-to-you-because-someone-request-a-password-reset-for-a-account-linked-to-the-mail-address": "This mail was sent to you because someone request a password reset for a account linked to the mail address.", - "this-mail-was-sent-to-you-because-someone-used-your-mail-address-to-register-themselfes-for-the-event_name": "This mail was sent to you, because someone used your mail address to register themselfes for the {{event_name}}", - "view-my-data": "View my data", - "we-successfully-processed-your-registration": "We successfully processed your registration.", - "welcome": "Welcome", - "you-can-view-your-registration-code-lap-times-and-much-more-by-visiting-our-selfservice": "You can view your registration code, lap times and much more by visiting our selfservice:", - "your-password-wont-be-changed-until-you-click-the-reset-link-below-and-set-a-new-one": "Your password won't be changed until you click the reset link below and set a new one." -} \ No newline at end of file + "a-password-reset-for-your-account-got-requested": "A password reset for your account got requested.", + "all-rights-reserved": "All rights reserved.", + "event_name-registration": "{{event_name}} Registration", + "if-you-didnt-register-yourself-you-should-contact-us-to-get-your-data-removed-from-our-systems": "If you didn't register yourself you should contact us to get your data removed from our systems:", + "if-you-didnt-request-the-reset-please-ignore-this-mail": "If you didn't request the reset please ignore this mail.", + "if-you-ever-loose-the-link-you-can-request-a-new-one-by-visiting-our-website": "If you ever loose the link you can request a new one by visiting our website:", + "imprint": "Imprint", + "lfk-mail-test": "{{copyright_owner}} - Mail test", + "lfk-password-reset": "{{copyright_owner}} - Password reset", + "password-reset": "Password reset", + "privacy": "Privacy", + "reset-password": "Reset password", + "test-mail": "Test mail", + "thanks-for-registering-and-welcome-to-the-event_name": "Thanks for registering and welcome to the {{event_name}}!", + "the-only-thing-you-have-to-do-now-is-to-bring-your-registration-code-with-you": "The only thing you have to do now is to bring your registration code with you.", + "this-is-a-test-mail-triggered-by-an-admin-in-the-lfk-backend": "This is a test mail triggered by an admin in the LfK! backend.", + "this-mail-was-sent-to-recipient_mail-because-someone-request-a-mail-test-for-this-mail-address": "This mail was sent to you because someone request a mail test for this mail address.", + "this-mail-was-sent-to-you-because-someone-request-a-password-reset-for-a-account-linked-to-the-mail-address": "This mail was sent to you because someone request a password reset for a account linked to the mail address.", + "this-mail-was-sent-to-you-because-someone-used-your-mail-address-to-register-themselfes-for-the-event_name": "This mail was sent to you, because someone used your mail address to register themselfes for the {{event_name}}", + "view-my-data": "View my data", + "we-successfully-processed-your-registration": "We successfully processed your registration.", + "welcome": "Welcome", + "you-can-view-your-registration-code-lap-times-and-much-more-by-visiting-our-selfservice": "You can view your registration code, lap times and much more by visiting our selfservice:", + "your-password-wont-be-changed-until-you-click-the-reset-link-below-and-set-a-new-one": "Your password won't be changed until you click the reset link below and set a new one.", + "your-event_name-profile": "Your {{event_name}} profile", + "your-profile": "Your Profile", + "thank-you-for-requesting-a-new-link-to-your-event_name-runner-profile": "Thank you for requesting a new link to your {{event_name}} runner profile.", + "this-mail-was-sent-to-you-because-someone-requested-a-new-link-to-access-your-profile-for-the-event_name": "This mail was sent to you, because someone requested a new link to access your profile for the {{event_name}}.", + "to-prevent-spam-you-can-only-request-a-new-link-every-24hrs": "To prevent spam you can only request a new link every 24hrs." +} diff --git a/src/templates/runner_link.html b/src/templates/runner_link.html index 460b8e0..056f5b3 100644 --- a/src/templates/runner_link.html +++ b/src/templates/runner_link.html @@ -2,7 +2,7 @@ <!DOCTYPE html> <html lang="de" xmlns="http://www.w3.org/1999/xhtml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:v="urn:schemas-microsoft-com:vml"> <head> - <title>Your {{event_name}} profile<title> <!-- The title tag shows in email notifications, like Android 4.4. --> + <title>{{__ "your-event_name-profile"}}<title> <!-- The title tag shows in email notifications, like Android 4.4. --> <meta charset="utf-8"> <!-- utf-8 works for most cases --> <meta http-equiv="Content-Type" content="text/html charset=UTF-8" /> <meta name="viewport" content="width=device-width"> <!-- Forcing initial-scale shouldn't be necessary --> @@ -285,7 +285,7 @@ <!-- Visually Hidden Preview Text : BEGIN --> <div style="display: none; font-size: 1px; line-height: 1px; max-height: 0px; max-width: 0px; opacity: 0; overflow: hidden; mso-hide: all; font-family: sans-serif;"> - Your {{event_name}} profile + {{__ "your-event_name-profile"}} </div> <!-- Visually Hidden Preview Text : END --> @@ -306,9 +306,9 @@ </tr> <tr> <td style="padding-bottom: 15px; font-family: arial, sans-serif; font-size: 15px; line-height: 21px; color: #3C3F44; text-align: left;"> - <h1 style="font-weight: bold; font-size: 21px; line-height: 21px; color: #0C0D0E; margin: 0 0 15px 0;">Your Profile</h1> + <h1 style="font-weight: bold; font-size: 21px; line-height: 21px; color: #0C0D0E; margin: 0 0 15px 0;">{{__ "your-profile"}}</h1> <p style="margin: 0 0 15px;" class="has-markdown"> - Thank you for requesting a new link to your {{event_name}} runner profile.<br> + {{__ "thank-you-for-requesting-a-new-link-to-your-event_name-runner-profile"}}<br> {{__ "you-can-view-your-registration-code-lap-times-and-much-more-by-visiting-our-selfservice"}} </p> </td> @@ -374,8 +374,8 @@ <!-- HR line : END --> <tr> <td style="padding-bottom: 5px; font-size: 12px; line-height: 15px; font-family: arial, sans-serif; color: #9199A1; text-align: left;"> - This mail was sent to you, because someone requested a new link to access your profile for the {{event_name}}.<br> - To prevent spam you can only request a new link every 24hrs.<br> + {{__ "this-mail-was-sent-to-you-because-someone-requested-a-new-link-to-access-your-profile-for-the-event_name"}}<br> + {{__ "to-prevent-spam-you-can-only-request-a-new-link-every-24hrs"}}<br> {{__ "if-you-didnt-register-yourself-you-should-contact-us-to-get-your-data-removed-from-our-systems"}} <a href="mailto:{{contact_mail}}">{{contact_mail}}</a> </td> </tr> From 44972e4a93204aa9f6acbbf29f3012aa8213af77 Mon Sep 17 00:00:00 2001 From: Nicolai Ort <info@nicolai-ort.com> Date: Fri, 5 Mar 2021 18:25:06 +0100 Subject: [PATCH 03/12] Added translation keys to txt ref #5 --- src/templates/runner_link.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/templates/runner_link.txt b/src/templates/runner_link.txt index 75d3e32..1597847 100644 --- a/src/templates/runner_link.txt +++ b/src/templates/runner_link.txt @@ -1,6 +1,6 @@ -Your {{event_name}} profile +{{__ "your-event_name-profile"}} -Thank you for requesting a new link to your {{event_name}} runner profile. +{{__ "thank-you-for-requesting-a-new-link-to-your-event_name-runner-profile"}} {{__ "you-can-view-your-registration-code-lap-times-and-much-more-by-visiting-our-selfservice"}} {{selfservice_link}} @@ -10,6 +10,6 @@ Thank you for requesting a new link to your {{event_name}} runner profile. Copyright © {{copyright_owner}}. {{__ "all-rights-reserved"}}. {{__ "imprint"}}: {{link_imprint}} | {{__ "privacy"}}: {{link_privacy}} -This mail was sent to you, because someone requested a new link to access your profile for the {{event_name}}. -To prevent spam you can only request a new link every 24hrs. +{{__ "this-mail-was-sent-to-you-because-someone-requested-a-new-link-to-access-your-profile-for-the-event_name"}} +{{__ "to-prevent-spam-you-can-only-request-a-new-link-every-24hrs"}} {{__ "if-you-didnt-register-yourself-you-should-contact-us-to-get-your-data-removed-from-our-systems"}} {{contact_mail}} \ No newline at end of file From 9ba4b4001d35afa49e4eb3232a21784ed443c52e Mon Sep 17 00:00:00 2001 From: Nicolai Ort <info@nicolai-ort.com> Date: Fri, 5 Mar 2021 18:25:25 +0100 Subject: [PATCH 04/12] Sorted locales ref #5 --- src/locales/en.json | 60 ++++++++++++++++++++++----------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/src/locales/en.json b/src/locales/en.json index 4cd63bf..1f2592b 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -1,31 +1,31 @@ { - "a-password-reset-for-your-account-got-requested": "A password reset for your account got requested.", - "all-rights-reserved": "All rights reserved.", - "event_name-registration": "{{event_name}} Registration", - "if-you-didnt-register-yourself-you-should-contact-us-to-get-your-data-removed-from-our-systems": "If you didn't register yourself you should contact us to get your data removed from our systems:", - "if-you-didnt-request-the-reset-please-ignore-this-mail": "If you didn't request the reset please ignore this mail.", - "if-you-ever-loose-the-link-you-can-request-a-new-one-by-visiting-our-website": "If you ever loose the link you can request a new one by visiting our website:", - "imprint": "Imprint", - "lfk-mail-test": "{{copyright_owner}} - Mail test", - "lfk-password-reset": "{{copyright_owner}} - Password reset", - "password-reset": "Password reset", - "privacy": "Privacy", - "reset-password": "Reset password", - "test-mail": "Test mail", - "thanks-for-registering-and-welcome-to-the-event_name": "Thanks for registering and welcome to the {{event_name}}!", - "the-only-thing-you-have-to-do-now-is-to-bring-your-registration-code-with-you": "The only thing you have to do now is to bring your registration code with you.", - "this-is-a-test-mail-triggered-by-an-admin-in-the-lfk-backend": "This is a test mail triggered by an admin in the LfK! backend.", - "this-mail-was-sent-to-recipient_mail-because-someone-request-a-mail-test-for-this-mail-address": "This mail was sent to you because someone request a mail test for this mail address.", - "this-mail-was-sent-to-you-because-someone-request-a-password-reset-for-a-account-linked-to-the-mail-address": "This mail was sent to you because someone request a password reset for a account linked to the mail address.", - "this-mail-was-sent-to-you-because-someone-used-your-mail-address-to-register-themselfes-for-the-event_name": "This mail was sent to you, because someone used your mail address to register themselfes for the {{event_name}}", - "view-my-data": "View my data", - "we-successfully-processed-your-registration": "We successfully processed your registration.", - "welcome": "Welcome", - "you-can-view-your-registration-code-lap-times-and-much-more-by-visiting-our-selfservice": "You can view your registration code, lap times and much more by visiting our selfservice:", - "your-password-wont-be-changed-until-you-click-the-reset-link-below-and-set-a-new-one": "Your password won't be changed until you click the reset link below and set a new one.", - "your-event_name-profile": "Your {{event_name}} profile", - "your-profile": "Your Profile", - "thank-you-for-requesting-a-new-link-to-your-event_name-runner-profile": "Thank you for requesting a new link to your {{event_name}} runner profile.", - "this-mail-was-sent-to-you-because-someone-requested-a-new-link-to-access-your-profile-for-the-event_name": "This mail was sent to you, because someone requested a new link to access your profile for the {{event_name}}.", - "to-prevent-spam-you-can-only-request-a-new-link-every-24hrs": "To prevent spam you can only request a new link every 24hrs." -} + "a-password-reset-for-your-account-got-requested": "A password reset for your account got requested.", + "all-rights-reserved": "All rights reserved.", + "event_name-registration": "{{event_name}} Registration", + "if-you-didnt-register-yourself-you-should-contact-us-to-get-your-data-removed-from-our-systems": "If you didn't register yourself you should contact us to get your data removed from our systems:", + "if-you-didnt-request-the-reset-please-ignore-this-mail": "If you didn't request the reset please ignore this mail.", + "if-you-ever-loose-the-link-you-can-request-a-new-one-by-visiting-our-website": "If you ever loose the link you can request a new one by visiting our website:", + "imprint": "Imprint", + "lfk-mail-test": "{{copyright_owner}} - Mail test", + "lfk-password-reset": "{{copyright_owner}} - Password reset", + "password-reset": "Password reset", + "privacy": "Privacy", + "reset-password": "Reset password", + "test-mail": "Test mail", + "thank-you-for-requesting-a-new-link-to-your-event_name-runner-profile": "Thank you for requesting a new link to your {{event_name}} runner profile.", + "thanks-for-registering-and-welcome-to-the-event_name": "Thanks for registering and welcome to the {{event_name}}!", + "the-only-thing-you-have-to-do-now-is-to-bring-your-registration-code-with-you": "The only thing you have to do now is to bring your registration code with you.", + "this-is-a-test-mail-triggered-by-an-admin-in-the-lfk-backend": "This is a test mail triggered by an admin in the LfK! backend.", + "this-mail-was-sent-to-recipient_mail-because-someone-request-a-mail-test-for-this-mail-address": "This mail was sent to you because someone request a mail test for this mail address.", + "this-mail-was-sent-to-you-because-someone-request-a-password-reset-for-a-account-linked-to-the-mail-address": "This mail was sent to you because someone request a password reset for a account linked to the mail address.", + "this-mail-was-sent-to-you-because-someone-requested-a-new-link-to-access-your-profile-for-the-event_name": "This mail was sent to you, because someone requested a new link to access your profile for the {{event_name}}.", + "this-mail-was-sent-to-you-because-someone-used-your-mail-address-to-register-themselfes-for-the-event_name": "This mail was sent to you, because someone used your mail address to register themselfes for the {{event_name}}", + "to-prevent-spam-you-can-only-request-a-new-link-every-24hrs": "To prevent spam you can only request a new link every 24hrs.", + "view-my-data": "View my data", + "we-successfully-processed-your-registration": "We successfully processed your registration.", + "welcome": "Welcome", + "you-can-view-your-registration-code-lap-times-and-much-more-by-visiting-our-selfservice": "You can view your registration code, lap times and much more by visiting our selfservice:", + "your-event_name-profile": "Your {{event_name}} profile", + "your-password-wont-be-changed-until-you-click-the-reset-link-below-and-set-a-new-one": "Your password won't be changed until you click the reset link below and set a new one.", + "your-profile": "Your Profile" +} \ No newline at end of file From 34e30d64929ca7555cee62c4da86d07050b94ff5 Mon Sep 17 00:00:00 2001 From: Nicolai Ort <info@nicolai-ort.com> Date: Fri, 5 Mar 2021 18:27:17 +0100 Subject: [PATCH 05/12] Renamed templates ref #5 --- src/templates/{runner_link.html => runner_forgot.html} | 0 src/templates/{runner_link.txt => runner_forgot.txt} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename src/templates/{runner_link.html => runner_forgot.html} (100%) rename src/templates/{runner_link.txt => runner_forgot.txt} (100%) diff --git a/src/templates/runner_link.html b/src/templates/runner_forgot.html similarity index 100% rename from src/templates/runner_link.html rename to src/templates/runner_forgot.html diff --git a/src/templates/runner_link.txt b/src/templates/runner_forgot.txt similarity index 100% rename from src/templates/runner_link.txt rename to src/templates/runner_forgot.txt From 8da7c55deb5c0b4fccb7f18688613d06dd92df45 Mon Sep 17 00:00:00 2001 From: Nicolai Ort <info@nicolai-ort.com> Date: Fri, 5 Mar 2021 18:29:22 +0100 Subject: [PATCH 06/12] Added new mailer function ref #5 --- src/Mailer.ts | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/src/Mailer.ts b/src/Mailer.ts index d2752f8..bf844f1 100644 --- a/src/Mailer.ts +++ b/src/Mailer.ts @@ -121,8 +121,8 @@ export class Mailer { /** * Function for sending a reset mail from the reset mail template. - * @param to_address The address the mail will be sent to. Should always get pulled from a user object. - * @param token The requested password reset token - will be combined with the app_url to generate a password reset link. + * @param to_address The address the mail will be sent to. Should always get pulled from a runner object. + * @param token The runner's selfservice token - will be combined with the app_url to generate a selfservice profile link. */ public async sendWelcomeMail(to_address: string, token: string, locale: string = "en") { await i18next.changeLanguage(locale); @@ -152,6 +152,39 @@ export class Mailer { await this.sendMail(mail); } + /** + * Function for sending a selfservice link forgotten mail from the runner_forgot template. + * @param to_address The address the mail will be sent to. Should always get pulled from a runner object. + * @param token The runner's selfservice token - will be combined with the app_url to generate a selfservice profile link. + */ + public async sendSelfserviceForgottenMail(to_address: string, token: string, locale: string = "en") { + await i18next.changeLanguage(locale); + + const replacements = { + recipient_mail: to_address, + copyright_owner: config.copyright_owner, + link_imprint: `${config.app_url}/imprint`, + link_privacy: `${config.app_url}/privacy`, + selfservice_link: `${config.app_url}/selfservice/profile/${token}`, + forgot_link: `${config.app_url}/selfservice`, + contact_mail: config.contact_mail, + event_name: config.event_name + } + + const template_html = Handlebars.compile(fs.readFileSync(__dirname + '/templates/runner_forgot.html', { encoding: 'utf8' })); + const template_txt = Handlebars.compile(fs.readFileSync(__dirname + '/templates/runner_forgot.txt', { encoding: 'utf8' })); + const body_html = template_html(replacements); + const body_txt = template_txt(replacements); + + const mail: MailOptions = { + to: to_address, + subject: i18next.t("your-event_name-profile", Mailer.interpolations).toString(), + text: body_txt, + html: body_html + }; + await this.sendMail(mail); + } + /** * Wrapper function for sending a mail via this object's transporter. * @param mail MailOptions object containing the From 9807e61fa81a5790fc09f9920905c683ea1c3a79 Mon Sep 17 00:00:00 2001 From: Nicolai Ort <info@nicolai-ort.com> Date: Fri, 5 Mar 2021 18:30:50 +0100 Subject: [PATCH 07/12] Added endpoint ref #5 --- src/controllers/MailController.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/controllers/MailController.ts b/src/controllers/MailController.ts index 99be6c2..e0a4a37 100644 --- a/src/controllers/MailController.ts +++ b/src/controllers/MailController.ts @@ -62,4 +62,20 @@ export class MailController { } return new SuccessResponse(locale); } + + @Post('/registration_forgot') + @OpenAPI({ description: "Sends selfservice link forgotten mails", parameters: [{ in: "query", name: "locale", schema: { type: "string", enum: ["de", "en"] } }] }) + async sendSelfserviceForgotten(@Body({ validate: true }) mailOptions: WelcomeMail, @QueryParam("locale") locale: locales) { + if (!this.initialized) { + await this.mailer.init(); + this.initialized = true; + } + try { + this.mailer.sendSelfserviceForgottenMail(mailOptions.address, mailOptions.selfserviceToken, locale?.toString()) + } catch (error) { + console.log(error) + throw error; + } + return new SuccessResponse(locale); + } } From 015b25a2056fe3537fb8e88539c25c2c9e6ba618 Mon Sep 17 00:00:00 2001 From: Nicolai Ort <info@nicolai-ort.com> Date: Fri, 5 Mar 2021 18:32:24 +0100 Subject: [PATCH 08/12] Added new mailtype enum ref #5 --- src/models/MailTypeEnum.ts | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 src/models/MailTypeEnum.ts diff --git a/src/models/MailTypeEnum.ts b/src/models/MailTypeEnum.ts new file mode 100644 index 0000000..3231bd4 --- /dev/null +++ b/src/models/MailTypeEnum.ts @@ -0,0 +1,5 @@ +export enum MailTypes { + PASSWORD_RESET = "PASSWORD_RESET", + RUNNER_FORGOT = "RUNNER_FORGOT", + RUNNER_WELCOME = "RUNNER_WELCOME" +} \ No newline at end of file From 0fa94fc8679b45aa702068ad96097fe18b385a50 Mon Sep 17 00:00:00 2001 From: Nicolai Ort <info@nicolai-ort.com> Date: Fri, 5 Mar 2021 18:37:51 +0100 Subject: [PATCH 09/12] Added MailTypes to responses ref #5 --- src/controllers/MailController.ts | 9 +++++---- src/models/MailTypeEnum.ts | 3 ++- src/models/SuccessResponse.ts | 7 ++++++- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/controllers/MailController.ts b/src/controllers/MailController.ts index e0a4a37..69e8d6c 100644 --- a/src/controllers/MailController.ts +++ b/src/controllers/MailController.ts @@ -2,6 +2,7 @@ import { Authorized, Body, JsonController, Post, QueryParam } from 'routing-cont import { OpenAPI } from 'routing-controllers-openapi'; import { Mailer } from '../Mailer'; import { locales } from '../models/LocaleEnum'; +import { MailTypes } from '../models/MailTypeEnum'; import { ResetMail } from '../models/ResetMail'; import { SuccessResponse } from '../models/SuccessResponse'; import { WelcomeMail } from '../models/WelcomeMail'; @@ -28,7 +29,7 @@ export class MailController { } catch (error) { throw error; } - return new SuccessResponse(locale); + return new SuccessResponse(MailTypes.PASSWORD_RESET, locale); } @Post('/test') @@ -44,7 +45,7 @@ export class MailController { console.log(error) throw error; } - return new SuccessResponse(locale); + return new SuccessResponse(MailTypes.TEST, locale); } @Post('/registration') @@ -60,7 +61,7 @@ export class MailController { console.log(error) throw error; } - return new SuccessResponse(locale); + return new SuccessResponse(MailTypes.RUNNER_WELCOME, locale); } @Post('/registration_forgot') @@ -76,6 +77,6 @@ export class MailController { console.log(error) throw error; } - return new SuccessResponse(locale); + return new SuccessResponse(MailTypes.RUNNER_FORGOT, locale); } } diff --git a/src/models/MailTypeEnum.ts b/src/models/MailTypeEnum.ts index 3231bd4..338f52c 100644 --- a/src/models/MailTypeEnum.ts +++ b/src/models/MailTypeEnum.ts @@ -1,5 +1,6 @@ export enum MailTypes { PASSWORD_RESET = "PASSWORD_RESET", RUNNER_FORGOT = "RUNNER_FORGOT", - RUNNER_WELCOME = "RUNNER_WELCOME" + RUNNER_WELCOME = "RUNNER_WELCOME", + TEST = "TEST" } \ No newline at end of file diff --git a/src/models/SuccessResponse.ts b/src/models/SuccessResponse.ts index d3104a8..48cc43e 100644 --- a/src/models/SuccessResponse.ts +++ b/src/models/SuccessResponse.ts @@ -1,5 +1,6 @@ import { IsBoolean, IsString } from 'class-validator'; import { locales } from './LocaleEnum'; +import { MailTypes } from './MailTypeEnum'; /** * Simple success response class to make everyone happy :) @@ -15,7 +16,11 @@ export class SuccessResponse { @IsString() locale: locales; - constructor(locale?: locales) { + @IsString() + type: MailTypes; + + constructor(type: MailTypes, locale?: locales) { + this.type = type; this.locale = locale || locales.en; } } \ No newline at end of file From 8271014a101439ea46233099182eb78da9fdc11c Mon Sep 17 00:00:00 2001 From: Nicolai Ort <info@nicolai-ort.com> Date: Fri, 5 Mar 2021 18:39:56 +0100 Subject: [PATCH 10/12] Adjusted tests for mail types ref #5 --- src/tests/pw_reset_mail.spec.ts | 9 ++++++--- src/tests/selfservice_welcome_mail.spec.ts | 9 ++++++--- src/tests/test_mail.spec.ts | 9 ++++++--- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/tests/pw_reset_mail.spec.ts b/src/tests/pw_reset_mail.spec.ts index d43f3a3..aeb4692 100644 --- a/src/tests/pw_reset_mail.spec.ts +++ b/src/tests/pw_reset_mail.spec.ts @@ -42,7 +42,8 @@ describe('POST /reset with auth and vaild body', () => { expect(res.data).toEqual({ success: true, message: "Sent!", - locale: "en" + locale: "en", + type: "PASSWORD_RESET" }) }); it('Post with auth, body and locale=en should return 200', async () => { @@ -54,7 +55,8 @@ describe('POST /reset with auth and vaild body', () => { expect(res.data).toEqual({ success: true, message: "Sent!", - locale: "en" + locale: "en", + type: "PASSWORD_RESET" }) }); it('Post with auth, body and locale=de should return 200', async () => { @@ -66,7 +68,8 @@ describe('POST /reset with auth and vaild body', () => { expect(res.data).toEqual({ success: true, message: "Sent!", - locale: "de" + locale: "de", + type: "PASSWORD_RESET" }) }); }); \ No newline at end of file diff --git a/src/tests/selfservice_welcome_mail.spec.ts b/src/tests/selfservice_welcome_mail.spec.ts index 709eec0..f9bb7ee 100644 --- a/src/tests/selfservice_welcome_mail.spec.ts +++ b/src/tests/selfservice_welcome_mail.spec.ts @@ -42,7 +42,8 @@ describe('POST /reset with auth and vaild body', () => { expect(res.data).toEqual({ success: true, message: "Sent!", - locale: "en" + locale: "en", + type: "RUNNER_WELCOME" }) }); it('Post with auth, body and locale=en should return 200', async () => { @@ -54,7 +55,8 @@ describe('POST /reset with auth and vaild body', () => { expect(res.data).toEqual({ success: true, message: "Sent!", - locale: "en" + locale: "en", + type: "RUNNER_WELCOME" }) }); it('Post with auth, body and locale=de should return 200', async () => { @@ -66,7 +68,8 @@ describe('POST /reset with auth and vaild body', () => { expect(res.data).toEqual({ success: true, message: "Sent!", - locale: "de" + locale: "de", + type: "RUNNER_WELCOME" }) }); }); \ No newline at end of file diff --git a/src/tests/test_mail.spec.ts b/src/tests/test_mail.spec.ts index ff3dac6..9d88dc6 100644 --- a/src/tests/test_mail.spec.ts +++ b/src/tests/test_mail.spec.ts @@ -20,7 +20,8 @@ describe('POST /test with auth', () => { expect(res.data).toEqual({ success: true, message: "Sent!", - locale: "en" + locale: "en", + type: "TEST" }) }); it('Post with auth and locale=en should return 200', async () => { @@ -29,7 +30,8 @@ describe('POST /test with auth', () => { expect(res.data).toEqual({ success: true, message: "Sent!", - locale: "en" + locale: "en", + type: "TEST" }) }); it('Post with auth and locale=de should return 200', async () => { @@ -38,7 +40,8 @@ describe('POST /test with auth', () => { expect(res.data).toEqual({ success: true, message: "Sent!", - locale: "de" + locale: "de", + type: "TEST" }) }); }); \ No newline at end of file From 91f9a8cbdecf74a74e68b80f3aec675de59e46d4 Mon Sep 17 00:00:00 2001 From: Nicolai Ort <info@nicolai-ort.com> Date: Fri, 5 Mar 2021 18:42:53 +0100 Subject: [PATCH 11/12] Added tests ref #5 --- src/tests/selfservice_forgot_mail.spec.ts | 75 +++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 src/tests/selfservice_forgot_mail.spec.ts diff --git a/src/tests/selfservice_forgot_mail.spec.ts b/src/tests/selfservice_forgot_mail.spec.ts new file mode 100644 index 0000000..fcf89a3 --- /dev/null +++ b/src/tests/selfservice_forgot_mail.spec.ts @@ -0,0 +1,75 @@ +import axios from 'axios'; +import { config } from '../config'; +const base = "http://localhost:" + config.internal_port + +const axios_config = { + validateStatus: undefined +}; + +describe('POST /registration_forgot without auth', () => { + it('Post without auth should return 401', async () => { + const res = await axios.post(base + '/registration_forgot', null, axios_config); + expect(res.status).toEqual(401); + }); +}); + +describe('POST /registration_forgot with auth but wrong body', () => { + it('Post with auth but no body should return 400', async () => { + const res = await axios.post(base + '/registration_forgot?key=' + config.api_key, null, axios_config); + expect(res.status).toEqual(400); + }); + it('Post with auth but no mail should return 400', async () => { + const res = await axios.post(base + '/registration_forgot?key=' + config.api_key, { selfserviceToken: "test" }, axios_config); + expect(res.status).toEqual(400); + }); + it('Post with auth but no reset key should return 400', async () => { + const res = await axios.post(base + '/registration_forgot?key=' + config.api_key, { address: "test@dev.lauf-fuer-kaya.de" }, axios_config); + expect(res.status).toEqual(400); + }); + it('Post with auth but invalid mail should return 400', async () => { + const res = await axios.post(base + '/registration_forgot?key=' + config.api_key, { selfserviceToken: "test", address: "testdev.l.de" }, axios_config); + expect(res.status).toEqual(400); + }); +}); + +describe('POST /reset with auth and vaild body', () => { + it('Post with auth, body and no locale should return 200', async () => { + const res = await axios.post(base + '/registration_forgot?key=' + config.api_key, { + selfserviceToken: "test", + address: "test@dev.lauf-fuer-kaya.de" + }, axios_config); + expect(res.status).toEqual(200); + expect(res.data).toEqual({ + success: true, + message: "Sent!", + locale: "en", + type: "RUNNER_FORGOT" + }) + }); + it('Post with auth, body and locale=en should return 200', async () => { + const res = await axios.post(base + '/registration_forgot?locale=en&key=' + config.api_key, { + selfserviceToken: "test", + address: "test@dev.lauf-fuer-kaya.de" + }, axios_config); + expect(res.status).toEqual(200); + expect(res.data).toEqual({ + success: true, + message: "Sent!", + locale: "en", + type: "RUNNER_FORGOT" + }) + }); + it('Post with auth, body and locale=de should return 200', async () => { + const res = await axios.post(base + '/registration_forgot?locale=de&key=' + config.api_key, { + selfserviceToken: "test", + address: "test@dev.lauf-fuer-kaya.de" + }, axios_config); + expect(res.status).toEqual(200); + expect(res.data).toEqual({ + success: true, + message: "Sent!", + locale: "de", + type: "RUNNER_FORGOT" + }) + }); +}); \ No newline at end of file From 577f321b3ffcea666eaaa529e86e532702432635 Mon Sep 17 00:00:00 2001 From: Nicolai Ort <info@nicolai-ort.com> Date: Fri, 5 Mar 2021 19:05:08 +0100 Subject: [PATCH 12/12] Fixed typo ref #5 --- src/locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/locales/en.json b/src/locales/en.json index 1f2592b..c612a2b 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -19,7 +19,7 @@ "this-mail-was-sent-to-recipient_mail-because-someone-request-a-mail-test-for-this-mail-address": "This mail was sent to you because someone request a mail test for this mail address.", "this-mail-was-sent-to-you-because-someone-request-a-password-reset-for-a-account-linked-to-the-mail-address": "This mail was sent to you because someone request a password reset for a account linked to the mail address.", "this-mail-was-sent-to-you-because-someone-requested-a-new-link-to-access-your-profile-for-the-event_name": "This mail was sent to you, because someone requested a new link to access your profile for the {{event_name}}.", - "this-mail-was-sent-to-you-because-someone-used-your-mail-address-to-register-themselfes-for-the-event_name": "This mail was sent to you, because someone used your mail address to register themselfes for the {{event_name}}", + "this-mail-was-sent-to-you-because-someone-used-your-mail-address-to-register-themselfes-for-the-event_name": "This mail was sent to you, because someone used your mail address to register themselves for the {{event_name}}", "to-prevent-spam-you-can-only-request-a-new-link-every-24hrs": "To prevent spam you can only request a new link every 24hrs.", "view-my-data": "View my data", "we-successfully-processed-your-registration": "We successfully processed your registration.",