{
  "common": {
    "next": "Suivant",
    "prev": "Précédent",
    "finish": "Terminer",
    "cancel": "Annuler",
    "save": "Enregistrer",
    "loading": "Chargement...",
    "confirm": "Confirmer",
    "success": "Succès",
    "error": "Erreur",
    "delete": "Supprimer",
    "edit": "Modifier",
    "add": "Ajouter",
    "search": "Rechercher",
    "clear": "Effacer",
    "close": "Fermer",
    "yes": "Oui",
    "no": "Non",
    "submit": "Envoyer",
    "reset": "Réinitialiser",
    "import": "Importer",
    "export": "Exporter",
    "create": "Créer",
    "update": "Mettre à jour",
    "refresh": "Actualiser",
    "view": "Voir",
    "name": "Nom",
    "status": "Statut",
    "operation": "Opération",
    "description": "Description",
    "total": "Total {{count}} éléments",
    "noData": "Aucune donnée",
    "pleaseSelect": "Veuillez sélectionner",
    "pleaseEnter": "Veuillez entrer",
    "readOnly": "Mode lecture seule",
    "none": "Aucun",
    "more": "Plus"
  },
  "oobe": {
    "title": "Bienvenue sur SecScore",
    "subtitle": "Expert en gestion de points éducatifs",
    "step": "Étape {{current}}/{{total}}",
    "skip": "Passer",
    "steps": {
      "entry": {
        "title": "Commencer",
        "description": "Choisissez la procédure à suivre",
        "enterOobe": "Entrer dans l'OOBE",
        "connectPostgresAutoSync": "Connecter PostgreSQL avec synchronisation automatique",
        "skipDirect": "Passer l'OOBE et entrer directement"
      },
      "postgresql": {
        "title": "Connecter PostgreSQL",
        "description": "Entrez la chaîne de connexion PostgreSQL. Le système se connectera et se synchronisera automatiquement.",
        "connectionPlaceholder": "postgresql://user:password@host:port/database?sslmode=require",
        "autoSyncAndEnter": "Se connecter et synchroniser automatiquement"
      },
      "language": {
        "title": "Choisir la langue",
        "description": "Veuillez choisir votre langue préférée"
      },
      "theme": {
        "title": "Définir le thème",
        "description": "Choisissez l'apparence de l'interface",
        "mode": "Mode",
        "lightMode": "Clair",
        "darkMode": "Sombre",
        "primaryColor": "Couleur principale",
        "backgroundGradient": "Dégradé de fond"
      },
      "password": {
        "title": "Définir le mot de passe",
        "description": "Définissez un mot de passe pour protéger vos données (facultatif)",
        "adminPassword": "Mot de passe administrateur",
        "adminPasswordHint": "Accès à toutes les fonctionnalités, 6 chiffres",
        "pointsPassword": "Mot de passe points",
        "pointsPasswordHint": "Opérations sur les points uniquement, 6 chiffres",
        "passwordPlaceholder": "Entrez 6 chiffres",
        "hint": "Laisser vide pour ignorer, configurer plus tard dans les paramètres"
      },
      "students": {
        "title": "Importer la liste d'élèves",
        "description": "Ajoutez une liste d'élèves pour commencer la gestion des points",
        "import": "Importer la liste",
        "manual": "Ajout manuel",
        "importHint": "Supporte les fichiers Excel (.xlsx) ou JSON",
        "manualHint": "Collez plusieurs lignes, un nom d'élève par ligne",
        "dragDrop": "Glissez-déposez des fichiers ici ou cliquez pour sélectionner",
        "supportedFormats": "Formats supportés : .xlsx, .json",
        "studentName": "Nom de l'élève",
        "addStudent": "Ajouter un élève",
        "noStudents": "Aucun élève pour le moment, veuillez ajouter ou importer",
        "studentCount": "{{count}} élèves ajoutés",
        "studentExists": "L'élève existe déjà",
        "importSuccess": "{{count}} élèves importés avec succès",
        "noNewStudents": "Aucun nouvel élève à importer",
        "parseFailed": "Échec de l'analyse du fichier",
        "unsupportedFormat": "Format de fichier non supporté"
      },
      "reasons": {
        "title": "Définir les raisons",
        "description": "Ajoutez les raisons courantes de modification de points",
        "addReason": "Ajouter une raison",
        "reasonName": "Nom de la raison",
        "points": "Points",
        "positive": "Ajouter des points",
        "negative": "Retirer des points",
        "noReasons": "Aucune raison pour le moment, veuillez ajouter des raisons courantes",
        "reasonCount": "{{count}} raisons ajoutées",
        "reasonExists": "La raison existe déjà"
      },
      "start": {
        "title": "Prêt à l'emploi",
        "description": "Tout est prêt. Commençons à utiliser SecScore !",
        "features": {
          "score": "Gérez facilement les points des élèves",
          "history": "Historique complet des modifications de points",
          "settlement": "Supporte le règlement et l'archivage"
        },
        "startButton": "Commencer"
      }
    }
  },
  "settings": {
    "title": "Paramètres système",
    "tabs": {
      "appearance": "Apparence",
      "security": "Sécurité",
      "account": "Compte",
      "database": "Synchronisation cloud",
      "dataManagement": "Gestion des données",
      "urlProtocol": "Protocole URL",
      "about": "À propos"
    },
    "language": "Langue",
    "languageHint": "Choisir la langue d'affichage de l'interface",
    "fontFamily": "Police globale",
    "fontFamilyHint": "Choisir la police de l'interface (nécessite un rafraîchissement)",
    "theme": "Thème",
    "password": "Définir le mot de passe",
    "themeMode": "Mode",
    "lightMode": "Clair",
    "darkMode": "Sombre",
    "primaryColor": "Couleur principale",
    "backgroundGradient": "Dégradé de fond",
    "searchKeyboard": {
      "title": "Clavier de recherche",
      "hint": "Choisir la disposition du clavier sous la zone de recherche",
      "disableToggle": "Désactiver le clavier de recherche",
      "disableHint": "Le clavier ne s'affichera plus sous la zone de recherche",
      "options": {
        "qwerty26": "26 touches (QWERTY)",
        "t9": "9 touches (T9)"
      }
    },
    "interfaceZoom": "Zoom de l'interface",
    "zoomOptions": {
      "small70": "Petit (70%)",
      "default100": "Par défaut (100%)",
      "large150": "Grand (150%)"
    },
    "general": {
      "saved": "Enregistré",
      "saveFailed": "Échec de l'enregistrement"
    },
    "zoomHint": "Ajuster la taille globale de l'interface",
    "mobile": {
      "navigationTitle": "Entrées de page",
      "bottomNav": {
        "label": "Fonctions de navigation inférieure",
        "hint": "Choisir les fonctions à afficher dans la barre inférieure du mobile. La barre affiche maximum 4 éléments, les autres vont dans « Plus »."
      },
      "dragHint": "Glissez pour réorganiser. Les 4 premiers éléments apparaissent dans la barre inférieure, les autres dans « Plus ».",
      "dropHere": "Relâchez ici",
      "bottomSection": "Barre inférieure (max 4)",
      "moreSection": "Plus",
      "moveToMore": "Déplacer vers Plus",
      "moveToBottom": "Déplacer vers le bas"
    },
    "zoomUpdated": "Zoom de l'interface mis à jour",
    "updateFailed": "Échec de la mise à jour",
    "security": {
      "title": "Système de protection par mot de passe",
      "adminPassword": "Mot de passe administrateur",
      "pointsPassword": "Mot de passe points",
      "recoveryString": "Phrase de récupération",
      "set": "Défini",
      "notSet": "Non défini",
      "generated": "Généré",
      "notGenerated": "Non généré",
      "enterPassword": "Entrez 6 chiffres (laisser vide pour ne pas modifier)",
      "adminPasswordPlaceholder": "Entrez 6 chiffres pour le mot de passe administrateur (laisser vide pour ne pas modifier)",
      "pointsPasswordPlaceholder": "Entrez 6 chiffres pour le mot de passe points (laisser vide pour ne pas modifier)",
      "recoveryPlaceholder": "Entrez la phrase de récupération",
      "savePassword": "Enregistrer le mot de passe",
      "savePasswords": "Enregistrer les mots de passe",
      "generateRecovery": "Générer la phrase de récupération",
      "clearAllPasswords": "Effacer tous les mots de passe",
      "recoveryReset": "Réinitialiser la phrase de récupération",
      "enterRecovery": "Entrez la phrase de récupération",
      "resetPassword": "Réinitialiser le mot de passe",
      "resetHint": "La réinitialisation effacera les mots de passe administrateur et points, et générera une nouvelle phrase de récupération.",
      "confirmClear": "Confirmer l'effacement de tous les mots de passe ?",
      "clearHint": "Après effacement, la protection sera désactivée (aucun mot de passe = permission administrateur par défaut).",
      "saved": "Mot de passe mis à jour",
      "saveFailed": "Échec de la mise à jour",
      "generateFailed": "Échec de la génération",
      "resetFailed": "Échec de la réinitialisation",
      "cleared": "Effacé",
      "clearFailed": "Échec de l'effacement",
      "passwordClearedNewRecovery": "Mot de passe effacé, nouvelle phrase de récupération",
      "newRecoveryString": "Nouvelle phrase de récupération (veuillez l'enregistrer)"
    },
    "account": {
      "title": "Compte SECTL Auth",
      "notLoggedIn": "Non connecté à SECTL Auth",
      "oauthHint": "Connectez-vous avec votre compte SECTL Auth pour profiter de l'authentification unifiée et de la déconnexion à distance",
      "loginButton": "Se connecter avec SECTL Auth",
      "loginSuccess": "Connexion réussie",
      "logout": "Déconnexion",
      "userId": "ID utilisateur",
      "permission": "Niveau de permission"
    },
    "database": {
      "title": "Connexion à la base de données",
      "currentStatus": "Statut actuel de la base de données",
      "sqliteLocal": "Base de données SQLite locale",
      "postgresqlRemote": "Base de données PostgreSQL distante",
      "connected": "Connecté",
      "disconnected": "Déconnecté",
      "postgresqlConnection": "Connexion PostgreSQL distante",
      "connectionHint": "Entrez la chaîne de connexion PostgreSQL pour se connecter à une base de données distante, supporte la synchronisation multi-plateforme.",
      "testConnection": "Tester la connexion",
      "switchToPostgreSQL": "Passer à PostgreSQL",
      "switchToSQLite": "Passer à SQLite local",
      "connectionTestSuccess": "Test de connexion réussi",
      "connectionTestFailed": "Échec du test de connexion",
      "switchedTo": "Passé à la base de données {{type}}",
      "switchedToSQLite": "Passé à la base de données SQLite locale",
      "switchFailed": "Échec du changement",
      "syncDescription": "Instructions de synchronisation multi-plateforme",
      "syncPoint1": "L'utilisation d'une base de données PostgreSQL distante permet la synchronisation des données multi-plateforme.",
      "syncPoint2": "Mécanisme de file d'opérations intégré pour assurer la cohérence des données lors des opérations simultanées.",
      "syncPoint3": "Un redémarrage de l'application est nécessaire après le changement de base de données.",
      "syncPoint4": "Services de base de données cloud recommandés : Neon, Supabase, AWS RDS, etc.",
      "enterConnectionString": "Veuillez entrer la chaîne de connexion PostgreSQL",
      "connectionExample": "Exemple : postgresql://xxxxxx_xxxxx:xxxxxxxx@xx-xxx.xxx.neon.xxxx/xxxxdxx?sslmode=require",
      "uploadButton": "Télécharger les données locales vers le serveur distant",
      "uploadHint": "Après connexion à la base de données distante, téléchargez et fusionnez l'historique SQLite local vers le serveur distant.",
      "uploadNeedRemote": "Veuillez d'abord passer et connecter à la base de données PostgreSQL distante",
      "noNeedUpload": "Les données locales et distantes sont déjà cohérentes",
      "uploadConfirmTitle": "Confirmer le téléchargement des données locales vers le serveur distant ?",
      "uploadConfirmContent": "La synchronisation privilégiera les données locales. Détecté : local-only {{localOnly}}, distant-only {{remoteOnly}}, conflits {{conflicts}}.",
      "uploadSuccess": "Données locales téléchargées vers le serveur distant",
      "uploadFailed": "Échec du téléchargement"
    },
    "cloudSync": {
      "title": "Synchronisation cloud",
      "selectMethod": "Choisir la méthode de synchronisation",
      "selectMethodHint": "Choisissez une méthode de synchronisation des données. Les deux méthodes sont mutuellement exclusives.",
      "postgresql": "PostgreSQL auto-hébergé",
      "postgresqlDesc": "Connectez-vous à votre propre base de données PostgreSQL pour un contrôle total. Idéal pour les utilisateurs ayant leur propre serveur.",
      "sectlCloud": "SECTL Cloud Sync",
      "sectlCloudDesc": "Synchronisez les données via la plateforme cloud SECTL. Aucune base de données auto-hébergée nécessaire.",
      "loginRequired": "Veuillez vous connecter à SECTL Auth d'abord",
      "loginHint": "La synchronisation cloud SECTL nécessite un compte SECTL Auth. Veuillez vous connecter dans l'onglet « Compte ».",
      "statusTitle": "État de la synchronisation",
      "configured": "Prêt",
      "notConfigured": "Non prêt",
      "syncing": "Synchronisation...",
      "lastSync": "Dernière sync",
      "never": "Jamais synchronisé",
      "syncActions": "Actions de synchronisation",
      "syncDirection": "Direction de synchronisation",
      "bidirectional": "Bidirectionnelle (Recommandé) — Fusion automatique des données locales et cloud",
      "pushOnly": "Upload uniquement — Écraser les données cloud avec les données locales",
      "pullOnly": "Download uniquement — Écraser les données locales avec les données cloud",
      "startSync": "Démarrer la synchronisation",
      "uploadToCloud": "Uploader vers le cloud",
      "downloadFromCloud": "Télécharger depuis le cloud",
      "fullSync": "Synchronisation bidirectionnelle",
      "syncInProgress": "Synchronisation en cours, veuillez patienter",
      "syncConfirm": "Confirmer {{direction}} ?",
      "storageUsage": "Utilisation du stockage",
      "usedStorage": "Utilisé",
      "table": "Table",
      "records": "Enregistrements",
      "size": "Taille",
      "clickToLoadStats": "Cliquez sur actualiser pour charger les stats",
      "description": "Guide de synchronisation cloud SECTL",
      "descriptionPoint1": "Synchronisez les données via le service cloud SECTL. Aucune base de données auto-hébergée nécessaire. Les données sont isolées par compte SECTL Auth.",
      "descriptionPoint2": "Basé sur l'architecture de stockage KV. Chaque table est stockée en paire clé-valeur pour une lecture/écriture efficace.",
      "descriptionPoint3": "Prend en charge les modes bidirectionnel, upload uniquement et download uniquement.",
      "descriptionPoint4": "Les données sont transmises via HTTPS avec authentification OAuth 2.0."
    },
    "data": {
      "title": "Gestion des données",
      "settlement": "Règlement",
      "settlementAndRestart": "Régler et redémarrer",
      "settlementHint": "Classe les enregistrements non régulés dans une phase et réinitialise tous les points des élèves à zéro.",
      "importExport": "Importer / Exporter",
      "exportJson": "Exporter JSON",
      "importJson": "Importer JSON",
      "importHint": "L'importation écrasera les élèves/raisons/enregistrements/paramètres existants (les paramètres de sécurité sont exclus).",
      "logs": "Journaux",
      "logLevel": "Niveau de journal",
      "logOperation": "Opération sur les journaux",
      "viewLogs": "Voir les journaux",
      "exportLogs": "Exporter les journaux",
      "clearLogs": "Effacer les journaux",
      "logsCleared": "Journaux effacés",
      "systemLogs": "Journaux système (200 derniers)",
      "noLogs": "Aucun journal",
      "logLevelUpdated": "Niveau de journal mis à jour",
      "readLogsFailed": "Échec de la lecture des journaux",
      "logsExported": "Journaux exportés",
      "exportFailed": "Échec de l'exportation",
      "exportSuccess": "Exportation réussie",
      "importSuccess": "Importation réussie, actualisation en cours",
      "importFailed": "Échec de l'importation",
      "clearFailed": "Échec de l'effacement",
      "confirmSettlement": "Confirmer le règlement et le redémarrage ?",
      "settlementConfirm1": "Cela archivera les enregistrements non régulés dans une phase et réinitialisera tous les points des élèves à zéro.",
      "settlementConfirm2": "La liste des élèves reste inchangée ; l'historique du règlement est consultable dans la page « Historique des règlements ».",
      "settlementSuccess": "Règlement réussi, points redémarrés",
      "settlementFailed": "Échec du règlement",
      "settle": "Régler",
      "logLevels": {
        "debug": "DEBUG (débogage)",
        "info": "INFO (information)",
        "warn": "WARN (avertissement)",
        "error": "ERROR (erreur)"
      }
    },
    "url": {
      "title": "Protocole URL (secscore://)",
      "protocol": "Protocole URL",
      "description": "Vous pouvez invoquer SecScore via une URL pour effectuer des opérations, par exemple :",
      "register": "Enregistrer le protocole URL",
      "registered": "Protocole URL enregistré",
      "registerFailed": "Échec de l'enregistrement",
      "installerRequired": "Nécessite la version installée de SecScore, peut ne pas fonctionner en mode développement.",
      "checkStatus": "Vérifier le statut",
      "reRegister": "Ré-enregistrer",
      "unregister": "Désinscrire",
      "unregistered": "Protocole URL désinscrit",
      "unregisterFailed": "Échec de la désinscription",
      "statusRegistered": "Inscrit",
      "statusNotRegistered": "Non inscrit",
      "statusCheckFailed": "Échec de la vérification du statut",
      "retrying": "Nouvelle tentative ({{current}}/{{max}})",
      "retryFailed": "Nombre maximal de tentatives atteint, échec de l'inscription",
      "retrySuccess": "Tentative #{{n}} réussie",
      "operationLog": "Journal des opérations",
      "logRegisterStart": "Démarrage de l'inscription du protocole URL...",
      "logRegisterVerify": "Commande d'inscription exécution, vérification en cours...",
      "logRegisterSuccess": "Inscription vérifiée avec succès",
      "logRegisterFailed": "Échec de la vérification de l'inscription",
      "logUnregisterStart": "Désinscription en cours...",
      "logUnregisterSuccess": "Désinscription réussie",
      "logUnregisterFailed": "Échec de la désinscription",
      "logMaxRetries": "Nombre maximal de tentatives (7) atteint"
    },
    "elevation": {
      "title": "Privilèges administrateur",
      "description": "Vérifier si l'application s'exécute avec des privilèges administrateur/root. Certaines fonctionnalités (écoute de port, opérations système) nécessitent des privilèges élevés.",
      "elevated": "Élevé",
      "notElevated": "Non élevé",
      "request": "Demander les privilèges admin",
      "requestSuccess": "Privilèges admin demandés, l'application va redémarrer",
      "requestFailed": "Échec de la demande de privilèges admin",
      "windowsHint": "Windows : une invite UAC apparaîtra. Après confirmation, l'app redémarrera en tant qu'administrateur.",
      "macosHint": "macOS : une boîte de dialogue d'authentification système apparaîtra. Entrez le mot de passe admin pour redémarrer.",
      "linuxHint": "Linux : utilise pkexec pour demander les privilèges root. Entrez le mot de passe pour redémarrer."
    },
    "mcp": {
      "title": "Service MCP",
      "description": "Gérer le service HTTP MCP intégré pour les clients MCP externes.",
      "running": "En cours d'exécution",
      "stopped": "Arrêté",
      "noUrl": "Aucune URL",
      "host": "Hôte",
      "port": "Port",
      "start": "Démarrer",
      "stop": "Arrêter",
      "refresh": "Actualiser l'état",
      "hint": "Recommandé pour lier uniquement à 127.0.0.1 ; après le démarrage, le point de terminaison est http://host:port/mcp",
      "hostRequired": "Veuillez entrer l'hôte MCP",
      "portInvalid": "Veuillez entrer un port valide (1-65535)",
      "startSuccess": "Serveur MCP démarré avec succès",
      "startFailed": "Échec du démarrage du serveur MCP",
      "stopSuccess": "Serveur MCP arrêté",
      "stopFailed": "Échec de l'arrêt du serveur MCP",
      "startTimeout": "Démarrage du serveur MCP dépassé, veuillez réessayer",
      "stopTimeout": "Arrêt du serveur MCP dépassé, veuillez réessayer"
    },
    "app": {
      "title": "Contrôles de l'application",
      "description": "Redémarrer ou quitter rapidement l'application.",
      "restart": "Redémarrer l'application",
      "quit": "Quitter l'application",
      "confirmRestartTitle": "Confirmer le redémarrage de l'application ?",
      "confirmRestartContent": "L'application se fermera et redémarrera immédiatement.",
      "confirmQuitTitle": "Confirmer la fermeture de l'application ?",
      "confirmQuitContent": "L'application se fermera immédiatement.",
      "restartFailed": "Échec du redémarrage",
      "quitFailed": "Échec de la fermeture"
    },
    "about": {
      "title": "À propos",
      "appName": "Gestion des points éducatifs",
      "version": "Version",
      "copyright": "Copyright",
      "ipcStatus": "Statut IPC",
      "ipcConnected": "Connecté",
      "ipcDisconnected": "Déconnecté (Preload échoué)",
      "environment": "Environnement",
      "toggleDevTools": "Activer/désactiver les outils de développement",
      "license": "SecScore est sous licence GPL3.0",
      "copyRightText": "CopyRight © 2025-{{year}} SECTL"
    }
  },
  "sidebar": {
    "home": "Accueil",
    "students": "Gestion des élèves",
    "score": "Opérations sur les points",
    "boards": "Tableaux",
    "leaderboard": "Classement",
    "settlements": "Historique des règlements",
    "reasons": "Gestion des raisons",
    "autoScore": "Ajout automatique de points",
    "rewardExchange": "Échange de récompenses",
    "rewardSettings": "Paramètres de récompense",
    "settings": "Paramètres système",
    "remoteDb": "Base de données distante",
    "refreshStatus": "Actualiser l'état",
    "syncNow": "Synchroniser maintenant",
    "syncSuccess": "Synchronisation réussie",
    "syncFailed": "Échec de la synchronisation",
    "getDbStatusFailed": "Échec de l'obtention du statut de la base de données",
    "notRemoteMode": "Mode base de données distante non activé, veuillez redémarrer l'application",
    "dbNotConnected": "Base de données non connectée"
  },
  "auth": {
    "unlock": "Déverrouiller la permission",
    "unlockHint": "Entrez le mot de passe à 6 chiffres : mot de passe administrateur = accès complet, mot de passe points = opérations sur les points uniquement.",
    "unlockButton": "Déverrouiller",
    "unlocked": "Permission déverrouillée",
    "logout": "Passé en lecture seule",
    "passwordPlaceholder": "ex. 123456",
    "passwordError": "Mot de passe incorrect",
    "enterPassword": "Entrer le mot de passe",
    "lock": "Verrouiller"
  },
  "languages": {
    "zh-CN": "简体中文",
    "en-US": "English",
    "ja-JP": "日本語",
    "fr-FR": "Français",
    "es-ES": "Español",
    "ko-KR": "한국어",
    "ru-RU": "Русский",
    "de-DE": "Deutsch",
    "pt-BR": "Português",
    "ar-SA": "العربية"
  },
  "theme": {
    "colorAndBackground": "Couleur et fond",
    "gradientLabels": {
      "blue": "Bleu frais",
      "pink": "Rose doux",
      "cyan": "Cyan",
      "purple": "Violet"
    },
    "gradientDirections": {
      "vertical": "Vertical",
      "horizontal": "Horizontal",
      "diagonal": "Diagonal"
    },
    "generate": "Générer",
    "saved": "Enregistré",
    "saveFailed": "Échec de l'enregistrement",
    "mode": "Mode",
    "myTheme": "Mon thème"
  },
  "permissions": {
    "admin": "Permission administrateur",
    "points": "Permission points",
    "view": "Lecture seule"
  },
  "home": {
    "title": "Page d'accueil des points des élèves",
    "subtitle": "{{count}} élèves au total, cliquez sur la carte pour effectuer des opérations",
    "searchPlaceholder": "Rechercher nom/pinyin...",
    "sortBy": {
      "alphabet": "Tri par nom",
      "surname": "Groupe par nom de famille",
      "group": "Tri par groupe",
      "score": "Classement par points"
    },
    "layoutBy": {
      "grouped": "Liste groupée",
      "squareGrid": "Grille carrée",
      "largeAvatar": "Grand avatar"
    },
    "noStudents": "Aucune donnée d'élève, veuillez ajouter dans la gestion des élèves",
    "noMatch": "Aucun élève correspondant trouvé",
    "clearSearch": "Effacer la recherche",
    "points": "pts",
    "currentScore": "Points actuels",
    "quickOptions": "Options rapides",
    "adjustPoints": "Ajuster les points",
    "customPoints": "Points personnalisés",
    "customPointsHint": "Entrez n'importe quelle valeur dans la zone de saisie",
    "reason": "Raison",
    "reasonPlaceholder": "Entrez la raison de la modification des points (facultatif)",
    "preview": "Aperçu de la modification",
    "noReason": "(Aucune raison)",
    "ungrouped": "Non groupé",
    "category": {
      "others": "Autres"
    },
    "scoreAdded": "{{points}} points ajoutés à {{name}}",
    "scoreDeducted": "{{points}} points retirés à {{name}}",
    "submitFailed": "Échec de l'envoi",
    "pleaseSelectPoints": "Veuillez sélectionner ou entrer des points",
    "reasonDefault": "{{action}} {{points}} points",
    "studentCount": "{{count}} élèves",
    "operationTitle": "Opération sur les points : {{name}}",
    "submitOperation": "Envoyer l'opération",
    "operationTitleBatch": "Opération sur les points : {{count}} sélectionnés",
    "undoLastAction": "Annuler",
    "undoLastHint": "Annuler le dernier : {{name}} {{delta}}",
    "undoUnavailable": "Aucune opération sur les points à annuler",
    "undoLastSuccess": "Dernière opération sur les points annulée",
    "multiSelect": "Sélection multiple",
    "batchMode": "Mode batch",
    "selectAll": "Tout sélectionner",
    "clearSelected": "Effacer la sélection",
    "batchOperate": "Points en batch",
    "selected": "Sélectionné",
    "selectedCount": "{{count}} sélectionnés",
    "batchSuccess": "Points soumis pour {{count}} élèves",
    "batchPartial": "{{success}}/{{total}} élèves soumis avec succès",
    "selectStudentFirst": "Veuillez d'abord sélectionner un ou plusieurs élèves",
    "addPoints": "Ajouter des points",
    "deductPoints": "Retirer des points",
    "pointsChange": "Modification des points",
    "reasonLabel": "Raison : "
  },
  "students": {
    "title": "Gestion des élèves",
    "importList": "Importer la liste",
    "addStudent": "Ajouter un élève",
    "name": "Nom",
    "group": "Groupe",
    "avatar": "Avatar",
    "currentScore": "Points actuels",
    "tags": "Tags",
    "noTags": "Aucun tag",
    "editTags": "Modifier les tags",
    "editAvatar": "Définir l'avatar",
    "deleteConfirm": "Confirmer la suppression de cet élève ?",
    "addTitle": "Ajouter un élève",
    "addConfirm": "Ajouter",
    "namePlaceholder": "Entrez le nom de l'élève",
    "groupPlaceholder": "Entrez le nom du groupe (facultatif)",
    "nameRequired": "Veuillez entrer le nom",
    "nameExists": "Le nom de l'élève existe déjà",
    "addSuccess": "Ajouté avec succès",
    "addFailed": "Échec de l'ajout",
    "deleteSuccess": "Supprimé avec succès",
    "deleteFailed": "Échec de la suppression",
    "tagSaveSuccess": "Tags enregistrés avec succès",
    "tagSaveFailed": "Échec de l'enregistrement des tags",
    "importTitle": "Importer la liste",
    "importTextHint": "Collez plusieurs lignes, un nom d'élève par ligne",
    "importTextPlaceholder": "Exemple :\nJean\nMarie\nPierre",
    "importByText": "Importer depuis le texte",
    "importByXlsx": "Importer via xlsx",
    "importByBanyou": "Importer depuis BanYou",
    "xlsxPreview": "Aperçu et import xlsx",
    "file": "Fichier",
    "selectNameCol": "Cliquez sur l'en-tête pour sélectionner la colonne de nom",
    "previewRows": "Aperçu des 50 premières lignes",
    "importConfirm": "Importer",
    "importComplete": "Importation terminée : {{inserted}} ajoutés, {{skipped}} ignorés",
    "workerNotReady": "Worker non initialisé",
    "parseXlsxFailed": "Échec de l'analyse xlsx",
    "selectNameColFirst": "Veuillez d'abord sélectionner la « Colonne de nom »",
    "noNamesFound": "Aucun nom importable trouvé dans la colonne sélectionnée",
    "importFailed": "Échec de l'importation",
    "banyouCookieHint": "Après vous être connecté à BanYou Web, copiez le cookie complet et collez-le ci-dessous.",
    "banyouCookiePlaceholder": "uid=...; accessToken=...; ...",
    "banyouCookieRequired": "Veuillez d'abord coller le cookie",
    "banyouFetch": "Récupérer la liste des classes",
    "banyouFetchSuccess": "{{count}} classes récupérées",
    "banyouFetchFailed": "Échec de la récupération des classes BanYou",
    "banyouCreatedClasses": "Classes que j'ai créées",
    "banyouJoinedClasses": "Classes que j'ai rejointes",
    "banyouNoClasses": "Aucune donnée de classe pour le moment"
  },
  "boards": {
    "title": "Gestion des tableaux",
    "addBoard": "Ajouter un tableau",
    "editBoard": "Modifier le tableau",
    "deleteBoard": "Supprimer le tableau",
    "name": "Nom du tableau",
    "description": "Description",
    "visibility": "Visibilité",
    "public": "Public",
    "private": "Privé",
    "studentsCount": "{{count}} élèves",
    "noBoards": "Aucun tableau pour le moment",
    "addTitle": "Ajouter un tableau",
    "editTitle": "Modifier le tableau",
    "namePlaceholder": "Entrez le nom du tableau",
    "descriptionPlaceholder": "Entrez la description",
    "confirmDelete": "Confirmer la suppression de ce tableau ?",
    "saved": "Enregistré",
    "saveFailed": "Échec de l'enregistrement",
    "deleted": "Supprimé",
    "deleteFailed": "Échec de la suppression",
    "boardExists": "Le tableau existe déjà"
  },
  "leaderboard": {
    "title": "Classement",
    "sortBy": "Trier par",
    "score": "Points",
    "name": "Nom",
    "rank": "Rang",
    "student": "Élève",
    "points": "Points",
    "noData": "Aucune donnée de classement",
    "topStudents": "Meilleurs élèves",
    "rankChanged": "Rang : {{rank}}"
  },
  "settlements": {
    "title": "Historique des règlements",
    "phase": "Phase",
    "date": "Date",
    "studentCount": "Nombre d'élèves",
    "totalPoints": "Points totaux",
    "actions": "Actions",
    "viewDetails": "Voir les détails",
    "noSettlements": "Aucun règlement pour le moment",
    "phaseDetail": "Détails de la phase {{phase}}",
    "settlementDate": "Date de règlement : {{date}}",
    "totalStudents": "Total des élèves : {{count}}",
    "totalPointsChange": "Modification totale des points : {{points}}"
  },
  "reasons": {
    "title": "Gestion des raisons",
    "addReason": "Ajouter une raison",
    "editReason": "Modifier la raison",
    "name": "Nom de la raison",
    "points": "Points",
    "positive": "Positif",
    "negative": "Négatif",
    "noReasons": "Aucune raison pour le moment",
    "addTitle": "Ajouter une raison",
    "editTitle": "Modifier la raison",
    "namePlaceholder": "Entrez le nom de la raison",
    "pointsPlaceholder": "Entrez les points",
    "confirmDelete": "Confirmer la suppression de cette raison ?",
    "saved": "Enregistré",
    "saveFailed": "Échec de l'enregistrement",
    "deleted": "Supprimé",
    "deleteFailed": "Échec de la suppression",
    "reasonExists": "La raison existe déjà"
  },
  "autoScore": {
    "title": "Ajout automatique de points",
    "addRule": "Ajouter une règle",
    "editRule": "Modifier la règle",
    "deleteRule": "Supprimer la règle",
    "ruleName": "Nom de la règle",
    "trigger": "Déclencheur",
    "action": "Action",
    "interval": "Intervalle",
    "enabled": "Activé",
    "noRules": "Aucune règle pour le moment",
    "addTitle": "Ajouter une règle",
    "editTitle": "Modifier la règle",
    "namePlaceholder": "Entrez le nom de la règle",
    "triggerPlaceholder": "Sélectionnez le déclencheur",
    "actionPlaceholder": "Sélectionnez l'action",
    "intervalPlaceholder": "Sélectionnez l'intervalle",
    "confirmDelete": "Confirmer la suppression de cette règle ?",
    "saved": "Enregistré",
    "saveFailed": "Échec de l'enregistrement",
    "deleted": "Supprimé",
    "deleteFailed": "Échec de la suppression",
    "ruleExists": "La règle existe déjà"
  },
  "rewardExchange": {
    "title": "Échange de récompenses",
    "rewards": "Récompenses",
    "exchange": "Échanger",
    "history": "Historique",
    "noRewards": "Aucune récompense pour le moment",
    "noHistory": "Aucun historique pour le moment",
    "rewardName": "Nom de la récompense",
    "cost": "Coût",
    "stock": "Stock",
    "exchangeSuccess": "Échange réussi",
    "exchangeFailed": "Échec de l'échange",
    "insufficientPoints": "Points insuffisants",
    "outOfStock": "Rupture de stock"
  },
  "rewardSettings": {
    "title": "Paramètres de récompense",
    "addReward": "Ajouter une récompense",
    "editReward": "Modifier la récompense",
    "deleteReward": "Supprimer la récompense",
    "name": "Nom",
    "cost": "Coût",
    "stock": "Stock",
    "noRewards": "Aucune récompense pour le moment",
    "addTitle": "Ajouter une récompense",
    "editTitle": "Modifier la récompense",
    "namePlaceholder": "Entrez le nom",
    "costPlaceholder": "Entrez le coût",
    "stockPlaceholder": "Entrez le stock",
    "confirmDelete": "Confirmer la suppression de cette récompense ?",
    "saved": "Enregistré",
    "saveFailed": "Échec de l'enregistrement",
    "deleted": "Supprimé",
    "deleteFailed": "Échec de la suppression",
    "rewardExists": "La récompense existe déjà"
  },
  "recovery": {
    "title": "Phrase de récupération SecScore",
    "saved": "J'ai enregistré",
    "export": "Exporter le fichier texte",
    "exportHint": "Il est recommandé d'exporter et de stocker hors ligne. En cas de perte, il ne pourra pas être récupéré.",
    "hint": "Il est recommandé d'exporter et de stocker hors ligne après l'export. En cas de perte, il ne pourra pas être récupéré."
  }
}
