Mise en place de l'anglais comme deuxième langue pour l'application
Some checks failed
Build & Push Images / build (brain) (push) Has been cancelled
Build & Push Images / build (core) (push) Has been cancelled
Build & Push Images / build (web) (push) Has been cancelled
Build & Push Images / build-switcher (push) Has been cancelled

This commit is contained in:
2026-06-14 16:24:05 +02:00
parent 6e75326779
commit af3a6d443c
198 changed files with 7801 additions and 1720 deletions

1491
web/src/assets/i18n/en.json Normal file

File diff suppressed because it is too large Load Diff

1491
web/src/assets/i18n/fr.json Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,85 @@
{
"arcCreate": {
"title": "Create a new story arc",
"nameLabel": "Arc name *",
"namePlaceholder": "e.g. The Shadow of the North",
"structureLabel": "Arc structure",
"linearTitle": "Linear",
"linearDesc": "Chapters played in order — classic sequential storytelling.",
"hubTitle": "Hub",
"hubDesc": "Parallel quests unlocked by conditions — sandbox style (e.g. Phandalin / Icespire Peak).",
"descriptionPlaceholder": "Describe the main story arc...",
"iconLabel": "Icon",
"submit": "Create arc"
},
"arcEdit": {
"fallbackTitle": "Arc",
"subtitle": "Story arc",
"aiAssistant": "AI Assistant",
"aiAssistantTitle": "Open the AI Assistant to discuss this arc",
"illustrationsLabel": "Illustrations",
"illustrationsHint": "Moods, portraits, evocative visuals for the arc. JPEG, PNG, WebP or GIF, 10 MB max.",
"mapsLabel": "Maps & plans",
"mapsHint": "Regional maps and plans to help players locate the action.",
"nameLabel": "Arc title *",
"namePlaceholder": "e.g. The Shadow of the North",
"synopsisLabel": "Arc synopsis",
"synopsisPlaceholder": "Describe the main story of this arc...",
"structureLabel": "Arc structure",
"linearTitle": "Linear",
"linearDesc": "Chapters played in order — sequential storytelling.",
"hubTitle": "Hub",
"hubDesc": "Parallel quests unlocked by conditions (sandbox).",
"iconLabel": "Icon",
"themesLabel": "Main themes",
"themesPlaceholder": "What themes does this arc explore? (betrayal, redemption...)",
"stakesLabel": "Overall stakes",
"stakesPlaceholder": "What are the major stakes of this arc for the characters?",
"gmNotesLabel": "GM notes and planning",
"gmNotesPlaceholder": "Your notes on the arc's direction, planned twists, key reveals...",
"gmNotesHint": "These notes are private and will not be exported to FoundryVTT.",
"rewardsLabel": "Rewards and progression",
"rewardsPlaceholder": "What rewards will the players gain? Items, levels, knowledge, contacts...",
"resolutionLabel": "Planned resolution",
"resolutionPlaceholder": "How should this arc end? What are the possible outcomes?",
"relatedPagesLabel": "Linked Lore pages",
"relatedPagesHint": "Link this arc to NPCs, places or Lore elements. Click a chip to open the linked page.",
"noLoreHint": "💡 This campaign is not linked to any universe. Link it to a Lore in the campaign screen to be able to link this arc to Lore pages (NPCs, places, etc.).",
"chatWelcome": "I can see this arc. Ask me to enrich its themes, stakes or resolution.",
"chatSuggestion1": "Suggest 3 major themes for this arc",
"chatSuggestion2": "Imagine stakes that put pressure on the players",
"chatSuggestion3": "Suggest a two-act resolution",
"deleteTitle": "Delete arc",
"deleteMessage": "Delete the arc \"{{name}}\"?",
"irreversible": "This action is irreversible."
},
"arcView": {
"subtitleHub": "Hub arc (non-linear quests)",
"subtitleLinear": "Story arc",
"deleteTitle": "Delete the arc and all its content",
"mapsTitle": "Maps & plans",
"hubQuestsTitle": "Hub quests (scenario)",
"hubQuestsEmpty": "No quests for this hub. Create one to get started.",
"unlockConditions": "{{n}} unlock condition(s)",
"synopsisTitle": "Synopsis",
"themesTitle": "Main themes",
"stakesTitle": "Overall stakes",
"rewardsTitle": "Rewards and progression",
"resolutionTitle": "Planned resolution",
"gmNotesTitle": "GM notes and planning",
"relatedPagesTitle": "Linked Lore pages",
"notProvided": "Not provided",
"prereqQuestCompleted": "Quest “{{name}}” completed",
"prereqSessionReached": "Session {{n}} reached",
"prereqFlagSet": "Fact: {{flag}}",
"deletedPage": "(deleted page)",
"chaptersSingular": "{{n}} chapter",
"chaptersPlural": "{{n}} chapters",
"scenesSingular": "{{n}} scene",
"scenesPlural": "{{n}} scenes",
"deleteCascade": "This action will also delete: {{parts}}.",
"irreversible": "This action is irreversible.",
"deleteConfirmTitle": "Delete arc",
"deleteConfirmMessage": "Delete the arc \"{{name}}\"?"
}
}

View File

@@ -0,0 +1,85 @@
{
"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}}\" ?"
}
}

View File

@@ -0,0 +1,21 @@
{
"campaignTree": {
"npcs": "NPCs",
"newNpc": "New NPC",
"newScene": "New scene",
"newQuest": "New quest",
"newChapter": "New chapter",
"randomTables": "Random tables",
"newTable": "New table",
"notebooks": "Workshops (AI + PDF)",
"itemCatalogs": "Item catalogs",
"enemies": "Enemies",
"newEnemy": "New enemy",
"importPdf": "Import a PDF",
"newArc": "+ New arc",
"allCampaigns": "All campaigns",
"sectionCharacters": "Characters",
"sectionNarration": "Narration",
"sectionTools": "Tools"
}
}

View File

@@ -0,0 +1,21 @@
{
"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"
}
}

View File

@@ -0,0 +1,135 @@
{
"campaigns": {
"heroTitle": "Your Campaigns",
"heroSubtitle": "Join a campaign or create new ones",
"statusInProgress": "In progress",
"players": "{{n}} players",
"arcs": "{{n}} arcs",
"chapters": "{{n}} chapters",
"newCampaign": "New Campaign",
"newCampaignSubtitle": "Create a new adventure",
"tip": "💡 Tip: Organize your arcs and chapters so you never forget anything in your adventures"
},
"campaignCreate": {
"title": "Create a new Campaign",
"nameLabel": "Campaign name *",
"namePlaceholder": "e.g. The Shadow of the North, The Forgotten Heirs...",
"descriptionLabel": "Description / Pitch",
"descriptionPlaceholder": "Summarize the main plot of your campaign...",
"playerCountLabel": "Number of players",
"loreLabel": "Linked universe",
"noLoreOption": "— No universe (standalone campaign) —",
"loreHint": "Optional. If linked, you'll be able to connect arcs, chapters and scenes to Lore pages. Leave empty for a one-shot or if you'll create the Lore later.",
"gameSystemLabel": "RPG system",
"noGameSystemOption": "— None (generic campaign) —",
"createGameSystemOption": "+ Create a new system…",
"gameSystemNamePlaceholder": "Name of the new system (e.g. D&D 5e, Nimble, Homebrew)",
"gameSystemCreateHint": "Quick creation — you'll be able to add rules, PC/NPC sheet templates and the rest from the \"Systems\" section later.",
"gameSystemHint": "Optional. If set, the AI will inject the system's rules (classes, combat, lore...) into its suggestions to respect the RPG's mechanics.",
"gameSystemWarning": "⚠️ The chosen game system also determines the <strong>template for PC and NPC sheets</strong>. Changing it later will make the fields of existing sheets invisible (the data stays stored but will only show again when reverting to the previous system). Choose carefully from the start if possible.",
"orgIntro": "<strong>💡 Organization:</strong> Your campaign will be structured into:",
"orgArcs": "<strong>Arcs</strong> - The major narrative phases",
"orgChapters": "<strong>Chapters</strong> - The segments of an arc",
"orgScenes": "<strong>Scenes</strong> - The individual moments of play",
"submit": "Create the campaign"
},
"campaignDetail": {
"players": "{{n}} players",
"openLinkedLore": "Open the linked universe",
"loreMissingTitle": "The linked universe cannot be found",
"loreMissing": "Universe not found",
"loreLabel": "Linked universe",
"noLoreOption": "— No universe (standalone campaign) —",
"gameSystemLabel": "RPG system",
"noGameSystemOption": "— None (generic) —",
"createGameSystemOption": "+ Create a new system…",
"gameSystemNamePlaceholder": "Name of the new system (e.g. D&D 5e, Nimble, Homebrew)",
"charactersTitle": "Characters",
"npcTitle": "Non-player characters",
"newNpc": "New NPC",
"noNpc": "No NPCs yet.",
"createFirstNpc": "Create your first NPC",
"arcsTitle": "Narrative arcs",
"newArc": "New arc",
"chapters": "{{n}} chapters",
"noArc": "No narrative arcs yet.",
"createFirstArc": "Create your first arc",
"playthroughsTitle": "My playthroughs",
"newPlaythrough": "New playthrough",
"noPlaythrough": "No playthroughs. Create one to start a session with a table.",
"defaultPlaythroughName": "New playthrough {{n}}",
"gameSystemChange": {
"title": "Change the game system?",
"message": "You are about to change the game system of this campaign. This also changes the template for PC and NPC sheets.",
"detailSheets": "{{n}} existing sheet(s) are linked to the current system's template.",
"detailFields": "Their fields will no longer display with the new system.",
"detailStored": "The data stays stored: reverting to the previous system will make them visible again.",
"confirm": "Change anyway"
},
"delete": {
"title": "Delete the campaign?",
"message": "Permanently delete the campaign \"{{name}}\"?",
"arcs": "{{n}} arc",
"arcsPlural": "{{n}} arcs",
"chapters": "{{n}} chapter",
"chaptersPlural": "{{n}} chapters",
"scenes": "{{n}} scene",
"scenesPlural": "{{n}} scenes",
"playthroughs": "{{n}} playthrough (with its PCs, sessions, facts)",
"playthroughsPlural": "{{n}} playthroughs (with their PCs, sessions, facts)",
"alsoDeletes": "Will also be deleted: {{items}}.",
"irreversible": "This action is irreversible."
}
},
"campaignImport": {
"pageTitle": "Import a campaign",
"back": "Back to the campaign",
"title": "Import a campaign PDF",
"subtitle": "The AI proposes an arc → chapter → scene tree. You review and adjust it before creating anything.",
"importing": "Import in progress…",
"choosePdf": "Choose a campaign PDF",
"phaseExtracting": "Extracting text…",
"phaseAnalyzing": "Analyzing the campaign… ({{current}}/{{total}})",
"foundSoFar": "Found so far: {{arcs}} arc(s) · {{chapters}} chapter(s) · {{scenes}} scene(s) · {{npcs}} NPCs",
"errorNoStructure": "No narrative structure detected in this PDF.",
"errorImport": "PDF import failed.",
"errorImportDetail": "Import failed: {{message}}",
"errorApply": "Creation failed. Does the campaign still exist?",
"summaryToCreate": "To create: <strong>{{arcs}}</strong> new arc(s), <strong>{{chapters}}</strong> chapter(s), <strong>{{scenes}}</strong> scene(s)",
"summaryNpcs": ", <strong>{{npcs}}</strong> NPCs",
"summaryHint": ". Items marked <em>\"already present\"</em> (greyed out) are shown to place the additions in context; they will not be recreated. Edit the new ones, then create.",
"alreadyPresent": "already present",
"arcNamePlaceholder": "Arc name",
"removeArc": "Remove the arc",
"typeLabel": "Type:",
"typeLinear": "Linear",
"typeHub": "Hub (quests)",
"arcSynopsisPlaceholder": "Arc synopsis (optional)",
"chapterNamePlaceholder": "Chapter name",
"removeChapter": "Remove the chapter",
"chapterSynopsisPlaceholder": "Chapter synopsis (optional)",
"sceneNamePlaceholder": "Scene name",
"synopsisOptionalPlaceholder": "Synopsis (optional)",
"detailsTitle": "Player narration, GM notes, rooms",
"details": "Details",
"roomsCount": "· {{n}} room(s)",
"removeScene": "Remove the scene",
"playerNarrationLabel": "Read to the players",
"playerNarrationPlaceholder": "Boxed text read to the players (optional)",
"gmNotesLabel": "GM notes",
"gmNotesPlaceholder": "Secrets, development, consequences (optional)",
"roomsLabel": "Rooms (explorable location)",
"roomPlaceholder": "Room",
"enemiesPlaceholder": "Enemies",
"lootPlaceholder": "Loot",
"removeRoom": "Remove the room",
"room": "Room",
"scene": "Scene",
"chapter": "Chapter",
"addArc": "Add an arc",
"npcReviewTitle": "Detected NPCs and creatures ({{n}})",
"npcReviewHint": "Check the ones to create in the campaign (description taken from the book). Those already present in the campaign are greyed out and will not be recreated.",
"creating": "Creating…",
"createInCampaign": "Create in the campaign"
}
}

View File

@@ -0,0 +1,135 @@
{
"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"
}
}

View File

@@ -0,0 +1,91 @@
{
"chapterCreate": {
"titleQuest": "Create a new quest",
"titleChapter": "Create a new chapter",
"hub": "Hub",
"arc": "Arc",
"nameQuestLabel": "Quest name *",
"nameChapterLabel": "Chapter name *",
"namePlaceholderQuest": "e.g. Rescue the missing merchant",
"namePlaceholderChapter": "e.g. Chapter 1: The Disappearances",
"descPlaceholderQuest": "Describe this quest...",
"descPlaceholderChapter": "Describe this chapter...",
"icon": "Icon",
"createQuest": "Create quest",
"createChapter": "Create chapter"
},
"chapterEdit": {
"chapter": "Chapter",
"aiAssistant": "AI Assistant",
"aiAssistantTitle": "Open the AI Assistant to discuss this chapter",
"unlockTitleQuest": "🗺️ Quest unlock conditions",
"unlockTitleChapter": "🔒 Chapter unlock conditions",
"unlockHintQuest": "Scenario definition: all conditions must be met (AND) for the quest to unlock in a Playthrough. Leave empty to make it available from the start. Progression and fact states are managed in the Playthrough screen, not here.",
"unlockHintChapter": "Scenario definition: all conditions must be met (AND) for this chapter to unlock in a Playthrough. Leave empty to make it available from the start. Progression and fact states are managed in the Playthrough screen, not here.",
"illustrations": "Illustrations",
"illustrationsHint": "Portraits, moods and standout scenes of the chapter.",
"maps": "Maps & plans",
"mapsHint": "Regional maps, dungeon layouts and diagrams useful at the table.",
"nameLabel": "Chapter title *",
"namePlaceholder": "e.g. Chapter 1: The Disappearances",
"synopsisLabel": "Chapter synopsis",
"synopsisPlaceholder": "Briefly describe what happens in this chapter...",
"icon": "Icon",
"gmNotesLabel": "Game Master notes",
"gmNotesPlaceholder": "Your private notes on how the chapter unfolds, key events, twists...",
"gmNotesHint": "These notes are private and will not be exported to FoundryVTT.",
"playerObjectivesLabel": "Player objectives",
"playerObjectivesPlaceholder": "What must the players accomplish in this chapter?",
"narrativeStakesLabel": "Narrative stakes",
"narrativeStakesPlaceholder": "What are the dramatic stakes?",
"relatedPages": "Linked Lore pages",
"relatedPagesHint": "Link this chapter to NPCs, places or Lore elements that appear in it.",
"noLoreHint": "💡 This campaign is not linked to any universe. Link it to a Lore in the campaign screen to be able to link this chapter to Lore pages.",
"chatWelcome": "I can see this chapter. Ask me to flesh out its objectives, its stakes or its opening scene.",
"chatSuggestion1": "Suggest clear objectives for the players in this chapter",
"chatSuggestion2": "Imagine 2 narrative tensions that renew interest midway through the chapter",
"chatSuggestion3": "Suggest a striking opening scene",
"deleteTitle": "Delete chapter",
"deleteMessage": "Delete the chapter \"{{name}}\"?",
"irreversible": "This action is irreversible."
},
"chapterGraph": {
"chapter": "Chapter",
"title": "{{name}} — Map",
"subtitle": "Flowchart of scenes and their narrative branches",
"back": "Back to chapter",
"empty": "This chapter has no scenes. Create some to see the map appear.",
"hint": "💡 Click a scene to open it, or drag it to rearrange the map. Scenes not connected to the entry point (scene of order 1) appear at the bottom.",
"allCampaigns": "All campaigns"
},
"chapterView": {
"chapter": "Chapter",
"questHub": "Quest (Hub)",
"conditional": "Conditional",
"conditionalBadgeTitle": "This chapter has unlock conditions: it unlocks in a Playthrough when they are met.",
"map": "Chapter map",
"mapTitle": "View the flowchart of scenes and their branches",
"deleteTitle": "Delete the chapter and its scenes",
"unlockConditions": "Unlock conditions",
"unlockHintQuest": "During a playthrough, the quest unlocks as soon as all these conditions are met. Toggling facts is done in the Playthrough's \"Facts\" screen.",
"unlockHintChapter": "During a playthrough, this chapter unlocks as soon as all these conditions are met. Toggling facts is done in the Playthrough's \"Facts\" screen.",
"noConditionQuest": "No conditions — this quest is available from the start in every Playthrough.",
"noConditionEdit": "Click <strong>Edit</strong> to add conditions (\"previous quest completed\", \"from session N onward\", \"when a fact is true\").",
"maps": "Maps & plans",
"synopsis": "Synopsis",
"notProvided": "Not provided",
"playerObjectives": "Player objectives",
"narrativeStakes": "Narrative stakes",
"gmNotes": "Game Master notes",
"relatedPages": "Linked Lore pages",
"prereqQuestCompleted": "Quest \"{{name}}\" completed",
"prereqSessionReached": "Session {{n}} reached",
"prereqFlagSet": "Fact: {{flag}}",
"deletedPage": "(deleted page)",
"deleteScenes": "This action will also delete: {{n}} scene.",
"deleteScenesPlural": "This action will also delete: {{n}} scenes.",
"irreversible": "This action is irreversible.",
"deleteChapterTitle": "Delete chapter",
"deleteChapterMessage": "Delete the chapter \"{{name}}\"?"
}
}

View File

@@ -0,0 +1,91 @@
{
"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}}\" ?"
}
}

View File

@@ -0,0 +1,95 @@
{
"characterEdit": {
"backToCampaign": "Back to campaign",
"titleEdit": "Edit character sheet",
"titleNew": "New character",
"aiAssistant": "AI Assistant",
"aiAssistantTitle": "Open the AI Assistant to brainstorm about this PC",
"nameLabel": "Character name *",
"namePlaceholder": "E.g. Thorin Great-Axe, Lyra the Wanderer...",
"portrait": "Portrait",
"portraitHint": "Square recommended (400×400).",
"header": "Banner / Header",
"headerHint": "Landscape format recommended (1200×400).",
"chatWelcome": "I can see this character sheet. Ask me to suggest stats, backstory, equipment or personal goals.",
"chatSuggestion1": "Suggest a backstory consistent with the setting",
"chatSuggestion2": "Suggest 3 personal goals for this character",
"chatSuggestion3": "Help me balance the combat stats",
"deleteTitle": "Delete this sheet?",
"deleteMessage": "Delete the sheet for \"{{name}}\"?",
"irreversible": "This action is irreversible."
},
"characterView": {
"aiAssistant": "AI Assistant"
},
"npcEdit": {
"backToCampaign": "Back to campaign",
"titleEdit": "Edit NPC",
"titleNew": "New NPC",
"aiAssistant": "AI Assistant",
"aiAssistantTitle": "Open the AI Assistant to brainstorm about this NPC",
"nameLabel": "NPC name *",
"namePlaceholder": "E.g. Borin the blacksmith, Lady Elara, Kael the innkeeper...",
"folder": "Folder",
"folderPlaceholder": "E.g. Bard's Gate, The Pipers faction… (leave empty = unfiled)",
"portrait": "Portrait",
"portraitHint": "Square recommended (400×400).",
"header": "Banner / Header",
"headerHint": "Landscape format recommended (1200×400).",
"relatedPages": "Linked Lore pages",
"relatedPagesHint": "Link this NPC to pages of the setting (their town, faction, region…). These links appear in the Lore graph.",
"chatWelcome": "I can see this NPC sheet. Ask me to suggest appearance, motivations, secrets, or signature lines.",
"chatSuggestion1": "Suggest a striking appearance and posture",
"chatSuggestion2": "Suggest 2 motivations and a secret for this NPC",
"chatSuggestion3": "Imagine 3 signature lines that characterize them",
"deleteTitle": "Delete this sheet?",
"deleteMessage": "Delete the sheet for \"{{name}}\"?",
"irreversible": "This action is irreversible."
},
"npcList": {
"create": "New NPC",
"title": "NPCs",
"hint": "All the non-player characters in the campaign, organized by folder. The \"Folder\" field of each sheet drives the classification.",
"empty": "No NPCs yet.",
"unclassified": "Unfiled",
"deleteTitle": "Delete sheet",
"deleteMessage": "Delete the sheet for \"{{name}}\"?",
"irreversible": "This action is irreversible."
},
"npcView": {
"aiAssistant": "AI Assistant",
"relatedPages": "Linked Lore pages",
"deletedPage": "(deleted page)"
},
"enemyEdit": {
"backToEnemies": "Back to enemies",
"titleEdit": "Edit enemy",
"titleNew": "New enemy",
"nameLabel": "Enemy name *",
"namePlaceholder": "E.g. Balor, Goblin warchief, Lich…",
"level": "Level / CR",
"levelPlaceholder": "E.g. 5, CR 8, Boss…",
"folder": "Folder",
"folderPlaceholder": "E.g. Demons, Humanoids… (empty = unfiled)",
"portrait": "Portrait",
"portraitHint": "Square recommended (400×400).",
"header": "Banner / Header",
"headerHint": "Landscape format recommended (1200×400).",
"deleteTitle": "Delete this sheet?",
"deleteMessage": "Delete the sheet for \"{{name}}\"?",
"irreversible": "This action is irreversible."
},
"enemyList": {
"create": "New enemy",
"title": "Enemies",
"hint": "The campaign bestiary: monsters and creatures with their sheet (driven by the game system's Enemy template), organized by folder (Demons, Humanoids…).",
"empty": "No enemies yet.",
"unclassified": "Unfiled",
"levelShort": "Lvl {{level}}",
"deleteTitle": "Delete enemy",
"deleteMessage": "Delete \"{{name}}\"?"
},
"enemyView": {
"levelLong": "Level {{level}}"
}
}

View File

@@ -0,0 +1,95 @@
{
"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}}"
}
}

View File

@@ -0,0 +1,138 @@
{
"gameSystems": {
"heroTitle": "RPG Systems",
"heroSubtitle": "The rules the AI will know for your campaigns",
"noDescription": "(No description)",
"byAuthor": "by {{author}}",
"public": "public",
"newSystem": "New system",
"newSystemSubtitle": "Enter the rules of an RPG (markdown)",
"tip": "💡 Tip: organize your rules into sections with headings <code>## Combat</code>, <code>## Classes</code>, <code>## Lore</code>… The system will inject the relevant sections based on what the AI needs to generate.",
"deleteTitle": "Delete system",
"deleteMessage": "Delete the system \"{{name}}\"?",
"deleteDetail": "Campaigns using it will no longer be associated with any system."
},
"gameSystemEdit": {
"backToList": "Back to list",
"editTitle": "Edit system",
"createTitle": "New RPG system",
"nameLabel": "Name *",
"namePlaceholder": "e.g. Nimble, D&D 5.1 SRD, My Homebrew...",
"descriptionLabel": "Short description",
"descriptionPlaceholder": "In one line, what is this system about?",
"authorLabel": "Author",
"authorPlaceholder": "e.g. Hasbro, Homebrew, myself...",
"rulesTitle": "System rules",
"rulesHint": "One section = one theme. The AI will automatically inject the relevant sections based on what it generates (combat → Combat/Monsters, NPC → Classes, arc → Lore/Factions).",
"importButton": "Import a rules PDF",
"importInProgress": "Importing…",
"importHint": "The AI suggests a breakdown into sections — you review it before saving.",
"sectionsFound": "Sections found: {{titles}}",
"sectionTitlePlaceholder": "Section name (e.g. Combat)",
"removeSection": "Remove this section",
"sectionContentPlaceholder": "Describe the rules of this section...",
"noSections": "No sections yet — add one with the buttons below.",
"addSection": "Add a section:",
"addOther": "Other…",
"charactersTitle": "Character sheets",
"charactersHint": "Define the structure of PC and NPC sheets for this system. Universal fields (name, portrait, header) are automatic — only add here the fields specific to the system (Background, HP, Stats…).",
"pcFieldsLabel": "PC sheet fields",
"pcFieldsHint": "Shown when creating/editing a player character.",
"npcFieldsLabel": "NPC sheet fields",
"npcFieldsHint": "Shown when creating/editing a non-player character.",
"enemyFieldsLabel": "Enemy sheet fields",
"enemyFieldsHint": "Shown when creating/editing an enemy (bestiary). Name, level, folder, portrait and banner are automatic.",
"importExtracting": "Extracting text…",
"importAnalyzing": "Analyzing rules… ({{current}}/{{total}})",
"importFailed": "PDF import failed.",
"importFailedReason": "Import failed: {{reason}}",
"importNoRules": "No usable rules could be extracted from this PDF (scan without OCR, or unrecognized content).",
"importOcrSuffix": " (including {{count}} page(s) via OCR)",
"importNote": "{{added}} section(s) suggested from {{pages}} page(s){{ocr}}. Review and adjust below before saving."
},
"ollamaModelManager": {
"installedModels": "Installed models",
"deleteModelTitle": "Delete {{name}}",
"pullDialogTitle": "Download an Ollama model",
"modelNameLabel": "Model name",
"suggestions": "Suggestions:",
"libraryHint": "The full list is on <a href=\"https://ollama.com/library\" target=\"_blank\" rel=\"noopener\">ollama.com/library</a>.",
"preparing": "Preparing...",
"connecting": "connecting...",
"cancelled": "cancelled",
"pullEventError": "Failed: {{error}}",
"pullFailed": "Failed to download {{name}}.",
"pullInterrupted": "Download of {{name}} interrupted before completion. Restart to resume.",
"pullDone": "Model {{name}} downloaded.",
"deleteTitle": "Delete model",
"deleteMessage": "Delete the model '{{name}}'?",
"deleteDetail": "Disk space will be freed.",
"deleteDone": "Model {{name}} deleted.",
"deleteFailed": "Failed to delete {{name}}."
},
"updatesSection": {
"title": "Updates",
"hint": "Checks the Docker registry to see whether a new version of the containers (core, brain, web) is available. Postgres and MinIO are excluded — they are updated manually.",
"stableChannel": "Stable channel",
"checking": "Checking...",
"checkNow": "Check now",
"featureNotConfigured": "Feature not configured (WATCHTOWER_TOKEN missing).",
"updateAvailable": "An update is available.",
"checkImpossible": "Check failed (baseline missing or registry unreachable).",
"upToDate": "Everything is up to date (checked on {{date}}).",
"applying": "Updating...",
"applyNow": "Update now",
"betaChannelTitle": "Beta channel — patrons only",
"betaChannelIntro": "Support LoreMind on Patreon to access new features in preview. The <strong>Compagnon</strong> tier (€7/month) or higher unlocks this channel.",
"connectPatreon": "Connect my Patreon account",
"connectInstructions": "A new window will open to Patreon. After authorizing, copy the displayed token and paste it below.",
"patreonToken": "Patreon token",
"activateLicense": "Activate license",
"licenseValid": "Patreon account connected. Tier {{tier}} active.",
"licenseGrace": "Patreon connection expired, but beta access is maintained during the grace period. Make sure your Patreon subscription is still active and click \"Check now\".",
"licenseExpired": "Patreon connection expired too long ago. Reconnect to regain beta access.",
"licenseUnverifiable": "The installed token can no longer be verified. Reconnect.",
"infoTier": "<strong>Tier:</strong> {{tier}}",
"infoValidity": "<strong>Validity:</strong> until {{date}}",
"renewalDay": "(renews in {{n}} day)",
"renewalDays": "(renews in {{n}} days)",
"infoLastRefresh": "<strong>Last refresh:</strong> {{date}}",
"refreshOk": "OK",
"refreshFailed": "failed",
"enableBetaChannel": "Enable beta channel",
"disconnectPatreon": "Disconnect Patreon",
"checkingBetaImages": "Checking beta images...",
"betaUnavailable": "Unavailable: {{reason}}",
"betaCheckImpossible": "Beta check failed (beta registry unreachable or baseline missing).",
"currentChannel": "Current channel:",
"channelBeta": "Beta",
"channelStable": "Stable",
"switchToBeta": "Switch to the beta channel",
"switchToStable": "Switch back to the stable channel",
"switching": "Switching...",
"switchInProgressNotice": "Switching in progress. The application will be unavailable for 10 to 30 seconds — the page will reload automatically once the new Core is ready.",
"switcherUnavailable": "The channel switcher sidecar is not installed. To benefit from automatic switching, fetch the latest <code>docker-compose.yml</code> from the repo and run <code>docker compose pull &amp;&amp; docker compose up -d</code> once. Otherwise, switch manually by editing <code>IMAGE_NAMESPACE</code> in your <code>.env</code> (<code>igmlcreation/loremind-</code> for stable, <code>igmlcreation/loremind-beta-</code> for beta).",
"connectUrlError": "Unable to generate the connection URL. Check your config.",
"pasteTokenFirst": "First paste the token received after connecting with Patreon.",
"patreonConnectedSuccess": "Patreon account connected. Beta access is active.",
"disconnectTitle": "Disconnect Patreon",
"disconnectMessage": "Disconnect your Patreon account?",
"disconnectDetail": "You will lose access to the beta channel.",
"disconnectConfirm": "Disconnect",
"patreonDisconnected": "Patreon account disconnected.",
"switchToBetaMessage": "Switch LoreMind to the beta channel? The core/brain/web containers will be recreated with the beta images. The application will be unavailable for 10-30 seconds.",
"switchToStableMessage": "Switch LoreMind back to the stable channel? The core/brain/web containers will be recreated with the stable images. The application will be unavailable for 10-30 seconds.",
"switchToBetaTitle": "Switch to beta?",
"switchToStableTitle": "Switch back to stable?",
"switchDetailData": "Your data (DB, images) is preserved.",
"switchDetailReversible": "You can switch back at any time from this screen.",
"switchToBetaConfirm": "Switch to beta",
"switchToStableConfirm": "Switch back to stable",
"switchFailed": "Switch failed",
"applyTitle": "Update",
"applyMessage": "Download and restart the containers now?",
"applyDetail": "The app will be unavailable for a few seconds.",
"applyConfirm": "Update",
"applyTriggered": "Update triggered. Reload the page in 30s."
}
}

View File

@@ -0,0 +1,138 @@
{
"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."
}
}

View File

@@ -0,0 +1,100 @@
{
"itemCatalogEdit": {
"editTitle": "Edit catalog",
"createTitle": "New item catalog",
"nameLabel": "Name *",
"namePlaceholder": "e.g. The dwarven armorer's shop",
"descriptionPlaceholder": "What is this catalog / shop for?",
"aiTitle": "Generate with AI",
"aiHint": "Describe the shop/loot; the AI suggests the items (review them before saving). Contextualized with your campaign.",
"aiPlaceholder": "e.g. an alchemist's shop in a port city, exotic items",
"itemsTitle": "Items",
"priceLabel": "Price",
"categoryLabel": "Category",
"itemNamePlaceholder": "Item",
"itemPricePlaceholder": "50 gp",
"itemCategoryPlaceholder": "Weapons",
"itemDescriptionPlaceholder": "Effect / details",
"emptyHint": "No items — click \"Add\".",
"aiPromptRequired": "Describe the catalog to generate.",
"aiError": "AI generation failed. Try again or rephrase.",
"nameRequired": "Name is required.",
"saveError": "Saving failed."
},
"itemCatalogList": {
"title": "Item catalogs",
"hint": "Shops, loot, treasures… filled in by hand or via AI. Available during sessions when players visit a shop.",
"newCatalog": "New catalog",
"empty": "No catalogs yet.",
"itemCount": "{{n}} item(s)",
"deleteTitle": "Delete catalog",
"deleteMessage": "Delete \"{{name}}\"?"
},
"itemCatalogView": {
"empty": "No items — edit the catalog to add some."
},
"notebookActionCard": {
"arc": "Arc",
"chapter": "Chapter",
"warnArc": "First create an arc in the campaign so you can attach this element to it.",
"warnArcChapter": "First create an arc and a chapter in the campaign so you can attach this element to it.",
"creating": "Creating…",
"createInCampaign": "Create in campaign",
"createdOpen": "Created — open",
"createError": "Creation failed.",
"typeNpc": "NPC",
"typeScene": "Scene",
"typeChapter": "Chapter",
"typeArc": "Arc",
"typeTable": "Random table"
},
"notebookList": {
"title": "Adaptation workshops",
"hint": "Chat with the AI from a source PDF (searching within the document) to adapt its content to your campaign. The source and conversation are kept.",
"namePlaceholder": "Workshop name (e.g. Adapting module X)",
"newNotebook": "New workshop",
"empty": "No workshops yet.",
"defaultName": "New workshop",
"deleteTitle": "Delete workshop",
"deleteMessage": "Delete \"{{name}}\" and its indexed sources?"
},
"notebookDetail": {
"backToList": "Workshops",
"sources": "Sources",
"indexing": "Indexing…",
"addPdf": "Add a PDF",
"sourcesUsed": "{{selected}}/{{total}} source(s) used by the chat and deep analysis",
"sourceIncludedTitle": "Source used by the chat — uncheck to exclude it",
"sourceExcludedTitle": "Source ignored by the chat — check to include it",
"sourceMeta": "{{pages}} p. · {{chunks}} excerpts",
"indexingInProgress": "indexing in progress…",
"indexingFailed": "indexing failed",
"sourcesEmpty": "Add a source PDF to start chatting with it.",
"archiveBanner": "Archive from {{label}} — read-only",
"backToChat": "Back to chat",
"refBadgeTitle": "The content of these archives is injected as a reference in every question",
"refBadge": "{{n}} archive(s) referenced",
"archivesBtnTitle": "Archived conversations (read-only + reference)",
"archives": "Archives",
"clearBtnTitle": "Clear the conversation (the current thread is archived, not deleted)",
"clear": "Clear",
"archivesEmpty": "No archived conversations yet — \"Clear\" archives the current thread here.",
"archivesHelp": "Check an archive to use it as a <strong>reference</strong> in the chat; click its name to reread it.",
"archiveRefOnTitle": "Archive used as a reference — uncheck to remove it",
"archiveRefOffTitle": "Use this archive as a reference in the chat",
"roleUser": "You",
"roleAi": "AI",
"chatEmpty": "Ask a question about your source, or request an adaptation for your campaign.",
"chatEmptyNoSource": "<br>(First add an indexed source for grounded answers.)",
"deepProgress": "Deep analysis of the document… {{current}}/{{total}}",
"sourcesPagesTitle": "Source pages used to ground this answer",
"draftPlaceholder": "Request an adaptation, a summary, an NPC inspired by the source…",
"deepBtnTitle": "Deep analysis: reads the ENTIRE document (slower, exhaustive). Ideal for \"list all the…\"",
"sendBtnTitle": "Quick answer (targeted search within the document)",
"uploadError": "Indexing failed. Try again or check the embedding model.",
"clearTitle": "Clear the conversation",
"clearMessage": "Start from a blank conversation?",
"clearDetail": "The current thread is archived (not deleted): it will remain accessible via \"Archives\".",
"archiveLabel": "{{when}} · {{n}} message(s)"
}
}

View File

@@ -0,0 +1,100 @@
{
"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)"
}
}

View File

@@ -0,0 +1,102 @@
{
"lore": {
"heroTitle": "Your Worlds",
"heroSubtitle": "Select an existing lore or create a new world",
"cardDate": "2h ago",
"statPages": "{{n}} pages",
"statFolders": "{{n}} folders",
"newLore": "New Lore",
"newLoreSubtitle": "Create a new world",
"tip": "💡 Tip: Use templates to structure your world consistently"
},
"folderView": {
"breadcrumb": "Breadcrumb",
"summary": "{{folders}} subfolder(s) · {{pages}} page(s)",
"editTitle": "Edit folder",
"deleteTitle": "Delete the folder and all its contents",
"subfolders": "Subfolders",
"newSubfolder": "New subfolder",
"noSubfolders": "No subfolders.",
"pages": "Pages",
"newPage": "New page",
"noPages": "No pages in this folder.",
"deleteConfirmTitle": "Delete folder",
"deleteConfirmMessage": "Delete the folder \"{{name}}\"?",
"impact": {
"subfolders": "{{n}} subfolder",
"subfoldersPlural": "{{n}} subfolders",
"pages": "{{n}} page",
"pagesPlural": "{{n}} pages",
"alsoDeletes": "This action will also delete: {{items}}.",
"irreversible": "This action is irreversible."
}
},
"loreCreate": {
"title": "Create a new Lore",
"nameLabel": "World name *",
"namePlaceholder": "e.g. Realm of Shadows, Cyberpunk 2157...",
"descriptionPlaceholder": "Briefly describe your world, its mood, its genre...",
"infoIntro": "<strong>💡 Tip:</strong> Your lore will be created with a few default templates:",
"infoNpc": "NPC - For your characters",
"infoPlace": "Place - For your cities and regions",
"infoFaction": "Faction - For your organizations",
"infoItem": "Item - For your artifacts",
"infoFooter": "You'll be able to create your own templates afterwards!",
"submit": "Create lore"
},
"loreDetail": {
"graph": "Graph",
"graphTitle": "View the graph of pages and their links (NPCs included)",
"editTitle": "Edit Lore",
"deleteTitle": "Delete Lore",
"folders": "Folders",
"newFolder": "New folder",
"noFolders": "No folders yet.",
"createFirstFolder": "Create your first folder",
"deleteConfirmTitle": "Delete Lore",
"deleteConfirmMessage": "Permanently delete the Lore \"{{name}}\"?",
"impact": {
"folders": "{{n}} folder",
"foldersPlural": "{{n}} folders",
"pages": "{{n}} page",
"pagesPlural": "{{n}} pages",
"templates": "{{n}} template",
"templatesPlural": "{{n}} templates",
"alsoDeletes": "This action will also delete: {{items}}.",
"detachedCampaigns": "{{n}} campaign will be kept but will lose its link to this world.",
"detachedCampaignsPlural": "{{n}} campaigns will be kept but will lose their link to this world.",
"irreversible": "This action is irreversible."
}
},
"loreGraph": {
"back": "Back to Lore",
"title": "{{name}} — Graph",
"subtitle": "{{pages}} page(s) · {{npcs}} NPC · {{edges}} link(s). Click a node to open it, drag it to rearrange.",
"legendPage": "Lore page",
"legendNpc": "NPC",
"legendLink": "NPC → page link",
"empty": "No pages in this Lore yet — the graph will fill in as you go.",
"hint": "No links yet: link pages together (a page's \"Related pages\") or attach an NPC to Lore pages from its sheet."
},
"loreNodeCreate": {
"title": "Create a new folder",
"subtitle": "Folders let you organize your pages by category",
"nameLabel": "Folder name *",
"namePlaceholder": "e.g. Characters, Creatures...",
"parentLabel": "Parent folder",
"rootOption": "— Lore root —",
"parentHint": "Leave empty to create a folder at the lore root",
"iconLabel": "Icon",
"descriptionPlaceholder": "Describe the type of content this folder will contain...",
"submit": "Create folder"
},
"loreNodeEdit": {
"title": "Edit folder",
"summary": "{{folders}} subfolder(s) · {{pages}} page(s)",
"nameLabel": "Folder name *",
"parentLabel": "Parent folder",
"rootOption": "— Lore root —",
"parentHint": "You cannot select a subfolder of the current folder (cycles are forbidden)",
"iconLabel": "Icon"
}
}

View File

@@ -0,0 +1,102 @@
{
"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"
}
}

View File

@@ -0,0 +1,142 @@
{
"pageCreate": {
"title": "Create a new Page",
"subtitle": "Create a page from an existing template",
"pageTitle": "New page",
"pageTitleLabel": "Page title *",
"pageTitlePlaceholder": "E.g. Master Eldrin, The Silver City...",
"templateLabel": "Template *",
"createTemplate": "Create a template",
"createTemplateTitle": "Create a new template for this Lore",
"createTemplateHint": "You'll come back here automatically, and your input will be kept.",
"noTemplates": "No template defined for this Lore.",
"firstSuffix": "first.",
"nodeLabel": "Destination folder *",
"nodePlaceholder": "Select a folder",
"nodeHint": "The page will be created in this folder",
"noNodes": "No folder in this Lore.",
"createNode": "Create a folder",
"infoBox": "💡 Option 1: <strong>Create the page</strong> empty, then fill in the fields manually.<br>💡 Option 2: <strong>Create with AI</strong> to chat with an assistant that will pre-fill the fields.",
"aiTitle": "Open the AI assistant to pre-fill the fields",
"createWithAi": "Create with AI",
"createPage": "Create the page",
"wizardPrimaryAction": "Apply and create the page",
"wizardSuggestion1": "Make the description shorter",
"wizardSuggestion2": "Add a striking distinctive trait",
"wizardSuggestion3": "Give it a darker tone",
"wizardWelcomeEmpty": "Describe what you'd like to create.",
"wizardWelcome": "Great, let's create a \"{{name}}\" page! Describe it to me in a few words — context, role, notable traits — and I'll suggest values for each field.",
"errorNoReply": "The assistant hasn't replied yet. Describe your idea first.",
"errorNoValues": "Unable to extract the values. Ask the assistant to suggest them again.",
"errorApplyValues": "Page created, but the values could not be applied.",
"errorCreate": "Error while creating the page."
},
"pageEdit": {
"pageFallback": "Page",
"aiTitle": "Open the AI Assistant (chat or auto-fill)",
"aiAssistant": "AI Assistant",
"generating": "Generating…",
"folder": "Folder",
"folderHint": "Move this page to another folder",
"fields": "Fields",
"valuePlaceholder": "Value for {{field}}...",
"noLabels": "No label defined in the template for this field.",
"deleteRow": "Delete row",
"deleteRowN": "Delete row {{n}}",
"addRow": "Add a row",
"noColumns": "No column defined in the template for this table.",
"tags": "Tags",
"tagsPlaceholder": "Add a tag (Enter to confirm)...",
"tagsHint": "Free keywords to classify and find this page",
"relatedPages": "Linked pages",
"relatedPagesHint": "Click a link to open the associated page",
"privateNotes": "Private notes",
"privateNotesPlaceholder": "Personal notes (not exported to FoundryVTT)",
"privateNotesHint": "Visible only to you. Useful to prepare your sessions.",
"chatPrimaryAction": "Auto-fill all fields",
"chatSuggestion1": "Flesh out this page's story",
"chatSuggestion2": "Suggest links with other pages of the Lore",
"chatSuggestion3": "Suggest a secondary plot",
"aiUnreachable": "The AI assistant is unreachable. Check that the Brain service is running.",
"aiFailed": "AI generation failed. Try again in a moment.",
"deleteTitle": "Delete the page",
"deleteMessage": "Delete the page \"{{title}}\"?"
},
"pageView": {
"pageFallback": "Page",
"deleteTitle": "Delete the page",
"notFilled": "Not filled in",
"tags": "Tags",
"relatedPages": "Linked pages",
"privateNotes": "Private notes",
"deletedPage": "(deleted page)",
"deleteMessage": "Delete the page \"{{title}}\"?",
"deleteIrreversible": "This action is irreversible."
},
"templateCreate": {
"title": "Create a new Template",
"subtitle": "Define a custom blueprint to create consistent pages",
"nameLabel": "Template name *",
"namePlaceholder": "E.g. Inn, Artifact, Monster...",
"descriptionPlaceholder": "What is this template for?",
"defaultNodeLabel": "Default folder *",
"nodePlaceholder": "Select a folder",
"defaultNodeHint": "Pages created with this template will be placed in this folder",
"noNodes": "No folder in this Lore.",
"createNode": "Create a folder",
"firstSuffix": "first.",
"fieldsLabel": "Template fields *",
"moveUp": "Move up",
"moveDown": "Move down",
"fieldTypeTitle": "Field type",
"typeText": "Text",
"typeImage": "Image",
"typeKeyValue": "Key/value list",
"typeTable": "Table",
"layoutTitle": "Image layout",
"layoutGallery": "Grid",
"layoutHero": "Hero",
"layoutMasonry": "Masonry",
"layoutCarousel": "Carousel",
"column": "Column",
"label": "Label",
"columnN": "Column {{n}}",
"labelN": "Label {{n}}",
"tableLabelsHint": "Add the table columns (e.g. Item, Price, Description…)",
"kvLabelsHint": "Add the row labels (e.g. STR, DEX, CON…)",
"addFieldPlaceholder": "+ Add a field",
"addFieldTitle": "Add the field",
"fieldsHelp": "Text = free + usable by the AI. Image = gallery. Key/value list = label/value pairs (stats). Table = fixed columns + rows added freely (shop, inventory…).",
"createTemplate": "Create the template"
},
"templateEdit": {
"subtitle": "Template",
"defaultNodeLabel": "Default folder",
"noneOption": "-- None --",
"defaultNodeHint": "Pages created with this template will be placed in this folder by default",
"fieldsLabel": "Template fields",
"moveUp": "Move up",
"moveDown": "Move down",
"fieldTypeTitle": "Field type",
"typeText": "Text",
"typeImage": "Image",
"typeKeyValue": "Key/value list",
"typeTable": "Table",
"layoutTitle": "Image layout",
"layoutGallery": "Grid",
"layoutHero": "Hero",
"layoutMasonry": "Masonry",
"layoutCarousel": "Carousel",
"column": "Column",
"label": "Label",
"columnN": "Column {{n}}",
"labelN": "Label {{n}}",
"tableLabelsHint": "Add the table columns (e.g. Item, Price, Description…)",
"kvLabelsHint": "Add the row labels (e.g. STR, DEX, CON…)",
"addFieldPlaceholder": "+ Add a field",
"addFieldTitle": "Add the field",
"fieldsHelp": "Text = free + AI-generatable. Image = gallery. Key/value list = label/value pairs (stats). Table = fixed columns + rows added freely (shop, inventory…).",
"deleteTitle": "Delete the template",
"deleteMessage": "Delete the template \"{{name}}\"?"
}
}

View File

@@ -0,0 +1,142 @@
{
"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}} » ?"
}
}

View File

@@ -0,0 +1,106 @@
{
"sceneCreate": {
"title": "Create a new scene",
"chapterRef": "Chapter: {{name}}",
"nameLabel": "Scene name *",
"namePlaceholder": "E.g.: Arrival at the village",
"descriptionLabel": "Description",
"descriptionPlaceholder": "Describe the scene, the key events, the NPCs present...",
"iconLabel": "Icon",
"createButton": "Create scene",
"createError": "Error while creating the scene"
},
"sceneEdit": {
"defaultTitle": "Scene",
"subtitle": "Scene",
"aiAssistant": "AI Assistant",
"aiAssistantTitle": "Open the AI Assistant to discuss this scene",
"illustrationsLabel": "Illustrations",
"illustrationsHint": "NPC portraits, visual mood, evocative scenes...",
"mapsLabel": "Maps & plans",
"mapsHint": "Location plans, tactical maps, diagrams usable at the table.",
"nameLabel": "Scene title *",
"namePlaceholder": "E.g.: Arrival at the village",
"descriptionLabel": "Short description *",
"descriptionPlaceholder": "One or two sentences summarizing what happens...",
"iconLabel": "Icon",
"contextSectionTitle": "Context and mood",
"locationLabel": "Location",
"locationPlaceholder": "E.g.: The Golden Dragon Tavern",
"timingLabel": "Time",
"timingPlaceholder": "E.g.: Evening, at nightfall",
"atmosphereLabel": "Mood and atmosphere",
"atmospherePlaceholder": "Describe the general atmosphere of the scene (sounds, smells, light, emotions...)",
"narrationSectionTitle": "Narration for players",
"narrationPlaceholder": "The text you will read to the players to set the scene...",
"narrationHint": "This text can be read directly to your players.",
"gmNotesSectionTitle": "GM notes and secrets",
"gmNotesPlaceholder": "Hidden information, clues, secret elements the players must not know...",
"gmNotesHint": "These notes are private and visible only to the GM.",
"choicesSectionTitle": "Choices and consequences",
"choicesPlaceholder": "Describe the different options available to the players and their consequences...",
"branchesSectionTitle": "Narrative branches",
"branchesNoSibling": "💡 You need at least one other scene in this chapter to create branches. Create other scenes first, then come back here to connect them.",
"branchLabelLabel": "Choice label",
"branchLabelPlaceholder": "E.g.: If the players attack the guard",
"branchTargetLabel": "Destination scene *",
"branchTargetPlaceholder": "— Choose a scene —",
"branchConditionLabel": "GM condition (optional)",
"branchConditionPlaceholder": "E.g.: Persuasion check DC 15 succeeded",
"branchRemove": "Remove",
"branchRemoveTitle": "Remove this branch",
"branchAdd": "+ Add a branch",
"branchesHint": "Each branch represents a possible \"exit\" from this scene depending on the players' action. Targets are limited to scenes in the same chapter.",
"combatSectionTitle": "Combat or encounter",
"combatDifficultyLabel": "Estimated difficulty",
"combatDifficultyPlaceholder": "E.g.: Medium, 3 level 2 goblins",
"bestiaryEnemiesLabel": "Bestiary enemies",
"bestiaryEnemiesHint": "Reference sheets from your bestiary — click a chip to open the sheet.",
"enemiesLabel": "Enemies and creatures (free text)",
"enemiesPlaceholder": "List of enemies present in this scene...",
"loreSectionTitle": "Linked Lore pages",
"loreHint": "Pin the location, NPCs or creatures of this scene here. Click a chip to open the page.",
"noLoreHint": "💡 This campaign is not associated with any universe. Associate it with a Lore on the campaign screen to be able to pin Lore pages to this scene.",
"dungeonSectionTitle": "Explorable location (dungeon, crypt…)",
"dungeonHint": "If this scene represents a location to explore room by room, add them here. The scene then switches to \"dungeon\" mode in the display.",
"chatWelcome": "I can see this scene. Ask me to enrich its mood, its narration or its choices.",
"chatSuggestion1": "Suggest an immersive sensory atmosphere for this scene",
"chatSuggestion2": "Suggest an opening narration to read to the players",
"chatSuggestion3": "Come up with 2 choices with striking consequences",
"deleteTitle": "Delete scene",
"deleteMessage": "Delete the scene \"{{name}}\"?",
"deleteIrreversible": "This action is irreversible.",
"saveError": "Error while saving",
"deleteError": "Error while deleting"
},
"sceneView": {
"subtitle": "Scene",
"deleteTitleAttr": "Delete scene",
"mapsSectionTitle": "Maps & plans",
"descriptionSectionTitle": "Description",
"empty": "Not provided",
"locationSectionTitle": "Location",
"timingSectionTitle": "Time",
"atmosphereSectionTitle": "Mood and atmosphere",
"narrationSectionTitle": "Narration for players",
"choicesSectionTitle": "Choices and consequences",
"combatDifficultySectionTitle": "Estimated difficulty",
"enemiesSectionTitle": "Enemies and creatures",
"gmNotesSectionTitle": "GM notes and secrets",
"loreSectionTitle": "Linked Lore pages",
"deletedPage": "(page deleted)",
"roomsSectionTitle": "Rooms of the location",
"roomFloor": "Floor {{floor}}",
"roomEnemies": "⚔️ Enemies",
"roomLoot": "💰 Loot",
"roomTraps": "⚠️ Traps",
"roomGmNotes": "🔒 GM notes",
"roomExits": "→ Exits",
"roomExitCondition": "(if: {{condition}})",
"deletedRoom": "(room deleted)",
"deleteTitle": "Delete scene",
"deleteMessage": "Delete the scene \"{{name}}\"?",
"deleteIrreversible": "This action is irreversible.",
"deleteError": "Error while deleting the scene"
}
}

View File

@@ -0,0 +1,106 @@
{
"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"
}
}

View File

@@ -0,0 +1,8 @@
{
"services": {
"importFailed": "Import failed.",
"importInterrupted": "The import was interrupted before completion (connection dropped or timed out). Please try again.",
"unknownServerError": "Unknown server error.",
"networkError": "Network error"
}
}

View File

@@ -0,0 +1,8 @@
{
"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"
}
}

View File

@@ -0,0 +1,93 @@
{
"sessionDetail": {
"backToCampaign": "Back to campaign",
"renameTitle": "Rename session",
"statusActive": "In progress",
"statusEnded": "Ended",
"startedOn": "Started on {{date}}",
"endedOn": "Ended on {{date}}",
"endSession": "End session",
"ctrlEnterHint": "Ctrl + Enter to add",
"addEntryPlaceholder": "Add a {{type}}…",
"journalTitle": "Session log",
"noEntries": "No entries yet.",
"noEntriesHint": "Type a note, an event or a roll above to start the log.",
"entryType": {
"NOTE": "Note",
"EVENT": "Event",
"DICE_ROLL": "Dice roll",
"PLAYER_ACTION": "Player action"
},
"endConfirm": {
"title": "End session?",
"message": "Mark session \"{{name}}\" as ended?",
"detail": "You can still review its content afterwards.",
"confirmLabel": "End"
},
"deleteConfirm": {
"title": "Delete session?",
"message": "Permanently delete session \"{{name}}\"?",
"noEntries": "No log entries for this session.",
"entriesOne": "1 log entry will also be deleted.",
"entriesMany": "{{n}} log entries will also be deleted.",
"irreversible": "This action is irreversible."
},
"deleteEntryConfirm": {
"title": "Delete this entry?",
"message": "This log entry will be permanently deleted."
}
},
"sessionReferencePanel": {
"tabAi": "AI",
"tabDice": "Dice",
"tabTables": "Tables",
"tabObjects": "Items",
"tabCharacters": "PCs/NPCs",
"tabScenes": "Scenes",
"playerCharacters": "Player characters",
"nonPlayerCharacters": "Non-player characters",
"emptyCharacters": "No characters in this campaign.",
"emptyScenes": "No narrative arc yet. Build your campaign scenario to find it here."
},
"sessionDicePanel": {
"count": "Count",
"modifier": "Modifier",
"roll": "Roll",
"lastRolls": "Recent rolls",
"clearHistory": "Clear local history",
"addToJournal": "Add to log",
"sessionEnded": "Session ended",
"placeholder": "Pick a die and roll."
},
"sessionAiChatPanel": {
"welcome": "Ask the AI a question during the game.",
"welcomeSub": "It knows your world, your campaign, the system rules and everything noted in the log.",
"saveReplyTitle": "Add this reply to the log",
"sessionEnded": "Session ended",
"toJournal": "To log",
"replying": "The AI is replying…",
"inputPlaceholder": "Ask for an idea, a twist, a description…",
"clearConversation": "Clear conversation",
"send": "Send",
"stop": "Stop",
"unknownError": "Unknown error",
"aiError": "AI error: {{message}}",
"interrupted": "[interrupted]"
},
"sessionRandomTablesPanel": {
"empty": "No random table in this campaign. Create one from the sidebar.",
"tables": "Tables",
"roll": "Roll",
"noEntry": "no entry",
"journal": "Log",
"improvising": "…",
"aiImprovise": "AI improvise",
"noResult": "no result"
},
"sessionItemCatalogsPanel": {
"empty": "No item catalog in this campaign.",
"catalogs": "Catalogs",
"noteTitle": "Record in log (e.g. purchase)",
"journal": "Log"
}
}

View File

@@ -0,0 +1,93 @@
{
"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": "LIA 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"
}
}

View File

@@ -0,0 +1,51 @@
{
"sidebar": {
"subtitle": "THE DIGITAL CODEX",
"tabLore": "Lore",
"tabCampaign": "Campaign",
"toolsLabel": "TOOLS",
"globalSearch": "Global search",
"gameSystems": "RPG systems",
"vttExport": "VTT export",
"settings": "Settings",
"updateAvailable": "Update available",
"updateBadge": "NEW",
"version": "Version {{version}}"
},
"secondarySidebar": {
"backToCampaignHome": "Back to campaign home",
"resizeHandle": "Drag to resize"
},
"breadcrumb": {
"ariaLabel": "Breadcrumb"
},
"globalSearch": {
"placeholder": "Search in LoreMind...",
"noResults": "No results",
"minChars": "Type at least 2 characters",
"hintNavigate": "navigate",
"hintSelect": "select",
"hintClose": "close",
"countSingular": "{{count}} result",
"countPlural": "{{count}} results",
"enemyLevel": "Lvl. {{level}}",
"tags": {
"page": "Page",
"node": "Folder",
"template": "Template",
"lore": "Lore",
"campaign": "Campaign",
"npc": "NPC",
"character": "PC",
"randomTable": "Random table",
"itemCatalog": "Item catalog",
"enemy": "Enemy"
}
},
"updateBanner": {
"message": "A new version of LoreMind is available (<strong>{{version}}</strong>). Reload to enjoy the latest improvements.",
"reload": "Reload",
"dismissTitle": "Dismiss (will reappear on next startup)",
"dismissAria": "Dismiss"
}
}

View File

@@ -0,0 +1,51 @@
{
"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"
}
}

View File

@@ -0,0 +1,57 @@
{
"confirmDialog": {
"defaultTitle": "Confirmation"
},
"aiChatDrawer": {
"title": "AI Assistant",
"resizeAria": "Resize the panel",
"resizeTitle": "Drag to resize",
"conversations": "Conversations",
"newConversation": "New conversation",
"noConversation": "No conversation",
"hideList": "Hide list",
"showList": "Show list",
"shrink": "Shrink",
"shrinkAria": "Shrink the panel",
"expand": "Expand",
"expandAria": "Expand the panel",
"gaugeTitle": "System: {{system}} · History: {{history}} · Current: {{current}} tokens",
"gaugeTitleMax": "System: {{system}} · History: {{history}} · Current: {{current}} / {{max}} tokens",
"gaugeLabel": "Context: {{total}} tokens",
"gaugeLabelMax": "Context: {{total}} / {{max}} tokens",
"quickSuggestions": "Quick suggestions:",
"inputPlaceholder": "Ask a question...",
"send": "Send",
"welcome": "Hello! I can help you develop this page. What would you like to create?",
"loadConversationError": "Unable to load the conversation.",
"deleteConversationTitle": "Delete conversation",
"deleteConversationMessage": "Delete the conversation \"{{title}}\"?",
"missingContextError": "Missing context to create a conversation.",
"createConversationError": "Unable to create the conversation.",
"unknownError": "Unknown error."
},
"imageGallery": {
"empty": "No illustration",
"illustrationAlt": "Illustration",
"mainIllustrationAlt": "Main illustration",
"mapAlt": "Map",
"removeImage": "Remove this image",
"removeMap": "Remove this map",
"lightboxAria": "Full-screen image",
"lightboxAlt": "Enlarged image"
},
"imageUploader": {
"addImage": "Add an image",
"uploading": "Uploading",
"uploadingHint": "Uploading...",
"dropTitle": "Drop an image here",
"dropHint": "or click to choose a file (JPEG, PNG, WebP, GIF, max 10 MB)",
"unsupportedFormat": "Unsupported format (JPEG, PNG, WebP, GIF only).",
"tooLarge": "File too large (max {{max}} MB).",
"serverRejected": "File rejected by the server (too large).",
"uploadFailed": "Upload failed. Check that the backend and MinIO are running."
},
"singleImagePicker": {
"removeImage": "Remove the image"
}
}

View File

@@ -0,0 +1,57 @@
{
"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"
}
}

View File

@@ -0,0 +1,26 @@
{
"chipsInput": {
"placeholder": "Add...",
"removeTag": "Remove"
},
"dynamicFieldsForm": {
"textPlaceholder": "Enter {{name}}…",
"noLabels": "No labels defined in the template for this field.",
"noFields": "No fields defined in this system's template. Edit the GameSystem to add fields."
},
"loreLinkPicker": {
"searchPlaceholder": "Search for a page to link...",
"openInNewTab": "Open in a new tab",
"removeLink": "Remove link",
"noMatch": "No matching page"
},
"enemyLinkPicker": {
"searchPlaceholder": "Search for an enemy from the bestiary...",
"openInNewTab": "Open the sheet in a new tab",
"removeLink": "Remove link",
"noMatch": "No matching enemy"
},
"personaView": {
"empty": "This sheet is still empty."
}
}

View File

@@ -0,0 +1,26 @@
{
"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."
}
}

View File

@@ -0,0 +1,75 @@
{
"playthroughFlagsManager": {
"empty": "No fact referenced. Add a \"When a fact is true\" condition on at least one quest for it to appear here.",
"true": "true",
"false": "false"
},
"prerequisiteEditor": {
"empty": "No condition — the quest is immediately available.",
"questCompletedLabel": "Quest completed:",
"noOtherQuest": "(no other quest)",
"sessionReachedLabel": "From session:",
"flagSetLabel": "When the fact is true:",
"flagNamePlaceholder": "fact_name",
"removePrerequisite": "Remove this prerequisite",
"addCondition": "Add a condition",
"menuAfterQuest": "After another quest",
"menuFromSession": "From a session",
"menuWhenFlag": "When a fact is true"
},
"questStatusBadge": {
"locked": "Locked",
"inProgress": "In progress",
"completed": "Completed",
"available": "Available"
},
"roomsEditor": {
"empty": "No room. The scene behaves like a classic narrative beat. Add a first room to turn it into an explorable location (dungeon, crypt…).",
"roomNamePlaceholder": "Room name",
"floorPlaceholder": "Fl.",
"floorTitle": "Floor (0 = ground floor)",
"moveUp": "Move up",
"moveDown": "Move down",
"removeRoom": "Delete room",
"descriptionLabel": "Description (read/summarized to players)",
"descriptionPlaceholder": "Atmosphere, what the PCs see when entering…",
"bestiaryLabel": "Bestiary enemies",
"enemiesLabel": "Enemies / creatures / boss (free text)",
"enemiesPlaceholder": "2 goblins, 1 ogre boss (HP 60, AC 14)…",
"lootLabel": "Loot / treasure",
"lootPlaceholder": "50 gp, healing potion, silver key…",
"trapsLabel": "Traps / hazards",
"trapsPlaceholder": "Trapdoor (DC 15 Perception), poisoned darts…",
"gmNotesLabel": "GM notes (private)",
"gmNotesPlaceholder": "The boss knows the PCs by name, a clue…",
"exitsLabel": "Exits / doors to other rooms",
"branchLabelPlaceholder": "North door",
"noOtherRoom": "(no other room)",
"branchConditionPlaceholder": "Condition (optional)",
"addExit": "Add an exit",
"addRoom": "Add a room",
"defaultRoomName": "Room {{n}}",
"defaultBranchLabel": "Door"
},
"templateFieldsEditor": {
"moveUp": "Move up",
"moveDown": "Move down",
"fieldNamePlaceholder": "Field name (e.g. Background, HP...)",
"removeField": "Delete this field",
"labelsHeader": "Labels (fixed keys for all sheets)",
"labelPlaceholder": "E.g. STR, DEX...",
"removeLabel": "Remove this label",
"addLabel": "Add a label",
"empty": "No field yet — add some with the buttons below.",
"addPrefix": "Add:",
"typeText": "Text",
"typeNumber": "Number",
"typeImage": "Image(s)",
"typeKeyValue": "Key/value list",
"layoutGallery": "Gallery",
"layoutHero": "Banner",
"layoutMasonry": "Mosaic",
"layoutCarousel": "Carousel",
"defaultLabel": "Template fields"
}
}

View File

@@ -0,0 +1,75 @@
{
"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"
}
}

View File

@@ -0,0 +1,64 @@
{
"randomTableEdit": {
"titleEdit": "Edit table",
"titleNew": "New random table",
"nameLabel": "Name *",
"namePlaceholder": "E.g. Forest encounters",
"descPlaceholder": "What is this table for?",
"formulaLabel": "Dice formula *",
"formulaValid": "Valid formula",
"formulaExpected": "Expected format: NdM (e.g. 1d20, 2d6, d100)",
"aiTitle": "Generate with AI",
"aiHint": "Describe the table; the AI proposes the entries (review them before saving). Contextualized with your campaign.",
"aiPromptPlaceholder": "E.g. random encounters in a haunted forest, dark tone",
"generateWith": "Generate ({{formula}})",
"entriesTitle": "Entries",
"autoRanges": "Auto-ranges",
"autoRangesTitle": "Distribute ranges across the formula",
"colMin": "Min",
"colMax": "Max",
"colResult": "Result",
"colDetail": "Detail",
"detailPlaceholder": "Detail (optional)",
"emptyHint": "No entries — click \"Add\".",
"aiErrorPrompt": "Describe the table to generate.",
"aiErrorFormula": "Choose a valid dice formula first.",
"aiErrorGenerate": "AI generation failed. Try again or rephrase.",
"errorNameRequired": "Name is required.",
"errorFormulaInvalid": "Invalid dice formula (e.g. 1d20, 2d6, d100).",
"errorSaveFailed": "Save failed."
},
"randomTableView": {
"die": "Die:",
"roll": "Roll {{formula}}",
"noMatch": "No entry for this result",
"empty": "No entries — edit the table to add some.",
"colRoll": "Roll",
"colResult": "Result"
},
"playthroughDetail": {
"startSession": "Start a session",
"resumeSession": "Resume current session",
"facts": "Playthrough facts",
"charactersTitle": "Player characters",
"newCharacter": "New PC",
"noCharacters": "No PCs for this playthrough.",
"sessionsTitle": "Sessions",
"noSessions": "No sessions yet. Start the first one!",
"statusActive": "Ongoing",
"statusEnded": "Ended",
"impactSessions": "{{n}} session(s)",
"impactCharacters": "{{n}} PC(s)",
"impactFlags": "{{n}} fact(s)",
"impactProgressions": "{{n}} quest progression(s)",
"deleteCascade": "This action will also delete: {{parts}}.",
"irreversible": "This action is irreversible.",
"deleteTitle": "Delete playthrough",
"deleteMessage": "Delete \"{{name}}\"?"
},
"playthroughFlagsPage": {
"title": "Facts — {{name}}",
"pageTitle": "{{name}} — Facts",
"subtitle": "Boolean facts specific to this playthrough. Toggle them in play to unlock the quests that depend on them."
}
}

View File

@@ -0,0 +1,64 @@
{
"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."
}
}