{
  "healthConsent": {
    "title": "Consentement pour tes données de santé",
    "body": "Ta récupération (sommeil, énergie, humeur) et tes mesures corporelles comme le poids sont des données de santé. Nous ne les traitons qu'avec ton consentement, afin de suivre ta charge, ta récupération et ta progression.",
    "point1": "Données sensibles (art. 9 RGPD). Réservées à toi et aux coachs avec qui tu choisis de partager.",
    "point2": "Tu les renseignes librement. Tu peux arrêter à tout moment.",
    "point3": "Tu peux supprimer tes données à tout moment.",
    "accept": "Je donne mon consentement",
    "once": "Tu confirmes ceci une seule fois. Cela vaut pour toutes tes données de santé dans JudoLytics.",
    "readMore": "Lis notre politique de confidentialité"
  },
  "save": "Enregistrer",
  "cancel": "Annuler",
  "delete": "Supprimer",
  "edit": "Modifier",
  "back": "Retour",
  "editedAgo": "Modifié {{time}}",
  "lastUpdatedAgo": "Mis à jour {{time}}",
  "more": "Plus",
  "settings": "Paramètres",
  "signOut": "Se déconnecter",
  "copy": {
    "button": "Copier",
    "copied": "Copié",
    "success": "Copié dans le presse-papiers",
    "failed": "Échec de la copie"
  },
  "actions": {
    "save": "Enregistrer",
    "cancel": "Annuler",
    "delete": "Supprimer",
    "edit": "Modifier",
    "add": "Ajouter",
    "close": "Fermer",
    "confirm": "Confirmer",
    "back": "Retour",
    "next": "Suivant",
    "search": "Rechercher",
    "filter": "Filtrer",
    "export": "Exporter",
    "import": "Importer",
    "retry": "Réessayer",
    "changeLanguage": "Changer de langue",
    "exportCsv": "Exporter en CSV",
    "menu": "Actions",
    "clearSearch": "Effacer la recherche",
    "undo": "Annuler"
  },
  "errors": {
    "generic": "Une erreur s'est produite",
    "unauthorized": "Accès refusé"
  },
  "error": {
    "title": "Une erreur s'est produite",
    "profileLoad": "Impossible de charger ton profil. Réessaie.",
    "retry": "Réessayer"
  },
  "roles": {
    "coach": "Coach",
    "judoka": "Judoka",
    "beheerder": "Gestionnaire"
  },
  "status": {
    "loading": "Chargement…",
    "saving": "Enregistrement…",
    "deleting": "Suppression…",
    "noResults": "Aucun résultat trouvé",
    "error": "Une erreur s'est produite",
    "success": "Enregistré avec succès",
    "unexpectedError": "Une erreur inattendue s'est produite",
    "errorRetry": "Une erreur s'est produite. Réessaie.",
    "noConnection": "Pas de connexion Internet. Réessaie dès que tu es de nouveau en ligne."
  },
  "nav": {
    "dashboard": "Tableau de bord",
    "home": "Accueil",
    "new": "Nouveau",
    "newAnalysis": "Ajouter un combat",
    "myMatches": "Mes combats",
    "matches": "Combats",
    "import": "Importer",
    "opponents": "Adversaires",
    "tournaments": "Tournois",
    "stats": "Statistiques",
    "training": "Entraînements",
    "loadMonitor": "Charge",
    "tracking": "Mesures",
    "developmentPlan": "Plan de développement",
    "myClubs": "Clubs",
    "referral": "Gagne un mois gratuit",
    "settings": "Paramètres",
    "settingsProfile": "Profil",
    "settingsSecurity": "Sécurité",
    "settingsBilling": "Abonnement",
    "settingsNotifications": "Notifications",
    "settingsApp": "Préférences de l'app",
    "settingsModules": "Modules",
    "settingsPrivacy": "Confidentialité et partage",
    "settingsData": "Mes données",
    "dataIntegrity": "Contrôle des données",
    "adminCockpit": "Cockpit admin",
    "usersAndSubs": "Utilisateurs et abos",
    "tournamentsAdmin": "Gestion des tournois",
    "manageClubs": "Gérer les clubs",
    "feedback": "Retours",
    "analytics": "Analytics de la plateforme",
    "emailAdmin": "Gestion des e-mails",
    "stripeInsights": "Analyses Stripe",
    "helpOffline": "Aide — Mode hors ligne",
    "helpMfa": "Aide — Double authentification",
    "systemHealth": "État du système",
    "badges": "Badges",
    "pushNotifications": "Notifications push",
    "adminOnboarding": "Gestion de l'intégration",
    "freePlan": "Gratuit",
    "tierRequired": "{{tier}} requis pour {{feature}}",
    "personal": "Personnel",
    "personalDesc": "Ton tableau de bord personnel",
    "clubOverview": "Aperçu",
    "clubMembers": "Membres",
    "clubGroups": "Groupes",
    "clubStats": "Statistiques",
    "clubPrivacy": "Confidentialité",
    "coachCockpit": "Cockpit",
    "coachTeamSessions": "Aperçu des entraînements",
    "coachPlanner": "Planning hebdo",
    "coachLoad": "Charge",
    "coachTracking": "Mesures",
    "coachDevelopment": "Développement",
    "clubSettings": "Paramètres",
    "clubSubscription": "Abonnement",
    "sections": {
      "matches": "Combats",
      "training": "Entraînement",
      "development": "Développement",
      "insights": "Analyses",
      "more": "Plus",
      "admin": "Administration",
      "coach": "Coach",
      "personal": "Personnel",
      "general": "Général",
      "clubCore": "Général",
      "clubs": "Mes clubs",
      "account": "Compte"
    },
    "searchPlaceholder": "Rechercher dans le menu…",
    "searchEmpty": "Aucune page trouvée",
    "searchClear": "Effacer la recherche",
    "tabs": {
      "personal": "Personnel",
      "clubs": "Clubs",
      "admin": "Administration"
    },
    "menu": {
      "title": "Menu",
      "a11yDescription": "Navigation vers les pages, les clubs et les paramètres",
      "settings": "Paramètres",
      "notifications": "Notifications",
      "logout": "Se déconnecter",
      "search": "Recherche des combats, des adversaires, et plus…",
      "sections": {
        "today": "Aujourd'hui"
      },
      "smartTile": {
        "recovery": "Récupération",
        "trainingNow": "Entraînement · {{time}}",
        "matchTomorrow": "Combat demain",
        "matchTomorrowSub": "{{name}}",
        "popDue": "Revue PDI",
        "reflection": "Bilan"
      },
      "clubsub": {
        "core": "Général",
        "coach": "Coach",
        "admin": "Administration"
      }
    },
    "adminOpponents": "Adversaires (admin)",
    "autoOptimization": "Auto-optimisation"
  },
  "validation": {
    "required": "Ce champ est obligatoire",
    "invalidEmail": "Adresse e-mail invalide",
    "tooShort": "Doit comporter au moins {{min}} caractères",
    "tooLong": "Ne peut pas dépasser {{max}} caractères"
  },
  "confirm": {
    "deleteTitle": "Tu es sûr ?",
    "deleteMessage": "Cette action est irréversible.",
    "deleteConfirm": "Oui, supprimer",
    "deleteCancel": "Annuler"
  },
  "select": {
    "placeholder": "Sélectionner…",
    "searchPlaceholder": "Rechercher…",
    "selectAll": "Tout sélectionner",
    "selected": "{{count}} sélectionné(s)",
    "country": "Sélectionne un pays…",
    "searchCountry": "Recherche un pays…",
    "noCountryFound": "Aucun pays trouvé.",
    "opponent": "Sélectionne un adversaire…",
    "searchOpponent": "Recherche un adversaire…",
    "noOpponentFound": "Aucun adversaire trouvé",
    "addNew": "Ajouter un nouveau",
    "addNewOpponent": "Ajouter un nouvel adversaire",
    "weightCategory": "Sélectionne une catégorie de poids",
    "countryAIN": "Athlète neutre individuel (AIN)",
    "countryEOR": "Équipe des réfugiés (EOR)"
  },
  "gender": {
    "male": "Homme",
    "female": "Femme",
    "prefer_not_to_say": "Je préfère ne pas le dire"
  },
  "weightClass": {
    "label": "Catégorie de poids",
    "nonStandard": "Catégorie hors norme",
    "otherCategories": "Autres catégories",
    "otherGender": "Autre genre",
    "kg": "{{weight}} kg"
  },
  "command": {
    "searchPlaceholder": "Recherche des pages, des combats, des adversaires…",
    "navigation": "Navigation",
    "actions": "Actions",
    "addNewMatch": "Ajouter un nouveau combat",
    "signOut": "Se déconnecter",
    "admin": "Administration",
    "adminCockpit": "Cockpit admin",
    "adminUsers": "Utilisateurs et abonnements",
    "adminTournaments": "Gestion des tournois",
    "adminFeedback": "Retours",
    "adminClubs": "Gestion des clubs",
    "adminAnalytics": "Analytics",
    "adminEmail": "Gestion des e-mails",
    "adminSystemHealth": "État du système",
    "adminBadges": "Gestion des badges",
    "searching": "Recherche…",
    "groups": {
      "matches": "Combats",
      "opponents": "Adversaires",
      "trainings": "Entraînements",
      "goals": "Objectifs",
      "members": "Membres du club",
      "recent": "Récents"
    },
    "search": {
      "vs": "vs"
    },
    "removeRecentSearch": "Supprimer la recherche récente"
  },
  "withdrawalWaiver": {
    "title": "Accès immédiat à JudoLytics",
    "description": "Vous demandez la fourniture immédiate d'un service numérique. Pour cela, nous avons besoin de votre consentement exprès.",
    "checkboxLabel": "J'accepte expressément la fourniture immédiate et je confirme renoncer ainsi à mon droit légal de rétractation de 14 jours. La résiliation reste possible à tout moment pour la fin de la période en cours.",
    "termsLink": "En savoir plus sur le droit de rétractation dans nos Conditions générales",
    "confirm": "Continuer vers le paiement"
  },
  "paywall": {
    "availableFrom": "Disponible à partir de {{tier}}",
    "upgrade": "Passer à un plan supérieur",
    "upgradeTo": "Passe à {{tier}}",
    "availableIn": "Inclus dans {{tier}}.",
    "from": "à partir de",
    "perMonth": "/mois",
    "changeTo": "Passer à {{tier}}",
    "subscribeTo": "S'abonner à {{tier}}",
    "loading": "Chargement…",
    "viewAllPlans": "Voir tous les abonnements",
    "monthly": "Mensuel",
    "yearly": "Annuel",
    "discount": "Réduction",
    "mostChosen": "Le plus choisi",
    "yourPlan": "Ton plan",
    "perYear": "/an facturé",
    "savePerYear": "Économise {{amount}} €/an",
    "yearlyBadge": "2 mois et plus offerts",
    "tryFree": "Essaie {{plan}} gratuitement",
    "currentPlan": "Plan actuel",
    "payAfterTrial": "Tu ne paies qu'après ta période d'essai",
    "lessFeatures": "Moins de fonctionnalités",
    "moreFeatures": "+ {{count}} fonctionnalités de plus",
    "subscriptionExpired": "Ton abonnement a expiré. Renouvelle ton abonnement pour appliquer des modifications.",
    "allOfPlanPlus": "Tout {{plan}}, plus :",
    "bestValue": "Meilleur rapport qualité-prix",
    "compareAll": "Comparer toutes les fonctionnalités",
    "hideComparison": "Masquer la comparaison",
    "includedFeatures": "Fonctionnalités incluses",
    "states": {
      "neverTrialedDescription": "{{days}} jours d'accès complet. Aucune carte bancaire requise.",
      "postTrialDescription": "Tes données sont conservées. Choisis un abonnement pour continuer.",
      "paidLowerDescription": "Cette fonctionnalité fait partie de {{tier}}. Passe au plan supérieur quand tu es prêt."
    },
    "cta": {
      "viewPlans": "Voir les abonnements",
      "comparePlans": "Comparer les abonnements",
      "managePlan": "Gérer l'abonnement"
    },
    "featurePreview": {
      "intro": "Ce que tu obtiens pendant ta période d'essai :"
    },
    "dataSummary": {
      "matches_one": "combat",
      "matches_other": "combats",
      "opponents_one": "adversaire",
      "opponents_other": "adversaires",
      "trainings_one": "entraînement",
      "trainings_other": "entraînements",
      "retention": "Tout est conservé. Passe au plan supérieur pour t'en resservir.",
      "matches_many": "combats",
      "opponents_many": "adversaires",
      "trainings_many": "entraînements"
    }
  },
  "plans": {
    "basis": {
      "description": "Enregistre tes combats, suis ta progression et apprends à connaître tes adversaires"
    },
    "pro": {
      "description": "Découvre les schémas de ton judo, évite le surentraînement et progresse de façon ciblée comme judoka"
    },
    "max": {
      "description": "Contrôle total : tableaux de bord coach, plans tactiques et bientôt des analyses IA"
    }
  },
  "tierNames": {
    "free": "Gratuit",
    "basis": "Starter",
    "pro": "Pro",
    "max": "Elite"
  },
  "featureGroups": {
    "basic": "Base",
    "analysis": "Analyse et bilan",
    "clubSocial": "Club et social",
    "advanced": "Avancé",
    "limits": "Limites",
    "matches": "Combats et adversaires",
    "stats": "Statistiques et analyse",
    "training": "Entraînement et charge",
    "development": "Développement et bilan",
    "tracking": "Mesures et club"
  },
  "featureNames": {
    "matches_add": "Enregistre chaque combat",
    "matches_view": "Consulte tes résultats et ta progression",
    "stats_basic": "Vois ton taux de victoires/défaites",
    "opponents_simple": "Connais tes adversaires",
    "reflections": "Construis ton carnet d'apprentissage personnel",
    "data_integrity": "Garde tes données en ordre",
    "club_membership": "Entraîne-toi avec ton club",
    "match_plans": "Plan + points d'apprentissage par adversaire",
    "grip_tracking": "Améliore ton kumi-kata",
    "tracking_basic": "Suis tes mesures corporelles",
    "tracking_full": "Vois les tendances de tes mesures",
    "pop_basic": "Fixe tes objectifs de développement",
    "pop_full": "Relie tes objectifs à tes résultats",
    "pop_coach": "Accompagne tes judokas de façon ciblée",
    "training_basic": "Enregistre tes entraînements",
    "training_load": "Évite le surentraînement",
    "training_coach": "Suis tous tes judokas",
    "stats_advanced": "Découvre les schémas de ton judo",
    "stats_explorer": "Analyse toutes tes données à ta façon",
    "coach_cockpit": "Tableau de bord d'aperçu de l'équipe"
  },
  "featureDescriptions": {
    "matches_add": "Enregistre chaque combat avec la projection, le score et l'adversaire",
    "matches_view": "Consulte tes résultats, tes taux de victoire et ta progression par tournoi",
    "stats_basic": "Aperçu de ton taux de victoires/défaites par tournoi et par période",
    "stats_advanced": "Découvre les schémas de tes projections, de ton ne-waza et de tes shidos dans le temps",
    "stats_explorer": "Filtre, combine et analyse toutes tes données de combat exactement comme tu le souhaites",
    "opponents_simple": "Note les forces, les faiblesses et le style de tes adversaires",
    "reflections": "Écris tes points d'apprentissage après chaque combat et construis un carnet personnel",
    "data_integrity": "Alertes automatiques en cas de données de combat manquantes ou contradictoires",
    "club_membership": "Rejoins un club de judo et partage tes données avec ton équipe",
    "match_plans": "Écris ton approche avant le combat. Note ensuite tes points d'apprentissage. Partageable avec ton club ou tes coachs.",
    "grip_tracking": "Enregistre et analyse ton kumi-kata par combat",
    "tracking_basic": "Suis ton poids, ta taille et d'autres mesures",
    "tracking_full": "Suis les tendances de tes mesures avec des graphiques et des comparaisons",
    "pop_basic": "Fixe des objectifs de développement et avance vers eux pas à pas",
    "pop_full": "Vois directement comment tes objectifs se rapportent à tes résultats de combat",
    "pop_coach": "Consulte la progression et les objectifs de tes judokas en un seul endroit",
    "training_basic": "Enregistre tes entraînements avec leur durée, leur intensité et leur type",
    "training_load": "Évite le surentraînement en suivant la charge par rapport à la récupération",
    "training_coach": "Consulte la charge d'entraînement et la progression de tous tes judokas",
    "coach_cockpit": "Un seul tableau de bord avec les KPI, les signaux d'alerte et le suivi de tous tes judokas"
  },
  "limitNames": {
    "max_clubs": "Adhésions à des clubs",
    "max_matches_per_month": "Combats max par mois",
    "max_matches_total": "Combats max au total",
    "max_opponents": "Adversaires max",
    "max_training_logs_per_month": "Entraînements max par mois",
    "max_pop_goals": "Objectifs PDI max"
  },
  "limitValues": {
    "unlimited": "Illimité"
  },
  "comingSoon": {
    "badge": "Bientôt",
    "statsExplorer": "Analyse toutes tes données à ta façon",
    "statsExplorerDescription": "Filtre, combine et analyse toutes tes données de combat exactement comme tu le souhaites",
    "customReports": "Crée tes propres rapports",
    "customReportsDescription": "Choisis tes données, ta période et ton type de graphique : liberté totale pour découvrir des analyses",
    "aiInsights": "Analyses pilotées par l'IA",
    "aiInsightsDescription": "Laisse l'IA repérer des schémas que tu pourrais manquer"
  },
  "limits": {
    "atLimitTitle": "Limite atteinte",
    "atLimitDescription": "Tu as atteint le maximum de {{max}} pour {{limit}} ({{current}}/{{max}}). Passe à un plan supérieur pour en ajouter davantage.",
    "approachingTitle": "Bientôt à ta limite",
    "approachingDescription": "Tu as utilisé {{current}} sur {{max}} pour {{limit}}. Tu peux encore en ajouter {{remaining}}."
  },
  "freeLimit": {
    "freeTitle": "Essaie JudoLytics avec {{max}} combats gratuits",
    "freeDescription": "Enregistre jusqu'à {{max}} combats et découvre ce que JudoLytics peut faire pour toi.",
    "matchProgress": "{{current}} sur {{max}} combats gratuits",
    "matchesRemaining": "Encore {{remaining}} combats gratuits",
    "limitReached": "Tu as déjà enregistré {{max}} combats gratuits",
    "limitReachedDescription": "Démarre une période d'essai pour enregistrer des combats sans limite.",
    "addFirstMatch": "Enregistre ton premier combat",
    "freeMatches": "{{max}} combats gratuits · aucune carte bancaire requise",
    "continueMatches": "Ou enregistre un autre combat gratuit ({{remaining}} restant(s))"
  },
  "loading": "Chargement…",
  "feedback": {
    "toast": {
      "notLoggedIn": "Non connecté",
      "thankYou": "Merci pour ton retour !",
      "sendError": "Échec de l'envoi du retour",
      "submitted": "Nous examinerons ton signalement au plus vite.",
      "tryAgainLater": "Réessaie plus tard."
    },
    "giveFeedback": "Donner un retour",
    "types": {
      "bug": "Bug",
      "feature": "Idée",
      "other": "Autre"
    },
    "dialog": {
      "whatToReport": "Que veux-tu signaler ?",
      "describeLabel": "Décris ton retour",
      "placeholder": "Sois aussi précis que possible. Qu'attendais-tu ? Que s'est-il passé ?",
      "minChars": "Au moins {{min}} caractères (encore {{remaining}})",
      "autoInfo": "Nous joignons automatiquement ta page, ton navigateur et les infos de ton compte",
      "screenshotLabel": "Capture d'écran (facultatif)",
      "dropzoneText": "Glisse une image, colle (Ctrl+V) ou clique pour l'importer",
      "sending": "Envoi…",
      "submit": "Envoyer le retour",
      "helpImprove": "Aide-nous à améliorer JudoLytics"
    }
  },
  "invitations": {
    "toast": {
      "sent": "Invitation envoyée",
      "sendError": "Échec de l'invitation",
      "joined": "Tu es maintenant membre de {{club}} !",
      "acceptError": "Impossible d'accepter l'invitation",
      "revoked": "Invitation révoquée",
      "revokeError": "Impossible de révoquer l'invitation",
      "emailFailed": "E-mail non envoyé",
      "emailFailedDescription": "L'invitation a été créée mais l'e-mail n'a pas pu être envoyé. Vérifie la configuration des e-mails."
    },
    "status": {
      "pending": "En attente",
      "accepted": "Acceptée",
      "expired": "Expirée",
      "revoked": "Révoquée"
    },
    "invalidEmail": "Saisis une adresse e-mail valide",
    "emailPlaceholder": "nom@exemple.fr",
    "send": "Envoyer",
    "sentInvitations": "Invitations envoyées",
    "revoke": "Révoquer",
    "showMore": "Afficher {{count}} de plus"
  },
  "layout": {
    "shortcutsTooltip": "Raccourcis clavier (?)",
    "logout": "Se déconnecter",
    "loggingOut": "Déconnexion…",
    "logoHome": "Vers le tableau de bord",
    "searchTrigger": {
      "placeholder": "Recherche des combats, des adversaires, et plus…",
      "ariaLabel": "Ouvrir la recherche ({{shortcut}})"
    },
    "roleBadge": {
      "admin": "Admin",
      "support": "Support"
    },
    "planLabel": "Plan {{tier}}",
    "menu": "Menu",
    "userMenu": {
      "trigger": "Menu du compte",
      "settings": "Paramètres",
      "language": "Langue",
      "help": "Aide et explications",
      "feedback": "Donner un retour",
      "logout": "Se déconnecter",
      "loggingOut": "Déconnexion…"
    },
    "sidebar": {
      "collapse": "Replier",
      "expand": "Déplier"
    },
    "shortcuts": {
      "label": "Raccourcis clavier",
      "toggle": "Afficher/masquer les raccourcis clavier",
      "newMatch": "Nouveau combat",
      "goToDashboard": "Aller au tableau de bord",
      "goToMatches": "Aller aux combats",
      "goToStats": "Aller aux statistiques",
      "goToOpponents": "Aller aux adversaires",
      "search": "Rechercher (si disponible)",
      "closeDialog": "Fermer la boîte de dialogue",
      "pressToOpen": "Appuie sur ? pour ouvrir cette fenêtre"
    }
  },
  "quickCreate": {
    "trigger": "Ajout rapide",
    "title": "Que veux-tu ajouter ?",
    "description": "Choisis ce que tu veux enregistrer.",
    "match": "Combat",
    "matchDescription": "Analyser un nouveau combat",
    "training": "Entraînement",
    "trainingDescription": "Enregistrer une séance d'entraînement",
    "measurement": "Mesure",
    "measurementDescription": "Mesure corporelle ou test",
    "recovery": "Récupération",
    "recoveryDescription": "Remplir le bilan de récupération",
    "coachSection": "Pour ton groupe",
    "personalSection": "Pour toi"
  },
  "notifications": {
    "toast": {
      "paymentFailed": "Échec du paiement",
      "subscriptionCanceling": "L'abonnement est en cours de résiliation",
      "clubInvite": "Tu es invité comme {{role}} au club {{name}}.",
      "freeAccount": "Compte gratuit"
    },
    "trialEnding": "La période d'essai se termine dans {{count}} jour",
    "trialEnding_other": "La période d'essai se termine dans {{count}} jours",
    "trialEndingDescription": "Après ta période d'essai, ton premier paiement sera prélevé.",
    "trialExpired": "Ta période d'essai a expiré",
    "trialExpiredDescription": "Choisis un abonnement pour conserver les fonctionnalités premium.",
    "pastDueDescription": "Mets à jour tes informations de paiement pour conserver l'accès.",
    "cancelPendingDescription": "Ton abonnement s'arrête le {{date}}.",
    "planChangeScheduled": "Changement de plan programmé",
    "planChangeDescription": "Ton plan passera à {{plan}} le {{date}}.",
    "clubInviteTitle": "Invitation pour {{name}}",
    "freeAccountDescription": "Passe à un abonnement payant pour toutes les fonctionnalités.",
    "title": "Notifications",
    "typeWarning": "Avertissement",
    "typeAction": "Action",
    "typeInfo": "Info",
    "actionsRequired": "{{count}} action requise",
    "actionsRequired_other": "{{count}} actions requises",
    "noActions": "Aucune action en attente",
    "empty": "Aucune notification",
    "emptyTitle": "Tu es à jour",
    "emptyDescription": "Il n'y a aucune nouvelle notification. Nous te préviendrons s'il y a du nouveau.",
    "manageSettings": "Paramètres de notification",
    "markAllRead": "Tout marquer comme lu",
    "dismiss": "Supprimer",
    "timeJustNow": "À l'instant",
    "timeMinutes": "il y a {{count}} min",
    "timeHours": "il y a {{count}} h",
    "timeDays": "il y a {{count}} jour",
    "timeDays_other": "il y a {{count}} jours",
    "groupToday": "Aujourd'hui",
    "groupYesterday": "Hier",
    "groupEarlier": "Plus tôt",
    "orphanedPushHint": "Les notifications push sont activées, mais aucun appareil n'est connecté. Réactiver"
  },
  "referral": {
    "extendedTrial": "Tu reçois {{days}} jours de période d'essai gratuite (au lieu de 7 jours)",
    "welcomeBanner": "{{name}} t'a invité sur JudoLytics !"
  },
  "trial": {
    "startButton": "Démarrer l'essai gratuit ({{days}} jours)",
    "startTitle": "Essaie JudoLytics Pro gratuitement",
    "startDescription": "{{days}} jours d'accès gratuit à toutes les fonctionnalités Pro. Aucune carte bancaire requise.",
    "skipButton": "Décider plus tard",
    "noCreditCard": "Aucune carte bancaire requise",
    "startedTitle": "Période d'essai démarrée !",
    "startedDescription": "Tu as {{days}} jours d'accès Pro.",
    "errorNotLoggedIn": "Connecte-toi pour démarrer une période d'essai.",
    "features": {
      "matches": "Analyser des combats",
      "opponents": "Suivre des adversaires",
      "stats": "Statistiques et analyses",
      "training": "Suivre l'entraînement"
    },
    "freeTitle": "Essaie toutes les fonctionnalités",
    "freeDescription": "Démarre une période d'essai gratuite et découvre ce que JudoLytics peut faire pour toi.",
    "postTrialTitle": "Ta période d'essai est terminée",
    "postTrialDescription": "Tes données sont conservées. Choisis un abonnement pour continuer.",
    "upgradeButton": "Voir les abonnements",
    "bannerDays": "Ta période d'essai dure encore {{count}} jour",
    "bannerDays_other": "Ta période d'essai dure encore {{count}} jours",
    "bannerUrgent": "Ta période d'essai expire dans {{hours}} heures !",
    "subscribeNow": "S'abonner maintenant",
    "bannerPayAfter": "Abonne-toi maintenant, ne paie qu'après ta période d'essai",
    "waitlistBonusTitle": "Bonus liste d'attente",
    "waitlistBonusDescription": "Tu as reçu des jours d'essai supplémentaires parce que tu t'es inscrit via la liste d'attente !",
    "notNowExplore": "Pas maintenant, je découvre d'abord"
  },
  "subscriptionStatus": {
    "noSubscription": "Aucun abonnement"
  },
  "not_found": {
    "message": "Oups ! Page introuvable",
    "return_home": "Retour à l'accueil"
  },
  "errorPages": {
    "notFound": {
      "title": "Page introuvable",
      "code": "404",
      "subtitle": "La page que tu cherches n'existe pas ou a été déplacée.",
      "subtitleDashboard": "Cette page n'existe pas. Vérifie l'URL ou reviens en arrière.",
      "goHome": "Aller à l'accueil",
      "goDashboard": "Aller au tableau de bord",
      "goBack": "Revenir en arrière",
      "viewMatches": "Voir les combats",
      "viewOpponents": "Voir les adversaires"
    },
    "serverError": {
      "title": "Une erreur s'est produite",
      "code": "500",
      "subtitle": "Une erreur inattendue s'est produite. Réessaie plus tard.",
      "reportProblem": "Signaler un problème",
      "retry": "Réessayer",
      "reloadPage": "Recharger la page"
    },
    "accessDenied": {
      "title": "Accès refusé",
      "code": "403",
      "subtitle": "Tu n'as pas accès à cette page.",
      "requiredRole": "Cette page est réservée à {{role}}.",
      "contactAdmin": "Contacte le gestionnaire de ton club",
      "upgradePlan": "Passe à un plan supérieur",
      "goBack": "Revenir en arrière",
      "goDashboard": "Aller au tableau de bord"
    },
    "roleTimeout": {
      "title": "Connexion lente",
      "subtitle": "Ton rôle n'a pas pu être vérifié à cause d'une connexion lente ou absente. Réessaie.",
      "retry": "Réessayer"
    },
    "maintenance": {
      "title": "Nous effectuons une mise à jour",
      "subtitle": "JudoLytics est temporairement indisponible pour une maintenance planifiée. Nous serons de retour au plus vite.",
      "estimatedReturn": "Retour prévu : {{time}}",
      "statusPage": "Voir la page d'état",
      "contactUs": "Nous contacter"
    }
  },
  "externalLinks": {
    "viewMatchOnJudoTV": "Voir ce combat sur JudoTV",
    "viewVideosOnJudoTV": "Voir les vidéos sur JudoTV",
    "viewMatchDataOnJudobase": "Voir les données du combat sur Judobase",
    "viewCompetitionOnIJF": "Voir la compétition sur IJF.org",
    "opponentLabel": "Adversaire",
    "viewOpponentOnIJF": "Voir l'adversaire sur IJF.org",
    "viewCompetitionOnJM": "Voir la compétition sur JudoManager",
    "viewProfileOnJudobase": "Voir le profil sur Judobase",
    "ijfProfileLabel": "Profil IJF",
    "viewProfileOnIJF": "Voir le profil sur IJF.org",
    "viewProfileOnJM": "Voir le profil sur JudoManager",
    "viewAltProfileOnJM": "Voir le profil JudoManager alternatif"
  },
  "offlineBanner": {
    "title": {
      "offline": "Tu es hors ligne",
      "slow": "Connexion lente"
    },
    "lastSynced": "Dernière synchronisation {{relativeTime}}",
    "noCache": "Aucune donnée locale. Connecte-toi à Internet pour charger.",
    "helpLink": "Qu'est-ce que cela signifie ?",
    "dataAge": {
      "updatedAt": "Données mises à jour pour la dernière fois à {{time}}"
    }
  },
  "offline": {
    "prepare": {
      "button": "Prêt pour le hors ligne",
      "preparing": "Préparation en cours…",
      "done": "Prêt — {{n}} éléments enregistrés en local",
      "partial": "Prêt — {{n}} sur {{total}} réussis",
      "skippedSlowConnection": "Ignoré — connexion trop lente pour le préchargement",
      "error": "Échec de la préparation. Réessaie avec une meilleure connexion."
    },
    "storage": {
      "nearlyFull": "Stockage local presque plein ({{usageMB}} / {{quotaMB}} Mo). L'ancien cache est nettoyé."
    },
    "queued": {
      "message": "Sera envoyé dès que tu auras de nouveau une connexion"
    },
    "permanentFail": {
      "description": "La modification n'a pas pu être enregistrée : {{reason}}",
      "discard": "Supprimer"
    },
    "pending": {
      "badge": "{{count}} en attente de connexion",
      "badgeOne": "1 modification en attente de connexion",
      "title": "Modifications non envoyées",
      "empty": "Toutes les modifications sont synchronisées",
      "retry": "Réessaie",
      "retrying": "Nouvel envoi en cours…",
      "remove": "Retirer de la file d'attente",
      "statusPending": "En attente de connexion",
      "statusSyncing": "Envoi en cours",
      "statusFailed": "Échec",
      "statusConflict": "Conflit"
    },
    "reloginRequired": {
      "title": "Session expirée",
      "description": "Tu as {{count}} modifications non envoyées. Reconnecte-toi pour les conserver.",
      "descriptionOne": "Tu as 1 modification non envoyée. Reconnecte-toi pour la conserver.",
      "loginButton": "Se reconnecter",
      "later": "Plus tard"
    },
    "label": {
      "recoveryUpsert": "Bilan de récupération {{date}}",
      "measurementInsert": "Mesure {{metric}}",
      "measurementDelete": "Supprimer la mesure",
      "opponentNoteInsert": "Note sur l'adversaire",
      "opponentNoteUpdate": "Mettre à jour la note",
      "opponentInsert": "Adversaire {{name}}",
      "tournamentInsert": "Tournoi {{name}}",
      "matchInsert": "Enregistrer le combat",
      "matchUpdate": "Mettre à jour le combat",
      "matchDelete": "Supprimer le combat",
      "matchFields": "Mettre à jour les champs du combat",
      "matchPlanInsert": "Enregistrer le plan de combat",
      "matchPlanUpdate": "Mettre à jour le plan de combat",
      "matchPlanDelete": "Supprimer le plan de combat",
      "matchReflectionUpsert": "Enregistrer le bilan de combat",
      "reflectionInsert": "Enregistrer le bilan",
      "reflectionUpdate": "Mettre à jour le bilan",
      "measurementSessionInsert": "Enregistrer la session de mesure",
      "measurementSessionUpdate": "Mettre à jour la session de mesure",
      "measurementSessionDelete": "Supprimer la session de mesure",
      "trainingSessionInsert": "Enregistrer l'entraînement",
      "trainingSessionUpdate": "Mettre à jour l'entraînement",
      "trainingSessionDelete": "Supprimer l'entraînement",
      "trainingSeriesDelete": "Supprimer la série d'entraînements",
      "trainingSeriesTruncate": "Raccourcir la série d'entraînements",
      "popIndicatorUpdate": "Mettre à jour l'indicateur PDI",
      "scoreInsert": "Ajouter un score",
      "scoreDelete": "Supprimer le score"
    },
    "swUpdate": {
      "title": "Mise à jour de l'app disponible",
      "description": "Tu as {{count}} modifications non synchronisées. Touche pour mettre à jour une fois qu'elles sont synchronisées.",
      "applyNow": "Mettre à jour maintenant"
    },
    "help": {
      "title": "Travailler hors ligne dans JudoLytics",
      "intro": "JudoLytics fonctionne aussi sans Internet. Pratique dans les dojos et les halls de tournoi où le wifi est souvent mauvais. Nous t'expliquons ci-dessous comment savoir si tu es hors ligne, ce qui fonctionne et comment gérer tes données.",
      "statusIcons": {
        "heading": "Que signifient les icônes d'état ?",
        "online": {
          "title": "En ligne — tout est enregistré immédiatement",
          "body": "Aucune bannière visible. Les modifications vont directement vers le serveur."
        },
        "offline": {
          "title": "Hors ligne — tes modifications attendent dans une file d'attente locale",
          "body": "Une bannière jaune apparaît en haut. Tu peux normalement enregistrer des combats, des entraînements et des mesures. Tout est envoyé automatiquement dès que la connexion revient."
        },
        "pending": {
          "title": "Modifications non envoyées",
          "body": "Un badge dans l'en-tête indique combien de modifications attendent. Touche-le pour voir la liste et l'option de synchronisation manuelle."
        },
        "stale": {
          "title": "Modifications de plus de 3 à 5 jours",
          "body": "Un avertissement rouge apparaît si tu restes hors ligne plus longtemps que ce qu'iOS autorise (3 jours) ou que notre marge de sécurité (5 jours). Synchronise au plus vite pour éviter toute perte de données."
        }
      },
      "worksOffline": {
        "heading": "Qu'est-ce qui fonctionne hors ligne ?",
        "items": [
          "Saisir des combats via l'assistant de combat (les 5 étapes)",
          "Enregistrer et modifier des entraînements",
          "Ajouter ou supprimer des mesures",
          "Remplir le bilan de récupération",
          "Créer des adversaires et ajouter des notes",
          "Écrire et modifier des plans de combat",
          "Mettre à jour les indicateurs PDI et enregistrer des bilans",
          "Consulter les données déjà synchronisées (listes, statistiques, profil)"
        ],
        "note": "Pas en hors ligne : les paiements, les invitations de club, les paramètres des notifications push et les autres actions qui doivent communiquer directement avec le serveur."
      },
      "faq": {
        "heading": "Questions fréquentes",
        "q1": {
          "question": "Comment savoir si mon entraînement est enregistré ?",
          "answer": "Un message vert confirme que la modification est synchronisée. En hors ligne, tu vois à la place un message « Sera envoyé dès que tu auras de nouveau une connexion » et la modification apparaît dans le badge en attente de l'en-tête. Dès que la connexion revient, JudoLytics synchronise automatiquement et le badge disparaît."
        },
        "q2": {
          "question": "Que se passe-t-il si j'éteins mon téléphone alors que des modifications attendent encore ?",
          "answer": "Tes modifications restent enregistrées en sécurité dans le stockage local de ton appareil. Quand tu rouvres JudoLytics, l'app reprend la synchronisation dès que tu as Internet. Sur iOS, nous te conseillons de ne pas utiliser la PWA hors ligne pendant plus de 3 jours. Safari peut sinon effacer le stockage de lui-même."
        },
        "q3": {
          "question": "Et si je ferme la PWA par erreur pendant un tournoi ?",
          "answer": "Pas de panique. Ton dernier brouillon d'assistant de combat est conservé : si tu rouvres l'assistant, tu reprends automatiquement à l'étape où tu en étais. Les combats déjà saisis qui attendent la synchronisation sont aussi conservés."
        },
        "q4": {
          "question": "Mon coach ne voit pas mes modifications. Que faire ?",
          "answer": "Vérifie le badge en attente dans ton en-tête. S'il affiche un chiffre, tes modifications attendent encore une connexion. Touche l'icône éclair pour synchroniser manuellement. Si ça ne marche pas, vérifie que tu es vraiment en ligne (la bannière a disparu ?) et déconnecte-toi puis reconnecte-toi si besoin."
        },
        "q5": {
          "question": "Combien d'espace JudoLytics utilise-t-il sur mon appareil ?",
          "answer": "La PWA met en cache environ 7 à 10 Mo pour l'app elle-même, plus tes propres données. Sur iOS, le maximum est de 50 Mo pour les PWA. JudoLytics avertit automatiquement quand le stockage est presque plein et nettoie l'ancien cache."
        },
        "q6": {
          "question": "Une page reste vide ou affiche un indicateur de chargement alors que je suis hors ligne. Pourquoi ?",
          "answer": "Hors ligne, nous ne pouvons afficher que les pages que tu as déjà ouvertes en ligne. Lors d'une nouvelle installation ou pour une page que tu n'as jamais visitée sans réseau, elle reste vide jusqu'au retour de la connexion. Astuce : avant un tournoi ou un entraînement, ouvre toutes les pages dont tu penses avoir besoin (combats, mesures, adversaires). Elles resteront alors disponibles dans le hall."
        }
      },
      "clearData": {
        "heading": "Effacer les données locales",
        "body": "Tu veux céder ton appareil ou repartir de zéro ? Efface alors ton cache hors ligne local. S'il te reste des modifications non synchronisées, nous t'avertissons avant qu'elles ne disparaissent.",
        "cta": "Ouvrir les paramètres de confidentialité"
      }
    },
    "stale": {
      "title": "Modifications non synchronisées",
      "description": "Tu as {{count}} modifications vieilles de {{oldestAgeDays}} jours. Connecte-toi à Internet pour les conserver, sinon elles risquent d'être perdues.",
      "syncNow": "Synchroniser maintenant"
    },
    "clearData": {
      "trigger": "Effacer les données enregistrées en local",
      "title": "Effacer les données locales ?",
      "description": "Cela supprime le cache hors ligne et toutes les pages visibles sans connexion.",
      "warningPending": "Tu as {{count}} modifications non synchronisées qui seront perdues. Synchronise d'abord si tu veux les conserver.",
      "confirm": "Effacer",
      "cancel": "Annuler",
      "success": "Données locales effacées",
      "error": "Impossible d'effacer les données locales. Réessaie."
    },
    "fallback": {
      "title": "Aucune donnée locale à afficher",
      "titleForPage": "Aucun(e) {{page}} encore enregistré(e) en local",
      "bodyOffline": "Tu n'as pas encore ouvert cette page en ligne, il n'y a donc rien à afficher hors ligne. Connecte-toi à Internet pour charger le contenu. Une fois la page chargée, elle reste disponible même sans réseau.",
      "bodyOnline": "Nous récupérons encore tes données. Cela prend parfois un peu plus de temps avec une connexion lente.",
      "retry": "Réessayer",
      "learnMore": "Comment fonctionne le hors ligne ?"
    },
    "audit": {
      "loading": "Chargement du journal d'audit…",
      "heading": "Corrections écrasées par d'autres",
      "intro": "Quand quelqu'un modifie hors ligne une ligne que tu as entre-temps modifiée en ligne, cette personne peut choisir, via le résolveur de conflits, d'écraser ta version. Tu vois ci-dessous quelles corrections sont concernées.",
      "rowDescription": "Ligne {{rowId}}",
      "partOfBatch": "(fait partie d'un choix groupé)",
      "retentionNotice": "Les enregistrements d'audit sont conservés 90 jours puis supprimés automatiquement.",
      "tables": {
        "matches": "Combat",
        "match_plans": "Plan de combat",
        "opponent_notes": "Note sur l'adversaire",
        "opponents": "Adversaire",
        "measurements": "Mesure",
        "measurement_sessions": "Session de mesure",
        "training_sessions": "Entraînement",
        "goal_check_ins": "Bilan",
        "goal_indicators": "Indicateur PDI",
        "recovery_checkins": "Bilan de récupération"
      }
    },
    "lww": {
      "title": "La modification a été annulée",
      "description": "Quelqu'un avait déjà mis à jour {{domain}} en ligne. La version en ligne est de nouveau affichée.",
      "undo": "Conserver quand même ma version",
      "undoApplied": "Ta version a été rétablie",
      "undoFailed": "Le rétablissement a échoué. Réessaie.",
      "domain": {
        "recovery": "ton bilan de récupération",
        "measurements": "cette mesure",
        "measurementSessions": "cette session de mesure",
        "opponentNotes": "cette note sur l'adversaire",
        "opponents": "cet adversaire",
        "matches": "ce combat",
        "matchPlans": "ce plan de combat",
        "reflections": "ce bilan",
        "training": "cet entraînement",
        "pop": "cet élément du PDI"
      }
    },
    "conflict": {
      "title": "La modification entre en conflit avec une autre mise à jour",
      "description_one": "Il y a {{count}} conflit à examiner",
      "description_other": "Il y a {{count}} conflits à examiner",
      "description": "Il y a {{count}} conflits à examiner",
      "empty": "Tous les conflits sont résolus",
      "queueProgress": "{{current}} sur {{total}}",
      "resolve": "Examiner",
      "serverHeading": "Version en ligne :",
      "localHeading": "Ta version :",
      "editedBy": "Modifié par {{name}}, il y a {{time}}",
      "fields": {
        "local": "Ma modification hors ligne",
        "server": "Version en ligne actuelle"
      },
      "fieldNotes": "note",
      "fieldReflection": "bilan",
      "matchPlanFields": {
        "strategy_notes": "Stratégie",
        "strengths_to_exploit": "Points forts",
        "risks_to_avoid": "Risques"
      },
      "reflectionFields": {
        "reflection_good": "Qu'est-ce qui s'est bien passé ?",
        "reflection_improve": "Qu'est-ce qui peut être amélioré ?",
        "reflection_actions": "Points d'action et apprentissages"
      },
      "merge": {
        "fieldChooser": "Quelle version pour {{field}} ?"
      },
      "actions": {
        "keepLocal": "Ma version",
        "keepLocalHint": "Créé il y a {{time}} ({{device}})",
        "keepServer": "Version en ligne",
        "keepServerHint": "Modifié par {{name}}, il y a {{time}}",
        "merge": "Fusionner",
        "saveMerge": "Enregistrer la version fusionnée",
        "cancel": "Annuler",
        "someoneElse": "quelqu'un d'autre"
      },
      "batch": {
        "heading": "{{count}} conflits dans la file d'attente",
        "description": "Résous-les en une fois ou traite-les un par un.",
        "keepAllLocal": "Conserver toutes mes modifications ({{count}})",
        "keepAllServer": "Conserver toutes les versions en ligne ({{count}})"
      },
      "resolveFailed": "L'enregistrement de ton choix a échoué. L'élément est dans la file d'attente comme échec. Réessaie plus tard.",
      "batchPartialFail": "{{resolved}} résolu(s), {{failed}} échoué(s). Les éléments en échec sont dans la file d'attente.",
      "resolveRetryLater": "L'enregistrement de ton choix n'a pas encore réussi (problème réseau). Le conflit reste affiché. Réessaie plus tard.",
      "unknownDomain": "Domaine inconnu : {{domain}}",
      "description_many": "Il y a {{count}} conflits à examiner"
    }
  },
  "voiceInput": {
    "startAriaLabel": "Démarrer la dictée vocale",
    "stopAriaLabel": "Arrêter la dictée vocale",
    "consentTitle": "Utiliser la dictée vocale ?",
    "consentDescription": "Ton microphone est activé et l'audio est traité par la reconnaissance vocale de ton navigateur (Apple/Google). JudoLytics ne voit jamais l'audio brut. Continuer ?",
    "consentAccept": "Activer",
    "consentCancel": "Annuler",
    "interimPrefix": "À l'écoute…",
    "errors": {
      "permissionDenied": "Accès au microphone refusé. Autorise-le dans les paramètres de ton navigateur et réessaie.",
      "noMicrophone": "Aucun microphone trouvé sur cet appareil.",
      "network": "La reconnaissance vocale nécessite une connexion Internet.",
      "langUnsupported": "La dictée vocale n'est pas encore disponible dans ta langue.",
      "unsupported": "Ton navigateur ne prend pas en charge la dictée vocale. Essaie Chrome ou Safari.",
      "insecureContext": "La dictée vocale ne fonctionne que via une connexion sécurisée (HTTPS).",
      "startFailed": "Impossible de démarrer la dictée vocale. Réessaie.",
      "generic": "La dictée vocale s'est arrêtée de façon inattendue."
    }
  },
  "errorBoundary": {
    "networkTitle": "Problème de réseau",
    "networkDescription": "Il y a un problème avec la connexion réseau. Vérifie ta connexion Internet et réessaie.",
    "autoRetried": "Nouvel essai automatique : {{count}}/{{max}}",
    "retry": "Réessayer",
    "updateTitle": "Mise à jour disponible",
    "updateDescription": "Une nouvelle version de l'application est disponible. Recharge la page pour utiliser la dernière version.",
    "reloadPage": "Recharger la page",
    "generalTitle": "Une erreur s'est produite",
    "generalDescription": "Une erreur inattendue s'est produite. Essaie de recharger la page ou contacte le support si le problème persiste.",
    "goToDashboard": "Aller au tableau de bord",
    "showDetails": "Afficher les détails techniques"
  },
  "videoPlayer": {
    "ijfLocked": "Vidéo IJF (abonnement requis)",
    "externalVideo": "Vidéo externe",
    "open": "Ouvrir"
  },
  "badges": {
    "title": "Badges",
    "newBadgeEarned": "Nouveau badge obtenu !",
    "newBadgeEarned_one": "{{count}} nouveau badge obtenu !",
    "newBadgeEarned_other": "{{count}} nouveaux badges obtenus !",
    "names": {
      "first_match": "Premier combat",
      "profile_complete": "Profil complet",
      "first_club_join": "Membre d'un club",
      "match_10": "10 combats",
      "match_50": "50 combats",
      "match_100": "100 combats",
      "match_250": "250 combats",
      "streak_7": "Série de 7 jours",
      "streak_30": "Série de 30 jours",
      "streak_100": "Série de 100 jours",
      "recovery_streak_7": "Série de récupération : 7 jours",
      "recovery_streak_14": "Série de récupération : 14 jours",
      "recovery_streak_30": "Série de récupération : 30 jours",
      "recovery_streak_60": "Série de récupération : 60 jours",
      "recovery_streak_100": "Série de récupération : 100 jours",
      "technique_variety": "Maître des techniques",
      "opponent_variety": "Judoka polyvalent",
      "first_reflection": "Premier point d'apprentissage",
      "reflection_10": "Lucide sur soi",
      "team_player": "Esprit d'équipe",
      "mentor": "Mentor",
      "growing_club": "Club en croissance",
      "thriving_club": "Club florissant",
      "powerhouse": "Locomotive",
      "recruiter": "Recruteur",
      "ambassador": "Ambassadeur"
    },
    "descriptions": {
      "first_match": "Ton premier combat enregistré",
      "profile_complete": "Ton profil est entièrement rempli",
      "first_club_join": "Tu as rejoint ton premier club",
      "match_10": "10 combats enregistrés",
      "match_50": "50 combats enregistrés",
      "match_100": "100 combats enregistrés",
      "match_250": "250 combats enregistrés",
      "streak_7": "7 jours d'affilée enregistrés",
      "streak_30": "30 jours d'affilée enregistrés",
      "streak_100": "100 jours d'affilée enregistrés",
      "recovery_streak_7": "Bilan de récupération rempli 7 jours de suite",
      "recovery_streak_14": "Bilan de récupération rempli 14 jours de suite",
      "recovery_streak_30": "Bilan de récupération rempli 30 jours de suite",
      "recovery_streak_60": "Bilan de récupération rempli 60 jours de suite",
      "recovery_streak_100": "Bilan de récupération rempli 100 jours de suite",
      "technique_variety": "10 projections différentes utilisées",
      "opponent_variety": "Combats contre 20 adversaires différents",
      "first_reflection": "Ton premier point d'apprentissage enregistré",
      "reflection_10": "10 points d'apprentissage enregistrés",
      "team_player": "Contribution active à ton club",
      "mentor": "Données partagées avec ton équipe",
      "growing_club": "Le club a plus de 10 membres",
      "thriving_club": "Le club a plus de 25 membres",
      "powerhouse": "Le club a plus de 50 membres",
      "recruiter": "5 parrainages réussis",
      "ambassador": "10 parrainages réussis"
    },
    "categories": {
      "onboarding": "Intégration",
      "activity": "Activité",
      "streak": "Séries",
      "diversity": "Diversité",
      "reflection": "Bilan",
      "community": "Communauté",
      "club": "Club",
      "referral": "Parrainage"
    },
    "progressLabel": "{{earned}} badges obtenus sur {{total}}",
    "categoryProgressLabel": "Progression du badge : {{current}} sur {{target}}",
    "newBadgeEarned_many": "{{count}} nouveaux badges obtenus !"
  },
  "streaks": {
    "title": "Séries",
    "types": {
      "match_logging": "Enregistrer des combats",
      "training_logging": "Enregistrer l'entraînement",
      "reflection": "Écrire des points d'apprentissage",
      "recovery_checkin": "Faire le bilan de récupération"
    },
    "days": "jours",
    "best": "Record : {{count}} jours"
  },
  "gamification": {
    "dashboardTitle": "Performances",
    "recentBadges": "Badges récents",
    "almostEarned": "Presque obtenu",
    "viewAll": "Voir tous les badges",
    "freshSealLabel": "NOUVEAU",
    "freshSealSublabel": "BADGE",
    "overallProgressLabel": "Progression totale des badges : {{pct}} %",
    "badgeProgressLabel": "Progression vers le badge {{name}}"
  },
  "edgeErrors": {
    "RATE_LIMIT": "Trop de requêtes. Réessaie plus tard.",
    "AUTH_FAILED": "Échec de l'authentification. Reconnecte-toi et réessaie.",
    "NOT_AUTHORIZED": "Tu n'as pas les droits pour cette action.",
    "INTERNAL_ERROR": "Une erreur interne s'est produite. Réessaie plus tard.",
    "ALREADY_SUBSCRIBED": "Tu as déjà un abonnement actif. Utilise le portail client pour modifier ton abonnement.",
    "INVALID_PRICE": "Prix invalide. Contacte le support.",
    "NO_SUBSCRIPTION": "Tu n'as pas encore d'abonnement. Souscris d'abord un abonnement via la page des tarifs.",
    "NO_SCHEDULED_CHANGE": "Aucune modification programmée à annuler.",
    "CANCEL_SCHEDULE_FAILED": "Erreur lors de l'annulation de la modification programmée. Réessaie.",
    "TRIAL_ALREADY_USED": "Tu as déjà bénéficié d'une période d'essai.",
    "EMAIL_NOT_VERIFIED": "Confirme d'abord ton adresse e-mail avant de pouvoir démarrer une période d'essai.",
    "EMAIL_ALREADY_VERIFIED": "Ton adresse e-mail est déjà vérifiée.",
    "VERIFICATION_TOKEN_INVALID": "Ce lien de vérification est invalide ou expiré.",
    "TRIAL_START_FAILED": "Impossible de démarrer la période d'essai. Réessaie.",
    "SUBSCRIPTION_UPDATE_FAILED": "Échec de la mise à jour de l'abonnement.",
    "SYNC_FAILED": "Erreur de synchronisation. Réessaie.",
    "UNKNOWN_STRIPE_PRODUCT": "Produit Stripe inconnu.",
    "NO_STRIPE_PRODUCTS": "L'abonnement Stripe n'a aucun produit.",
    "FETCH_SUBSCRIPTION_FAILED": "Erreur lors de la récupération de l'abonnement.",
    "CAPTCHA_REQUIRED": "Vérification CAPTCHA requise. Actualise la page et réessaie.",
    "CAPTCHA_FAILED": "Échec de la vérification CAPTCHA. Réessaie.",
    "EMAIL_ALREADY_REGISTERED": "Cette adresse e-mail est déjà enregistrée.",
    "REGISTRATION_FAILED": "Échec de l'inscription. Réessaie.",
    "PROFILE_CREATION_FAILED": "Échec de l'inscription : le profil n'a pas pu être créé.",
    "USER_CREATION_FAILED": "Échec de la création de l'utilisateur. Vérifie les informations et réessaie.",
    "CANNOT_INVITE_SELF": "Tu ne peux pas t'inviter toi-même.",
    "NO_INVITE_PERMISSION": "Tu n'as pas les droits pour inviter des membres dans ce club.",
    "CLUB_NOT_FOUND": "Club introuvable.",
    "ALREADY_CLUB_MEMBER": "Cette personne a déjà un compte et est déjà membre de ce club.",
    "ALREADY_HAS_ACCOUNT": "Cette personne a déjà un compte JudoLytics.",
    "INVITATION_CREATE_FAILED": "Impossible de créer l'invitation.",
    "INVITATION_NOT_FOUND": "Invitation introuvable.",
    "INVITATION_NOT_FOR_YOU": "Cette invitation n'est pas pour ton compte.",
    "MAX_INVITATIONS_TODAY": "Tu as atteint le nombre maximum d'invitations pour aujourd'hui. Réessaie demain.",
    "PROFILE_UPDATE_FAILED": "Échec de la mise à jour du profil.",
    "EMAIL_UPDATE_FAILED": "Échec de la mise à jour de l'e-mail.",
    "PASSWORD_UPDATE_FAILED": "Échec de la mise à jour du mot de passe.",
    "ROLE_UPDATE_FAILED": "Échec de la mise à jour du rôle.",
    "USER_DELETE_FAILED": "Échec de la suppression de l'utilisateur.",
    "SUBSCRIPTION_SETTING_FAILED": "Échec de la mise à jour de l'abonnement.",
    "FREE_ACCOUNT_FAILED": "Échec de la configuration du compte gratuit.",
    "MAX_CLUBS_REACHED": "Tu es déjà membre du nombre maximum de clubs pour ton abonnement. Passe à un plan supérieur ou quitte d'abord un club.",
    "MEMBERSHIP_ACTIVATION_FAILED": "Impossible d'activer l'adhésion.",
    "MEMBERSHIP_CREATION_FAILED": "Impossible de créer l'adhésion.",
    "INVITATION_UPDATE_FAILED": "Impossible de mettre à jour l'invitation.",
    "INVALID_OR_EXPIRED_LINK": "Lien invalide ou expiré.",
    "PREFERENCES_SAVE_FAILED": "Impossible d'enregistrer les préférences.",
    "PREFERENCES_FETCH_FAILED": "Impossible de récupérer les préférences.",
    "MISSING_REQUIRED_FIELDS": "Tous les champs obligatoires ne sont pas remplis."
  },
  "reactivation": {
    "banner": "Ton compte sera supprimé dans {{days}} jours. Réactive ton compte pour l'éviter.",
    "banner_0": "Ton compte sera supprimé aujourd'hui. Réactive ton compte pour l'éviter.",
    "reactivate": "Réactiver",
    "reactivating": "Réactivation…",
    "success": "Ton compte a été réactivé avec succès !",
    "error": "Échec de la réactivation. Réessaie."
  },
  "tosReconsent": {
    "title": "Nos conditions ont été mises à jour",
    "description": "Consultez les",
    "tosLink": "Conditions générales",
    "and": "et la",
    "privacyLink": "Politique de confidentialité",
    "accept": "J'accepte",
    "accepting": "En cours…",
    "accepted": "Merci ! Vous avez accepté les conditions mises à jour.",
    "error": "Impossible d'accepter les conditions. Réessayez."
  },
  "pushPrimer": {
    "title": "Reste informé",
    "description": "Reçois des notifications pour ne rien manquer de ta progression au judo.",
    "benefitReminders": "Rappel pour saisir tes combats après un tournoi",
    "benefitLoad": "Alerte quand ta charge d'entraînement devient trop élevée",
    "benefitMotivation": "Motivation lors de nouveaux records personnels et séries",
    "enable": "Activer les notifications",
    "notNow": "Pas maintenant",
    "contextual": {
      "settings": {
        "title": "Les rappels de bilan passent par le push",
        "description": "Active les notifications push pour recevoir chaque matin un signal pour ton bilan, même quand l'app est fermée."
      },
      "tournament": {
        "title": "Un rappel après ton tournoi ?",
        "description": "Reçois le lendemain du tournoi une notification pour saisir tes combats, tant que tout est encore frais."
      },
      "training": {
        "title": "Envie de savoir comment ton entraînement s'est passé ?",
        "description": "Reçois après chaque entraînement prévu une courte notification pour noter comment ça s'est passé."
      },
      "club": {
        "title": "Reste informé de ton club",
        "description": "Reçois une notification dès que ta demande est approuvée et quand ton coach donne un retour."
      },
      "standalone": {
        "title": "Complète ton app",
        "description": "Active les notifications pour que les rappels et les retours du coach t'atteignent directement sur cet appareil."
      }
    }
  },
  "pushBanner": {
    "title": "Ne manque aucun rappel",
    "description": "Active les notifications pour recevoir des rappels et des mises à jour.",
    "benefitMatches": "Rappels de combats",
    "benefitLoad": "Rappels d'entraînement",
    "enable": "Activer",
    "later": "Plus tard"
  },
  "progress": {
    "percentage": "{{value}} % de progression"
  },
  "pwaInstall": {
    "bannerTitle": "Installe JudoLytics sur ton appareil",
    "bannerDescription": "Ajoute JudoLytics à ton écran d'accueil pour la meilleure expérience.",
    "benefitFast": "Chargement plus rapide",
    "benefitNotifications": "Notifications push",
    "benefitOffline": "Fonctionne hors ligne",
    "benefitHomeScreen": "Icône d'app dédiée",
    "installButton": "Installer",
    "later": "Plus tard",
    "iosTitle": "Installe JudoLytics",
    "iosDescription": "Ajoute JudoLytics à ton écran d'accueil en trois étapes. Il fonctionnera alors comme une vraie app.",
    "iosStep1Title": "Touche l'icône Partager",
    "iosStep1Desc": "Le petit carré avec la flèche vers le haut, dans la barre en bas de ton écran.",
    "iosStep2Title": "Choisis « Sur l'écran d'accueil »",
    "iosStep2Desc": "Dans le menu de partage, fais défiler vers le bas et touche « Sur l'écran d'accueil ».",
    "iosStep3Title": "Confirme avec « Ajouter »",
    "iosStep3Desc": "Touche « Ajouter » en haut à droite. JudoLytics apparaît maintenant sur ton écran d'accueil.",
    "iosShareLabel": "Partager",
    "iosAddLabel": "Sur l'écran d'accueil",
    "iosDoneHint": "Après l'installation, JudoLytics s'ouvre comme une app à part entière, avec notifications push et accès hors ligne.",
    "openInAppTitle": "L'app JudoLytics est installée",
    "openInAppDescription": "Ouvre l'app pour la meilleure expérience avec notifications push et accès hors ligne.",
    "openApp": "Ouvrir l'app"
  },
  "table": {
    "sortBy": "Trier par {{column}}",
    "sortedAscending": "Trié par ordre croissant",
    "sortedDescending": "Trié par ordre décroissant",
    "notSorted": "Non trié"
  },
  "optionalFields": {
    "show_one": "+ {{count}} champ à afficher",
    "show_other": "+ {{count}} champs à afficher",
    "hide": "Afficher moins",
    "seenInlineToast": "Tu veux voir ce champ plus souvent ?",
    "seenInlineAction": "Toujours afficher",
    "show_many": "+ {{count}} champs à afficher"
  },
  "forms": {
    "draftRestored": {
      "text": "Brouillon non enregistré restauré.",
      "discard": "Vider"
    }
  },
  "sharing": {
    "title": "Qui peut voir ceci ?",
    "change": "modifier",
    "changeAria": "Modifier qui peut voir ceci",
    "shareWithClubs": "Partager avec des clubs",
    "privateOnlyHint": "Visible par toi seul",
    "saveAsDefault": "En faire ma valeur par défaut",
    "updateDefault": "Mettre à jour la valeur par défaut",
    "saveAsDefaultHint": "Utilise ce choix par défaut pour les nouveaux éléments",
    "saveDefaultSuccess": "Partage par défaut enregistré",
    "saveDefaultError": "Partage par défaut non enregistré",
    "applyChange": "Appliquer",
    "defaultScopeHint": "C'est ta valeur par défaut pour ce type. La modifier s'applique à tous tes éléments de ce type.",
    "advancedPerClub": "Configurer par club",
    "clearDefault": "Toujours redemander",
    "clearDefaultSuccess": "Partage par défaut supprimé",
    "overrideLabel": "personnalisé",
    "overrideTooltip": "Diffère de ta valeur par défaut",
    "scopes": {
      "private": {
        "label": "Moi seul",
        "description": "Toi seul vois ceci. Les coachs et les camarades de club ne le voient pas."
      },
      "coaches": {
        "label": "Coachs",
        "description": "Les coachs des clubs sélectionnés voient ceci. Les camarades de club non."
      },
      "club": {
        "label": "Club",
        "description": "Les coachs et les camarades des clubs sélectionnés voient ceci."
      }
    },
    "summary": {
      "private": "Visible par toi seul",
      "coachesWith": "Partagé avec les coachs de {{clubs}}",
      "clubWith": "Partagé avec {{clubs}}",
      "popCoaches": "Visible par tes coachs",
      "popClubMembers": "Visible par les coachs et les camarades de club",
      "noClubs": "aucun club sélectionné",
      "clubsCount": "{{first}} +{{count}} de plus"
    },
    "pop": {
      "visibleToCoaches": "Coachs",
      "visibleToCoachesHint": "Tes coachs peuvent lire tes objectifs et tes retours.",
      "visibleToMembers": "Camarades de club",
      "visibleToMembersHint": "Les autres membres du club peuvent voir tes objectifs."
    },
    "measurements": {
      "all": "Tous les clubs",
      "none": "Moi seul",
      "allHint": "Les nouvelles mesures sont automatiquement partagées avec tous tes clubs actifs.",
      "noneHint": "Les nouvelles mesures restent privées. Tes coachs ne les voient pas.",
      "selectedHint": "Les nouvelles mesures sont partagées uniquement avec les clubs que tu choisis ci-dessous."
    },
    "settings": {
      "title": "Préférences de partage",
      "description": "Définis une seule fois comment tu veux partager les nouveaux éléments. Tu peux toujours l'ajuster par élément.",
      "domains": {
        "matches": "Plans de combat",
        "opponents": "Notes sur les adversaires",
        "pop": "Plan de développement (PDI)",
        "measurements": "Mesures"
      },
      "noClubs": "Rejoins un club ou crées-en un pour partager des éléments avec les coachs et les camarades de club.",
      "notSetYet": "Pas encore configuré. La valeur par défaut est utilisée.",
      "resetButton": "Toujours redemander",
      "trackedSummary": "Actuellement : {{summary}}"
    },
    "visibilityPrefix": "Visibilité",
    "variesPerClub": "Diffère selon le club"
  },
  "subscription": {
    "source": {
      "personal": "Personnel",
      "club": "Via {{clubName}}",
      "adminGrant": "Accordé",
      "none": "—"
    },
    "lifecycle": {
      "active": "Actif",
      "trial": "Période d'essai",
      "pastDue": "En retard de paiement",
      "canceledActive": "S'arrête le {{date}}",
      "expired": "Expiré",
      "none": "Inactif"
    },
    "trial": {
      "daysLeft": "{{count}} j",
      "hoursLeft": "{{count}} h",
      "hoursLeftLastHour": "<1 h"
    },
    "paymentMode": {
      "stripe": "Stripe",
      "manual": "Manuel"
    }
  },
  "wizard": {
    "progressAriaLabel": "Progression de l'assistant"
  },
  "a11y": {
    "refresh": "Actualiser",
    "close": "Fermer",
    "toggleSidebar": "Replier/déplier la barre de navigation",
    "breadcrumb": "Fil d'Ariane"
  },
  "brand": {
    "logoAltText": "JudoLytics accueil"
  }
}
