{
  "backups": {
    "warning": "Arrêtez le groupe de combat avant de créer ou de restaurer une sauvegarde. Les sauvegardes prises pendant que le jeu tourne peuvent être incohérentes, et une restauration nécessite l'arrêt du groupe de combat.",
    "loadFailed": "Échec du chargement des sauvegardes : {{message}}",
    "take": {
      "title": "Créer une sauvegarde",
      "desc": "Capture la base de données PostgreSQL du groupe de combat dans un fichier horodaté sur l'hôte. Recommandé avant des changements risqués.",
      "btn": "Créer une sauvegarde"
    },
    "taken": "Sauvegarde créée : {{name}}",
    "takeFailed": "Échec de la sauvegarde : {{message}}",
    "recent": {
      "title": "Sauvegardes récentes",
      "empty": "Aucune sauvegarde pour l'instant."
    },
    "col": {
      "name": "Fichier",
      "size": "Taille",
      "modified": "Créée"
    },
    "download": "Télécharger",
    "restoreLabel": "Restaurer",
    "restoreFailed": "Échec de la restauration : {{message}}",
    "restoreConfirmTitle": "Restaurer la base de données ?",
    "restoreConfirmDesc": "Cela remplace la base de données active par {{name}}. Le groupe de combat doit être arrêté — action irréversible.",
    "deleteLabel": "Supprimer",
    "deleteConfirmTitle": "Supprimer la sauvegarde ?",
    "deleteConfirmDesc": "Supprimer définitivement {{name}} ?",
    "deleteFailed": "Échec de la suppression : {{message}}",
    "schedule": {
      "title": "Planification des sauvegardes",
      "enable": "Activé",
      "desc": "Exécute des sauvegardes automatiques selon un planning hebdomadaire. Les heures sont dans le fuseau configuré.",
      "nextBackup": "Prochaine sauvegarde : {{when}}",
      "noneScheduled": "Aucune sauvegarde planifiée",
      "noRules": "Aucune règle — ajoutez-en une ci-dessous.",
      "addRule": "Ajouter une règle",
      "removeRule": "Supprimer la règle",
      "keepN": "Conserver les dernières",
      "keepHint": "0 = tout conserver",
      "timezone": "Fuseau horaire",
      "tzPlaceholder": "local hôte (p. ex. UTC)",
      "save": "Enregistrer",
      "saveFailed": "Échec de l'enregistrement : {{message}}"
    }
  },
  "serverHealth": {
    "directorProxied": "(via proxy)",
    "ifaceLoadFailed": "Échec du chargement des interfaces web : {{message}}",
    "ifaceSaveFailed": "Échec de l'enregistrement : {{message}}",
    "ifaceLabel": "Libellé",
    "ifaceUrl": "URL (http:// ou /chemin)",
    "editInterfaces": "Modifier les interfaces web",
    "removeInterface": "Supprimer",
    "addInterface": "Ajouter une interface",
    "saveInterfaces": "Enregistrer",
    "title": "État du serveur",
    "subtitle": "État en direct de la VM, du groupe de combat et des ports.",
    "gamePorts": "Jeu (UDP)",
    "webPort": "Web",
    "vm": "VM",
    "bg": "Groupe de combat",
    "up": "Actif",
    "down": "Inactif",
    "bgVm": "Groupe de combat + VM",
    "upFor": "Actif depuis {{uptime}}",
    "noUptime": "Durée de fonctionnement indisponible",
    "components": "Infos du groupe de combat",
    "bgState": "État GC",
    "database": "Base de données",
    "director": "Director",
    "configured": "Configuré",
    "notConfigured": "Non configuré",
    "uptime": "Disponibilité",
    "readyState": "État de préparation",
    "ready": "Prêt",
    "notReady": "Pas prêt",
    "webInterfaces": "Interfaces web",
    "noInterfaces": "Aucune interface web configurée.",
    "copied": "Copié dans le presse-papiers",
    "copyFailed": "Échec de la copie",
    "copy": "Copier",
    "open": "Ouvrir",
    "gameServers": "Serveurs de jeu",
    "pods": "{{n}} pods"
  },
  "restarts": {
    "title": "Redémarrages planifiés",
    "enable": "Activé",
    "nextRestart": "Prochain redémarrage : {{when}}",
    "noneScheduled": "Aucun redémarrage planifié",
    "noRules": "Aucune règle — ajoutez-en une ci-dessous.",
    "addRule": "Ajouter une règle",
    "removeRule": "Supprimer la règle",
    "warnMinutes": "Alerte (min)",
    "timezone": "Fuseau horaire",
    "tzPlaceholder": "local hôte (p. ex. UTC)",
    "save": "Enregistrer",
    "skipNext": "Ignorer le prochain",
    "failedToLoad": "Échec du chargement : {{message}}",
    "saveFailed": "Échec de l'enregistrement : {{message}}"
  },
  "director": {
    "title": "Configuration du Director",
    "subtitle": "Paramètres du Battlegroup Director — instanciation des cartes et réglages avancés (AMP).",
    "loading": "Chargement de la configuration du Director…",
    "unsupported": "L'édition de la configuration du Director n'est disponible que sur le plan de contrôle AMP.",
    "save": "Enregistrer",
    "saveWithCount": "Enregistrer ({{count}})",
    "saveFailed": "Échec de l'enregistrement : {{message}}",
    "readOnly": "lecture seule",
    "restartNote": "Les modifications sont écrites dans director_config.ini et prennent effet après un redémarrage du serveur."
  },
  "help": {
    "menu": "Aide",
    "reportIssue": "Signaler un problème",
    "copyDiagnostics": "Copier le diagnostic",
    "viewOnGitHub": "Voir sur GitHub",
    "copied": "Diagnostic copié dans le presse-papiers",
    "copyFailed": "Impossible de copier dans le presse-papiers"
  },
  "landsraad": {
    "title": "Landsraad",
    "subtitle": "Le mandat politique hebdomadaire — décrets et tableau des tâches des maisons (lecture seule).",
    "failedToLoad": "Échec du chargement du Landsraad : {{message}}",
    "currentTerm": "Mandat actuel",
    "noTerm": "Aucun mandat actif.",
    "testTerm": "Mandat de test",
    "term": {
      "id": "Mandat",
      "window": "Période",
      "reigning": "Faction régnante",
      "activeDecree": "Décret actif",
      "electedDecree": "Décret élu",
      "winning": "Faction gagnante"
    },
    "decrees": "Décrets",
    "decreesDesc": "Bonus à l'échelle du serveur pouvant être élus chaque mandat.",
    "noDecrees": "Aucun décret.",
    "weight": "Poids {{weight}}",
    "enabled": "Activé",
    "disabled": "Désactivé",
    "taskBoard": "Tableau des tâches",
    "taskBoardDesc": "Tâches de contribution des maisons pour le mandat actuel.",
    "noTasks": "Aucune tâche.",
    "tasks": {
      "index": "#",
      "house": "Maison",
      "goal": "Objectif",
      "completed": "Statut",
      "sysselraad": "Sysselraad",
      "done": "Terminé",
      "open": "Ouvert",
      "yes": "Oui"
    }
  },
  "guilds": {
    "title": "Guildes ({{count}})",
    "subtitle": "Guildes de joueurs sur ce serveur.",
    "view": "Voir",
    "empty": "Aucune guilde trouvée.",
    "failedToLoad": "Échec du chargement des guildes : {{message}}",
    "members": "Membres",
    "invites": "Invitations en attente",
    "noMembers": "Aucun membre.",
    "noInvites": "Aucune invitation en attente.",
    "roleN": "Rôle {{id}}",
    "manage": "Gérer",
    "editGuild": "Modifier la guilde",
    "nameLabel": "Nom",
    "descLabel": "Description",
    "save": "Enregistrer",
    "saved": "Guilde mise à jour.",
    "saveFailed": "Échec de l'enregistrement : {{message}}",
    "makeAdmin": "Promouvoir admin",
    "roleAdmin": "Admin",
    "roleMember": "Membre",
    "roleChanged": "Rôle mis à jour.",
    "roleChangeFailed": "Échec du changement de rôle : {{message}}",
    "invitedBy": "invité par {{name}}",
    "columns": {
      "name": "Nom",
      "faction": "Faction",
      "members": "Membres",
      "description": "Description"
    }
  },
  "app": {
    "reportIssue": "Signaler un problème sur GitHub",
    "changesNote": "Les modifications de tous les onglets sont enregistrées ensemble.",
    "checkUpdates": "Vérifier les mises à jour",
    "configureBackend": "Configurer le backend",
    "goHome": "Accueil",
    "openSettings": "Ouvrir les paramètres",
    "reconnect": "Reconnecter",
    "reconnected": "Reconnecté — base de données connectée",
    "reconnectFailed": "Échec de la reconnexion : {{error}}",
    "reconnecting": "Reconnexion…",
    "reinstall": "Réinstaller",
    "reinstalled": "{{version}} réinstallé. Le serveur redémarre…",
    "saveApply": "Enregistrer et appliquer",
    "selectLanguage": "Sélectionner la langue",
    "selectTheme": "Choisir le thème",
    "settings": "Paramètres",
    "signIn": "Se connecter",
    "switchToSidenav": "Passer à la navigation latérale",
    "switchToTopnav": "Passer à la navigation supérieure",
    "title": "DUNE ADMIN",
    "updateAvailable": "Mise à jour disponible",
    "updateAvailableBody": "Une nouvelle version est disponible : v{{current}} → v{{latest}}.",
    "updated": "Mis à jour vers {{version}}. Le serveur redémarre…",
    "updateFailed": "Échec de la mise à jour : {{message}}",
    "updateNow": "Mettre à jour",
    "viewReleaseNotes": "Voir les notes de version",
    "backendUnreachable": {
      "body": "L'application web s'est chargée, mais elle n'a pas pu se connecter au backend dune-admin. Vérifiez que l'exécutable dune-admin est en cours d'exécution et accessible depuis ce navigateur.",
      "hint1": "Vérifiez que le service/exécutable dune-admin est en cours d'exécution sur le serveur.",
      "hint2": "Vérifiez que l'URL du backend ci-dessus est correcte et accessible (hôte, port, pare-feu, HTTPS).",
      "hint3": "Derrière un proxy ou sur un autre hôte ? Définissez l'URL du backend dans les Paramètres.",
      "retry": "Réessayer",
      "targetLabel": "Backend configuré",
      "title": "Impossible de joindre le backend dune-admin"
    }
  },
  "bases": {
    "ariaLabel": "Bases des joueurs",
    "columns": {
      "id": "ID",
      "name": "Nom",
      "pieces": "Pièces",
      "placeables": "Éléments posables"
    },
    "export": "Exporter",
    "failedToLoad": "Échec du chargement des bases : {{message}}",
    "featureNotAvailable": "Fonctionnalité non disponible",
    "featureNotAvailableDesc": "Cette version du binaire dune-admin ne supporte pas la liste des bases. Mettez à niveau vers la dernière version pour utiliser cette fonctionnalité.",
    "layoutAccountStrong": "Layout Tools",
    "noBasesFound": "Aucune base trouvée.",
    "subtitle": "Bases de joueurs en direct dans le monde. Exportez n'importe quelle base en tant que schéma compatible solido.",
    "title_one": "Bases ({{count}})",
    "title_many": "MISSING",
    "title_other": "Bases ({{count}})"
  },
  "battlegroup": {
    "actions": {
      "backup": "Sauvegarder",
      "backupMsg": "Créer une sauvegarde de la base de données ? Cela peut prendre quelques minutes.",
      "restart": "Redémarrer",
      "restartMsg": "Redémarrer le serveur ? Les joueurs seront brièvement déconnectés.",
      "restore": "Restaurer",
      "restoreMsg": "Restaurer la base de données depuis une sauvegarde ? Cela écrasera les données actuelles.",
      "start": "Démarrer",
      "startMsg": "Démarrer le serveur du groupe de combat ?",
      "stop": "Arrêter",
      "stopMsg": "Arrêter le serveur ? Tous les joueurs seront déconnectés.",
      "update": "Mettre à jour",
      "updateMsg": "Effectuer une mise à jour du serveur ? Cela met le serveur hors ligne brièvement."
    },
    "backupLoadFailed": "Impossible de charger les fichiers de sauvegarde",
    "bodyPlaceholder": "Corps",
    "broadcastBtn": "Diffuser",
    "broadcasts": "Diffusions",
    "broadcastSent": "Diffusion envoyée",
    "clickRefresh": "Cliquez sur Actualiser pour charger l'état.",
    "cmdCompleted": "{{label}} terminé",
    "cmdFailed": "{{label}} échoué : {{message}}",
    "columns": {
      "age": "Âge",
      "dim": "Dim",
      "map": "Carte",
      "part": "Part",
      "phase": "Phase",
      "players": "Joueurs",
      "queue": "File",
      "ready": "Prêt"
    },
    "confirm": {
      "confirmPrefix": "Confirmer",
      "serverSuffix": "Serveur"
    },
    "database": "Base de données",
    "durationLabel": "Durée (s)",
    "genericMessage": "Message générique",
    "initializing": "(initialisation)",
    "initWarning": "Le serveur vient de démarrer — les serveurs de jeu peuvent encore être en cours d'initialisation (~2 min).",
    "loadingStatus": "Chargement de l'état...",
    "modal": {
      "download": "Télécharger"
    },
    "noGameServers": "Aucun serveur de jeu trouvé.",
    "noOutput": "(aucune sortie)",
    "phase": "Phase",
    "restore": {
      "dropzone": "Déposer ou cliquer pour télécharger un fichier .backup ou .zip depuis votre ordinateur",
      "noBackups": "Aucun fichier de sauvegarde sur le serveur.",
      "restoreBtn": "Restaurer {{file}}",
      "restoreCompleted": "Restauration terminée",
      "title": "Restaurer depuis une sauvegarde",
      "uploaded": "{{name}} téléchargé",
      "warning": "Cela écrase les données actuelles. Le serveur doit être arrêté au préalable."
    },
    "restoreLabel": "Restaurer",
    "runningCmd": "Exécution de {{cmd}}...",
    "serverControl": "Contrôle du serveur",
    "shutdownBroadcast": "Diffusion d'arrêt",
    "shutdownCancelled": "Diffusion d'arrêt annulée",
    "shutdownDelay": "Délai (min)",
    "shutdownDelayLabel": "Minutes de délai",
    "shutdownSent": "Diffusion d'arrêt envoyée ({{delay}} min)",
    "shutdownType": "Type",
    "shutdownTypeLabel": "Type d'arrêt",
    "statusFailed": "Échec de l'état : {{message}}",
    "statusTitle": "État du groupe de combat",
    "titleFull": "{{bgTitle}} ({{bgName}})",
    "titlePlaceholder": "Titre"
  },
  "blueprints": {
    "ariaLabel": "Schémas",
    "columns": {
      "id": "ID",
      "itemId": "ID d'objet",
      "name": "Nom",
      "owner": "Propriétaire",
      "pieces": "Pièces",
      "placeables": "Éléments posables"
    },
    "failedToLoad": "Échec du chargement des schémas : {{message}}",
    "importBlueprint": "Importer un schéma",
    "importFailed": "Échec de l'importation : {{message}}",
    "importModal": {
      "blueprintFile": "Fichier de schéma",
      "dropzone": "Déposer ou cliquer pour télécharger un fichier de schéma .json",
      "import": "Importer",
      "playerLabel": "Joueur",
      "playerPlaceholder": "Sélectionner un joueur…",
      "playersLabel": "Joueurs",
      "title": "Importer un schéma"
    },
    "importSuccess": "Schéma importé avec succès",
    "layoutAccountStrong": "Layout Tools",
    "noBlueprintsFound": "Aucun schéma trouvé.",
    "selectFile": "Sélectionner un fichier de schéma",
    "selectPlayer": "Sélectionner un joueur",
    "subtitle": "Gérer les schémas de base sauvegardés. Exporter ou importer les constructions des joueurs.",
    "title_one": "Schémas ({{count}})",
    "title_many": "MISSING",
    "title_other": "Schémas ({{count}})"
  },
  "common": {
    "timezone": "Fuseau horaire",
    "tzHostLocal": "Local hôte",
    "add": "Ajouter",
    "cancel": "Annuler",
    "checking": "Vérification…",
    "close": "Fermer",
    "confirm": "Confirmer",
    "error": "Erreur :",
    "export": "Exporter",
    "failed": "Échec : {{message}}",
    "noResults": "Aucun résultat.",
    "refresh": "Actualiser",
    "remove": "Supprimer",
    "save": "Enregistrer",
    "saving": "Enregistrement…",
    "send": "Envoyer"
  },
  "database": {
    "columnColumn": "Colonne",
    "enterSearchTerm": "Entrez un terme de recherche",
    "enterSQL": "Entrez une requête SQL",
    "enterTableName": "Entrez un nom de table",
    "failed": "Échec : {{message}}",
    "limitLabel": "Limite",
    "noResults": "Aucun résultat.",
    "nullableColumn": "Nullable",
    "refreshLabel": "Actualiser",
    "resultLabel": "Résultat",
    "rowsColumn": "Lignes",
    "rowsLimited": "Résultats limités à 200 lignes.",
    "runBtn": "Exécuter",
    "runHint": "Cmd/Ctrl+Entrée pour exécuter · Tab accepte la suggestion",
    "runQuery": "Exécuter la requête",
    "searchLabel": "Nom de colonne ou de table",
    "searchPlaceholder": "player_id, faction...",
    "sections": {
      "backups": "Sauvegardes",
      "describe": "Décrire",
      "sample": "Exemple",
      "search": "Rechercher des colonnes",
      "sql": "Exécuter SQL",
      "tables": "Tables"
    },
    "sideNavTitle": "Base de données",
    "sqlPlaceholder": "SELECT * FROM dune.actors LIMIT 10;",
    "tableColumn": "Table",
    "tableNameLabel": "Nom de table",
    "tablePlaceholder": "actors",
    "typeColumn": "Type"
  },
  "liveMap": {
    "betaBody": "Cette fonctionnalité est en développement actif. Certaines fonctionnalités peuvent encore changer.",
    "betaTitle": "Bêta — En cours de développement",
    "calibActive": "Mode calibration — cliquez sur la carte exactement où se trouve votre personnage.",
    "calibNoPlayer": "Aucun joueur en ligne pour ancrer la calibration.",
    "calibPoints": "{{n}} point(s) capturé(s) — nécessite 2+, espacés, pour résoudre.",
    "calibrate": "Calibrer",
    "clear": "Effacer",
    "clearFilters": "Effacer les filtres",
    "densityNoneSelected": "Activez des types de ressources ci-dessus pour voir leur densité.",
    "densityOverlay": "Afficher la densité des ressources",
    "dragTeleportDesc": "Accrochage sûr vers ({{x}}, {{y}}) — le joueur atterrira sur le sol le plus proche.",
    "dragTeleportTitle": "Téléporter {{name}} ?",
    "failedToLoad": "Échec du chargement de la carte : {{message}}",
    "filter": "Filtre",
    "filterBases": "Bases",
    "filterHazards": "Hazards",
    "filterKeys": "Keys",
    "filterLandsraad": "Landsraad",
    "filterDensity": "Superposition de densité",
    "filterLocations": "Locations",
    "filterNPCs": "NPCs",
    "filterResources": "Resources",
    "filterLive": "En direct",
    "filterStaticObjects": "Static Objects",
    "filterTrainers": "Trainers",
    "filterVendors": "Vendors",
    "filterSearch": "Trouver un filtre…",
    "players": "Joueurs",
    "spawnsLoaded_one": "{{count}} marqueurs statiques chargés",
    "spawnsLoaded_many": "MISSING",
    "spawnsLoaded_other": "{{count}} marqueurs statiques chargés",
    "spawnTooltipCoords": "{{x}}, {{y}}",
    "subtitle": "Joueurs, véhicules et bases sur la carte en direct",
    "teleportHere": "Téléporter ici",
    "teleportMode": "Mode téléportation",
    "teleportModeActive": "Cliquez sur la carte pour définir la destination",
    "teleportPlayer": "Joueur à téléporter",
    "teleportSelectPlayer": "Sélectionner un joueur…",
    "teleportSent": "Téléportation envoyée",
    "title": "Carte en direct",
    "total": "Total",
    "unsupported": "La carte en direct n'est pas disponible sur ce serveur.",
    "updated": "mis à jour à {{time}}",
    "vehicles": "Véhicules"
  },
  "logs": {
    "antiCheatLabel": "Événements anti-triche",
    "antiCheatLog": "Journal anti-triche",
    "antiCheatTitle": "Événements anti-triche (7j)",
    "autoScroll": "Défilement auto",
    "cheats7d": "Triches (7j)",
    "clear": "Effacer",
    "columns": {
      "character": "Personnage",
      "cheatType": "Type de triche",
      "time": "Heure"
    },
    "connectedPod": "● Connecté · {{pod}}",
    "disconnected": "○ Déconnecté",
    "disconnectedState": "Déconnecté.",
    "eventsCount_one": "{{count}} événements",
    "eventsCount_many": "MISSING",
    "eventsCount_other": "{{count}} événements",
    "failedToLoad": "Échec du chargement des pods : {{message}}",
    "linesCount_one": "{{count}} lignes",
    "linesCount_many": "MISSING",
    "linesCount_other": "{{count}} lignes",
    "logFiles": "Fichiers journaux",
    "logFileSingular": "fichier journal",
    "noCheatEvents": "Aucun événement de triche trouvé dans les 7 derniers jours.",
    "pods": "Pods",
    "podSingular": "pod",
    "reconnect": "Reconnecter",
    "selectFromPanel": "Sélectionnez un {{label}} dans le panneau de gauche pour commencer la diffusion des journaux.",
    "selectSource": "○ Sélectionner un {{label}}",
    "sourceTitle_one": "{{label}} ({{count}})",
    "sourceTitle_many": "MISSING",
    "sourceTitle_other": "{{label}} ({{count}})",
    "stop": "Arrêter",
    "waitingForLines": "En attente de lignes de journal...",
    "wsError": "Erreur WebSocket"
  },
  "market": {
    "bot": {
      "actions": {
        "cleanupFailed": "Échec du nettoyage : {{message}}",
        "dormantHint": "Bot désactivé — activez-le dans l'onglet Serveur pour utiliser les contrôles du cycle de vie.",
        "pause": "Mettre en pause",
        "pauseFailed": "Échec de la mise en pause du bot : {{message}}",
        "pauseSuccess": "Pause du bot : {{output}}",
        "reinitialize": "Réinitialiser",
        "reinitializeFailed": "Échec de la réinitialisation du bot : {{message}}",
        "reinitializeSuccess": "Réinitialisation du bot : {{output}}",
        "resume": "Reprendre",
        "resumeFailed": "Échec de la reprise du bot : {{message}}",
        "resumeSuccess": "Reprise du bot : {{output}}",
        "wipedListings": "{{orders}} annonces effacées ({{items}} objets)",
        "wipeListings": "Effacer les annonces",
        "wipeListingsConfirm": "Effacer les annonces",
        "wipeListingsDesc": "Cela supprime chaque annonce Revy active sur la bourse. Les annonces des joueurs, l'historique des commandes exécutées et le solde Solari de Revy sont intacts. Le prochain tick de liste repeuplera les annonces depuis le catalogue.",
        "wipeListingsTitle": "Effacer toutes les annonces du bot ?"
      },
      "botSectionsLabel": "Sections du bot",
      "config": "Configuration",
      "configEditor": {
        "buyThreshold": "Seuil d'achat",
        "buyThresholdDesc": "Achète une annonce uniquement si son prix est à ou en dessous de ce % du prix de référence du bot. 100% = égal ou inférieur · 70% = réduction de 30%+ requise · 110% = jusqu'à 10% au-dessus du prix bot.",
        "buyThresholdHint": "{{pct}}% du prix de référence du bot",
        "buyTickHint": "ex. 5m",
        "buyTickInterval": "Intervalle de tick d'achat",
        "configSaved": "Configuration enregistrée — les modifications s'appliquent au prochain tick",
        "gradeFlawless": "Sans défaut",
        "gradeMasterwork": "Chef-d'œuvre",
        "gradeMultipliers": "Multiplicateurs de grade",
        "gradeMultipliersDesc": "Ajuste le prix de l'annonce par grade de qualité. Le grade 0 (Standard) est la base et doit rester à 1,0.",
        "gradePristine": "Pristine",
        "gradeRefined": "Raffiné",
        "gradeStandard": "Standard",
        "gradeSuperior": "Supérieur",
        "limits": "Limites",
        "limitsDesc": "Contrôle combien d'objets le bot achète et liste par tick.",
        "listingsPerGrade": "Annonces par grade",
        "listingsPerGradeDesc": "Annonces actives maintenues par objet par grade de qualité (0 = Standard … 5 = Sans défaut). Les empilables utilisent uniquement le grade 0. Exemple : 5 × 6 grades = jusqu'à 30 annonces par objet gradable.",
        "listingsPerGradeHint": "par objet par niveau de qualité",
        "listTickHint": "ex. 30m, 1h",
        "listTickInterval": "Intervalle de tick de liste",
        "maxBuysPerTick": "Achats max par tick",
        "rarityMultipliers": "Multiplicateurs de rareté",
        "rarityMultipliersDesc": "S'applique aux objets sans prix vendeur PNJ et aux équipements fabriqués Unique/Souvenir. Classé par rareté ; Commun (1,0) est la référence. Les multiplicateurs de grade s'appliquent en plus.",
        "tickIntervals": "Intervalles de tick",
        "vendorMultipliers": "Multiplicateurs vendeur",
        "vendorMultipliersDesc": "S'applique aux objets ayant un prix vendeur PNJ (la plupart des objets). Prix de l'annonce = prix vendeur × ce multiplicateur, classé par rareté. Seul l'un des multiplicateurs Vendeur ou Rareté s'applique à un objet donné."
      },
      "configUnavailable": "Configuration indisponible.",
      "disabledItems": {
        "ariaLabel": "Objets désactivés",
        "columns": {
          "name": "Nom",
          "templateId": "ID de modèle"
        },
        "disabledItemsCount_one": "Objets désactivés ({{count}})",
        "disabledItemsCount_many": "MISSING",
        "disabledItemsCount_other": "Objets désactivés ({{count}})",
        "disabledItemsHeading": "Objets désactivés",
        "noDisabledItems": "Aucun objet actuellement désactivé.",
        "noMatchingItems": "Aucun objet correspondant trouvé.",
        "searchAriaLabel": "Rechercher des objets désactivés",
        "searchLabel": "Rechercher des objets à désactiver",
        "searchPlaceholder": "Rechercher par nom ou ID de modèle…"
      },
      "disabledItemsTab": "Objets désactivés",
      "log": {
        "autoScroll": "Défilement auto",
        "backendUnreachable": "Impossible d'atteindre le backend — vérifiez qu'il fonctionne.",
        "clear": "Effacer",
        "connClosed": "Connexion fermée (code {{code}})",
        "connClosedReason": "Connexion fermée (code {{code}}) : {{reason}}",
        "connect": "Connecter",
        "connected": "● connecté",
        "connecting": "◌ connexion…",
        "connectingState": "Connexion…",
        "error": "✕ erreur",
        "idle": "○ déconnecté",
        "notAvailable": "Diffusion de journaux non disponible",
        "stop": "Arrêter",
        "waitingForLines": "En attente de lignes de journal…",
        "wsError": "Échec de la connexion WebSocket — le flux de journal a été interrompu."
      },
      "logs": "Journaux",
      "panelTitle": "Contrôle du bot — Revy",
      "reloadConfig": "Recharger la configuration",
      "reset": "Réinitialiser",
      "saveConfig": "Enregistrer la configuration",
      "server": "Serveur",
      "serverConfig": {
        "cacheDb": "BD cache",
        "changesNote": "Les modifications nécessitent un redémarrage du serveur pour prendre effet.",
        "embeddedBot": "Bot intégré",
        "enableEmbedded": "Activer le bot intégré",
        "itemData": "Données d'objets",
        "loadFailed": "Échec du chargement de la configuration serveur",
        "remoteBot": "Bot distant",
        "remoteToken": "Jeton distant",
        "remoteUrl": "URL distante",
        "restartRequired": "(redémarrage requis)",
        "savedConfig": "Configuration serveur enregistrée — redémarrage requis pour appliquer les modifications",
        "saveFailed": "Échec de l'enregistrement : {{message}}",
        "statePath": "Chemin d'état"
      },
      "status": {
        "balance": "Solde",
        "errors": "Erreurs",
        "label": "État",
        "lastBuyTick": "Dernier tick d'achat",
        "lastListTick": "Dernier tick de liste",
        "listings": "Annonces",
        "nextBuyTick": "Prochain tick d'achat",
        "nextListTick": "Prochain tick de liste",
        "paused": "⏸ En pause",
        "running": "● En cours",
        "uptime": "Disponibilité"
      },
      "tickingEnabled": "Ticking activé"
    },
    "botControl": "Contrôle du bot",
    "itemDetail": {
      "activeListings": "Annonces actives",
      "armorStats": "Statistiques d'armure",
      "armorValue": "Valeur d'armure",
      "armorValueByQuality": "Valeur d'armure par qualité",
      "botStock": "Stock bot",
      "category": "Catégorie",
      "damageMultiplierByQuality": "Multiplicateur de dégâts par qualité",
      "itemInfo": "Infos objet",
      "listingsLabel": "Annonces",
      "lowestPrice": "Prix le plus bas",
      "noActiveListings": "Aucune annonce active.",
      "priceCol": "Prix",
      "rarityLabel": "Rareté",
      "resistances": "Résistances",
      "seller": "Vendeur",
      "stockCol": "Stock",
      "tierLabel": "Rang",
      "totalStock": "Stock total",
      "weaponQualityScaling": "Mise à l'échelle de qualité d'arme"
    },
    "noBotConnected": "Aucun bot de marché connecté — activez le bot intégré pour le gérer ici",
    "search": {
      "allSellers": "Tous les vendeurs",
      "ariaLabel": "Rechercher des objets",
      "botOnly": "Bot uniquement",
      "clearFilters": "Effacer",
      "playersOnly": "Joueurs uniquement",
      "searchPlaceholder": "Rechercher des objets...",
      "sellerAriaLabel": "Filtrer par vendeur"
    },
    "sidebar": {
      "allItems": "Tous les objets",
      "categories": "Catégories",
      "collapseAriaLabel": "Réduire la barre latérale",
      "expandAriaLabel": "Développer la barre latérale",
      "schematics": "Schémas"
    },
    "subtitle": "Parcourir les annonces actives sur la bourse des bots et des vendeurs joueurs.",
    "table": {
      "ariaLabel": "Objets du marché",
      "botStock": "Stock bot",
      "category": "Catégorie",
      "grade": "Grade",
      "item": "Objet",
      "listings": "Annonces",
      "lowestPrice": "Prix le plus bas",
      "noItemsFound": "Aucun objet trouvé.",
      "rarity": "Rareté",
      "stock": "Stock",
      "tier": "Rang"
    },
    "title": "Tableau du marché"
  },
  "nav": {
    "director": "Director",
    "landsraad": "Landsraad",
    "guilds": "Guildes",
    "bases": "Bases",
    "battlegroup": "État du serveur",
    "blueprints": "Schémas",
    "database": "Base de données",
    "groups": {
      "economy": "Économie",
      "operations": "Opérations",
      "playerWorld": "Monde des joueurs"
    },
    "liveMap": "Carte en direct",
    "logs": "Journaux",
    "market": "Bot du marché",
    "players": "Joueurs",
    "server": "Paramètres serveur",
    "storage": "Stockage",
    "welcome": "Kits de bienvenue"
  },
  "players": {
    "actions": {
      "admin": {
        "characterExport": "Export du personnage",
        "characterExportDesc": "Télécharger les données du personnage en JSON",
        "confirmReset": "Confirmer la réinitialisation",
        "confirmWipe": "Confirmer l'effacement",
        "delete": "Supprimer",
        "deleteTutorials": "Supprimer les tutoriels",
        "deleteTutorialsConfirmDesc": "Cela supprimera tous les enregistrements de complétion de tutoriels pour {{player}}.",
        "deleteTutorialsDesc": "Supprime tous les enregistrements de complétion de tutoriels",
        "deleteTutorialsTitle": "Supprimer les tutoriels ?",
        "destructive": "Actions destructives en direct",
        "destructiveDesc": "Irréversible — le joueur doit être en ligne.",
        "dismiss": "Rejeter",
        "dismissReturning": "Rejeter la popup du joueur de retour",
        "dismissReturningDesc": "Marque la récompense comme réclamée pour que la popup de connexion cesse d'apparaître",
        "downloadExport": "Télécharger",
        "exportDownloaded": "Export téléchargé",
        "kick": "Expulser",
        "kickDesc": "Déconnecte le joueur du serveur",
        "kickPlayer": "Expulser le joueur",
        "liveActions": "Actions en direct",
        "liveActionsDesc": "Commandes RabbitMQ — le joueur doit être en ligne.",
        "loadingPlayers": "Chargement des joueurs…",
        "manageLocations": "Gérer les emplacements",
        "manageLocationsModal": {
          "addHint": "Entrez un nom et des coordonnées, puis Enregistrer. Enregistrer un nom existant met à jour ses coordonnées. Laissez Z vide pour le niveau du sol (0).",
          "addSection": "Ajouter / Mettre à jour un emplacement",
          "delete": "Supprimer",
          "done": "Terminé",
          "nameLabel": "Nom",
          "namePlaceholder": "ex. Windsack",
          "noLocations": "Aucun emplacement pour l'instant — ajoutez-en un ci-dessus.",
          "save": "Enregistrer",
          "title": "Gérer les emplacements"
        },
        "mapPickerModal": {
          "cancel": "Annuler",
          "confirm": "Utiliser ces coordonnées",
          "hint": "Cliquez n'importe où sur le Bassin Hagga pour capturer X/Y. Z est par défaut {{z}} — ajustez manuellement si nécessaire.",
          "selected": "Sélectionné :",
          "title": "Choisir un emplacement sur la carte"
        },
        "move": "Déplacer",
        "moveToXyz": "Déplacer vers XYZ",
        "persistent": "Persistant",
        "pickOnMap": "Choisir sur la carte",
        "pickTarget": "Choisir une cible…",
        "positionReadFailed": "Impossible de lire la position du joueur",
        "resetActions": "Réinitialiser les actions",
        "resetProgression": "Réinitialiser la progression",
        "resetProgressionConfirmDesc": "Cela effacera XP, compétences et progression du parcours pour {{player}}. Cette action est irréversible.",
        "resetProgressionDesc": "Efface XP, compétences et parcours du joueur",
        "resetProgressionTitle": "Réinitialiser définitivement la progression ?",
        "selectSpawnLocation": "Sélectionner un emplacement d'apparition…",
        "selectTargetLabel": "Joueur cible",
        "selectVehicle": "Sélectionner un véhicule…",
        "spawn": "Faire apparaître",
        "spawnLocationLabel": "Emplacement d'apparition",
        "spawnVehicle": "Faire apparaître un véhicule",
        "spawnVehicleDesc": "Le joueur doit être en ligne. Apparaît à l'emplacement de partition choisi.",
        "teleport": "Téléporter",
        "teleportNote": "En direct si en ligne · écrit en BD si hors ligne",
        "teleportPlaceholder": "Sélectionner un emplacement...",
        "teleportToPlayer": "Téléporter vers le joueur",
        "templateLabel": "Modèle",
        "useCurrent": "Utiliser l'actuel",
        "vehicleLabel": "Type de véhicule",
        "whisper": "Chuchoter",
        "whisperFrom": "De :",
        "whisperSent": "Message chuchoté envoyé à {{player}}",
        "wipe": "Effacer",
        "wipeCodex": "Effacer le codex",
        "wipeCodexConfirmDesc": "Cela effacera toutes les découvertes du codex pour {{player}}.",
        "wipeCodexDesc": "Efface toutes les découvertes du codex",
        "wipeCodexTitle": "Effacer le codex ?",
        "wipeInventory": "Effacer l'inventaire",
        "wipeInventoryConfirmDesc": "Cela détruira tous les objets dans l'inventaire de {{player}}. Cette action est irréversible.",
        "wipeInventoryDesc": "Détruit tous les objets dans l'inventaire du joueur",
        "wipeInventoryTitle": "Effacer définitivement l'inventaire ?"
      },
      "contracts": {
        "applyContracts_one": "Appliquer les contrats ({{count}})",
        "applyContracts_many": "MISSING",
        "applyContracts_other": "Appliquer les contrats ({{count}})",
        "clearAll": "tout effacer",
        "count_one": "{{count}} contrats",
        "count_many": "MISSING",
        "count_other": "{{count}} contrats",
        "desc": "Applique les étiquettes AddedFlagsOnCompletion du contrat + les effets secondaires de promotion de rang. Sélection multiple prise en charge.",
        "filterLabel": "Filtrer les contrats",
        "filterPlaceholder": "Filtrer les contrats (ex. Trainer_Mentat, Atre_Rank01)...",
        "loadFailed": "Échec du chargement : {{error}} — redémarrer le serveur",
        "loadingContracts": "chargement…",
        "noMatching": "Aucun contrat correspondant",
        "reverseContracts_one": "Annuler les contrats ({{count}})",
        "reverseContracts_many": "MISSING",
        "reverseContracts_other": "Annuler les contrats ({{count}})",
        "tagCount_one": "{{count}} étiquette",
        "tagCount_many": "MISSING",
        "tagCount_other": "{{count}} étiquette",
        "tagCountPlural_one": "{{count}} étiquettes",
        "tagCountPlural_many": "MISSING",
        "tagCountPlural_other": "{{count}} étiquettes",
        "title": "Compléter les contrats"
      },
      "experimental": {
        "confirmRun": "Confirmer l'exécution",
        "customScript": "CheatScript — Personnalisé",
        "customScriptDesc": "Essayez n'importe quel nom de script ou commande console.",
        "customScriptLabel": "Nom de script personnalisé",
        "customScriptPlaceholder": "Nom du script / commande…",
        "knownScripts": "CheatScript — Scripts connus",
        "knownScriptsDesc": "Scripts nommés définis dans DefaultGame.ini. Fire-and-forget.",
        "run": "Exécuter",
        "runTitle": "Exécuter {{label}} ?",
        "scripts": {
          "AwardPlayerXP": "Award Player XP",
          "AwardPlayerXPDesc": "Attribue 10 000 XP Combat + 10 000 XP Exploration + 10 000 XP Science",
          "LeaveMeAlone": "Leave Me Alone",
          "LeaveMeAloneDesc": "Détruit tous les PNJ, efface les rencontres + tempêtes de sable, désactive le ver des sables (sur tout le serveur)",
          "PlaytestSetup": "Playtest Setup",
          "PlaytestSetupAdmin": "Playtest Setup (Admin)",
          "PlaytestSetupAdminDesc": "⚠ DESTRUCTIVE — identique à Playtest Setup mais utilise les noms de modèles bruts",
          "PlaytestSetupDesc": "⚠ DESTRUCTIVE — ResetProgression + CleanInventory, puis kit d'équipement complet",
          "UnlockAllAbilities": "Unlock All Abilities",
          "UnlockAllAbilitiesDesc": "Définit tous les modules de capacités au niveau 1",
          "UnlockAllSkills": "Unlock All Skills",
          "UnlockAllSkillsDesc": "Définit tous les modules d'arbre de compétences au niveau 1"
        },
        "try": "Essayer",
        "warning": "⚠ Expérimental — ces commandes sont envoyées via RabbitMQ mais leurs effets ne sont pas vérifiés. À utiliser uniquement sur des personnages de test."
      },
      "history": {
        "columns": {
          "difficulty": "Difficulté",
          "dungeon": "Donjon",
          "duration": "Durée",
          "eventType": "Type d'événement",
          "location": "Emplacement",
          "map": "Carte",
          "partySize": "Taille du groupe",
          "time": "Heure"
        },
        "dungeonLabel": "Enregistrements de donjon",
        "dungeonRecords": "Enregistrements de donjon",
        "gameEvents": "Événements de jeu",
        "gameEventsLabel": "Événements de jeu",
        "noDungeons": "Aucun enregistrement de donjon",
        "noEvents": "Aucun événement"
      },
      "journey": {
        "columns": {
          "done": "Terminé",
          "nodeId": "ID du nœud",
          "revealed": "Révélé",
          "reward": "Récompense"
        },
        "complete": "Compléter",
        "filterPlaceholder": "Filtrer les nœuds...",
        "journeyLabel": "Nœuds de parcours",
        "noMatching": "Aucun nœud correspondant",
        "noNodes": "Aucun nœud de parcours trouvé",
        "redo": "↻ Re-do",
        "reset": "Réinitialiser",
        "title": "Nœuds de parcours",
        "wipeAll": "Tout effacer",
        "wipeAllDesc": "Cela supprimera toute la progression du parcours pour {{player}}. Cette action est irréversible.",
        "wipeAllTitle": "Effacer tous les nœuds de parcours ?"
      },
      "progression": {
        "apply": "Appliquer",
        "applyUnlock": "Appliquer le déverrouillage",
        "loadingPresets": "Chargement…",
        "mainQuestLabel": "Quête principale",
        "nodes_one": "{{count}} nœuds",
        "nodes_many": "MISSING",
        "nodes_other": "{{count}} nœuds",
        "noPresets": "Aucun préréglage disponible",
        "presets": {
          "a_new_beginning": {
            "desc": "Introduction de l'histoire — fabriquer le Stillsuit, récolter des ressources, recherche du fabricateur. Débloque le début du jeu.",
            "name": "Compléter : A New Beginning"
          },
          "act1_complete": {
            "desc": "A New Beginning + Find the Fremen combinés. Le joueur commence prêt pour l'Acte 2.",
            "name": "Compléter : Tout l'Acte 1"
          },
          "deep_desert_intro": {
            "desc": "Complète la chaîne de quêtes secondaires du Désert Profond.",
            "name": "Ignorer : Introduction du Désert Profond"
          },
          "find_the_fremen": {
            "desc": "Les 7 épreuves, le Sietch et l'Épilogue. Débloque le Fremkit (Stillsuit, Thumper, Cryss Knife, etc.) et complète l'Acte 1.",
            "name": "Compléter : Find the Fremen (Trials of Aql)"
          },
          "overland_intro": {
            "desc": "Complète la chaîne de quêtes secondaires de la carte de surface (missions Hark Landsraad, pierres de clé).",
            "name": "Ignorer : Introduction de la Carte de Surface"
          },
          "skip_npe": {
            "desc": "Marque le tutoriel/NPE comme terminé. Utile pour les joueurs expérimentés qui n'ont pas besoin de l'introduction.",
            "name": "Ignorer NPE (Expérience Nouveau Joueur)"
          },
          "taxation_intro": {
            "desc": "Complète la chaîne tutorielle d'échange/voyage.",
            "name": "Ignorer : Tutoriel Taxation / Échange"
          },
          "unlock_all_lore": {
            "desc": "Révèle toutes les entrées de la Dunipedia : Univers Connu, Sites remarquables, Manuel du Désert Amical, Guerre pour Arrakis.",
            "name": "Débloquer tout le Lore (Dunipedia)"
          },
          "vermillius_intro": {
            "desc": "Complète toutes les quêtes tutorielles de Vermillius Gap (recherche, artisanat, exploration). Aucun effet secondaire sur les étiquettes — simple saut de tutoriel.",
            "name": "Ignorer : Tutoriels de Vermillius Gap"
          }
        },
        "progressionUnlock": "Déverrouillage de progression",
        "progressionUnlockDesc": "Complète les nœuds de parcours DA_FQ_ClimbTheRanks et écrit les étiquettes de rang de faction.",
        "quickPresets": "Préréglages rapides",
        "quickPresetsDesc": "Ensembles organisés qui complètent un ou plusieurs nœuds de parcours racine et se propagent à tous les enfants et étiquettes.",
        "resetSkillTree": "Réinitialiser l'arbre de compétences",
        "resetSkillTreeDesc": "Cela effacera l'arbre de compétences professionnel complet de {{trainer}} pour {{player}}.",
        "resetSkillTreeTitle": "Réinitialiser l'arbre de compétences {{trainer}} ?",
        "reverseUnlock": "Annuler le déverrouillage",
        "reverseUnlockDesc": "Cela annulera le préréglage {{preset}} pour {{faction}} et supprimera les étiquettes associées de {{player}}.",
        "reverseUnlockTitle": "Annuler le déverrouillage de progression ?",
        "trainerLabel": "Formateur",
        "unlockMainQuest": "Débloquer la quête principale",
        "unlockMainQuestDesc": "Marque chaque ligne de parcours DA_MQ_<name>.* comme complète et applique l'union m_TagsToAdd.",
        "unlockTrainer": "Débloquer le formateur",
        "unlockTrainerDesc": "Complète chaque contrat Trainer_X_* et accorde l'arbre de compétences professionnel complet."
      },
      "resources": {
        "award": "Attribuer",
        "awardCharXP": "Attribuer XP personnage",
        "awardIntel": "Attribuer des renseignements",
        "characterXP": "XP personnage",
        "charXPNote": "Max 344 440 (niveau 200) · en direct si en ligne, BD si hors ligne",
        "currencyResources": "Monnaie et ressources",
        "currentXP": "Actuel : {{xp}} XP — Niveau {{level}} / 200",
        "faction": "Faction",
        "factionReputation": "Réputation de faction",
        "fill": "Remplir",
        "fillWater": "Remplir l'eau",
        "fillWaterNote": "Remplit tous les conteneurs d'eau au maximum (le joueur doit être en ligne)",
        "give": "Donner",
        "giveCurrency": "Donner de la monnaie",
        "giveScrip": "Donner du Scrip",
        "liveActions": "Actions en direct",
        "liveActionsNote": "Le joueur doit être en ligne.",
        "reputation": "Réputation",
        "reputationNote": "Ajouté au total actuel, max 12 474",
        "selectModule": "Sélectionner un module…",
        "set": "Définir",
        "setSkillModule": "Définir le module de compétence",
        "skillModules": "Modules de compétence",
        "skillPoints": "Points de compétence",
        "skillPointsNote": "Définit les points non dépensés"
      },
      "sections": {
        "admin": "Admin",
        "contracts": "Contrats",
        "experimental": "Expérimental",
        "history": "Historique",
        "journey": "Parcours",
        "progression": "Progression",
        "resources": "Statistiques",
        "specs": "Spécialisations",
        "tags": "Étiquettes"
      },
      "specs": {
        "columns": {
          "level": "Niveau",
          "track": "Piste",
          "xp": "XP"
        },
        "grantMax": "Accorder le maximum",
        "grantMaxKeystones": "Accorder les pierres angulaires maximales",
        "onlineWarning": "⚠ Le joueur est en ligne — les modifications d'XP peuvent ne pas prendre effet avant la reconnexion",
        "resetAllKeystones": "Réinitialiser toutes les pierres angulaires",
        "resetKeystonesDesc": "Cela supprimera toutes les pierres angulaires accordées pour {{player}}. Cette action est irréversible.",
        "resetKeystonesTitle": "Réinitialiser toutes les pierres angulaires ?",
        "resetSpec": "Réinitialiser la spécialisation",
        "resetSpecDesc": "Cela effacera tous les XP et niveaux de la piste de spécialisation {{track}}.",
        "resetSpecTitle": "Réinitialiser la spécialisation {{track}} ?",
        "specializations": "Spécialisations",
        "specsLabel": "Spécialisations"
      },
      "tags": {
        "activeTags_one": "Étiquettes actives ({{count}})",
        "activeTags_many": "MISSING",
        "activeTags_other": "Étiquettes actives ({{count}})",
        "activeTagsLabel": "Étiquettes actives",
        "addCount_one": "Ajouter ({{count}})",
        "addCount_many": "MISSING",
        "addCount_other": "Ajouter ({{count}})",
        "addTags": "Ajouter des étiquettes",
        "filterPlaceholder": "Filtrer pour supprimer…",
        "noTags": "Aucune étiquette",
        "removedTag": "Étiquette supprimée",
        "searchPlaceholder": "Rechercher des étiquettes…",
        "tagColumn": "Étiquette"
      }
    },
    "dashboard": {
      "activityTrend": "Activité — {{days}} derniers jours",
      "avgLevel": "Niveau moyen",
      "avgLevelCol": "Niv. moy.",
      "byFaction": "Par faction",
      "byMap": "Joueurs par carte",
      "econPctCol": "% éco.",
      "factionCol": "Faction",
      "growthApprox": "Approximatif — d'après les instantanés en ligne",
      "growthTitle": "Croissance des factions",
      "metricLevel": "Niv. moyen",
      "metricSolaris": "Solaris",
      "navLabel": "Vue du serveur",
      "noPlayers": "Aucun joueur",
      "online": "En ligne",
      "playersCol": "Joueurs",
      "scripCol": "Scrip",
      "sessions": "Sessions",
      "solarisCol": "Solaris",
      "subtitle": "Statistiques et tendances des joueurs à l'échelle du serveur",
      "title": "Vue du serveur",
      "totalPlayers": "Total des joueurs",
      "totalPlaytime": "Temps de jeu total",
      "totalScrip": "Total Scrip",
      "totalSolaris": "Total Solaris"
    },
    "detail": {
      "avgSession": "Moy.",
      "charXP": "XP perso",
      "earned": "Gagné",
      "economy": "Économie",
      "factionAlignment": "Allégeance de faction",
      "unaligned": "Sans faction",
      "factionTier": "Rang de faction",
      "failedToLoad": "Échec du chargement des statistiques.",
      "lastSeen": "Dernière connexion",
      "milestones": "Jalons",
      "playtime": "Temps de jeu",
      "pois": "Points d'intérêt",
      "progression": "Progression",
      "scrip": "Scrip",
      "sessionCount": "Nombre",
      "sessionHistory": "Historique des sessions",
      "sessionHistoryEmpty": "Les données de session s'accumulent à chaque connexion des joueurs. Le suivi interroge toutes les 5 minutes.",
      "sessions": "Sessions",
      "skillPts": "Pts de compétence",
      "solaris": "Solaris",
      "solarisBalance": "Solde",
      "solarisHistory": "Historique Solaris",
      "solarisHistoryEmpty": "Les instantanés Solaris sont enregistrés toutes les 5 minutes quand les joueurs sont en ligne.",
      "spent": "Dépensé",
      "tier": "Rang {{tier}}",
      "xpCharXP": "XP perso",
      "xpCombat": "Combat",
      "xpCrafting": "Artisanat",
      "xpExploration": "Exploration",
      "xpGathering": "Collecte",
      "xpHistory": "Historique XP",
      "xpHistoryEmpty": "Les instantanés XP sont enregistrés toutes les 5 minutes quand les joueurs sont en ligne.",
      "xpSabotage": "Sabotage"
    },
    "give": {
      "add": "Ajouter",
      "gave": "✓ Donné :",
      "gaveItems_one": "{{count}} objet donné à {{player}}",
      "gaveItems_many": "MISSING",
      "gaveItems_other": "{{count}} objets donnés à {{player}}",
      "giveCount_one": "Donner {{count}} objet",
      "giveCount_many": "MISSING",
      "giveCount_other": "Donner {{count}} objets",
      "loadPack": "Charger un pack…",
      "managePacks": "Gérer les packs",
      "modalTitle": "{{name}} — Donner des objets",
      "qty": "Qté",
      "quality": "Qualité",
      "searchTemplates": "Rechercher des modèles...",
      "selectTemplate": "Sélectionner un modèle",
      "skipped": "✕ {{template}} ignoré : {{reason}}"
    },
    "givePacks": {
      "addItem": "Ajouter un objet",
      "addPack": "Ajouter un pack",
      "category": "Catégorie",
      "deletePack": "Supprimer le pack",
      "duplicateId": "Un pack avec cet identifiant existe déjà.",
      "editingPack": "Modifier le pack",
      "newPack": "Nouveau pack",
      "noItemsYet": "Ce pack ne contient encore aucun objet.",
      "noPacks": "Aucun pack pour l'instant — ajoutez-en un ci-dessus.",
      "noPackSelected": "Sélectionnez un pack pour modifier ses objets.",
      "packId": "ID",
      "packName": "Nom",
      "removeItem": "Retirer l'objet",
      "save": "Sauvegarder les packs",
      "saved": "Packs sauvegardés",
      "saveFailed": "Impossible de sauvegarder les packs : {{message}}",
      "searchTemplates": "Chercher un gabarit d'objet…",
      "tier": "Niveau",
      "title": "Gérer les packs d'objets",
      "updatePack": "Mettre à jour le pack"
    },
    "inventory": {
      "columns": {
        "durability": "Durabilité",
        "quality": "Qualité",
        "stack": "Pile",
        "template": "Modèle"
      },
      "deleteOnlineWarning": "Le joueur est en ligne — la suppression d'objets peut provoquer des désynchronisations d'inventaire. Continuer ?",
      "itemDeleted": "Objet supprimé",
      "itemsLabel": "Objets",
      "noItemsFound": "Aucun objet trouvé",
      "repair": "Réparer",
      "repaired": "{{name}} réparé",
      "repairGear": "Réparer l'équipement",
      "repairGearDone": "{{repaired}} sur {{scanned}} pièces d'équipement réparées — reconnectez-vous pour voir en jeu",
      "repairGearNone": "Aucun équipement n'avait besoin de réparation ({{scanned}} objets scannés)",
      "repairNotice": "Les modifications de durabilité sont écrites en DB. Le joueur doit se reconnecter pour les voir en jeu.",
      "title": "Inventaire"
    },
    "searchLabel": "Rechercher des joueurs",
    "searchPlaceholder": "Filtrer les joueurs...",
    "tabs": {
      "actions": "Actions",
      "give": "Donner",
      "inventory": "Inventaire",
      "overview": "Aperçu",
      "vehicles": "Véhicules"
    },
    "title": "Joueurs",
    "vehicles": {
      "backup": "Sauvegarder",
      "columns": {
        "chassis": "Châssis",
        "class": "Classe",
        "location": "Emplacement",
        "name": "Nom",
        "type": "Type"
      },
      "noVehiclesFound": "Aucun véhicule trouvé",
      "recovered": "Récupéré",
      "refuel": "Ravitailler",
      "refuelDone": "{{label}} ravitaillé — reconnectez-vous pour voir en jeu",
      "repair": "Réparer",
      "repairDone": "{{repaired}} modules réparés sur {{label}} — reconnectez-vous pour voir en jeu",
      "repairNone": "Aucun module trouvé sur {{label}}",
      "repairNotice": "Les réparations de véhicules nécessitent un redémarrage du serveur pour prendre effet en jeu.",
      "repairPartial": "{{repaired}} sur {{total}} modules réparés sur {{label}} ({{skipped}} ignorés) — reconnectez-vous pour voir en jeu",
      "vehiclesLabel": "Véhicules"
    }
  },
  "server": {
    "advancedCategories": "Avancé",
    "advancedCategoriesDesc": "Cliquez sur une catégorie pour la développer sur place. Cliquez à nouveau ou choisissez-en une autre pour changer.",
    "collapse": "Annuler",
    "collapseCategory": "Réduire la catégorie",
    "collapseSection": "Réduire la section",
    "commonSettings": "Paramètres courants",
    "commonSettingsDesc": "La douzaine de réglages que les admins utilisent le plus souvent. Tout le reste se trouve dans les catégories ci-dessous.",
    "deleteFailed": "Échec de la suppression : {{message}}",
    "iniNotFound": "Impossible de localiser les fichiers INI du serveur : {{error}}. Pour kubectl, assurez-vous que le PVC du serveur de jeu est monté. Pour docker/local, ajoutez server_ini_dir à ~/.dune-admin/config.yaml.",
    "loading": "Chargement des paramètres…",
    "noMatchSettings": "Aucun paramètre ne correspond à \"{{query}}\".",
    "overriddenCount_one": "{{count}} remplacé(s)",
    "overriddenCount_many": "MISSING",
    "overriddenCount_other": "{{count}} remplacé(s)",
    "rawIniDesc": "Entrées de tableau (+key=val) et clés non reconnues, regroupées par section INI.",
    "rawIniSections": "Sections INI brutes",
    "rawPlaceholder": "Key=Value ou +Key=Value pour les entrées de tableau",
    "removedFrom": "Supprimé de {{file}}",
    "save": "Enregistrer",
    "savedTo": "Enregistré dans {{file}}",
    "saveFailed": "Échec de l'enregistrement : {{message}}",
    "saveWithCount_one": "Enregistrer ({{count}})",
    "saveWithCount_many": "MISSING",
    "saveWithCount_other": "Enregistrer ({{count}})",
    "searchLabel": "Rechercher des paramètres",
    "searchPlaceholder": "Rechercher des paramètres…",
    "settingCount_one_one": "{{count}} paramètre",
    "settingCount_one_many": "MISSING",
    "settingCount_one_other": "{{count}} paramètre",
    "settingCount_other_one": "{{count}} paramètres",
    "settingCount_other_many": "MISSING",
    "settingCount_other_other": "{{count}} paramètres",
    "showAll": "Tout",
    "showAllAriaLabel": "Affichage de tous les paramètres — cliquez pour afficher uniquement les paramètres utilisateur",
    "showUser": "Utilisateur",
    "showUserAriaLabel": "Affichage des paramètres utilisateur uniquement — cliquez pour tout afficher",
    "title": "Paramètres serveur",
    "unsaved": "non enregistré",
    "userOverride": "· remplacement utilisateur",
    "expertCategories": "Expert",
    "expertCategoriesDesc": "Paramètres internes du moteur et du système. Ne les modifiez que si vous savez exactement ce que vous faites.",
    "ampManagedTooltip": "Géré via l'API AMP — appliqué au prochain redémarrage du serveur",
    "removeFrom": "Supprimer de {{file}}"
  },
  "settings": {
    "adv": {
      "applyReload": "Appliquer et recharger",
      "backendUrlHint": "Nécessaire uniquement si l'interface est servie depuis un hôte différent (tunnel SSH, CDN). Laissez vide pour une configuration mono-binaire.",
      "backupDir": "Répertoire de sauvegarde",
      "defaultIniDir": "Répertoire INI par défaut",
      "defaultIniDirHint": "couche de base DefaultGame.ini",
      "directorUrl": "URL Director",
      "directorUrlHint": "proxy sur /director/",
      "listenAddr": "Adresse d'écoute",
      "listenAddrHint": "⚠ redémarrage requis",
      "reset": "Réinitialiser",
      "scripCurrency": "ID de devise Scrip",
      "serverIniDir": "Répertoire INI serveur",
      "serverIniDirHint": "emplacement de UserGame.ini",
      "url": "URL",
      "urlHint": "stockée dans le navigateur, pas sur le serveur"
    },
    "amp": {
      "containerName": "Nom de conteneur",
      "containerNameHint": "défaut : AMP_<instance>",
      "dataRoot": "Racine des données",
      "instanceName": "Nom d'instance",
      "logPath": "Chemin des journaux",
      "useContainer": "Utiliser le conteneur (podman exec)",
      "useContainerHint": "Désactivez pour exécuter directement sur l'hôte en tant qu'utilisateur AMP.",
      "user": "Utilisateur AMP",
      "apiUser": "Utilisateur de l'API AMP",
      "apiPassword": "Mot de passe de l'API AMP",
      "apiPort": "Port de l'API AMP",
      "apiHint": "Connexion à l'API Web d'AMP. Permet à dune-admin de gérer les paramètres du serveur sous AMP afin qu'ils survivent aux redémarrages. Port par défaut 8081."
    },
    "broker": {
      "adminAddr": "Adresse admin",
      "execPrefix": "Préfixe d'exécution",
      "execPrefixHint": "quand le broker est dans un conteneur",
      "gameAddr": "Adresse jeu",
      "jwtSecret": "Secret JWT",
      "jwtSecretHint": "vide = valeur par défaut intégrée",
      "optionalHint": "Active la capture et les notifications si configuré.",
      "password": "Mot de passe",
      "user": "Utilisateur",
      "useTls": "Utiliser TLS (amqps://)"
    },
    "cmd": {
      "restart": "Redémarrer",
      "start": "Démarrer",
      "status": "État",
      "stop": "Arrêter"
    },
    "configSaved": "Configuration enregistrée — application des paramètres…",
    "control": {
      "amp": "amp — CubeCoders AMP",
      "docker": "docker — Conteneurs Docker",
      "kubectl": "kubectl — Kubernetes / k3s",
      "local": "local — bare metal / LGSM / shell",
      "modeHint": "Comment dune-admin gère le serveur de jeu",
      "selectMode": "Sélectionnez un mode de contrôle ci-dessus pour voir les paramètres spécifiques au mode."
    },
    "db": {
      "host": "Hôte",
      "hostHint": "127.0.0.1 via tunnel SSH",
      "name": "Nom de la base de données",
      "password": "Mot de passe",
      "passwordHint": "envoyer un espace réservé pour conserver l'existant",
      "port": "Port",
      "schema": "Schéma",
      "user": "Utilisateur"
    },
    "docker": {
      "brokerAdmin": "Broker (admin)",
      "brokerGame": "Broker (jeu)",
      "database": "Base de données",
      "gameServer": "Serveur de jeu"
    },
    "k8s": {
      "namespace": "Espace de noms",
      "namespaceHint": "vide = détection automatique"
    },
    "loadFailed": "Impossible de charger la configuration : {{message}}",
    "loadingConfig": "Chargement de la configuration…",
    "saveFailed": "Échec de l'enregistrement : {{message}}",
    "sections": {
      "amp": "CubeCoders AMP",
      "backendUrlOverride": "Remplacement de l'URL du backend",
      "controlPlane": "Plan de contrôle",
      "database": "Base de données",
      "dockerContainers": "Conteneurs Docker",
      "kubernetes": "Kubernetes",
      "paths": "Chemins",
      "rabbitmq": "RabbitMQ (optionnel)",
      "server": "Serveur",
      "serverCommands": "Commandes serveur",
      "ssh": "SSH (laisser vide pour local)"
    },
    "ssh": {
      "hostPort": "Hôte : port",
      "hostPortHint": "active le tunnel SSH pour toutes les BD + exec",
      "privateKey": "Chemin de la clé privée",
      "privateKeyHint": "chemin absolu, vide = détection automatique",
      "user": "Utilisateur"
    },
    "tabs": {
      "advanced": "Avancé",
      "broker": "Broker",
      "connection": "Connexion",
      "control": "Contrôle"
    }
  },
  "storage": {
    "addItems": "Ajouter des objets",
    "addModal": {
      "add": "Ajouter",
      "qtyColLabel": "Qté",
      "qtyLabel": "Qté",
      "qualityColLabel": "Qualité",
      "qualityLabel": "Qualité",
      "searchPlaceholder": "Rechercher des modèles...",
      "selectTemplate": "Sélectionner un modèle",
      "templateLabel": "Modèle"
    },
    "ariaLabel": "Objets du conteneur",
    "columns": {
      "durability": "Durabilité",
      "id": "ID",
      "quality": "Qualité",
      "stack": "Pile",
      "template": "Modèle"
    },
    "containerEmpty": "Le conteneur est vide",
    "containersTitle_one": "Conteneurs ({{count}})",
    "containersTitle_many": "MISSING",
    "containersTitle_other": "Conteneurs ({{count}})",
    "containerTitle": "Conteneur #{{id}}",
    "itemRemoved": "Objet supprimé",
    "ownerLabel": "Propriétaire : {{name}}",
    "remove": "Supprimer",
    "searchLabel": "Rechercher des conteneurs",
    "searchPlaceholder": "Rechercher...",
    "selectContainer": "Sélectionner un conteneur pour voir son contenu",
    "warningText": "Les objets ajoutés ou retirés des conteneurs de stockage nécessitent un redémarrage de zone serveur pour devenir visibles aux autres joueurs."
  },
  "welcome": {
    "activeVersionGranted": "VERSION(S) ACTIVE(S) (ATTRIBUÉE)",
    "addItem": "Ajouter un objet",
    "addVersion": "Ajouter une version",
    "columns": {
      "character": "Personnage",
      "error": "Erreur",
      "flsId": "FLS ID",
      "status": "État",
      "tries": "Tentatives",
      "updated": "Mis à jour",
      "version": "Version"
    },
    "configSubtitle": "Activez les attributions, définissez les paquets actifs et configurez le message de bienvenue.",
    "editingVersion": "Modification de la version",
    "enabledHint": "— accorde le pack actif aux joueurs en ligne qui n'ont pas encore reçu cette version.",
    "enabledLabel": "Activé",
    "failedToLoad": "Échec du chargement du pack de bienvenue : {{message}}",
    "grantsLabel": "Attributions de pack de bienvenue",
    "grantsTitle_one": "Historique des attributions ({{count}})",
    "grantsTitle_many": "MISSING",
    "grantsTitle_other": "Historique des attributions ({{count}})",
    "message": {
      "enabledHint": "Envoyé une fois par joueur par version active via le personnage GM. Suivi dans le registre des attributions.",
      "enabledLabel": "Envoyer un message chuchoté aux nouveaux joueurs lors de leur première connexion",
      "messageLabel": "Message",
      "messagePlaceholder": "Bienvenue sur le serveur ! Profitez de votre pack de départ.",
      "senderLabel": "ID FLS de l'expéditeur (optionnel)",
      "senderPlaceholder": "Laisser vide pour utiliser le personnage GM configuré",
      "title": "Message de bienvenue"
    },
    "newVersionLabel": "Nom de la nouvelle version",
    "newVersionPlaceholder": "ex. v2 ou saison2",
    "noGrants": "Aucune attribution encore.",
    "noItemsYet": "Aucun objet dans cette version encore.",
    "noPackageSelected": "Aucun pack sélectionné. Ajoutez une version pour commencer.",
    "packagesSubtitle": "Créez et gérez des paquets d'objets. Chaque version peut être attribuée indépendamment.",
    "removeItem": "Supprimer l'objet",
    "retry": "Réessayer",
    "retryCleared": "Effacé — nouvelle tentative au prochain scan",
    "retryFailed": "Échec de la nouvelle tentative : {{message}}",
    "runFailed": "Échec de l'exécution : {{message}}",
    "runNow": "Exécuter maintenant",
    "saveConfig": "Enregistrer la configuration",
    "savedDisabled": "Pack de bienvenue enregistré (désactivé)",
    "savedEnabled": "Activé — attribution de \"{{version}}\" dans un tick de scan",
    "saveFailed": "Échec de l'enregistrement : {{message}}",
    "scanComplete": "Scan terminé — {{granted}} accordé(s), {{failed}} échoué(s), {{skipped}} ignoré(s)",
    "scanInterval": "Intervalle de scan (secondes)",
    "sections": {
      "config": "Configuration",
      "grants": "Attributions",
      "packages": "Paquets"
    },
    "title": "Kits de bienvenue",
    "revoke": "Révoquer",
    "revoked": "Attribution révoquée — le pack peut être attribué à nouveau",
    "revokeFailed": "Échec de la révocation : {{message}}",
    "motd": {
      "enabledHint": "Chuchoté via le personnage GM à chaque connexion (chaque session, pas seulement la première). Utilisez {player} pour le nom du joueur.",
      "enabledLabel": "Envoyer un message aux joueurs à chaque connexion",
      "messageLabel": "Message",
      "messagePlaceholder": "Bon retour, {player} ! Consultez le Discord pour les événements.",
      "senderLabel": "ID FLS de l'expéditeur (optionnel)",
      "senderPlaceholder": "Laisser vide pour utiliser le personnage GM configuré",
      "title": "Message du jour"
    },
    "runConfirmTitle": "Attribuer le pack de bienvenue maintenant ?",
    "runConfirmBody": "Ceci attribue le(s) pack(s) {{versions}} à tous les joueurs en ligne éligibles immédiatement. Continuer ?"
  }
}
