fix(storefront): i18n sweep + locale-aware reset-password and welcome email
Some checks failed
CI / ruff (push) Successful in 19s
CI / validate (push) Has been cancelled
CI / dependency-scanning (push) Has been cancelled
CI / docs (push) Has been cancelled
CI / deploy (push) Has been cancelled
CI / pytest (push) Has been cancelled

Test 5 (storefront password reset + customer dashboard) surfaced five
issues that all traced back to missing i18n plumbing:

- Forgot-password email arrived in EN regardless of storefront locale —
  handler now prefers request.state.language over customer.preferred_language,
  and loyalty self-enrollment backfills preferred_language for new + returning
  customers so future locale-sensitive flows hit the right language without
  being told twice.
- reset-password.html rendered "undefined" icon boxes because $icon magic
  wasn't loaded in the standalone page — replaced with inline SVGs matching
  the forgot-password.html convention.
- reset-password.html was hardcoded English: added lang attr, full _()
  sweep (22 new auth.* keys × 4 locales), language selector, and JS
  validation strings exposed via tojson.
- "Continue shopping" CTA renamed to "Back to Home" (auth.back_to_home,
  4 locales) on login + forgot + reset — loyalty storefronts have no
  catalog to continue to, mirroring the earlier enroll-success rename.
- /account dashboard, profile, addresses were hardcoded English in the
  body (menu was FR because base layout uses _()). New customers.storefront
  .pages.{dashboard,profile,addresses}.* namespace (~80 keys × 4 locales),
  templates updated, Alpine JS strings injected via window.__*I18n.

18 files, 18 changed; arch validation: 126 warnings before = 126 after,
mkdocs --strict clean.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-28 23:06:11 +02:00
parent f04cbb8ca2
commit 10a99f98fe
18 changed files with 722 additions and 162 deletions

View File

@@ -123,7 +123,7 @@
"visit_platform": "Besuchen Sie unsere Plattform",
"already_have_account": "Haben Sie bereits ein Konto?",
"create_account": "Konto erstellen",
"continue_shopping": "Weiter einkaufen",
"back_to_home": "Zurück zur Startseite",
"admin_login": "Admin-Anmeldung",
"merchant_login": "Händler-Anmeldung",
"store_login": "Shop-Portal-Anmeldung",
@@ -140,7 +140,27 @@
"reset_link_sent": "Wir haben einen Link zum Zurücksetzen des Passworts an Ihre E-Mail-Adresse gesendet. Bitte überprüfen Sie Ihren Posteingang und klicken Sie auf den Link.",
"didnt_receive_email": "E-Mail nicht erhalten? Überprüfen Sie Ihren Spam-Ordner oder",
"try_again": "versuchen Sie es erneut",
"remember_password": "Passwort wieder eingefallen?"
"remember_password": "Passwort wieder eingefallen?",
"reset_password_subtitle": "Neues Passwort erstellen",
"reset_your_password": "Passwort zurücksetzen",
"reset_password_form_desc": "Geben Sie unten Ihr neues Passwort ein. Es muss mindestens 8 Zeichen lang sein.",
"new_password_placeholder": "Neues Passwort eingeben",
"confirm_password_placeholder": "Neues Passwort bestätigen",
"resetting": "Wird zurückgesetzt...",
"reset_password_btn": "Passwort zurücksetzen",
"password_reset_complete": "Passwort zurückgesetzt",
"password_reset_success_desc": "Ihr Passwort wurde erfolgreich zurückgesetzt. Sie können sich jetzt mit dem neuen Passwort anmelden.",
"invalid_or_expired_link": "Ungültiger oder abgelaufener Link",
"invalid_or_expired_link_desc": "Dieser Link zum Zurücksetzen des Passworts ist ungültig oder abgelaufen. Bitte fordern Sie einen neuen Link an.",
"request_new_link": "Neuen Link anfordern",
"email_required": "E-Mail ist erforderlich",
"invalid_email": "Bitte geben Sie eine gültige E-Mail-Adresse ein",
"forgot_password_failed": "Link konnte nicht gesendet werden. Bitte erneut versuchen.",
"password_required": "Passwort ist erforderlich",
"password_too_short": "Das Passwort muss mindestens 8 Zeichen lang sein",
"please_confirm_password": "Bitte bestätigen Sie Ihr Passwort",
"passwords_do_not_match": "Passwörter stimmen nicht überein",
"reset_password_failed": "Passwort konnte nicht zurückgesetzt werden. Bitte erneut versuchen."
},
"nav": {
"dashboard": "Dashboard",

View File

@@ -123,7 +123,7 @@
"visit_platform": "Visit our platform",
"already_have_account": "Already have an account?",
"create_account": "Create an account",
"continue_shopping": "Continue shopping",
"back_to_home": "Back to Home",
"admin_login": "Admin Login",
"merchant_login": "Merchant Login",
"store_login": "Store Portal Login",
@@ -140,7 +140,27 @@
"reset_link_sent": "We've sent a password reset link to your email. Please check your inbox and click the link to reset your password.",
"didnt_receive_email": "Didn't receive the email? Check your spam folder or",
"try_again": "try again",
"remember_password": "Remember your password?"
"remember_password": "Remember your password?",
"reset_password_subtitle": "Create new password",
"reset_your_password": "Reset Your Password",
"reset_password_form_desc": "Enter your new password below. Password must be at least 8 characters.",
"new_password_placeholder": "Enter new password",
"confirm_password_placeholder": "Confirm new password",
"resetting": "Resetting...",
"reset_password_btn": "Reset Password",
"password_reset_complete": "Password Reset Complete",
"password_reset_success_desc": "Your password has been successfully reset. You can now sign in with your new password.",
"invalid_or_expired_link": "Invalid or Expired Link",
"invalid_or_expired_link_desc": "This password reset link is invalid or has expired. Please request a new password reset link.",
"request_new_link": "Request New Link",
"email_required": "Email is required",
"invalid_email": "Please enter a valid email address",
"forgot_password_failed": "Failed to send reset link. Please try again.",
"password_required": "Password is required",
"password_too_short": "Password must be at least 8 characters",
"please_confirm_password": "Please confirm your password",
"passwords_do_not_match": "Passwords do not match",
"reset_password_failed": "Failed to reset password. Please try again."
},
"nav": {
"dashboard": "Dashboard",

View File

@@ -123,7 +123,7 @@
"visit_platform": "Visitez notre plateforme",
"already_have_account": "Vous avez déjà un compte ?",
"create_account": "Créer un compte",
"continue_shopping": "Continuer vos achats",
"back_to_home": "Retour à l'accueil",
"admin_login": "Connexion Admin",
"merchant_login": "Connexion Marchand",
"store_login": "Connexion Portail Magasin",
@@ -140,7 +140,27 @@
"reset_link_sent": "Nous avons envoyé un lien de réinitialisation à votre adresse e-mail. Veuillez vérifier votre boîte de réception et cliquer sur le lien.",
"didnt_receive_email": "Vous n'avez pas reçu l'e-mail ? Vérifiez votre dossier spam ou",
"try_again": "réessayez",
"remember_password": "Vous vous souvenez de votre mot de passe ?"
"remember_password": "Vous vous souvenez de votre mot de passe ?",
"reset_password_subtitle": "Créer un nouveau mot de passe",
"reset_your_password": "Réinitialisez votre mot de passe",
"reset_password_form_desc": "Saisissez votre nouveau mot de passe ci-dessous. Il doit comporter au moins 8 caractères.",
"new_password_placeholder": "Saisissez le nouveau mot de passe",
"confirm_password_placeholder": "Confirmez le nouveau mot de passe",
"resetting": "Réinitialisation...",
"reset_password_btn": "Réinitialiser le mot de passe",
"password_reset_complete": "Mot de passe réinitialisé",
"password_reset_success_desc": "Votre mot de passe a été réinitialisé avec succès. Vous pouvez maintenant vous connecter avec votre nouveau mot de passe.",
"invalid_or_expired_link": "Lien invalide ou expiré",
"invalid_or_expired_link_desc": "Ce lien de réinitialisation est invalide ou a expiré. Veuillez en demander un nouveau.",
"request_new_link": "Demander un nouveau lien",
"email_required": "L'e-mail est obligatoire",
"invalid_email": "Veuillez saisir une adresse e-mail valide",
"forgot_password_failed": "Échec de l'envoi du lien. Veuillez réessayer.",
"password_required": "Le mot de passe est obligatoire",
"password_too_short": "Le mot de passe doit contenir au moins 8 caractères",
"please_confirm_password": "Veuillez confirmer votre mot de passe",
"passwords_do_not_match": "Les mots de passe ne correspondent pas",
"reset_password_failed": "Échec de la réinitialisation. Veuillez réessayer."
},
"nav": {
"dashboard": "Tableau de bord",

View File

@@ -123,7 +123,7 @@
"visit_platform": "Besicht eis Plattform",
"already_have_account": "Hutt Dir schonn e Kont?",
"create_account": "E Kont erstellen",
"continue_shopping": "Weider akafen",
"back_to_home": "Zréck op d'Haaptsäit",
"admin_login": "Admin Login",
"merchant_login": "Händler Login",
"store_login": "Buttek-Portal Login",
@@ -140,7 +140,27 @@
"reset_link_sent": "Mir hunn e Link fir d'Passwuert zréckzesetzen op Är E-Mail-Adress geschéckt. Kuckt w.e.g. Ären Posteingang a klickt op de Link.",
"didnt_receive_email": "E-Mail net kritt? Kuckt Ären Spam-Dossier oder",
"try_again": "probéiert et nach eng Kéier",
"remember_password": "Passwuert erëm agefall?"
"remember_password": "Passwuert erëm agefall?",
"reset_password_subtitle": "Neit Passwuert erstellen",
"reset_your_password": "Ärt Passwuert zrécksetzen",
"reset_password_form_desc": "Gitt hei drënner Ärt neit Passwuert an. Et muss mindestens 8 Zeechen laang sinn.",
"new_password_placeholder": "Neit Passwuert agi",
"confirm_password_placeholder": "Neit Passwuert bestätegen",
"resetting": "Gëtt zréckgesat...",
"reset_password_btn": "Passwuert zrécksetzen",
"password_reset_complete": "Passwuert zréckgesat",
"password_reset_success_desc": "Ärt Passwuert ass erfollegräich zréckgesat. Dir kënnt Iech elo mat Ärem neie Passwuert aloggen.",
"invalid_or_expired_link": "Ongëltege oder ofgelafenen Link",
"invalid_or_expired_link_desc": "Dëse Link fir d'Passwuert zréckzesetzen ass ongëlteg oder ofgelaf. Bitt e neie Link un.",
"request_new_link": "Neie Link ufroen",
"email_required": "E-Mail ass obligatoresch",
"invalid_email": "Gitt w.e.g. eng gëlteg E-Mail-Adress un",
"forgot_password_failed": "Link konnt net geschéckt ginn. Probéiert nach eng Kéier.",
"password_required": "Passwuert ass obligatoresch",
"password_too_short": "D'Passwuert muss mindestens 8 Zeechen hunn",
"please_confirm_password": "Bestätegt w.e.g. Ärt Passwuert",
"passwords_do_not_match": "D'Passwierder stëmmen net iwwerteneen",
"reset_password_failed": "Passwuert konnt net zréckgesat ginn. Probéiert nach eng Kéier."
},
"nav": {
"dashboard": "Dashboard",