Files
orion/static/locales/fr.json
Samir Boulahtit 10a99f98fe
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
fix(storefront): i18n sweep + locale-aware reset-password and welcome email
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>
2026-05-28 23:06:11 +02:00

255 lines
9.3 KiB
JSON

{
"common": {
"save": "Enregistrer",
"cancel": "Annuler",
"delete": "Supprimer",
"edit": "Modifier",
"create": "Créer",
"update": "Mettre à jour",
"add": "Ajouter",
"remove": "Retirer",
"close": "Fermer",
"back": "Retour",
"next": "Suivant",
"previous": "Précédent",
"submit": "Soumettre",
"confirm": "Confirmer",
"yes": "Oui",
"no": "Non",
"ok": "OK",
"done": "Terminé",
"loading": "Chargement...",
"saving": "Enregistrement...",
"processing": "Traitement...",
"searching": "Recherche...",
"sending": "Envoi en cours",
"refresh": "Actualiser",
"retry": "Réessayer",
"view": "Voir",
"view_details": "Voir les détails",
"view_all": "Voir tout",
"show_more": "Voir plus",
"show_less": "Voir moins",
"search": "Rechercher",
"filter": "Filtrer",
"sort": "Trier",
"export": "Exporter",
"import": "Importer",
"download": "Télécharger",
"upload": "Téléverser",
"select": "Sélectionner",
"select_all": "Tout sélectionner",
"deselect_all": "Tout désélectionner",
"actions": "Actions",
"status": "Statut",
"date": "Date",
"time": "Heure",
"name": "Nom",
"email": "E-mail",
"phone": "Téléphone",
"address": "Adresse",
"description": "Description",
"notes": "Notes",
"total": "Total",
"amount": "Montant",
"quantity": "Quantité",
"price": "Prix",
"items": "Articles",
"id": "ID",
"type": "Type",
"category": "Catégorie",
"tags": "Tags",
"active": "Actif",
"inactive": "Inactif",
"enabled": "Activé",
"disabled": "Désactivé",
"pending": "En attente",
"completed": "Terminé",
"failed": "Échoué",
"success": "Succès",
"error": "Erreur",
"warning": "Avertissement",
"info": "Info",
"all": "Tous",
"none": "Aucun",
"other": "Autre",
"unknown": "Inconnu",
"not_available": "N/D",
"required": "Obligatoire",
"optional": "Optionnel",
"language": "Langue",
"settings": "Paramètres",
"help": "Aide",
"support": "Support",
"contact": "Contact",
"about": "À propos",
"privacy": "Confidentialité",
"terms": "Conditions",
"copyright": "Droits d'auteur"
},
"auth": {
"sign_in": "Se connecter",
"sign_out": "Se déconnecter",
"sign_up": "S'inscrire",
"login": "Connexion",
"logout": "Déconnexion",
"register": "Inscription",
"forgot_password": "Mot de passe oublié ?",
"reset_password": "Réinitialiser le mot de passe",
"change_password": "Changer le mot de passe",
"username": "Nom d'utilisateur",
"password": "Mot de passe",
"confirm_password": "Confirmer le mot de passe",
"current_password": "Mot de passe actuel",
"new_password": "Nouveau mot de passe",
"remember_me": "Se souvenir de moi",
"email_placeholder": "Entrez votre e-mail",
"username_placeholder": "Entrez votre nom d'utilisateur",
"password_placeholder": "Entrez votre mot de passe",
"login_success": "Connexion réussie",
"login_failed": "Échec de la connexion",
"logout_success": "Vous avez été déconnecté",
"invalid_credentials": "Nom d'utilisateur ou mot de passe invalide",
"session_expired": "Votre session a expiré. Veuillez vous reconnecter.",
"account_locked": "Votre compte a été verrouillé",
"account_inactive": "Votre compte est inactif",
"signing_in": "Connexion en cours...",
"sending": "Envoi en cours...",
"send_reset_link": "Envoyer le lien de réinitialisation",
"reset_password_desc": "Entrez votre adresse e-mail et nous vous enverrons un lien pour réinitialiser votre mot de passe.",
"back_to_login": "Retour à la connexion",
"back_to_platform": "Retour à la plateforme",
"no_account": "Vous n'avez pas de compte ?",
"visit_platform": "Visitez notre plateforme",
"already_have_account": "Vous avez déjà un compte ?",
"create_account": "Créer un compte",
"back_to_home": "Retour à l'accueil",
"admin_login": "Connexion Admin",
"merchant_login": "Connexion Marchand",
"store_login": "Connexion Portail Magasin",
"customer_login": "Connexion Client",
"create_account_title": "Créer un compte",
"creating_account": "Création du compte...",
"sign_in_instead": "Se connecter",
"first_name": "Prénom",
"last_name": "Nom",
"phone_number": "Numéro de téléphone",
"marketing_consent": "Je souhaite recevoir des actualités et offres spéciales",
"password_requirements": "Doit contenir au moins 8 caractères, une lettre et un chiffre",
"check_email": "Vérifiez votre e-mail",
"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 ?",
"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",
"products": "Produits",
"orders": "Commandes",
"customers": "Clients",
"inventory": "Inventaire",
"analytics": "Analyses",
"reports": "Rapports",
"settings": "Paramètres",
"profile": "Profil",
"team": "Équipe",
"marketplace": "Marketplace",
"integrations": "Intégrations",
"notifications": "Notifications",
"help": "Aide",
"home": "Accueil",
"shop": "Boutique",
"cart": "Panier",
"checkout": "Paiement",
"account": "Compte",
"wishlist": "Liste de souhaits"
},
"errors": {
"generic": "Une erreur s'est produite",
"not_found": "Non trouvé",
"unauthorized": "Non autorisé",
"forbidden": "Interdit",
"bad_request": "Requête invalide",
"server_error": "Erreur serveur",
"network_error": "Erreur réseau",
"timeout": "Délai d'attente dépassé",
"validation_error": "Erreur de validation",
"field_required": "Ce champ est obligatoire",
"invalid_email": "Adresse e-mail invalide",
"invalid_phone": "Numéro de téléphone invalide",
"password_mismatch": "Les mots de passe ne correspondent pas",
"password_too_short": "Le mot de passe est trop court",
"try_again": "Veuillez réessayer",
"contact_support": "Veuillez contacter le support si le problème persiste"
},
"confirmations": {
"delete_title": "Confirmer la suppression",
"delete_message": "Êtes-vous sûr de vouloir supprimer cet élément ?",
"delete_warning": "Cette action est irréversible.",
"cancel_title": "Confirmer l'annulation",
"cancel_message": "Êtes-vous sûr de vouloir annuler ?",
"unsaved_changes": "Vous avez des modifications non enregistrées. Êtes-vous sûr de vouloir quitter ?",
"logout_title": "Confirmer la déconnexion",
"logout_message": "Êtes-vous sûr de vouloir vous déconnecter ?"
},
"footer": {
"all_rights_reserved": "Tous droits réservés",
"powered_by": "Propulsé par"
},
"time": {
"now": "Maintenant",
"today": "Aujourd'hui",
"yesterday": "Hier",
"tomorrow": "Demain",
"this_week": "Cette semaine",
"last_week": "La semaine dernière",
"this_month": "Ce mois-ci",
"last_month": "Le mois dernier",
"this_year": "Cette année",
"ago": "il y a",
"seconds": "secondes",
"minutes": "minutes",
"hours": "heures",
"days": "jours",
"weeks": "semaines",
"months": "mois",
"years": "années"
},
"formats": {
"date": "DD/MM/YYYY",
"time": "HH:mm",
"datetime": "DD/MM/YYYY HH:mm",
"currency": "{amount} {symbol}"
},
"clipboard": {
"copied": "Copié dans le presse-papiers",
"failed": "Échec de la copie"
},
"onboarding": {
"banner": {
"title": "Premiers pas",
"dismiss": "Masquer"
}
}
}