{
  "test": "Bonjour {{name}}",
  "common": {
    "404": "Un problème est survenu, réessayez plus tard.",
    "500": "Une erreur serveur est survenue. Réessayez plus tard.",
    "whiteSpace": " ",
    "error": "ERREUR",
    "connectionError": "Erreur de connexion. Vérifiez votre réseau et réessayez.",
    "sessionReplacedElsewhere": "Votre session a été ouverte sur un autre appareil.",
    "logoutFailed": "Impossible de vous déconnecter. Réessayez.",
    "invalidGroup": "Salle invalide.",
    "invalidLocation": "Emplacement invalide.",
    "unknownError": "Une erreur inconnue est survenue."
  },
  "middleware": {
    "notAdmin": "Vous n'êtes pas administrateur."
  },
  "auth": {
    "required": "Vous devez être connecté.",
    "forbidden": "Vous n'avez pas la permission pour cette action.",
    "invalidCondition": "La configuration d'authentification du serveur est invalide."
  },
  "api": {
    "invalidRequest": "Requête API invalide.",
    "invalidName": "Nom d'API invalide.",
    "invalidDataObject": "Payload API invalide.",
    "invalidRequestFormat": "Format de requête invalide.",
    "payloadTooLarge": "Le payload de la requête est trop volumineux.",
    "notFound": "API '{{name}}' introuvable.",
    "invalidInputType": "Entrée API invalide.",
    "rateLimitExceeded": "Trop de requêtes. Réessayez dans {{seconds}} secondes.",
    "methodNotAllowed": "Méthode non autorisée. Méthode attendue : {{method}}.",
    "internalServerError": "Une erreur interne du serveur est survenue.",
    "invalidResponseStatus": "L'API a renvoyé un statut de réponse invalide.",
    "emptyResponse": "L'API a renvoyé une réponse vide."
  },
  "sync": {
    "invalidRequest": "Requête sync invalide.",
    "invalidCallback": "Callback sync invalide.",
    "methodNotAllowed": "Méthode sync non autorisée.",
    "invalidName": "Nom de sync invalide.",
    "invalidRequestFormat": "Format de requête sync invalide.",
    "missingReceiver": "Le receiver sync est requis.",
    "notFound": "Événement sync introuvable.",
    "rateLimitExceeded": "Trop de requêtes sync. Réessayez dans {{seconds}} secondes.",
    "invalidInputType": "Entrée sync invalide : {{message}}",
    "serverExecutionFailed": "Le handler serveur sync a échoué.",
    "invalidServerResponse": "Le serveur sync a renvoyé une réponse invalide.",
    "noReceiversFound": "Aucun destinataire trouvé pour cet événement sync.",
    "receiverNotAllowed": "La diffusion à tous les clients n'est pas autorisée.",
    "notRoomMember": "Vous n'êtes pas membre de la room ciblée par cet événement sync.",
    "invalidVersion": "Version sync invalide.",
    "failedRequest": "La requête sync {{name}} a échoué : {{message}}",
    "requestTimeout": "La requête sync a expiré.",
    "disconnected": "Connexion perdue avant la confirmation de la requête sync.",
    "disabled": "La sync via HTTP est désactivée.",
    "devToolsUnavailable": "Les outils de développement sync ne sont pas disponibles dans cet environnement.",
    "clientExecutionFailed": "Le handler client sync a échoué.",
    "invalidClientResponse": "Le client sync a renvoyé une réponse invalide.",
    "clientRejected": "L'événement sync a été rejeté par la validation client.",
    "clientFilteredOut": "Vous n'êtes pas dans le bon contexte pour cet événement sync.",
    "ioUnavailable": "Le serveur socket est indisponible."
  },
  "error": {
    "invalidResponse": "Le serveur a renvoyé une réponse d'erreur invalide."
  },
  "login": {
    "empty": "Aucun e-mail ou mot de passe fourni.",
    "emailCharacterLimit": "L'e-mail ne peut pas dépasser 191 caractères.",
    "passwordCharacterMinimum": "Le mot de passe doit comporter au moins 8 caractères.",
    "passwordCharacterLimit": "Le mot de passe ne peut pas dépasser 191 caractères.",
    "nameCharacterLimit": "Le nom ne peut pas dépasser 191 caractères.",
    "invalidEmailFormat": "Format d'e-mail invalide.",
    "passwordNotMatch": "Les mots de passe ne correspondent pas.",
    "emailExists": "L'e-mail existe déjà.",
    "userCreated": "Utilisateur créé.",
    "createUserFailed": "Échec de la création de l'utilisateur.",
    "userNotFound": "Utilisateur non trouvé.",
    "wrongPassword": "Le mot de passe est incorrect.",
    "loggedIn": "Utilisateur connecté.",
    "providerNotFound": "Fournisseur introuvable.",
    "oauthStateInitFailed": "Échec de l'initialisation de l'état de sécurité OAuth.",
    "noReason": "Aucune raison fournie.",
    "signInTitle": "Connexion à votre compte",
    "registerTitle": "Créer un nouveau compte",
    "noAccount": "Pas encore de compte ? ",
    "haveAccount": "Déjà un compte ? ",
    "createAccount": "En créer un maintenant",
    "logIn": "Se connecter",
    "signUp": "S'inscrire",
    "loading": "Chargement...",
    "twoFactorTitle": "Vérification en deux étapes",
    "twoFactorIntro": "Saisissez le code à 6 chiffres de votre application d'authentification.",
    "twoFactorEmailIntro": "Saisissez le code que nous vous avons envoyé par e-mail.",
    "twoFactorRecoveryIntro": "Saisissez l'un de vos codes de récupération inutilisés.",
    "twoFactorCodeLabel": "Code de vérification",
    "twoFactorVerify": "Vérifier",
    "twoFactorUseTotp": "Utiliser mon application d'authentification",
    "twoFactorUseEmail": "M'envoyer un code par e-mail",
    "twoFactorUseRecovery": "Utiliser un code de récupération",
    "twoFactorEmailSent": "Code envoyé à votre e-mail.",
    "twoFactorRequired": "Vérification en deux étapes requise.",
    "twoFactorInvalidCode": "Code de vérification invalide.",
    "twoFactorLocked": "Trop de tentatives — reconnectez-vous.",
    "twoFactorChallengeExpired": "La session de vérification a expiré — reconnectez-vous.",
    "twoFactorMethodUnavailable": "Cette méthode de vérification n'est pas disponible.",
    "twoFactorEnrollmentExpired": "La session de configuration a expiré — recommencez.",
    "twoFactorPersistFailed": "Impossible d'enregistrer la modification — réessayez.",
    "twoFactorAlreadyEnabled": "L'authentification à deux facteurs est déjà activée — désactivez-la d'abord pour la reconfigurer.",
    "twoFactorDisabledByServer": "L'authentification à deux facteurs n'est pas disponible sur cette application.",
    "emailCodeTitle": "Se connecter avec un code e-mail",
    "emailCodeIntro": "Nous vous envoyons un code à usage unique — sans mot de passe.",
    "emailCodeTab": "Se connecter avec un code e-mail",
    "emailCodeSend": "Envoyer le code",
    "emailCodeResend": "Envoyer un nouveau code",
    "emailCodeLabel": "Code de connexion",
    "emailCodeSent": "Code envoyé — vérifiez votre boîte mail.",
    "emailCodeInvalid": "Code invalide.",
    "emailCodeExpired": "Le code a expiré ou a déjà été utilisé — demandez-en un nouveau.",
    "emailCodeLocked": "Trop de tentatives — demandez un nouveau code.",
    "emailCodeDisabled": "La connexion par code e-mail n'est pas activée.",
    "emailCodeSendFailed": "Impossible d'envoyer l'e-mail — réessayez plus tard.",
    "backToPassword": "Retour à la connexion par mot de passe",
    "name": "Nom",
    "emailAddress": "Adresse e-mail",
    "password": "Mot de passe",
    "confirmPassword": "Confirmer le mot de passe",
    "forgotPassword": "Mot de passe oublié ?",
    "orContinueWith": "Ou continuer avec",
    "forgotPasswordDisabled": "La réinitialisation du mot de passe est désactivée.",
    "resetTitle": "Réinitialiser votre mot de passe",
    "resetIntro": "Saisissez votre adresse e-mail et nous vous enverrons un lien pour choisir un nouveau mot de passe.",
    "resetSendLink": "Envoyer le lien",
    "resetEmailSent": "Si cette adresse existe, un lien de réinitialisation est en route.",
    "resetCheckInbox": "Vérifiez votre boîte de réception. Le lien expire dans 1 heure.",
    "resetBackToLogin": "Retour à la connexion",
    "resetChooseTitle": "Choisir un nouveau mot de passe",
    "resetChooseIntro": "Choisissez-en un que vous n'avez pas encore utilisé.",
    "resetConfirm": "Mettre à jour le mot de passe",
    "resetSuccess": "Votre mot de passe a été mis à jour. Vous pouvez maintenant vous connecter avec le nouveau.",
    "resetGoLogin": "Aller à la connexion",
    "resetInvalidToken": "Ce lien est invalide ou a expiré.",
    "resetPasswordUpdated": "Mot de passe mis à jour."
  },
  "settings": {
    "changeAvatar": "Changer d'avatar",
    "deleteAvatar": "Supprimer l'avatar",
    "changeAvatarDescription": "JPG, GIF ou PNG. Max 4 Mo.",
    "language": {
      "title": "Langue",
      "nl": "NL",
      "en": "EN",
      "de": "DE",
      "fr": "FR"
    },
    "theme": {
      "title": "Thème",
      "light": "Clair",
      "dark": "Sombre"
    },
    "saveChanges": "Enregistrer les modifications",
    "updatedUser": "utilisateur mis à jour",
    "failedUpdateUser": "Échec de la mise à jour de l'utilisateur",
    "noChangesMade": "Aucun changement effectué",
    "sizeToLarge": "La taille maximale est de 4~5 Mo, choisissez une image plus petite !!",
    "loadingImg": "La photo est en cours de chargement",
    "name": "Nom",
    "email": "E-mail",
    "emailReadOnly": "L'e-mail est en lecture seule pour ce compte.",
    "emailChange": {
      "label": "Entrez une nouvelle adresse e-mail ; nous y enverrons un lien de confirmation. En confirmant, vous serez déconnecté sur tous les appareils.",
      "button": "Envoyer la confirmation",
      "checkInbox": "Vérifiez la nouvelle boîte de réception pour le lien de confirmation.",
      "confirmPrompt": "Cliquez sur le bouton ci-dessous pour confirmer votre nouvelle adresse e-mail.",
      "confirmButton": "Confirmer le changement d'e-mail",
      "confirming": "Confirmation de la nouvelle adresse en cours...",
      "confirmedTitle": "E-mail mis à jour",
      "confirmedBody": "Votre adresse e-mail a été modifiée. Toutes les sessions ont été déconnectées — veuillez vous reconnecter avec la nouvelle adresse.",
      "failedTitle": "Échec de la confirmation",
      "invalidToken": "Ce lien de confirmation est invalide ou a expiré.",
      "emailTaken": "Cette adresse e-mail est déjà utilisée.",
      "invalidEmail": "Cela ne ressemble pas à une adresse e-mail valide.",
      "emailSameAsCurrent": "La nouvelle adresse e-mail est identique à l'actuelle.",
      "emailSendFailed": "Impossible d'envoyer l'e-mail de confirmation. Réessayez plus tard.",
      "currentPasswordRequired": "Saisissez votre mot de passe actuel pour changer votre adresse e-mail.",
      "wrongCurrentPassword": "Votre mot de passe actuel est incorrect.",
      "managedByProvider": "Votre adresse e-mail provient du service avec lequel vous vous connectez et ne peut pas être modifiée ici."
    },
    "passwordSection": "Mot de passe",
    "twoFactorSection": "Authentification à deux facteurs",
    "twoFactorStatusOn": "L'authentification à deux facteurs est ACTIVÉE — votre compte demande un code à la connexion.",
    "twoFactorStatusOff": "L'authentification à deux facteurs est désactivée. Ajoutez une application d'authentification pour une couche de sécurité supplémentaire.",
    "twoFactorSetup": "Configurer l'application d'authentification",
    "twoFactorScanIntro": "Ajoutez le secret ci-dessous à votre application d'authentification (Google/Microsoft Authenticator, Authy, …) — scannez ou saisissez-le manuellement — puis confirmez avec le premier code.",
    "twoFactorSecretLabel": "Secret (appuyez pour copier)",
    "twoFactorCopyUri": "Copier le lien de configuration (otpauth://)",
    "twoFactorActivate": "Activer",
    "twoFactorCancel": "Annuler",
    "twoFactorEnabled": "L'authentification à deux facteurs est activée.",
    "twoFactorDisabled": "L'authentification à deux facteurs est désactivée.",
    "twoFactorDisable": "Désactiver",
    "twoFactorDisableIntro": "Saisissez un code de votre application d'authentification (ou un code de récupération) pour désactiver l'authentification à deux facteurs.",
    "twoFactorRegenerate": "Nouveaux codes de récupération",
    "twoFactorRegenerateIntro": "Saisissez un code de votre application d'authentification pour remplacer vos codes de récupération.",
    "twoFactorRecoveryIntro": "Conservez ces codes de récupération en lieu sûr — chacun fonctionne une fois si vous perdez votre application d'authentification. Ils ne sont affichés que maintenant.",
    "twoFactorRecoveryDone": "Je les ai enregistrés",
    "twoFactorCopyCodes": "Copier les codes",
    "twoFactorCopied": "Copié.",
    "currentPassword": "Mot de passe actuel",
    "newPassword": "Nouveau mot de passe",
    "confirmNewPassword": "Confirmer le nouveau mot de passe",
    "changePassword": "Changer le mot de passe",
    "passwordChanged": "Mot de passe mis à jour.",
    "sessionsSection": "Sessions actives",
    "sessionsEmpty": "Aucune autre session active.",
    "currentSession": "Session actuelle",
    "revokeSession": "Se déconnecter",
    "sessionRevoked": "Session déconnectée.",
    "sessionExpiresIn": "~{{hours}}h restant",
    "preferencesSection": "Préférences de notification",
    "prefNotifySignIn": "M'envoyer un e-mail lors d'une nouvelle connexion",
    "prefNotifyPassword": "M'envoyer un e-mail lors d'un changement de mot de passe",
    "preferencesSaved": "Préférences enregistrées.",
    "dangerSection": "Zone de danger",
    "signOutEverywhere": "Se déconnecter partout",
    "signOutEverywhereConfirm": "Cela termine toutes les sessions actives, y compris celle-ci. Vous devrez vous reconnecter.",
    "signOutEverywhereDone": "Déconnecté de tous les appareils.",
    "deleteAccount": "Supprimer le compte",
    "deleteAccountConfirm": "Cela supprimera définitivement votre compte et toutes les données associées. Tapez DELETE pour confirmer.",
    "deleteAccountDone": "Compte supprimé."
  },
  "avatar": {
    "uploadFailed": "Échec de l'envoi de l'avatar.",
    "invalidFormat": "Format d'avatar invalide."
  },
  "session": {
    "invalid": "Session invalide.",
    "notFound": "Votre session a pris fin. Reconnectez-vous."
  },
  "docs": {
    "documentation": "Documentation",
    "room": "Salle",
    "apis": "APIs",
    "syncs": "Syncs",
    "selectApiOrSync": "Sélectionnez une API ou un événement sync.",
    "api": "API",
    "sync": "Sync",
    "input": "Entrée",
    "output": "Sortie",
    "method": "Méthode",
    "rateLimit": "Limite de débit",
    "unlimited": "Illimité",
    "rateLimitNotProvided": "Non renseigné",
    "auth": "Auth",
    "loginRequired": "Connexion requise",
    "loginOptional": "Connexion non requise",
    "additionalPermissions": "Permissions supplémentaires",
    "none": "Aucune",
    "requestPayload": "Aperçu du payload de requête",
    "responsePayload": "Payload de réponse",
    "clientInput": "Entrée client",
    "serverOutput": "Sortie serveur",
    "clientOutput": "Sortie client",
    "randomPreset": "Preset aléatoire",
    "runSocket": "Exécuter Socket",
    "runHttp": "Exécuter HTTP",
    "roomCode": "codeSalle",
    "ignoreSelf": "ignoreSelf",
    "roomToJoin": "salle à rejoindre",
    "joinRoom": "Rejoindre la salle",
    "roomToLeave": "salle à quitter",
    "leaveRoom": "Quitter la salle",
    "joinedRooms": "Salles rejointes",
    "noRoomsJoined": "Aucune salle rejointe",
    "syncReceiverHeader": "Salle réceptrice sync",
    "syncJoinHeader": "Rejoindre une salle",
    "syncLeaveHeader": "Quitter une salle",
    "fetchRequestExample": "Exemple de requête fetch",
    "socketRequestExample": "Exemple de requête socket",
    "syncHttpHowItWorksTitle": "Comment sync + HTTP fonctionne sur cette page",
    "syncHttpHowItWorksLine1": "Le déclencheur HTTP sync appelle /sync/... et le serveur diffuse via Socket.io aux utilisateurs de la même salle.",
    "syncHttpHowItWorksLine2": "Cette page rejoint la salle",
    "postmanTitle": "Instructions Postman / HTTP",
    "postmanLine1": "Utilisez l'en-tête Cookie auth: token=YOUR_SESSION_TOKEN, ou gardez le cookie jar Postman activé après connexion.",
    "postmanLine2": "Définissez l'en-tête de langue avec Accept-Language (préféré) ou X-Language (également pris en charge).",
    "postmanLine3": "Format URL API: /api/{page}/{name}/{version} et format URL Sync: /sync/{page}/{name}/{version}.",
    "httpGuideTitle": "Utilisation HTTP",
    "httpGuideLine1": "Utilisez HTTP pour les appels API ponctuels ou pour déclencher une diffusion sync depuis le backend.",
    "httpGuideLine2": "Pour les routes protégées, authentifiez-vous d'abord pour envoyer cookie ou token.",
    "httpGuideLine3": "Définissez Accept-Language pour contrôler les messages d'erreur localisés.",
    "httpGuideLine4": "Format des routes: /api/{page}/{name}/{version} et /sync/{page}/{name}/{version}.",
    "socketGuideTitle": "Utilisation Socket",
    "socketGuideLine1": "Utilisez le mode Socket pour des réponses callback en temps réel et des diffusions par salle.",
    "socketGuideLine2": "Rejoignez une salle avant de tester les diffusions pour recevoir l'événement sync.",
    "socketGuideLine3": "Salle docs par défaut",
    "socketGuideLine4": "Utilisez ignoreSelf pour diffuser à tous sauf au client courant.",
    "status": "Statut",
    "invalidJsonInput": "Entrée JSON invalide",
    "httpApiRequestFailed": "La requête HTTP API a échoué",
    "syncRequestTimedOut": "Délai dépassé pour la requête sync",
    "httpSyncRequestFailed": "La requête HTTP sync a échoué",
    "roomCodeRequired": "Le code de salle est requis",
    "joinedRoom": "Salle rejointe",
    "leftRoom": "Salle quittée",
    "failedToJoinRoom": "Échec de la connexion à la salle",
    "failedToLeaveRoom": "Échec de sortie de la salle",
    "failedToLoadDocumentation": "Échec du chargement de la documentation.",
    "emptyResponseBody": "Corps de réponse vide",
    "emptyErrorResponseBody": "Corps de réponse d'erreur vide",
    "invalidJsonResponse": "La réponse n'était pas un JSON valide",
    "apisSmall": "APIS",
    "syncsSmall": "SYNCS",
    "doc": "DOC",
    "syncSmall": "SYNC"
  },
  "admin": {
    "title": "Admin"
  },
  "confirm": {
    "type": "Tapez ",
    "toConfirm": " pour confirmer :",
    "cancel": "Annuler",
    "confirm": "Confirmer"
  },
  "dashboard": {
    "title": "Tableau de bord",
    "description": "Ceci est la page du tableau de bord. Elle est mappée sur /dashboard via le routeur basé sur les fichiers du framework.",
    "welcome": "Bon retour, {{name}}",
    "welcomeSubtitle": "Voici un aperçu rapide de votre espace de travail.",
    "lastSignIn": "Dernière connexion {{when}}",
    "lastSignInFirst": "Bienvenue dans votre première session.",
    "statsApiCalls": "Appels API aujourd'hui",
    "statsActiveSessions": "Sessions actives",
    "statsRecentErrors": "Erreurs récentes",
    "statsUptime": "Disponibilité",
    "quickActions": "Actions rapides",
    "openSettings": "Paramètres",
    "openPlayground": "Playground",
    "signOut": "Se déconnecter",
    "systemStatus": "État du système",
    "statusConnected": "Tous les systèmes opérationnels",
    "statusReconnecting": "Reconnexion…",
    "statusDisconnected": "Déconnecté",
    "recentActivity": "Activité récente",
    "recentActivityEmpty": "Pas d'activité récente."
  },
  "home": {
    "settings": "Paramètres",
    "signOut": "Se déconnecter"
  },
  "errorPage": {
    "goBack": "← Retour",
    "home": "Accueil",
    "developerDetails": "Détails du développeur",
    "errorLabel": "Erreur"
  },
  "examples": {
    "title": "Exemples LuckyStack",
    "subtitle": "Démo interactive de toutes les fonctionnalités",
    "docs": "Documentation",
    "userInfo": "Info Utilisateur",
    "logout": "Se déconnecter",
    "notLoggedIn": "Non connecté",
    "goToLogin": "Aller à la connexion",
    "realTimeSync": "Synchronisation en temps réel",
    "openTabs": "Ouvrir dans 2 onglets pour tester",
    "publicApi": "API publique",
    "noLoginNeeded": "Aucune connexion requise",
    "callApi": "Appeler API",
    "toggleAdmin": "Basculer Admin",
    "requiresLogin": "Connexion requise",
    "toggle": "Basculer",
    "adminOnly": "Admin uniquement",
    "adminTrueRequired": "admin: true requis",
    "apiResults": "Résultats API",
    "apiResultsDesc": "Cliquez sur un bouton API pour voir les résultats ici"
  },
  "template": {
    "logout": "Se déconnecter",
    "socketStatus": "État du Socket :"
  }
}