{
  "common": {
    "save": "Enregistrer",
    "cancel": "Annuler",
    "delete": "Supprimer",
    "loading": "Chargement…",
    "back": "Retour",
    "next": "Suivant",
    "previous": "Précédent",
    "confirm": "Confirmer",
    "close": "Fermer",
    "status": "Statut",
    "language": "Langue",
    "required": "Obligatoire",
    "optional": "Facultatif",
    "success": "Opération réussie",
    "searchClient": "Rechercher un client…",
    "noDate": "Sans date",
    "toasts": {
      "deleted": "Supprimé",
      "noChanges": "Aucune modification à enregistrer",
      "selectPatient": "Sélectionnez un client"
    },
    "requiredHint": "* Champ obligatoire"
  },
  "nav": {
    "calendar": "Agenda",
    "patients": "Clients",
    "clinicInfo": "Informations de l'entreprise",
    "billingSub": "Facturation & abonnement",
    "catalogs": "Catalogues (services/professionnels/sites)",
    "timeBlocks": "Plages bloquées",
    "bookingSettings": "Paramètres de réservation en ligne",
    "auditLog": "Journal d'audit",
    "platform": "Plateforme",
    "bonos": "Packs de séances",
    "bookings": "Réservations",
    "settings": "Paramètres",
    "goToAgenda": "Aller à mon agenda",
    "main": "Navigation principale",
    "account": "Mon compte",
    "pendingCount": "{{count}} réservations en attente de validation",
    "team": "Équipe"
  },
  "auth": {
    "login": "Connexion",
    "logout": "Déconnexion",
    "email": "E-mail",
    "password": "Mot de passe",
    "forgotPassword": "Mot de passe oublié ?",
    "signin": "Se connecter",
    "sessionExpired": "Votre session a expiré, reconnectez-vous",
    "systemTitle": "Système de gestion",
    "emailPlaceholder": "votre@email.com",
    "passwordPlaceholder": "********",
    "showPassword": "Afficher le mot de passe",
    "hidePassword": "Masquer le mot de passe",
    "signinLoading": "Connexion en cours…",
    "forgotTitle": "Récupérer le mot de passe",
    "forgotDescription": "Saisissez votre e-mail et nous vous enverrons les instructions pour réinitialiser votre mot de passe.",
    "sendEmail": "Envoyer l'e-mail",
    "sending": "Envoi…",
    "backToLogin": "Retour à la connexion",
    "noAccount": "Vous n'avez pas de compte ?",
    "createAccount": "Créez votre entreprise",
    "errors": {
      "generic": "Erreur d'authentification",
      "invalidCredentials": "Email ou mot de passe incorrect",
      "emailNotConfirmed": "Vous devez confirmer votre email avant de vous connecter",
      "userNotFound": "Utilisateur introuvable",
      "tooManyAttempts": "Trop de tentatives. Attendez quelques minutes et réessayez",
      "passwordMin": "Le mot de passe doit contenir au moins 8 caractères",
      "alreadyRegistered": "Cet email est déjà enregistré",
      "network": "Erreur de connexion. Vérifiez votre internet",
      "invalidEmail": "L'adresse email n'est pas valide",
      "signupsDisabled": "Les inscriptions sont désactivées pour cette entreprise",
      "weakPassword": "Le mot de passe est trop faible",
      "operationFailed": "L'opération n'a pas pu être effectuée. Veuillez réessayer",
      "userInfo": "Impossible de récupérer les informations de l'utilisateur",
      "unexpected": "Erreur inattendue lors de la connexion",
      "resetSent": "Un email avec les instructions pour réinitialiser votre mot de passe a été envoyé",
      "resetError": "Erreur lors de la demande de récupération du mot de passe",
      "passwordUpdated": "Mot de passe mis à jour avec succès",
      "passwordUpdateError": "Erreur lors de la mise à jour du mot de passe",
      "samePassword": "Le nouveau mot de passe doit être différent de l'ancien"
    },
    "reset": {
      "title": "Choisissez un nouveau mot de passe",
      "description": "Saisissez le mot de passe que vous utiliserez désormais pour vous connecter.",
      "inviteTitle": "Créez votre mot de passe",
      "inviteDescription": "Vous avez été invité à rejoindre une équipe. Choisissez le mot de passe que vous utiliserez désormais pour vous connecter.",
      "newPassword": "Nouveau mot de passe",
      "confirmPassword": "Confirmez le mot de passe",
      "submit": "Enregistrer le mot de passe",
      "saving": "Enregistrement…",
      "mismatch": "Les mots de passe ne correspondent pas",
      "checking": "Vérification du lien…",
      "linkInvalidTitle": "Ce lien n'est plus valide",
      "linkInvalid": "Ce lien de réinitialisation a expiré ou a déjà été utilisé. Demandez-en un nouveau et nous vous l'enverrons immédiatement.",
      "requestNew": "Demander un nouveau lien",
      "doneTitle": "Mot de passe mis à jour",
      "done": "Vous pouvez maintenant vous connecter avec votre nouveau mot de passe."
    }
  },
  "appointments": {
    "new": "Nouveau rendez-vous",
    "status": {
      "pending": "En attente",
      "booked": "Confirmé",
      "completed": "Terminé",
      "cancelled": "Annulé",
      "noShow": "Non honoré"
    },
    "duration": "Durée",
    "service": "Service",
    "practitioner": "Professionnel",
    "location": "Site",
    "paid": "Payé",
    "toasts": {
      "created": "Rendez-vous créé avec succès",
      "createError": "Erreur lors de la création du rendez-vous",
      "updated": "Rendez-vous mis à jour avec succès",
      "updateError": "Erreur lors de la mise à jour du rendez-vous",
      "deleted": "Rendez-vous supprimé avec succès",
      "deleteError": "Erreur lors de la suppression du rendez-vous",
      "rescheduled": "Rendez-vous reprogrammé avec succès",
      "rescheduleError": "Erreur lors de la reprogrammation du rendez-vous"
    }
  },
  "booking": {
    "title": "Réservation en ligne",
    "step": {
      "service": "Choisissez un service",
      "practitioner": "Choisissez un professionnel",
      "slot": "Choisissez la date et l'heure",
      "details": "Vos coordonnées",
      "location": "Choisissez un site"
    },
    "loading": "Chargement…",
    "errorTitle": "Impossible de continuer",
    "payment": {
      "successTitle": "Paiement confirmé.",
      "successText": "Nous avons reçu votre paiement et votre rendez-vous est confirmé. Vous allez recevoir un e-mail avec les détails.",
      "cancelTitle": "Paiement annulé.",
      "cancelText": "Rien n'a été débité. Vous pouvez réessayer en choisissant à nouveau le service."
    },
    "noServices": "Aucun service disponible.",
    "changeService": "← Changer de service",
    "changePractitioner": "← Changer de professionnel",
    "loadingSlots": "Chargement des créneaux…",
    "noSlotsDay": "Il n'y a plus de créneau disponible le {{date}}.",
    "patient": {
      "firstName": "Prénom",
      "lastName": "Nom",
      "phone": "Téléphone",
      "email": "E-mail",
      "contactNote": "Indiquez votre téléphone ou e-mail pour confirmer le rendez-vous.",
      "comments": "Commentaires (optionnel)",
      "accept": "J'accepte le traitement de mes données pour gérer ce rendez-vous"
    },
    "confirmBook": "Confirmer la réservation",
    "result": {
      "booked": "Réservation confirmée !",
      "pending": "Demande envoyée",
      "pendingText": "{{business}} doit encore confirmer votre rendez-vous : d'ici là, il n'est pas garanti. Nous vous préviendrons dès qu'il sera accepté.",
      "redirecting": "Redirection vers le paiement sécurisé…",
      "confirmedBadge": "Confirmé",
      "pendingBadge": "En attente de validation",
      "manageNote": "Vous pouvez gérer ou annuler votre rendez-vous depuis le lien que nous vous avons envoyé.",
      "notifiedEmail": "Nous vous avons envoyé les détails du rendez-vous par e-mail.",
      "notifiedSms": "Nous vous avons envoyé les détails du rendez-vous par SMS.",
      "notifiedNone": "Nous n'avons pas pu vous envoyer de notification. Enregistrez cette page ou ajoutez le rendez-vous à votre calendrier.",
      "addToCalendar": "Ajouter au calendrier",
      "googleCalendar": "Google Agenda",
      "manage": "Gérer mon rendez-vous",
      "bookAnother": "Réserver un autre rendez-vous"
    },
    "submitError": "Impossible de finaliser la réservation. Veuillez réessayer.",
    "chooseAnotherSlot": "Choisir un autre horaire",
    "practitionersError": "Impossible de charger les professionnels. Veuillez réessayer.",
    "slotsError": "Impossible de charger les horaires disponibles. Veuillez réessayer.",
    "retry": "Réessayer",
    "poweredBy": "Réservations avec BookingForNow — créez la vôtre gratuitement",
    "createYours": {
      "question": "Vous avez une entreprise ?",
      "link": "Créez une page de réservation comme celle-ci, gratuitement"
    },
    "metaDescription": "Réservez en ligne avec {{name}} : choisissez un service, une date et une heure en moins d'une minute.",
    "otherDate": "Autre date :",
    "noSlotsShort": "Aucun créneau",
    "depositNote": "Réservation avec un acompte de {{amount}} — il est déduit du prix total.",
    "eyebrow": "Réservation en ligne",
    "stepCounter": "Étape {{current}} sur {{total}}",
    "depositTitle": "Acompte de réservation",
    "anyProfessional": "Premier disponible",
    "anyProfessionalHint": "Nous vous attribuons un professionnel disponible pour le créneau choisi.",
    "morning": "Matin",
    "afternoon": "Après-midi",
    "errors": {
      "loadServices": "Erreur lors du chargement des services",
      "businessNotFound": "Nous n'avons pas trouvé cette entreprise. Vérifiez le lien.",
      "loadFailed": "Impossible de charger la page de réservation. Réessayez dans quelques minutes.",
      "onlineBookingDisabled": "Cette entreprise n'accepte pas de réservations en ligne pour le moment.",
      "slotTaken": "Ce créneau vient d'être pris. Nous avons actualisé les horaires : choisissez-en un autre.",
      "outsideHours": "Cet horaire est en dehors des heures d'ouverture. Choisissez un autre créneau.",
      "tooSoon": "Cet horaire est trop proche pour être réservé en ligne. Choisissez-en un plus tardif.",
      "tooFar": "Cette date est trop éloignée pour réserver en ligne. Choisissez-en une plus proche.",
      "invalidStart": "L'horaire choisi n'est pas valide. Choisissez un autre créneau.",
      "invalidEmail": "Vérifiez l'adresse e-mail : elle ne semble pas valide.",
      "invalidPhone": "Vérifiez le numéro de téléphone : il ne semble pas valide.",
      "missingFields": "Des informations obligatoires sont manquantes. Vérifiez le formulaire.",
      "contactRequired": "Indiquez un téléphone ou un e-mail pour que nous puissions vous prévenir.",
      "acceptRequired": "Nous avons besoin de votre consentement pour gérer le rendez-vous.",
      "rateLimited": "Trop de tentatives d'affilée. Patientez quelques minutes et réessayez.",
      "tooManyActive": "Vous avez déjà plusieurs réservations actives. Contactez l'entreprise pour les gérer.",
      "captchaFailed": "La vérification de sécurité n'a pas pu aboutir. Réessayez.",
      "serviceNotFound": "Ce service n'est plus disponible. Choisissez-en un autre.",
      "practitionerUnavailable": "Ce professionnel n'est plus disponible pour ce service. Choisissez-en un autre.",
      "invalidLocation": "Ce site n'est plus disponible. Choisissez-en un autre.",
      "network": "Pas de connexion. Vérifiez votre connexion internet et réessayez."
    },
    "stepNames": {
      "location": "Site",
      "service": "Service",
      "practitioner": "Professionnel",
      "slot": "Date et heure",
      "details": "Vos coordonnées",
      "done": "Confirmation"
    },
    "changeLocation": "← Changer de site",
    "changeSlot": "← Changer la date ou l'heure",
    "durationShort": "{{minutes}} min",
    "price": "Prix",
    "noPractitionersFor": "Aucun professionnel n'est disponible pour « {{service}} » en ce moment. Choisissez un autre service.",
    "callBusiness": "Appeler le {{phone}}",
    "dateOutOfRange": "Vous ne pouvez réserver qu'entre le {{from}} et le {{to}}.",
    "tzNotice": "Les heures sont affichées à l'heure locale de l'entreprise : {{zone}}.",
    "closedDay": "L'entreprise est fermée le {{date}}.",
    "searchingNext": "Recherche du prochain jour avec des créneaux libres…",
    "noNextAvailable": "Nous n'avons trouvé aucun créneau libre dans les prochains jours. Essayez une autre date ou un autre professionnel.",
    "nextAvailable": "Prochain jour disponible : {{date}}",
    "requiredHint": "* Champ obligatoire",
    "privacyNotice": "Responsable du traitement de vos données : {{business}}. Elles sont utilisées uniquement pour gérer votre rendez-vous et vous en informer ; BookingForNow les traite pour le compte de l'entreprise. Vous pouvez demander à y accéder, à les rectifier ou à les supprimer en contactant {{business}}.",
    "privacyLink": "Politique de confidentialité",
    "captchaExpired": "La vérification a expiré. Recommencez-la pour continuer.",
    "submitting": "Réservation en cours…",
    "demo": {
      "notice": "Ceci est une démonstration : aucune réservation réelle n'est créée.",
      "detail": "Rien de ce que vous saisissez n'est envoyé ni enregistré.",
      "cta": "Créez gratuitement votre page de réservation",
      "linkLabel": "Voir un exemple de page de réservation"
    }
  },
  "dashboard": {
    "patient": {
      "selectTitle": "Sélectionner un client",
      "search": "Rechercher un client par nom, téléphone ou e-mail…",
      "sessions": "séances"
    },
    "appointment": {
      "date": "Date",
      "time": "Heure",
      "create": "Créer un rendez-vous",
      "editTitle": "Modifier le rendez-vous",
      "saveChanges": "Enregistrer les modifications"
    }
  },
  "calendar": {
    "title": "Calendrier des rendez-vous",
    "legend": {
      "title": "Légende :",
      "paid": "Payé",
      "unpaid": "Paiement en attente",
      "closed": "Non ouvré",
      "overdue": "Non encaissé (passé)"
    },
    "view": {
      "month": "Mois",
      "week": "Semaine",
      "day": "Jour"
    },
    "weekTotal": "Total semaine",
    "today": "Aujourd'hui",
    "hideAmount": "Masquer le montant",
    "showAmount": "Afficher le montant",
    "deleteMessage": "Êtes-vous sûr de vouloir supprimer ce rendez-vous ?",
    "sessionNotes": "Notes du rendez-vous",
    "deleteDetails": "Cette action est irréversible.",
    "saving": "Enregistrement...",
    "sessionNotesHint": "Ces notes sont liées uniquement à ce rendez-vous",
    "remind": "Rappeler",
    "newPatient": "Nouveau client",
    "session": "séance",
    "useBono": "Utiliser le pack",
    "noBonoOption": "Sans pack (paiement à l'unité)",
    "moveMessage": "Êtes-vous sûr de vouloir déplacer ce rendez-vous ?",
    "editPatient": "Modifier le client",
    "timeSlotHint": "Heures autorisées : {{start}} - {{end}} par tranches de 30 minutes",
    "deleteTitle": "Supprimer le rendez-vous",
    "noPhone": "Pas de téléphone",
    "sessionNotesPlaceholder": "Observations, service réalisé, état du client...",
    "creating": "Création...",
    "moveTitle": "Déplacer le rendez-vous",
    "noPatients": "Aucun client trouvé",
    "patient": "Client",
    "moveBtnText": "Déplacer",
    "navNextPeriod": "Période suivante",
    "exportByApptLabel": "Exporter les factures par rendez-vous du mois de {{month}}",
    "navPrevPeriod": "Période précédente",
    "navGoNextPeriod": "Aller à la période suivante",
    "exportByPatientLabel": "Exporter les factures par client du mois de {{month}}",
    "whatsappReminder": "Envoyer un rappel par WhatsApp",
    "exportByAppt": "Exporter les factures par rendez-vous (une facture par rendez-vous)",
    "editPatientInfo": "Modifier les informations du client",
    "navGoPrevPeriod": "Aller à la période précédente",
    "exportByPatient": "Exporter les factures par client (une facture regroupant les rendez-vous du client)",
    "closedSlot": "Non ouvré / Fermé",
    "moreCount": "+{{count}} autres",
    "form": {
      "service": "Service",
      "serviceNone": "Aucun service",
      "duration": "Durée",
      "durationOther": "Autre",
      "priceLabel": "Montant",
      "paid": "Payé",
      "collected": "Encaissé",
      "pending": "En attente",
      "bonoPrice": "Inclus dans le pack",
      "practitioner": "Professionnel",
      "practitionerNone": "Non attribué",
      "noPractitionersForService": "Aucun professionnel actif n'est associé à ce service (voir Catalogues → Professionnels).",
      "allProfessionals": "Tous les professionnels",
      "durationFromService": "La durée est définie par le service. Vous pourrez l'ajuster ensuite en modifiant le rendez-vous."
    },
    "overlapPractitioner": "Ce professionnel a déjà un rendez-vous à cette heure : {{name}} ({{time}}).",
    "overlapPatient": "Le client a déjà un autre rendez-vous à cette heure ({{time}}).",
    "toasts": {
      "patientNotFound": "Le client de ce rendez-vous est introuvable",
      "patientUnknown": "Client inconnu",
      "invalidTime": "L'heure doit être comprise entre {{start}} et {{end}} par pas de 30 minutes",
      "exportBadFormat": "L'export n'a pas renvoyé le format attendu. Réessayez.",
      "exportError": "Erreur lors de l'export du rapport",
      "cancelled": "Rendez-vous annulé",
      "cancelledNotified": "Rendez-vous annulé. Le client recevra un e-mail pour l'en informer.",
      "cancelError": "Impossible d'annuler le rendez-vous",
      "updatedNotified": "Rendez-vous mis à jour. Le client recevra un e-mail avec le nouvel horaire.",
      "rescheduledNotified": "Rendez-vous reprogrammé. Le client recevra un e-mail avec le nouvel horaire."
    },
    "timezoneNote": "Heures affichées dans le fuseau horaire de l'entreprise : {{tz}}",
    "showCancelled": "Afficher les annulés",
    "blockedSlot": "Bloqué",
    "minutesShort": "{{count}} min",
    "moveDetails": "{{from}} → {{to}}",
    "movePractitioner": "Professionnel : {{from}} → {{to}}",
    "movePastWarning": "Attention : la nouvelle date est déjà passée",
    "errors": {
      "practitionerNotAssigned": "Ce service n'est pas attribué à ce professionnel. Choisissez un autre professionnel ou vérifiez les Catalogues.",
      "bonoUnavailable": "Ce pack n'a plus de séances disponibles. Choisissez-en un autre ou créez le rendez-vous sans pack.",
      "invalidDuration": "La durée doit être un nombre entier de minutes compris entre {{min}} et {{max}}."
    },
    "whatsapp": {
      "reminder": "Bonjour {{name}}, nous vous rappelons votre rendez-vous chez {{business}} le {{date}} à {{time}}. Si vous devez le modifier ou ne pouvez pas venir, prévenez-nous. Merci !",
      "reminderNoBusiness": "Bonjour {{name}}, nous vous rappelons votre rendez-vous du {{date}} à {{time}}. Si vous devez le modifier ou ne pouvez pas venir, prévenez-nous. Merci !"
    },
    "notify": {
      "label": "Prévenir le client par e-mail",
      "hint": "Nous enverrons un e-mail à {{email}} avec le nouvel horaire."
    },
    "cancel": {
      "button": "Annuler le rendez-vous",
      "title": "Annuler le rendez-vous",
      "message": "Le rendez-vous sera annulé et son créneau libéré. Vous pourrez toujours le voir avec « Afficher les annulés ».",
      "confirm": "Oui, annuler",
      "keep": "Non, le garder"
    },
    "viewTitle": "Détail du rendez-vous",
    "readOnlyNotice": "Votre rôle permet uniquement de consulter l'agenda."
  },
  "adminAjustes": {
    "title": "Paramètres de réservation en ligne",
    "loading": "Chargement…",
    "bookingUrl": "URL publique de réservation :",
    "copyLink": "Copier",
    "saved": "Modifications enregistrées",
    "save": "Enregistrer les modifications",
    "saving": "Enregistrement…",
    "online": {
      "legend": "Réservations en ligne",
      "enable": "Activer la page de réservation publique",
      "autoAccept": "Accepter automatiquement (sans validation manuelle)",
      "autoAcceptOnHint": "Chaque réservation en ligne est confirmée instantanément et occupe le créneau dans votre agenda. Celles des clients ayant déjà plusieurs absences continueront de demander votre validation.",
      "autoAcceptOffHint": "Chaque réservation en ligne arrive « En attente » : le créneau est retenu, mais il n'est confirmé qu'après votre validation.",
      "goToPending": "Voir les réservations en attente",
      "noCaptchaHint": "La vérification anti-bots n'est pas encore activée sur la plateforme. D'ici là, par sécurité, chaque réservation en ligne arrive en attente et vous devez l'accepter dans Réservations, même avec la confirmation automatique activée."
    },
    "policy": {
      "label": "Délai pour annuler ou modifier un rendez-vous en ligne",
      "none": "Sans limite (jusqu’à l’heure du rendez-vous)",
      "hoursBefore_one": "{{count}} heure avant",
      "hoursBefore_few": "{{count}} heures avant",
      "hoursBefore_many": "{{count}} heures avant",
      "hoursBefore_other": "{{count}} heures avant",
      "custom": "Autre délai…",
      "customLabel": "Heures à l’avance (de 0 à 720)",
      "hoursUnit": "heures",
      "hint": "Vos clients peuvent annuler ou modifier leur rendez-vous depuis le lien reçu lors de la réservation. S’il reste moins de temps que le délai choisi, ce lien ne le permet plus et les invite à vous contacter. Rien n’est facturé : seules l’annulation et la modification en ligne sont bloquées. Vous pouvez toujours annuler ou déplacer un rendez-vous depuis l’agenda, et les nouvelles réservations ne sont pas concernées.",
      "invalid": "Indiquez un nombre d’heures entier entre 0 et 720."
    },
    "locale": {
      "legend": "Localisation",
      "language": "Langue",
      "currency": "Devise",
      "timezone": "Fuseau horaire",
      "country": "Pays (ISO)",
      "timezonePlaceholder": "Sélectionnez un fuseau horaire",
      "invalidNotice": "Vérifiez les valeurs signalées : avec un fuseau horaire, une devise ou une langue incorrects, vos clients verront des heures et des prix erronés.",
      "goToConfig": "Modifier dans les Paramètres",
      "usedByBookingPage": "Votre page de réservation affiche les heures et les prix selon ces valeurs."
    },
    "eyebrow": "Réservation en ligne",
    "toasts": {
      "loadError": "Erreur lors du chargement des paramètres",
      "saveError": "Erreur lors de l'enregistrement"
    },
    "share": {
      "title": "Partagez votre page de réservation",
      "subtitle": "Voici le lien où vos clients réservent eux-mêmes. Publiez-le sur Instagram, Google Maps, WhatsApp, votre site web ou à l'accueil.",
      "copied": "Copié",
      "copyFailed": "Impossible de copier. Sélectionnez le texte et copiez-le manuellement.",
      "open": "Voir en tant que client",
      "disabledNotice": "Votre page n'accepte pas encore de réservations : activez « Activer la page de réservation publique » ci-dessous et enregistrez les modifications.",
      "noServices": "Vous n'avez aucun service actif : vos clients verront une page vide.",
      "noPractitioners": "Vous n'avez aucun professionnel actif : vos clients ne trouveront aucun créneau.",
      "goToCatalogs": "Aller aux services et professionnels",
      "trialBranding": "Pendant la période d'essai, votre page de réservation, le portail des rendez-vous, les e-mails envoyés à vos clients et le rendez-vous qu'ils ajoutent à leur calendrier comportent une mention discrète de BookingForNow, et après leur réservation vos clients voient une invitation à créer gratuitement leur propre page. Avec Starter ou Pro, tout cela disparaît.",
      "whatsapp": "Partager sur WhatsApp",
      "whatsappMessage": "Réservez votre rendez-vous chez {{name}} quand vous voulez, en moins d'une minute : {{url}}",
      "showQr": "Code QR",
      "qrAlt": "Code QR de votre page de réservation",
      "qrHint": "Imprimez-le et placez-le à l'accueil, en vitrine ou sur vos cartes de visite : en le scannant, on ouvre votre page de réservation.",
      "printQr": "Imprimer",
      "printCta": "Scannez pour réserver votre rendez-vous",
      "downloadQr": "Télécharger (SVG)",
      "qrError": "Impossible de générer le code QR. Rechargez la page et réessayez.",
      "popupBlocked": "Le navigateur a bloqué la fenêtre d'impression. Autorisez les fenêtres pop-up pour ce site ou téléchargez le code QR.",
      "embedLabel": "Bouton « Réserver » pour votre site web",
      "embedHint": "Collez ce code dans votre site web : il affiche un bouton qui ouvre votre page de réservation dans un nouvel onglet.",
      "embedButtonLabel": "Prendre rendez-vous",
      "copyEmbed": "Copier le code",
      "iframeLabel": "Ou intégrez la page de réservation à votre site",
      "iframeHint": "Collez-le là où vous voulez afficher le formulaire de réservation. Si votre site n'accepte pas les iframes, utilisez le bouton ci-dessus.",
      "copyIframe": "Copier le code",
      "iframeTitle": "Prendre rendez-vous chez {{name}}"
    },
    "referral": {
      "title": "Recommandez BookingForNow",
      "lede_one": "Partagez votre lien avec d’autres entreprises. Quand l’une d’elles s’inscrit avec ce lien et reçoit sa première réservation en ligne, nous vous offrons {{count}} jour avec toutes les fonctionnalités ou, si vous avez déjà un forfait payant, une mensualité en avoir.",
      "lede_few": "Partagez votre lien avec d’autres entreprises. Quand l’une d’elles s’inscrit avec ce lien et reçoit sa première réservation en ligne, nous vous offrons {{count}} jours avec toutes les fonctionnalités ou, si vous avez déjà un forfait payant, une mensualité en avoir.",
      "lede_many": "Partagez votre lien avec d’autres entreprises. Quand l’une d’elles s’inscrit avec ce lien et reçoit sa première réservation en ligne, nous vous offrons {{count}} jours avec toutes les fonctionnalités ou, si vous avez déjà un forfait payant, une mensualité en avoir.",
      "lede_other": "Partagez votre lien avec d’autres entreprises. Quand l’une d’elles s’inscrit avec ce lien et reçoit sa première réservation en ligne, nous vous offrons {{count}} jours avec toutes les fonctionnalités ou, si vous avez déjà un forfait payant, une mensualité en avoir.",
      "linkLabel": "Votre lien de recommandation :",
      "whatsapp": "Recommander sur WhatsApp",
      "whatsappMessage": "Je vous recommande BookingForNow pour gérer les rendez-vous de votre entreprise : vos clients réservent en ligne en toute autonomie et il existe un forfait gratuit. Essayez-le ici : {{url}}",
      "terms": "Conditions du programme",
      "stats": {
        "signedUp": "Inscrites",
        "activated": "Reçoivent des réservations",
        "rewards": "Récompenses cette année",
        "rewardsValue": "{{n}} sur {{max}}"
      },
      "newReward": "Votre recommandation a porté ses fruits : une récompense a été appliquée à votre compte.",
      "historyTitle": "Vos récompenses",
      "reward": {
        "trial_one": "{{count}} jour avec toutes les fonctionnalités, jusqu’au {{date}}",
        "trial_few": "{{count}} jours avec toutes les fonctionnalités, jusqu’au {{date}}",
        "trial_many": "{{count}} jours avec toutes les fonctionnalités, jusqu’au {{date}}",
        "trial_other": "{{count}} jours avec toutes les fonctionnalités, jusqu’au {{date}}",
        "credit": "Avoir de {{amount}} sur votre abonnement",
        "failed": "Nous n’avons pas pu l’appliquer automatiquement : nous la vérifions manuellement et vous écrirons.",
        "cap": "Pas de récompense : vous aviez déjà reçu les {{max}} de cette année."
      },
      "privacy": "Vous ne voyez que des chiffres : nous ne vous disons pas quelles entreprises se sont inscrites avec votre lien."
    },
    "errors": {
      "invalidBranding": "Le logo ou la couleur n'est pas valide. Utilisez une URL https et une couleur au format #RRGGBB."
    },
    "branding": {
      "legend": "Apparence de votre page"
    }
  },
  "adminAuditoria": {
    "title": "Journal d'audit",
    "subtitle": "Registre inaltérable de qui a modifié quoi dans votre entreprise.",
    "filter": {
      "action": "Action",
      "entity": "Entité",
      "actor": "E-mail de l'auteur de la modification",
      "apply": "Appliquer",
      "loading": "Chargement…",
      "allEntities": "Toutes",
      "allActions": "Toutes",
      "actorPlaceholder": "personne@exemple.com"
    },
    "cols": {
      "date": "Date",
      "actor": "Qui",
      "action": "Action",
      "entity": "Entité",
      "id": "ID",
      "ip": "IP"
    },
    "close": "Fermer",
    "view": "Voir",
    "empty": "Aucune entrée.",
    "eyebrow": "Journal",
    "noActor": "Client ou système",
    "verbs": {
      "create": "Création",
      "update": "Modification",
      "delete": "Suppression",
      "anonymize": "Anonymisation (effacement des données)",
      "bulk_import": "Importation groupée",
      "reschedule": "Reprogrammation",
      "accept": "Acceptation",
      "reject": "Refus",
      "cancel": "Annulation",
      "mark_paid": "Marqué comme payé",
      "upload": "Envoi de fichier",
      "logo_upload": "Envoi du logo",
      "practitioners_update": "Modification des professionnels attribués",
      "services_update": "Modification des services attribués",
      "locations_update": "Modification des sites attribués",
      "checkout_started": "Début du paiement de l'abonnement",
      "confirmed_from_checkout": "Abonnement confirmé",
      "cancel_scheduled": "Résiliation de l'abonnement programmée",
      "reactivated": "Abonnement réactivé",
      "downgraded_manual": "Passage à un forfait inférieur",
      "billing_export": "Export de facturation",
      "plan_changed": "Changement de forfait",
      "ended_reconciled": "Abonnement terminé",
      "tenant_extend_trial": "Essai prolongé par le support",
      "tenant_activate": "Compte activé par le support",
      "tenant_suspend": "Compte suspendu par le support",
      "tenant_set_plan": "Forfait modifié par le support",
      "restore": "Restauration d'une sauvegarde",
      "invite": "Invitation dans l'équipe",
      "resend": "Invitation renvoyée",
      "remove": "Retrait de l'équipe",
      "terms_accepted": "Acceptation des Conditions générales et de la Politique de confidentialité",
      "attribution": "Origine de l'inscription",
      "rewarded": "Récompense du programme de recommandation",
      "marketing_unsubscribed": "Désinscription des e-mails de conseils et d'offres",
      "restore_failed": "Échec de la restauration d'une sauvegarde",
      "prices_update": "Modification des tarifs",
      "feed_rotate": "Nouveau lien de synchronisation du calendrier"
    },
    "entities": {
      "patient": "Client",
      "appointment": "Rendez-vous",
      "bono": "Pack de séances",
      "patient_file": "Fichier client",
      "service": "Service",
      "practitioner": "Professionnel",
      "location": "Site",
      "time_block": "Blocage d'horaire",
      "note_template": "Modèle de note",
      "clinical_note": "Note de séance",
      "consent_form_template": "Modèle de consentement",
      "consent_signature": "Signature de consentement",
      "tenant_settings": "Paramètres de l'entreprise",
      "tenant": "Abonnement",
      "report": "Rapport",
      "tenant_user": "Membre de l'équipe",
      "backup": "Sauvegarde",
      "email_preferences": "Préférences e-mail",
      "configuration": "Configuration"
    },
    "pagination": {
      "range": "Entrées {{from}}–{{to}}"
    },
    "errors": {
      "invalidFilter": "Filtre non valide : l'e-mail ne peut contenir ni espaces, ni virgules, ni parenthèses, ni * ni %."
    }
  },
  "adminBloqueos": {
    "title": "Blocages d'horaire",
    "subtitle": "Périodes d'indisponibilité (vacances, formation, maintenance…).",
    "filter": {
      "practitioner": "Professionnel",
      "location": "Site",
      "all": "— Tous —",
      "allF": "— Toutes —",
      "hidePast": "Masquer les blocages passés"
    },
    "form": {
      "newTitle": "Nouveau blocage",
      "editTitle": "Modifier le blocage",
      "practitioner": "Professionnel",
      "location": "Site",
      "start": "Début",
      "end": "Fin",
      "reason": "Motif",
      "reasonPlaceholder": "Vacances, formation…",
      "globalHint": "Sans professionnel ni site, le blocage ferme toute l'entreprise : personne ne pourra réserver pendant cette période.",
      "timezoneHint": "Les heures sont celles du fuseau horaire de l'entreprise : {{zone}}."
    },
    "empty": "Aucun blocage.",
    "confirm": {
      "title": "Supprimer le blocage",
      "message": "Voulez-vous vraiment supprimer ce blocage ?"
    },
    "eyebrow": "Disponibilité",
    "newLabel": "Nouveau blocage",
    "blockedLabel": "Bloqué",
    "allPractitioners": "Tous les professionnels",
    "allLocations": "Tous les sites",
    "toasts": {
      "requiredTimes": "Début et fin obligatoires",
      "endAfterStart": "La fin doit être postérieure au début",
      "saved": "Blocage enregistré"
    },
    "globalLabel": "Fermeture générale",
    "emptyUpcoming": "Aucun blocage à venir",
    "emptyHint": "Bloquez les vacances, jours fériés ou absences pour que personne ne puisse réserver pendant ces heures.",
    "errors": {
      "notOwn": "Vous ne pouvez gérer que vos propres blocages.",
      "tooLong": "Un blocage ne peut pas durer plus de {{days}} jours.",
      "invalid": "Vérifiez les dates et le motif du blocage."
    }
  },
  "adminCatalogos": {
    "title": "Catalogues",
    "subtitle": "Gérez vos services, professionnels et sites.",
    "info": "Un service est ce que vous proposez (p. ex. une séance). Un professionnel est la personne qui le réalise. Un site est le lieu physique. Pour les associer, modifiez un service ou un professionnel et cochez les cases correspondantes.",
    "loading": "Chargement…",
    "catalog": {
      "practitioners": "Professionnels attribués"
    },
    "tabs": {
      "services": "Services ({{count}})",
      "practitioners": "Professionnels ({{count}})",
      "locations": "Sites ({{count}})"
    },
    "common": {
      "save": "Enregistrer",
      "cancel": "Annuler",
      "edit": "Modifier",
      "delete": "Supprimer",
      "saving": "Enregistrement…",
      "active": "Actif",
      "inactive": "Inactif"
    },
    "services": {
      "form": {
        "newTitle": "Nouveau service",
        "editTitle": "Modifier le service",
        "name": "Nom",
        "namePlaceholder": "Ex. : Coupe de cheveux, Première consultation, Contrôle…",
        "duration": "Durée (min)",
        "price": "Prix",
        "tax": "Taxe (%)",
        "color": "Couleur",
        "active": "Actif",
        "description": "Description"
      },
      "durationUnit": "{{min}} min",
      "newLabel": "Nouveau service",
      "emptyTitle": "Ajoutez votre premier service",
      "emptyHint": "Un service est ce que vos clients voient et réservent : nom, durée et prix."
    },
    "practitioners": {
      "form": {
        "newTitle": "Nouveau professionnel",
        "editTitle": "Modifier le professionnel",
        "firstName": "Prénom",
        "lastName": "Nom",
        "email": "E-mail",
        "phone": "Téléphone",
        "color": "Couleur",
        "active": "Actif",
        "bio": "Biographie"
      },
      "assignments": {
        "services": "Services",
        "locations": "Sites",
        "noServices": "Aucun service défini.",
        "noLocations": "Aucun site défini."
      },
      "empty": "Aucun professionnel.",
      "newLabel": "Nouveau professionnel",
      "emptyTitle": "Ajoutez votre équipe",
      "emptyHint": "Les professionnels sont les personnes qui assurent les rendez-vous. Chacun dispose de son propre agenda."
    },
    "locations": {
      "form": {
        "newTitle": "Nouveau site",
        "editTitle": "Modifier le site",
        "name": "Nom",
        "address": "Adresse",
        "cp": "Code postal",
        "city": "Ville",
        "province": "Département / région",
        "country": "Pays",
        "phone": "Téléphone",
        "email": "E-mail",
        "timezone": "Fuseau horaire",
        "timezonePlaceholder": "Sélectionnez un fuseau horaire",
        "active": "Actif"
      },
      "newLabel": "Nouveau site",
      "emptyTitle": "Créez votre premier site",
      "emptyHint": "Le site est votre local ou lieu de travail. Il en faut au moins un pour attribuer des professionnels."
    },
    "confirm": {
      "title": "Confirmer la suppression",
      "serviceMessage": "Voulez-vous vraiment supprimer ce service ?",
      "practitionerMessage": "Voulez-vous vraiment supprimer ce professionnel ?",
      "locationMessage": "Voulez-vous vraiment supprimer ce site ?",
      "serviceLabel": "Service",
      "practitionerLabel": "Professionnel",
      "locationLabel": "Site"
    },
    "eyebrow": "Paramètres",
    "toasts": {
      "nameRequired": "Nom obligatoire",
      "locationRequired": "Vous devez attribuer au moins un site",
      "serviceSaved": "Service enregistré",
      "practitionerSaved": "Professionnel enregistré",
      "locationSaved": "Site enregistré",
      "loadError": "Erreur lors du chargement des catalogues",
      "saveError": "Erreur lors de l'enregistrement",
      "serviceRequired": "Le nom et la durée sont obligatoires"
    },
    "inUse": {
      "title": "Suppression impossible",
      "message": "Des rendez-vous ou d'autres données y sont associés : le supprimer rendrait cet historique incomplet.",
      "details": "Vous pouvez le désactiver : il ne sera plus proposé pour les nouvelles réservations et l'historique sera conservé.",
      "confirm": "Désactiver",
      "deactivated": "Désactivé : il n'est plus proposé pour les nouvelles réservations"
    }
  },
  "adminPendientes": {
    "title": "Réservations en attente",
    "refresh": "Actualiser",
    "loading": "Chargement…",
    "empty": "Aucune réservation en attente de confirmation.",
    "accept": "Accepter",
    "reject": "Refuser",
    "modal": {
      "title": "Refuser la réservation",
      "reason": "Motif (facultatif, envoyé au client)",
      "cancel": "Annuler",
      "confirm": "Confirmer le refus"
    },
    "eyebrow": "Boîte de réception",
    "toasts": {
      "acceptError": "Erreur lors de l'acceptation de la réservation",
      "rejectError": "Erreur lors du refus de la réservation",
      "alreadyHandled": "Cette réservation avait déjà été traitée (acceptée, refusée ou annulée) et a été retirée de la boîte de réception.",
      "overlap": "Impossible d'accepter : ce professionnel a déjà un autre rendez-vous à cette heure. La réservation reste en attente."
    },
    "unnamedClient": "Client sans nom",
    "noService": "Aucun service",
    "noPractitioner": "Aucun professionnel attribué",
    "source": {
      "online": "Réservation en ligne",
      "staff": "Créée par l'équipe",
      "other": "Autre origine"
    },
    "payment": {
      "none": "Pas de paiement en ligne",
      "pending": "Paiement en attente",
      "paid": "Payé",
      "refunded": "Remboursé",
      "failed": "Paiement échoué"
    }
  },
  "billing": {
    "title": "Facturation",
    "planBilling": "Facturation et forfait",
    "subtitle": "Choisissez le forfait qui convient le mieux à votre entreprise.",
    "info": "Chaque forfait définit les limites de votre compte. Free : 1 professionnel, 1 site, 2 utilisateurs avec accès et jusqu'à 50 clients. Starter : jusqu'à 3 professionnels, 1 site et 5 utilisateurs, avec rappels automatiques par e-mail. Pro : professionnels, sites et utilisateurs illimités, avec rappels automatiques par e-mail et support prioritaire.",
    "currentStatus": {
      "plan": "Forfait actuel :",
      "renewal": "Prochain renouvellement :",
      "manage": "Gérer l'abonnement",
      "cancel": "Annuler l'abonnement",
      "reactivate": "Réactiver",
      "cancelingTag": "Annulation programmée",
      "willCancelOn": "Il sera résilié le {{date}} et votre compte passera au forfait Free."
    },
    "cancelModal": {
      "title": "Annuler l'abonnement",
      "message": "Voulez-vous vraiment annuler votre abonnement ?",
      "keepAccess": "Vous conservez toutes les fonctionnalités jusqu'au {{date}}. Ensuite, votre compte passera au forfait Free (1 professionnel, 1 site, jusqu'à 50 clients et sans rappels automatiques).",
      "confirm": "Oui, annuler",
      "downgradeNow": "Votre forfait passera à Free immédiatement (1 professionnel, 1 site, jusqu'à 50 clients et sans rappels automatiques)."
    },
    "usageSection": {
      "title": "Utilisation actuelle",
      "patients": "Clients",
      "practitioners": "Professionnels",
      "locations": "Sites",
      "unlimited": "(illimité)"
    },
    "cycle": {
      "monthly": "Mensuel",
      "yearly": "Annuel",
      "yearlySave": "2 mois offerts"
    },
    "plan": {
      "recommended": "Recommandé",
      "current": "Forfait actuel",
      "soon": "Bientôt disponible",
      "subscribe": "S'abonner",
      "change": "Passer à ce forfait"
    },
    "loading": "Chargement...",
    "plans": {
      "free": {
        "tagline": "Gratuit pour toujours, pour commencer à recevoir des réservations",
        "features": [
          "1 professionnel et 1 site",
          "Jusqu'à 50 clients",
          "2 utilisateurs avec accès au tableau de bord",
          "Agenda, packs de séances et page de réservation en ligne 24h/24, 7j/7"
        ],
        "note": "Forfait gratuit permanent. Changez de forfait quand vous voulez."
      },
      "starter": {
        "tagline": "Pour les petites entreprises et les professionnels indépendants",
        "features": [
          "Jusqu'à 3 professionnels et 1 site",
          "Clients illimités",
          "Jusqu'à 5 utilisateurs avec accès au tableau de bord",
          "Rappels automatiques par e-mail",
          "Sans la marque BookingForNow sur votre page de réservation"
        ]
      },
      "pro": {
        "tagline": "Pour les entreprises en croissance avec plusieurs sites",
        "features": [
          "Professionnels, sites et utilisateurs illimités",
          "Rappels automatiques par e-mail",
          "Sans la marque BookingForNow sur votre page de réservation",
          "Support prioritaire"
        ]
      }
    },
    "freePrice": "Gratuit",
    "monthlySuffix": "/mois",
    "yearlySuffix": "/an",
    "yearlyEquivalent": "soit {{monthly}}/mois",
    "toasts": {
      "planUnavailable": "Ce forfait n'est pas encore disponible.",
      "checkoutError": "Impossible de démarrer le paiement.",
      "portalError": "Impossible d'ouvrir le portail de facturation.",
      "portalNoCustomer": "Vous n'avez pas encore d'abonnement actif. Choisissez un forfait pour commencer.",
      "cancelScheduled": "Votre abonnement sera annulé à la fin de la période.",
      "cancelError": "Impossible d'annuler l'abonnement.",
      "reactivated": "Abonnement réactivé.",
      "reactivateError": "Impossible de réactiver l'abonnement.",
      "planDowngraded": "Votre forfait est passé à Free.",
      "alreadySubscribed": "Vous avez déjà un abonnement actif. Nous vous redirigeons vers le portail de facturation pour changer de forfait.",
      "checkoutCanceled": "Vous avez quitté le paiement sans le terminer. Aucun montant ne vous a été débité.",
      "checkoutStub": "Les paiements ne sont pas encore activés sur ce serveur. Écrivez-nous à soporte@bookingfornow.com et nous les activerons avec vous.",
      "checkoutConfirmed": "Abonnement activé ! Merci de votre confiance en BookingForNow.",
      "checkoutConfirmPending": "Paiement reçu. L'activation peut prendre quelques secondes : rechargez la page si votre forfait n'apparaît pas encore.",
      "samePlan": "C'est déjà votre forfait actuel.",
      "providerUnavailable": "Nous n'avons pas pu vérifier votre abonnement auprès du prestataire de paiement. Réessayez dans quelques minutes.",
      "paymentIssue": "Votre dernier paiement est en attente. Mettez à jour votre moyen de paiement dans le portail de facturation avant de changer de forfait.",
      "planChanged": "Forfait modifié. La différence apparaîtra sur votre prochaine facture.",
      "changePlanError": "Impossible de changer de forfait. Aucun montant ne vous a été débité."
    },
    "planErrors": {
      "planRequired": "Cette fonctionnalité n'est pas incluse dans votre forfait actuel. Passez à un forfait supérieur pour l'activer.",
      "planLimitReached": "Vous avez atteint la limite de votre forfait.",
      "subscriptionInactive": "Votre abonnement n'est pas actif. Mettez à jour votre moyen de paiement pour continuer.",
      "goToBilling": "Allez dans Paramètres → Facturation pour changer de forfait.",
      "limitPatients": "Vous avez atteint le maximum de {{limit}} clients de votre forfait.",
      "limitPractitioners": "Vous avez atteint le maximum de {{limit}} professionnels de votre forfait.",
      "limitLocations": "Vous avez atteint le maximum de {{limit}} sites de votre forfait.",
      "limitTeamMembers": "Vous avez atteint le maximum de {{limit}} utilisateurs de votre forfait."
    },
    "downgrade": {
      "warnTitle": "Vous allez dépasser les limites de votre nouveau forfait",
      "warnBody": "En passant à un forfait inférieur, ce qui dépasse la limite du nouveau forfait sera désactivé : {{resources}}. Rien n'est supprimé : tout sera réactivé automatiquement lorsque vous remonterez de forfait.",
      "practitioners_one": "{{count}} professionnel",
      "practitioners_few": "{{count}} professionnels",
      "practitioners_many": "{{count}} professionnels",
      "practitioners_other": "{{count}} professionnels",
      "locations_one": "{{count}} site",
      "locations_few": "{{count}} sites",
      "locations_many": "{{count}} sites",
      "locations_other": "{{count}} sites",
      "confirm": "Je comprends, continuer"
    },
    "deactivatedByPlan": "Désactivé par votre forfait",
    "upgradeCta": "Améliorer votre forfait",
    "planNames": {
      "free": "Free",
      "starter": "Starter",
      "pro": "Pro",
      "trial": "Essai gratuit"
    },
    "status": {
      "active": "Actif",
      "trialing": "En période d'essai",
      "past_due": "Paiement en retard",
      "unpaid": "Impayé",
      "canceled": "Résilié",
      "incomplete": "Paiement incomplet",
      "incomplete_expired": "Paiement expiré",
      "paused": "En pause",
      "unknown": "Statut indéterminé"
    },
    "trialEndsOn": "se termine le {{date}}",
    "ownerOnly": "Seul le propriétaire du compte peut souscrire, modifier ou résilier le forfait. Demandez-lui de le faire depuis son propre compte utilisateur.",
    "billedInCurrency": "Les forfaits sont facturés en {{currency}}, même si votre entreprise travaille en {{own}}. Nous n'appliquons aucune conversion : votre banque effectuera le change.",
    "changeModal": {
      "title": "Changer de forfait",
      "message": "Vous allez faire passer votre abonnement au forfait {{plan}} ({{price}}).",
      "proration": "Le changement s'applique immédiatement. La partie proportionnelle de la période en cours sera ajoutée ou déduite de votre prochaine facture.",
      "deactivateWarn": "En passant à {{plan}}, {{resources}} seront désactivés car ils dépassent sa limite. Ils ne sont pas supprimés : ils seront réactivés lorsque vous remonterez de forfait.",
      "confirm": "Confirmer le changement"
    }
  },
  "suspended": {
    "title": "Compte suspendu",
    "lead": "L'accès à <strong>{{brand}}</strong> est temporairement suspendu.",
    "reason": "Vos données sont toujours conservées et rien n'a été supprimé. Écrivez-nous et nous vous aiderons à réactiver le compte.",
    "contact": "Contacter le support",
    "logout": "Se déconnecter",
    "support": "Si vous pensez que c'est une erreur, écrivez à",
    "eyebrow": "Compte",
    "visitorTitle": "Cette entreprise n'est pas disponible pour le moment",
    "visitorLead": "Nous ne pouvons pas afficher cette page pour le moment. Si vous êtes client, contactez directement l'entreprise ; si ce compte est le vôtre, connectez-vous pour le réactiver.",
    "mailSubject": "Réactiver le compte de {{brand}}"
  },
  "errors": {
    "generic": "Une erreur est survenue",
    "network": "Pas de connexion au serveur",
    "notFound": "Ressource introuvable",
    "forbidden": "Vous n'avez pas les droits pour cette action",
    "validation": "Vérifiez les champs en surbrillance",
    "loadAppointments": "Erreur lors du chargement des rendez-vous",
    "loadPatients": "Erreur lors du chargement des clients",
    "readonlyRole": "Votre utilisateur est en lecture seule : il ne peut pas effectuer de modifications."
  },
  "locale": {
    "es": "Español",
    "en": "English",
    "fr": "Français",
    "pt": "Português",
    "it": "Italiano",
    "de": "Deutsch",
    "ru": "Русский",
    "zh": "中文",
    "ko": "한국어",
    "ja": "日本語"
  },
  "config": {
    "tabs": {
      "clinic": "Informations de l'entreprise",
      "backup": "Sauvegarde"
    },
    "clinic": {
      "title": "Informations de l'entreprise",
      "name": "Nom de l'entreprise",
      "phone": "Téléphone",
      "email": "Email",
      "emailInvalid": "Email invalide",
      "address": "Adresse",
      "saving": "Enregistrement...",
      "eyebrow": "Entreprise",
      "emailPlaceholder": "contact@entreprise.com",
      "addressPlaceholder": "123 Rue Principale, Ville",
      "contactHint": "Ces informations s'affichent sur votre page de réservation et servent d'adresse de réponse dans les e-mails envoyés à vos clients.",
      "nameHint": "C'est le nom que vos clients voient sur la page de réservation et dans les e-mails.",
      "phoneInvalid": "Utilisez uniquement des chiffres, des espaces et les symboles + - ( )"
    },
    "backup": {
      "title": "Gestion des sauvegardes",
      "subtitle": "Gérez les sauvegardes de la base de données",
      "create": "Créer une sauvegarde",
      "creating": "Création...",
      "stats": {
        "total": "Total des sauvegardes",
        "last": "Dernière sauvegarde",
        "size": "Espace utilisé",
        "next": "Prochaine automatique"
      },
      "autoConfig": "Configuration automatique",
      "daily": "Sauvegarde quotidienne",
      "dailyTime": "Tous les jours à 2h00",
      "weekly": "Sauvegarde hebdomadaire",
      "weeklyTime": "Dimanches à 3h00",
      "active": "Actif",
      "byDate": "Sauvegardes par date",
      "viewList": "Vue liste",
      "viewDate": "Vue date",
      "refresh": "Actualiser",
      "loading": "Chargement des sauvegardes...",
      "empty": "Aucune sauvegarde disponible",
      "emptyHint": "Créez votre première sauvegarde avec le bouton ci-dessus",
      "current": "Actuel",
      "download": "Télécharger",
      "restore": "Restaurer",
      "delete": "Supprimer",
      "cols": {
        "date": "Date",
        "name": "Nom",
        "size": "Taille",
        "type": "Type",
        "actions": "Actions"
      },
      "confirmDelete": {
        "title": "Supprimer la sauvegarde",
        "message": "Êtes-vous sûr de vouloir supprimer cette sauvegarde ?",
        "details": "Cette action est irréversible.",
        "itemLabel": "Date"
      },
      "confirmRestore": {
        "title": "Restaurer la sauvegarde",
        "message": "Êtes-vous sûr de vouloir restaurer cette sauvegarde ?",
        "details": "Cette action remplacera toutes les données actuelles par celles de la sauvegarde. Les données actuelles seront perdues.",
        "itemLabel": "Date de sauvegarde"
      },
      "eyebrow": "Données",
      "types": {
        "daily": "Quotidienne",
        "weekly": "Hebdomadaire",
        "manual": "Manuelle",
        "unknown": "Inconnu"
      }
    },
    "loading": "Chargement de la configuration...",
    "toasts": {
      "loadError": "Erreur lors du chargement de la configuration",
      "clinicUpdateError": "Impossible d'enregistrer les coordonnées. Vérifiez le téléphone, l'e-mail et l'adresse.",
      "backupsLoadError": "Erreur lors du chargement des sauvegardes",
      "backupCreated": "Sauvegarde créée avec succès",
      "backupCreateError": "Erreur lors de la création de la sauvegarde",
      "backupsRefreshed": "Liste des sauvegardes actualisée",
      "backupRestored": "Sauvegarde restaurée avec succès",
      "backupRestoreError": "Erreur lors de la restauration de la sauvegarde",
      "backupDeleted": "Sauvegarde supprimée avec succès",
      "backupDeleteError": "Erreur lors de la suppression de la sauvegarde",
      "downloadStarted": "Téléchargement démarré",
      "backupDownloadError": "Erreur lors du téléchargement de la sauvegarde",
      "invalidCountry": "Le pays doit être un code ISO à 2 lettres (par exemple FR, BE ou CH).",
      "backupRestoreRolledBack": "Impossible de restaurer la sauvegarde. Vos données précédentes ont été récupérées automatiquement.",
      "backupRestorePartial": "La restauration a échoué en cours de route et vos données n'ont pas pu être récupérées automatiquement. Restaurez la sauvegarde « pre-restore » la plus récente pour revenir à l'état précédent.",
      "backupRestoreKeyMissing": "Impossible de restaurer : la sauvegarde est chiffrée et le serveur n'a pas de clé de chiffrement valide configurée. Aucune donnée n'a été modifiée.",
      "backupRestoreDecryptFailed": "Impossible de restaurer : la sauvegarde n'a pas pu être déchiffrée (elle a été chiffrée avec une autre clé ou elle est endommagée). Aucune donnée n'a été modifiée.",
      "backupDownloadKeyMissing": "Impossible de télécharger : la sauvegarde est chiffrée et le serveur n'a pas de clé de chiffrement valide configurée.",
      "backupDownloadDecryptFailed": "Impossible de télécharger : la sauvegarde n'a pas pu être déchiffrée (elle a été chiffrée avec une autre clé ou elle est endommagée)."
    },
    "readOnly": "Seul le propriétaire ou un administrateur peut modifier ces paramètres.",
    "unsaved": {
      "message": "Vous avez des modifications non enregistrées",
      "discard": "Ignorer",
      "leaveConfirm": "Vous avez des modifications non enregistrées dans les Paramètres. Quitter et les abandonner ?"
    }
  },
  "patients": {
    "deleteModal": {
      "itemLabel": "Client",
      "title": "Supprimer le client et effacer ses données",
      "message": "Voulez-vous vraiment supprimer ce client ?",
      "confirm": "Supprimer",
      "details": "Ses données personnelles (nom, coordonnées, adresse, pièce d'identité, date de naissance, notes et étiquettes) seront anonymisées de manière irréversible, ses fichiers joints seront supprimés et ses rendez-vous à venir seront annulés (les séances de pack réservées sont restituées). L'historique des rendez-vous passés et les packs sont conservés sans données personnelles. Cette action est irréversible."
    },
    "editInfo": "Modifier les informations du client",
    "addSessions": "Ajouter un pack",
    "subtitle": "Gérez les informations de vos clients",
    "cols": {
      "patient": "Client",
      "actions": "Actions",
      "delete": "Supprimer",
      "edit": "Modifier"
    },
    "smart": {
      "estado": "Statut",
      "proxima": "Prochain",
      "visitas": "visites",
      "bono": "pack",
      "valor": "valeur",
      "sinBono": "aucun pack",
      "sinVisitas": "aucune visite",
      "sinProxima": "aucun rendez-vous à venir",
      "ultimaVisita": "dern. visite"
    },
    "perPage": "par page",
    "age": "{{years}} ans",
    "show": "Afficher",
    "clearSearch": "Effacer la recherche",
    "total": "clients",
    "bonoForm": {
      "title": "Nouveau pack de séances",
      "minutes": "Minutes par séance",
      "quantity": "Nombre de séances",
      "totalPrice": "Prix total",
      "perSession": "Prix par séance",
      "paid": "Payé",
      "add": "Créer le pack",
      "cancel": "Annuler",
      "created": "Pack créé avec succès"
    },
    "title": "Gestion des clients",
    "form": {
      "edit": "Modifier le client",
      "new": "Nouveau client",
      "save": "Enregistrer",
      "lastName": "Nom",
      "email": "E-mail",
      "phone": "Téléphone",
      "cp": "Code postal",
      "whatsappHint": "Préférence du client. Rien n'est envoyé automatiquement : depuis l'agenda, vous pouvez lui envoyer le rappel par WhatsApp en un clic.",
      "whatsappLabel": "Accepte les rappels par WhatsApp",
      "firstName": "Prénom",
      "province": "Province / Région",
      "familyContact": "Autre contact",
      "update": "Mettre à jour",
      "dni": "Pièce d'identité",
      "city": "Ville",
      "address": "Adresse",
      "optional": "(optionnel)",
      "birthDate": "Date de naissance",
      "phone2": "Téléphone 2",
      "notes": "Notes",
      "firstNamePlaceholder": "Saisissez le prénom",
      "lastNamePlaceholder": "Entrez le nom de famille",
      "dniPlaceholder": "Carte d'identité, passeport ou autre document",
      "phonePlaceholder": "Avec l'indicatif international s'il s'agit d'un numéro étranger",
      "phone2Placeholder": "Téléphone secondaire",
      "emailPlaceholder": "courriel@exemple.com",
      "familyContactPlaceholder": "Nom et téléphone d'une autre personne à contacter",
      "addressPlaceholder": "Adresse complète",
      "cpPlaceholder": "Code postal",
      "cityPlaceholder": "Ville ou commune",
      "provincePlaceholder": "Département, État ou région",
      "notesPlaceholder": "Notes supplémentaires sur le client...",
      "contactHint": "(téléphone ou e-mail : au moins l'un des deux)",
      "errors": {
        "firstNameRequired": "Le prénom est obligatoire",
        "contactRequired": "Indiquez au moins un téléphone ou un e-mail",
        "phoneInvalid": "Numéro de téléphone non valide : utilisez entre 4 et 15 chiffres ; vous pouvez inclure +, des espaces, des parenthèses et des tirets",
        "emailInvalid": "L'adresse e-mail n'est pas valide"
      }
    },
    "deletePatient": "Supprimer le client",
    "newBtn": "Nouveau client",
    "viewDetails": "Voir les détails du client",
    "showing": "Affichage de {{from}} à {{to}} sur {{total}} clients",
    "addFirst": "Ajouter le premier client",
    "cancelBtn": "Annuler",
    "empty": {
      "noResults": "Aucun client trouvé",
      "noPatients": "Aucun client enregistré",
      "hint": "Commencez par ajouter votre premier client pour gérer ses rendez-vous",
      "hintSearch": "Essayez d'autres termes de recherche"
    },
    "searchPlaceholder": "Rechercher par nom, prénom ou téléphone...",
    "import": {
      "button": "Importer",
      "title": "Importer des clients depuis un CSV",
      "step1": "1. Fichier",
      "step2": "2. Colonnes",
      "step3": "3. Importer",
      "chooseFile": "Sélectionnez un fichier .csv",
      "fileHint": "CSV avec ligne d'en-tête ; séparateur virgule ou point-virgule ; champs entre guillemets pris en charge.",
      "parseError": "Impossible de lire le fichier. Vérifiez qu'il s'agit d'un CSV valide.",
      "detected": "{{rows}} lignes et {{cols}} colonnes détectées.",
      "mapTitle": "Associez chaque colonne à un champ",
      "ignore": "— Ignorer —",
      "preview": "Aperçu (5 premières lignes)",
      "needFirstName": "Vous devez associer une colonne au champ Prénom.",
      "fields": {
        "firstName": "Prénom",
        "lastName": "Nom",
        "phone": "Téléphone",
        "email": "E-mail",
        "dni": "Pièce d'identité",
        "birthdate": "Date de naissance",
        "notes": "Notes"
      },
      "importBtn_one": "Importer {{count}} client",
      "importBtn_few": "Importer {{count}} clients",
      "importBtn_many": "Importer {{count}} clients",
      "importBtn_other": "Importer {{count}} clients",
      "importing": "Importation…",
      "progress": "{{done}} lignes sur {{total}} envoyées",
      "summaryTitle": "Importation terminée",
      "inserted": "Insérés : {{count}}",
      "skipped": "Ignorés : {{count}}",
      "rowCol": "Ligne",
      "reasonCol": "Motif",
      "error": "L'importation a échoué. Veuillez réessayer.",
      "reasons": {
        "invalid_row": "Ligne non valide",
        "missing_firstName": "Prénom manquant",
        "invalid_email": "E-mail non valide",
        "invalid_birthdate": "Date de naissance non valide",
        "duplicate": "Doublon (un client avec cet e-mail ou ce téléphone existe déjà)"
      },
      "datesDropped": "{{count}} dates de naissance n'ont pas été reconnues : ces clients ont été importés sans date."
    },
    "eyebrow": "Répertoire",
    "toasts": {
      "createFirst": "Créez d'abord le client, puis assignez-lui le rendez-vous",
      "created": "Client créé avec succès",
      "createError": "Erreur lors de la création du client",
      "updated": "Client mis à jour avec succès",
      "updateError": "Erreur lors de la mise à jour du client",
      "deleted": "Client supprimé : données anonymisées et rendez-vous à venir annulés",
      "deleteError": "Erreur lors de la suppression du client",
      "loadEditError": "Erreur lors du chargement du client à modifier",
      "loadOneError": "Erreur lors du chargement des données du client",
      "bonoCreateError": "Erreur lors de la création du pack"
    },
    "status": {
      "nuevo": "Nouveau",
      "activo": "Actif",
      "fiel": "Fidèle",
      "riesgo": "À risque"
    },
    "export": {
      "button": "Exporter",
      "createdAt": "Date d'inscription",
      "filename": "clients",
      "done": "{{count}} clients exportés",
      "error": "Impossible d'exporter la liste des clients. Réessayez."
    }
  },
  "patientDetail": {
    "loading": "Chargement...",
    "loadingDetails": "Chargement des détails du client...",
    "age": "{{years}} ans",
    "back": "Retour",
    "edit": "Modifier",
    "tags": {
      "placeholder": "Nouvelle étiquette",
      "empty": "Aucune étiquette",
      "removeLabel": "Supprimer l'étiquette"
    },
    "stats": {
      "nextVisit": "Prochaine visite",
      "noShows": "Absences",
      "totalAppointments": "Total rendez-vous",
      "completed": "Terminés",
      "lastVisit": "Dernière visite",
      "totalSpent": "Dépense totale",
      "cancelledSub_one": "{{count}} annulé",
      "cancelledSub_few": "{{count}} annulés",
      "cancelledSub_many": "{{count}} annulés",
      "cancelledSub_other": "{{count}} annulés"
    },
    "info": {
      "phone2": "TÉLÉPHONE 2",
      "familyContact": "AUTRE CONTACT",
      "phone": "TÉLÉPHONE",
      "city": "VILLE",
      "address": "ADRESSE",
      "province": "DÉPARTEMENT / RÉGION",
      "age": "ÂGE",
      "email": "E-MAIL",
      "birthDate": "DATE DE NAISSANCE",
      "fullName": "NOM COMPLET",
      "title": "Informations personnelles",
      "dni": "PIÈCE D'IDENTITÉ",
      "cp": "CODE POSTAL",
      "notes": "NOTES"
    },
    "sessions": {
      "used": "Séances utilisées",
      "addTitle": "Ajouter un pack",
      "active": "Séances disponibles",
      "title": "Séances disponibles",
      "empty": "Aucun pack actif",
      "total": "Séances au total"
    },
    "system": {
      "updated": "Dernière mise à jour :",
      "created": "Enregistré le :"
    },
    "tabs": {
      "history": "Historique des rendez-vous",
      "files": "Fichiers",
      "credits": "Séances"
    },
    "history": {
      "loading": "Chargement...",
      "colNotes": "Notes",
      "loadingText": "Chargement de l'historique des rendez-vous...",
      "colDate": "Date",
      "empty": "Aucun rendez-vous enregistré pour ce client.",
      "colTime": "Heure",
      "colDuration": "Durée",
      "colService": "Service",
      "colPrice": "Montant"
    },
    "files": {
      "loadingFiles": "Chargement des fichiers...",
      "allowedTypes": "Fichiers autorisés : JPG, PNG, GIF, WEBP, PDF, DOC, DOCX, XLS, XLSX, TXT, CSV (max. 4 Mo)",
      "empty": "Aucun fichier joint",
      "previewClickTitle": "Cliquer pour agrandir",
      "descriptionPlaceholder": "Décrivez le contenu du fichier...",
      "uploading": "Envoi en cours...",
      "emptyHint": "Ajoutez le premier fichier via le formulaire ci-dessus",
      "selectLabel": "Sélectionner un fichier",
      "uploadTitle": "Téléverser un fichier",
      "downloadTitle": "Télécharger le fichier",
      "descriptionLabel": "Description (facultatif)",
      "upload": "Téléverser",
      "deleteTitle": "Supprimer le fichier",
      "categoryLabel": "Catégorie",
      "listTitle": "Fichiers du client",
      "categories": {
        "document": "Document",
        "photo": "Photo / image",
        "consent": "Consentement",
        "invoice": "Facture / devis",
        "report": "Rapport",
        "other": "Autre"
      }
    },
    "packs": {
      "empty": "Ce client n'a aucun pack",
      "title": "Packs de séances",
      "addFirst": "Ajouter le premier pack",
      "addBtn": "Ajouter un pack"
    },
    "notFound": {
      "title": "Client introuvable",
      "message": "Le client que vous recherchez n'existe pas ou a été supprimé",
      "back": "Retour aux clients"
    },
    "deleteFileModal": {
      "confirm": "Supprimer",
      "title": "Supprimer le fichier",
      "itemLabel": "Fichier",
      "details": "Cette action est irréversible.",
      "message": "Voulez-vous vraiment supprimer ce fichier ?"
    },
    "preview": {
      "closeTitle": "Fermer",
      "download": "Télécharger le fichier",
      "downloadTitle": "Télécharger",
      "noPreview": "Aperçu non disponible pour ce type de fichier",
      "loading": "Chargement de l'aperçu…",
      "loadError": "Impossible de charger l'aperçu. Vous pouvez télécharger le fichier."
    },
    "markPaidModal": {
      "title": "Marquer comme payé",
      "message": "Confirmez-vous que ce pack a bien été payé ?",
      "confirm": "Marquer payé"
    },
    "eyebrow": "Fiche client",
    "toasts": {
      "maxTags": "Maximum 20 étiquettes par client.",
      "tagsSaveError": "Impossible d'enregistrer les étiquettes.",
      "filesLoadError": "Erreur lors du chargement des fichiers",
      "fileTooLarge": "Fichier trop volumineux (4 Mo max.)",
      "fileTypeNotAllowed": "Type de fichier non autorisé",
      "fileUploaded": "Fichier téléversé avec succès",
      "fileUploadError": "Erreur lors du téléversement du fichier",
      "fileDownloadError": "Erreur lors du téléchargement du fichier",
      "fileDeleted": "Fichier supprimé avec succès",
      "fileDeleteError": "Erreur lors de la suppression du fichier"
    },
    "loadError": {
      "title": "Impossible de charger la fiche",
      "message": "La connexion ou le serveur a échoué. Le client n'a pas été supprimé : réessayez.",
      "retry": "Réessayer"
    },
    "quick": {
      "label": "Actions rapides",
      "call": "Appeler",
      "whatsapp": "WhatsApp",
      "email": "E-mail",
      "newAppointmentLabel": "Nouveau rendez-vous pour {{name}}",
      "callLabel": "Appeler {{name}}",
      "whatsappLabel": "Écrire à {{name}} sur WhatsApp",
      "emailLabel": "Envoyer un e-mail à {{name}}"
    }
  },
  "bonos": {
    "eyebrow": "Séances prépayées",
    "title": "Packs de séances",
    "subtitle": "Gérez les packs (séances prépayées) de vos clients.",
    "info": "Un pack regroupe plusieurs séances de même durée pour un client, à un prix total. Il s'utilise quand vous créez son rendez-vous dans l'agenda : choisissez-le dans « Utiliser le pack » et une séance est décomptée. Si le rendez-vous est annulé ou supprimé, la séance revient dans le pack. Les réservations en ligne ne décomptent aucune séance du pack.",
    "new": "Nouveau pack",
    "formTitle": "Nouveau pack de séances",
    "patient": "Client",
    "minutes": "Minutes par séance",
    "quantity": "Nombre de séances",
    "totalPrice": "Prix total",
    "pricePerSession": "Prix par séance",
    "perSessionShort": "/séance",
    "paid": "Payé",
    "save": "Créer le pack",
    "saving": "Enregistrement…",
    "cancel": "Annuler",
    "loading": "Chargement…",
    "empty": "Aucun pack pour le moment. Créez le premier.",
    "minSessions_one": "{{min}} min · {{count}} séance",
    "minSessions_few": "{{min}} min · {{count}} séances",
    "minSessions_many": "{{min}} min · {{count}} séances",
    "minSessions_other": "{{min}} min · {{count}} séances",
    "paidChip": "Payé",
    "pendingChip": "En attente",
    "togglePaidTitle": "Changer le statut de paiement",
    "delete": "Supprimer",
    "created": "Pack créé avec succès",
    "deleted": "Pack supprimé",
    "markedPaid": "Pack marqué comme payé",
    "markedPending": "Pack marqué comme en attente de paiement",
    "inUse": "Suppression impossible : des séances de ce pack ont déjà été utilisées.",
    "loadError": "Erreur lors du chargement des packs",
    "createError": "Erreur lors de la création du pack",
    "updateError": "Erreur lors de la mise à jour du pack",
    "deleteError": "Erreur lors de la suppression du pack",
    "deleteModal": {
      "title": "Supprimer le pack",
      "message": "Voulez-vous vraiment supprimer ce pack ?",
      "details": "Cette action est irréversible."
    },
    "itemLabel": "Pack",
    "changePatient": "Changer",
    "filters": {
      "label": "Filtrer les packs",
      "all": "Tous",
      "unpaid": "En attente de paiement",
      "active": "Avec séances restantes",
      "spent": "Épuisés",
      "noMatches": "Aucun pack ne correspond au filtre ou à la recherche."
    },
    "unpaidTotal": "Reste à encaisser :",
    "createdOn": "Créé le {{date}}"
  },
  "patientPortal": {
    "loading": "Chargement…",
    "title": "Votre rendez-vous",
    "when": "Date et heure",
    "statusLabel": "Statut",
    "confirmReschedule": "Confirmer le changement",
    "cancel": "Annuler le rendez-vous",
    "notFound": "Rendez-vous introuvable ou lien invalide",
    "cancelConfirm": "Voulez-vous vraiment annuler votre rendez-vous ?",
    "cancelled": "Votre rendez-vous a été annulé.",
    "rescheduled": "Votre rendez-vous a été reprogrammé.",
    "actionError": "L'action n'a pas pu être effectuée. Veuillez réessayer.",
    "cancelTitle": "Annuler le rendez-vous",
    "policyWindow": "Vous pouvez annuler ou reporter jusqu'à {{hours}}h avant le rendez-vous.",
    "policyAnytime": "Vous pouvez annuler ou reporter en ligne jusqu'à l'heure du rendez-vous.",
    "policyPast": "L'annulation ou le report en ligne n'est plus possible : le rendez-vous a lieu dans moins de {{hours}}h. Contactez l'entreprise.",
    "policyNone": "Cette entreprise n'autorise pas l'annulation ou le report en ligne. Contactez-la directement.",
    "openMap": "Voir sur la carte",
    "pendingNote": "{{business}} doit encore confirmer ce rendez-vous. Nous vous préviendrons dès qu'il sera accepté.",
    "reschedule": "Changer la date ou l'heure",
    "rescheduleTitle": "Choisissez le nouveau jour et l'heure",
    "pickDate": "Jour",
    "newTime": "Nouveau rendez-vous : {{when}}",
    "keepCurrent": "Conserver le rendez-vous actuel",
    "bookAgain": "Réserver un autre rendez-vous",
    "loadError": "Impossible de charger le rendez-vous. Réessayez dans quelques minutes.",
    "errors": {
      "terminalStatus": "Ce rendez-vous ne peut plus être modifié.",
      "cancelDisabled": "Cette entreprise n'autorise pas l'annulation en ligne. Contactez-la directement.",
      "rescheduleDisabled": "Cette entreprise n'autorise pas la modification du rendez-vous en ligne. Contactez-la directement.",
      "cancelTooLate": "L'annulation n'est possible qu'au moins {{hours}} h à l'avance.",
      "rescheduleTooLate": "Le rendez-vous ne peut être modifié qu'au moins {{hours}} h à l'avance."
    }
  },
  "signup": {
    "title": "Créez votre entreprise",
    "subtitle": "Essai gratuit de 14 jours, sans carte.",
    "clinicName": "Nom de l'entreprise",
    "email": "E-mail",
    "password": "Mot de passe",
    "submit": "Créer un compte",
    "creating": "Création…",
    "successTitle": "Compte créé !",
    "successMsg": "Votre entreprise est prête. Vous pouvez maintenant vous connecter.",
    "goToLogin": "Aller à la connexion",
    "haveAccount": "Vous avez déjà un compte ?",
    "login": "Se connecter",
    "disabled": "L'inscription n'est pas disponible pour le moment.",
    "genericError": "Impossible de créer le compte. Réessayez.",
    "captchaHint": "Complétez la vérification anti-robots pour continuer.",
    "sector": "Quelle est l'activité de votre entreprise ?",
    "sectorPlaceholder": "Choisissez un secteur",
    "sectors": {
      "peluquerias": "Salon de coiffure ou barbier",
      "estetica": "Institut de beauté",
      "fisioterapeutas": "Kinésithérapie",
      "gimnasios": "Salle de sport ou coach sportif",
      "talleres": "Garage automobile",
      "consultores": "Conseil ou coaching",
      "dentales": "Cabinet dentaire",
      "psicologos": "Psychologie",
      "veterinarios": "Clinique vétérinaire",
      "autoescuelas": "Auto-école",
      "nutricionistas": "Nutrition et diététique",
      "tatuadores": "Studio de tatouage ou de piercing",
      "peluqueria-canina": "Toilettage pour animaux",
      "yoga-pilates": "Yoga ou Pilates",
      "masajes-spa": "Massages ou spa",
      "podologos": "Podologie",
      "otro": "Autre type d'entreprise"
    },
    "repeatPassword": "Confirmez le mot de passe",
    "passwordsMismatch": "Les mots de passe ne correspondent pas",
    "captchaRequired": "Effectuez la vérification pour continuer",
    "showPassword": "Afficher le mot de passe",
    "hidePassword": "Masquer le mot de passe",
    "acceptTerms": "J'ai lu et j'accepte les {{terms}} (y compris le contrat de sous-traitance des données de mes clients) et la {{privacy}}.",
    "termsLink": "Conditions générales",
    "privacyLink": "Politique de confidentialité",
    "gdprNotice": "Responsable du traitement : {{controller}}. Finalité : créer et gérer votre compte, vous fournir le service, savoir par quel canal vous nous avez connus et, sauf opposition de votre part, vous envoyer des conseils et des offres sur BookingForNow. Base juridique : exécution du contrat et intérêt légitime. Destinataires : les prestataires qui hébergent le service, en tant que sous-traitants ; nous ne cédons pas vos données à des tiers. Droits : accès, rectification, effacement et les autres droits prévus par le RGPD, en écrivant à {{email}}. Plus d'informations dans la {{privacy}}.",
    "regionNote": "Votre compte sera créé avec : {{region}}. Vous pourrez le modifier dans les Paramètres.",
    "errors": {
      "rateLimited": "Trop de tentatives d'affilée. Patientez quelques minutes et réessayez.",
      "captchaFailed": "Nous n'avons pas pu vérifier que vous êtes une personne. Recommencez la vérification et réessayez.",
      "termsRequired": "Vous devez accepter les Conditions générales et la Politique de confidentialité pour créer le compte.",
      "missingFields": "Renseignez le nom de l'entreprise, l'e-mail et le mot de passe.",
      "emailRegistered": "Un compte existe déjà avec cet e-mail."
    },
    "ownerName": "Votre nom",
    "ownerNameHint": "Nous l'utiliserons pour vous saluer et comme premier professionnel de votre agenda.",
    "marketingNotice": "Pendant votre essai et à son terme, nous vous enverrons quelques e-mails de conseils et d'offres de BookingForNow. Si vous n'en voulez pas, cochez cette case ; vous pourrez aussi vous désabonner gratuitement, en un clic, depuis n'importe lequel d'entre eux.",
    "marketingOptOut": "Je ne souhaite pas recevoir de conseils ni d'offres de BookingForNow par e-mail",
    "bookingPageReady": "Votre page de réservation est déjà créée et accepte des réservations dès aujourd'hui. Avant de la partager, vérifiez vos horaires et les services d'exemple :",
    "metaTitle": "Créez votre compte gratuit — BookingForNow",
    "metaDescription": "Créez votre compte gratuit sur BookingForNow : agenda, réservations en ligne 24h/24, packs de séances et rappels automatiques. 14 jours d'essai, sans carte bancaire."
  },
  "login": {
    "metaDescription": "Connectez-vous à votre compte BookingForNow pour gérer l'agenda, les réservations en ligne, les clients et les packs de séances de votre établissement.",
    "fillAllFields": "Veuillez remplir tous les champs",
    "loginError": "Erreur de connexion. Réessayez.",
    "enterEmail": "Veuillez saisir votre e-mail",
    "resetError": "Erreur lors de la demande de réinitialisation du mot de passe"
  },
  "landing": {
    "nav": {
      "login": "Se connecter",
      "signup": "Créer un compte",
      "goToApp": "Aller à mon agenda"
    },
    "hero": {
      "subtitle": "Agenda, réservation en ligne, packs de séances et rappels sur une seule plateforme. Consacrez votre temps à vos clients, pas à la paperasse.",
      "ctaPrimary": "Essai gratuit de 14 jours",
      "note": "Sans carte bancaire · Annulez à tout moment",
      "demo": "Voir la démo",
      "titlePre": "Vous faites votre métier.",
      "titleAccentLead": "Nous nous occupons de la",
      "titleAccent": "gestion",
      "stats": {
        "supportValue": "24/7",
        "supportLabel": "réservation en ligne",
        "languagesValue": "10",
        "languagesLabel": "langues",
        "priceValue": "0€",
        "priceLabel": "pour commencer",
        "commissionValue": "0 %",
        "commissionLabel": "de commission par réservation"
      },
      "badge": "Sans commission · 14 jours gratuits · Sans carte bancaire",
      "heading": "Logiciel de prise de rendez-vous et de réservation en ligne pour les professionnels"
    },
    "features": {
      "title": "Logiciel d'agenda et de réservation en ligne : ce qu'il inclut",
      "agenda": {
        "title": "Agenda multi-professionnels",
        "text": "Organisez les rendez-vous de toute votre équipe avec un agenda clair et sans chevauchements."
      },
      "booking": {
        "title": "Réservation en ligne 24h/24",
        "text": "Vos clients réservent eux-mêmes depuis votre page publique, à toute heure et depuis n'importe quel appareil."
      },
      "packs": {
        "title": "Packs de séances par client",
        "text": "Vendez à chaque client son pack de séances : choisissez-le quand vous créez son rendez-vous dans l'agenda et une séance est décomptée ; si le rendez-vous est annulé, elle revient dans le pack. Sa fiche indique combien il lui en reste."
      },
      "reminders": {
        "title": "Rappels automatiques",
        "text": "Réduisez les absences grâce aux rappels automatiques par e-mail. Inclus dans les forfaits Starter et Pro."
      },
      "eyebrow": "Fonctionnalités",
      "subtitle": "De la gestion manuelle au pilote automatique. Le tout sur une seule plateforme."
    },
    "howItWorks": {
      "title": "Votre page de réservation en ligne, opérationnelle en moins de 5 minutes",
      "eyebrow": "Comment ça marche",
      "step1": {
        "title": "Créez votre compte",
        "text": "Inscrivez-vous gratuitement, sans carte bancaire. En quelques minutes, votre espace de travail est prêt."
      },
      "step2": {
        "title": "Configurez vos services",
        "text": "Ajoutez vos services, tarifs, horaires et professionnels. L'assistant vous guide pas à pas."
      },
      "step3": {
        "title": "Partagez et lancez-vous",
        "text": "Partagez votre lien sur Instagram, WhatsApp ou votre site web. Vos clients réservent eux-mêmes, 24h/24, 7j/7."
      }
    },
    "pricing": {
      "title": "Tarifs du logiciel de réservation",
      "subtitle": "Commencez gratuitement et changez de forfait quand votre entreprise grandit.",
      "free": "Gratuit",
      "yearlyNote": "Avec le forfait annuel, vous ne payez que 10 mois : 2 mois offerts.",
      "cta": "Commencer",
      "eyebrow": "Tarifs",
      "annualNote": "Facturation annuelle : {{total}} par an · 2 mois offerts",
      "currencyNote": "Prix en euros (EUR).",
      "detailsLink": "Voir les tarifs et les limites en détail (en anglais)"
    },
    "finalCta": {
      "title": "Prêt à commencer ?",
      "text": "Créez votre compte en moins de 2 minutes et configurez votre entreprise dès aujourd'hui.",
      "eyebrow": "Qu'attendez-vous ?"
    },
    "footer": {
      "tagline": "BookingForNow — gestion complète des rendez-vous pour votre entreprise.",
      "sectorsLabel": "Solutions par secteur",
      "sectors": {
        "hairdressers": "Logiciel de rendez-vous pour salons de coiffure",
        "beauty": "Logiciel de réservation pour instituts de beauté",
        "physio": "Logiciel de rendez-vous pour kinésithérapeutes",
        "gyms": "Logiciel de réservation pour salles de sport",
        "workshops": "Logiciel de rendez-vous pour garages automobiles",
        "consultants": "Logiciel de rendez-vous pour consultants",
        "allSectors": "Tous les secteurs"
      },
      "blog": "Blog : gestion des rendez-vous et réservations",
      "tools": "Outils gratuits (en anglais)",
      "pagesInEnglish": "(pages en anglais)",
      "freeScheduling": "Logiciel de prise de rendez-vous gratuit (en anglais)",
      "navLabel": "Navigation du pied de page",
      "support": "Assistance",
      "legalLabel": "Informations légales",
      "legal": {
        "notice": "Mentions légales",
        "privacy": "Confidentialité",
        "terms": "Conditions",
        "cookies": "Cookies",
        "contact": "Contact"
      },
      "comparisons": {
        "booksy": "Alternative à Booksy",
        "treatwell": "Alternative à Treatwell",
        "fresha": "Alternative à Fresha"
      },
      "calculator": "Calculateur de commissions sur les réservations",
      "referral": "Programme de recommandation",
      "inSpanish": "(en espagnol)"
    },
    "preview": {
      "title": "Tableau du jour",
      "kpiAppointments": "Rendez-vous",
      "kpiOccupancy": "Occupation",
      "kpiRevenue": "Revenus",
      "chipPack": "pack",
      "notifTitle": "Nouvelle réservation en ligne",
      "row1Name": "Lucía M.",
      "row1Service": "Coupe de cheveux",
      "row2Name": "Carlos R.",
      "row2Service": "Massage sportif",
      "row3Name": "Ana G.",
      "row3Service": "Manucure",
      "live": "En direct",
      "chipConfirmed": "Confirmé",
      "chipPending": "En attente",
      "chipNew": "Nouveau",
      "row4Name": "Michel S.",
      "row4Service": "Coaching sportif personnel",
      "notifSub": "Marthe L. · Aujourd'hui 16:00",
      "badge": "Prix fixe · Sans commission",
      "sampleData": "Données d'exemple"
    },
    "social": {
      "sectors": {
        "hair": "Salons de coiffure",
        "yoga": "Studios de yoga et pilates",
        "gyms": "Salles de sport",
        "dental": "Cabinets dentaires",
        "spa": "Spas et massages",
        "physio": "Kinésithérapeutes",
        "garages": "Garages",
        "vets": "Vétérinaires"
      },
      "label": "Conçu pour les entreprises qui travaillent sur rendez-vous"
    },
    "why": {
      "eyebrow": "Pourquoi BookingForNow",
      "title": "Un système de réservation clair et sans petites lignes",
      "flat": {
        "title": "Prix fixe, 0 % de commission",
        "text": "Vous payez votre forfait, un point c'est tout. Contrairement à certaines places de marché, nous ne prélevons jamais de pourcentage sur vos réservations ni sur vos nouveaux clients."
      },
      "link": {
        "title": "Votre propre lien de réservation",
        "text": "Un lien à vous, pas celui d'une place de marché : publiez-le sur Instagram, Google Maps ou WhatsApp et vos clients réservent eux-mêmes, sans rien installer."
      },
      "languages": {
        "title": "10 langues et tous les fuseaux horaires",
        "text": "Votre agenda et votre page de réservation parlent la langue de vos clients : espagnol, anglais, français, portugais, italien, allemand, russe, chinois, coréen et japonais."
      },
      "privacy": {
        "title": "Vos données vous appartiennent",
        "text": "Nous respectons le RGPD, nous ne vendons ni ne cédons vos données et nous n'affichons aucune publicité à vos clients."
      }
    },
    "faq": {
      "eyebrow": "Avant de commencer",
      "title": "Questions fréquentes sur le logiciel de gestion des rendez-vous",
      "items": {
        "price": {
          "q": "Combien coûte BookingForNow ?",
          "a": "Il y a trois forfaits à tarif fixe, avec {{commission}} % de commission sur les réservations : Free à {{free}} ({{practitioners}} professionnel, jusqu'à {{clients}} clients, sans rappels automatiques), Starter à {{starter}}/mois et Pro à {{pro}}/mois. Le tarif annuel coûte autant que {{paidMonths}} mois, vous en économisez donc {{freeMonths}}. Les montants sont en euros et les taxes applicables s'y ajoutent. Chaque nouveau compte commence par un essai de {{trialDays}} jours, sans carte bancaire."
        },
        "free": {
          "q": "Que comprend le forfait gratuit et quelles sont ses limites ?",
          "a": "Le forfait Free coûte {{free}}, n'a pas de limite de durée et ne demande pas de carte bancaire. Il comprend l'agenda, les packs de séances et votre page de réservation en ligne pour {{practitioners}} professionnel, jusqu'à {{clients}} clients et {{locations}} site. Il ne comprend pas les rappels automatiques, disponibles à partir de Starter. Ce que voient vos clients (page de réservation, portail des rendez-vous et e-mails) porte une mention discrète de BookingForNow ; elle disparaît avec Starter ou Pro."
        },
        "commission": {
          "q": "Prélevez-vous une commission par réservation ?",
          "a": "Non, sur aucun forfait : {{commission}} % sur Free aussi. Vous payez le tarif fixe de votre forfait ({{free}} pour Free), un point c'est tout, sans plafond de réservations. BookingForNow n'encaisse pas les réservations à votre place : vos clients vous paient sur place, comme aujourd'hui, il n'y a donc ni pourcentage ni prestataire de paiement entre vous."
        },
        "reminders": {
          "q": "À partir de quel forfait les rappels automatiques sont-ils inclus ?",
          "a": "À partir de Starter. Les rappels automatiques de rendez-vous partent par e-mail, pour les clients qui laissent leur adresse, avec les forfaits Starter et Pro et pendant l'essai ; le forfait Free ne les comprend pas. Il n'y a pas de rappels par SMS ni de messages WhatsApp automatiques."
        },
        "app": {
          "q": "Faut-il installer une application ?",
          "a": "Non. BookingForNow fonctionne comme une application web sur n'importe quel téléphone ou ordinateur, sans installation ni mises à jour à suivre : vous gérez votre agenda depuis le navigateur et vos clients réservent depuis le lien de votre entreprise, sans rien télécharger."
        },
        "trialEnd": {
          "q": "Que se passe-t-il à la fin des {{trialDays}} jours d'essai ?",
          "a": "Si vous n'avez pas choisi de forfait, votre compte passe de lui-même au forfait Free et rien ne vous est facturé : l'essai ne demande pas de carte bancaire. Rien n'est supprimé. Si vous utilisiez plus de professionnels ou de sites que n'en comprend Free, les plus anciens restent actifs et les autres sont mis en pause jusqu'à ce que vous choisissiez un forfait qui les couvre. Les rappels automatiques par e-mail, réservés à Starter et Pro, cessent d'être envoyés."
        }
      }
    }
  },
  "onboarding": {
    "title": "Premiers pas",
    "progress": "{{done}} sur {{total}} terminées",
    "toggle": "Afficher ou masquer la liste",
    "dismiss": "Ignorer",
    "copyLink": "Copier le lien",
    "copied": "Lien copié dans le presse-papiers",
    "steps": {
      "services": "Configurez vos services et vos tarifs",
      "booking": "Activez la réservation en ligne",
      "bookingOn": "Votre page accepte les réservations",
      "share": "Partagez votre page de réservation",
      "firstAppointment": "Créez votre premier rendez-vous"
    },
    "stepDone": "Terminé :",
    "copyFailed": "Impossible de copier le lien. Copiez-le manuellement : {{url}}"
  },
  "settings": {
    "booking": {
      "logoUrl": "Logo de la page de réservation (URL)",
      "useCustomColor": "Utiliser une couleur personnalisée",
      "primaryColor": "Couleur principale",
      "brandingHint": "Le logo et la couleur s'appliquent à votre page publique de réservation."
    },
    "logo": {
      "title": "Logo de l'entreprise",
      "upload": "Téléverser une image",
      "change": "Changer l'image",
      "uploading": "Téléversement…",
      "format": "Formats : PNG, JPG ou WEBP. Maximum 2 Mo.",
      "uploaded": "Logo mis à jour",
      "error": "Impossible de téléverser le logo",
      "errorFormat": "Format non autorisé. Utilisez PNG, JPG ou WEBP.",
      "errorSize": "L'image dépasse la taille maximale (2 Mo)."
    }
  },
  "adminPlatform": {
    "eyebrow": "Opérateur",
    "title": "Plateforme",
    "forbidden": "Accès réservé aux administrateurs de la plateforme.",
    "kpi": {
      "clinics": "Entreprises",
      "trials": "Essais actifs",
      "mrr": "MRR estimé",
      "mrrHint": "abonnements payants uniquement",
      "mrrTitle": "Seuls les abonnements payants actifs comptent. Un forfait attribué à la main depuis ce panneau n'est pas un abonnement et ne compte pas.",
      "signupsPeriod": "Inscriptions sur la période",
      "webVisitors": "Visiteurs · site public",
      "webVisitorDaysHint": "visiteurs-jours · {{days}} derniers jours",
      "webVisitorsHint": "somme par type de page et par jour · {{days}} derniers jours",
      "onlineBookings": "Réservations en ligne",
      "appointments": "Rendez-vous créés",
      "errors5xx": "Erreurs 5xx",
      "periodHint": "{{days}} derniers jours"
    },
    "cols": {
      "clinic": "Entreprise",
      "plan": "Forfait",
      "status": "Statut",
      "signup": "Inscription",
      "origin": "Origine"
    },
    "state": {
      "active": "Actif",
      "suspended": "Suspendu"
    },
    "action": {
      "extend": "+14 jours",
      "extendTitle": "Prolonger l'essai de 14 jours",
      "suspend": "Suspendre",
      "activate": "Activer",
      "changePlan": "Changer de forfait"
    },
    "toasts": {
      "trialExtended": "Essai prolongé de 14 jours",
      "suspended": "Entreprise suspendue",
      "activated": "Entreprise activée",
      "planChanged": "Forfait changé en {{plan}}"
    },
    "subtitle": "Supervision de l'application et du trafic web",
    "refresh": "Actualiser",
    "range": {
      "label": "Période",
      "d7": "7 jours",
      "d30": "30 jours",
      "d90": "90 jours"
    },
    "tabs": {
      "overview": "Vue d'ensemble",
      "traffic": "Trafic web",
      "activity": "Activité",
      "health": "Santé",
      "tenants": "Entreprises"
    },
    "funnel": {
      "title": "Entonnoir d'acquisition",
      "subtitle": "Du visiteur à la première réservation, sur les {{days}} derniers jours",
      "ofPrevious": "{{pct}} de l'étape précédente",
      "activatedHint": "Entreprises créées sur la période avec au moins un rendez-vous",
      "visitorsHint": "Chaque visiteur compte une fois par jour, quel que soit le nombre de pages du site public qu'il voit. C'est le même chiffre que l'indicateur et que la zone « Site public ».",
      "landingVisitorsHint": "Somme des visiteurs-jours de la page d'accueil et des landings : celui qui voit les deux le même jour compte deux fois.",
      "cohortBookingsHint": "Réservations en ligne des entreprises activées sur la période. Le total de toutes les entreprises figure dans l'indicateur « Réservations en ligne ».",
      "stages": {
        "visitors": "Visiteurs-jours du site public",
        "landingVisitors": "Visiteurs-jours sur l'accueil et les landings",
        "signupVisitors": "Visiteurs de /signup",
        "signups": "Inscriptions",
        "activated": "Entreprises activées (≥1 rendez-vous)",
        "onlineBookings": "Réservations en ligne",
        "cohortBookings": "Leurs réservations en ligne"
      },
      "perActivated": "{{n}} par entreprise activée"
    },
    "audience": {
      "title": "Visiteurs par zone",
      "subtitle": "{{days}} derniers jours, par type de page",
      "views_one": "{{n}} page vue",
      "views_few": "{{n}} pages vues",
      "views_many": "{{n}} pages vues",
      "views_other": "{{n}} pages vues",
      "visitors_one": "{{n}} visiteur",
      "visitors_few": "{{n}} visiteurs",
      "visitors_many": "{{n}} visiteurs",
      "visitors_other": "{{n}} visiteurs",
      "zones": {
        "web": {
          "label": "Site public",
          "hint": "La page d'accueil, les pages par secteur, les comparatifs et les outils, le blog, l'inscription et les pages légales. C'est le chiffre qui mesure le référencement."
        },
        "booking": {
          "label": "Pages de réservation des entreprises",
          "hint": "Clients des entreprises sur leur page de réservation et sur le lien de leur rendez-vous. Ce n'est pas du trafic du site."
        },
        "app": {
          "label": "Application",
          "hint": "Équipes des entreprises sur la page de connexion et les écrans privés."
        }
      },
      "note": "Ce sont des visiteurs-jours additionnés par type de page, pas des personnes distinctes : un visiteur qui voit deux types de page (l'accueil et une page secteur) compte deux fois, celui qui passe du site à une page de réservation compte dans les deux zones, et celui qui revient un autre jour compte à nouveau, car l'empreinte anonyme change chaque jour à 00:00 UTC. Les pages vues, elles, sont exactes.",
      "noteWeb": "Ce sont des visiteurs-jours, pas des personnes distinctes : l'empreinte anonyme change chaque jour à 00:00 UTC, donc celui qui revient un autre jour compte à nouveau. Sur le site public, chaque visiteur compte une fois par jour, quel que soit le nombre de pages vues ; les deux autres zones additionnent leurs types de page (celui qui passe par la page de connexion puis utilise l'application compte deux fois), et celui qui passe du site à une page de réservation compte dans les deux zones. Les pages vues, elles, sont exactes.",
      "webBreakdown": "Visiteurs-jours du site public : {{total}}. Parmi eux, {{engaged}} avec une origine externe (un autre site ou une campagne) ou plus d'une page vue, et {{single}} avec une seule page et une arrivée directe, ce qui est habituel pour un robot d'exploration se faisant passer pour un navigateur. Parmi les premiers, avec utilisation de l'application le même jour (équipe ou nouvelle inscription) : {{withApp}}.",
      "webBreakdownSignal": "Visiteurs-jours du site public : {{total}}. Parmi eux, {{engaged}} avec une origine externe (un autre site ou une campagne) ou plus d'une page vue, et {{single}} avec une seule page et une arrivée directe (sans origine connue : adresse saisie, favori ou lien qui ne transmet pas d'origine). Parmi les premiers, avec utilisation de l'application le même jour (équipe ou nouvelle inscription) : {{withApp}}.",
      "other": "Non classés : {{visitors}} et {{views}} sur des chemins que le serveur n'attribue à aucune zone : des adresses qui n'existent pas (404) et /cuenta-suspendida."
    },
    "charts": {
      "visitorsPerDay": "Visiteurs par jour",
      "allZones": "Toutes les zones réunies : site public, pages de réservation et application.",
      "signupsPerDay": "Inscriptions par jour",
      "trafficPerDay": "Visiteurs et pages vues par jour",
      "appointmentsPerDay": "Rendez-vous et réservations en ligne par jour",
      "newPatientsPerDay": "Nouveaux clients par jour",
      "emailsPerDay": "E-mails par jour",
      "apiRequestsPerDay": "Requêtes API par jour",
      "api5xxPerDay": "Erreurs 5xx par jour",
      "apiP95PerDay": "Latence p95 par jour (ms, crons et panneau inclus)"
    },
    "series": {
      "visitors": "Visiteurs",
      "views": "Pages vues",
      "signups": "Inscriptions",
      "appointments": "Rendez-vous",
      "onlineBookings": "Réservations en ligne",
      "newPatients": "Nouveaux clients",
      "emailsSent": "Envoyés",
      "emailsFailed": "Échoués",
      "requests": "Requêtes",
      "errors5xx": "Erreurs 5xx",
      "p95": "Latence p95"
    },
    "chart": {
      "showTable": "Afficher le tableau",
      "hideTable": "Masquer le tableau",
      "noData": "Aucune donnée sur la période",
      "allZero": "Tout à zéro sur la période",
      "day": "Jour",
      "total": "Total"
    },
    "traffic": {
      "note": "Statistiques internes sans cookies. Seules comptent les visites avec un signe de présence humaine (un toucher, une touche, la souris ou 15 secondes avec la page à l'écran) et les robots sont exclus ({{bots}} vues de robots sur la période).",
      "visitorDays": "Les visiteurs sont des visiteurs-jours : l'empreinte anonyme change chaque jour à 00:00 UTC (02:00 en Espagne en été, 01:00 en hiver), donc celui qui revient un autre jour, change de réseau ou utilise un autre navigateur compte à nouveau.",
      "scope": "Le graphique quotidien et les listes de sites référents, pays, langues, appareils et UTM additionnent toutes les zones (site public, pages de réservation des entreprises et application) ; la répartition se trouve dans l'onglet Vue d'ensemble.",
      "beforeHumanSignal": "Cette période inclut des jours antérieurs au {{date}}, quand les robots d'exploration se faisant passer pour un navigateur comptaient encore comme visiteurs : les chiffres de ces jours-là sont gonflés et ne sont pas comparables aux suivants.",
      "dataSince": "Les données commencent le {{date}}. La période choisie débute avant : ses premiers jours sont vides parce que rien n'était encore mesuré, pas parce que personne n'est venu.",
      "topPages": "Pages les plus visitées",
      "topPagesByZone": {
        "web": "Pages du site public",
        "booking": "Chemins des pages de réservation",
        "app": "Écrans de l'application",
        "other": "Chemins non classés"
      },
      "referrers": "Sites référents",
      "countries": "Pays",
      "langs": "Langues",
      "devices": "Appareils",
      "utmSources": "UTM · source",
      "utmCampaigns": "UTM · campagne",
      "pageTypes": "Types de page",
      "bookingPages": "Pages de réservation les plus visitées",
      "direct": "(direct)",
      "visitors": "visiteurs",
      "views": "vues",
      "showAll": "Voir les {{n}}",
      "showLess": "Voir moins",
      "empty": "Rien à afficher sur la période",
      "openBooking": "Ouvrir la page de réservation"
    },
    "tracking": {
      "excluded": "Ce navigateur ne compte pas dans les statistiques.",
      "counted": "Ce navigateur compte dans les statistiques. Pour l'exclure, connectez-vous ici en tant qu'opérateur (il est alors marqué avec la clé locale {{key}}) ou activez Do Not Track ou Global Privacy Control.",
      "reasons": {
        "operator": "Vous êtes connecté en tant qu'opérateur de la plateforme.",
        "optout": "Il porte la clé locale {{key}}, enregistrée automatiquement à la connexion en tant qu'opérateur : il ne compte pas non plus hors session.",
        "dnt": "Do Not Track y est activé.",
        "gpc": "Il envoie le signal Global Privacy Control."
      },
      "sessionOnly": "La clé locale {{key}} n'a pas pu être enregistrée : hors session, ce navigateur comptera à nouveau.",
      "otherDevices": "Vos autres appareils comptent tant que vous ne vous y êtes pas connecté une fois en tant qu'opérateur."
    },
    "pageTypes": {
      "landing": "Page d'accueil",
      "seo": "Pages SEO",
      "blog": "Blog",
      "legal": "Mentions légales et contact",
      "signup": "Inscription",
      "login": "Connexion",
      "book": "Réservation publique",
      "portal": "Portail client",
      "app": "Application",
      "other": "Autres"
    },
    "devices": {
      "desktop": "Ordinateur",
      "mobile": "Mobile",
      "tablet": "Tablette"
    },
    "activity": {
      "businessTitle": "Activité des entreprises",
      "businessNote": "Les entreprises internes (test et demo) ne sont pas comptées.",
      "apiTitle": "API",
      "topErrors": "Erreurs d'API les plus fréquentes",
      "noErrors": "Aucune erreur d'API sur la période",
      "emailsNote": "Les échecs sont mis en évidence ; les envois réussis donnent le contexte.",
      "cols": {
        "method": "Méthode",
        "route": "Route",
        "status": "Code",
        "hits": "Occurrences",
        "lastAt": "Dernière fois"
      }
    },
    "health": {
      "checkedAt": "Vérifié {{time}}",
      "version": "Commit",
      "env": "Environnement",
      "region": "Région",
      "configTitle": "Configuration",
      "configNote": "Seule la présence d'une valeur pour chaque variable dans Vercel est vérifiée ; rien n'est validé auprès de Stripe, Resend, Cloudflare ou Sentry.",
      "configSummary": "{{ok}} sur {{total}} obligatoires",
      "dbTitle": "Base de données",
      "dbLatency": "Latence",
      "dbOk": "Connectée",
      "dbSlow": "Connectée, lente",
      "dbDown": "Injoignable",
      "cronsTitle": "Tâches planifiées",
      "cronState": {
        "ok": "OK",
        "stale": "En retard",
        "failed": "Échec",
        "never": "Jamais exécutée"
      },
      "cronLast": "Dernière exécution",
      "cronSummary": "Voir le résumé (JSON)",
      "cronNoRuns": "Aucune exécution enregistrée",
      "cronRecent": "Dernières exécutions",
      "cronHint": "Vérifiez CRON_SECRET dans Vercel et le journal de Vercel Cron ; pour « reminders », vérifiez aussi le workflow reminders-hourly dans GitHub Actions",
      "cronFailedHint": "Consultez l'erreur de la dernière exécution et le journal de la fonction dans Vercel",
      "cronsError": "Impossible de lire le journal des crons : {{error}}",
      "errorsTitle": "Dernières erreurs",
      "noErrors": "Aucune erreur enregistrée",
      "api24Title": "API · dernières 24 h",
      "api24Note": "La latence p95 est le temps de réponse du serveur, sans compter les crons ni les requêtes de ce panneau ; les autres chiffres les incluent.",
      "emails24Title": "E-mails · dernières 24 h",
      "requests": "Requêtes",
      "errors5xx": "Erreurs 5xx",
      "errors4xx": "Erreurs 4xx",
      "p95": "Latence p95",
      "sent": "Envoyés",
      "failed": "Échoués",
      "noData": "Aucune donnée",
      "migrationTitle": "La migration 31 n'a pas été appliquée",
      "migrationBody": "Les statistiques de la plateforme nécessitent les tables et fonctions de {{file}}. Appliquez-la dans Supabase et rechargez.",
      "ok": "Correct",
      "configured": "Configuré",
      "missing": "Manquant",
      "recommended": "Recommandé",
      "optional": "Facultatif",
      "on": "Activé",
      "off": "Désactivé",
      "cols": {
        "time": "Quand",
        "logger": "Origine",
        "tenant": "Entreprise",
        "message": "Message"
      },
      "items": {
        "supabase": {
          "label": "Supabase (URL + clé de service)",
          "hint": "Définissez SUPABASE_URL et SUPABASE_SERVICE_KEY dans Vercel"
        },
        "rlsJwtSecret": {
          "label": "Secret JWT de Supabase (RLS)",
          "hint": "Copiez le secret JWT du projet Supabase dans SUPABASE_JWT_SECRET sur Vercel"
        },
        "cronSecret": {
          "label": "Secret des crons",
          "hint": "Ajoutez CRON_SECRET dans Vercel ; sans lui, les crons répondent 401"
        },
        "stripeSecretKey": {
          "label": "Clé secrète Stripe",
          "hint": "Ajoutez STRIPE_SECRET_KEY dans Vercel"
        },
        "stripeWebhookSecret": {
          "label": "Webhook Stripe",
          "hint": "Créez le webhook dans Stripe et ajoutez STRIPE_WEBHOOK_SECRET dans Vercel"
        },
        "stripePrices": {
          "label": "Prix Stripe ({{n}}/{{total}})",
          "hint": "ID de prix manquants : STRIPE_PRICE_STARTER_MONTHLY/YEARLY et STRIPE_PRICE_PRO_MONTHLY/YEARLY"
        },
        "resend": {
          "label": "Resend (envoi d'e-mails)",
          "hint": "Ajoutez RESEND_API_KEY dans Vercel"
        },
        "emailFrom": {
          "label": "Expéditeur des e-mails",
          "hint": "Définissez EMAIL_FROM avec un domaine vérifié dans Resend"
        },
        "turnstile": {
          "label": "Turnstile (anti-robots)",
          "hint": "Ajoutez TURNSTILE_SECRET_KEY ; sans elle, l'inscription publique n'est pas protégée"
        },
        "superadmins": {
          "label": "Administrateurs de la plateforme ({{n}})",
          "hint": "Définissez SUPERADMIN_EMAILS (e-mails séparés par des virgules)"
        },
        "publicAppBaseUrl": {
          "label": "URL publique de l'application",
          "hint": "Définissez PUBLIC_APP_BASE_URL (p. ex. https://www.bookingfornow.com)"
        },
        "sentry": {
          "label": "Sentry (erreurs du backend)",
          "hint": "Les erreurs sont déjà enregistrées ci-dessous, dans « Dernières erreurs ». Avec SENTRY_DSN, elles sont aussi envoyées à Sentry."
        },
        "twilio": {
          "label": "Twilio (SMS)",
          "hint": "Dépend de TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN et TWILIO_FROM_NUMBER. Avec les trois, les entreprises du forfait Pro envoient des rappels et des confirmations par SMS ; s'il en manque une, aucun n'est envoyé. Aujourd'hui, aucun forfait ne l'annonce."
        },
        "tenantSubdomains": {
          "label": "Sous-domaine propre par établissement",
          "hint": "Avec CLOUDFLARE_API_TOKEN, CLOUDFLARE_ZONE_ID, VERCEL_TOKEN et VERCEL_PROJECT_ID, chaque inscription crée son <etablissement>.bookingfornow.com tant que le projet Vercel compte moins de VERCEL_MAX_DOMAINS domaines (45 par défaut ; à augmenter en passant à Vercel Pro)"
        },
        "signupEnabled": {
          "label": "Inscription publique",
          "hint": "SIGNUP_ENABLED=true autorise les nouvelles inscriptions"
        },
        "demoEnabled": {
          "label": "Mode démo",
          "hint": "Ouvre seulement le compte de démonstration de l'application (et le réinitialise chaque jour). La démo publique du site (/en/demo) fonctionne toujours et n'en dépend pas."
        },
        "cronSecretExternal": {
          "label": "Identifiant du déclenchement horaire (GitHub Actions)",
          "hint": "Ajoutez CRON_SECRET_EXTERNAL dans Vercel et la même valeur comme secret du dépôt dans GitHub ; sans lui, les rappels ne partent qu'une fois par jour avec le cron de Vercel"
        }
      },
      "schema": {
        "title": "Schéma de la base de données",
        "unknown": "Non vérifié",
        "migrationsLabel": "Migrations SQL",
        "migrationsCount": "{{applied}} sur {{total}} enregistrées dans schema_migrations",
        "pendingState": "En attente : {{n}}",
        "pendingHint": "Appliquez ces migrations avant de déployer du code qui en dépend :",
        "baselineHint": "Aucune migration n'est enregistrée. Si la base de données était déjà à jour, ne les appliquez pas : vérifiez l'état avec --list et enregistrez-les avec --baseline --until=N.",
        "reasons": {
          "SQL_DIR_UNAVAILABLE": "Le déploiement n'inclut pas backend/sql : impossible de le comparer avec la base de données.",
          "MIGRATIONS_TABLE_MISSING": "La table schema_migrations n'existe pas : la base de données a été migrée à la main. Enregistrez ce qui est déjà appliqué avec --baseline --until=N.",
          "MIGRATIONS_TABLE_UNREADABLE": "Impossible de lire la table schema_migrations."
        },
        "overlapLabel": "Protection contre le chevauchement des rendez-vous (migration 32)",
        "overlapOff": "Inactive",
        "overlapOffHint": "La contrainte appointments_no_practitioner_overlap n'existe pas : si deux personnes réservent en même temps le même créneau avec le même professionnel, les deux réservations peuvent passer. Cherchez les avis « 32/1 SALTADO » de la migration 32, corrigez la cause et réexécutez son bloc 1.",
        "overlapPendingHint": "La migration 32 n'est pas encore appliquée : la protection est créée lorsque vous l'appliquez (voir la liste des migrations en attente).",
        "overlapReasons": {
          "RPC_MISSING": "Vérification impossible : la fonction platform_schema_flags de la migration 31 est absente.",
          "RPC_ERROR": "Impossible de vérifier la contrainte anti-chevauchement.",
          "RPC_UNEXPECTED": "La vérification de la contrainte anti-chevauchement a renvoyé une réponse inattendue."
        },
        "notApplied": "Non appliqué",
        "flagPendingHint": "Arrive avec la migration {{n}}, qui est encore en attente (voir la liste des migrations en attente).",
        "flagsLabel": "Autres vérifications du schéma",
        "flagsReasons": {
          "RPC_OUTDATED": "La fonction platform_schema_flags est encore celle de la migration 31. Appliquez la migration 33 pour vérifier le reste du schéma (si elle est déjà enregistrée comme appliquée, cherchez l'avis « 33/6 SALTADO »).",
          "RPC_MISSING": "Vérification impossible : la fonction platform_schema_flags (migrations 31 et 33) est absente.",
          "RPC_ERROR": "Impossible d'interroger l'état du schéma.",
          "RPC_UNEXPECTED": "La vérification du schéma a renvoyé une réponse inattendue."
        },
        "flags": {
          "unassignedOverlap": {
            "label": "Anti-chevauchement des rendez-vous sans professionnel (migration 33)",
            "hint": "La contrainte appointments_no_unassigned_overlap n'existe pas : deux rendez-vous sans professionnel attribué peuvent occuper le même créneau en même temps. Cherchez l'avis « 33/2 SALTADO » de la migration 33, résolvez les chevauchements indiqués et réexécutez-la."
          },
          "durationCheck": {
            "label": "Durée cohérente des rendez-vous (migration 33)",
            "hint": "La contrainte appointments_duration_consistent n'existe pas ou n'est pas validée : certains rendez-vous peuvent avoir une heure de fin qui ne correspond pas à leur durée. Cherchez les avis « 33/3 » de la migration 33, corrigez ces rendez-vous et réexécutez-la."
          },
          "localeColumn": {
            "label": "Langue du client dans les rendez-vous (migration 33)",
            "hint": "La colonne appointments.locale est absente ; elle enregistre la langue du client pour lui écrire dans celle-ci. Cherchez l'avis « 33/1 SALTADO » de la migration 33, corrigez la cause et réexécutez-la."
          },
          "rateLimit": {
            "label": "Limite de requêtes partagée (migration 33)",
            "hint": "La table rate_limit_hits ou la fonction rate_limit_hit est absente : l'inscription et les sauvegardes ne sont limitées que dans la mémoire de chaque instance, ce qui est facile à contourner. Cherchez l'avis « 33/4 SALTADO » de la migration 33 et réexécutez-la."
          },
          "logsPrune": {
            "label": "Rétention automatique des journaux (migration 33)",
            "hint": "La fonction logs_prune est absente : le cron quotidien n'applique pas la rétention (les e-mails de plus d'un an conservent leur destinataire et leur objet, et les enregistrements de plus de 3 ans ne sont pas supprimés). Cherchez l'avis « 33/5 SALTADO » de la migration 33 et réexécutez-la."
          },
          "patientsSoftDelete": {
            "label": "Suppression des clients avec anonymisation (migration 21)",
            "hint": "Les colonnes deletedAt ou anonymizedAt de patients sont absentes : la suppression des clients avec anonymisation et les requêtes qui excluent les clients supprimés échouent. Appliquez (ou réexécutez) la migration 21."
          },
          "planDeactivation": {
            "label": "Désactivation des ressources selon le forfait (migration 30)",
            "hint": "La colonne deactivatedByPlan est absente dans practitioners ou locations : lors d'un passage à un forfait inférieur, les professionnels et sites en trop ne peuvent pas être désactivés, ni réactivés en repassant à un forfait supérieur. Appliquez (ou réexécutez) la migration 30."
          },
          "legacyWhatsapp": {
            "label": "Nettoyage des anciennes colonnes WhatsApp (migration 34)",
            "hint": "La table appointments contient encore les colonnes whatsappReminderSent et whatsappReminderSentAt, qui ne sont plus utilisées. La migration 34 les supprime et elle est destructive : appliquez-la avec --allow-destructive après avoir fait une sauvegarde."
          }
        }
      },
      "top4xx": {
        "title": "4xx les plus fréquentes",
        "hint": "Toute route /api/* inexistante répond 401 sans session : un 401 sur une route inconnue vient donc d'un robot, d'un scanner ou d'un test manuel. Vérifiez seulement vos propres routes qui se répètent."
      }
    },
    "tenants": {
      "search": "Rechercher par nom ou slug…",
      "count_one": "{{count}} entreprise",
      "count_few": "{{count}} entreprises",
      "count_many": "{{count}} entreprises",
      "count_other": "{{count}} entreprises",
      "basicMode": "Données d'activité indisponibles ; affichage de la liste de base.",
      "never": "Jamais",
      "trialUntil": "Essai jusqu'au {{date}}",
      "originDirect": "Direct",
      "noResults": "Aucune entreprise ne correspond au filtre",
      "openBooking": "Ouvrir sa page de réservation",
      "referral": {
        "referredBy": "Recommandé par {{slug}}",
        "statusPending": "non activé",
        "statusActivated": "activé",
        "summary": "A recommandé {{referred}} · {{activated}} actifs · {{rewards}} récompenses",
        "failed": "Récompenses échouées : {{n}} (à vérifier)"
      },
      "sort": {
        "label": "Trier par",
        "lastActivity": "Dernière activité",
        "created": "Date d'inscription",
        "name": "Nom",
        "appointments": "Rendez-vous de la période"
      },
      "cols": {
        "patients": "Clients",
        "appointments": "RDV ({{days}} j)",
        "online": "En ligne ({{days}} j)",
        "lastActivity": "Dernière activité",
        "bookingViews": "Vues réservation",
        "actions": "Actions"
      }
    },
    "confirmPlan": {
      "title": "Changer de forfait",
      "message": "Changer le forfait de {{name}} de « {{from}} » à « {{to}} » ? Le backend ajustera les ressources aux limites du nouveau forfait.",
      "confirm": "Changer de forfait"
    },
    "confirmSuspend": {
      "title": "Suspendre l'entreprise",
      "message": "Suspendre {{name}} ? Son équipe perdra immédiatement l'accès et sa page de réservation n'acceptera plus de rendez-vous. Vous pourrez la réactiver à tout moment."
    },
    "unavailable": {
      "title": "Statistiques indisponibles",
      "migration": "La migration 31 de la base de données, qui crée les tables et fonctions de statistiques, n'a pas été appliquée.",
      "error": "Le backend a renvoyé une erreur lors du calcul des statistiques.",
      "loadError": "Impossible de charger les statistiques (HTTP {{status}}).",
      "howTo": "Comment corriger",
      "migrationSteps": "Exécutez « {{cmd}} » depuis backend/ (applique {{file}}) et rechargez cette page.",
      "retry": "Réessayer"
    },
    "errors": {
      "TENANT_HAS_SUBSCRIPTION": "Cette entreprise a un abonnement Stripe : son forfait est géré par Stripe. Modifiez-le ou résiliez-le d'abord là-bas.",
      "TENANT_HAS_ACTIVE_PLAN": "Cette entreprise a un forfait de courtoisie actif. Passez-la d'abord à Free, puis prolongez l'essai.",
      "TENANT_NOT_FOUND": "Cette entreprise n'existe plus.",
      "INVALID_TENANT_ID": "Identifiant d'entreprise non valide.",
      "INVALID_PLAN": "Ce forfait n'est pas valide."
    }
  },
  "businessHours": {
    "eyebrow": "Entreprise",
    "title": "Horaires de travail",
    "open": "Ouvert",
    "closed": "Fermé",
    "addWindow": "+ Ajouter un créneau",
    "quitarTramo": "Retirer le créneau",
    "desde": "De",
    "hasta": "À",
    "errorFormato": "Format d'horaire invalide. Vérifiez les heures (HH:MM) de chaque créneau.",
    "days": {
      "mon": "Lundi",
      "tue": "Mardi",
      "wed": "Mercredi",
      "thu": "Jeudi",
      "fri": "Vendredi",
      "sat": "Samedi",
      "sun": "Dimanche"
    }
  },
  "subscriptionBanner": {
    "manage": "Gérer",
    "trialEndsToday": "Votre période d'essai se termine aujourd'hui. Choisissez un forfait pour conserver toutes les fonctionnalités.",
    "pastDue": "Votre dernier paiement n'a pas abouti. Mettez à jour votre moyen de paiement pour éviter la suspension du service.",
    "unpaid": "Des factures sont en attente sur votre compte. Régularisez le paiement pour maintenir le service actif.",
    "canceled": "Votre abonnement a été annulé. Réactivez un forfait pour continuer à utiliser la plateforme.",
    "incompleteExpired": "Votre abonnement n'a pas pu être finalisé. Réessayez le paiement pour activer votre forfait.",
    "generic": "Il y a un problème avec votre abonnement. Vérifiez vos paramètres de facturation.",
    "freeHint": "Vous êtes sur le forfait Free. Quand votre entreprise grandira, passez à un forfait supérieur pour augmenter vos limites et débloquer plus de fonctionnalités.",
    "viewPlans": "Voir les forfaits",
    "trialEndsInDays_one": "Votre période d'essai se termine dans {{count}} jour. Choisissez un forfait pour conserver toutes les fonctionnalités.",
    "trialEndsInDays_few": "Votre période d'essai se termine dans {{count}} jours. Choisissez un forfait pour conserver toutes les fonctionnalités.",
    "trialEndsInDays_many": "Votre période d'essai se termine dans {{count}} jours. Choisissez un forfait pour conserver toutes les fonctionnalités.",
    "trialEndsInDays_other": "Votre période d'essai se termine dans {{count}} jours. Choisissez un forfait pour conserver toutes les fonctionnalités."
  },
  "titles": {
    "home": "Logiciel de rendez-vous en ligne gratuit",
    "suspended": "Compte suspendu",
    "login": "Connexion à votre logiciel de réservation",
    "resetPassword": "Réinitialiser le mot de passe",
    "agenda": "Agenda",
    "clients": "Clients",
    "clientDetail": "Fiche client",
    "settings": "Paramètres",
    "billing": "Facturation",
    "catalogs": "Catalogues",
    "audit": "Journal d'audit",
    "timeBlocks": "Blocages d'agenda",
    "bookingSettings": "Paramètres de réservation en ligne",
    "pendingBookings": "Réservations en attente",
    "platform": "Plateforme",
    "publicBooking": "Réservation en ligne",
    "myAppointment": "Mon rendez-vous",
    "signup": "Créez votre compte gratuit : 14 jours d'essai sans carte bancaire",
    "notFound": "Page introuvable",
    "team": "Équipe",
    "bonos": "Packs de séances"
  },
  "notFound": {
    "eyebrow": "Erreur 404",
    "title": "Page introuvable",
    "lead": "La page que vous recherchez n'existe pas ou a changé d'adresse.",
    "home": "Aller à la page d'accueil"
  },
  "a11y": {
    "skipToContent": "Aller au contenu"
  },
  "confirmModal": {
    "title": "Confirmer l'action",
    "message": "Voulez-vous vraiment continuer ?",
    "itemLabel": "Élément"
  },
  "whatsappCta": {
    "homeLabel": "Une question ? Écrivez-nous sur WhatsApp",
    "homeMessage": "Bonjour, j'ai découvert BookingForNow et j'ai une question",
    "signupLead": "Une question sur l'inscription ?",
    "signupLabel": "Écrivez-nous sur WhatsApp",
    "signupMessage": "Bonjour, je suis en train de m'inscrire sur BookingForNow et j'ai une question",
    "ariaLabel": "{{label}} (s'ouvre dans un nouvel onglet)"
  },
  "tour": {
    "stepOf": "Étape {{current}} sur {{total}}",
    "close": "Fermer le tutoriel",
    "skip": "Passer le tutoriel",
    "configure": "Aller à la configuration",
    "finish": "Terminer",
    "relaunch": "Voir le tutoriel",
    "relaunchAria": "Voir le tutoriel de configuration",
    "steps": {
      "business": {
        "title": "Votre entreprise",
        "body": "Commencez par les informations de votre entreprise : le téléphone, l'e-mail et l'adresse que vos clients verront lors de la réservation, ainsi que la langue, la devise et le fuseau horaire."
      },
      "team": {
        "title": "Votre équipe",
        "body": "Un professionnel, c'est vous ou chaque personne de votre équipe qui assure des rendez-vous. Ajoutez-en au moins un pour pouvoir recevoir des réservations. Vous le trouverez dans l'onglet « Professionnels »."
      },
      "services": {
        "title": "Vos services",
        "body": "Les services sont ce que vous proposez (une séance, une coupe, un contrôle, un cours…), chacun avec sa durée et son prix. Créez-les dans l'onglet « Services »."
      },
      "hours": {
        "title": "Vos horaires",
        "body": "Définissez vos horaires d'ouverture pour que vos clients ne puissent réserver que lorsque vous êtes disponible."
      },
      "link": {
        "title": "Partagez votre lien de réservation",
        "body": "Votre page accepte déjà les réservations : partagez votre lien public pour que vos clients réservent eux-mêmes. Vous le trouverez dans « Paramètres de réservation en ligne », où vous pouvez aussi la désactiver.",
        "cta": "Aller à mon lien"
      }
    }
  },
  "team": {
    "eyebrow": "Paramètres",
    "title": "Équipe",
    "subtitle": "Donnez accès à votre agenda à vos professionnels et à l'accueil, chacun avec les droits nécessaires.",
    "loadError": "Impossible de charger l'équipe.",
    "retry": "Réessayer",
    "invite": {
      "title": "Inviter une personne",
      "email": "E-mail",
      "emailPlaceholder": "nom@exemple.com",
      "role": "Rôle",
      "practitioner": "Sa fiche professionnel",
      "practitionerNone": "Non associée",
      "practitionerHelp": "Associez-la à sa fiche professionnel pour qu'elle puisse gérer ses propres blocages d'horaire.",
      "send": "Envoyer l'invitation",
      "sending": "Envoi…"
    },
    "members": {
      "linkOf": "Fiche professionnel de {{email}}",
      "title": "Personnes ayant accès",
      "you": "Vous",
      "pending": "Invitation en attente",
      "lastSeen": "Dernière connexion : {{date}}",
      "roleOf": "Rôle de {{email}}",
      "resend": "Renvoyer",
      "remove": "Retirer l'accès"
    },
    "toasts": {
      "linkChanged": "Fiche professionnel mise à jour",
      "invited": "Invitation envoyée à {{email}}",
      "resent": "Invitation renvoyée à {{email}}",
      "roleChanged": "Rôle mis à jour",
      "removed": "{{email}} n'a plus accès"
    },
    "errors": {
      "PRACTITIONER_ALREADY_LINKED": "Cette fiche professionnel est déjà associée à un autre compte.",
      "PRACTITIONER_NOT_FOUND": "Cette fiche professionnel n'existe plus.",
      "INVALID_EMAIL": "Cet e-mail n'est pas valide.",
      "INVALID_ROLE": "Ce rôle n'est pas valide.",
      "ROLE_NOT_ALLOWED": "Vous n'êtes pas autorisé à attribuer ou à gérer ce rôle.",
      "ALREADY_MEMBER": "Cette personne fait déjà partie de l'équipe.",
      "PLAN_LIMIT_REACHED": "Vous avez atteint le nombre d'utilisateurs de votre forfait.",
      "CANNOT_MODIFY_SELF": "Vous ne pouvez pas modifier votre propre accès.",
      "OWNER_PROTECTED": "Le propriétaire ne peut pas être modifié ici.",
      "NOT_FOUND": "Cette personne ne fait plus partie de l'équipe.",
      "INVITE_LINK_FAILED": "Impossible de générer l'invitation. Réessayez dans quelques minutes.",
      "AUTH_UNAVAILABLE": "Le service de connexion n'est pas disponible pour le moment.",
      "ACCOUNT_MISMATCH": "Le compte de cette personne a changé. Retirez-lui l'accès et invitez-la à nouveau.",
      "copyFailed": "Impossible de copier. Sélectionnez le lien et copiez-le manuellement."
    },
    "seats": {
      "count": "{{used}} utilisateurs sur {{limit}}",
      "unlimited": "{{used}} utilisateurs · sans limite",
      "full": "Vous avez atteint le nombre d'utilisateurs de votre forfait.",
      "upgrade": "Voir les forfaits"
    },
    "manual": {
      "title": "Partagez vous-même le lien d'accès",
      "body": "Nous n'avons pas pu envoyer l'e-mail à {{email}}. Copiez ce lien et envoyez-le-lui par WhatsApp ou par le moyen de votre choix.",
      "linkLabel": "Lien d'accès",
      "copy": "Copier le lien",
      "copied": "Copié",
      "expires": "Ce lien est personnel et expire dans 24 heures. Ne le publiez pas."
    },
    "confirmRemove": {
      "title": "Retirer l'accès",
      "message": "Retirer l'accès de {{email}} ? Cette personne ne pourra plus accéder à votre agenda, avec effet immédiat. Ses rendez-vous et ses données ne sont pas supprimés."
    },
    "rolesGuide": {
      "title": "Ce que chaque rôle peut faire"
    },
    "roles": {
      "owner": {
        "name": "Propriétaire",
        "help": "Tout, y compris l'abonnement et la gestion de l'équipe."
      },
      "admin": {
        "name": "Administrateur",
        "help": "Gère l'agenda, les clients, les encaissements, les services et les paramètres. Peut inviter des professionnels et l'accueil. Ne voit pas l'abonnement."
      },
      "practitioner": {
        "name": "Professionnel",
        "help": "Travaille avec l'agenda, les clients et leurs notes. Ne gère ni les encaissements, ni les rapports, ni les paramètres."
      },
      "receptionist": {
        "name": "Accueil",
        "help": "Gère l'agenda, les clients, les encaissements et les packs de séances. Ne voit pas les notes privées des professionnels."
      },
      "readonly": {
        "name": "Lecture seule",
        "help": "Peut consulter l'agenda et les clients, mais ne peut rien modifier."
      }
    },
    "managersOnly": "Seul le propriétaire ou un administrateur peut gérer l'équipe."
  },
  "theme": {
    "label": "Thème",
    "light": "Clair",
    "dark": "Sombre",
    "system": "Système"
  }
}
