{
  "language": {
    "label": "Langue",
    "fr": "Français",
    "en": "Anglais"
  },
  "common": {
    "back": "Retour",
    "save": "Sauvegarder",
    "saving": "Sauvegarde...",
    "loading": "Chargement...",
    "refresh": "Actualiser",
    "download": "Télécharger",
    "cancel": "Annuler",
    "delete": "Supprimer",
    "deleting": "Suppression...",
    "edit": "Modifier",
    "create": "Créer",
    "creating": "Création...",
    "add": "Ajouter",
    "remove": "Retirer",
    "close": "Fermer",
    "confirm": "Confirmer",
    "yes": "Oui",
    "no": "Non",
    "search": "Rechercher",
    "name": "Nom",
    "description": "Description",
    "titleField": "Titre",
    "type": "Type",
    "actions": "Actions",
    "open": "Ouvrir",
    "view": "Voir",
    "duplicate": "Dupliquer",
    "rename": "Renommer",
    "import": "Importer",
    "export": "Exporter",
    "generate": "Générer",
    "generating": "Génération...",
    "validate": "Valider",
    "none": "Aucun",
    "optional": "(optionnel)",
    "required": "(requis)",
    "error": "Erreur",
    "success": "Succès",
    "warning": "Attention",
    "previous": "Précédent",
    "next": "Suivant",
    "select": "Sélectionner"
  },
  "settings": {
    "title": "Paramètres",
    "data": {
      "title": "Sauvegarde des données",
      "hint": "Exportez tout votre contenu (systèmes de jeu, lores, campagnes + images) dans un fichier, pour le sauvegarder ou le transférer vers une autre instance. L'import <strong>ajoute</strong> le contenu sans supprimer l'existant.",
      "exportBtn": "Exporter les données",
      "exporting": "Export en cours…",
      "importBtn": "Importer un fichier",
      "importing": "Import en cours…",
      "importConfirm": "Importer ce fichier ? Le contenu sera ajouté à votre instance (rien n'est supprimé).",
      "importSuccess": "Import réussi : {{count}} élément(s) ajouté(s).",
      "exportError": "Échec de l'export.",
      "importError": "Échec de l'import (fichier invalide ?)."
    },
    "language": {
      "title": "Langue de l'interface",
      "hint": "Choix de la langue d'affichage de l'application. Le changement est immédiat et mémorisé sur cet appareil."
    },
    "ai": {
      "title": "Moteur IA",
      "hint": "Choix du fournisseur de modèle de langage utilisé par le chat et la génération de pages.",
      "provider": "Fournisseur",
      "providerOllama": "Ollama (local)",
      "providerOnemin": "1min.ai (cloud)",
      "providerOpenrouter": "OpenRouter (cloud)",
      "providerMistral": "Mistral (cloud)",
      "providerGemini": "Gemini (cloud)"
    },
    "ollama": {
      "title": "Configuration Ollama",
      "url": "URL du serveur Ollama",
      "model": "Modèle",
      "noModels": "Aucun modèle détecté. Vérifie que Ollama tourne et que l'URL est correcte."
    },
    "onemin": {
      "title": "Configuration 1min.ai"
    },
    "openrouter": {
      "title": "Configuration OpenRouter",
      "freeOnly": "Gratuits seulement",
      "hint": "Liste chargée automatiquement depuis OpenRouter. Pour rester <strong>gratuit</strong> : un modèle marqué <code>· gratuit</code> ou le routeur <code>openrouter/free</code> (choisit un modèle gratuit tout seul). Pour les imports, préfère un gratuit à <strong>grand contexte</strong> (valeur « ctx »)."
    },
    "mistral": {
      "title": "Configuration Mistral",
      "hint": "Clé gratuite sur <code>console.mistral.ai</code> (tier « Experiment », sans CB). Pour les imports, préfère <code>mistral-large-latest</code> (128k contexte, fidèle et bon en français) ou <code>mistral-small-latest</code> (plus rapide)."
    },
    "gemini": {
      "title": "Configuration Gemini",
      "hint": "Clé gratuite sur <code>aistudio.google.com</code> (sans CB). Idéal pour les imports : <code>gemini-2.0-flash</code> a un <strong>contexte ~1M</strong> → un livre entier tient en 1-2 appels (plus de morceaux perdus). Pense à monter la <strong>taille des morceaux</strong> d'import pour en profiter."
    },
    "apiKey": {
      "label": "Clé API",
      "configured": "✓ configurée",
      "placeholderSet": "Clé configurée (laisser vide pour ne pas changer)",
      "placeholderOnemin": "Saisir votre clé API",
      "placeholderOpenrouter": "Saisir votre clé API (sk-or-...)",
      "placeholderMistral": "Saisir votre clé API Mistral",
      "placeholderGemini": "Saisir votre clé API Gemini",
      "clear": "Effacer la clé enregistrée"
    },
    "model": "Modèle",
    "provider": "Fournisseur",
    "embeddings": {
      "title": "Embeddings (Atelier RAG)",
      "hint": "Modèle utilisé pour <strong>indexer les sources PDF</strong> des ateliers et y faire de la recherche. C'est un modèle <strong>séparé</strong> du modèle de chat ci-dessus.",
      "provider": "Fournisseur d'embeddings",
      "providerOllama": "Ollama (local, gratuit)",
      "providerMistral": "Mistral (cloud, EU)",
      "ollamaModel": "Modèle d'embedding Ollama",
      "ollamaModelHint": "Recommandé : <code>nomic-embed-text</code> (léger). Gratuit et illimité (local).",
      "autoPull": "Installer automatiquement le modèle au démarrage s'il manque",
      "topK": "Extraits récupérés par question (couverture RAG)",
      "topKHint": "Plus haut = l'IA voit plus de passages par question (mieux pour les questions larges « liste les… »), mais prompt plus long. Défaut 8. Avec un modèle <strong>gros-contexte</strong> (Gemini), tu peux monter à <strong>50-150</strong> pour une couverture quasi « document entier ». Pour les questions exhaustives, préfère le bouton <strong>« Analyse approfondie »</strong> de l'atelier.",
      "mistralKey": "Clé API Mistral",
      "mistralKeyHint": "C'est la <strong>même clé</strong> que pour le chat Mistral (une seule clé partagée). Soumis au rate limit du tier gratuit.",
      "mistralModel": "Modèle d'embedding Mistral"
    },
    "context": {
      "title": "Fenêtre de contexte",
      "tokens": "Tokens alloués au modèle",
      "max": "/ {{max}} max",
      "hintKnown": "Le modèle <strong>{{model}}</strong> accepte jusqu'à {{max}} tokens. Plus la valeur est élevée, plus l'IA peut tenir d'historique et de contexte — au prix de VRAM et de latence.",
      "hintUnknown": "Impossible de déterminer la fenêtre max du modèle (Ollama injoignable ou modèle inconnu). Slider borné à {{max}} par sécurité."
    },
    "pdf": {
      "title": "Import de PDF",
      "chunkTokens": "Taille des morceaux à l'import (tokens)",
      "chunkTokensHint": "Lors de l'import d'un PDF (règles ou campagne), le texte est découpé en morceaux de cette taille avant d'être analysé par l'IA. <strong>Plus gros = moins de morceaux</strong>, donc plus rapide et moins de fragmentation/doublons — mais le morceau doit tenir dans la fenêtre du modèle.<br />Repère : ~10 000 pour Ollama (16k de contexte) ; jusqu'à ~100 000 pour un modèle à grand contexte (ex : GPT-5 mini, 400k) afin de traiter un livre entier en une seule passe. Attention : un gros morceau = génération plus longue (voir le timeout ci-dessous).",
      "timeout": "Timeout des appels IA (secondes)",
      "timeoutHint": "Délai max d'attente d'une réponse du modèle. Si un import lourd échoue avec « délai dépassé » (timeout), <strong>augmentez cette valeur</strong> (ex : 600) ou réduisez la taille des morceaux ci-dessus. Défaut : 300 s."
    },
    "messages": {
      "saveSuccess": "Paramètres enregistrés.",
      "saveError": "Échec de l'enregistrement des paramètres.",
      "loadError": "Impossible de charger les paramètres."
    }
  },
  "lore": {
    "heroTitle": "Vos Univers",
    "heroSubtitle": "Sélectionnez un lore existant ou créez un nouvel univers",
    "cardDate": "Il y a 2h",
    "statPages": "{{n}} pages",
    "statFolders": "{{n}} dossiers",
    "newLore": "Nouveau Lore",
    "newLoreSubtitle": "Créez un nouvel univers",
    "tip": "💡 Astuce : Utilisez les templates pour structurer votre univers de manière cohérente"
  },
  "folderView": {
    "breadcrumb": "Fil d'Ariane",
    "summary": "{{folders}} sous-dossier(s) · {{pages}} page(s)",
    "editTitle": "Modifier le dossier",
    "deleteTitle": "Supprimer le dossier et tout son contenu",
    "subfolders": "Sous-dossiers",
    "newSubfolder": "Nouveau sous-dossier",
    "noSubfolders": "Aucun sous-dossier.",
    "pages": "Pages",
    "newPage": "Nouvelle page",
    "noPages": "Aucune page dans ce dossier.",
    "deleteConfirmTitle": "Supprimer le dossier",
    "deleteConfirmMessage": "Supprimer le dossier « {{name}} » ?",
    "impact": {
      "subfolders": "{{n}} sous-dossier",
      "subfoldersPlural": "{{n}} sous-dossiers",
      "pages": "{{n}} page",
      "pagesPlural": "{{n}} pages",
      "alsoDeletes": "Cette action supprimera aussi : {{items}}.",
      "irreversible": "Cette action est irréversible."
    }
  },
  "loreCreate": {
    "title": "Créer un nouveau Lore",
    "nameLabel": "Nom de l'univers *",
    "namePlaceholder": "Ex: Royaume des Ombres, Cyberpunk 2157...",
    "descriptionPlaceholder": "Décrivez brièvement votre univers, son ambiance, son genre...",
    "infoIntro": "<strong>💡 Astuce :</strong> Votre lore sera créé avec quelques templates par défaut :",
    "infoNpc": "PNJ - Pour vos personnages",
    "infoPlace": "Lieu - Pour vos villes et régions",
    "infoFaction": "Faction - Pour vos organisations",
    "infoItem": "Objet - Pour vos artefacts",
    "infoFooter": "Vous pourrez créer vos propres templates ensuite !",
    "submit": "Créer le lore"
  },
  "loreDetail": {
    "graph": "Graphe",
    "graphTitle": "Visualiser le graphe des pages et de leurs liens (PNJ inclus)",
    "editTitle": "Modifier le Lore",
    "deleteTitle": "Supprimer le Lore",
    "folders": "Dossiers",
    "newFolder": "Nouveau dossier",
    "noFolders": "Aucun dossier pour le moment.",
    "createFirstFolder": "Créer votre premier dossier",
    "deleteConfirmTitle": "Supprimer le Lore",
    "deleteConfirmMessage": "Supprimer définitivement le Lore « {{name}} » ?",
    "impact": {
      "folders": "{{n}} dossier",
      "foldersPlural": "{{n}} dossiers",
      "pages": "{{n}} page",
      "pagesPlural": "{{n}} pages",
      "templates": "{{n}} template",
      "templatesPlural": "{{n}} templates",
      "alsoDeletes": "Cette action supprimera aussi : {{items}}.",
      "detachedCampaigns": "{{n}} campagne sera conservée mais perdra son lien vers cet univers.",
      "detachedCampaignsPlural": "{{n}} campagnes seront conservées mais perdront leur lien vers cet univers.",
      "irreversible": "Cette action est irréversible."
    }
  },
  "loreGraph": {
    "back": "Retour au Lore",
    "title": "{{name}} — Graphe",
    "subtitle": "{{pages}} page(s) · {{npcs}} PNJ · {{edges}} lien(s). Cliquez sur un nœud pour l'ouvrir, glissez-le pour réarranger.",
    "legendPage": "Page de Lore",
    "legendNpc": "PNJ",
    "legendLink": "Lien PNJ → page",
    "empty": "Aucune page dans ce Lore pour l'instant — le graphe se remplira au fur et à mesure.",
    "hint": "Aucun lien pour l'instant : liez des pages entre elles (« Pages liées » d'une page) ou rattachez un PNJ à des pages de Lore depuis sa fiche."
  },
  "loreNodeCreate": {
    "title": "Créer un nouveau dossier",
    "subtitle": "Les dossiers permettent d'organiser vos pages par catégorie",
    "nameLabel": "Nom du dossier *",
    "namePlaceholder": "Ex: Personnages, Créatures...",
    "parentLabel": "Dossier parent",
    "rootOption": "— Racine du Lore —",
    "parentHint": "Laissez vide pour créer un dossier à la racine du lore",
    "iconLabel": "Icône",
    "descriptionPlaceholder": "Décrivez le type de contenu que ce dossier contiendra...",
    "submit": "Créer le dossier"
  },
  "loreNodeEdit": {
    "title": "Éditer le dossier",
    "summary": "{{folders}} sous-dossier(s) · {{pages}} page(s)",
    "nameLabel": "Nom du dossier *",
    "parentLabel": "Dossier parent",
    "rootOption": "— Racine du Lore —",
    "parentHint": "Vous ne pouvez pas choisir un sous-dossier du dossier courant (cycle interdit)",
    "iconLabel": "Icône"
  },
  "sidebar": {
    "subtitle": "LE CODEX NUMÉRIQUE",
    "tabLore": "Lore",
    "tabCampaign": "Campagne",
    "toolsLabel": "OUTILS",
    "globalSearch": "Recherche globale",
    "gameSystems": "Systèmes de JDR",
    "vttExport": "Export VTT",
    "settings": "Paramètres",
    "updateAvailable": "Mise à jour disponible",
    "updateBadge": "MAJ",
    "version": "Version {{version}}"
  },
  "secondarySidebar": {
    "backToCampaignHome": "Retour à l'accueil de la campagne",
    "resizeHandle": "Glissez pour redimensionner"
  },
  "breadcrumb": {
    "ariaLabel": "Fil d'Ariane"
  },
  "globalSearch": {
    "placeholder": "Rechercher dans LoreMind...",
    "noResults": "Aucun résultat",
    "minChars": "Tape au moins 2 caractères",
    "hintNavigate": "naviguer",
    "hintSelect": "sélectionner",
    "hintClose": "fermer",
    "countSingular": "{{count}} résultat",
    "countPlural": "{{count}} résultats",
    "enemyLevel": "Niv. {{level}}",
    "tags": {
      "page": "Page",
      "node": "Dossier",
      "template": "Template",
      "lore": "Lore",
      "campaign": "Campagne",
      "npc": "PNJ",
      "character": "PJ",
      "randomTable": "Table aléatoire",
      "itemCatalog": "Catalogue d'objets",
      "enemy": "Ennemi"
    }
  },
  "updateBanner": {
    "message": "Une nouvelle version de LoreMind est disponible (<strong>{{version}}</strong>). Recharge pour profiter des dernières améliorations.",
    "reload": "Recharger",
    "dismissTitle": "Fermer (sera réaffiché au prochain démarrage)",
    "dismissAria": "Fermer"
  },
  "confirmDialog": {
    "defaultTitle": "Confirmation"
  },
  "aiChatDrawer": {
    "title": "Assistant IA",
    "resizeAria": "Redimensionner le panneau",
    "resizeTitle": "Glisser pour redimensionner",
    "conversations": "Conversations",
    "newConversation": "Nouvelle conversation",
    "noConversation": "Aucune conversation",
    "hideList": "Masquer la liste",
    "showList": "Afficher la liste",
    "shrink": "Réduire",
    "shrinkAria": "Réduire le panneau",
    "expand": "Agrandir",
    "expandAria": "Agrandir le panneau",
    "gaugeTitle": "Système : {{system}} · Historique : {{history}} · Courant : {{current}} tokens",
    "gaugeTitleMax": "Système : {{system}} · Historique : {{history}} · Courant : {{current}} / {{max}} tokens",
    "gaugeLabel": "Contexte : {{total}} tokens",
    "gaugeLabelMax": "Contexte : {{total}} / {{max}} tokens",
    "quickSuggestions": "Suggestions rapides :",
    "inputPlaceholder": "Posez une question...",
    "send": "Envoyer",
    "welcome": "Bonjour ! Je peux vous aider à développer cette page. Que souhaitez-vous créer ?",
    "loadConversationError": "Impossible de charger la conversation.",
    "deleteConversationTitle": "Supprimer la conversation",
    "deleteConversationMessage": "Supprimer la conversation « {{title}} » ?",
    "missingContextError": "Contexte manquant pour créer une conversation.",
    "createConversationError": "Impossible de créer la conversation.",
    "unknownError": "Erreur inconnue."
  },
  "imageGallery": {
    "empty": "Aucune illustration",
    "illustrationAlt": "Illustration",
    "mainIllustrationAlt": "Illustration principale",
    "mapAlt": "Carte",
    "removeImage": "Retirer cette image",
    "removeMap": "Retirer cette carte",
    "lightboxAria": "Image en plein écran",
    "lightboxAlt": "Image agrandie"
  },
  "imageUploader": {
    "addImage": "Ajouter une image",
    "uploading": "Upload en cours",
    "uploadingHint": "Upload en cours...",
    "dropTitle": "Glisse une image ici",
    "dropHint": "ou clique pour choisir un fichier (JPEG, PNG, WebP, GIF, max 10 Mo)",
    "unsupportedFormat": "Format non supporté (JPEG, PNG, WebP, GIF uniquement).",
    "tooLarge": "Fichier trop volumineux (max {{max}} Mo).",
    "serverRejected": "Fichier refusé par le serveur (trop volumineux).",
    "uploadFailed": "Échec de l'upload. Vérifiez que le backend et MinIO tournent."
  },
  "singleImagePicker": {
    "removeImage": "Retirer l'image"
  },
  "chipsInput": {
    "placeholder": "Ajouter...",
    "removeTag": "Retirer"
  },
  "dynamicFieldsForm": {
    "textPlaceholder": "Renseignez {{name}}…",
    "noLabels": "Aucun label défini dans le template pour ce champ.",
    "noFields": "Aucun champ défini dans le template de ce système. Éditez le GameSystem pour ajouter des champs."
  },
  "loreLinkPicker": {
    "searchPlaceholder": "Rechercher une page à lier...",
    "openInNewTab": "Ouvrir dans un nouvel onglet",
    "removeLink": "Retirer le lien",
    "noMatch": "Aucune page ne correspond"
  },
  "enemyLinkPicker": {
    "searchPlaceholder": "Rechercher un ennemi du bestiaire...",
    "openInNewTab": "Ouvrir la fiche dans un nouvel onglet",
    "removeLink": "Retirer le lien",
    "noMatch": "Aucun ennemi ne correspond"
  },
  "personaView": {
    "empty": "Cette fiche est encore vide."
  },
  "playthroughFlagsManager": {
    "empty": "Aucun fait référencé. Ajoutez une condition « Quand un fait est vrai » sur au moins une quête pour qu'il apparaisse ici.",
    "true": "vrai",
    "false": "faux"
  },
  "prerequisiteEditor": {
    "empty": "Aucune condition — la quête est immédiatement disponible.",
    "questCompletedLabel": "Quête terminée :",
    "noOtherQuest": "(aucune autre quête)",
    "sessionReachedLabel": "À partir de la session :",
    "flagSetLabel": "Quand le fait est vrai :",
    "flagNamePlaceholder": "nom_du_fait",
    "removePrerequisite": "Retirer ce prérequis",
    "addCondition": "Ajouter une condition",
    "menuAfterQuest": "Après une autre quête",
    "menuFromSession": "À partir d'une session",
    "menuWhenFlag": "Quand un fait est vrai"
  },
  "questStatusBadge": {
    "locked": "Verrouillée",
    "inProgress": "En cours",
    "completed": "Terminée",
    "available": "Disponible"
  },
  "roomsEditor": {
    "empty": "Aucune pièce. La scène se comporte comme un beat narratif classique. Ajoutez une première pièce pour la convertir en lieu explorable (donjon, crypte…).",
    "roomNamePlaceholder": "Nom de la pièce",
    "floorPlaceholder": "Ét.",
    "floorTitle": "Étage (0 = RdC)",
    "moveUp": "Monter",
    "moveDown": "Descendre",
    "removeRoom": "Supprimer la pièce",
    "descriptionLabel": "Description (lue/résumée aux joueurs)",
    "descriptionPlaceholder": "Atmosphère, ce que voient les PJ en entrant…",
    "bestiaryLabel": "Ennemis du bestiaire",
    "enemiesLabel": "Ennemis / créatures / boss (texte libre)",
    "enemiesPlaceholder": "2 gobelins, 1 ogre boss (PV 60, AC 14)…",
    "lootLabel": "Loot / trésors",
    "lootPlaceholder": "50 po, potion de soin, clé en argent…",
    "trapsLabel": "Pièges / dangers",
    "trapsPlaceholder": "Trappe (DC 15 Perception), flèches empoisonnées…",
    "gmNotesLabel": "Notes MJ (privé)",
    "gmNotesPlaceholder": "Le boss connaît les PJ par leur nom, indice…",
    "exitsLabel": "Sorties / portes vers d'autres pièces",
    "branchLabelPlaceholder": "Porte nord",
    "noOtherRoom": "(aucune autre pièce)",
    "branchConditionPlaceholder": "Condition (optionnelle)",
    "addExit": "Ajouter une sortie",
    "addRoom": "Ajouter une pièce",
    "defaultRoomName": "Salle {{n}}",
    "defaultBranchLabel": "Porte"
  },
  "templateFieldsEditor": {
    "moveUp": "Monter",
    "moveDown": "Descendre",
    "fieldNamePlaceholder": "Nom du champ (ex: Histoire, PV...)",
    "removeField": "Supprimer ce champ",
    "labelsHeader": "Labels (clés fixes pour toutes les fiches)",
    "labelPlaceholder": "Ex: FOR, DEX...",
    "removeLabel": "Retirer ce label",
    "addLabel": "Ajouter un label",
    "empty": "Aucun champ pour l'instant — ajoutez-en avec les boutons ci-dessous.",
    "addPrefix": "Ajouter :",
    "typeText": "Texte",
    "typeNumber": "Nombre",
    "typeImage": "Image(s)",
    "typeKeyValue": "Liste clé/valeur",
    "layoutGallery": "Galerie",
    "layoutHero": "Bandeau",
    "layoutMasonry": "Mosaïque",
    "layoutCarousel": "Carrousel",
    "defaultLabel": "Champs du template"
  },
  "arcCreate": {
    "title": "Créer un nouvel arc narratif",
    "nameLabel": "Nom de l'arc *",
    "namePlaceholder": "Ex: L'Ombre du Nord",
    "structureLabel": "Structure de l'arc",
    "linearTitle": "Linéaire",
    "linearDesc": "Chapitres joués dans l'ordre — narration séquentielle classique.",
    "hubTitle": "Hub",
    "hubDesc": "Quêtes parallèles débloquées par des conditions — type sandbox (ex : Phandalin / Icespire Peak).",
    "descriptionPlaceholder": "Décrivez l'arc narratif principal...",
    "iconLabel": "Icône",
    "submit": "Créer l'arc"
  },
  "arcEdit": {
    "fallbackTitle": "Arc",
    "subtitle": "Arc narratif",
    "aiAssistant": "Assistant IA",
    "aiAssistantTitle": "Ouvrir l'Assistant IA pour dialoguer autour de cet arc",
    "illustrationsLabel": "Illustrations",
    "illustrationsHint": "Ambiances, portraits, visuels evocateurs de l'arc. JPEG, PNG, WebP ou GIF, 10 Mo max.",
    "mapsLabel": "Cartes & plans",
    "mapsHint": "Cartes regionales et plans utiles aux joueurs pour situer l'action.",
    "nameLabel": "Titre de l'arc *",
    "namePlaceholder": "Ex: L'Ombre du Nord",
    "synopsisLabel": "Synopsis de l'arc",
    "synopsisPlaceholder": "Décrivez l'histoire principale de cet arc narratif...",
    "structureLabel": "Structure de l'arc",
    "linearTitle": "Linéaire",
    "linearDesc": "Chapitres joués dans l'ordre — narration séquentielle.",
    "hubTitle": "Hub",
    "hubDesc": "Quêtes parallèles débloquées par des conditions (sandbox).",
    "iconLabel": "Icône",
    "themesLabel": "Thèmes principaux",
    "themesPlaceholder": "Quels sont les thèmes explorés dans cet arc ? (trahison, rédemption...)",
    "stakesLabel": "Enjeux globaux",
    "stakesPlaceholder": "Quels sont les enjeux majeurs de cet arc pour les personnages ?",
    "gmNotesLabel": "Notes et planification du MJ",
    "gmNotesPlaceholder": "Vos notes sur la direction de l'arc, les twists prévus, les révélations importantes...",
    "gmNotesHint": "Ces notes sont privées et ne seront pas exportées vers FoundryVTT.",
    "rewardsLabel": "Récompenses et progression",
    "rewardsPlaceholder": "Quelles récompenses les joueurs obtiendront-ils ? Objets, niveaux, connaissances, contacts...",
    "resolutionLabel": "Dénouement prévu",
    "resolutionPlaceholder": "Comment cet arc devrait-il se terminer ? Quelles sont les issues possibles ?",
    "relatedPagesLabel": "Pages Lore associées",
    "relatedPagesHint": "Liez cet arc à des PNJ, lieux ou éléments du Lore. Cliquez sur un chip pour ouvrir la page associée.",
    "noLoreHint": "💡 Cette campagne n'est associée à aucun univers. Associez-la à un Lore dans l'écran de la campagne pour pouvoir lier cet arc à des pages du Lore (PNJ, lieux, etc.).",
    "chatWelcome": "Je vois cet arc. Demande-moi d'enrichir ses thèmes, ses enjeux ou son dénouement.",
    "chatSuggestion1": "Propose 3 thèmes majeurs pour cet arc",
    "chatSuggestion2": "Imagine des enjeux qui mettent la pression sur les joueurs",
    "chatSuggestion3": "Suggère un dénouement en deux actes",
    "deleteTitle": "Supprimer l'arc",
    "deleteMessage": "Supprimer l'arc \"{{name}}\" ?",
    "irreversible": "Cette action est irréversible."
  },
  "arcView": {
    "subtitleHub": "Arc en hub (quêtes non linéaires)",
    "subtitleLinear": "Arc narratif",
    "deleteTitle": "Supprimer l'arc et tout son contenu",
    "mapsTitle": "Cartes & plans",
    "hubQuestsTitle": "Quêtes du hub (scénario)",
    "hubQuestsEmpty": "Aucune quête pour ce hub. Créez-en une pour démarrer.",
    "unlockConditions": "{{n}} condition(s) de déblocage",
    "synopsisTitle": "Synopsis",
    "themesTitle": "Thèmes principaux",
    "stakesTitle": "Enjeux globaux",
    "rewardsTitle": "Récompenses et progression",
    "resolutionTitle": "Dénouement prévu",
    "gmNotesTitle": "Notes et planification du MJ",
    "relatedPagesTitle": "Pages Lore associées",
    "notProvided": "Non renseigné",
    "prereqQuestCompleted": "Quête « {{name}} » terminée",
    "prereqSessionReached": "Session {{n}} atteinte",
    "prereqFlagSet": "Fait : {{flag}}",
    "deletedPage": "(page supprimée)",
    "chaptersSingular": "{{n}} chapitre",
    "chaptersPlural": "{{n}} chapitres",
    "scenesSingular": "{{n}} scène",
    "scenesPlural": "{{n}} scènes",
    "deleteCascade": "Cette action supprimera aussi : {{parts}}.",
    "irreversible": "Cette action est irréversible.",
    "deleteConfirmTitle": "Supprimer l'arc",
    "deleteConfirmMessage": "Supprimer l'arc \"{{name}}\" ?"
  },
  "campaigns": {
    "heroTitle": "Vos Campagnes",
    "heroSubtitle": "Rejoignez une campagne ou créez-en de nouvelles",
    "statusInProgress": "En cours",
    "players": "{{n}} joueurs",
    "arcs": "{{n}} arcs",
    "chapters": "{{n}} chapitres",
    "newCampaign": "Nouvelle Campagne",
    "newCampaignSubtitle": "Créez une nouvelle aventure",
    "tip": "💡 Astuce : Organisez vos arcs et chapitres pour ne rien oublier de vos aventures"
  },
  "campaignCreate": {
    "title": "Créer une nouvelle Campagne",
    "nameLabel": "Nom de la campagne *",
    "namePlaceholder": "Ex: L'Ombre du Nord, Les Héritiers Oubliés...",
    "descriptionLabel": "Description / Pitch",
    "descriptionPlaceholder": "Résumez l'intrigue principale de votre campagne...",
    "playerCountLabel": "Nombre de joueurs",
    "loreLabel": "Univers associé",
    "noLoreOption": "— Aucun univers (campagne libre) —",
    "loreHint": "Optionnel. Si associée, vous pourrez lier arcs, chapitres et scènes aux pages du Lore. Laissez vide pour un one-shot ou si vous créerez le Lore plus tard.",
    "gameSystemLabel": "Système de JDR",
    "noGameSystemOption": "— Aucun (campagne générique) —",
    "createGameSystemOption": "+ Créer un nouveau système…",
    "gameSystemNamePlaceholder": "Nom du nouveau système (ex: D&D 5e, Nimble, Maison)",
    "gameSystemCreateHint": "Création rapide — vous pourrez ajouter les règles, les templates de fiches PJ/PNJ et le reste depuis la section « Systèmes » plus tard.",
    "gameSystemHint": "Optionnel. Si défini, l'IA injectera les règles du système (classes, combat, lore...) dans ses suggestions pour respecter les mécaniques du JDR.",
    "gameSystemWarning": "⚠️ Le système de jeu choisi détermine aussi le <strong>template des fiches de PJ et PNJ</strong>. Le changer plus tard rendra les champs des fiches existantes invisibles (les données restent stockées mais ne s'afficheront qu'en revenant à l'ancien système). Choisissez bien dès le départ si possible.",
    "orgIntro": "<strong>💡 Organisation :</strong> Votre campagne sera structurée en :",
    "orgArcs": "<strong>Arcs</strong> - Les grandes phases narratives",
    "orgChapters": "<strong>Chapitres</strong> - Les segments d'un arc",
    "orgScenes": "<strong>Scènes</strong> - Les moments de jeu individuels",
    "submit": "Créer la campagne"
  },
  "campaignDetail": {
    "players": "{{n}} joueurs",
    "openLinkedLore": "Ouvrir l'univers associé",
    "loreMissingTitle": "L'univers associé est introuvable",
    "loreMissing": "Univers introuvable",
    "loreLabel": "Univers associé",
    "noLoreOption": "— Aucun univers (campagne libre) —",
    "gameSystemLabel": "Système de JDR",
    "noGameSystemOption": "— Aucun (générique) —",
    "createGameSystemOption": "+ Créer un nouveau système…",
    "gameSystemNamePlaceholder": "Nom du nouveau système (ex: D&D 5e, Nimble, Maison)",
    "charactersTitle": "Personnages",
    "npcTitle": "Personnages non-joueurs",
    "newNpc": "Nouveau PNJ",
    "noNpc": "Aucun PNJ pour le moment.",
    "createFirstNpc": "Créer votre premier PNJ",
    "arcsTitle": "Arcs narratifs",
    "newArc": "Nouvel arc",
    "chapters": "{{n}} chapitres",
    "noArc": "Aucun arc narratif pour le moment.",
    "createFirstArc": "Créer votre premier arc",
    "playthroughsTitle": "Mes parties",
    "newPlaythrough": "Nouvelle partie",
    "noPlaythrough": "Aucune partie. Créez-en une pour démarrer une session avec une table.",
    "defaultPlaythroughName": "Nouvelle partie {{n}}",
    "gameSystemChange": {
      "title": "Changer le système de jeu ?",
      "message": "Vous êtes sur le point de changer le système de jeu de cette campagne. Cela change également le template des fiches de PJ et PNJ.",
      "detailSheets": "{{n}} fiche(s) existante(s) sont liées au template du système actuel.",
      "detailFields": "Leurs champs ne s'afficheront plus avec le nouveau système.",
      "detailStored": "Les données restent stockées : revenir à l'ancien système les rendra à nouveau visibles.",
      "confirm": "Changer quand même"
    },
    "delete": {
      "title": "Supprimer la campagne ?",
      "message": "Supprimer définitivement la campagne « {{name}} » ?",
      "arcs": "{{n}} arc",
      "arcsPlural": "{{n}} arcs",
      "chapters": "{{n}} chapitre",
      "chaptersPlural": "{{n}} chapitres",
      "scenes": "{{n}} scène",
      "scenesPlural": "{{n}} scènes",
      "playthroughs": "{{n}} partie (avec ses PJ, sessions, faits)",
      "playthroughsPlural": "{{n}} parties (avec ses PJ, sessions, faits)",
      "alsoDeletes": "Sera aussi supprimé : {{items}}.",
      "irreversible": "Cette action est irréversible."
    }
  },
  "campaignImport": {
    "pageTitle": "Importer une campagne",
    "back": "Retour à la campagne",
    "title": "Importer un PDF de campagne",
    "subtitle": "L'IA propose une arborescence arc → chapitre → scène. Vous la révisez et l'ajustez avant de créer quoi que ce soit.",
    "importing": "Import en cours…",
    "choosePdf": "Choisir un PDF de campagne",
    "phaseExtracting": "Extraction du texte…",
    "phaseAnalyzing": "Analyse de la campagne… ({{current}}/{{total}})",
    "foundSoFar": "Trouvé jusqu'ici : {{arcs}} arc(s) · {{chapters}} chapitre(s) · {{scenes}} scène(s) · {{npcs}} PNJ",
    "errorNoStructure": "Aucune structure narrative détectée dans ce PDF.",
    "errorImport": "Échec de l'import du PDF.",
    "errorImportDetail": "Échec de l'import : {{message}}",
    "errorApply": "Échec de la création. La campagne existe-t-elle toujours ?",
    "summaryToCreate": "À créer : <strong>{{arcs}}</strong> nouvel(s) arc(s), <strong>{{chapters}}</strong> chapitre(s), <strong>{{scenes}}</strong> scène(s)",
    "summaryNpcs": ", <strong>{{npcs}}</strong> PNJ",
    "summaryHint": ". Les éléments <em>« déjà présent »</em> (grisés) sont affichés pour situer les ajouts ; ils ne seront pas recréés. Modifiez les nouveaux, puis créez.",
    "alreadyPresent": "déjà présent",
    "arcNamePlaceholder": "Nom de l'arc",
    "removeArc": "Supprimer l'arc",
    "typeLabel": "Type :",
    "typeLinear": "Linéaire",
    "typeHub": "Hub (quêtes)",
    "arcSynopsisPlaceholder": "Synopsis de l'arc (optionnel)",
    "chapterNamePlaceholder": "Nom du chapitre",
    "removeChapter": "Supprimer le chapitre",
    "chapterSynopsisPlaceholder": "Synopsis du chapitre (optionnel)",
    "sceneNamePlaceholder": "Nom de la scène",
    "synopsisOptionalPlaceholder": "Synopsis (optionnel)",
    "detailsTitle": "Narration joueurs, notes MJ, pièces",
    "details": "Détails",
    "roomsCount": "· {{n}} pièce(s)",
    "removeScene": "Supprimer la scène",
    "playerNarrationLabel": "À lire aux joueurs",
    "playerNarrationPlaceholder": "Texte d'encadré lu aux joueurs (optionnel)",
    "gmNotesLabel": "Notes MJ",
    "gmNotesPlaceholder": "Secrets, développement, conséquences (optionnel)",
    "roomsLabel": "Pièces (lieu explorable)",
    "roomPlaceholder": "Pièce",
    "enemiesPlaceholder": "Ennemis",
    "lootPlaceholder": "Trésor",
    "removeRoom": "Supprimer la pièce",
    "room": "Pièce",
    "scene": "Scène",
    "chapter": "Chapitre",
    "addArc": "Ajouter un arc",
    "npcReviewTitle": "PNJ et créatures détectés ({{n}})",
    "npcReviewHint": "Cochez ceux à créer dans la campagne (description issue du livre). Ceux déjà présents dans la campagne sont grisés et ne seront pas recréés.",
    "creating": "Création…",
    "createInCampaign": "Créer dans la campagne"
  },
  "chapterCreate": {
    "titleQuest": "Créer une nouvelle quête",
    "titleChapter": "Créer un nouveau chapitre",
    "hub": "Hub",
    "arc": "Arc",
    "nameQuestLabel": "Nom de la quête *",
    "nameChapterLabel": "Nom du chapitre *",
    "namePlaceholderQuest": "Ex: Sauver le marchand disparu",
    "namePlaceholderChapter": "Ex: Chapitre 1: Les Disparitions",
    "descPlaceholderQuest": "Décrivez cette quête...",
    "descPlaceholderChapter": "Décrivez ce chapitre...",
    "icon": "Icône",
    "createQuest": "Créer la quête",
    "createChapter": "Créer le chapitre"
  },
  "chapterEdit": {
    "chapter": "Chapitre",
    "aiAssistant": "Assistant IA",
    "aiAssistantTitle": "Ouvrir l'Assistant IA pour dialoguer autour de ce chapitre",
    "unlockTitleQuest": "🗺️ Conditions de déblocage de la quête",
    "unlockTitleChapter": "🔒 Conditions de déblocage du chapitre",
    "unlockHintQuest": "Définition du scénario : toutes les conditions doivent être remplies (ET) pour que la quête soit débloquée dans une Partie. Laissez vide pour qu'elle soit disponible dès le départ. La progression et l'état des faits se gèrent dans l'écran de la Partie, pas ici.",
    "unlockHintChapter": "Définition du scénario : toutes les conditions doivent être remplies (ET) pour que ce chapitre soit débloqué dans une Partie. Laissez vide pour qu'il soit disponible dès le départ. La progression et l'état des faits se gèrent dans l'écran de la Partie, pas ici.",
    "illustrations": "Illustrations",
    "illustrationsHint": "Portraits, ambiances, scènes marquantes du chapitre.",
    "maps": "Cartes & plans",
    "mapsHint": "Cartes régionales, plans de donjon, schémas utiles à la table.",
    "nameLabel": "Titre du chapitre *",
    "namePlaceholder": "Ex: Chapitre 1: Les Disparitions",
    "synopsisLabel": "Synopsis du chapitre",
    "synopsisPlaceholder": "Décrivez brièvement ce qui se passe dans ce chapitre...",
    "icon": "Icône",
    "gmNotesLabel": "Notes du Maître de Jeu",
    "gmNotesPlaceholder": "Vos notes privées sur le déroulement du chapitre, les événements clés, les rebondissements...",
    "gmNotesHint": "Ces notes sont privées et ne seront pas exportées vers FoundryVTT.",
    "playerObjectivesLabel": "Objectifs des joueurs",
    "playerObjectivesPlaceholder": "Que doivent accomplir les joueurs dans ce chapitre ?",
    "narrativeStakesLabel": "Enjeux narratifs",
    "narrativeStakesPlaceholder": "Quels sont les enjeux dramatiques ?",
    "relatedPages": "Pages Lore associées",
    "relatedPagesHint": "Liez ce chapitre à des PNJ, lieux ou éléments du Lore qui y apparaissent.",
    "noLoreHint": "💡 Cette campagne n'est associée à aucun univers. Associez-la à un Lore dans l'écran de la campagne pour pouvoir lier ce chapitre à des pages du Lore.",
    "chatWelcome": "Je vois ce chapitre. Demande-moi d'étoffer ses objectifs, ses enjeux ou sa scène d'ouverture.",
    "chatSuggestion1": "Propose des objectifs clairs pour les joueurs dans ce chapitre",
    "chatSuggestion2": "Imagine 2 tensions narratives qui relancent l'intérêt en milieu de chapitre",
    "chatSuggestion3": "Suggère une scène d'ouverture marquante",
    "deleteTitle": "Supprimer le chapitre",
    "deleteMessage": "Supprimer le chapitre \"{{name}}\" ?",
    "irreversible": "Cette action est irréversible."
  },
  "chapterGraph": {
    "chapter": "Chapitre",
    "title": "{{name}} — Carte",
    "subtitle": "Organigramme des scènes et de leurs branches narratives",
    "back": "Retour au chapitre",
    "empty": "Ce chapitre n'a aucune scène. Créez-en pour voir apparaître la carte.",
    "hint": "💡 Cliquez sur une scène pour l'ouvrir, ou glissez-la pour réorganiser la carte. Les scènes non reliées au point d'entrée (scène d'ordre 1) apparaissent en bas.",
    "allCampaigns": "Toutes les campagnes"
  },
  "chapterView": {
    "chapter": "Chapitre",
    "questHub": "Quête (Hub)",
    "conditional": "Conditionnel",
    "conditionalBadgeTitle": "Ce chapitre a des conditions de déblocage : il se débloque en Partie quand elles sont remplies.",
    "map": "Carte du chapitre",
    "mapTitle": "Voir l'organigramme des scènes et de leurs branches",
    "deleteTitle": "Supprimer le chapitre et ses scènes",
    "unlockConditions": "Conditions de déblocage",
    "unlockHintQuest": "Pendant une partie, la quête se débloque dès que toutes ces conditions sont remplies. Le toggle des faits se fait dans l'écran « Faits » de la Partie.",
    "unlockHintChapter": "Pendant une partie, ce chapitre se débloque dès que toutes ces conditions sont remplies. Le toggle des faits se fait dans l'écran « Faits » de la Partie.",
    "noConditionQuest": "Aucune condition — cette quête est disponible dès le début dans chaque Partie.",
    "noConditionEdit": "Cliquez sur <strong>Modifier</strong> pour ajouter des conditions (« quête précédente terminée », « à partir de la session N », « quand un fait est vrai »).",
    "maps": "Cartes & plans",
    "synopsis": "Synopsis",
    "notProvided": "Non renseigné",
    "playerObjectives": "Objectifs des joueurs",
    "narrativeStakes": "Enjeux narratifs",
    "gmNotes": "Notes du Maître de Jeu",
    "relatedPages": "Pages Lore associées",
    "prereqQuestCompleted": "Quête « {{name}} » terminée",
    "prereqSessionReached": "Session {{n}} atteinte",
    "prereqFlagSet": "Fait : {{flag}}",
    "deletedPage": "(page supprimée)",
    "deleteScenes": "Cette action supprimera aussi : {{n}} scène.",
    "deleteScenesPlural": "Cette action supprimera aussi : {{n}} scènes.",
    "irreversible": "Cette action est irréversible.",
    "deleteChapterTitle": "Supprimer le chapitre",
    "deleteChapterMessage": "Supprimer le chapitre \"{{name}}\" ?"
  },
  "pageCreate": {
    "title": "Créer une nouvelle Page",
    "subtitle": "Créez une page à partir d'un template existant",
    "pageTitle": "Nouvelle page",
    "pageTitleLabel": "Titre de la page *",
    "pageTitlePlaceholder": "Ex : Maître Eldrin, La Cité d'Argent...",
    "templateLabel": "Template *",
    "createTemplate": "Créer un template",
    "createTemplateTitle": "Créer un nouveau template pour ce Lore",
    "createTemplateHint": "Vous reviendrez ici automatiquement, votre saisie sera conservée.",
    "noTemplates": "Aucun template défini pour ce Lore.",
    "firstSuffix": "d'abord.",
    "nodeLabel": "Dossier de destination *",
    "nodePlaceholder": "Sélectionnez un dossier",
    "nodeHint": "La page sera créée dans ce dossier",
    "noNodes": "Aucun dossier dans ce Lore.",
    "createNode": "Créer un dossier",
    "infoBox": "💡 Option 1 : <strong>Créer la page</strong> vide, puis remplir les champs manuellement.<br>💡 Option 2 : <strong>Créer avec l'IA</strong> pour dialoguer avec un assistant qui pré-remplira les champs.",
    "aiTitle": "Ouvrir l'assistant IA pour pré-remplir les champs",
    "createWithAi": "Créer avec l'IA",
    "createPage": "Créer la page",
    "wizardPrimaryAction": "Appliquer et créer la page",
    "wizardSuggestion1": "Rends la description plus courte",
    "wizardSuggestion2": "Ajoute un trait distinctif marquant",
    "wizardSuggestion3": "Donne un ton plus sombre",
    "wizardWelcomeEmpty": "Décrivez ce que vous souhaitez créer.",
    "wizardWelcome": "Super, on va créer une page « {{name}} » ! Décrivez-la-moi en quelques mots — contexte, rôle, traits marquants — et je proposerai des valeurs pour chaque champ.",
    "errorNoReply": "L'assistant n'a pas encore répondu. Décrivez d'abord votre idée.",
    "errorNoValues": "Impossible d'extraire les valeurs. Demandez à l'assistant de proposer à nouveau.",
    "errorApplyValues": "Page créée, mais impossible d'appliquer les valeurs.",
    "errorCreate": "Erreur lors de la création de la page."
  },
  "pageEdit": {
    "pageFallback": "Page",
    "aiTitle": "Ouvrir l'Assistant IA (chat ou remplissage automatique)",
    "aiAssistant": "Assistant IA",
    "generating": "Génération…",
    "folder": "Dossier",
    "folderHint": "Déplacez cette page dans un autre dossier",
    "fields": "Champs",
    "valuePlaceholder": "Valeur pour {{field}}...",
    "noLabels": "Aucun libellé défini dans le template pour ce champ.",
    "deleteRow": "Supprimer la ligne",
    "deleteRowN": "Supprimer la ligne {{n}}",
    "addRow": "Ajouter une ligne",
    "noColumns": "Aucune colonne définie dans le template pour ce tableau.",
    "tags": "Tags",
    "tagsPlaceholder": "Ajouter un tag (Entrée pour valider)...",
    "tagsHint": "Mots-clés libres pour classer et retrouver cette page",
    "relatedPages": "Pages liées",
    "relatedPagesHint": "Cliquez sur un lien pour ouvrir la page associée",
    "privateNotes": "Notes privées",
    "privateNotesPlaceholder": "Notes personnelles (non exportées vers FoundryVTT)",
    "privateNotesHint": "Visibles uniquement par vous. Utiles pour préparer vos sessions.",
    "chatPrimaryAction": "Remplir automatiquement tous les champs",
    "chatSuggestion1": "Étoffe l'histoire de cette page",
    "chatSuggestion2": "Suggère des liens avec d'autres pages du Lore",
    "chatSuggestion3": "Propose une intrigue secondaire",
    "aiUnreachable": "L'assistant IA est injoignable. Vérifiez que le service Brain tourne.",
    "aiFailed": "Échec de la génération IA. Réessayez dans un instant.",
    "deleteTitle": "Supprimer la page",
    "deleteMessage": "Supprimer la page « {{title}} » ?"
  },
  "pageView": {
    "pageFallback": "Page",
    "deleteTitle": "Supprimer la page",
    "notFilled": "Non renseigné",
    "tags": "Tags",
    "relatedPages": "Pages liées",
    "privateNotes": "Notes privées",
    "deletedPage": "(page supprimée)",
    "deleteMessage": "Supprimer la page « {{title}} » ?",
    "deleteIrreversible": "Cette action est irréversible."
  },
  "templateCreate": {
    "title": "Créer un nouveau Template",
    "subtitle": "Définissez un gabarit personnalisé pour créer des pages cohérentes",
    "nameLabel": "Nom du template *",
    "namePlaceholder": "Ex : Auberge, Artefact, Monstre...",
    "descriptionPlaceholder": "À quoi sert ce template ?",
    "defaultNodeLabel": "Dossier par défaut *",
    "nodePlaceholder": "Sélectionnez un dossier",
    "defaultNodeHint": "Les pages créées avec ce template seront placées dans ce dossier",
    "noNodes": "Aucun dossier dans ce Lore.",
    "createNode": "Créer un dossier",
    "firstSuffix": "d'abord.",
    "fieldsLabel": "Champs du template *",
    "moveUp": "Monter",
    "moveDown": "Descendre",
    "fieldTypeTitle": "Type du champ",
    "typeText": "Texte",
    "typeImage": "Image",
    "typeKeyValue": "Liste clé/valeur",
    "typeTable": "Tableau",
    "layoutTitle": "Mise en page des images",
    "layoutGallery": "Grille",
    "layoutHero": "Héros",
    "layoutMasonry": "Mosaïque",
    "layoutCarousel": "Carrousel",
    "column": "Colonne",
    "label": "Libellé",
    "columnN": "Colonne {{n}}",
    "labelN": "Libellé {{n}}",
    "tableLabelsHint": "Ajoutez les colonnes du tableau (ex : Objet, Prix, Description…)",
    "kvLabelsHint": "Ajoutez les libellés des lignes (ex : FOR, DEX, CON…)",
    "addFieldPlaceholder": "+ Ajouter un champ",
    "addFieldTitle": "Ajouter le champ",
    "fieldsHelp": "Texte = libre + utilisable par l'IA. Image = galerie. Liste clé/valeur = paires libellé/valeur (stats). Tableau = colonnes fixes + lignes ajoutées librement (boutique, inventaire…).",
    "createTemplate": "Créer le template"
  },
  "templateEdit": {
    "subtitle": "Template",
    "defaultNodeLabel": "Dossier par défaut",
    "noneOption": "-- Aucun --",
    "defaultNodeHint": "Les pages créées avec ce template seront placées dans ce dossier par défaut",
    "fieldsLabel": "Champs du template",
    "moveUp": "Monter",
    "moveDown": "Descendre",
    "fieldTypeTitle": "Type du champ",
    "typeText": "Texte",
    "typeImage": "Image",
    "typeKeyValue": "Liste clé/valeur",
    "typeTable": "Tableau",
    "layoutTitle": "Mise en page des images",
    "layoutGallery": "Grille",
    "layoutHero": "Héros",
    "layoutMasonry": "Mosaïque",
    "layoutCarousel": "Carrousel",
    "column": "Colonne",
    "label": "Libellé",
    "columnN": "Colonne {{n}}",
    "labelN": "Libellé {{n}}",
    "tableLabelsHint": "Ajoutez les colonnes du tableau (ex : Objet, Prix, Description…)",
    "kvLabelsHint": "Ajoutez les libellés des lignes (ex : FOR, DEX, CON…)",
    "addFieldPlaceholder": "+ Ajouter un champ",
    "addFieldTitle": "Ajouter le champ",
    "fieldsHelp": "Texte = libre + générable par l'IA. Image = galerie. Liste clé/valeur = paires libellé/valeur (stats). Tableau = colonnes fixes + lignes ajoutées librement (boutique, inventaire…).",
    "deleteTitle": "Supprimer le template",
    "deleteMessage": "Supprimer le template « {{name}} » ?"
  },
  "sceneCreate": {
    "title": "Créer une nouvelle scène",
    "chapterRef": "Chapitre : {{name}}",
    "nameLabel": "Nom de la scène *",
    "namePlaceholder": "Ex: Arrivée au village",
    "descriptionLabel": "Description",
    "descriptionPlaceholder": "Décrivez la scène, les événements clés, les PNJ présents...",
    "iconLabel": "Icône",
    "createButton": "Créer la scène",
    "createError": "Erreur lors de la création de la scène"
  },
  "sceneEdit": {
    "defaultTitle": "Scène",
    "subtitle": "Scène",
    "aiAssistant": "Assistant IA",
    "aiAssistantTitle": "Ouvrir l'Assistant IA pour dialoguer autour de cette scène",
    "illustrationsLabel": "Illustrations",
    "illustrationsHint": "Portraits des PNJ, ambiance visuelle, scenes evocatrices...",
    "mapsLabel": "Cartes & plans",
    "mapsHint": "Plans du lieu, cartes tactiques, schemas utilisables a la table.",
    "nameLabel": "Titre de la scène *",
    "namePlaceholder": "Ex: Arrivée au village",
    "descriptionLabel": "Description courte *",
    "descriptionPlaceholder": "Résumé en une ou deux phrases de ce qui se passe...",
    "iconLabel": "Icône",
    "contextSectionTitle": "Contexte et ambiance",
    "locationLabel": "Lieu",
    "locationPlaceholder": "Ex: Taverne du Dragon d'Or",
    "timingLabel": "Moment",
    "timingPlaceholder": "Ex: Soir, à la tombée de la nuit",
    "atmosphereLabel": "Ambiance et atmosphère",
    "atmospherePlaceholder": "Décrivez l'ambiance générale de la scène (sons, odeurs, lumière, émotions...)",
    "narrationSectionTitle": "Narration pour les joueurs",
    "narrationPlaceholder": "Le texte que vous lirez aux joueurs pour planter le décor de cette scène...",
    "narrationHint": "Ce texte peut être lu directement à vos joueurs.",
    "gmNotesSectionTitle": "Notes et secrets du MJ",
    "gmNotesPlaceholder": "Informations cachées, indices, éléments secrets que les joueurs ne doivent pas connaître...",
    "gmNotesHint": "Ces notes sont privées et visibles uniquement par le MJ.",
    "choicesSectionTitle": "Choix et conséquences",
    "choicesPlaceholder": "Décrivez les différentes options qui s'offrent aux joueurs et leurs conséquences...",
    "branchesSectionTitle": "Branches narratives",
    "branchesNoSibling": "💡 Il faut au moins une autre scène dans ce chapitre pour créer des branches. Créez d'abord d'autres scènes, puis revenez ici pour les connecter.",
    "branchLabelLabel": "Libellé du choix",
    "branchLabelPlaceholder": "Ex: Si les joueurs attaquent le garde",
    "branchTargetLabel": "Scène de destination *",
    "branchTargetPlaceholder": "— Choisir une scène —",
    "branchConditionLabel": "Condition MJ (optionnel)",
    "branchConditionPlaceholder": "Ex: Jet de Persuasion DD 15 réussi",
    "branchRemove": "Retirer",
    "branchRemoveTitle": "Supprimer cette branche",
    "branchAdd": "+ Ajouter une branche",
    "branchesHint": "Chaque branche représente une \"sortie\" possible depuis cette scène selon l'action des joueurs. Les cibles sont limitées aux scènes du même chapitre.",
    "combatSectionTitle": "Combat ou rencontre",
    "combatDifficultyLabel": "Difficulté estimée",
    "combatDifficultyPlaceholder": "Ex: Moyenne, 3 gobelins niveau 2",
    "bestiaryEnemiesLabel": "Ennemis du bestiaire",
    "bestiaryEnemiesHint": "Référencez des fiches de votre bestiaire — cliquez sur un chip pour ouvrir la fiche.",
    "enemiesLabel": "Ennemis et créatures (texte libre)",
    "enemiesPlaceholder": "Liste des ennemis présents dans cette scène...",
    "loreSectionTitle": "Pages Lore associées",
    "loreHint": "Épinglez ici le lieu, les PNJ ou créatures de cette scène. Cliquez sur un chip pour ouvrir la page.",
    "noLoreHint": "💡 Cette campagne n'est associée à aucun univers. Associez-la à un Lore dans l'écran de la campagne pour pouvoir épingler des pages du Lore à cette scène.",
    "dungeonSectionTitle": "Lieu explorable (donjon, crypte…)",
    "dungeonHint": "Si cette scène représente un lieu à parcourir pièce par pièce, ajoutez-les ici. La scène bascule alors en mode « donjon » côté affichage.",
    "chatWelcome": "Je vois cette scène. Demande-moi d'enrichir son ambiance, sa narration ou ses choix.",
    "chatSuggestion1": "Propose une ambiance sensorielle immersive pour cette scène",
    "chatSuggestion2": "Suggère une narration d'ouverture à lire aux joueurs",
    "chatSuggestion3": "Imagine 2 choix avec conséquences marquantes",
    "deleteTitle": "Supprimer la scène",
    "deleteMessage": "Supprimer la scène \"{{name}}\" ?",
    "deleteIrreversible": "Cette action est irréversible.",
    "saveError": "Erreur lors de la sauvegarde",
    "deleteError": "Erreur lors de la suppression"
  },
  "sceneView": {
    "subtitle": "Scène",
    "deleteTitleAttr": "Supprimer la scène",
    "mapsSectionTitle": "Cartes & plans",
    "descriptionSectionTitle": "Description",
    "empty": "Non renseigné",
    "locationSectionTitle": "Lieu",
    "timingSectionTitle": "Moment",
    "atmosphereSectionTitle": "Ambiance et atmosphère",
    "narrationSectionTitle": "Narration pour les joueurs",
    "choicesSectionTitle": "Choix et conséquences",
    "combatDifficultySectionTitle": "Difficulté estimée",
    "enemiesSectionTitle": "Ennemis et créatures",
    "gmNotesSectionTitle": "Notes et secrets du MJ",
    "loreSectionTitle": "Pages Lore associées",
    "deletedPage": "(page supprimée)",
    "roomsSectionTitle": "Pièces du lieu",
    "roomFloor": "Étage {{floor}}",
    "roomEnemies": "⚔️ Ennemis",
    "roomLoot": "💰 Loot",
    "roomTraps": "⚠️ Pièges",
    "roomGmNotes": "🔒 Notes MJ",
    "roomExits": "→ Sorties",
    "roomExitCondition": "(si : {{condition}})",
    "deletedRoom": "(pièce supprimée)",
    "deleteTitle": "Supprimer la scène",
    "deleteMessage": "Supprimer la scène \"{{name}}\" ?",
    "deleteIrreversible": "Cette action est irréversible.",
    "deleteError": "Erreur lors de la suppression de la scène"
  },
  "characterEdit": {
    "backToCampaign": "Retour à la campagne",
    "titleEdit": "Éditer la fiche",
    "titleNew": "Nouveau personnage",
    "aiAssistant": "Assistant IA",
    "aiAssistantTitle": "Ouvrir l'Assistant IA pour dialoguer autour de ce PJ",
    "nameLabel": "Nom du personnage *",
    "namePlaceholder": "Ex: Thorin le Grand-Hache, Lyra l'Errante...",
    "portrait": "Portrait",
    "portraitHint": "Carré conseillé (400×400).",
    "header": "Bandeau / Header",
    "headerHint": "Format paysage conseillé (1200×400).",
    "chatWelcome": "Je vois cette fiche de personnage. Demande-moi de proposer stats, backstory, équipement ou objectifs personnels.",
    "chatSuggestion1": "Propose une backstory cohérente avec l'univers",
    "chatSuggestion2": "Suggère 3 objectifs personnels pour ce personnage",
    "chatSuggestion3": "Aide-moi à équilibrer les stats de combat",
    "deleteTitle": "Supprimer la fiche ?",
    "deleteMessage": "Supprimer la fiche de \"{{name}}\" ?",
    "irreversible": "Cette action est irréversible."
  },
  "characterView": {
    "aiAssistant": "Assistant IA"
  },
  "npcEdit": {
    "backToCampaign": "Retour à la campagne",
    "titleEdit": "Éditer le PNJ",
    "titleNew": "Nouveau PNJ",
    "aiAssistant": "Assistant IA",
    "aiAssistantTitle": "Ouvrir l'Assistant IA pour dialoguer autour de ce PNJ",
    "nameLabel": "Nom du PNJ *",
    "namePlaceholder": "Ex: Borin le forgeron, Dame Elara, Kael l'aubergiste...",
    "folder": "Dossier",
    "folderPlaceholder": "Ex: Bard's Gate, Faction des Pipers… (laisser vide = non classé)",
    "portrait": "Portrait",
    "portraitHint": "Carré conseillé (400×400).",
    "header": "Bandeau / Header",
    "headerHint": "Format paysage conseillé (1200×400).",
    "relatedPages": "Pages de Lore liées",
    "relatedPagesHint": "Reliez ce PNJ aux pages de l'univers (sa ville, sa faction, sa région…). Ces liens apparaissent dans le graphe du Lore.",
    "chatWelcome": "Je vois cette fiche de PNJ. Demande-moi de proposer apparence, motivations, secrets, ou répliques signatures.",
    "chatSuggestion1": "Propose une apparence et une posture marquantes",
    "chatSuggestion2": "Suggère 2 motivations et un secret pour ce PNJ",
    "chatSuggestion3": "Imagine 3 répliques signatures qui le caractérisent",
    "deleteTitle": "Supprimer la fiche ?",
    "deleteMessage": "Supprimer la fiche de \"{{name}}\" ?",
    "irreversible": "Cette action est irréversible."
  },
  "npcList": {
    "create": "Nouveau PNJ",
    "title": "PNJ",
    "hint": "Tous les personnages non-joueurs de la campagne, classés par dossier. Le champ « Dossier » de chaque fiche pilote le classement.",
    "empty": "Aucun PNJ pour l'instant.",
    "unclassified": "Non classés",
    "deleteTitle": "Supprimer la fiche",
    "deleteMessage": "Supprimer la fiche de « {{name}} » ?",
    "irreversible": "Cette action est irréversible."
  },
  "npcView": {
    "aiAssistant": "Assistant IA",
    "relatedPages": "Pages de Lore liées",
    "deletedPage": "(page supprimée)"
  },
  "enemyEdit": {
    "backToEnemies": "Retour aux ennemis",
    "titleEdit": "Éditer l'ennemi",
    "titleNew": "Nouvel ennemi",
    "nameLabel": "Nom de l'ennemi *",
    "namePlaceholder": "Ex: Balor, Gobelin chef de guerre, Liche…",
    "level": "Niveau / FP",
    "levelPlaceholder": "Ex: 5, FP 8, Boss…",
    "folder": "Dossier",
    "folderPlaceholder": "Ex: Démons, Humanoïdes… (vide = non classé)",
    "portrait": "Portrait",
    "portraitHint": "Carré conseillé (400×400).",
    "header": "Bandeau / Header",
    "headerHint": "Format paysage conseillé (1200×400).",
    "deleteTitle": "Supprimer la fiche ?",
    "deleteMessage": "Supprimer la fiche de \"{{name}}\" ?",
    "irreversible": "Cette action est irréversible."
  },
  "enemyList": {
    "create": "Nouvel ennemi",
    "title": "Ennemis",
    "hint": "Le bestiaire de la campagne : monstres et créatures avec leur fiche (pilotée par le template Ennemi du système de jeu), classés par dossier (Démons, Humanoïdes…).",
    "empty": "Aucun ennemi pour l'instant.",
    "unclassified": "Non classés",
    "levelShort": "Niv. {{level}}",
    "deleteTitle": "Supprimer l'ennemi",
    "deleteMessage": "Supprimer « {{name}} » ?"
  },
  "enemyView": {
    "levelLong": "Niveau {{level}}"
  },
  "gameSystems": {
    "heroTitle": "Systèmes de JDR",
    "heroSubtitle": "Les règles que l'IA connaîtra pour vos campagnes",
    "noDescription": "(Pas de description)",
    "byAuthor": "par {{author}}",
    "public": "public",
    "newSystem": "Nouveau système",
    "newSystemSubtitle": "Saisir les règles d'un JDR (markdown)",
    "tip": "💡 Astuce : organisez vos règles par sections avec des titres <code>## Combat</code>, <code>## Classes</code>, <code>## Lore</code>… Le système injectera les sections pertinentes selon ce que l'IA doit générer.",
    "deleteTitle": "Supprimer le système",
    "deleteMessage": "Supprimer le système \"{{name}}\" ?",
    "deleteDetail": "Les campagnes qui l'utilisent ne seront plus associées à aucun système."
  },
  "gameSystemEdit": {
    "backToList": "Retour à la liste",
    "editTitle": "Éditer le système",
    "createTitle": "Nouveau système de JDR",
    "nameLabel": "Nom *",
    "namePlaceholder": "Ex: Nimble, D&D 5.1 SRD, Mon Homebrew...",
    "descriptionLabel": "Description courte",
    "descriptionPlaceholder": "En une ligne, de quoi parle ce système ?",
    "authorLabel": "Auteur",
    "authorPlaceholder": "Ex: Hasbro, Homebrew, moi-même...",
    "rulesTitle": "Règles du système",
    "rulesHint": "Une section = un thème. L'IA injectera automatiquement les sections pertinentes selon ce qu'elle génère (combat → Combat/Monstres, PNJ → Classes, arc → Lore/Factions).",
    "importButton": "Importer un PDF de règles",
    "importInProgress": "Import en cours…",
    "importHint": "L'IA propose un découpage en sections — vous révisez avant d'enregistrer.",
    "sectionsFound": "Sections trouvées : {{titles}}",
    "sectionTitlePlaceholder": "Nom de la section (ex: Combat)",
    "removeSection": "Supprimer cette section",
    "sectionContentPlaceholder": "Décrivez les règles de cette section...",
    "noSections": "Aucune section pour l'instant — ajoutez-en une avec les boutons ci-dessous.",
    "addSection": "Ajouter une section :",
    "addOther": "Autre…",
    "charactersTitle": "Fiches de personnages",
    "charactersHint": "Définissez la structure des fiches PJ et PNJ pour ce système. Les champs universels (nom, portrait, header) sont automatiques — ne rajoutez ici que les champs spécifiques au système (Histoire, PV, Stats…).",
    "pcFieldsLabel": "Champs de la fiche PJ",
    "pcFieldsHint": "Affichés lors de la création/édition d'un personnage joueur.",
    "npcFieldsLabel": "Champs de la fiche PNJ",
    "npcFieldsHint": "Affichés lors de la création/édition d'un personnage non-joueur.",
    "enemyFieldsLabel": "Champs de la fiche Ennemi",
    "enemyFieldsHint": "Affichés lors de la création/édition d'un ennemi (bestiaire). Nom, niveau, dossier, portrait et bandeau sont automatiques.",
    "importExtracting": "Extraction du texte…",
    "importAnalyzing": "Analyse des règles… ({{current}}/{{total}})",
    "importFailed": "Échec de l'import du PDF.",
    "importFailedReason": "Échec de l'import : {{reason}}",
    "importNoRules": "Aucune règle exploitable n'a été extraite de ce PDF (scan sans OCR, ou contenu non reconnu).",
    "importOcrSuffix": " (dont {{count}} page(s) via OCR)",
    "importNote": "{{added}} section(s) proposée(s) depuis {{pages}} page(s){{ocr}}. Relisez et ajustez ci-dessous avant d'enregistrer."
  },
  "ollamaModelManager": {
    "installedModels": "Modèles installés",
    "deleteModelTitle": "Supprimer {{name}}",
    "pullDialogTitle": "Télécharger un modèle Ollama",
    "modelNameLabel": "Nom du modèle",
    "suggestions": "Suggestions :",
    "libraryHint": "La liste complète est sur <a href=\"https://ollama.com/library\" target=\"_blank\" rel=\"noopener\">ollama.com/library</a>.",
    "preparing": "Préparation...",
    "connecting": "connexion...",
    "cancelled": "annulé",
    "pullEventError": "Échec : {{error}}",
    "pullFailed": "Échec du téléchargement de {{name}}.",
    "pullInterrupted": "Téléchargement de {{name}} interrompu avant la fin. Relancez pour reprendre.",
    "pullDone": "Modèle {{name}} téléchargé.",
    "deleteTitle": "Supprimer le modèle",
    "deleteMessage": "Supprimer le modèle '{{name}}' ?",
    "deleteDetail": "L'espace disque sera libéré.",
    "deleteDone": "Modèle {{name}} supprimé.",
    "deleteFailed": "Échec de la suppression de {{name}}."
  },
  "updatesSection": {
    "title": "Mises à jour",
    "hint": "Vérifie auprès du registry Docker si une nouvelle version des conteneurs (core, brain, web) est disponible. Postgres et MinIO sont exclus — ils sont mis à jour manuellement.",
    "stableChannel": "Canal stable",
    "checking": "Vérification...",
    "checkNow": "Vérifier maintenant",
    "featureNotConfigured": "Feature non configurée (WATCHTOWER_TOKEN absent).",
    "updateAvailable": "Une mise à jour est disponible.",
    "checkImpossible": "Vérification impossible (baseline absente ou registry injoignable).",
    "upToDate": "Tout est à jour (vérifié le {{date}}).",
    "applying": "Mise à jour en cours...",
    "applyNow": "Mettre à jour maintenant",
    "betaChannelTitle": "Canal beta — réservé aux patrons",
    "betaChannelIntro": "Soutiens LoreMind sur Patreon pour accéder aux nouvelles features en avant-première. Le tier <strong>Compagnon</strong> (7€/mois) ou supérieur débloque ce canal.",
    "connectPatreon": "Connecter mon compte Patreon",
    "connectInstructions": "Une nouvelle fenêtre va s'ouvrir vers Patreon. Après autorisation, copie le token affiché et colle-le ci-dessous.",
    "patreonToken": "Token Patreon",
    "activateLicense": "Activer la licence",
    "licenseValid": "Compte Patreon connecté. Tier {{tier}} actif.",
    "licenseGrace": "Connexion Patreon expirée, mais accès beta maintenu pendant la période de tolérance. Vérifie que ton abonnement Patreon est toujours actif et clique sur \"Vérifier maintenant\".",
    "licenseExpired": "Connexion Patreon expirée depuis trop longtemps. Reconnecte-toi pour retrouver l'accès beta.",
    "licenseUnverifiable": "Le token installé ne peut plus être vérifié. Reconnecte-toi.",
    "infoTier": "<strong>Tier :</strong> {{tier}}",
    "infoValidity": "<strong>Validité :</strong> jusqu'au {{date}}",
    "renewalDay": "(renouvellement dans {{n}} jour)",
    "renewalDays": "(renouvellement dans {{n}} jours)",
    "infoLastRefresh": "<strong>Dernier refresh :</strong> {{date}}",
    "refreshOk": "OK",
    "refreshFailed": "échec",
    "enableBetaChannel": "Activer le canal beta",
    "disconnectPatreon": "Déconnecter Patreon",
    "checkingBetaImages": "Vérification des images beta...",
    "betaUnavailable": "Indisponible : {{reason}}",
    "betaCheckImpossible": "Vérification beta impossible (registry beta injoignable ou baseline absente).",
    "currentChannel": "Canal actuel :",
    "channelBeta": "Bêta",
    "channelStable": "Stable",
    "switchToBeta": "Passer sur le canal beta",
    "switchToStable": "Repasser sur le canal stable",
    "switching": "Bascule en cours...",
    "switchInProgressNotice": "Bascule en cours. L'application va être indisponible 10 à 30 secondes — la page se rechargera automatiquement quand le nouveau Core sera prêt.",
    "switcherUnavailable": "Le sidecar de bascule n'est pas installé. Pour bénéficier du switch automatique, récupère le dernier <code>docker-compose.yml</code> du repo et fais <code>docker compose pull &amp;&amp; docker compose up -d</code> une fois. Sinon, bascule manuellement en éditant <code>IMAGE_NAMESPACE</code> dans ton <code>.env</code> (<code>igmlcreation/loremind-</code> pour stable, <code>igmlcreation/loremind-beta-</code> pour beta).",
    "connectUrlError": "Impossible de générer l'URL de connexion. Vérifie ta config.",
    "pasteTokenFirst": "Colle d'abord le token reçu après connexion Patreon.",
    "patreonConnectedSuccess": "Compte Patreon connecté. L'accès beta est actif.",
    "disconnectTitle": "Déconnecter Patreon",
    "disconnectMessage": "Déconnecter ton compte Patreon ?",
    "disconnectDetail": "Tu perdras l'accès au canal beta.",
    "disconnectConfirm": "Déconnecter",
    "patreonDisconnected": "Compte Patreon déconnecté.",
    "switchToBetaMessage": "Basculer LoreMind sur le canal beta ? Les containers core/brain/web vont être recréés avec les images beta. L'application sera indisponible 10-30 secondes.",
    "switchToStableMessage": "Repasser LoreMind sur le canal stable ? Les containers core/brain/web vont être recréés avec les images stables. L'application sera indisponible 10-30 secondes.",
    "switchToBetaTitle": "Passer en beta ?",
    "switchToStableTitle": "Repasser en stable ?",
    "switchDetailData": "Les données (DB, images) sont préservées.",
    "switchDetailReversible": "Tu pourras refaire le chemin inverse à tout moment depuis cet écran.",
    "switchToBetaConfirm": "Passer en beta",
    "switchToStableConfirm": "Repasser en stable",
    "switchFailed": "Échec du switch",
    "applyTitle": "Mettre à jour",
    "applyMessage": "Télécharger et redémarrer les conteneurs maintenant ?",
    "applyDetail": "L'app sera indisponible quelques secondes.",
    "applyConfirm": "Mettre à jour",
    "applyTriggered": "Mise à jour déclenchée. Rechargez la page dans 30s."
  },
  "itemCatalogEdit": {
    "editTitle": "Éditer le catalogue",
    "createTitle": "Nouveau catalogue d'objets",
    "nameLabel": "Nom *",
    "namePlaceholder": "Ex: Échoppe de l'armurier nain",
    "descriptionPlaceholder": "À quoi sert ce catalogue / cette boutique ?",
    "aiTitle": "Générer avec l'IA",
    "aiHint": "Décris la boutique/le butin ; l'IA propose les objets (revois-les avant d'enregistrer). Contextualisé avec ta campagne.",
    "aiPlaceholder": "Ex: boutique d'alchimiste dans une cité portuaire, objets exotiques",
    "itemsTitle": "Objets",
    "priceLabel": "Prix",
    "categoryLabel": "Catégorie",
    "itemNamePlaceholder": "Objet",
    "itemPricePlaceholder": "50 po",
    "itemCategoryPlaceholder": "Armes",
    "itemDescriptionPlaceholder": "Effet / détails",
    "emptyHint": "Aucun objet — clique « Ajouter ».",
    "aiPromptRequired": "Décris le catalogue à générer.",
    "aiError": "Échec de la génération IA. Réessaie ou reformule.",
    "nameRequired": "Le nom est requis.",
    "saveError": "Échec de l'enregistrement."
  },
  "itemCatalogList": {
    "title": "Catalogues d'objets",
    "hint": "Boutiques, butins, trésors… à remplir à la main ou via l'IA. Consultables en session quand les joueurs visitent une échoppe.",
    "newCatalog": "Nouveau catalogue",
    "empty": "Aucun catalogue pour l'instant.",
    "itemCount": "{{n}} objet(s)",
    "deleteTitle": "Supprimer le catalogue",
    "deleteMessage": "Supprimer « {{name}} » ?"
  },
  "itemCatalogView": {
    "empty": "Aucun objet — édite le catalogue pour en ajouter."
  },
  "notebookActionCard": {
    "arc": "Arc",
    "chapter": "Chapitre",
    "warnArc": "Crée d'abord un arc dans la campagne pour pouvoir y rattacher cet élément.",
    "warnArcChapter": "Crée d'abord un arc et un chapitre dans la campagne pour pouvoir y rattacher cet élément.",
    "creating": "Création…",
    "createInCampaign": "Créer dans la campagne",
    "createdOpen": "Créé — ouvrir",
    "createError": "Échec de la création.",
    "typeNpc": "PNJ",
    "typeScene": "Scène",
    "typeChapter": "Chapitre",
    "typeArc": "Arc",
    "typeTable": "Table aléatoire"
  },
  "notebookList": {
    "title": "Ateliers d'adaptation",
    "hint": "Discute avec l'IA à partir d'un PDF source (recherche dans le document) pour adapter son contenu à ta campagne. La source et la conversation sont conservées.",
    "namePlaceholder": "Nom de l'atelier (ex: Adaptation du module X)",
    "newNotebook": "Nouvel atelier",
    "empty": "Aucun atelier pour l'instant.",
    "defaultName": "Nouvel atelier",
    "deleteTitle": "Supprimer l'atelier",
    "deleteMessage": "Supprimer « {{name}} » et ses sources indexées ?"
  },
  "notebookDetail": {
    "backToList": "Ateliers",
    "sources": "Sources",
    "indexing": "Indexation…",
    "addPdf": "Ajouter un PDF",
    "sourcesUsed": "{{selected}}/{{total}} source(s) utilisée(s) par le chat et l'analyse approfondie",
    "sourceIncludedTitle": "Source utilisée par le chat — décocher pour l'exclure",
    "sourceExcludedTitle": "Source ignorée par le chat — cocher pour l'inclure",
    "sourceMeta": "{{pages}} p. · {{chunks}} extraits",
    "indexingInProgress": "indexation en cours…",
    "indexingFailed": "échec de l'indexation",
    "sourcesEmpty": "Ajoute un PDF source pour commencer à discuter avec.",
    "archiveBanner": "Archive du {{label}} — lecture seule",
    "backToChat": "Revenir au chat",
    "refBadgeTitle": "Le contenu de ces archives est injecté comme référence dans chaque question",
    "refBadge": "{{n}} archive(s) en référence",
    "archivesBtnTitle": "Conversations archivées (lecture seule + référence)",
    "archives": "Archives",
    "clearBtnTitle": "Vider la conversation (le fil actuel est archivé, pas supprimé)",
    "clear": "Vider",
    "archivesEmpty": "Aucune conversation archivée pour l'instant — « Vider » archive le fil courant ici.",
    "archivesHelp": "Cochez une archive pour l'utiliser comme <strong>référence</strong> dans le chat ; cliquez sur son nom pour la relire.",
    "archiveRefOnTitle": "Archive utilisée comme référence — décocher pour la retirer",
    "archiveRefOffTitle": "Utiliser cette archive comme référence dans le chat",
    "roleUser": "Vous",
    "roleAi": "IA",
    "chatEmpty": "Pose une question sur ta source, ou demande une adaptation pour ta campagne.",
    "chatEmptyNoSource": "<br>(Ajoute d'abord une source indexée pour des réponses ancrées.)",
    "deepProgress": "Analyse approfondie du document… {{current}}/{{total}}",
    "sourcesPagesTitle": "Pages de la source utilisées pour ancrer cette réponse",
    "draftPlaceholder": "Demande une adaptation, un résumé, un PNJ inspiré de la source…",
    "deepBtnTitle": "Analyse approfondie : lit TOUT le document (plus lent, exhaustif). Idéal pour « liste tous les… »",
    "sendBtnTitle": "Réponse rapide (recherche ciblée dans le document)",
    "uploadError": "Échec de l'indexation. Réessaie ou vérifie le modèle d'embedding.",
    "clearTitle": "Vider la conversation",
    "clearMessage": "Repartir d'une conversation vierge ?",
    "clearDetail": "Le fil actuel est archivé (pas supprimé) : il restera consultable via « Archives ».",
    "archiveLabel": "{{when}} · {{n}} message(s)"
  },
  "sessionDetail": {
    "backToCampaign": "Retour à la campagne",
    "renameTitle": "Renommer la session",
    "statusActive": "En cours",
    "statusEnded": "Terminée",
    "startedOn": "Démarrée le {{date}}",
    "endedOn": "Terminée le {{date}}",
    "endSession": "Terminer la session",
    "ctrlEnterHint": "Ctrl + Entrée pour ajouter",
    "addEntryPlaceholder": "Ajouter une {{type}}…",
    "journalTitle": "Journal de session",
    "noEntries": "Aucune entrée pour le moment.",
    "noEntriesHint": "Saisis une note, un évènement ou un jet ci-dessus pour commencer le journal.",
    "entryType": {
      "NOTE": "Note",
      "EVENT": "Évènement",
      "DICE_ROLL": "Jet de dés",
      "PLAYER_ACTION": "Action joueur"
    },
    "endConfirm": {
      "title": "Terminer la session ?",
      "message": "Marquer la session \"{{name}}\" comme terminée ?",
      "detail": "Tu pourras toujours consulter son contenu après.",
      "confirmLabel": "Terminer"
    },
    "deleteConfirm": {
      "title": "Supprimer la session ?",
      "message": "Supprimer définitivement la session \"{{name}}\" ?",
      "noEntries": "Aucune entrée de journal pour cette session.",
      "entriesOne": "1 entrée de journal sera également supprimée.",
      "entriesMany": "{{n}} entrées de journal seront également supprimées.",
      "irreversible": "Cette action est irréversible."
    },
    "deleteEntryConfirm": {
      "title": "Supprimer cette entrée ?",
      "message": "Cette entrée du journal sera définitivement supprimée."
    }
  },
  "sessionReferencePanel": {
    "tabAi": "IA",
    "tabDice": "Dés",
    "tabTables": "Tables",
    "tabObjects": "Objets",
    "tabCharacters": "PJ/PNJ",
    "tabScenes": "Scènes",
    "playerCharacters": "Personnages joueurs",
    "nonPlayerCharacters": "Personnages non-joueurs",
    "emptyCharacters": "Aucun personnage dans cette campagne.",
    "emptyScenes": "Aucun arc narratif. Construis le scénario de ta campagne pour le retrouver ici."
  },
  "sessionDicePanel": {
    "count": "Nombre",
    "modifier": "Modificateur",
    "roll": "Lancer",
    "lastRolls": "Derniers jets",
    "clearHistory": "Vider l'historique local",
    "addToJournal": "Ajouter au journal",
    "sessionEnded": "Session terminée",
    "placeholder": "Choisis un dé et lance."
  },
  "sessionAiChatPanel": {
    "welcome": "Pose une question à l'IA pendant la partie.",
    "welcomeSub": "Elle connaît ton univers, ta campagne, les règles du système et tout ce qui a été noté dans le journal.",
    "saveReplyTitle": "Ajouter cette réponse au journal",
    "sessionEnded": "Session terminée",
    "toJournal": "Au journal",
    "replying": "L’IA répond…",
    "inputPlaceholder": "Demande une idée, un rebondissement, une description…",
    "clearConversation": "Effacer la conversation",
    "send": "Envoyer",
    "stop": "Stop",
    "unknownError": "Erreur inconnue",
    "aiError": "Erreur IA : {{message}}",
    "interrupted": "[interrompu]"
  },
  "sessionRandomTablesPanel": {
    "empty": "Aucune table aléatoire dans cette campagne. Crée-en une depuis la sidebar.",
    "tables": "Tables",
    "roll": "Lancer",
    "noEntry": "aucune entrée",
    "journal": "Journal",
    "improvising": "…",
    "aiImprovise": "IA improvise",
    "noResult": "aucun résultat"
  },
  "sessionItemCatalogsPanel": {
    "empty": "Aucun catalogue d'objets dans cette campagne.",
    "catalogs": "Catalogues",
    "noteTitle": "Consigner au journal (ex. achat)",
    "journal": "Journal"
  },
  "randomTableEdit": {
    "titleEdit": "Éditer la table",
    "titleNew": "Nouvelle table aléatoire",
    "nameLabel": "Nom *",
    "namePlaceholder": "Ex: Rencontres en forêt",
    "descPlaceholder": "À quoi sert cette table ?",
    "formulaLabel": "Formule du dé *",
    "formulaValid": "Formule valide",
    "formulaExpected": "Format attendu : NdM (ex. 1d20, 2d6, d100)",
    "aiTitle": "Générer avec l'IA",
    "aiHint": "Décris la table ; l'IA propose les entrées (revois-les avant d'enregistrer). Contextualisé avec ta campagne.",
    "aiPromptPlaceholder": "Ex: rencontres aléatoires dans une forêt hantée, ton sombre",
    "generateWith": "Générer ({{formula}})",
    "entriesTitle": "Entrées",
    "autoRanges": "Auto-plages",
    "autoRangesTitle": "Répartir les plages sur la formule",
    "colMin": "Min",
    "colMax": "Max",
    "colResult": "Résultat",
    "colDetail": "Détail",
    "detailPlaceholder": "Détail (optionnel)",
    "emptyHint": "Aucune entrée — clique « Ajouter ».",
    "aiErrorPrompt": "Décris la table à générer.",
    "aiErrorFormula": "Choisis d'abord une formule de dé valide.",
    "aiErrorGenerate": "Échec de la génération IA. Réessaie ou reformule.",
    "errorNameRequired": "Le nom est requis.",
    "errorFormulaInvalid": "Formule de dé invalide (ex. 1d20, 2d6, d100).",
    "errorSaveFailed": "Échec de l'enregistrement."
  },
  "randomTableView": {
    "die": "Dé :",
    "roll": "Lancer {{formula}}",
    "noMatch": "Aucune entrée pour ce résultat",
    "empty": "Aucune entrée — édite la table pour en ajouter.",
    "colRoll": "Jet",
    "colResult": "Résultat"
  },
  "playthroughDetail": {
    "startSession": "Lancer une session",
    "resumeSession": "Reprendre la session en cours",
    "facts": "Faits de la partie",
    "charactersTitle": "Personnages joueurs",
    "newCharacter": "Nouveau PJ",
    "noCharacters": "Aucun PJ pour cette partie.",
    "sessionsTitle": "Sessions",
    "noSessions": "Aucune session encore. Lancez la première !",
    "statusActive": "En cours",
    "statusEnded": "Terminée",
    "impactSessions": "{{n}} session(s)",
    "impactCharacters": "{{n}} PJ",
    "impactFlags": "{{n}} fait(s)",
    "impactProgressions": "{{n}} progression(s) de quête",
    "deleteCascade": "Cette action supprimera aussi : {{parts}}.",
    "irreversible": "Cette action est irréversible.",
    "deleteTitle": "Supprimer la Partie",
    "deleteMessage": "Supprimer \"{{name}}\" ?"
  },
  "playthroughFlagsPage": {
    "title": "Faits — {{name}}",
    "pageTitle": "{{name}} — Faits",
    "subtitle": "Faits booléens propres à cette partie. Toggle-les en jeu pour débloquer les quêtes qui en dépendent."
  },
  "campaignTree": {
    "npcs": "PNJ",
    "newNpc": "Nouveau PNJ",
    "newScene": "Nouvelle scène",
    "newQuest": "Nouvelle quête",
    "newChapter": "Nouveau chapitre",
    "randomTables": "Tables aléatoires",
    "newTable": "Nouvelle table",
    "notebooks": "Ateliers (IA + PDF)",
    "itemCatalogs": "Catalogues d'objets",
    "enemies": "Ennemis",
    "newEnemy": "Nouvel ennemi",
    "importPdf": "Importer un PDF",
    "newArc": "+ Nouvel arc",
    "allCampaigns": "Toutes les campagnes",
    "sectionCharacters": "Personnages",
    "sectionNarration": "Narration",
    "sectionTools": "Outils"
  },
  "services": {
    "importFailed": "Échec de l'import.",
    "importInterrupted": "L'import s'est interrompu avant la fin (connexion coupée ou délai dépassé). Réessayez.",
    "unknownServerError": "Erreur inconnue côté serveur.",
    "networkError": "Erreur réseau"
  }
}
