diff --git a/.env b/.env index 0076c52..b68a337 100644 --- a/.env +++ b/.env @@ -78,3 +78,6 @@ TURNSTILE_SECRET=1x0000000000000000000000000000000AA ###> stripe/stripe-php ### STRIPE_SECRET_KEY=sk_test_*** ###< stripe/stripe-php ### +NOTIFUSE_CLIENT_EMAIL=jovann@siteconseil.fr +NOTIFUSE_CLIENT_SECRET=d04zCk3Fa45oOjDWHpAvc1AZxnLdGffOnNWK+Jt2yXf37+FTfuMMHb8flcfPMqLluRR3rvhbr555r6j1DEigrA== +NOTIFUSE_WORKSPACE_ID=ecosplay diff --git a/src/Controller/HomeController.php b/src/Controller/HomeController.php index 17234a8..bf9e558 100644 --- a/src/Controller/HomeController.php +++ b/src/Controller/HomeController.php @@ -6,6 +6,8 @@ use App\Entity\Account; use App\Entity\AccountResetPasswordRequest; use App\Form\RequestPasswordConfirmType; use App\Form\RequestPasswordRequestType; +use App\Service\Mailer\Mailer; +use App\Service\NotifuseClient; use App\Service\ResetPassword\Event\ResetPasswordConfirmEvent; use App\Service\ResetPassword\Event\ResetPasswordEvent; use Doctrine\ORM\EntityManagerInterface; @@ -16,13 +18,72 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface; use Symfony\Component\Routing\Attribute\Route; +use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Security\Http\Authentication\AuthenticationUtils; use Symfony\Contracts\HttpClient\HttpClientInterface; use Twig\Environment; class HomeController extends AbstractController { + #[Route(path: '/newsletter/{email}', name: 'app_newsletter_validate', options: ['sitemap' => false], methods: ['GET','POST'])] + public function newsletterValidate(string $email,NotifuseClient $notifuseClient): Response + { + $notifuseClient->login(); + if($notifuseClient->contactExist($email)){ + $notifuseClient->addList($email,'newsletter'); + } + return $this->render('newsletter_confirmed.twig',[ + 'no_index' => true + ]); + } + + #[Route(path: '/newsletter/remove/{email}', name: 'app_newsletter_validate_remove', options: ['sitemap' => false], methods: ['GET', 'POST'])] + public function newsletterRemoveValidate(string $email, Request $request,NotifuseClient $notifuseClient): Response + { + $notifuseClient->login(); + // 1. Gestion du "One-Click Unsubscribe" (Requête POST automatique des clients mail) + if ($request->isMethod('POST')) { + // Logique pour désinscrire l'utilisateur en base de données + // $userRepo->unsubscribeByEmail($email); + + if($notifuseClient->contactExist($email)){ + $notifuseClient->contactDelete($email); + } + return new Response('Unsubscribe successful', Response::HTTP_OK); + } + + // 2. Gestion de l'affichage (Requête GET pour l'utilisateur qui clique) + // Ici, vous pouvez aussi traiter la désinscription si ce n'est pas déjà fait + if($notifuseClient->contactExist($email)){ + $notifuseClient->contactDelete($email); + } + return $this->render('newsletter_remove.twig',[ + 'no_index' => true + ]); + } + + #[Route(path: '/newsletter', name: 'app_newsletter', options: ['sitemap' => false], methods: ['GET','POST'])] + public function newsletter(Request $request,NotifuseClient $notifuseClient,Mailer $mailer): Response + { + $request->request->set('email','jovannserreau@siteconseil.fr'); + $datas= $request->request->all(); + + $notifuseClient->login(); + $exit = $notifuseClient->contactExist($datas['email']); + if($exit == false){ + $notifuseClient->contactAdd($datas['email']); + //send email vot validation + } + $mailer->send($datas['email'],$datas['email'],'[E-Cosplay] - Valider votre inscription à la newsletter',"mails/newsletter-valiate.twig",[ + 'confirmationUrl' => $this->generateUrl('app_newsletter_validate',['email'=>$datas['email']],UrlGeneratorInterface::ABSOLUTE_URL), + ],[],true); + + return $this->render('newsletter.twig', [ + 'no_index' => true + ]); + + } #[Route(path: '/', name: 'app_home', options: ['sitemap' => false], methods: ['GET'])] public function index(): Response { diff --git a/src/Service/Mailer/Mailer.php b/src/Service/Mailer/Mailer.php index 51b773b..9a06b41 100644 --- a/src/Service/Mailer/Mailer.php +++ b/src/Service/Mailer/Mailer.php @@ -64,7 +64,8 @@ class Mailer string $subject, string $template, array $data, - array $files = [] + array $files = [], + bool $isNewsletter = false, ): void { $dest = new Address($address, $addressName); $src = new Address("contact@e-cosplay.fr", "E-Cosplay"); @@ -74,6 +75,19 @@ class Mailer ->to($dest) ->from($src); + $header = $mail->getHeaders(); + + if($isNewsletter) { + $unsubscribeUrl = $this->urlGenerator->generate('app_newsletter_validate_remove',['email'=>$address],UrlGeneratorInterface::ABSOLUTE_URL); + $unsubscribeEmail = "mailto:contact@e-cosplay.fr?subject=unsubscribe"; + // Ajout de l'en-tête standard + $header->addHeader('List-Unsubscribe', "<$unsubscribeEmail>, <$unsubscribeUrl>"); + $header->addHeader('List-Unsubscribe-Post', 'List-Unsubscribe=One-Click'); + + $data['unsubscribeUrl'] = $unsubscribeUrl; + } + + $mail->setHeaders($header); $mjmlGenerator = $this->environment->render($template, [ 'system' => [ 'subject' => $subject, @@ -82,6 +96,7 @@ class Mailer 'datas' => $data, ]); + $htmlContent = $this->convertMjmlToHtml($mjmlGenerator); $txtContent = $this->environment->render('txt-'.$template,[ 'system' => [ diff --git a/src/Service/NotifuseClient.php b/src/Service/NotifuseClient.php new file mode 100644 index 0000000..abf5baf --- /dev/null +++ b/src/Service/NotifuseClient.php @@ -0,0 +1,119 @@ +email = $_ENV['NOTIFUSE_CLIENT_EMAIL']; + $this->secret = $_ENV['NOTIFUSE_CLIENT_SECRET']; + $this->workspacce = $_ENV['NOTIFUSE_WORKSPACE_ID']; + $this->filesystem = new FilesystemAdapter( + 'notifuse', + 3600, + $this->kernel->getCacheDir() + ); + } + + public function login() + { + + $this->accessToken = $this->filesystem->get('access_token',function (\Symfony\Component\Cache\CacheItem $cacheItem) { + $timestamp = time(); + $message = $this->email . ":" . $timestamp; + $signature = hash_hmac('sha256', $message, $this->secret); + + $response = $this->httpClient->request('POST', 'https://notifuse.esy-web.dev/api/user.rootSignin', [ + 'headers' => [ + 'Content-Type' => 'application/json', + ], + 'json' => [ + 'email' => $this->email, + 'timestamp' => $timestamp, + 'signature' => $signature, + ] + ]); + $content = json_decode($response->getContent()); + $date = DateTime::createFromFormat('Y-m-d\TH:i:s.u', substr($content->expires_at, 0, 26)); + $cacheItem->expiresAt($date); + return $content->token; + }); + } + public function contactExist(string $email) + { + try { + $this->httpClient->request('GET', 'https://notifuse.esy-web.dev/api/contacts.getByEmail?workspace_id=' . $this->workspacce . '&email=' . $email, [ + 'headers' => [ + 'Content-Type' => 'application/json', + 'Authorization' => 'Bearer ' . $this->accessToken, + ] + ]); + return true; + } catch (\Exception $e) { + return false; + } catch (TransportExceptionInterface $e) { + return false; + } + + } + + public function contactAdd(mixed $email) + { + $this->httpClient->request('POST', 'https://notifuse.esy-web.dev/api/contacts.upsert', [ + 'headers' => [ + 'Content-Type' => 'application/json', + 'Authorization' => 'Bearer ' . $this->accessToken, + ], + 'json' => [ + 'workspace_id' => $this->workspacce, + 'contact' => [ + 'email' => $email, + ] + ] + ]); + } + + public function contactDelete(string $email) + { + $this->httpClient->request('POST', 'https://notifuse.esy-web.dev/api/contacts.delete', [ + 'headers' => [ + 'Content-Type' => 'application/json', + 'Authorization' => 'Bearer ' . $this->accessToken, + ], + 'json' => [ + 'workspace_id' => $this->workspacce, + 'email' => $email, + ] + ]); + } + + public function addList(string $email, string $string) + { + $this->httpClient->request('POST', 'https://notifuse.esy-web.dev/api/lists.subscribe', [ + 'headers' => [ + 'Content-Type' => 'application/json', + 'Authorization' => 'Bearer ' . $this->accessToken, + ], + 'json' => [ + 'workspace_id' => $this->workspacce, + 'contact' => [ + 'email' => $email, + ], + 'list_ids' => [ + $string + ] + ] + ]); + + } +} diff --git a/templates/base.twig b/templates/base.twig index b9d8eab..539b9fb 100644 --- a/templates/base.twig +++ b/templates/base.twig @@ -178,6 +178,17 @@ {# SOCIAL & STRIPE #}

{{ 'footer_follow_us_title'|trans }}

+
+

{{ 'newsletter.title'|trans }}

+
+ + +
+
diff --git a/templates/mails/base.twig b/templates/mails/base.twig index 7731578..b40f7e7 100644 --- a/templates/mails/base.twig +++ b/templates/mails/base.twig @@ -22,7 +22,6 @@ {# Section d'en-tête #} - {# Logo mis à jour pour SARL SITECONSEIL #} diff --git a/templates/mails/newsletter-valiate.twig b/templates/mails/newsletter-valiate.twig new file mode 100644 index 0000000..c43413b --- /dev/null +++ b/templates/mails/newsletter-valiate.twig @@ -0,0 +1,54 @@ +{% extends 'mails/base.twig' %} + +{% block subject %} + 🚀 Valide ton inscription à la newsletter E-Cosplay ! +{% endblock %} + +{% block content %} + + + {# Titre Impact #} + + Presque fini ! + + + + + + + + + Merci de vouloir rejoindre la communauté E-Cosplay ! + + + Pour confirmer que c'est bien toi et commencer à recevoir nos actualités, évènements et projets, clique sur le bouton "BOMBE" ci-dessous : + + + {# Bouton Action Brutaliste #} + + Confirmer mon inscription + + + + Si tu n'es pas à l'origine de cette demande, ignore simplement cet email. + + + + + + + + Si le bouton ne fonctionne pas, copie et colle ce lien dans ton navigateur :
+ {{ datas.confirmationUrl }} +
+
+
+ + + + + Se désinscrire + + + +{% endblock %} diff --git a/templates/newsletter.twig b/templates/newsletter.twig new file mode 100644 index 0000000..9de47a4 --- /dev/null +++ b/templates/newsletter.twig @@ -0,0 +1,47 @@ +{% extends 'base.twig' %} + +{% block title %}{{'newsletter_confirme_register'|trans}}{% endblock %} +{% block meta_description %}{{'newsletter_confirme_register'|trans}}{% endblock %} + +{% block canonical_url %} + +{% endblock %} + +{% block body %} +
+
+ + {# --- CARTE DE CONFIRMATION STYLE NEUBRUTALISTE --- #} +
+ + {# Icône Email #} +
+ +
+ +

+ {{ 'newsletter.confirm_page.header'|trans }} +

+ +
+ +

+ {{ 'newsletter.confirm_page.message'|trans }} +

+ + {# Info supplémentaire #} +
+

+ {{ 'newsletter.confirm_page.spam_hint'|trans }} +

+
+ + {# Bouton retour #} + + {{ 'newsletter.confirm_page.back_home'|trans }} + +
+ +
+
+{% endblock %} diff --git a/templates/newsletter_confirmed.twig b/templates/newsletter_confirmed.twig new file mode 100644 index 0000000..eff6755 --- /dev/null +++ b/templates/newsletter_confirmed.twig @@ -0,0 +1,49 @@ +{% extends 'base.twig' %} + +{% block title %}{{ 'newsletter.success.title'|trans|default('Inscription validée !') }}{% endblock %} + +{% block body %} +
+
+ + {# --- CARTE DE SUCCÈS STYLE NEUBRUTALISTE --- #} +
+ + {# Icône Succès #} +
+ 🎉 +
+ +

+ {{ 'newsletter.success.header'|trans }} +

+ +
+ +

+ {{ 'newsletter.success.message'|trans }} +

+ + {# Bloc Info Fun #} +
+

+ {{ 'newsletter.success.hint'|trans }} +

+
+ + {# Bouton Retour #} + + {{ 'newsletter.success.back_button'|trans }} + +
+ + {# Déco de fond style comics #} +
+
+
+
+
+
+
+{% endblock %} diff --git a/templates/newsletter_remove.twig b/templates/newsletter_remove.twig new file mode 100644 index 0000000..67edcf7 --- /dev/null +++ b/templates/newsletter_remove.twig @@ -0,0 +1,44 @@ +{% extends 'base.twig' %} + +{% block title %}{{ 'newsletter.unsubscribe.title'|trans|default('Désinscription réussie') }}{% endblock %} + +{% block body %} +
+
+ + {# --- CARTE DE DÉSINSCRIPTION STYLE BRUTALISTE --- #} +
+ + {# Icône Bye Bye #} +
+ 👋 +
+ +

+ {{ 'newsletter.unsubscribe.header'|trans }} +

+ + {# Ligne de séparation jaune #} +
+ +

+ {{ 'newsletter.unsubscribe.message'|trans }} +

+ + {# Message de regret stylisé #} +
+

+ {{ 'newsletter.unsubscribe.footer'|trans }} +

+
+ + {# Bouton retour avec effet de mouvement #} + + {{ 'newsletter.unsubscribe.back_button'|trans }} + +
+ +
+
+{% endblock %} diff --git a/templates/txt-mails/newsletter-valiate.twig b/templates/txt-mails/newsletter-valiate.twig new file mode 100644 index 0000000..e1bb79b --- /dev/null +++ b/templates/txt-mails/newsletter-valiate.twig @@ -0,0 +1,26 @@ +{% extends 'txt-mails/base.twig' %} + +{% block subject %} + 🚀 Valide ton inscription à la newsletter E-Cosplay ! +{% endblock %} + +{% block content %} + PRESQUE FINI ! + ============== + + Merci de vouloir rejoindre la communauté E-Cosplay ! + + Pour confirmer que c'est bien toi et commencer à recevoir nos actualités, + événements et projets, merci de valider ton inscription en copiant + le lien suivant dans ton navigateur : + + LIEN DE CONFIRMATION : + {{ datas.confirmationUrl }} + + ---------------------------------------------------------- + Si tu n'es pas à l'origine de cette demande, + ignore simplement cet email. Ton adresse ne sera pas conservée. + ---------------------------------------------------------- + Pour ne plus recevoir d'invitations : + {{ datas.unsubscribeUrl }} +{% endblock %} diff --git a/translations/messages.cn.yaml b/translations/messages.cn.yaml index ccf44b3..40f8a96 100644 --- a/translations/messages.cn.yaml +++ b/translations/messages.cn.yaml @@ -1132,3 +1132,38 @@ Sujet: "主题" Téléphone (facultatif): "电话 (选填)" Votre message: "你的留言" partner_w: '官方网站' + +newsletter_confirme_register: "邮件订阅确认 - E-Cosplay" +newsletter: + confirm_page: + header: "请查收你的邮件!" + message: "确认订阅的邮件已发送至你的邮箱,请点击邮件中的链接完成验证。" + spam_hint: "别忘了检查一下垃圾邮件箱(Spam)哦!" + back_home: "返回首页" + title: "加入时事通讯" + subscribe: "立即订阅" + unsubscribe: + title: "取消订阅 - E-Cosplay" + header: "操作完成!" + message: "你的邮箱已成功从我们的订阅列表中移除。你将不再收到我们的后续邮件。" + back: "返回官网" + link_text: "取消订阅时事通讯" # 用于邮件页脚的链接文字 + footer: "你的数据已从发送列表中删除。我们会想念你的!" + back_button: "返回官网" + + # 闪存消息 (Flash Messages) + flash: + success_check_email: "🚀 第一步成功!请检查邮件并确认你的订阅。" + success_confirmed: "🎉 恭喜!你已正式加入 E-Cosplay 时事通讯。" + error_already_subscribed: "💡 你已经订阅过我们的时事通讯啦!" + error_invalid_email: "⚠️ 哎呀!这个邮箱地址看起来不太正确。" + error_technical: "🛠️ 出现了一些技术故障,请稍后再试。" + unsubscribed: "👋 已成功取消订阅。期待下次相见!" + + # 最终成功页面 (Success Page) + success: + title: "订阅成功 - E-Cosplay" + header: "欢迎加入!" + message: "你的时事通讯订阅已成功验证。欢迎来到我们的社区!" + hint: "准备好在你的收件箱里接收最精彩的 Cosplay 资讯吧。" + back_button: "开启旅程!" diff --git a/translations/messages.en.yaml b/translations/messages.en.yaml index b914f74..e7319ee 100644 --- a/translations/messages.en.yaml +++ b/translations/messages.en.yaml @@ -1204,3 +1204,38 @@ Sujet: "Subject" Téléphone (facultatif): "Phone (Optional)" Votre message: "Your Message" partner_w: 'Website' + +newsletter_confirme_register: "Newsletter Confirmation - E-Cosplay" +newsletter: + confirm_page: + header: "CHECK YOUR EMAILS!" + message: "A subscription confirmation has been sent by email. Please click the link inside to validate your registration." + spam_hint: "Don't forget to check your junk/spam folder!" + back_home: "Back to Home" + title: "JOIN THE NEWSLETTER" + subscribe: "SUBSCRIBE" + unsubscribe: + title: "Newsletter Unsubscribe - E-Cosplay" + header: "IT'S DONE!" + message: "Your email address has been successfully removed from our mailing list. You will no longer receive updates from us." + back: "Back to site" + link_text: "Unsubscribe from newsletter" # Link text for email footers + footer: "Your data has been deleted from our mailing list. We'll miss you!" + back_button: "Back to the website" + + # Flash Messages + flash: + success_check_email: "🚀 Step 1 successful! Check your emails to confirm your subscription." + success_confirmed: "🎉 Congratulations! You are now part of the E-Cosplay newsletter." + error_already_subscribed: "💡 You are already subscribed to our newsletter!" + error_invalid_email: "⚠️ Oops! That email address doesn't look valid." + error_technical: "🛠️ A technical issue occurred. Please try again later." + unsubscribed: "👋 You've been unsubscribed. See you soon!" + + # Success Page + success: + title: "Subscription Confirmed - E-Cosplay" + header: "YOU'RE IN!" + message: "Your newsletter subscription has been successfully validated. Welcome to the community!" + hint: "Get ready to receive the best of Cosplay directly in your inbox." + back_button: "LET'S GO!" diff --git a/translations/messages.es.yaml b/translations/messages.es.yaml index 5a72534..20d9910 100644 --- a/translations/messages.es.yaml +++ b/translations/messages.es.yaml @@ -1140,3 +1140,38 @@ Sujet: "Asunto" Téléphone (facultatif): "Teléfono (opcional)" Votre message: "Tu mensaje" partner_w: 'Sitio web' + +newsletter_confirme_register: "Confirmación de la Newsletter - E-Cosplay" +newsletter: + confirm_page: + header: "¡REVISA TU CORREO!" + message: "Te hemos enviado un correo de confirmación. Por favor, haz clic en el enlace para validar tu suscripción." + spam_hint: "¡No olvides revisar tu carpeta de correo no deseado (Spam)!" + back_home: "Volver al inicio" + title: "ÚNETE A LA NEWSLETTER" + subscribe: "SUSCRIBIRSE" + unsubscribe: + title: "Darse de baja de la Newsletter - E-Cosplay" + header: "¡HECHO!" + message: "Tu dirección de correo ha sido eliminada de nuestra lista. Ya no recibirás más noticias por nuestra parte." + back: "Volver al sitio" + link_text: "Darse de baja de la newsletter" # Texto para el enlace al final de los correos + footer: "Tus datos han sido eliminados de nuestra lista de envío. ¡Te echaremos de menos!" + back_button: "Volver al sitio web" + + # Mensajes Flash + flash: + success_check_email: "🚀 ¡Paso 1 completado! Revisa tu correo para confirmar tu suscripción." + success_confirmed: "🎉 ¡Felicidades! Ya formas parte de la newsletter de E-Cosplay." + error_already_subscribed: "💡 ¡Ya estás suscrito a nuestra newsletter!" + error_invalid_email: "⚠️ ¡Ups! Esta dirección de correo no parece válida." + error_technical: "🛠️ Ha ocurrido un problema técnico. Inténtalo de nuevo más tarde." + unsubscribed: "👋 Se ha tramitado tu baja. ¡Hasta pronto!" + + # Página de éxito final + success: + title: "Suscripción Confirmada - E-Cosplay" + header: "¡YA ESTÁS DENTRO!" + message: "Tu suscripción a la newsletter ha sido validada con éxito. ¡Bienvenido a la comunidad!" + hint: "Prepárate para recibir lo mejor del Cosplay directamente en tu bandeja de entrada." + back_button: "¡VAMOS ALLÁ!" diff --git a/translations/messages.fr.yaml b/translations/messages.fr.yaml index 9432c09..45c9ad0 100644 --- a/translations/messages.fr.yaml +++ b/translations/messages.fr.yaml @@ -1191,3 +1191,37 @@ profils.password.1: "MOT DE PASSE" profils.password_holder.1: "MOT DE PASSE" profils.password.2: "CONFIRMER LE MOT DE PASSE" profils.password_holder.2: "CONFIRMER LE MOT DE PASSE" + +newsletter_confirme_register: "Confirmation de la Newsletter - E-Cosplay" +newsletter: + confirm_page: + header: "VÉRIFIE TES MAILS !" + message: "Une confirmation d'inscription à la newsletter a été envoyée par mail, merci de cliquer dessus pour valider." + spam_hint: "Pense à vérifier tes courriers indésirables (Spams) !" + back_home: "Retour à l'accueil" + title: "REJOINDRE LA NEWSLETTER" + subscribe: "S'ENREGISTRER" + unsubscribe: + title: "Désinscription Newsletter - E-Cosplay" + header: "C'EST FAIT !" + message: "Ton adresse email a bien été retirée de notre liste de diffusion. Tu ne recevras plus de nouvelles de notre part." + back: "Retour au site" + link_text: "Se désabonner de la newsletter" # Texte pour le lien en bas des mails + footer: "Tes données ont été supprimées de notre liste d'envoi. Tu vas nous manquer !" + back_button: "Retour sur le site" + # Messages Flash (s'affichent en haut du site) + flash: + success_check_email: "🚀 Étape 1 réussie ! Vérifie tes mails pour confirmer ton inscription." + success_confirmed: "🎉 Félicitations ! Tu fais maintenant partie de la newsletter E-Cosplay." + error_already_subscribed: "💡 Tu es déjà inscrit à notre newsletter !" + error_invalid_email: "⚠️ Oups ! Cette adresse email ne semble pas valide." + error_technical: "🛠️ Un problème technique est survenu. Réessaie plus tard." + unsubscribed: "👋 Ta désinscription a été prise en compte. À bientôt !" + + # Textes de succès final + success: + title: "Inscription Confirmée - E-Cosplay" + header: "TU ES INSCRIT !" + message: "Ton inscription a été validée avec succès. Bienvenue dans la communauté !" + hint: "Prépare-toi à recevoir le meilleur du Cosplay directement dans ta boîte." + back_button: "C'EST PARTI !" diff --git a/translations/messages.ger.yaml b/translations/messages.ger.yaml index 3ff7aa0..3cafea6 100644 --- a/translations/messages.ger.yaml +++ b/translations/messages.ger.yaml @@ -1140,3 +1140,38 @@ Sujet: "Betreff" Téléphone (facultatif): "Telefon (optional)" Votre message: "Deine Nachricht" partner_w: 'Webseite' + +newsletter_confirme_register: "Newsletter-Bestätigung - E-Cosplay" +newsletter: + confirm_page: + header: "PRÜFE DEINE MAILS!" + message: "Eine Bestätigungsmail wurde an dich versendet. Bitte klicke auf den Link in der Mail, um deine Anmeldung abzuschließen." + spam_hint: "Schau auch unbedingt in deinen Spam-Ordner nach!" + back_home: "Zurück zur Startseite" + title: "NEWSLETTER ABONNIEREN" + subscribe: "ANMELDEN" + unsubscribe: + title: "Newsletter-Abmeldung - E-Cosplay" + header: "ERLEDIGT!" + message: "Deine E-Mail-Adresse wurde erfolgreich aus unserem Verteiler entfernt. Du wirst keine weiteren Nachrichten von uns erhalten." + back: "Zurück zur Seite" + link_text: "Newsletter abbestellen" # Text für den Link im Footer der Mails + footer: "Deine Daten wurden aus unserer Liste gelöscht. Wir werden dich vermissen!" + back_button: "Zurück zur Website" + + # Flash-Nachrichten + flash: + success_check_email: "🚀 Schritt 1 abgeschlossen! Prüfe deine Mails, um das Abo zu bestätigen." + success_confirmed: "🎉 Glückwunsch! Du bist jetzt Teil des E-Cosplay Newsletters." + error_already_subscribed: "💡 Du bist bereits für unseren Newsletter angemeldet!" + error_invalid_email: "⚠️ Hoppla! Diese E-Mail-Adresse scheint nicht gültig zu sein." + error_technical: "🛠️ Ein technisches Problem ist aufgetreten. Bitte versuche es später noch einmal." + unsubscribed: "👋 Deine Abmeldung wurde erfolgreich durchgeführt. Bis bald!" + + # Erfolgsseite (Final) + success: + title: "Anmeldung bestätigt - E-Cosplay" + header: "DU BIST DABEI!" + message: "Deine Anmeldung zum Newsletter wurde erfolgreich bestätigt. Willkommen in der Community!" + hint: "Mach dich bereit für das Beste aus der Welt des Cosplays, direkt in deinem Posteingang." + back_button: "LOS GEHT'S!"