@loicngr/kobo 2.1.1 → 2.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -0
- package/dist/server/services/agent/engines/claude-code/engine.js +29 -9
- package/dist/server/services/agent/engines/codex/engine.js +1 -0
- package/dist/server/services/agent/engines/codex/options-builder.js +6 -1
- package/dist/server/services/agent/orchestrator.js +5 -1
- package/dist/server/services/review-service.js +6 -2
- package/package.json +10 -10
- package/src/client/dist/pwa/assets/ActivityFeed-CO5rOaa5.js +8 -0
- package/src/client/dist/pwa/assets/{ActivityFeed-BYR5x7aa.css → ActivityFeed-DCmiJP-z.css} +1 -1
- package/src/client/dist/pwa/assets/{ChangelogPage-OoOnn4q9.js → ChangelogPage-DNRcPRtW.js} +1 -1
- package/src/client/dist/pwa/assets/{ClosePopup-CWjIRHxu.js → ClosePopup-BikuzYle.js} +1 -1
- package/src/client/dist/pwa/assets/{ComparisonPanel-BYpe6Nch.js → ComparisonPanel-DZoDqgJI.js} +1 -1
- package/src/client/dist/pwa/assets/{CreatePage-COQwHyqL.js → CreatePage-wNH35uTG.js} +1 -1
- package/src/client/dist/pwa/assets/{DashboardPage-CZ2036MC.js → DashboardPage-DUyy4SzS.js} +1 -1
- package/src/client/dist/pwa/assets/{DiffViewer-CXBmMV9R.js → DiffViewer-CZ5QwXqi.js} +3 -3
- package/src/client/dist/pwa/assets/{DocumentsPanel-mLGU5aTb.js → DocumentsPanel-sBatgKA-.js} +1 -1
- package/src/client/dist/pwa/assets/{DrawerToggleButton-C39pfWBD.js → DrawerToggleButton-Dfvkaro0.js} +1 -1
- package/src/client/dist/pwa/assets/{GitPanel-BQk7kJO-.js → GitPanel-B8e1olfm.js} +3 -3
- package/src/client/dist/pwa/assets/{HealthPage-CnJWXfa8.js → HealthPage-BwXYpczh.js} +1 -1
- package/src/client/dist/pwa/assets/MainLayout-DFXIS_wv.js +2 -0
- package/src/client/dist/pwa/assets/{MainLayout-Cc4XzCAy.css → MainLayout-gHENJEFQ.css} +1 -1
- package/src/client/dist/pwa/assets/{QBadge-FWC1zDCq.js → QBadge-CQF1smL-.js} +1 -1
- package/src/client/dist/pwa/assets/{QBanner-CcRI_QIy.js → QBanner-bdDA-A5g.js} +1 -1
- package/src/client/dist/pwa/assets/{QBtn-DEdx_Y1V.js → QBtn-CcQQrYA_.js} +1 -1
- package/src/client/dist/pwa/assets/{QBtnDropdown-DGLLlBf3.js → QBtnDropdown-C-1EhO9J.js} +1 -1
- package/src/client/dist/pwa/assets/{QBtnGroup-CAoD6G0Q.js → QBtnGroup-wd5lKRXu.js} +1 -1
- package/src/client/dist/pwa/assets/{QBtnToggle-C_hQ2UCQ.js → QBtnToggle-BnC8rTql.js} +1 -1
- package/src/client/dist/pwa/assets/{QChip-DCPUhqXX.js → QChip-D75nKi-L.js} +1 -1
- package/src/client/dist/pwa/assets/{QExpansionItem-CQ2LzM8P.js → QExpansionItem-RpMPvfxX.js} +1 -1
- package/src/client/dist/pwa/assets/{QItemSection-BhqphaH6.js → QItemSection-Bt9H35JJ.js} +1 -1
- package/src/client/dist/pwa/assets/{QList-CHm4JNP0.js → QList-D5msNbSZ.js} +1 -1
- package/src/client/dist/pwa/assets/{QMarkupTable-CNpiA9oq.js → QMarkupTable-D3REW6RC.js} +1 -1
- package/src/client/dist/pwa/assets/{QPage-BXBw2Alx.js → QPage-HAaeQ-cv.js} +1 -1
- package/src/client/dist/pwa/assets/{QSelect-DoTWgQAO.js → QSelect-Dpru_T81.js} +1 -1
- package/src/client/dist/pwa/assets/{QSpinnerDots-BkFiCsH3.js → QSpinnerDots-DDsPDUH9.js} +1 -1
- package/src/client/dist/pwa/assets/{QTooltip-DKvUeiR_.js → QTooltip-C31vXtse.js} +1 -1
- package/src/client/dist/pwa/assets/{SchedulePanel-DIMzNIO3.js → SchedulePanel-D6LTiRFg.js} +1 -1
- package/src/client/dist/pwa/assets/{SearchPage-COWnMxRZ.js → SearchPage-Dj487BdP.js} +1 -1
- package/src/client/dist/pwa/assets/{SettingsPage-B9cLhFnO.js → SettingsPage-CJmgFiAa.js} +1 -1
- package/src/client/dist/pwa/assets/{SplitWorkspacePage-BJKssJyI.js → SplitWorkspacePage-BGSDgGIO.js} +1 -1
- package/src/client/dist/pwa/assets/{TerminalPanel-C_HNpN1X.js → TerminalPanel-B9LDe7uG.js} +1 -1
- package/src/client/dist/pwa/assets/{TouchPan-CCllyaAF.js → TouchPan-DJqqxDBF.js} +1 -1
- package/src/client/dist/pwa/assets/{TourReplayButton-Cp2UnxWa.js → TourReplayButton-Dtv_UDaY.js} +1 -1
- package/src/client/dist/pwa/assets/{WorkspaceAttentionLabels-B-SuQuS_.js → WorkspaceAttentionLabels-VlJCIkwU.js} +1 -1
- package/src/client/dist/pwa/assets/{WorkspacePage-6lN4iF5W.js → WorkspacePage-B_SlX8YB.js} +3 -3
- package/src/client/dist/pwa/assets/{browser-uy3hmwKo.js → browser-B15GGwtW.js} +1 -1
- package/src/client/dist/pwa/assets/{build-path-tree-DZrp6Aji.js → build-path-tree-CU6uXunR.js} +1 -1
- package/src/client/dist/pwa/assets/{codicon-Brq4_Ui5.ttf → codicon-DF1abBS2.ttf} +0 -0
- package/src/client/dist/pwa/assets/{custom-sounds-Du8ReMlU.js → custom-sounds-CDJsgChY.js} +1 -1
- package/src/client/dist/pwa/assets/{de-CTE3Xb7Z.js → de-B_Y4EArT.js} +2 -2
- package/src/client/dist/pwa/assets/{documents-BtNrB6d0.js → documents-Cf6nmu8Z.js} +1 -1
- package/src/client/dist/pwa/assets/editor-CmVjQp1O.css +1 -0
- package/src/client/dist/pwa/assets/editor.api-DhaLhNl-.js +420 -0
- package/src/client/dist/pwa/assets/editor.worker-BLJF_oQx.js +33 -0
- package/src/client/dist/pwa/assets/{efforts-ChUC4xtk.js → efforts-DoYZi0AZ.js} +2 -2
- package/src/client/dist/pwa/assets/{engineFeatures-D-0NPZBE.js → engineFeatures-C9XiCfvv.js} +1 -1
- package/src/client/dist/pwa/assets/{es-CZxg1xjh.js → es-DtsTTShP.js} +2 -2
- package/src/client/dist/pwa/assets/{expand-template-ByoC_kxX.js → expand-template-LDLM-6iN.js} +1 -1
- package/src/client/dist/pwa/assets/format-2JisC3s1.js +489 -0
- package/src/client/dist/pwa/assets/format-DoyK4IAn.css +1 -0
- package/src/client/dist/pwa/assets/{formatters-BtG6lb4d.js → formatters-ZVNs2VOl.js} +1 -1
- package/src/client/dist/pwa/assets/{fr-C7HCclxj.js → fr-C82MIVrA.js} +2 -2
- package/src/client/dist/pwa/assets/{freemarker2-CDYXi2tK.js → freemarker2-PYrDqU04.js} +1 -1
- package/src/client/dist/pwa/assets/{handlebars-AVkJuN-_.js → handlebars-BuiY0fFf.js} +1 -1
- package/src/client/dist/pwa/assets/{html-CpvEZlmO.js → html-Du3cjdug.js} +1 -1
- package/src/client/dist/pwa/assets/i18n-BumeGGx_.js +1 -0
- package/src/client/dist/pwa/assets/index-DolbyIM4.js +20 -0
- package/src/client/dist/pwa/assets/index-VMFLfvp2.css +1 -0
- package/src/client/dist/pwa/assets/{it-DoOWwqZz.js → it-BJNuTcj2.js} +2 -2
- package/src/client/dist/pwa/assets/{javascript-BYnnBLH9.js → javascript-Bb48hPli.js} +1 -1
- package/src/client/dist/pwa/assets/{liquid-CzqlB3Um.js → liquid-Be77iQe3.js} +1 -1
- package/src/client/dist/pwa/assets/{mdx-hrYFnJVZ.js → mdx-CfohNJja.js} +1 -1
- package/src/client/dist/pwa/assets/monaco-contributions-CyM4wsIg.js +53 -0
- package/src/client/dist/pwa/assets/monaco-contributions-DvnCTJI2.css +1 -0
- package/src/client/dist/pwa/assets/{monaco.contribution-Dl22KqTL.js → monaco.contribution-BcIfN6Mi.js} +2 -2
- package/src/client/dist/pwa/assets/{network-auth-Dq0I5kjv.js → network-auth-B1xAaHmx.js} +1 -1
- package/src/client/dist/pwa/assets/{notify-theme-vV3Rm4_v.js → notify-theme-DvvaSyg1.js} +1 -1
- package/src/client/dist/pwa/assets/{pending-diff-open-BJYqBOUG.js → pending-diff-open-B6N0vI5n.js} +1 -1
- package/src/client/dist/pwa/assets/{project-color-W5mMgIKK.js → project-color-Be0t12-n.js} +1 -1
- package/src/client/dist/pwa/assets/{python-DafgCozG.js → python-BNemmtx8.js} +1 -1
- package/src/client/dist/pwa/assets/{razor-CWYrTLCm.js → razor-3NM8iFVf.js} +1 -1
- package/src/client/dist/pwa/assets/render-chat-markdown-BWJNIDv3.js +69 -0
- package/src/client/dist/pwa/assets/{typescript-DLSIuW9u.js → typescript-DwyZ4CF7.js} +1 -1
- package/src/client/dist/pwa/assets/{use-checkbox-CnvHBhSK.js → use-checkbox-2xzX4yYj.js} +1 -1
- package/src/client/dist/pwa/assets/{use-id-wXd4c8FA.js → use-id-vOr8PRTG.js} +1 -1
- package/src/client/dist/pwa/assets/{use-is-mobile-DpKI3XMy.js → use-is-mobile-CJfSpTHx.js} +1 -1
- package/src/client/dist/pwa/assets/{use-tours-CDdnvIaG.js → use-tours-CjASQcG5.js} +1 -1
- package/src/client/dist/pwa/assets/{workspace-templates-C88VmFdQ.js → workspace-templates-BxYxJt3S.js} +1 -1
- package/src/client/dist/pwa/assets/{xml-BAmdYarn.js → xml-B1UujXdS.js} +1 -1
- package/src/client/dist/pwa/assets/{yaml-RQqNMXWh.js → yaml-mHN8kNgU.js} +1 -1
- package/src/client/dist/pwa/index.html +5 -5
- package/src/client/dist/pwa/sw.js +1 -1
- package/src/client/dist/pwa/assets/ActivityFeed-DeJ0V6CW.js +0 -8
- package/src/client/dist/pwa/assets/MainLayout-D3zfT61Y.js +0 -2
- package/src/client/dist/pwa/assets/editor-BJU3Xb3h.css +0 -1
- package/src/client/dist/pwa/assets/editor.api-P-eJRcVK.js +0 -413
- package/src/client/dist/pwa/assets/editor.worker-iO5iN0DB.js +0 -33
- package/src/client/dist/pwa/assets/format-CX6Cv1cD.css +0 -1
- package/src/client/dist/pwa/assets/format-CeidAPFn.js +0 -435
- package/src/client/dist/pwa/assets/i18n-KVkTJG-4.js +0 -1
- package/src/client/dist/pwa/assets/index-0wtBh1Xt.css +0 -1
- package/src/client/dist/pwa/assets/index-DsaWUT_Z.js +0 -20
- package/src/client/dist/pwa/assets/monaco-contributions-Cb0afGfW.css +0 -1
- package/src/client/dist/pwa/assets/monaco-contributions-D2YXqNaH.js +0 -51
- package/src/client/dist/pwa/assets/render-chat-markdown-CE5RIL0s.js +0 -69
|
@@ -8,10 +8,10 @@ KOBO_WORKSPACE_ID — id Kōbō du workspace (stable après renommage)
|
|
|
8
8
|
KOBO_WORKSPACE_NAME — nom affiché du workspace
|
|
9
9
|
KOBO_FORGE — forge résolue : github / gitlab / none
|
|
10
10
|
KOBO_PR_NUMBER — numéro de PR/MR sur la forge résolue (vide si aucune ouverte)`,"settings.changeSourceBranchScript.placeholder":`#!/usr/bin/env bash
|
|
11
|
-
# ton script — utilise $KOBO_NEW_BASE / $KOBO_OLD_BASE / $KOBO_WORKING_BRANCH …`,"settings.changeSourceBranchScript.resetDefault":`Réinitialiser au défaut Kōbō`,"settings.changeSourceBranchScript.replaceConfirmTitle":`Réinitialiser le script ?`,"settings.changeSourceBranchScript.replaceConfirm":`Tes modifications seront remplacées par le script Kōbō par défaut. Continuer ?`,"settings.cleanupScriptHint":`Script shell exécuté dans le worktree après chaque fin de session de l'agent. En mode auto-loop, il ne s'exécute qu'une fois toutes les tâches terminées. Laisser vide pour désactiver.`,"settings.cleanupScriptPlaceholder":`ex. supprimer des fichiers temporaires, arrêter des conteneurs…`,"settings.cleanupScriptMode":`Quand l'exécuter`,"settings.cleanupScriptMode.idle":`À chaque fin de session — même s'il reste des tâches`,"settings.cleanupScriptMode.noTasks":`Uniquement quand plus aucune tâche Kōbō`,"settings.cleanupScriptOnlyOnChanges":`Lancer uniquement si des fichiers ont été modifiés, ajoutés ou supprimés`,"settings.cleanupScriptMode.inherit":`Hériter du réglage global`,"settings.taskPromptTemplate":`Prompt de tâche`,"settings.taskPromptTemplatePlaceholder":`Prompt inséré automatiquement dans la description de tâche…`,"settings.taskPromptTemplateHint":`Injecté automatiquement dans la description de tâche sur la page de création quand ce projet est sélectionné. S'il n'est pas modifié, il est remplacé en changeant de projet ; dès que vous l'éditez, votre texte est conservé.`,"settings.setupScriptPlaceholder":`npm install`,"settings.setupScriptHint":`Exécuté avec bash dans le worktree après sa création, avant le démarrage de l'agent. Pas besoin de shebang. En cas d'échec, le workspace passe en erreur. Timeout : 5 minutes.`,"settings.e2e.title":`Tests E2E`,"settings.e2e.framework":`Framework`,"settings.e2e.frameworkNone":`Aucun`,"settings.e2e.frameworkOther":`Autre`,"settings.e2e.skill":`Skill (optionnel)`,"settings.e2e.skillPlaceholder":`ex : cypress-tester`,"settings.e2e.prompt":`Guidance personnalisée (optionnel)`,"settings.e2e.promptPlaceholder":`ex : utiliser le page-object, cibler les data-testid`,"settings.e2e.helpText":`Quand configuré, l'agent de grooming auto-loop insère des sous-tâches E2E pour les fonctionnalités UI.`,"settings.finalization.title":`Finalisation de l'auto-loop`,"settings.finalization.helpText":`Optionnel : un prompt que l'agent exécute lors de la toute dernière itération de l'auto-loop. Typiquement utilisé pour les contrôles qualité finaux (lint, typecheck, tests). L'étape de grooming créera une tâche préfixée [FINAL] qui utilisera ce prompt.`,"settings.finalization.prompt":`Prompt de finalisation`,"settings.finalization.promptPlaceholder":`ex. Lance npm run lint et npm test, puis marque cette tâche comme terminée.`,"settings.editorCommand":`Commande éditeur`,"settings.editorCommandPlaceholder":`code, phpstorm, subl, vim...`,"settings.editorCommandHint":`Commande utilisée pour ouvrir le worktree dans votre éditeur. Le chemin du worktree est passé en argument.`,"settings.fileManagerCommand":`Commande explorateur de fichiers`,"settings.fileManagerCommandPlaceholder":`xdg-open, open, nautilus, dolphin, explorer...`,"settings.fileManagerCommandHint":`Commande utilisée pour ouvrir le worktree dans votre explorateur de fichiers. Le chemin du worktree est passé en argument. Laissez vide pour masquer le bouton.`,"settings.terminalCommand":`Commande du terminal`,"settings.terminalCommandHint":`Commande pour lancer le terminal dans le worktree. Placeholder {path} optionnel pour le répertoire.`,"settings.terminalCommandPlaceholder":`kitty · alacritty · gnome-terminal --working-directory={path}`,"settings.mcpSelection":`Sélection MCP Claude`,"settings.mcpAutoSelect":`Auto (premier MCP actif correspondant)`,"settings.notionMcp":`Clé MCP Notion`,"settings.sentryMcp":`Clé MCP Sentry`,"settings.mcpSelectionHint":`Les entrées actives sont lues depuis ~/.claude.json. Laisser Auto pour utiliser le comportement par défaut.`,"settings.configuredProjects":`Projets configurés`,"settings.noProjects":`Aucun projet configuré`,"settings.addProject":`Ajouter un projet`,"settings.copyFrom":`Copier les settings depuis`,"settings.copyFromPlaceholder":`(aucun — partir des valeurs par défaut)`,"settings.copyFromHint":`Copie tous les settings sauf le path, le nom affiché et la branche source.`,"settings.copyFromConfirmTitle":`Écraser les valeurs actuelles ?`,"settings.copyFromConfirm":`Cela écrasera les valeurs du formulaire avec les settings de « {project} ». Continuer ?`,"settings.newProject":`Nouveau projet`,"settings.editProject":`Modifier le projet`,"help.title":`Aide`,"help.tours":`Visites guidées`,"help.steps":`{n} étape | {n} étapes`,"help.markAllSeen":`Marquer toutes comme vues`,"help.markAllSeenHint":`Valide les visites actuelles sans les lancer.`,"help.resetAll":`Réinitialiser toutes les visites`,"help.resetAllHint":`Relance l'accueil ; chaque écran rejouera sa visite à la prochaine ouverture.`,"help.status.unseen":`non vue`,"help.status.partial":`en partie`,"help.status.seen":`vue`,"help.replayThis":`Rejouer la visite de cet écran`,"tours.next":`Suivant`,"tours.prev":`Précédent`,"tours.done":`Terminé`,"tours.exitConfirm":`Quitter la visite guidée ? Elle ne se relancera plus automatiquement ; vous pourrez la rejouer à tout moment depuis le menu Aide.`,"tours.home.title":`S'orienter`,"tours.home.list.title":`Workspaces`,"tours.home.list.description":`Chaque mission vit ici avec son statut. Les badges signalent une CI en échec, une review demandant des changements ou une PR prête à merger.`,"tours.home.create.title":`Créer un workspace`,"tours.home.create.description":`Un workspace, c'est un worktree Git, une branche et une session d'agent pour une tâche.`,"tours.home.search.title":`Recherche`,"tours.home.search.description":`Filtrez la liste par nom. L'icône de recherche en haut ouvre la recherche plein texte dans les conversations des agents.`,"tours.home.dashboard.title":`Tableau de bord`,"tours.home.dashboard.description":`Un tableau pour tous les workspaces actifs : statut, attention, PR, diff, activité, plus la fiabilité des moteurs.`,"tours.home.health.title":`Santé et changelog`,"tours.home.health.description":`Vérifiez la base de données, les runtimes et les agents actifs. Le bouton voisin liste ce qui a changé à chaque version.`,"tours.home.settings.title":`Paramètres`,"tours.home.settings.description":`Moteurs, intégrations, automatisation, worktrees et projets. Créez maintenant votre premier workspace.`,"tours.create.title":`Créer un workspace`,"tours.create.project.title":`Projet et branche`,"tours.create.project.description":`Choisissez le projet et la branche de départ du worktree.`,"tours.create.mission.title":`Mission`,"tours.create.mission.description":`Décrivez la tâche, ou importez-la depuis une page Notion ou une issue Sentry.`,"tours.create.template.title":`Templates`,"tours.create.template.description":`Appliquez un preset enregistré, ou enregistrez ce formulaire comme preset. « Dupliquer » sur une carte de workspace ouvre ce formulaire prérempli.`,"tours.create.engine.title":`Moteur et modèle`,"tours.create.engine.description":`Claude Code ou Codex, le modèle, l'effort de raisonnement et ce que l'agent peut faire sans demander.`,"tours.create.brainstorm.title":`Brainstorm sur un autre modèle`,"tours.create.brainstorm.description":`Lancez la première session de brainstorming sur un autre modèle, puis revenez au modèle principal pour les itérations.`,"tours.create.autoloop.title":`Auto-loop`,"tours.create.autoloop.description":`Laissez l'agent enchaîner les sessions jusqu'à ce que toutes les tâches soient faites, ou qu'il stagne.`,"tours.create.comparison.title":`Comparer deux moteurs`,"tours.create.comparison.description":`Créez deux workspaces jumeaux sur la même tâche et comparez leurs commits, tâches et activité.`,"tours.workspace.sessions.title":`Sessions du workspace`,"tours.workspace.sessions.description":`Clique sur le titre pour choisir une session, en créer une, la renommer ou retrouver son identifiant.`,"tours.workspace.actions.title":`Actions du workspace`,"tours.workspace.actions.description":`Le menu ⋯ regroupe la vue côte à côte, la palette de commandes, le panneau latéral et la visite guidée.`,"tours.workspace.title":`Dans un workspace`,"tours.workspace.chat.title":`Conversation`,"tours.workspace.chat.description":`La sortie de l'agent, en direct : messages, appels d'outils, questions et erreurs.`,"tours.workspace.input.title":`Parler à l'agent`,"tours.workspace.input.description":`Envoyez un message, utilisez les slash commands, dictez à la voix ou joignez des fichiers.`,"tours.workspace.selectors.title":`Réglages de session`,"tours.workspace.selectors.description":`Ouvre Configurer pour régler le modèle, l’effort, les permissions et l’auto-loop. Le moteur actuel y est indiqué.`,"tours.workspace.status.title":`Statut`,"tours.workspace.status.description":`L'état de la session en cours ; arrêtez-la ici si besoin.`,"tours.workspace.git.title":`Git`,"tours.workspace.git.description":`Commits, diff, push, rebase et la PR de cette branche.`,"tours.workspace.tasks.title":`Tâches`,"tours.workspace.tasks.description":`Ce que l'agent prévoit de faire, et les critères d'acceptation à respecter.`,"tours.workspace.timeline.title":`Chronologie`,"tours.workspace.timeline.description":`Toutes les sessions de ce workspace ; ouvrez-en une plus ancienne pour la relire.`,"tours.workspace.subagents.title":`Sous-agents`,"tours.workspace.subagents.description":`Suivez les sous-agents lancés par l'agent, avec leur progression en direct.`,"tours.workspace.documents.title":`Documents`,"tours.workspace.documents.description":`Plans et fichiers écrits par l'agent, consultables sans quitter le chat.`,"tours.workspace.schedule.title":`Programmation`,"tours.workspace.schedule.description":`Réveils et crons qui relancent l'agent plus tard.`,"tours.workspace.handoff.title":`Repartir avec un contexte frais`,"tours.workspace.handoff.description":`Une longue conversation ? Démarre une session fraîche ici, ou utilise « Changer de LLM ». Le travail courant est interrompu immédiatement et la nouvelle session reprend automatiquement dans le même workspace. La synthèse de passation est facultative : désactive-la si le quota du LLM actuel est épuisé. Le suivi, le rapport et le lien vers la session précédente apparaissent sous ce bouton.`,"tours.workspace.terminal.title":`Terminal`,"tours.workspace.terminal.description":`Un shell dans le worktree, sans quitter Kōbō.`,"tours.gitPr.title":`Pull request`,"tours.gitPr.panel.title":`Statut de la PR`,"tours.gitPr.panel.description":`Résultat de la CI, décision de review et reviewers, rafraîchis toutes les 30 secondes.`,"tours.gitPr.actions.title":`Actions Git`,"tours.gitPr.actions.description":`Push, pull, rebase ou changement de branche de base. Pendant un conflit, un bouton laisse l'agent le résoudre.`,"tours.gitPr.attention.title":`Badges d'attention`,"tours.gitPr.attention.description":`La carte affiche une CI en échec, des changements demandés ou une PR prête à merger.`,"tours.settings.title":`Paramètres`,"tours.settings.engines.title":`Moteurs et modèles`,"tours.settings.engines.description":`Modèles, permissions par défaut et limites de relance automatique.`,"tours.settings.integrations.title":`Intégrations`,"tours.settings.integrations.description":`Connexions Notion et Sentry, et identifiants Bitbucket. GitHub et GitLab utilisent votre connexion CLI locale.`,"tours.settings.automation.title":`Automatisation`,"tours.settings.automation.description":`Scripts de setup et de cleanup, hooks de cycle de vie, templates de prompts, templates de workspace et skills.`,"tours.settings.worktrees.title":`Worktrees`,"tours.settings.worktrees.description":`Où vivent les worktrees, combien de temps garder ceux qui sont mergés, et la purge automatique.`,"tours.settings.projects.title":`Projets`,"tours.settings.projects.description":`Les projets enregistrés et leurs surcharges par projet.`,"tours.settings.misc.title":`Général, voix, notifications, export`,"tours.settings.misc.description":`Langue, accès réseau, dictée, sons et notifications navigateur, et un export complet de vos réglages.`,"tours.dashboard.title":`Tableau de bord`,"tours.dashboard.overview.title":`Vue d'ensemble`,"tours.dashboard.overview.description":`Tous les workspaces actifs dans un tableau ; cliquez sur une ligne pour l'ouvrir.`,"tours.dashboard.reliability.title":`Fiabilité des moteurs`,"tours.dashboard.reliability.description":`Sessions, erreurs et durées par moteur et par modèle.`,"tours.health.title":`Santé`,"tours.health.checks.title":`Vérifications`,"tours.health.checks.description":`Environnement, base de données, runtimes, workspaces et sessions.`,"tours.health.active.title":`État actif`,"tours.health.active.description":`Les back-offs de quota, les réveils en attente et les auto-loops en cours en ce moment.`,"tours.search.title":`Recherche`,"tours.search.input.title":`Requête`,"tours.search.input.description":`Recherche dans les noms de workspaces et les conversations des agents.`,"tours.search.archived.title":`Archivés`,"tours.search.archived.description":`Inclure les workspaces archivés dans les résultats.`,"tours.changelog.title":`Nouveautés`,"tours.changelog.list.title":`Versions`,"tours.changelog.list.description":`Ce qui a changé à chaque version, la plus récente en premier.`,"settings.projectGroup.identity":`Identité`,"settings.projectGroup.defaults":`Valeurs par défaut`,"settings.projectGroup.prompts":`Prompts`,"settings.projectGroup.scripts":`Scripts`,"settings.projectPath":`Chemin du projet`,"settings.projectPathPlaceholder":`/chemin/vers/le/projet`,"settings.displayName":`Nom affiché`,"settings.displayNamePlaceholder":`Mon projet`,"settings.defaultSourceBranch":`Branche source par défaut`,"settings.defaultModel.project":`Modèle par défaut`,"settings.skipPermissions.project":`Ignorer les invites de permission`,"settings.prPromptTemplate.project":`Modèle de prompt PR`,"settings.prPromptPlaceholder.project":`Instructions spécifiques au projet pour la création de PR...`,"settings.reviewPromptTemplate.project":`Modèle de prompt de review`,"settings.ciFixPromptTemplate.project":`Modèle de prompt « Fix CI »`,"settings.gitConventions.project":`Conventions Git (projet)`,"settings.gitConventionsEmpty":`Laisser vide pour utiliser les conventions globales.`,"settings.notionStatus":`Statut ticket Notion`,"settings.notionStatusProperty":`Nom de la propriété`,"settings.notionStatusPropertyPlaceholder":`État, Status...`,"settings.notionInProgressStatus":`Valeur à définir`,"settings.notionInProgressStatusPlaceholder":`En cours, In progress...`,"settings.notionStatusHint":`Quand un workspace est créé avec un ticket Notion, la propriété spécifiée est mise à cette valeur. Les deux champs sont requis. Laisser vide pour désactiver.`,"settings.notionAssignee":`Assignation Notion`,"settings.notionAssigneeHint":`Quand un workspace est créé avec un ticket Notion, l'utilisateur authentifié sur le MCP Notion est ajouté à cette propriété People — uniquement si elle n'a pas déjà d'assigné. Laisser vide pour désactiver.`,"settings.notionAssigneeProperty":`Nom de la propriété`,"settings.notionAssigneePropertyPlaceholder":`Développeurs, Assignees...`,"settings.notionUserId":`Ton UUID Notion`,"settings.notionUserIdPlaceholder":`135d872b-594c-8126-9604-00024ad6e5b5`,"settings.notionUserIdHint":`Sélectionne ton compte dans la liste. Notion refuse l'assignation d'un bot — ce champ est obligatoire pour activer l'auto-assignation.`,"settings.notionUsersRefresh":`Rafraîchir`,"settings.notionUsersLoading":`Chargement des utilisateurs Notion…`,"settings.notionUsersLoadFailed":`Impossible de récupérer la liste : {error}`,"settings.notionUsersManualFallback":`Liste indisponible — colle ton UUID Notion manuellement.`,"settings.devServer":`Serveur de dev`,"settings.devServerStart":`Script de démarrage`,"settings.devServerStartPlaceholder":`npm run dev`,"settings.devServerStop":`Script d'arrêt`,"settings.devServerStopPlaceholder":`Optionnel — le processus sera tué automatiquement si vide`,"settings.selectProject":`Sélectionnez un projet ou ajoutez-en un nouveau`,"settings.useGlobal":`Utiliser le global`,"settings.saved":`Paramètres généraux enregistrés.`,"settings.unsavedChanges":`Modifications non enregistrées`,"settings.nav.general":`Général`,"settings.nav.agents":`Agents`,"settings.nav.skills":`Skills`,"settings.nav.prompts":`Prompts`,"settings.nav.scripts":`Scripts`,"settings.nav.workspaceTemplates":`Templates de workspace`,"workspaceTemplates.title":`Templates de workspace`,"workspaceTemplates.hint":`Préréglages enregistrés du formulaire de création. Choisissez-en un sur la page de création ; pour en modifier un, chargez-le là, ajustez, puis réenregistrez-le sous le même nom.`,"workspaceTemplates.empty":`Aucun template pour l'instant. Remplissez le formulaire de création et utilisez « Enregistrer comme template ».`,"workspaceTemplates.anyProject":`Tout projet`,"workspaceTemplates.rename":`Renommer`,"workspaceTemplates.renameTitle":`Renommer le template`,"workspaceTemplates.deleteConfirm":`Supprimer le template « {name} » ?`,"workspaceTemplates.deleted":`Template « {name} » supprimé`,"settings.nav.notion":`Notion`,"settings.nav.forge":`Forge`,"settings.bitbucketCommunity":`Bitbucket Community`,"settings.bitbucketCommunityHint":`Les identifiants restent locaux et sont utilisés uniquement par bkt.`,"settings.bitbucketUsername":`E-mail Atlassian`,"settings.bitbucketToken":`Token API Bitbucket`,"settings.nav.sentry":`Sentry`,"settings.nav.voice":`Voix`,"settings.nav.notifications":`Notifications`,"settings.nav.worktrees":`Worktrees`,"settings.nav.export":`Export`,"settings.help.general":`Langue, accès réseau et valeurs par défaut dont hérite chaque projet.`,"settings.help.agents":`Modèles et permissions par défaut, ainsi que les limites de relance automatique.`,"settings.help.skills":`Les suites de skills que l'agent est invité à utiliser.`,"settings.help.prompts":`Instructions des agents après ouverture d’une PR/MR, pour les revues de code, les corrections CI et la finalisation.`,"settings.help.scripts":`Scripts de setup, de nettoyage et de changement de branche source, plus les hooks de cycle de vie.`,"settings.help.notion":`Importer une page Notion comme source de vérité d'un workspace.`,"settings.help.sentry":`Créer un workspace à partir d'une issue Sentry.`,"settings.help.forge":`Identifiants Bitbucket. GitHub et GitLab utilisent vos CLI gh/glab authentifiées ; choisissez la forge par projet.`,"settings.help.voice":`Dictée et push-to-talk.`,"settings.help.notifications":`Sons, notifications navigateur et rappel des questions sans réponse.`,"settings.help.worktrees":`Où les worktrees sont créés, rétention et purge automatique.`,"settings.help.projects":`Projets enregistrés et leurs surcharges par projet.`,"settings.help.templates":`Templates de prompt développés dans la zone de saisie du chat.`,"settings.help.workspaceTemplates":`Presets enregistrés du formulaire de création.`,"settings.help.export":`Exporter et importer tous les paramètres en JSON.`,"settings.openNav":`Ouvrir la navigation`,"settings.saveError":`Erreur lors de l'enregistrement des paramètres.`,"settings.projectSaved":`Projet enregistré.`,"settings.projectSaveError":`Erreur lors de l'enregistrement du projet.`,"settings.projectDeleted":`Projet supprimé.`,"settings.deleteProjectConfirmTitle":`Supprimer le projet ?`,"settings.deleteProjectConfirmMessage":`Retirer « {name} » de vos projets ? Cela supprime uniquement ses réglages Kōbō — votre code et vos worktrees ne sont pas touchés.`,"settings.projectDeleteError":`Erreur lors de la suppression du projet.`,"settings.projectPathRequired":`Le chemin du projet est requis.`,"templates.title":`Modèles`,"templates.newTemplate":`Nouveau modèle`,"templates.editTemplate":`Modifier le modèle`,"templates.deleteTemplate":`Supprimer le modèle`,"templates.deleteConfirm":`Supprimer le modèle '/{slug}' ?`,"templates.deleteConfirmMessage":`Cette action est irréversible.`,"templates.slug":`Slug`,"templates.slugHint":`Lettres minuscules, chiffres, tirets. Max 64 caractères.`,"templates.slugInvalid":`Le slug ne peut contenir que des lettres minuscules, chiffres et tirets`,"templates.slugDuplicate":`Un modèle avec ce slug existe déjà`,"templates.description":`Description`,"templates.descriptionHint":`Libellé court affiché dans le dropdown.`,"templates.descriptionRequired":`La description est requise`,"templates.contentRequired":`Le contenu est requis`,"templates.content":`Contenu`,"templates.contentHint":`Contenu du modèle. Utilise {variable_name} pour les substitutions.`,"templates.availableVars":`Variables disponibles`,"templates.filePath":`Fichier : {path}`,"templates.empty":`Aucun modèle pour l'instant.`,"templates.createFailed":`Échec de la création du modèle`,"templates.updateFailed":`Échec de la modification du modèle`,"templates.deleteFailed":`Échec de la suppression du modèle`,"templates.save":`Enregistrer`,"templates.create":`Créer`,"templates.reloadDefaults":`Recharger les modèles par défaut`,"templates.reloadDefaultsHint":`Ajoute uniquement les modèles par défaut manquants. Les modèles existants (même modifiés) ne sont jamais écrasés.`,"templates.reloadDefaultsConfirmMessage":`Cette action ajoute les modèles par défaut absents de la liste. Les modèles existants — y compris ceux que tu as modifiés — ne seront pas touchés. Si tu veux récupérer la version d'origine d'un modèle modifié, supprime-le d'abord puis relance cette action.`,"templates.reloadDefaultsSuccess":`{added} ajouté(s), {kept} conservé(s)`,"templates.reloadDefaultsFailed":`Échec du rechargement des modèles par défaut`,"templates.resetToDefault":`Réinitialiser au défaut`,"templates.resetConfirmTitle":`Réinitialiser le template au défaut ?`,"templates.resetConfirmMessage":`Cela écrase vos modifications locales de /{slug} par le défaut intégré. Action irréversible.`,"templates.resetSuccess":`Template /{slug} réinitialisé au défaut`,"templates.resetFailed":`Échec de la réinitialisation du template`,"chatInput.dropdownSkills":`Skills Claude`,"chatInput.dropdownKobo":`Commandes Kōbō`,"chatInput.dropdownTemplates":`Modèles`,"documents.title":`Documents`,"documents.empty":`Aucun document trouvé`,"documents.refresh":`Actualiser`,"documents.back":`Retour`,"documents.loadFailed":`Échec du chargement du document`,"git.title":`Git`,"git.outputDialogTitle":`Git a signalé une erreur`,"git.statsFailed":`L’état git n’a pas pu être lu`,"git.section.repository":`Dépôt`,"git.section.changes":`Modifications`,"git.section.pullRequest":`Pull request`,"git.section.actions":`Actions`,"git.actions.more":`Plus`,"git.localOnly":`local uniquement`,"git.pushed":`pushé`,"git.unpushed":`{count} non pushé`,"git.commits":`{count} commit | {count} commits`,"git.commits.loading":`Chargement des commits…`,"git.commits.empty":`Aucun commit sur cette branche`,"git.commits.pushed":`Pushé`,"git.commits.unpushed":`Non pushé`,"git.commits.clickToAppend":`clique pour ajouter le SHA au chat`,"git.commits.diffThisCommit":`Diff de ce commit (vs parent)`,"git.compareCommits":`Comparer des commits…`,"git.files":`{count} fichier | {count} fichiers`,"git.staged":`{count} indexé`,"git.modified":`{count} modifié`,"git.untracked":`{count} non suivi`,"git.workingTreeEmpty":`Aucune modification non commitée`,"git.fileStaged":`Indexé`,"git.fileModified":`Modifié`,"git.fileUntracked":`Non suivi`,"git.push":`Push`,"git.forcePush":`Force push`,"git.forcePushToggle":`Force push (--force-with-lease)`,"git.pushBlockedByOperation":`Terminez ou abandonnez d'abord l'opération {operation} en cours`,"git.pushUpToDate":`Rien à pousser : la branche est déjà à jour sur origin`,"git.forcePushHint":`Plus sûr que --force : le push est rejeté si le remote a des commits que tu n’as pas vus. À utiliser après un rebase ou un amend de commits déjà push.`,"git.branchForcePushed":`Branche force-pushée`,"git.pull":`Pull`,"git.pullNoUpstream":`Pas d'upstream pour cette branche — push-la d'abord pour activer Pull.`,"git.sync":`Sync`,"git.createPrNoRemote":`Push la branche d'abord`,"git.viewRequest":`Voir la {request}`,"git.createRequest":`Créer une {request}`,"git.changeRequestBase":`Changer la branche cible de la {request}`,"git.forgeCliMissing":`{cli} n'est pas installé — installez-le pour les fonctions {request}`,"git.forgeNotAuthenticated":`Non authentifié — exécutez {cli} auth login`,"settings.forge":`Forge`,"settings.forge.auto":`Détection automatique`,"settings.forge.github":`GitHub`,"settings.forge.gitlab":`GitLab`,"settings.forge.bitbucketCommunity":`Bitbucket Community (bkt)`,"settings.forge.none":`Aucune`,"git.pullConfirmTitle":`Pull la branche ?`,"git.pullConfirmMessage":`Pull {branch} depuis la remote (fast-forward uniquement).`,"git.branchPulled":`Branche pull`,"git.pullFailed":`Échec du pull`,"git.renameBranch":`Renommer la branche`,"git.renameBranchPrompt":"Renommer `{branch}` en :","git.renameBranchSuccess":"Branche renommée en `{branch}`","git.renameBranchFailed":`Échec du renommage`,"git.renameBranchExists":"La branche `{branch}` existe déjà (locale ou sur origin)","git.diff":`Diff`,"git.diffReview":`Diff`,"git.diffReviewTooltip":`Ouvre le diff viewer en mode Review — commentaires inline + soumission groupée à l'agent`,"pr.baseChanged":`Base de la PR modifiée : {oldBase} → {newBase}`,"pr.openPr":`Ouvrir la PR`,"pr.openWorkspace":`Ouvrir le workspace`,"pr.dismiss":`Fermer`,"git.rebase":`Rebase`,"git.rebaseConfirmTitle":`Rebase la branche ?`,"git.rebaseConfirmMessage":`Rebase sur {branch}. Des conflits peuvent survenir.`,"git.rebaseSuccess":`Rebase terminé`,"git.rebaseFailed":`Rebase échoué`,"git.merge":`Merge`,"git.fetch":`Fetch`,"git.fetchSuccess":`Dépôt récupéré`,"git.fetchFailed":`Échec du fetch : {error}`,"git.mergeConfirmTitle":`Fusionner la branche ?`,"git.mergeConfirmMessage":`Fusionner {branch} dans cette branche. Des conflits sont possibles.`,"git.mergeSuccess":`Merge terminé`,"git.mergeFailed":`Merge échoué`,"git.commitFailed":`Commit échoué`,"git.commitChanges":`Committer les modifications`,"git.commitDialogTitle":`Committer les modifications non commitées`,"git.commitDialogDescription":`Saisissez votre message ou demandez à l’agent d’inspecter et de créer le commit.`,"git.commitMessage":`Message de commit`,"git.commitManual":`Committer`,"git.commitWithAgent":`Demander à l’agent`,"git.commitAgentSuccess":`Demande de commit envoyée à l’agent`,"git.discardFailed":`Abandon échoué`,"git.conflictTitleMerge":`Conflits de merge détectés`,"git.conflictTitleRebase":`Conflits de rebase détectés`,"git.operationPausedTitle":`Opération Git à poursuivre`,"git.operationPausedSubtitle":`Aucun fichier en conflit. Git attend simplement que tu poursuives l’opération.`,"git.conflictSubtitle":`{count} fichier(s) en conflit. Choisis comment continuer.`,"git.conflictAbortConfirmTitle":`Abandonner la résolution du conflit ?`,"git.conflictAbortConfirmMessage":`Tout ce que tu as résolu dans ce {op} est jeté et le worktree revient à son état d’avant. C’est irréversible.`,"git.conflictAbort":`Abandonner`,"git.conflictContinue":`Continuer`,"git.conflictContinued":`Opération Git poursuivie`,"git.conflictResolveWithAgent":`Demander à l'agent de résoudre`,"git.conflictAborted":`Opération abandonnée`,"git.conflictHandoffSuccess":`L'agent résout les conflits`,"git.dirtyTitleRebase":`Des modifications non commitées bloquent le rebase`,"git.dirtyTitleMerge":`Des modifications non commitées bloquent le merge`,"git.dirtyTitlePull":`Des modifications non commitées bloquent le pull`,"git.dirtySubtitle":`{modified} modifié(s), {staged} indexé(s), {untracked} non suivi(s). Choisis comment continuer.`,"git.dirtyStash":`Stash & réessayer`,"git.dirtyCommit":`Commit d'abord`,"git.dirtyCommitPlaceholder":`Message de commit`,"git.dirtyCommitConfirm":`Commit & réessayer`,"git.dirtyDiscard":`Abandonner les modifs`,"git.dirtyDiscardConfirmTitle":`Abandonner toutes les modifications non commitées ?`,"git.dirtyDiscardConfirmMessage":`Les modifications suivies seront perdues (git reset --hard). Les fichiers non suivis sont conservés. Action irréversible.`,"git.pushConfirmTitle":`Pusher la branche ?`,"git.pushConfirmMessage":`Pusher {branch} vers le dépôt distant.`,"git.pushConfirmMessagePrefix":`Pusher la branche`,"git.pushConfirmMessageSuffix":`vers le dépôt distant.`,"git.changePrBaseTitle":`Changer la branche cible`,"git.changePrBaseMessage":`Entrez la nouvelle branche cible pour la {request}.`,"git.changePrBaseSuccess":`Branche cible de la {request} mise à jour`,"git.changePrBaseFailed":`Impossible de changer la branche cible de la {request}`,"git.mergeRequest":`Fusionner la {request}`,"git.mergeRequestConfirmTitle":`Fusionner la {request} ?`,"git.mergeRequestConfirmMessage":`Cette action fusionne la {request} ouverte dans sa branche cible.`,"git.mergeRequestSuccess":`{request} fusionnée`,"git.mergeRequestFailed":`Impossible de fusionner la {request}`,"git.deleteRemoteBranch":`Supprimer la branche distante`,"git.deleteRemoteBranchTitle":`Supprimer la branche distante ?`,"git.deleteRemoteBranchMessage":`La demande a été fusionnée. Supprimer la branche distante {branch} ?`,"git.deleteRemoteBranchSuccess":`Branche distante {branch} supprimée`,"git.deleteRemoteBranchFailed":`Impossible de supprimer la branche distante`,"git.changeSourceBranch":`Changer la branche source`,"git.changeSourceBranchTitle":`Changer la branche source`,"git.changeSourceBranchMessage":`Choisis la nouvelle branche source. La branche de travail sera reconstruite par-dessus.`,"git.changeSourceBranchDone":`Branche source changée vers {branch}`,"git.changeSourceBranchAligned":`Branche source changée vers {branch} (la branche n'avait aucun commit propre)`,"git.changeSourceBranchTooMany":`La branche a trop de commits propres ({n}) — rebase-la manuellement`,"git.changeSourceBranchDirty":`Commit ou stash tes changements avant de changer la branche source`,"git.changeSourceBranchAgentRunning":`Arrête l'agent avant de changer la branche source`,"git.changeSourceBranchErrorTitle":`Échec du changement de branche source`,"git.changeSourceBranchErrorOngoing":`Une opération {op} est encore en cours sur le worktree. Annule-la pour revenir à un état propre.`,"git.changeSourceBranchErrorAbort":`Annuler l'opération`,"git.changeSourceBranchLoading":`Changement de la branche source…`,"git.changeSourceForcePushTitle":`Force-push de la branche réécrite ?`,"git.changeSourceForcePushMessage":`L'historique de la branche a été réécrit. La force-pusher vers le remote avec --force-with-lease ?`,"git.changeSourceForcePushDone":`Branche force-pushée`,"git.openEditor":`Ouvrir dans l'éditeur`,"git.openEditorFailed":`Impossible d'ouvrir l'éditeur`,"git.branchPushed":`Branche pushée`,"git.pushFirst":`La branche n'est pas sur le dépôt distant. Cliquez d'abord sur Push.`,"git.unpushedCommits":`Les commits locaux ne sont pas pushés. Cliquez d'abord sur Push.`,"git.from":`depuis`,"git.aheadBehindTooltip":`{ahead} commits en avance, {behind} en retard sur {source}`,"git.divergence.title":`Divergence de branche`,"git.divergence.subtitle":`vs {source}`,"git.divergence.ahead":`↑ {count} en avance`,"git.divergence.behind":`↓ {count} en retard`,"git.divergence.empty.ahead":`Aucun commit en avance.`,"git.divergence.empty.behind":`Aucun commit en retard.`,"git.divergence.close":`Fermer`,"git.divergence.loading":`Chargement des commits…`,"git.divergence.failed":`Échec du chargement de la divergence`,"git.divergence.retry":`Réessayer`,"git.prCreated":`{request} #{n} créée`,"git.pr.author":`Auteur`,"git.pr.reviewers":`Relecteurs`,"git.pr.assignees":`Assignés`,"git.pr.labels":`Labels`,"git.pr.changesRequestedBadge":`Modifications demandées`,"git.pr.approvedBadge":`Approuvée`,"git.pr.ci.passed":`CI OK`,"git.pr.ci.failed":`CI en échec`,"git.pr.ci.pending":`CI en cours`,"git.pr.ci.failedCount":`{n} en échec`,"git.pr.ci.pendingCount":`{n} en cours`,"git.pr.ci.passedCount":`{n} OK`,"git.pr.ci.skippedCount":`{n} ignoré(s)`,"git.pr.ci.showPassed":`Afficher les {n} jobs réussis`,"git.pr.ci.hidePassed":`Masquer les jobs réussis`,"toast.prChangesRequested":`Des modifications ont été demandées sur la PR #{n}`,"toast.prApproved":`La PR #{n} a été approuvée`,"toast.prReadyToMerge":`La PR #{n} est prête à merger`,"toast.prCiFailed":`La CI de la PR #{n} est en échec`,"toast.prCiRecovered":`La CI de la PR #{n} est rétablie`,"toast.prMergeConflict":`La PR #{n} a un conflit de merge`,"toast.prMerged":`La PR #{n} a été mergée`,"devServer.title":`Serveur de dev`,"devServer.noWorkspace":`Aucun espace de travail sélectionné`,"devServer.notConfigured":`Non configuré —`,"devServer.goToSettings":`Paramètres`,"devServer.logs":`Logs`,"devServer.running":`En cours`,"devServer.starting":`Démarrage`,"devServer.stopping":`Arrêt`,"devServer.error":`Erreur`,"devServer.stopped":`Arrêté`,"devServer.unknown":`Inconnu`,"devServer.containers":`{count} conteneur | {count} conteneurs`,"devServer.logDialog.title":`Logs du serveur de dev`,"devServer.logDialog.empty":`Aucun log disponible`,"notion.title":`Notion`,"tasks.title":`Tâches`,"notion.addTask":`Ajouter une tâche`,"notion.noUrl":`Aucune URL Notion`,"notion.subtasks":`{done}/{total} sous-tâches`,"notion.noTasks":`Aucune tâche`,"notion.newTask":`Nouvelle tâche... (Entrée pour ajouter, Échap pour annuler)`,"acceptance.title":`Critères d'acceptation`,"acceptance.addCriterion":`Ajouter un critère`,"acceptance.newCriterion":`Nouveau critère... (Entrée pour ajouter, Échap pour annuler)`,"acceptance.empty":`Aucun critère d'acceptation`,"tasks.askProgress":`Demander à l'agent de vérifier sa progression`,"agentTodos.title":`Todos de l'agent`,"agentTodos.empty":`Aucun todo de l'agent`,"subagents.title":`Sub-agents`,"subagents.empty":`Aucune activité de sub-agent`,"subagents.tools":`{count} outils`,"subagents.running":`En cours : `,"stats.resetsAt":`Reset {value}`,"stats.usageBucket":`Quota {n}`,"quotaFooter.lastUpdated":`Dernière mise à jour : {time}`,"quotaFooter.empty":`Chargement…`,"quotaFooter.popover.title":`Utilisation Claude Code`,"quotaFooter.popover.refreshNow":`Rafraîchir`,"quotaFooter.popover.resetsIn":`Réinitialise à {value}`,"quotaFooter.popover.unauthenticated":`Auth requise`,"quotaFooter.popover.unauthenticatedHint":`Lancez "claude" une fois pour vous authentifier.`,"quotaFooter.popover.error":`Erreur`,"quotaFooter.bucket.fiveHour":`5 heures`,"quotaFooter.bucket.sevenDay":`7 jours`,"agent.error.spawn_failed":`Échec du lancement de l'agent`,"agent.error.parse_error":`Impossible d'analyser un message de l'agent`,"agent.error.rate_limit":`Limite de débit atteinte`,"agent.error.resume_failed":`Session introuvable — démarrage en session fraîche`,"agent.error.other":`Erreur de l'agent`,"quotaBackoff.banner.title":`Reprise auto à {time}`,"quotaBackoff.banner.transientTitle":`Reprise auto après interruption à {time}`,"quotaBackoff.resumeNow":`Reprendre maintenant`,"quotaBackoff.banner.tooltip":`Quota Claude épuisé. L'auto-loop reprendra automatiquement quand le quota se libère à {resets_at}.`,"quotaBackoff.banner.cancel":`Annuler la reprise`,"quotaBackoff.cancelled":`Reprise auto annulée — tu peux relancer manuellement à tout moment`,"rateLimitType.fiveHour":`Session 5h`,"rateLimitType.sevenDay":`Hebdo`,"tooltip.addTask":`Ajouter une tâche`,"tooltip.removeTask":`Supprimer la tâche`,"tooltip.addCriterion":`Ajouter un critère`,"tooltip.removeCriterion":`Supprimer le critère`,"tooltip.startDevServer":`Démarrer le serveur de dev`,"tooltip.stopDevServer":`Arrêter le serveur de dev`,"tooltip.closeDiffViewer":`Fermer le diff`,"tooltip.refreshLogs":`Actualiser les logs`,"tooltip.closeDialog":`Fermer`,"tooltip.refreshGitStats":`Actualiser les stats Git`,"tooltip.removeImage":`Supprimer l'image`,"tooltip.sendMessage":`Envoyer le message`,"tools.title":`Outils`,"tools.runSetupScript":`Relancer le script de setup`,"tools.runSetupScriptTooltip":`Exécuter le script de setup du projet dans le worktree`,"tools.runSetupScriptConfirm":`Relancer le script de setup dans cette tâche ? Les artefacts existants peuvent être écrasés.`,"tools.runSetupScriptBusy":`Impossible de relancer le setup pendant que l'agent travaille.`,"tools.noSetupScript":`Aucun script de setup configuré —`,"tools.setupScriptSuccess":`Script de setup terminé avec succès.`,"tools.setupScriptFailed":`Échec du script de setup.`,"tools.openNotion":`Ouvrir dans Notion`,"tools.openSentry":`Ouvrir dans Sentry`,"tools.review":`Reviewer les changes`,"tools.reviewTooltip":`Demander à l'agent de reviewer les changes de cette branche`,"tools.reviewBusy":`Agent occupé — attends qu'il soit idle`,"tools.fixCi":`Réparer la CI`,"tools.fixCiTooltip":`Demander à l'agent de diagnostiquer et corriger les jobs CI en échec`,"tools.fixCiLaunched":`Action « Fix CI » envoyée à l'agent`,"tools.fixCiFailed":`Échec du lancement de l'action « Fix CI »`,"tools.openFileManager":`Ouvrir dans l'explorateur de fichiers`,"tools.openFileManagerTooltip":`Ouvrir le dossier du worktree dans votre explorateur de fichiers configuré`,"tools.openFileManagerFailed":`Échec de l'ouverture de l'explorateur de fichiers`,"tools.openTerminal":`Ouvrir dans un terminal`,"tools.openTerminalTooltip":`Ouvrir le worktree dans le terminal configuré`,"tools.openTerminalFailed":`Échec de l'ouverture du terminal`,"review.title":`Lancer une review`,"review.subtitle":`Demande à l'agent de reviewer tes changes et de te faire des retours.`,"review.additionalInstructions":`Instructions supplémentaires (optionnel)`,"review.additionalInstructionsPlaceholder":`Ajoute des instructions spécifiques pour la review…`,"review.newSession":`Nouvelle session`,"review.newSessionHint":`Démarre une nouvelle session d'agent au lieu de continuer la courante.`,"review.newSessionRequired":`Une nouvelle session est nécessaire pour changer les réglages de l’agent ou revenir automatiquement.`,"review.returnToSession":`Revenir à la session actuelle après la review`,"review.returnToSessionHint":`Reprend cette session avec le résumé final du reviewer. Sinon, la conversation continue dans la session de review.`,"review.returnUnavailable":`La session actuelle doit avoir démarré pour pouvoir être reprise.`,"review.start":`Lancer la review`,"review.cancel":`Annuler`,"review.launched":`Review lancée`,"review.failed":`Échec du lancement de la review`,"diff.title":`Diff`,"diff.side":`Côte à côte`,"diff.inline":`En ligne`,"diff.hideUnchanged":`Masquer le code inchangé`,"diff.showUnchanged":`Afficher le code inchangé`,"diff.showUntracked":`Afficher les fichiers non suivis`,"diff.hideUntracked":`Masquer les fichiers non suivis`,"diff.rollbackToRemote":`Revenir à la version distante`,"diff.rollbackConfirm":`Restaurer {path} à sa version distante (origin) ? Les modifications locales sur ce fichier seront perdues.`,"diff.rollbackConfirmOk":`Rollback`,"diff.rollbackDone":`Fichier restauré à la version distante`,"diff.rollbackDoneRemote":`Fichier restauré à la version distante`,"diff.rollbackDoneHead":`Modifications locales annulées (fichier restauré au dernier commit)`,"diff.rollbackDoneDeleted":`Fichier non suivi supprimé`,"diff.deleteUntracked":`Supprimer le fichier non suivi`,"diff.deleteUntrackedConfirm":`Supprimer définitivement {path} ? Ce fichier n'est pas suivi par git — son contenu sera perdu.`,"diff.deleteUntrackedConfirmOk":`Supprimer`,"diff.rollbackFailed":`Échec du rollback`,"diff.rollbackFailedDetail":`Échec du rollback : {error}`,"diff.modeInspect":`Édition`,"diff.modeReview":`Review`,"diff.addComment":`Ajouter un commentaire`,"diff.replyComment":`Répondre`,"diff.editComment":`Modifier`,"diff.deleteComment":`Supprimer`,"diff.deleteCommentConfirm":`Supprimer ce commentaire ?`,"diff.commentPlaceholder":`Écris un commentaire de revue… (Markdown accepté)`,"diff.reviewDraft":`Brouillon de revue`,"diff.reviewEmpty":`Aucun commentaire — survole une ligne dans le diff et clique + pour en ajouter un.`,"diff.reviewGlobalPlaceholder":`Ajoute un message global de revue (optionnel)`,"diff.submitReview":`Soumettre la revue ({n})`,"diff.reviewPending":`Une revue est déjà en cours d’envoi.`,"diff.reviewEmptySubmission":`La revue est vide.`,"diff.reviewNotAccepted":`Le message n’a pas été accepté. Votre revue a été conservée.`,"diff.reviewSubmitted":`Revue soumise à l'agent`,"diff.reviewSubmitFailed":`Échec de la soumission : {error}`,"diff.scopeBranch":`Branche`,"diff.scopeUnpushed":`Non pushé`,"diff.noChanges":`Aucun changement`,"diff.searchFiles":`Rechercher des fichiers…`,"diff.noFileMatch":`Aucun fichier correspondant`,"diff.selectFile":`Sélectionnez un fichier pour voir le diff`,"diff.fileLoadFailed":`Ce diff n’a pas pu être chargé`,"diff.fileLoadFailedHint":`Le fichier sur le disque est intact — seul le chargement du diff a échoué.`,"diff.fileListLoadFailed":`La liste des fichiers n’a pas pu être chargée`,"diff.fileListLoadFailedHint":`Il s’agit d’un échec de requête, pas d’une branche sans modification.`,"diff.addToChat":`Ajouter au chat`,"diff.compareTitle":`Comparer des commits`,"diff.compareFrom":`De`,"diff.compareTo":`À`,"diff.compareSubmit":`Comparer`,"diff.compareSourceBase":`{branch} (base de la branche)`,"diff.commitsReadOnly":`lecture seule`,"diffViewer.save":`Enregistrer`,"diffViewer.savedAt":`Enregistré`,"diffViewer.saveFailed":`Échec de l’enregistrement`,"diffViewer.saveFailedDetail":`Échec de l’enregistrement : {error}`,"diffViewer.unsavedChanges.title":`Modifications non enregistrées`,"diffViewer.unsavedChanges.message":`Tu as des modifications non enregistrées. Que veux-tu faire ?`,"diffViewer.unsavedChanges.save":`Enregistrer`,"diffViewer.unsavedChanges.cancel":`Annuler`,"diffViewer.conflict.title":`Fichier modifié sur le disque`,"diffViewer.conflict.message":`Le fichier a été modifié hors de Kōbō depuis que tu l’as ouvert.`,"diffViewer.conflict.reload":`Recharger (perdre les modifs locales)`,"diffViewer.conflict.keep":`Garder les miennes`,"diffViewer.conflict.overwrite":`Écraser quand même`,"diffViewer.conflict.overwriteHint":`Remplace le fichier sur le disque par ta version. L’autre modification est perdue.`,"diffViewer.conflict.keepHint":`Garde tes modifications dans l’éditeur et adopte la nouvelle signature du disque, pour que la prochaine sauvegarde fonctionne.`,"diffViewer.saveBlocked":`L’agent tourne — arrête-le pour enregistrer tes modifications.`,"diffViewer.unsavedBanner":`Modifications non enregistrées. Arrête l’agent pour les sauvegarder.`,"diffViewer.closeConfirm.title":`Modifications non enregistrées`,"diffViewer.closeConfirm.message":`Ce fichier contient des modifications jamais enregistrées. Fermer le visualiseur de diff les perdra.`,"diffViewer.closeConfirm.discard":`Fermer sans enregistrer`,"diffViewer.criteriaRail":`Checklist de revue`,"diffViewer.criteriaRailShow":`Afficher la checklist de revue`,"diffViewer.criteriaRailHide":`Masquer la checklist de revue`,"diffViewer.fileTreeShow":`Afficher l’arbre des fichiers`,"diffViewer.fileTreeHide":`Masquer l’arbre des fichiers`,"diffViewer.closeConfirm.saveAndClose":`Enregistrer et fermer`,"diffViewer.agentRunning":`L’agent tourne — arrête-le pour éditer`,"diffViewer.fileDeleted":`Fichier supprimé`,"notification.agentFinished":`{name} — Agent terminé`,"notification.agentQuestion":`{name} — L'agent te pose une question`,"notification.awaitingReminder":`{name} - attend toujours votre réponse ({minutes} min)`,"notification.agentPermissionRequest":`{name} — L'agent demande une permission`,"notification.autoLoopCompleted":`{name} — Auto-loop terminé`,"notification.autoLoopWaitingForSlot":`{name} - L'auto-loop attend un slot d'agent libre ({running}/{limit} en cours)`,"notification.autoLoopStalled":`{name} — Auto-loop bloqué (aucun progrès)`,"notification.autoLoopError":`{name} — Auto-loop arrêté sur erreur`,"notification.autoLoopAwaitingClarification":`{name} — Auto-loop en pause, en attente de votre précision`,"notification.autoLoopPermissionOverridden":`{name} — Auto-loop a forcé le mode plan en bypass`,"notification.agentError":`{name} — Erreur agent`,"contextMenu.rename":`Renommer`,"contextMenu.editDescription":`Modifier la description`,"contextMenu.copyPath":`Copier le chemin du worktree`,"contextMenu.openEditor":`Ouvrir dans l'éditeur`,"contextMenu.openFileManager":`Ouvrir dans l'explorateur de fichiers`,"contextMenu.unarchiveDisabledPurged":`Restaurez d’abord le worktree avec Restaurer le worktree, ou recréez-le manuellement. Kōbō détecte automatiquement les worktrees correspondants.`,"workspaceList.unarchiveBlockedPurged":`Restaurez d’abord le worktree avec Restaurer le worktree, ou recréez-le manuellement. Kōbō détecte automatiquement les worktrees correspondants.`,"contextMenu.purgeWorktree":`Libérer l'espace disque (supprimer le worktree)`,"contextMenu.purgeWorktreeTooltip":`Supprime le worktree du disque pour récupérer de l'espace — l'historique des messages et sessions est conservé. Archive automatiquement le workspace.`,"contextMenu.purgeWorktreeDialogTitle":`Libérer l'espace disque ?`,"contextMenu.purgeWorktreeDialogMessage":`Le dossier worktree de « {name} » va être supprimé du disque. L'historique des messages et sessions est conservé. Le workspace sera archivé automatiquement. Cette action ne peut pas être annulée dans la version actuelle.`,"contextMenu.purgeWorktreeDialogConfirm":`Supprimer le worktree`,"contextMenu.purgeWorktreeSuccess":`Worktree supprimé — espace disque récupéré.`,"settings.autoPurgeOnPrMerged":`Purger le worktree quand la PR est mergée`,"settings.autoPurgeOnPrMergedHint":`Quand activé, le worktree est supprimé du disque dès que la PR est mergée (en plus de l'archivage auto). L'historique des messages est conservé.`,"settings.autoLoopMaxRetries":`Nombre maximal de nouvelles tentatives`,"settings.awaitingUserReminder":`Rappel de question sans réponse`,"settings.awaitingUserReminderHint":`Minutes pendant lesquelles un workspace peut attendre votre réponse avant que Kōbō ne vous relance, puis à chaque intervalle suivant. 0 désactive.`,"settings.localeLoadFailed":`Impossible de charger cette langue ; la langue actuelle est conservée.`,"settings.autoLoopMaxRetriesHint":`Met la mission en pause après ce nombre de pannes temporaires du moteur ou du serveur. Les quotas attendent leur réinitialisation sans consommer cette limite.`,"settings.retentionTitle":`Rétention de l'historique de conversation (désactivée par défaut)`,"settings.retentionWarning":`Activer cette option supprime définitivement de la base l'historique de conversation des agents, à commencer par tout ce qui est déjà plus vieux que la fenêtre. Les événements supprimés sont irrécupérables.`,"settings.retentionHint":`Exécutée une fois au démarrage du serveur. Les workspaces, tâches, sessions, branches et worktrees ne sont jamais touchés — seule la sortie enregistrée des agents l'est.`,"settings.retentionDaysLabel":`Supprimer les événements plus vieux que (jours)`,"settings.retentionDaysHint":`0 — la valeur par défaut — conserve tous les événements indéfiniment. Renseignez une valeur pour activer la rétention.`,"settings.retentionKeepLabel":`Événements toujours conservés par workspace`,"settings.retentionKeepHint":`Les événements les plus récents de chaque workspace survivent quel que soit leur âge, pour qu'un workspace ancien mais toujours ouvert garde un historique lisible. Suggéré : 5000.`,"settings.retentionDisabledHint":`Rétention désactivée : rien ne sera jamais supprimé.`,"settings.retentionConfirmTitle":`Supprimer définitivement de l'historique de conversation ?`,"settings.retentionConfirmMessage":`Ne conserver que {days} jour(s) d'historique supprimera définitivement, au prochain démarrage du serveur, {count} des {total} événements d'agent enregistrés — y compris tout ce qui est déjà plus ancien. C'est irréversible. Continuer ?`,"settings.retentionConfirmMessageUnknown":`Ne conserver que {days} jour(s) d'historique supprimera définitivement, au prochain démarrage du serveur, tous les événements d'agent plus anciens — y compris tout ce qui est déjà accumulé. Le volume exact n'a pas pu être calculé. C'est irréversible. Continuer ?`,"settings.purgeDocsTitle":`Comment ça marche — restauration & permissions`,"settings.purgeDocsRestoreTitle":`Restaurer un worktree purgé (détection automatique)`,"settings.purgeDocsRestoreIntro":`Un workspace purgé conserve son historique de chat et les métadonnées de la PR, mais le dossier worktree n'existe plus. Recrée-le manuellement avec l'une de ces commandes — Kōbō détecte la réapparition du dossier dans les 30 secondes et réactive automatiquement le workspace (désarchive + clear flag purge) :`,"settings.purgeDocsRestoreCommands":`# GitHub (via le CLI gh) :
|
|
11
|
+
# ton script — utilise $KOBO_NEW_BASE / $KOBO_OLD_BASE / $KOBO_WORKING_BRANCH …`,"settings.changeSourceBranchScript.resetDefault":`Réinitialiser au défaut Kōbō`,"settings.changeSourceBranchScript.replaceConfirmTitle":`Réinitialiser le script ?`,"settings.changeSourceBranchScript.replaceConfirm":`Tes modifications seront remplacées par le script Kōbō par défaut. Continuer ?`,"settings.cleanupScriptHint":`Script shell exécuté dans le worktree après chaque fin de session de l'agent. En mode auto-loop, il ne s'exécute qu'une fois toutes les tâches terminées. Laisser vide pour désactiver.`,"settings.cleanupScriptPlaceholder":`ex. supprimer des fichiers temporaires, arrêter des conteneurs…`,"settings.cleanupScriptMode":`Quand l'exécuter`,"settings.cleanupScriptMode.idle":`À chaque fin de session — même s'il reste des tâches`,"settings.cleanupScriptMode.noTasks":`Uniquement quand plus aucune tâche Kōbō`,"settings.cleanupScriptOnlyOnChanges":`Lancer uniquement si des fichiers ont été modifiés, ajoutés ou supprimés`,"settings.cleanupScriptMode.inherit":`Hériter du réglage global`,"settings.taskPromptTemplate":`Prompt de tâche`,"settings.taskPromptTemplatePlaceholder":`Prompt inséré automatiquement dans la description de tâche…`,"settings.taskPromptTemplateHint":`Injecté automatiquement dans la description de tâche sur la page de création quand ce projet est sélectionné. S'il n'est pas modifié, il est remplacé en changeant de projet ; dès que vous l'éditez, votre texte est conservé.`,"settings.setupScriptPlaceholder":`npm install`,"settings.setupScriptHint":`Exécuté avec bash dans le worktree après sa création, avant le démarrage de l'agent. Pas besoin de shebang. En cas d'échec, le workspace passe en erreur. Timeout : 5 minutes.`,"settings.e2e.title":`Tests E2E`,"settings.e2e.framework":`Framework`,"settings.e2e.frameworkNone":`Aucun`,"settings.e2e.frameworkOther":`Autre`,"settings.e2e.skill":`Skill (optionnel)`,"settings.e2e.skillPlaceholder":`ex : cypress-tester`,"settings.e2e.prompt":`Guidance personnalisée (optionnel)`,"settings.e2e.promptPlaceholder":`ex : utiliser le page-object, cibler les data-testid`,"settings.e2e.helpText":`Quand configuré, l'agent de grooming auto-loop insère des sous-tâches E2E pour les fonctionnalités UI.`,"settings.finalization.title":`Finalisation de l'auto-loop`,"settings.finalization.helpText":`Optionnel : un prompt que l'agent exécute lors de la toute dernière itération de l'auto-loop. Typiquement utilisé pour les contrôles qualité finaux (lint, typecheck, tests). L'étape de grooming créera une tâche préfixée [FINAL] qui utilisera ce prompt.`,"settings.finalization.prompt":`Prompt de finalisation`,"settings.finalization.promptPlaceholder":`ex. Lance npm run lint et npm test, puis marque cette tâche comme terminée.`,"settings.editorCommand":`Commande éditeur`,"settings.editorCommandPlaceholder":`code, phpstorm, subl, vim...`,"settings.editorCommandHint":`Commande utilisée pour ouvrir le worktree dans votre éditeur. Le chemin du worktree est passé en argument.`,"settings.fileManagerCommand":`Commande explorateur de fichiers`,"settings.fileManagerCommandPlaceholder":`xdg-open, open, nautilus, dolphin, explorer...`,"settings.fileManagerCommandHint":`Commande utilisée pour ouvrir le worktree dans votre explorateur de fichiers. Le chemin du worktree est passé en argument. Laissez vide pour masquer le bouton.`,"settings.terminalCommand":`Commande du terminal`,"settings.terminalCommandHint":`Commande pour lancer le terminal dans le worktree. Placeholder {path} optionnel pour le répertoire.`,"settings.terminalCommandPlaceholder":`kitty · alacritty · gnome-terminal --working-directory={path}`,"settings.mcpSelection":`Sélection MCP Claude`,"settings.mcpAutoSelect":`Auto (premier MCP actif correspondant)`,"settings.notionMcp":`Clé MCP Notion`,"settings.sentryMcp":`Clé MCP Sentry`,"settings.mcpSelectionHint":`Les entrées actives sont lues depuis ~/.claude.json. Laisser Auto pour utiliser le comportement par défaut.`,"settings.configuredProjects":`Projets configurés`,"settings.noProjects":`Aucun projet configuré`,"settings.addProject":`Ajouter un projet`,"settings.copyFrom":`Copier les settings depuis`,"settings.copyFromPlaceholder":`(aucun — partir des valeurs par défaut)`,"settings.copyFromHint":`Copie tous les settings sauf le path, le nom affiché et la branche source.`,"settings.copyFromConfirmTitle":`Écraser les valeurs actuelles ?`,"settings.copyFromConfirm":`Cela écrasera les valeurs du formulaire avec les settings de « {project} ». Continuer ?`,"settings.newProject":`Nouveau projet`,"settings.editProject":`Modifier le projet`,"help.title":`Aide`,"help.tours":`Visites guidées`,"help.steps":`{n} étape | {n} étapes`,"help.markAllSeen":`Marquer toutes comme vues`,"help.markAllSeenHint":`Valide les visites actuelles sans les lancer.`,"help.resetAll":`Réinitialiser toutes les visites`,"help.resetAllHint":`Relance l'accueil ; chaque écran rejouera sa visite à la prochaine ouverture.`,"help.status.unseen":`non vue`,"help.status.partial":`en partie`,"help.status.seen":`vue`,"help.replayThis":`Rejouer la visite de cet écran`,"tours.next":`Suivant`,"tours.prev":`Précédent`,"tours.done":`Terminé`,"tours.exitConfirm":`Quitter la visite guidée ? Elle ne se relancera plus automatiquement ; vous pourrez la rejouer à tout moment depuis le menu Aide.`,"tours.home.title":`S'orienter`,"tours.home.list.title":`Workspaces`,"tours.home.list.description":`Chaque mission vit ici avec son statut. Les badges signalent une CI en échec, une review demandant des changements ou une PR prête à merger.`,"tours.home.create.title":`Créer un workspace`,"tours.home.create.description":`Un workspace, c'est un worktree Git, une branche et une session d'agent pour une tâche.`,"tours.home.search.title":`Recherche`,"tours.home.search.description":`Filtrez la liste par nom. L'icône de recherche en haut ouvre la recherche plein texte dans les conversations des agents.`,"tours.home.dashboard.title":`Tableau de bord`,"tours.home.dashboard.description":`Un tableau pour tous les workspaces actifs : statut, attention, PR, diff, activité, plus la fiabilité des moteurs.`,"tours.home.health.title":`Santé et changelog`,"tours.home.health.description":`Vérifiez la base de données, les runtimes et les agents actifs. Le bouton voisin liste ce qui a changé à chaque version.`,"tours.home.settings.title":`Paramètres`,"tours.home.settings.description":`Moteurs, intégrations, automatisation, worktrees et projets. Créez maintenant votre premier workspace.`,"tours.create.title":`Créer un workspace`,"tours.create.project.title":`Projet et branche`,"tours.create.project.description":`Choisissez le projet et la branche de départ du worktree.`,"tours.create.mission.title":`Mission`,"tours.create.mission.description":`Décrivez la tâche, ou importez-la depuis une page Notion ou une issue Sentry.`,"tours.create.template.title":`Templates`,"tours.create.template.description":`Appliquez un preset enregistré, ou enregistrez ce formulaire comme preset. « Dupliquer » sur une carte de workspace ouvre ce formulaire prérempli.`,"tours.create.engine.title":`Moteur et modèle`,"tours.create.engine.description":`Claude Code ou Codex, le modèle, l'effort de raisonnement et ce que l'agent peut faire sans demander.`,"tours.create.brainstorm.title":`Brainstorm sur un autre modèle`,"tours.create.brainstorm.description":`Lancez la première session de brainstorming sur un autre modèle, puis revenez au modèle principal pour les itérations.`,"tours.create.autoloop.title":`Auto-loop`,"tours.create.autoloop.description":`Laissez l'agent enchaîner les sessions jusqu'à ce que toutes les tâches soient faites, ou qu'il stagne.`,"tours.create.comparison.title":`Comparer deux moteurs`,"tours.create.comparison.description":`Créez deux workspaces jumeaux sur la même tâche et comparez leurs commits, tâches et activité.`,"tours.workspace.sessions.title":`Sessions du workspace`,"tours.workspace.sessions.description":`Clique sur le titre pour choisir une session, en créer une, la renommer ou retrouver son identifiant.`,"tours.workspace.actions.title":`Actions du workspace`,"tours.workspace.actions.description":`Le menu ⋯ regroupe la vue côte à côte, la palette de commandes, le panneau latéral et la visite guidée.`,"tours.workspace.title":`Dans un workspace`,"tours.workspace.chat.title":`Conversation`,"tours.workspace.chat.description":`La sortie de l'agent, en direct : messages, appels d'outils, questions et erreurs.`,"tours.workspace.input.title":`Parler à l'agent`,"tours.workspace.input.description":`Envoyez un message, utilisez les slash commands, dictez à la voix ou joignez des fichiers.`,"tours.workspace.selectors.title":`Réglages de session`,"tours.workspace.selectors.description":`Ouvre Configurer pour régler le modèle, l’effort, les permissions et l’auto-loop. Le moteur actuel y est indiqué.`,"tours.workspace.status.title":`Statut`,"tours.workspace.status.description":`L'état de la session en cours ; arrêtez-la ici si besoin.`,"tours.workspace.git.title":`Git`,"tours.workspace.git.description":`Commits, diff, push, rebase et la PR de cette branche.`,"tours.workspace.tasks.title":`Tâches`,"tours.workspace.tasks.description":`Ce que l'agent prévoit de faire, et les critères d'acceptation à respecter.`,"tours.workspace.timeline.title":`Chronologie`,"tours.workspace.timeline.description":`Toutes les sessions de ce workspace ; ouvrez-en une plus ancienne pour la relire.`,"tours.workspace.subagents.title":`Sous-agents`,"tours.workspace.subagents.description":`Suivez les sous-agents lancés par l'agent, avec leur progression en direct.`,"tours.workspace.documents.title":`Documents`,"tours.workspace.documents.description":`Plans et fichiers écrits par l'agent, consultables sans quitter le chat.`,"tours.workspace.schedule.title":`Programmation`,"tours.workspace.schedule.description":`Réveils et crons qui relancent l'agent plus tard.`,"tours.workspace.handoff.title":`Repartir avec un contexte frais`,"tours.workspace.handoff.description":`Une longue conversation ? Démarre une session fraîche ici, ou utilise « Changer de LLM ». Le travail courant est interrompu immédiatement et la nouvelle session reprend automatiquement dans le même workspace. La synthèse de passation est facultative : désactive-la si le quota du LLM actuel est épuisé. Le suivi, le rapport et le lien vers la session précédente apparaissent sous ce bouton.`,"tours.workspace.terminal.title":`Terminal`,"tours.workspace.terminal.description":`Un shell dans le worktree, sans quitter Kōbō.`,"tours.gitPr.title":`Pull request`,"tours.gitPr.panel.title":`Statut de la PR`,"tours.gitPr.panel.description":`Résultat de la CI, décision de review et reviewers, rafraîchis toutes les 30 secondes.`,"tours.gitPr.actions.title":`Actions Git`,"tours.gitPr.actions.description":`Push, pull, rebase ou changement de branche de base. Pendant un conflit, un bouton laisse l'agent le résoudre.`,"tours.gitPr.attention.title":`Badges d'attention`,"tours.gitPr.attention.description":`La carte affiche une CI en échec, des changements demandés ou une PR prête à merger.`,"tours.settings.title":`Paramètres`,"tours.settings.engines.title":`Moteurs et modèles`,"tours.settings.engines.description":`Modèles, permissions par défaut et limites de relance automatique.`,"tours.settings.integrations.title":`Intégrations`,"tours.settings.integrations.description":`Connexions Notion et Sentry, et identifiants Bitbucket. GitHub et GitLab utilisent votre connexion CLI locale.`,"tours.settings.automation.title":`Automatisation`,"tours.settings.automation.description":`Scripts de setup et de cleanup, hooks de cycle de vie, templates de prompts, templates de workspace et skills.`,"tours.settings.worktrees.title":`Worktrees`,"tours.settings.worktrees.description":`Où vivent les worktrees, combien de temps garder ceux qui sont mergés, et la purge automatique.`,"tours.settings.projects.title":`Projets`,"tours.settings.projects.description":`Les projets enregistrés et leurs surcharges par projet.`,"tours.settings.misc.title":`Général, voix, notifications, export`,"tours.settings.misc.description":`Langue, accès réseau, dictée, sons et notifications navigateur, et un export complet de vos réglages.`,"tours.dashboard.title":`Tableau de bord`,"tours.dashboard.overview.title":`Vue d'ensemble`,"tours.dashboard.overview.description":`Tous les workspaces actifs dans un tableau ; cliquez sur une ligne pour l'ouvrir.`,"tours.dashboard.reliability.title":`Fiabilité des moteurs`,"tours.dashboard.reliability.description":`Sessions, erreurs et durées par moteur et par modèle.`,"tours.health.title":`Santé`,"tours.health.checks.title":`Vérifications`,"tours.health.checks.description":`Environnement, base de données, runtimes, workspaces et sessions.`,"tours.health.active.title":`État actif`,"tours.health.active.description":`Les back-offs de quota, les réveils en attente et les auto-loops en cours en ce moment.`,"tours.search.title":`Recherche`,"tours.search.input.title":`Requête`,"tours.search.input.description":`Recherche dans les noms de workspaces et les conversations des agents.`,"tours.search.archived.title":`Archivés`,"tours.search.archived.description":`Inclure les workspaces archivés dans les résultats.`,"tours.changelog.title":`Nouveautés`,"tours.changelog.list.title":`Versions`,"tours.changelog.list.description":`Ce qui a changé à chaque version, la plus récente en premier.`,"settings.projectGroup.identity":`Identité`,"settings.projectGroup.defaults":`Valeurs par défaut`,"settings.projectGroup.prompts":`Prompts`,"settings.projectGroup.scripts":`Scripts`,"settings.projectPath":`Chemin du projet`,"settings.projectPathPlaceholder":`/chemin/vers/le/projet`,"settings.displayName":`Nom affiché`,"settings.displayNamePlaceholder":`Mon projet`,"settings.defaultSourceBranch":`Branche source par défaut`,"settings.defaultModel.project":`Modèle par défaut`,"settings.skipPermissions.project":`Ignorer les invites de permission`,"settings.prPromptTemplate.project":`Modèle de prompt PR`,"settings.prPromptPlaceholder.project":`Instructions spécifiques au projet pour la création de PR...`,"settings.reviewPromptTemplate.project":`Modèle de prompt de review`,"settings.ciFixPromptTemplate.project":`Modèle de prompt « Fix CI »`,"settings.gitConventions.project":`Conventions Git (projet)`,"settings.gitConventionsEmpty":`Laisser vide pour utiliser les conventions globales.`,"settings.notionStatus":`Statut ticket Notion`,"settings.notionStatusProperty":`Nom de la propriété`,"settings.notionStatusPropertyPlaceholder":`État, Status...`,"settings.notionInProgressStatus":`Valeur à définir`,"settings.notionInProgressStatusPlaceholder":`En cours, In progress...`,"settings.notionStatusHint":`Quand un workspace est créé avec un ticket Notion, la propriété spécifiée est mise à cette valeur. Les deux champs sont requis. Laisser vide pour désactiver.`,"settings.notionAssignee":`Assignation Notion`,"settings.notionAssigneeHint":`Quand un workspace est créé avec un ticket Notion, l'utilisateur authentifié sur le MCP Notion est ajouté à cette propriété People — uniquement si elle n'a pas déjà d'assigné. Laisser vide pour désactiver.`,"settings.notionAssigneeProperty":`Nom de la propriété`,"settings.notionAssigneePropertyPlaceholder":`Développeurs, Assignees...`,"settings.notionUserId":`Ton UUID Notion`,"settings.notionUserIdPlaceholder":`135d872b-594c-8126-9604-00024ad6e5b5`,"settings.notionUserIdHint":`Sélectionne ton compte dans la liste. Notion refuse l'assignation d'un bot — ce champ est obligatoire pour activer l'auto-assignation.`,"settings.notionUsersRefresh":`Rafraîchir`,"settings.notionUsersLoading":`Chargement des utilisateurs Notion…`,"settings.notionUsersLoadFailed":`Impossible de récupérer la liste : {error}`,"settings.notionUsersManualFallback":`Liste indisponible — colle ton UUID Notion manuellement.`,"settings.devServer":`Serveur de dev`,"settings.devServerStart":`Script de démarrage`,"settings.devServerStartPlaceholder":`npm run dev`,"settings.devServerStop":`Script d'arrêt`,"settings.devServerStopPlaceholder":`Optionnel — le processus sera tué automatiquement si vide`,"settings.selectProject":`Sélectionnez un projet ou ajoutez-en un nouveau`,"settings.useGlobal":`Utiliser le global`,"settings.saved":`Paramètres généraux enregistrés.`,"settings.unsavedChanges":`Modifications non enregistrées`,"settings.nav.general":`Général`,"settings.nav.agents":`Agents`,"settings.nav.skills":`Skills`,"settings.nav.prompts":`Prompts`,"settings.nav.scripts":`Scripts`,"settings.nav.workspaceTemplates":`Templates de workspace`,"workspaceTemplates.title":`Templates de workspace`,"workspaceTemplates.hint":`Préréglages enregistrés du formulaire de création. Choisissez-en un sur la page de création ; pour en modifier un, chargez-le là, ajustez, puis réenregistrez-le sous le même nom.`,"workspaceTemplates.empty":`Aucun template pour l'instant. Remplissez le formulaire de création et utilisez « Enregistrer comme template ».`,"workspaceTemplates.anyProject":`Tout projet`,"workspaceTemplates.rename":`Renommer`,"workspaceTemplates.renameTitle":`Renommer le template`,"workspaceTemplates.deleteConfirm":`Supprimer le template « {name} » ?`,"workspaceTemplates.deleted":`Template « {name} » supprimé`,"settings.nav.notion":`Notion`,"settings.nav.forge":`Forge`,"settings.bitbucketCommunity":`Bitbucket Community`,"settings.bitbucketCommunityHint":`Les identifiants restent locaux et sont utilisés uniquement par bkt.`,"settings.bitbucketUsername":`E-mail Atlassian`,"settings.bitbucketToken":`Token API Bitbucket`,"settings.nav.sentry":`Sentry`,"settings.nav.voice":`Voix`,"settings.nav.notifications":`Notifications`,"settings.nav.worktrees":`Worktrees`,"settings.nav.export":`Export`,"settings.help.general":`Langue, accès réseau et valeurs par défaut dont hérite chaque projet.`,"settings.help.agents":`Modèles et permissions par défaut, ainsi que les limites de relance automatique.`,"settings.help.skills":`Les suites de skills que l'agent est invité à utiliser.`,"settings.help.prompts":`Instructions des agents après ouverture d’une PR/MR, pour les revues de code, les corrections CI et la finalisation.`,"settings.help.scripts":`Scripts de setup, de nettoyage et de changement de branche source, plus les hooks de cycle de vie.`,"settings.help.notion":`Importer une page Notion comme source de vérité d'un workspace.`,"settings.help.sentry":`Créer un workspace à partir d'une issue Sentry.`,"settings.help.forge":`Identifiants Bitbucket. GitHub et GitLab utilisent vos CLI gh/glab authentifiées ; choisissez la forge par projet.`,"settings.help.voice":`Dictée et push-to-talk.`,"settings.help.notifications":`Sons, notifications navigateur et rappel des questions sans réponse.`,"settings.help.worktrees":`Où les worktrees sont créés, rétention et purge automatique.`,"settings.help.projects":`Projets enregistrés et leurs surcharges par projet.`,"settings.help.templates":`Templates de prompt développés dans la zone de saisie du chat.`,"settings.help.workspaceTemplates":`Presets enregistrés du formulaire de création.`,"settings.help.export":`Exporter et importer tous les paramètres en JSON.`,"settings.openNav":`Ouvrir la navigation`,"settings.saveError":`Erreur lors de l'enregistrement des paramètres.`,"settings.projectSaved":`Projet enregistré.`,"settings.projectSaveError":`Erreur lors de l'enregistrement du projet.`,"settings.projectDeleted":`Projet supprimé.`,"settings.deleteProjectConfirmTitle":`Supprimer le projet ?`,"settings.deleteProjectConfirmMessage":`Retirer « {name} » de vos projets ? Cela supprime uniquement ses réglages Kōbō — votre code et vos worktrees ne sont pas touchés.`,"settings.projectDeleteError":`Erreur lors de la suppression du projet.`,"settings.projectPathRequired":`Le chemin du projet est requis.`,"templates.title":`Modèles`,"templates.newTemplate":`Nouveau modèle`,"templates.editTemplate":`Modifier le modèle`,"templates.deleteTemplate":`Supprimer le modèle`,"templates.deleteConfirm":`Supprimer le modèle '/{slug}' ?`,"templates.deleteConfirmMessage":`Cette action est irréversible.`,"templates.slug":`Slug`,"templates.slugHint":`Lettres minuscules, chiffres, tirets. Max 64 caractères.`,"templates.slugInvalid":`Le slug ne peut contenir que des lettres minuscules, chiffres et tirets`,"templates.slugDuplicate":`Un modèle avec ce slug existe déjà`,"templates.description":`Description`,"templates.descriptionHint":`Libellé court affiché dans le dropdown.`,"templates.descriptionRequired":`La description est requise`,"templates.contentRequired":`Le contenu est requis`,"templates.content":`Contenu`,"templates.contentHint":`Contenu du modèle. Utilise {variable_name} pour les substitutions.`,"templates.availableVars":`Variables disponibles`,"templates.filePath":`Fichier : {path}`,"templates.empty":`Aucun modèle pour l'instant.`,"templates.createFailed":`Échec de la création du modèle`,"templates.updateFailed":`Échec de la modification du modèle`,"templates.deleteFailed":`Échec de la suppression du modèle`,"templates.save":`Enregistrer`,"templates.create":`Créer`,"templates.reloadDefaults":`Recharger les modèles par défaut`,"templates.reloadDefaultsHint":`Ajoute uniquement les modèles par défaut manquants. Les modèles existants (même modifiés) ne sont jamais écrasés.`,"templates.reloadDefaultsConfirmMessage":`Cette action ajoute les modèles par défaut absents de la liste. Les modèles existants — y compris ceux que tu as modifiés — ne seront pas touchés. Si tu veux récupérer la version d'origine d'un modèle modifié, supprime-le d'abord puis relance cette action.`,"templates.reloadDefaultsSuccess":`{added} ajouté(s), {kept} conservé(s)`,"templates.reloadDefaultsFailed":`Échec du rechargement des modèles par défaut`,"templates.resetToDefault":`Réinitialiser au défaut`,"templates.resetConfirmTitle":`Réinitialiser le template au défaut ?`,"templates.resetConfirmMessage":`Cela écrase vos modifications locales de /{slug} par le défaut intégré. Action irréversible.`,"templates.resetSuccess":`Template /{slug} réinitialisé au défaut`,"templates.resetFailed":`Échec de la réinitialisation du template`,"chatInput.dropdownSkills":`Skills Claude`,"chatInput.dropdownKobo":`Commandes Kōbō`,"chatInput.dropdownTemplates":`Modèles`,"documents.title":`Documents`,"documents.empty":`Aucun document trouvé`,"documents.refresh":`Actualiser`,"documents.back":`Retour`,"documents.loadFailed":`Échec du chargement du document`,"git.title":`Git`,"git.outputDialogTitle":`Git a signalé une erreur`,"git.statsFailed":`L’état git n’a pas pu être lu`,"git.section.repository":`Dépôt`,"git.section.changes":`Modifications`,"git.section.pullRequest":`Pull request`,"git.section.actions":`Actions`,"git.actions.more":`Plus`,"git.localOnly":`local uniquement`,"git.pushed":`pushé`,"git.unpushed":`{count} non pushé`,"git.commits":`{count} commit | {count} commits`,"git.commits.loading":`Chargement des commits…`,"git.commits.empty":`Aucun commit sur cette branche`,"git.commits.pushed":`Pushé`,"git.commits.unpushed":`Non pushé`,"git.commits.clickToAppend":`clique pour ajouter le SHA au chat`,"git.commits.diffThisCommit":`Diff de ce commit (vs parent)`,"git.compareCommits":`Comparer des commits…`,"git.files":`{count} fichier | {count} fichiers`,"git.staged":`{count} indexé`,"git.modified":`{count} modifié`,"git.untracked":`{count} non suivi`,"git.workingTreeEmpty":`Aucune modification non commitée`,"git.fileStaged":`Indexé`,"git.fileModified":`Modifié`,"git.fileUntracked":`Non suivi`,"git.push":`Push`,"git.forcePush":`Force push`,"git.forcePushToggle":`Force push (--force-with-lease)`,"git.pushBlockedByOperation":`Terminez ou abandonnez d'abord l'opération {operation} en cours`,"git.pushUpToDate":`Rien à pousser : la branche est déjà à jour sur origin`,"git.forcePushHint":`Plus sûr que --force : le push est rejeté si le remote a des commits que tu n’as pas vus. À utiliser après un rebase ou un amend de commits déjà push.`,"git.branchForcePushed":`Branche force-pushée`,"git.pull":`Pull`,"git.pullNoUpstream":`Pas d'upstream pour cette branche — push-la d'abord pour activer Pull.`,"git.sync":`Sync`,"git.createPrNoRemote":`Push la branche d'abord`,"git.viewRequest":`Voir la {request}`,"git.createRequest":`Créer une {request}`,"git.changeRequestBase":`Changer la branche cible de la {request}`,"git.forgeCliMissing":`{cli} n'est pas installé — installez-le pour les fonctions {request}`,"git.forgeNotAuthenticated":`Non authentifié — exécutez {cli} auth login`,"settings.forge":`Forge`,"settings.forge.auto":`Détection automatique`,"settings.forge.github":`GitHub`,"settings.forge.gitlab":`GitLab`,"settings.forge.bitbucketCommunity":`Bitbucket Community (bkt)`,"settings.forge.none":`Aucune`,"git.pullConfirmTitle":`Pull la branche ?`,"git.pullConfirmMessage":`Pull {branch} depuis la remote (fast-forward uniquement).`,"git.branchPulled":`Branche pull`,"git.pullFailed":`Échec du pull`,"git.renameBranch":`Renommer la branche`,"git.renameBranchPrompt":"Renommer `{branch}` en :","git.renameBranchSuccess":"Branche renommée en `{branch}`","git.renameBranchFailed":`Échec du renommage`,"git.renameBranchExists":"La branche `{branch}` existe déjà (locale ou sur origin)","git.diff":`Diff`,"git.diffReview":`Diff`,"git.diffReviewTooltip":`Ouvre le diff viewer en mode Review — commentaires inline + soumission groupée à l'agent`,"pr.baseChanged":`Base de la PR modifiée : {oldBase} → {newBase}`,"pr.openPr":`Ouvrir la PR`,"pr.openWorkspace":`Ouvrir le workspace`,"pr.dismiss":`Fermer`,"git.rebase":`Rebase`,"git.rebaseConfirmTitle":`Rebase la branche ?`,"git.rebaseConfirmMessage":`Rebase sur {branch}. Des conflits peuvent survenir.`,"git.rebaseSuccess":`Rebase terminé`,"git.rebaseFailed":`Rebase échoué`,"git.merge":`Merge`,"git.fetch":`Fetch`,"git.fetchSuccess":`Dépôt récupéré`,"git.fetchFailed":`Échec du fetch : {error}`,"git.mergeConfirmTitle":`Fusionner la branche ?`,"git.mergeConfirmMessage":`Fusionner {branch} dans cette branche. Des conflits sont possibles.`,"git.mergeSuccess":`Merge terminé`,"git.mergeFailed":`Merge échoué`,"git.commitFailed":`Commit échoué`,"git.commitChanges":`Committer les modifications`,"git.commitDialogTitle":`Committer les modifications non commitées`,"git.commitDialogDescription":`Saisissez votre message ou demandez à l’agent d’inspecter et de créer le commit.`,"git.commitMessage":`Message de commit`,"git.commitManual":`Committer`,"git.commitWithAgent":`Demander à l’agent`,"git.commitAgentSuccess":`Demande de commit envoyée à l’agent`,"git.discardFailed":`Abandon échoué`,"git.conflictTitleMerge":`Conflits de merge détectés`,"git.conflictTitleRebase":`Conflits de rebase détectés`,"git.operationPausedTitle":`Opération Git à poursuivre`,"git.operationPausedSubtitle":`Aucun fichier en conflit. Git attend simplement que tu poursuives l’opération.`,"git.conflictSubtitle":`{count} fichier(s) en conflit. Choisis comment continuer.`,"git.conflictAbortConfirmTitle":`Abandonner la résolution du conflit ?`,"git.conflictAbortConfirmMessage":`Tout ce que tu as résolu dans ce {op} est jeté et le worktree revient à son état d’avant. C’est irréversible.`,"git.conflictAbort":`Abandonner`,"git.conflictContinue":`Continuer`,"git.conflictContinued":`Opération Git poursuivie`,"git.conflictResolveWithAgent":`Demander à l'agent de résoudre`,"git.conflictAborted":`Opération abandonnée`,"git.conflictHandoffSuccess":`L'agent résout les conflits`,"git.dirtyTitleRebase":`Des modifications non commitées bloquent le rebase`,"git.dirtyTitleMerge":`Des modifications non commitées bloquent le merge`,"git.dirtyTitlePull":`Des modifications non commitées bloquent le pull`,"git.dirtySubtitle":`{modified} modifié(s), {staged} indexé(s), {untracked} non suivi(s). Choisis comment continuer.`,"git.dirtyStash":`Stash & réessayer`,"git.dirtyCommit":`Commit d'abord`,"git.dirtyCommitPlaceholder":`Message de commit`,"git.dirtyCommitConfirm":`Commit & réessayer`,"git.dirtyDiscard":`Abandonner les modifs`,"git.dirtyDiscardConfirmTitle":`Abandonner toutes les modifications non commitées ?`,"git.dirtyDiscardConfirmMessage":`Les modifications suivies seront perdues (git reset --hard). Les fichiers non suivis sont conservés. Action irréversible.`,"git.pushConfirmTitle":`Pusher la branche ?`,"git.pushConfirmMessage":`Pusher {branch} vers le dépôt distant.`,"git.pushConfirmMessagePrefix":`Pusher la branche`,"git.pushConfirmMessageSuffix":`vers le dépôt distant.`,"git.changePrBaseTitle":`Changer la branche cible`,"git.changePrBaseMessage":`Entrez la nouvelle branche cible pour la {request}.`,"git.changePrBaseSuccess":`Branche cible de la {request} mise à jour`,"git.changePrBaseFailed":`Impossible de changer la branche cible de la {request}`,"git.mergeRequest":`Fusionner la {request}`,"git.mergeRequestConfirmTitle":`Fusionner la {request} ?`,"git.mergeRequestConfirmMessage":`Cette action fusionne la {request} ouverte dans sa branche cible.`,"git.mergeRequestSuccess":`{request} fusionnée`,"git.mergeRequestFailed":`Impossible de fusionner la {request}`,"git.deleteRemoteBranch":`Supprimer la branche distante`,"git.deleteRemoteBranchTitle":`Supprimer la branche distante ?`,"git.deleteRemoteBranchMessage":`La demande a été fusionnée. Supprimer la branche distante {branch} ?`,"git.deleteRemoteBranchSuccess":`Branche distante {branch} supprimée`,"git.deleteRemoteBranchFailed":`Impossible de supprimer la branche distante`,"git.changeSourceBranch":`Changer la branche source`,"git.changeSourceBranchTitle":`Changer la branche source`,"git.changeSourceBranchMessage":`Choisis la nouvelle branche source. La branche de travail sera reconstruite par-dessus.`,"git.changeSourceBranchDone":`Branche source changée vers {branch}`,"git.changeSourceBranchAligned":`Branche source changée vers {branch} (la branche n'avait aucun commit propre)`,"git.changeSourceBranchTooMany":`La branche a trop de commits propres ({n}) — rebase-la manuellement`,"git.changeSourceBranchDirty":`Commit ou stash tes changements avant de changer la branche source`,"git.changeSourceBranchAgentRunning":`Arrête l'agent avant de changer la branche source`,"git.changeSourceBranchErrorTitle":`Échec du changement de branche source`,"git.changeSourceBranchErrorOngoing":`Une opération {op} est encore en cours sur le worktree. Annule-la pour revenir à un état propre.`,"git.changeSourceBranchErrorAbort":`Annuler l'opération`,"git.changeSourceBranchLoading":`Changement de la branche source…`,"git.changeSourceForcePushTitle":`Force-push de la branche réécrite ?`,"git.changeSourceForcePushMessage":`L'historique de la branche a été réécrit. La force-pusher vers le remote avec --force-with-lease ?`,"git.changeSourceForcePushDone":`Branche force-pushée`,"git.openEditor":`Ouvrir dans l'éditeur`,"git.openEditorFailed":`Impossible d'ouvrir l'éditeur`,"git.branchPushed":`Branche pushée`,"git.pushFirst":`La branche n'est pas sur le dépôt distant. Cliquez d'abord sur Push.`,"git.unpushedCommits":`Les commits locaux ne sont pas pushés. Cliquez d'abord sur Push.`,"git.from":`depuis`,"git.aheadBehindTooltip":`{ahead} commits en avance, {behind} en retard sur {source}`,"git.divergence.title":`Divergence de branche`,"git.divergence.subtitle":`vs {source}`,"git.divergence.ahead":`↑ {count} en avance`,"git.divergence.behind":`↓ {count} en retard`,"git.divergence.empty.ahead":`Aucun commit en avance.`,"git.divergence.empty.behind":`Aucun commit en retard.`,"git.divergence.close":`Fermer`,"git.divergence.loading":`Chargement des commits…`,"git.divergence.failed":`Échec du chargement de la divergence`,"git.divergence.retry":`Réessayer`,"git.prCreated":`{request} #{n} créée`,"git.pr.author":`Auteur`,"git.pr.reviewers":`Relecteurs`,"git.pr.assignees":`Assignés`,"git.pr.labels":`Labels`,"git.pr.changesRequestedBadge":`Modifications demandées`,"git.pr.approvedBadge":`Approuvée`,"git.pr.ci.passed":`CI OK`,"git.pr.ci.failed":`CI en échec`,"git.pr.ci.pending":`CI en cours`,"git.pr.ci.failedCount":`{n} en échec`,"git.pr.ci.pendingCount":`{n} en cours`,"git.pr.ci.passedCount":`{n} OK`,"git.pr.ci.skippedCount":`{n} ignoré(s)`,"git.pr.ci.showPassed":`Afficher les {n} jobs réussis`,"git.pr.ci.hidePassed":`Masquer les jobs réussis`,"toast.prChangesRequested":`Des modifications ont été demandées sur la PR #{n}`,"toast.prApproved":`La PR #{n} a été approuvée`,"toast.prReadyToMerge":`La PR #{n} est prête à merger`,"toast.prCiFailed":`La CI de la PR #{n} est en échec`,"toast.prCiRecovered":`La CI de la PR #{n} est rétablie`,"toast.prMergeConflict":`La PR #{n} a un conflit de merge`,"toast.prMerged":`La PR #{n} a été mergée`,"devServer.title":`Serveur de dev`,"devServer.noWorkspace":`Aucun espace de travail sélectionné`,"devServer.notConfigured":`Non configuré —`,"devServer.goToSettings":`Paramètres`,"devServer.logs":`Logs`,"devServer.running":`En cours`,"devServer.starting":`Démarrage`,"devServer.stopping":`Arrêt`,"devServer.error":`Erreur`,"devServer.stopped":`Arrêté`,"devServer.unknown":`Inconnu`,"devServer.containers":`{count} conteneur | {count} conteneurs`,"devServer.logDialog.title":`Logs du serveur de dev`,"devServer.logDialog.empty":`Aucun log disponible`,"notion.title":`Notion`,"tasks.title":`Tâches`,"notion.addTask":`Ajouter une tâche`,"notion.noUrl":`Aucune URL Notion`,"notion.subtasks":`{done}/{total} sous-tâches`,"notion.noTasks":`Aucune tâche`,"notion.newTask":`Nouvelle tâche... (Entrée pour ajouter, Échap pour annuler)`,"acceptance.title":`Critères d'acceptation`,"acceptance.addCriterion":`Ajouter un critère`,"acceptance.newCriterion":`Nouveau critère... (Entrée pour ajouter, Échap pour annuler)`,"acceptance.empty":`Aucun critère d'acceptation`,"tasks.askProgress":`Demander à l'agent de vérifier sa progression`,"agentTodos.title":`Todos de l'agent`,"agentTodos.empty":`Aucun todo de l'agent`,"subagents.title":`Sub-agents`,"subagents.empty":`Aucune activité de sub-agent`,"subagents.tools":`{count} outils`,"subagents.running":`En cours : `,"stats.resetsAt":`Reset {value}`,"stats.usageBucket":`Quota {n}`,"quotaFooter.lastUpdated":`Dernière mise à jour : {time}`,"quotaFooter.empty":`Chargement…`,"quotaFooter.popover.title":`Utilisation Claude Code`,"quotaFooter.popover.refreshNow":`Rafraîchir`,"quotaFooter.popover.resetsIn":`Réinitialise à {value}`,"quotaFooter.popover.unauthenticated":`Auth requise`,"quotaFooter.popover.unauthenticatedHint":`Lancez "claude" une fois pour vous authentifier.`,"quotaFooter.popover.error":`Erreur`,"quotaFooter.bucket.fiveHour":`5 heures`,"quotaFooter.bucket.sevenDay":`7 jours`,"agent.error.spawn_failed":`Échec du lancement de l'agent`,"agent.error.parse_error":`Impossible d'analyser un message de l'agent`,"agent.error.rate_limit":`Limite de débit atteinte`,"agent.error.resume_failed":`Session introuvable — démarrage en session fraîche`,"agent.error.other":`Erreur de l'agent`,"quotaBackoff.banner.title":`Reprise auto à {time}`,"quotaBackoff.banner.transientTitle":`Reprise auto après interruption à {time}`,"quotaBackoff.resumeNow":`Reprendre maintenant`,"quotaBackoff.banner.tooltip":`Quota Claude épuisé. L'auto-loop reprendra automatiquement quand le quota se libère à {resets_at}.`,"quotaBackoff.banner.cancel":`Annuler la reprise`,"quotaBackoff.cancelled":`Reprise auto annulée — tu peux relancer manuellement à tout moment`,"rateLimitType.fiveHour":`Session 5h`,"rateLimitType.sevenDay":`Hebdo`,"tooltip.addTask":`Ajouter une tâche`,"tooltip.removeTask":`Supprimer la tâche`,"tooltip.addCriterion":`Ajouter un critère`,"tooltip.removeCriterion":`Supprimer le critère`,"tooltip.startDevServer":`Démarrer le serveur de dev`,"tooltip.stopDevServer":`Arrêter le serveur de dev`,"tooltip.closeDiffViewer":`Fermer le diff`,"tooltip.refreshLogs":`Actualiser les logs`,"tooltip.closeDialog":`Fermer`,"tooltip.refreshGitStats":`Actualiser les stats Git`,"tooltip.removeImage":`Supprimer l'image`,"tooltip.sendMessage":`Envoyer le message`,"tools.title":`Outils`,"tools.runSetupScript":`Relancer le script de setup`,"tools.runSetupScriptTooltip":`Exécuter le script de setup du projet dans le worktree`,"tools.runSetupScriptConfirm":`Relancer le script de setup dans cette tâche ? Les artefacts existants peuvent être écrasés.`,"tools.runSetupScriptBusy":`Impossible de relancer le setup pendant que l'agent travaille.`,"tools.noSetupScript":`Aucun script de setup configuré —`,"tools.setupScriptSuccess":`Script de setup terminé avec succès.`,"tools.setupScriptFailed":`Échec du script de setup.`,"tools.openNotion":`Ouvrir dans Notion`,"tools.openSentry":`Ouvrir dans Sentry`,"tools.review":`Reviewer les changes`,"tools.reviewTooltip":`Demander à l'agent de reviewer les changes de cette branche`,"tools.reviewBusy":`Agent occupé — attends qu'il soit idle`,"tools.fixCi":`Réparer la CI`,"tools.fixCiTooltip":`Demander à l'agent de diagnostiquer et corriger les jobs CI en échec`,"tools.fixCiLaunched":`Action « Fix CI » envoyée à l'agent`,"tools.fixCiFailed":`Échec du lancement de l'action « Fix CI »`,"tools.openFileManager":`Ouvrir dans l'explorateur de fichiers`,"tools.openFileManagerTooltip":`Ouvrir le dossier du worktree dans votre explorateur de fichiers configuré`,"tools.openFileManagerFailed":`Échec de l'ouverture de l'explorateur de fichiers`,"tools.openTerminal":`Ouvrir dans un terminal`,"tools.openTerminalTooltip":`Ouvrir le worktree dans le terminal configuré`,"tools.openTerminalFailed":`Échec de l'ouverture du terminal`,"review.title":`Lancer une review`,"review.subtitle":`Demande à l'agent de reviewer tes changes et de te faire des retours.`,"review.additionalInstructions":`Instructions supplémentaires (optionnel)`,"review.additionalInstructionsPlaceholder":`Ajoute des instructions spécifiques pour la review…`,"review.newSession":`Nouvelle session`,"review.newSessionHint":`Démarre une nouvelle session d'agent au lieu de continuer la courante.`,"review.newSessionRequired":`Une nouvelle session est nécessaire pour changer les réglages de l’agent ou revenir automatiquement.`,"review.returnToSession":`Revenir à la session actuelle après la review`,"review.returnToSessionHint":`Reprend cette session avec le résumé final du reviewer. Sinon, la conversation continue dans la session de review.`,"review.readOnlyForced":`Une review qui revient à cette session tourne en lecture seule (Plan) : elle ne peut ni modifier de fichiers ni poser de questions.`,"review.returnUnavailable":`La session actuelle doit avoir démarré pour pouvoir être reprise.`,"review.start":`Lancer la review`,"review.cancel":`Annuler`,"review.launched":`Review lancée`,"review.failed":`Échec du lancement de la review`,"diff.title":`Diff`,"diff.side":`Côte à côte`,"diff.inline":`En ligne`,"diff.hideUnchanged":`Masquer le code inchangé`,"diff.showUnchanged":`Afficher le code inchangé`,"diff.showUntracked":`Afficher les fichiers non suivis`,"diff.hideUntracked":`Masquer les fichiers non suivis`,"diff.rollbackToRemote":`Revenir à la version distante`,"diff.rollbackConfirm":`Restaurer {path} à sa version distante (origin) ? Les modifications locales sur ce fichier seront perdues.`,"diff.rollbackConfirmOk":`Rollback`,"diff.rollbackDone":`Fichier restauré à la version distante`,"diff.rollbackDoneRemote":`Fichier restauré à la version distante`,"diff.rollbackDoneHead":`Modifications locales annulées (fichier restauré au dernier commit)`,"diff.rollbackDoneDeleted":`Fichier non suivi supprimé`,"diff.deleteUntracked":`Supprimer le fichier non suivi`,"diff.deleteUntrackedConfirm":`Supprimer définitivement {path} ? Ce fichier n'est pas suivi par git — son contenu sera perdu.`,"diff.deleteUntrackedConfirmOk":`Supprimer`,"diff.rollbackFailed":`Échec du rollback`,"diff.rollbackFailedDetail":`Échec du rollback : {error}`,"diff.modeInspect":`Édition`,"diff.modeReview":`Review`,"diff.addComment":`Ajouter un commentaire`,"diff.replyComment":`Répondre`,"diff.editComment":`Modifier`,"diff.deleteComment":`Supprimer`,"diff.deleteCommentConfirm":`Supprimer ce commentaire ?`,"diff.commentPlaceholder":`Écris un commentaire de revue… (Markdown accepté)`,"diff.reviewDraft":`Brouillon de revue`,"diff.reviewEmpty":`Aucun commentaire — survole une ligne dans le diff et clique + pour en ajouter un.`,"diff.reviewGlobalPlaceholder":`Ajoute un message global de revue (optionnel)`,"diff.submitReview":`Soumettre la revue ({n})`,"diff.reviewPending":`Une revue est déjà en cours d’envoi.`,"diff.reviewEmptySubmission":`La revue est vide.`,"diff.reviewNotAccepted":`Le message n’a pas été accepté. Votre revue a été conservée.`,"diff.reviewSubmitted":`Revue soumise à l'agent`,"diff.reviewSubmitFailed":`Échec de la soumission : {error}`,"diff.scopeBranch":`Branche`,"diff.scopeUnpushed":`Non pushé`,"diff.noChanges":`Aucun changement`,"diff.searchFiles":`Rechercher des fichiers…`,"diff.noFileMatch":`Aucun fichier correspondant`,"diff.selectFile":`Sélectionnez un fichier pour voir le diff`,"diff.fileLoadFailed":`Ce diff n’a pas pu être chargé`,"diff.fileLoadFailedHint":`Le fichier sur le disque est intact — seul le chargement du diff a échoué.`,"diff.fileListLoadFailed":`La liste des fichiers n’a pas pu être chargée`,"diff.fileListLoadFailedHint":`Il s’agit d’un échec de requête, pas d’une branche sans modification.`,"diff.addToChat":`Ajouter au chat`,"diff.compareTitle":`Comparer des commits`,"diff.compareFrom":`De`,"diff.compareTo":`À`,"diff.compareSubmit":`Comparer`,"diff.compareSourceBase":`{branch} (base de la branche)`,"diff.commitsReadOnly":`lecture seule`,"diffViewer.save":`Enregistrer`,"diffViewer.savedAt":`Enregistré`,"diffViewer.saveFailed":`Échec de l’enregistrement`,"diffViewer.saveFailedDetail":`Échec de l’enregistrement : {error}`,"diffViewer.unsavedChanges.title":`Modifications non enregistrées`,"diffViewer.unsavedChanges.message":`Tu as des modifications non enregistrées. Que veux-tu faire ?`,"diffViewer.unsavedChanges.save":`Enregistrer`,"diffViewer.unsavedChanges.cancel":`Annuler`,"diffViewer.conflict.title":`Fichier modifié sur le disque`,"diffViewer.conflict.message":`Le fichier a été modifié hors de Kōbō depuis que tu l’as ouvert.`,"diffViewer.conflict.reload":`Recharger (perdre les modifs locales)`,"diffViewer.conflict.keep":`Garder les miennes`,"diffViewer.conflict.overwrite":`Écraser quand même`,"diffViewer.conflict.overwriteHint":`Remplace le fichier sur le disque par ta version. L’autre modification est perdue.`,"diffViewer.conflict.keepHint":`Garde tes modifications dans l’éditeur et adopte la nouvelle signature du disque, pour que la prochaine sauvegarde fonctionne.`,"diffViewer.saveBlocked":`L’agent tourne — arrête-le pour enregistrer tes modifications.`,"diffViewer.unsavedBanner":`Modifications non enregistrées. Arrête l’agent pour les sauvegarder.`,"diffViewer.closeConfirm.title":`Modifications non enregistrées`,"diffViewer.closeConfirm.message":`Ce fichier contient des modifications jamais enregistrées. Fermer le visualiseur de diff les perdra.`,"diffViewer.closeConfirm.discard":`Fermer sans enregistrer`,"diffViewer.criteriaRail":`Checklist de revue`,"diffViewer.criteriaRailShow":`Afficher la checklist de revue`,"diffViewer.criteriaRailHide":`Masquer la checklist de revue`,"diffViewer.fileTreeShow":`Afficher l’arbre des fichiers`,"diffViewer.fileTreeHide":`Masquer l’arbre des fichiers`,"diffViewer.closeConfirm.saveAndClose":`Enregistrer et fermer`,"diffViewer.agentRunning":`L’agent tourne — arrête-le pour éditer`,"diffViewer.fileDeleted":`Fichier supprimé`,"notification.agentFinished":`{name} — Agent terminé`,"notification.agentQuestion":`{name} — L'agent te pose une question`,"notification.awaitingReminder":`{name} - attend toujours votre réponse ({minutes} min)`,"notification.agentPermissionRequest":`{name} — L'agent demande une permission`,"notification.autoLoopCompleted":`{name} — Auto-loop terminé`,"notification.autoLoopWaitingForSlot":`{name} - L'auto-loop attend un slot d'agent libre ({running}/{limit} en cours)`,"notification.autoLoopStalled":`{name} — Auto-loop bloqué (aucun progrès)`,"notification.autoLoopError":`{name} — Auto-loop arrêté sur erreur`,"notification.autoLoopAwaitingClarification":`{name} — Auto-loop en pause, en attente de votre précision`,"notification.autoLoopPermissionOverridden":`{name} — Auto-loop a forcé le mode plan en bypass`,"notification.agentError":`{name} — Erreur agent`,"contextMenu.rename":`Renommer`,"contextMenu.editDescription":`Modifier la description`,"contextMenu.copyPath":`Copier le chemin du worktree`,"contextMenu.openEditor":`Ouvrir dans l'éditeur`,"contextMenu.openFileManager":`Ouvrir dans l'explorateur de fichiers`,"contextMenu.unarchiveDisabledPurged":`Restaurez d’abord le worktree avec Restaurer le worktree, ou recréez-le manuellement. Kōbō détecte automatiquement les worktrees correspondants.`,"workspaceList.unarchiveBlockedPurged":`Restaurez d’abord le worktree avec Restaurer le worktree, ou recréez-le manuellement. Kōbō détecte automatiquement les worktrees correspondants.`,"contextMenu.purgeWorktree":`Libérer l'espace disque (supprimer le worktree)`,"contextMenu.purgeWorktreeTooltip":`Supprime le worktree du disque pour récupérer de l'espace — l'historique des messages et sessions est conservé. Archive automatiquement le workspace.`,"contextMenu.purgeWorktreeDialogTitle":`Libérer l'espace disque ?`,"contextMenu.purgeWorktreeDialogMessage":`Le dossier worktree de « {name} » va être supprimé du disque. L'historique des messages et sessions est conservé. Le workspace sera archivé automatiquement. Cette action ne peut pas être annulée dans la version actuelle.`,"contextMenu.purgeWorktreeDialogConfirm":`Supprimer le worktree`,"contextMenu.purgeWorktreeSuccess":`Worktree supprimé — espace disque récupéré.`,"settings.autoPurgeOnPrMerged":`Purger le worktree quand la PR est mergée`,"settings.autoPurgeOnPrMergedHint":`Quand activé, le worktree est supprimé du disque dès que la PR est mergée (en plus de l'archivage auto). L'historique des messages est conservé.`,"settings.autoLoopMaxRetries":`Nombre maximal de nouvelles tentatives`,"settings.awaitingUserReminder":`Rappel de question sans réponse`,"settings.awaitingUserReminderHint":`Minutes pendant lesquelles un workspace peut attendre votre réponse avant que Kōbō ne vous relance, puis à chaque intervalle suivant. 0 désactive.`,"settings.localeLoadFailed":`Impossible de charger cette langue ; la langue actuelle est conservée.`,"settings.autoLoopMaxRetriesHint":`Met la mission en pause après ce nombre de pannes temporaires du moteur ou du serveur. Les quotas attendent leur réinitialisation sans consommer cette limite.`,"settings.retentionTitle":`Rétention de l'historique de conversation (désactivée par défaut)`,"settings.retentionWarning":`Activer cette option supprime définitivement de la base l'historique de conversation des agents, à commencer par tout ce qui est déjà plus vieux que la fenêtre. Les événements supprimés sont irrécupérables.`,"settings.retentionHint":`Exécutée une fois au démarrage du serveur. Les workspaces, tâches, sessions, branches et worktrees ne sont jamais touchés — seule la sortie enregistrée des agents l'est.`,"settings.retentionDaysLabel":`Supprimer les événements plus vieux que (jours)`,"settings.retentionDaysHint":`0 — la valeur par défaut — conserve tous les événements indéfiniment. Renseignez une valeur pour activer la rétention.`,"settings.retentionKeepLabel":`Événements toujours conservés par workspace`,"settings.retentionKeepHint":`Les événements les plus récents de chaque workspace survivent quel que soit leur âge, pour qu'un workspace ancien mais toujours ouvert garde un historique lisible. Suggéré : 5000.`,"settings.retentionDisabledHint":`Rétention désactivée : rien ne sera jamais supprimé.`,"settings.retentionConfirmTitle":`Supprimer définitivement de l'historique de conversation ?`,"settings.retentionConfirmMessage":`Ne conserver que {days} jour(s) d'historique supprimera définitivement, au prochain démarrage du serveur, {count} des {total} événements d'agent enregistrés — y compris tout ce qui est déjà plus ancien. C'est irréversible. Continuer ?`,"settings.retentionConfirmMessageUnknown":`Ne conserver que {days} jour(s) d'historique supprimera définitivement, au prochain démarrage du serveur, tous les événements d'agent plus anciens — y compris tout ce qui est déjà accumulé. Le volume exact n'a pas pu être calculé. C'est irréversible. Continuer ?`,"settings.purgeDocsTitle":`Comment ça marche — restauration & permissions`,"settings.purgeDocsRestoreTitle":`Restaurer un worktree purgé (détection automatique)`,"settings.purgeDocsRestoreIntro":`Un workspace purgé conserve son historique de chat et les métadonnées de la PR, mais le dossier worktree n'existe plus. Recrée-le manuellement avec l'une de ces commandes — Kōbō détecte la réapparition du dossier dans les 30 secondes et réactive automatiquement le workspace (désarchive + clear flag purge) :`,"settings.purgeDocsRestoreCommands":`# GitHub (via le CLI gh) :
|
|
12
12
|
gh pr checkout [numéro-pr] --recurse-submodules
|
|
13
13
|
|
|
14
14
|
# Ou directement via git (fonctionne sur GitHub même après suppression de la branche) :
|
|
15
15
|
git fetch origin pull/[numéro-pr]/head:[nom-branche]
|
|
16
16
|
git worktree add [chemin] [nom-branche]`,"settings.purgeDocsRestoreFootnote":`GitHub conserve la ref HEAD de la PR bien après la suppression de la branche source (mois / années). L'auto-détection tourne dans le watcher 30s — pas besoin d'action dans l'UI une fois le dossier recréé.`,"settings.purgeDocsPermissionsTitle":`Éviter les erreurs de permissions pendant la suppression`,"settings.purgeDocsPermissionsIntro":`Docker laisse souvent des fichiers root-owned dans node_modules / vendor à l'intérieur du worktree. Quand Kōbō essaie de les supprimer, tu tombes sur EACCES / EPERM et la purge échoue. Deux moyens de prévenir :`,"settings.purgeDocsPermissionsDocker":'Configurer ton conteneur pour qu\'il tourne sous ton utilisateur hôte — directive USER dans le Dockerfile, ou `user: "${UID}:${GID}"` dans docker-compose (avec UID/GID exportés dans ton shell).',"settings.purgeDocsPermissionsAcl":`Pré-définir un ACL par défaut sur la racine des worktrees — filet de sécurité qui marche dans la PLUPART des cas (ext4/btrfs/xfs + bind mount Docker classique). Chaque nouveau fichier hérite alors d'une entrée d'accès pour ton user, en plus du propriétaire nominal :`,"settings.purgeDocsPermissionsAclCommand":` setfacl -d -m u:$(whoami):rwX [racine-worktrees]`,"settings.purgeDocsPermissionsFootnote":"Limites des ACL : ne marchent PAS sur les volumes Docker nommés (utilise un bind mount), filesystems sans support ACL (NTFS, exFAT, tmpfs), SELinux strict avec `:Z`, ou `userns-remap` Docker activé. La solution la plus fiable reste de configurer le user dans le conteneur (option 1). Astuce : `rwX` (X majuscule) n'ajoute le bit exécutable qu'aux dossiers et fichiers déjà exécutables — plus propre que `rwx` qui rendrait exécutables tous les fichiers texte.","settings.purgeDocsPermissionsRecoverTitle":`Débloquer un worktree déjà cassé (fichiers root-owned existants)`,"settings.purgeDocsPermissionsRecoverIntro":`Si tu te retrouves avec un worktree déjà rempli de fichiers root-owned (Docker a déjà tourné, vendor / node_modules sont coincés), les ACL préventives ci-dessus ne suffisent pas — il faut traiter les fichiers EXISTANTS. Deux approches, à exécuter dans le dossier du worktree :`,"settings.purgeDocsPermissionsRecoverAclIntro":`Option A — ACL récursive (préserve l'ownership root pour audit, t'ajoute juste un accès en parallèle) :`,"settings.purgeDocsPermissionsRecoverAclCommand":`# pose l'ACL par défaut pour les futurs fichiers ET donne accès à tout l'existant
|
|
17
|
-
sudo setfacl -Rd -m u:$(whoami):rwX . && sudo setfacl -R -m u:$(whoami):rwX .`,"settings.purgeDocsPermissionsRecoverChownIntro":`Option B — Reprendre la propriété (plus simple, perd l'info "créé par root dans le conteneur" mais osef en pratique) :`,"settings.purgeDocsPermissionsRecoverChownCommand":` sudo chown -R $(whoami):$(whoami) .`,"settings.purgeDocsPermissionsRecoverFootnote":"Astuce : tu peux exécuter ces commandes directement sur la racine de tes worktrees (ex. `~/.worktrees/`) pour couvrir tous les workspaces existants ET futurs d'un seul coup. Une fois fait, la purge Kōbō fonctionnera sans erreur de permission.","contextMenu.runSetup":`Lancer le script de setup`,"contextMenu.exportEvents":`Exporter les events (CSV)`,"contextMenu.dismissChangesRequested":`Marquer « Modifications demandées » comme vu`,"contextMenu.dismissCiFailure":`Marquer « CI en échec » comme vu`,"contextMenu.restoreChangesRequested":`Marquer « Modifications demandées » comme non vu`,"contextMenu.restoreCiFailure":`Marquer « CI en échec » comme non vu`,"contextMenu.exportingEvents":`Préparation de l'export…`,"contextMenu.exportEventsError":`Échec de l'export des events`,"contextMenu.openNotion":`Ouvrir dans Notion`,"contextMenu.openSentry":`Ouvrir dans Sentry`,"contextMenu.openPr":`Ouvrir la PR`,"contextMenu.ignorePrWatch":`Ignorer les checks PR`,"contextMenu.resumePrWatch":`Réactiver les checks PR`,"contextMenu.prWatchToggleFailed":`Échec de la mise à jour des checks PR`,"workspace.favorite":`Ajouter aux favoris`,"workspace.unfavorite":`Retirer des favoris`,"workspace.showFavoritesOnly":`Afficher uniquement les favoris`,"workspace.searchArchivedToggle":`Inclure les workspaces archivés dans la recherche`,"workspace.descriptionPlaceholder":`Ajouter une courte description`,"workspace.descriptionDialogHint":`Texte brut, 200 caractères maximum. Laisser vide pour effacer.`,"workspace.descriptionTooLong":`La description doit faire 200 caractères ou moins.`,"workspace.descriptionSaveFailed":`Échec de l'enregistrement de la description.`,"workspace.agentDescriptionTooltip":`État en direct maintenu par l'agent`,"mcp.tool.setWorkspaceDescription":`Définit la courte description du workspace (≤ 200 caractères).`,"tags.manage":`Gérer les tags`,"tags.manageTitle":`Gérer les tags du workspace`,"tags.noTagsDefined":`Aucun tag défini. Ajoutes-en dans Paramètres > Global > Tags.`,"tags.orphanedHint":`{count} tag(s) ne sont plus dans le catalogue global. Décoche-les pour les retirer.`,"settings.tagsTitle":`Tags des workspaces`,"settings.tagsHint":`Définis les tags assignables aux workspaces. Tape pour ajouter, clique la croix pour retirer.`,"settings.tagsLabel":`Tags disponibles`,"settings.branchPrefixesTitle":`Préfixes de branche`,"settings.branchPrefixesHint":`Gérez les préfixes de branche Git disponibles sur la page de création. Le premier est présélectionné par défaut.`,"settings.branchPrefixesEmpty":`Aucun préfixe de branche défini. Ajoutez-en au moins un ci-dessous.`,"settings.branchPrefixesAddLabel":`Nouveau préfixe`,"settings.branchPrefixesEditHint":`Cliquer pour renommer`,"settings.branchPrefixesMoveUp":`Monter`,"settings.branchPrefixesMoveDown":`Descendre`,"settings.worktreesTitle":`Worktrees Git`,"settings.worktreesHint":`Choisis où créer les worktrees des nouveaux workspaces. Les chemins relatifs sont résolus depuis le projet ; les chemins absolus Linux/macOS et Windows, $HOME, ~ et %USERPROFILE% sont supportés.`,"settings.worktreesPathLabel":`Chemin des worktrees`,"settings.worktreesPathRequired":`Le chemin des worktrees est requis.`,"settings.worktreesPrefixByProject":`Préfixer les worktrees par le nom du projet`,"settings.worktreesPrefixByProjectHint":`Place chaque worktree dans un sous-dossier nommé d'après le projet, pour éviter les collisions quand plusieurs projets partagent la même racine.`,"settings.shareTitle":`Partager la configuration`,"settings.shareHint":`Exporte tes paramètres, templates et tags en bundle JSON. Les clés MCP sont retirées à l’export pour la sécurité.`,"settings.exportConfig":`Exporter`,"settings.importConfig":`Importer`,"settings.exportSuccess":`Configuration exportée`,"settings.importSuccess":`Configuration importée`,"settings.importConfirmTitle":`Importer la configuration`,"settings.importConfirmMessage":`Cela remplacera tes paramètres, templates et tags actuels. Tes clés MCP seront conservées. Continuer ?`,"settings.mcp.title":`Connexions des LLM externes (MCP)`,"settings.mcp.hint":`Connectez un client MCP pour lire les conversations, envoyer des messages et répondre aux questions des workspaces.`,"settings.mcp.remoteDisabled":`Les connexions distantes nécessitent l’accès réseau et un redémarrage du serveur après son activation.`,"settings.mcp.clientName":`Nom du client (facultatif)`,"settings.mcp.connection":`Connexion`,"settings.mcp.local":`HTTP local`,"settings.mcp.remote":`HTTP distant`,"settings.mcp.proxy":`Proxy inverse`,"settings.mcp.stdio":`Stdio local`,"settings.mcp.copyUrl":`Copier l’URL`,"settings.mcp.copyConfig":`Copier la configuration`,"settings.mcp.copyWithToken":`Copier avec le jeton`,"settings.mcp.genericFormat":`Ces exemples utilisent le format générique mcpServers. Adaptez le conteneur à votre client MCP. Les aperçus affichent un emplacement réservé au jeton.`,"settings.mcp.tokenUnavailable":`Aucun jeton disponible. Activez l’accès réseau avant de copier une configuration authentifiée.`,"settings.mcp.stdioUnavailable":`Le point d’entrée stdio est indisponible dans cette installation. Utilisez HTTP ou compilez Kōbō.`,"settings.mcp.copyFailed":`Impossible de copier dans le presse-papiers.`,"tours.settings.mcp.title":`Connecter un LLM externe`,"tours.settings.mcp.description":`Copiez une configuration HTTP ou stdio pour permettre à un assistant externe de communiquer avec vos workspaces.`,"settings.network.title":`Accès réseau`,"settings.network.hint":`Pilote Kōbō depuis un autre appareil de ton LAN de confiance. Off = localhost uniquement. On = accessible sur ton réseau, protégé par un token. Redémarre Kōbō après bascule.`,"settings.network.enable":`Activer l'accès réseau`,"settings.network.behindProxy":`Derrière un reverse proxy`,"settings.network.behindProxyHint":`Kōbō ne peut plus distinguer ta propre machine d'une requête relayée — même le localhost devra présenter le token désormais. N'active ceci que si un reverse proxy (Traefik, nginx, Caddy…) est devant Kōbō.`,"settings.network.restartRequired":`Redémarre Kōbō pour appliquer la nouvelle adresse de bind.`,"settings.network.token":`Token d'accès`,"settings.network.copy":`Copier`,"settings.network.copied":`Copié`,"settings.network.regenerate":`Régénérer`,"settings.network.regenerateConfirm":`Régénérer le token ? Les appareils connectés devront utiliser le nouveau token.`,"settings.network.urls":`URLs LAN`,"settings.network.scan":`Scanner pour se connecter`,"settings.network.noUrls":`Aucune adresse LAN détectée.`,"settings.network.loadFailed":`Échec du chargement des réglages d'accès réseau.`,"settings.network.updateFailed":`Échec de la mise à jour des réglages d'accès réseau.`,"settings.unsavedChanges.title":`Modifications non enregistrées`,"settings.unsavedChanges.message":`Ce projet a des modifications non enregistrées. Changer de projet les annulera.`,"settings.unsavedChanges.discard":`Ignorer et changer`,"settings.unsavedChanges.cancel":`Annuler`,"settings.loadFailed":`Les réglages n’ont pas pu être chargés`,"settings.loadFailedHint":`L’enregistrement est désactivé : le formulaire affiche les valeurs par défaut, et les écrire remplacerait votre configuration réelle.`,"health.title":`Santé`,"health.tooltip":`Santé du système`,"changelog.title":`Journal des changements`,"changelog.tooltip":`Quoi de neuf dans Kōbō`,"changelog.empty":`Aucun changelog disponible.`,"changelog.current":`actuelle`,"changelog.currentVersion":`Version actuelle : v{version}`,"health.envTitle":`Environnement`,"health.version":`Version`,"health.koboHome":`Kōbō home`,"health.dbTitle":`Base de données`,"health.dbPath":`Chemin`,"health.dbSize":`Taille`,"health.schemaVersion":`Version du schéma`,"health.settingsSchemaVersion":`Schéma settings`,"health.runtimesTitle":`Moteurs d'agent`,"health.claudeCliTitle":`Claude Code`,"health.claudeCliMissing":`claude introuvable dans le PATH`,"health.codexCliTitle":`OpenAI Codex`,"health.codexCliMissing":`binaire codex introuvable`,"health.forgeCliTitle":`CLI de forge (gh / glab)`,"health.forgeCliMissing":`Ni gh ni glab trouvés — pull requests et surveillance de CI indisponibles`,"health.workspacesTitle":`Workspaces`,"health.workspacesCount":`{total} au total, {archived} archivés`,"health.worktreesMissing":`{count} worktree(s) manquant(s) sur le disque`,"health.sessionsTitle":`Sessions agent`,"health.sessionsOrphaned":`{n} session(s) orpheline(s) marquées running`,"health.integrationsTitle":`Intégrations`,"health.integrationConfigured":`configurée`,"health.integrationMissing":`non configurée`,"health.integrationDisabled":`désactivée`,"settings.integrationEnabled":`Activer l’intégration`,"health.activeTitle":`État actif`,"health.activeQuotaBackoffs":`Quota backoffs en attente`,"health.activeWakeups":`Wakeups programmés`,"health.activeAutoLoop":`Auto-loop en cours`,"health.activeAgentSessions":`Sessions agent en cours`,"health.activeDevServers":`Serveurs de dev lancés`,"health.noneActive":`Aucun.`,"health.quotaResumeAt":`reprise à {time}`,"health.wakeupAt":`réveil à {time}`,"health.startedAgo":`démarré il y a {time}`,"health.autoLoopReady":`prêt, itération en cours`,"health.autoLoopGrooming":`grooming en cours`,"session.started":`Session démarrée`,"session.ended":`Session terminée`,"session.compacted":`Contexte compacté`,"session.endedCompleted":`Tour terminé — envoyez un message pour continuer`,"session.endedKilled":`Session arrêtée`,"session.endedError":`Session terminée sur une erreur`,"session.endedWatchdog":`Session fermée de force après une période d'inactivité`,"tool.running":`En cours...`,"activity.raw_lines":`Lignes de sortie brutes ({n})`,"activity.loading_older":`Chargement des messages plus anciens…`,"activity.compacting":`Compaction du contexte…`,"activity.prev_user_message":`Message utilisateur précédent`,"activity.scroll_to_bottom":`Défiler vers le bas`,"activity.empty":`Rien pour l’instant`,"activity.emptyHint":`La sortie de l’agent s’affichera ici dès qu’une session démarrera.`,"activity.a11y.region":`Annonces d’activité de l’agent`,"activity.a11y.agentSaid":`Agent : {text}`,"activity.a11y.toolStarted":`Outil {name} démarré`,"activity.a11y.toolFinished":`Outil {name} terminé`,"activity.a11y.toolFailed":`Outil {name} en échec`,"chat.systemPrompt":`Prompt système`,"chat.agent":`Agent`,"chat.cleanupScript":`Script de cleanup`,"chat.archiveScript":`Script d'archivage`,"chat.setupScript":`Script de setup`,"chat.hookScript":`Hook {event}`,"chat.scriptDone":`Fait`,"chat.scriptComplete":`[{phase}] Terminé`,"chat.scriptError":`[{phase}] Erreur : {message}`,"chat.unknownError":`inconnue`,"chat.you":`Vous`,"chat.session":`Session`,"chat.nActions":`{n} action | {n} actions`,"chat.lastUpdatedAt":`Dernière mise à jour à {time}`,"chat.scrollToTurnTop":`Défiler vers le haut du message`,"migration.backing_up":`Sauvegarde de la base de données…`,"migration.running":`Migration des données d'agent — {processed}/{total}`,"migration.error":`Échec de la migration`,"migration.backup_location":`Une sauvegarde a été enregistrée à {path}. Redémarre Kōbō pour réessayer.`,"migration.retry":`Redémarre Kōbō pour réessayer.`,"engine.select":`Moteur`,"engine.model":`Modèle`,"engine.effort":`Effort de réflexion`,"wakeup.scheduledIn":`Prochain réveil dans {n}s`,"wakeup.scheduledAt":`Prochain réveil à {time}`,"wakeup.firing":`Réveil en cours…`,"wakeup.reason":`Raison : {reason}`,"wakeup.cancel":`Annuler ce réveil`,"wakeup.pendingIndicator":`Réveil programmé`,"cron.pendingIndicator":`{n} cron(s) programmé(s)`,"schedule.tabLabel":`Programmation`,"schedule.admissionTitle":`Nouvelle session automatique indisponible pour le moment.`,"schedule.admissionHint":`Les échéances restent inchangées. Un message vers une conversation existante suit ses propres règles.`,"schedule.admission.not-found":`Espace introuvable.`,"schedule.admission.archived":`Espace archivé.`,"schedule.admission.purged":`Restaurez le worktree.`,"schedule.admission.shutdown":`Le serveur est en cours d’arrêt.`,"schedule.admission.lifecycle":`Une opération sur cet espace est en cours.`,"schedule.admission.active-session":`La session actuelle n’est pas encore fermée.`,"schedule.admission.awaiting-user":`Une réponse utilisateur est attendue.`,"schedule.admission.compacting":`Le contexte est en cours de compactage.`,"schedule.admission.quota":`En attente du rétablissement du quota.`,"schedule.admission.blocked":`La boucle est bloquée ; corrigez la cause indiquée.`,"schedule.admission.capacity":`Limite de concurrence atteinte : {running}/{limit} sessions.`,"schedule.panelTitle":`Automatisation`,"schedule.panelDescription":`Réveiller ce workspace plus tard ou exécuter des instructions selon un planning.`,"schedule.activeTitle":`Planifications actives`,"schedule.emptyTitle":`Aucune planification`,"schedule.emptyDescription":`Créez un réveil ponctuel ou une tâche récurrente ci-dessous.`,"schedule.cancelWakeup":`Annuler ce réveil`,"schedule.cancelCron":`Supprimer cette tâche récurrente`,"schedule.createTitle":`Créer une planification`,"schedule.createDescription":`Choisissez quand et comment l'agent doit s'exécuter.`,"schedule.typeWakeup":`Réveil ponctuel`,"schedule.typeRecurring":`Tâche récurrente`,"schedule.wakeupDescription":`Exécuter le prompt une fois après un délai.`,"schedule.cronDescription":`Exécuter le prompt régulièrement selon une fréquence fixe.`,"schedule.promptHint":`Instructions qui seront envoyées à l'agent`,"schedule.frequencyTitle":`Fréquence`,"schedule.advancedDescription":`Utiliser une expression cron brute`,"schedule.cronExpressionLabel":`Expression cron`,"schedule.sessionModeTitle":`Session d'exécution`,"schedule.modeResume":`Reprendre la session`,"schedule.oneShotHint":`Supprimer cette planification après sa première exécution.`,"schedule.wakeupTitle":`Wakeup en attente`,"schedule.cronsTitle":`Tâches récurrentes`,"schedule.noWakeup":`Aucun wakeup programmé`,"schedule.noCrons":`Aucun cron programmé`,"schedule.invalidCron":`Inactive : expression invalide. Supprimez puis recréez cette programmation.`,"schedule.nextFireAt":`prochain à {time}`,"schedule.lastFiredAt":`dernier fire il y a {time}`,"schedule.addCronTitle":`Ajouter une tâche récurrente`,"schedule.addWakeupTitle":`Programmer un réveil`,"schedule.every":`Toutes les`,"schedule.unitMinutes":`minutes`,"schedule.unitHours":`heures`,"schedule.unitDays":`jours`,"schedule.daysDriftWarning":`L'intervalle peut se réduire à 1 jour en fin de mois (limitation du format cron).`,"schedule.advancedExpression":`Expression avancée (optionnel)`,"schedule.advancedHint":`Cron brut (ex. */15 * * * *) ou {'@'}hourly/{'@'}daily — remplace le sélecteur si rempli.`,"schedule.promptLabel":`Prompt`,"schedule.labelOptional":`Libellé (optionnel)`,"schedule.delayMinutes":`Délai (minutes)`,"schedule.modeFresh":`Nouvelle session`,"schedule.oneShot":`Une seule fois`,"schedule.addCronBtn":`Ajouter le cron`,"schedule.addWakeupBtn":`Programmer le réveil`,"schedule.cronCreated":`Tâche récurrente ajoutée`,"schedule.wakeupCreated":`Réveil programmé`,"askUserQuestion.title":`L'agent te pose une question`,"askUserQuestion.submit":`Envoyer la réponse`,"askUserQuestion.multiSelectHint":`Sélectionne une ou plusieurs options`,"askUserQuestion.otherOption":`Autre`,"askUserQuestion.otherOptionHint":`précisez dans votre prochain message`,"askUserQuestion.freeFormLabel":`Précisez votre réponse`,"askUserQuestion.freeFormHint":`Cette réponse sera envoyée directement à l'agent.`,"askUserQuestion.noPending":`Aucune question en attente`,"askUserQuestion.next":`Suivant`,"askUserQuestion.previous":`Précédent`,"askUserQuestion.cancel":`Annuler`,"askUserQuestion.cancelTooltip":`Sauter cette question — l'agent continuera sans réponse`,"askUserQuestion.collapse":`Réduire le panneau de question`,"askUserQuestion.expand":`Agrandir le panneau de question`,"permissionRequest.title":`L'agent veut utiliser un outil`,"permissionRequest.allow":`Autoriser`,"permissionRequest.allowOnce":`Autoriser une fois`,"permissionRequest.allowTurn":`Autoriser ce tour`,"permissionRequest.operationUnavailable":`Détails indisponibles ; autorisez une fois ou pour tout l’outil.`,"permissionRequest.allowOperation":`Toujours cette opération`,"permissionRequest.allowTool":`Toujours cet outil`,"permissionRequest.deny":`Refuser`,"permissionRequest.tool":`Outil`,"permissionRequest.input":`Entrée`,"permissionRequest.rawInput":`Détails techniques`,"permissionRequest.collapse":`Réduire le panneau de permission`,"permissionRequest.expand":`Agrandir le panneau de permission`,"permissionRequest.denied":`refusé par l'utilisateur`,"workspaceStatus.created":`créé`,"workspaceStatus.extracting":`extraction`,"workspaceStatus.brainstorming":`brainstorming`,"workspaceStatus.compacting":`compaction`,"chatInput.compactingBanner":`Compaction du contexte en cours. L’envoi sera disponible à la fin.`,"workspaceStatus.executing":`en cours`,"workspaceStatus.awaitingUser":`en attente de ta réponse`,"workspaceStatus.completed":`terminé`,"workspaceStatus.idle":`inactif`,"workspaceStatus.error":`erreur`,"workspaceStatus.quota":`quota atteint`,"workspaceStatus.retrying":`reprise automatique`,"workspaceList.prOpen":`#{n} — Pull request ouverte`,"workspaceList.prWatchDisabledIndicator":`Checks PR ignorés pour ce workspace`,"workspaceList.prChangesRequested":`#{n} — Modifications demandées`,"workspaceList.attentionCiFailed":`CI en échec`,"workspaceList.attentionChangesRequested":`Modifications demandées`,"workspaceList.attentionReadyToMerge":`Prêt à merger`,"autoLoop.status.active":`Active`,"autoLoop.status.waiting":`En attente`,"autoLoop.status.blocked":`Bloquée`,"autoLoop.status.completed":`Terminée`,"autoLoop.status.stopped":`Arrêtée`,"autoLoop.phase.grooming":`Préparation`,"autoLoop.phase.execution":`Exécution`,"autoLoop.phase.finalization":`Finalisation`,"autoLoop.iteration":`Itération {count}`,"autoLoop.resume":`Reprendre l’auto-loop`,"autoLoop.retryAt":`Reprise prévue le`,"autoLoop.actionFailed":`L’action n’a pas pu aboutir.`,"autoLoop.messages.count":`{count} instruction(s) en attente`,"autoLoop.messages.pending":`En attente`,"autoLoop.messages.dispatching":`Envoi en cours`,"autoLoop.messages.unknown":`Livraison incertaine`,"autoLoop.messages.delivered":`Livrée`,"autoLoop.messages.cancel":`Annuler l’instruction`,"autoLoop.messages.acknowledge":`Considérer comme reçue`,"autoLoop.messages.retry":`Renvoyer`,"autoLoop.messages.unknownHelp":`La livraison n’a pas pu être confirmée. Vérifiez la conversation avant de choisir. Renvoyer peut dupliquer une instruction déjà reçue.`,"autoLoop.reason.quota":`En attente du quota du fournisseur.`,"autoLoop.reason.transient":`Reprise après une interruption temporaire.`,"autoLoop.reason.awaiting-user":`En attente de votre réponse.`,"autoLoop.reason.capacity-or-lifecycle":`En attente d’une place disponible pour un agent.`,"autoLoop.reason.message-delivery-unknown":`Résolvez l’instruction à livraison incertaine avant de reprendre.`,"autoLoop.reason.error":`La boucle nécessite une intervention avant de continuer.`,"autoLoop.reason.stall":`Aucun progrès détecté. Consultez la dernière session avant de reprendre.`,"autoLoop.reason.awaiting-clarification":`Une précision est nécessaire avant de continuer.`,"autoLoop.toggle":`Auto-loop`,"autoLoop.start":`Démarrer l'auto-loop`,"autoLoop.prepare":`Préparer pour auto-loop`,"autoLoop.reprepare":`Re-préparer pour auto-loop`,"autoLoop.reprepareTooltip":`Relancer la phase de grooming pour ajouter ou rafraîchir les tâches avant de relancer la boucle`,"autoLoop.prepareBusy":`Attendre la fin de l'agent avant de préparer`,"autoLoop.forceReady":`Je sais ce que je fais — passer le grooming`,"autoLoop.forceReadyConfirm":`Passer le grooming et marquer auto-loop prêt ? La boucle peut stagner si les tâches ne sont pas atomiques.`,"autoLoop.stop":`Arrêter l'auto-loop`,"autoLoop.notReady":`Lancer d'abord « Préparer pour auto-loop »`,"autoLoop.noTasks":`Ajouter d'abord des tâches`,"autoLoop.progress":`Auto-loop · {done}/{total} tâches`,"autoLoop.preparing":`Auto-loop · préparation`,"autoLoop.preparingTooltip":`Grooming en cours — l'agent crée / révise les tâches. La boucle démarrera quand il appellera mark_auto_loop_ready.`,"autoLoop.running":`Auto-loop en cours`,"autoLoop.startInMode":`Démarrer en mode auto-loop`,"autoLoop.brainstormModelPrefix":`Brainstorm :`,"autoLoop.brainstormModelTooltip":`Modèle utilisé uniquement pour la session de brainstorming initiale — chaque tâche ensuite utilise le modèle choisi au-dessus`,"autoLoop.brainstormReasoningPrefix":`Brainstorm :`,"autoLoop.brainstormReasoningTooltip":`Niveau de raisonnement utilisé uniquement pour la session de brainstorming initiale`,"autoLoop.executionModelPrefix":`Loop :`,"autoLoop.executionModelTooltip":`Modèle utilisé pour chaque tâche de l'auto-loop après la session de brainstorming initiale`,"autoLoop.sessionMode.perTask":`Nouvelle session par tâche`,"autoLoop.sessionMode.label":`Session :`,"autoLoop.sessionMode.perTaskTooltip":`Chaque tâche démarre une session Claude Code neuve, sans mémoire des tâches précédentes`,"autoLoop.sessionMode.continuous":`Session continue`,"autoLoop.sessionMode.continuousTooltip":`Toutes les tâches s'enchaînent dans la même session — l'agent garde tout le contexte, mais la session s'allonge au fil du temps`,"koboCommand.prepAutoloopDesc":`Préparer les tâches pour le mode auto-loop (atomicité)`,"staleSessionBanner.title":`Auto-loop en cours`,"staleSessionBanner.message":`Vous consultez une ancienne session — l'agent travaille actuellement dans la dernière.`,"staleSessionBanner.staleTitle":`Session précédente`,"staleSessionBanner.staleMessage":`Vous consultez une ancienne session — les messages envoyés iront dans cette session, pas la dernière.`,"staleSessionBanner.switchToCurrent":`Basculer sur la session active`,"network.login.title":`Accès réseau`,"network.login.description":`Ce Kōbō nécessite un token pour être piloté depuis le réseau. Colle le token affiché dans les Réglages sur la machine hôte.`,"network.login.tokenLabel":`Token`,"network.login.tokenPlaceholder":`Colle ton token`,"network.login.connect":`Se connecter`,"network.login.invalid":`Token invalide`,"network.login.serverError":`Erreur serveur — réessaie.`,"network.login.unreachable":`Kōbō est injoignable — vérifie ta connexion.`,"layout.toggleWorkspaces":`Afficher/masquer les espaces de travail`,"layout.togglePanel":`Afficher/masquer le panneau latéral`,"unsaved.title":`Quitter sans enregistrer ?`,"unsaved.message":`Vous avez des modifications non enregistrées. Quitter cette page les abandonne.`,"unsaved.leave":`Quitter`,"unsaved.stay":`Rester`,"prCheckout.staleRetriesExhausted":`L'état du dépôt a continué de changer pendant l'application de vos choix. Fermez cette fenêtre et réessayez depuis le sélecteur de pull request.`,"prPicker.title":`Importer depuis une pull request`,"prPicker.filterAll":`Toutes`,"prPicker.filterMine":`Les miennes`,"prPicker.filterReviewRequested":`Revue demandée`,"prPicker.searchPlaceholder":`Rechercher des pull requests…`,"prPicker.loadMore":`Charger plus`,"prPicker.empty":`Aucune pull request ouverte ne correspond.`,"prPicker.forkNotSupported":`Cette PR provient d'un fork ; Kōbō ne peut pas la checkout.`,"prPicker.loadFailed":`Échec du chargement des pull requests.`,"prPicker.badge.workspaceExists":`Déjà ouverte dans Kōbō`,"prPicker.badge.worktreePresent":`Worktree présente`,"prPicker.badge.localBranch":`Branche locale`,"prPicker.badge.new":`Nouvelle`,"prPicker.badge.draft":`Brouillon`,"prCheckout.title":`Préparer la worktree`,"prCheckout.apply":`Appliquer`,"prCheckout.cancel":`Annuler`,"prCheckout.retry":`Réessayer`,"prCheckout.diagnoseFailed":`Échec du diagnostic de la pull request.`,"prCheckout.resolveFailed":`Échec de la résolution du checkout de la pull request.`,"prCheckout.path.required":`Saisir un chemin de worktree qui n'existe pas encore.`,"prCheckout.workspace.restoreNotAvailable":"La restauration d'un workspace purgé n'est pas encore possible depuis cet écran. Recréez son dossier de worktree sur le disque (par ex. `git worktree add`) : Kōbō le rattachera automatiquement sous 30 secondes environ.","prCheckout.staleReloaded":`Le dépôt a changé ; le diagnostic a été rafraîchi.`,"prCheckout.step.blocked":`Impossible de continuer`,"prCheckout.step.path":`Emplacement de la worktree`,"prCheckout.step.workspace":`Workspace existant`,"prCheckout.step.worktree":`Worktree existante`,"prCheckout.step.operation":`Opération git en cours`,"prCheckout.step.changes":`Modifications non commitées`,"prCheckout.step.divergence":`Branche locale vs origin`,"prCheckout.workspace.activeHint":`Un workspace nommé « {name} » suit déjà cette branche.`,"prCheckout.workspace.open":`Ouvrir ce workspace`,"prCheckout.workspace.continue":`Continuer sur un autre chemin`,"prCheckout.workspace.unarchive":`Désarchiver et l'ouvrir`,"prCheckout.workspace.restore":`Recréer sa worktree`,"prCheckout.worktree.orphanHint":`Une worktree existe déjà sur cette branche à {path}.`,"prCheckout.worktree.attach":`L'attacher`,"prCheckout.worktree.branchInUse":`Cette branche est déjà extraite. Rattachez son worktree existant.`,"prCheckout.worktree.createElsewhere":`En créer une autre ailleurs`,"prCheckout.operation.hint":`Un {operation} est en cours dans cette worktree.`,"prCheckout.operation.abort":`Abandonner`,"prCheckout.operation.cancel":`Ne pas y toucher et s'arrêter ici`,"prCheckout.changes.hint":`{modified} modifié(s), {staged} indexé(s), {untracked} non suivi(s).`,"prCheckout.changes.stash":`Les stash`,"prCheckout.changes.commit":`Les commit`,"prCheckout.changes.discard":`Les abandonner (conservées dans un stash étiqueté)`,"prCheckout.changes.keepResetConflict":`Conserver les modifications est incompatible avec un reset. Faites un stash ou un commit, ou conservez la branche.`,"prCheckout.changes.keep":`Les laisser telles quelles`,"prCheckout.divergence.behindHint":`Votre branche a {behind} commit(s) de retard sur origin.`,"prCheckout.divergence.aheadHint":`Votre branche a {ahead} commit(s) non pushé(s).`,"prCheckout.divergence.divergedHint":`{ahead} en avance, {behind} en retard sur origin.`,"prCheckout.divergence.fastForward":`Fast-forward vers origin`,"prCheckout.divergence.rebase":`Rebase sur origin`,"prCheckout.divergence.resetHard":`Réinitialiser sur origin (une branche de sauvegarde est créée d'abord)`,"prCheckout.divergence.keep":`Conserver l'état local`,"prCheckout.blocked.forgeUnavailable":`Le CLI de la forge est absent ou non authentifié.`,"prCheckout.blocked.forkPr":`Cette PR provient d'un fork ; Kōbō ne peut pas la checkout.`,"prCheckout.blocked.headBranchDeleted":`La branche n'existe plus sur le remote.`,"prCheckout.blocked.indexLock":`Un autre processus git est en cours (index.lock est présent).`,"prCheckout.blocked.pathOccupied":`{path} existe déjà et n'est pas une worktree.`,"prCheckout.blocked.worktreeOtherBranch":`{path} est une worktree sur une autre branche ({branch}).`,"prCheckout.blocked.noCommonAncestor":`Une branche locale nommée {branch} existe avec un historique sans rapport.`,"split.title":`Vue double workspace`,"split.open":`Ouvrir côte à côte`,"split.openBeside":`Ouvrir à côté`,"split.close":`Fermer la vue double`,"split.left":`Workspace de gauche`,"split.right":`Workspace de droite`,"split.choose":`Choisir un workspace`,"split.recipient":`Envoyer à : {name}`,"absence.title":`Depuis ta dernière visite`,"settings.activityDigestHint":`Affiche le récapitulatif des événements survenus pendant ton absence. Désactiver masque cette entrée et arrête la collecte des nouveaux événements, sans effacer l’historique existant.`,"absence.pending":`Changements à consulter`,"absence.retention":`Activité importante des 30 derniers jours, enregistrée depuis l’installation de cette fonctionnalité. Le suivi des visites est propre à ce navigateur.`,"absence.since":`Depuis le {date}`,"absence.error":`Impossible de charger l’activité.`,"absence.retry":`Réessayer`,"absence.empty":`Aucune nouvelle activité.`,"absence.more":`Charger la suite`,"absence.markRead":`Marquer les événements affichés comme lus`,"absence.kind.question":`Question posée`,"absence.kind.permission":`Autorisation demandée`,"absence.kind.completed":`Session terminée`,"absence.kind.error":`Erreur de l’agent`,"absence.kind.pr-merged":`PR mergée`,"absence.kind.pr-approved":`PR approuvée`,"absence.kind.pr-changes-requested":`Modifications demandées`,"absence.kind.pr-ci-failed":`CI en échec`,"absence.kind.pr-ci-recovered":`CI rétablie`,"absence.kind.pr-merge-conflict":`Conflit de merge`,"absence.kind.pr-ready-to-merge":`PR prête à merger`,"absence.kind.archived":`Workspace archivé`,"absence.kind.purged":`Worktree purgé`,"absence.kind.restored":`Worktree restauré`,"tours.split.controls.title":`Deux workspaces indépendants`,"tours.split.controls.description":`Choisis un workspace par panneau. Redimensionne la séparation ; chaque conversation garde son destinataire et ses panneaux.`,"tours.home.sort.title":`Trier les workspaces`,"tours.home.sort.description":`Choisis l’ordre et le sens dans chaque groupe. Ton choix est mémorisé.`,"tours.home.activity.title":`Consulter l’activité après une absence`,"tours.home.activity.description":`En bas du drawer gauche, retrouve les questions, fins de session, erreurs et changements de PR survenus pendant ton absence.`};export{e as default};
|
|
17
|
+
sudo setfacl -Rd -m u:$(whoami):rwX . && sudo setfacl -R -m u:$(whoami):rwX .`,"settings.purgeDocsPermissionsRecoverChownIntro":`Option B — Reprendre la propriété (plus simple, perd l'info "créé par root dans le conteneur" mais osef en pratique) :`,"settings.purgeDocsPermissionsRecoverChownCommand":` sudo chown -R $(whoami):$(whoami) .`,"settings.purgeDocsPermissionsRecoverFootnote":"Astuce : tu peux exécuter ces commandes directement sur la racine de tes worktrees (ex. `~/.worktrees/`) pour couvrir tous les workspaces existants ET futurs d'un seul coup. Une fois fait, la purge Kōbō fonctionnera sans erreur de permission.","contextMenu.runSetup":`Lancer le script de setup`,"contextMenu.exportEvents":`Exporter les events (CSV)`,"contextMenu.dismissChangesRequested":`Marquer « Modifications demandées » comme vu`,"contextMenu.dismissCiFailure":`Marquer « CI en échec » comme vu`,"contextMenu.restoreChangesRequested":`Marquer « Modifications demandées » comme non vu`,"contextMenu.restoreCiFailure":`Marquer « CI en échec » comme non vu`,"contextMenu.exportingEvents":`Préparation de l'export…`,"contextMenu.exportEventsError":`Échec de l'export des events`,"contextMenu.openNotion":`Ouvrir dans Notion`,"contextMenu.openSentry":`Ouvrir dans Sentry`,"contextMenu.openPr":`Ouvrir la PR`,"contextMenu.ignorePrWatch":`Ignorer les checks PR`,"contextMenu.resumePrWatch":`Réactiver les checks PR`,"contextMenu.prWatchToggleFailed":`Échec de la mise à jour des checks PR`,"workspace.favorite":`Ajouter aux favoris`,"workspace.unfavorite":`Retirer des favoris`,"workspace.showFavoritesOnly":`Afficher uniquement les favoris`,"workspace.tagFilter":`Filtrer par tags`,"workspace.tagFilterActive":`Filtrer par tags ({count} sélectionné(s))`,"workspace.tagFilterClear":`Effacer`,"workspace.tagFilterEmpty":`Aucun tag pour l'instant. Ajoutez-en depuis le menu d'un workspace.`,"workspace.searchArchivedToggle":`Inclure les workspaces archivés dans la recherche`,"workspace.descriptionPlaceholder":`Ajouter une courte description`,"workspace.descriptionDialogHint":`Texte brut, 200 caractères maximum. Laisser vide pour effacer.`,"workspace.descriptionTooLong":`La description doit faire 200 caractères ou moins.`,"workspace.descriptionSaveFailed":`Échec de l'enregistrement de la description.`,"workspace.agentDescriptionTooltip":`État en direct maintenu par l'agent`,"mcp.tool.setWorkspaceDescription":`Définit la courte description du workspace (≤ 200 caractères).`,"tags.manage":`Gérer les tags`,"tags.manageTitle":`Gérer les tags du workspace`,"tags.noTagsDefined":`Aucun tag défini. Ajoutes-en dans Paramètres > Global > Tags.`,"tags.orphanedHint":`{count} tag(s) ne sont plus dans le catalogue global. Décoche-les pour les retirer.`,"settings.tagsTitle":`Tags des workspaces`,"settings.tagsHint":`Définis les tags assignables aux workspaces. Tape pour ajouter, clique la croix pour retirer.`,"settings.tagsLabel":`Tags disponibles`,"settings.branchPrefixesTitle":`Préfixes de branche`,"settings.branchPrefixesHint":`Gérez les préfixes de branche Git disponibles sur la page de création. Le premier est présélectionné par défaut.`,"settings.branchPrefixesEmpty":`Aucun préfixe de branche défini. Ajoutez-en au moins un ci-dessous.`,"settings.branchPrefixesAddLabel":`Nouveau préfixe`,"settings.branchPrefixesEditHint":`Cliquer pour renommer`,"settings.branchPrefixesMoveUp":`Monter`,"settings.branchPrefixesMoveDown":`Descendre`,"settings.worktreesTitle":`Worktrees Git`,"settings.worktreesHint":`Choisis où créer les worktrees des nouveaux workspaces. Les chemins relatifs sont résolus depuis le projet ; les chemins absolus Linux/macOS et Windows, $HOME, ~ et %USERPROFILE% sont supportés.`,"settings.worktreesPathLabel":`Chemin des worktrees`,"settings.worktreesPathRequired":`Le chemin des worktrees est requis.`,"settings.worktreesPrefixByProject":`Préfixer les worktrees par le nom du projet`,"settings.worktreesPrefixByProjectHint":`Place chaque worktree dans un sous-dossier nommé d'après le projet, pour éviter les collisions quand plusieurs projets partagent la même racine.`,"settings.shareTitle":`Partager la configuration`,"settings.shareHint":`Exporte tes paramètres, templates et tags en bundle JSON. Les clés MCP sont retirées à l’export pour la sécurité.`,"settings.exportConfig":`Exporter`,"settings.importConfig":`Importer`,"settings.exportSuccess":`Configuration exportée`,"settings.importSuccess":`Configuration importée`,"settings.importConfirmTitle":`Importer la configuration`,"settings.importConfirmMessage":`Cela remplacera tes paramètres, templates et tags actuels. Tes clés MCP seront conservées. Continuer ?`,"settings.mcp.title":`Connexions des LLM externes (MCP)`,"settings.mcp.hint":`Connectez un client MCP pour lire les conversations, envoyer des messages et répondre aux questions des workspaces.`,"settings.mcp.remoteDisabled":`Les connexions distantes nécessitent l’accès réseau et un redémarrage du serveur après son activation.`,"settings.mcp.clientName":`Nom du client (facultatif)`,"settings.mcp.connection":`Connexion`,"settings.mcp.local":`HTTP local`,"settings.mcp.remote":`HTTP distant`,"settings.mcp.proxy":`Proxy inverse`,"settings.mcp.stdio":`Stdio local`,"settings.mcp.copyUrl":`Copier l’URL`,"settings.mcp.copyConfig":`Copier la configuration`,"settings.mcp.copyWithToken":`Copier avec le jeton`,"settings.mcp.genericFormat":`Ces exemples utilisent le format générique mcpServers. Adaptez le conteneur à votre client MCP. Les aperçus affichent un emplacement réservé au jeton.`,"settings.mcp.tokenUnavailable":`Aucun jeton disponible. Activez l’accès réseau avant de copier une configuration authentifiée.`,"settings.mcp.stdioUnavailable":`Le point d’entrée stdio est indisponible dans cette installation. Utilisez HTTP ou compilez Kōbō.`,"settings.mcp.copyFailed":`Impossible de copier dans le presse-papiers.`,"tours.settings.mcp.title":`Connecter un LLM externe`,"tours.settings.mcp.description":`Copiez une configuration HTTP ou stdio pour permettre à un assistant externe de communiquer avec vos workspaces.`,"settings.network.title":`Accès réseau`,"settings.network.hint":`Pilote Kōbō depuis un autre appareil de ton LAN de confiance. Off = localhost uniquement. On = accessible sur ton réseau, protégé par un token. Redémarre Kōbō après bascule.`,"settings.network.enable":`Activer l'accès réseau`,"settings.network.behindProxy":`Derrière un reverse proxy`,"settings.network.behindProxyHint":`Kōbō ne peut plus distinguer ta propre machine d'une requête relayée — même le localhost devra présenter le token désormais. N'active ceci que si un reverse proxy (Traefik, nginx, Caddy…) est devant Kōbō.`,"settings.network.restartRequired":`Redémarre Kōbō pour appliquer la nouvelle adresse de bind.`,"settings.network.token":`Token d'accès`,"settings.network.copy":`Copier`,"settings.network.copied":`Copié`,"settings.network.regenerate":`Régénérer`,"settings.network.regenerateConfirm":`Régénérer le token ? Les appareils connectés devront utiliser le nouveau token.`,"settings.network.urls":`URLs LAN`,"settings.network.scan":`Scanner pour se connecter`,"settings.network.noUrls":`Aucune adresse LAN détectée.`,"settings.network.loadFailed":`Échec du chargement des réglages d'accès réseau.`,"settings.network.updateFailed":`Échec de la mise à jour des réglages d'accès réseau.`,"settings.unsavedChanges.title":`Modifications non enregistrées`,"settings.unsavedChanges.message":`Ce projet a des modifications non enregistrées. Changer de projet les annulera.`,"settings.unsavedChanges.discard":`Ignorer et changer`,"settings.unsavedChanges.cancel":`Annuler`,"settings.loadFailed":`Les réglages n’ont pas pu être chargés`,"settings.loadFailedHint":`L’enregistrement est désactivé : le formulaire affiche les valeurs par défaut, et les écrire remplacerait votre configuration réelle.`,"health.title":`Santé`,"health.tooltip":`Santé du système`,"changelog.title":`Journal des changements`,"changelog.tooltip":`Quoi de neuf dans Kōbō`,"changelog.empty":`Aucun changelog disponible.`,"changelog.current":`actuelle`,"changelog.currentVersion":`Version actuelle : v{version}`,"health.envTitle":`Environnement`,"health.version":`Version`,"health.koboHome":`Kōbō home`,"health.dbTitle":`Base de données`,"health.dbPath":`Chemin`,"health.dbSize":`Taille`,"health.schemaVersion":`Version du schéma`,"health.settingsSchemaVersion":`Schéma settings`,"health.runtimesTitle":`Moteurs d'agent`,"health.claudeCliTitle":`Claude Code`,"health.claudeCliMissing":`claude introuvable dans le PATH`,"health.codexCliTitle":`OpenAI Codex`,"health.codexCliMissing":`binaire codex introuvable`,"health.forgeCliTitle":`CLI de forge (gh / glab)`,"health.forgeCliMissing":`Ni gh ni glab trouvés — pull requests et surveillance de CI indisponibles`,"health.workspacesTitle":`Workspaces`,"health.workspacesCount":`{total} au total, {archived} archivés`,"health.worktreesMissing":`{count} worktree(s) manquant(s) sur le disque`,"health.sessionsTitle":`Sessions agent`,"health.sessionsOrphaned":`{n} session(s) orpheline(s) marquées running`,"health.integrationsTitle":`Intégrations`,"health.integrationConfigured":`configurée`,"health.integrationMissing":`non configurée`,"health.integrationDisabled":`désactivée`,"settings.integrationEnabled":`Activer l’intégration`,"health.activeTitle":`État actif`,"health.activeQuotaBackoffs":`Quota backoffs en attente`,"health.activeWakeups":`Wakeups programmés`,"health.activeAutoLoop":`Auto-loop en cours`,"health.activeAgentSessions":`Sessions agent en cours`,"health.activeDevServers":`Serveurs de dev lancés`,"health.noneActive":`Aucun.`,"health.quotaResumeAt":`reprise à {time}`,"health.wakeupAt":`réveil à {time}`,"health.startedAgo":`démarré il y a {time}`,"health.autoLoopReady":`prêt, itération en cours`,"health.autoLoopGrooming":`grooming en cours`,"session.started":`Session démarrée`,"session.ended":`Session terminée`,"session.compacted":`Contexte compacté`,"session.endedCompleted":`Tour terminé — envoyez un message pour continuer`,"session.endedKilled":`Session arrêtée`,"session.endedError":`Session terminée sur une erreur`,"session.endedWatchdog":`Session fermée de force après une période d'inactivité`,"tool.running":`En cours...`,"activity.raw_lines":`Lignes de sortie brutes ({n})`,"activity.loading_older":`Chargement des messages plus anciens…`,"activity.compacting":`Compaction du contexte…`,"activity.prev_user_message":`Message utilisateur précédent`,"activity.scroll_to_bottom":`Défiler vers le bas`,"activity.empty":`Rien pour l’instant`,"activity.emptyHint":`La sortie de l’agent s’affichera ici dès qu’une session démarrera.`,"activity.a11y.region":`Annonces d’activité de l’agent`,"activity.a11y.agentSaid":`Agent : {text}`,"activity.a11y.toolStarted":`Outil {name} démarré`,"activity.a11y.toolFinished":`Outil {name} terminé`,"activity.a11y.toolFailed":`Outil {name} en échec`,"chat.systemPrompt":`Prompt système`,"chat.agent":`Agent`,"chat.cleanupScript":`Script de cleanup`,"chat.archiveScript":`Script d'archivage`,"chat.setupScript":`Script de setup`,"chat.hookScript":`Hook {event}`,"chat.scriptDone":`Fait`,"chat.scriptComplete":`[{phase}] Terminé`,"chat.scriptError":`[{phase}] Erreur : {message}`,"chat.unknownError":`inconnue`,"chat.you":`Vous`,"chat.session":`Session`,"chat.nActions":`{n} action | {n} actions`,"chat.lastUpdatedAt":`Dernière mise à jour à {time}`,"chat.scrollToTurnTop":`Défiler vers le haut du message`,"migration.backing_up":`Sauvegarde de la base de données…`,"migration.running":`Migration des données d'agent — {processed}/{total}`,"migration.error":`Échec de la migration`,"migration.backup_location":`Une sauvegarde a été enregistrée à {path}. Redémarre Kōbō pour réessayer.`,"migration.retry":`Redémarre Kōbō pour réessayer.`,"engine.select":`Moteur`,"engine.model":`Modèle`,"engine.effort":`Effort de réflexion`,"wakeup.scheduledIn":`Prochain réveil dans {n}s`,"wakeup.scheduledAt":`Prochain réveil à {time}`,"wakeup.firing":`Réveil en cours…`,"wakeup.reason":`Raison : {reason}`,"wakeup.cancel":`Annuler ce réveil`,"wakeup.pendingIndicator":`Réveil programmé`,"cron.pendingIndicator":`{n} cron(s) programmé(s)`,"schedule.tabLabel":`Programmation`,"schedule.admissionTitle":`Nouvelle session automatique indisponible pour le moment.`,"schedule.admissionHint":`Les échéances restent inchangées. Un message vers une conversation existante suit ses propres règles.`,"schedule.admission.not-found":`Espace introuvable.`,"schedule.admission.archived":`Espace archivé.`,"schedule.admission.purged":`Restaurez le worktree.`,"schedule.admission.shutdown":`Le serveur est en cours d’arrêt.`,"schedule.admission.lifecycle":`Une opération sur cet espace est en cours.`,"schedule.admission.active-session":`La session actuelle n’est pas encore fermée.`,"schedule.admission.awaiting-user":`Une réponse utilisateur est attendue.`,"schedule.admission.compacting":`Le contexte est en cours de compactage.`,"schedule.admission.quota":`En attente du rétablissement du quota.`,"schedule.admission.blocked":`La boucle est bloquée ; corrigez la cause indiquée.`,"schedule.admission.capacity":`Limite de concurrence atteinte : {running}/{limit} sessions.`,"schedule.panelTitle":`Automatisation`,"schedule.panelDescription":`Réveiller ce workspace plus tard ou exécuter des instructions selon un planning.`,"schedule.activeTitle":`Planifications actives`,"schedule.emptyTitle":`Aucune planification`,"schedule.emptyDescription":`Créez un réveil ponctuel ou une tâche récurrente ci-dessous.`,"schedule.cancelWakeup":`Annuler ce réveil`,"schedule.cancelCron":`Supprimer cette tâche récurrente`,"schedule.createTitle":`Créer une planification`,"schedule.createDescription":`Choisissez quand et comment l'agent doit s'exécuter.`,"schedule.typeWakeup":`Réveil ponctuel`,"schedule.typeRecurring":`Tâche récurrente`,"schedule.wakeupDescription":`Exécuter le prompt une fois après un délai.`,"schedule.cronDescription":`Exécuter le prompt régulièrement selon une fréquence fixe.`,"schedule.promptHint":`Instructions qui seront envoyées à l'agent`,"schedule.frequencyTitle":`Fréquence`,"schedule.advancedDescription":`Utiliser une expression cron brute`,"schedule.cronExpressionLabel":`Expression cron`,"schedule.sessionModeTitle":`Session d'exécution`,"schedule.modeResume":`Reprendre la session`,"schedule.oneShotHint":`Supprimer cette planification après sa première exécution.`,"schedule.wakeupTitle":`Wakeup en attente`,"schedule.cronsTitle":`Tâches récurrentes`,"schedule.noWakeup":`Aucun wakeup programmé`,"schedule.noCrons":`Aucun cron programmé`,"schedule.invalidCron":`Inactive : expression invalide. Supprimez puis recréez cette programmation.`,"schedule.nextFireAt":`prochain à {time}`,"schedule.lastFiredAt":`dernier fire il y a {time}`,"schedule.addCronTitle":`Ajouter une tâche récurrente`,"schedule.addWakeupTitle":`Programmer un réveil`,"schedule.every":`Toutes les`,"schedule.unitMinutes":`minutes`,"schedule.unitHours":`heures`,"schedule.unitDays":`jours`,"schedule.daysDriftWarning":`L'intervalle peut se réduire à 1 jour en fin de mois (limitation du format cron).`,"schedule.advancedExpression":`Expression avancée (optionnel)`,"schedule.advancedHint":`Cron brut (ex. */15 * * * *) ou {'@'}hourly/{'@'}daily — remplace le sélecteur si rempli.`,"schedule.promptLabel":`Prompt`,"schedule.labelOptional":`Libellé (optionnel)`,"schedule.delayMinutes":`Délai (minutes)`,"schedule.modeFresh":`Nouvelle session`,"schedule.oneShot":`Une seule fois`,"schedule.addCronBtn":`Ajouter le cron`,"schedule.addWakeupBtn":`Programmer le réveil`,"schedule.cronCreated":`Tâche récurrente ajoutée`,"schedule.wakeupCreated":`Réveil programmé`,"askUserQuestion.title":`L'agent te pose une question`,"askUserQuestion.submit":`Envoyer la réponse`,"askUserQuestion.multiSelectHint":`Sélectionne une ou plusieurs options`,"askUserQuestion.otherOption":`Autre`,"askUserQuestion.otherOptionHint":`précisez dans votre prochain message`,"askUserQuestion.freeFormLabel":`Précisez votre réponse`,"askUserQuestion.freeFormHint":`Cette réponse sera envoyée directement à l'agent.`,"askUserQuestion.noPending":`Aucune question en attente`,"askUserQuestion.next":`Suivant`,"askUserQuestion.previous":`Précédent`,"askUserQuestion.cancel":`Annuler`,"askUserQuestion.cancelTooltip":`Sauter cette question — l'agent continuera sans réponse`,"askUserQuestion.collapse":`Réduire le panneau de question`,"askUserQuestion.expand":`Agrandir le panneau de question`,"permissionRequest.title":`L'agent veut utiliser un outil`,"permissionRequest.allow":`Autoriser`,"permissionRequest.allowOnce":`Autoriser une fois`,"permissionRequest.allowTurn":`Autoriser ce tour`,"permissionRequest.operationUnavailable":`Détails indisponibles ; autorisez une fois ou pour tout l’outil.`,"permissionRequest.allowOperation":`Toujours cette opération`,"permissionRequest.allowTool":`Toujours cet outil`,"permissionRequest.deny":`Refuser`,"permissionRequest.tool":`Outil`,"permissionRequest.input":`Entrée`,"permissionRequest.rawInput":`Détails techniques`,"permissionRequest.collapse":`Réduire le panneau de permission`,"permissionRequest.expand":`Agrandir le panneau de permission`,"permissionRequest.denied":`refusé par l'utilisateur`,"workspaceStatus.created":`créé`,"workspaceStatus.extracting":`extraction`,"workspaceStatus.brainstorming":`brainstorming`,"workspaceStatus.compacting":`compaction`,"chatInput.compactingBanner":`Compaction du contexte en cours. L’envoi sera disponible à la fin.`,"workspaceStatus.executing":`en cours`,"workspaceStatus.awaitingUser":`en attente de ta réponse`,"workspaceStatus.completed":`terminé`,"workspaceStatus.idle":`inactif`,"workspaceStatus.error":`erreur`,"workspaceStatus.quota":`quota atteint`,"workspaceStatus.retrying":`reprise automatique`,"workspaceList.prOpen":`#{n} — Pull request ouverte`,"workspaceList.prWatchDisabledIndicator":`Checks PR ignorés pour ce workspace`,"workspaceList.prChangesRequested":`#{n} — Modifications demandées`,"workspaceList.attentionCiFailed":`CI en échec`,"workspaceList.attentionChangesRequested":`Modifications demandées`,"workspaceList.attentionReadyToMerge":`Prêt à merger`,"autoLoop.status.active":`Active`,"autoLoop.status.waiting":`En attente`,"autoLoop.status.blocked":`Bloquée`,"autoLoop.status.completed":`Terminée`,"autoLoop.status.stopped":`Arrêtée`,"autoLoop.phase.grooming":`Préparation`,"autoLoop.phase.execution":`Exécution`,"autoLoop.phase.finalization":`Finalisation`,"autoLoop.iteration":`Itération {count}`,"autoLoop.resume":`Reprendre l’auto-loop`,"autoLoop.retryAt":`Reprise prévue le`,"autoLoop.actionFailed":`L’action n’a pas pu aboutir.`,"autoLoop.messages.count":`{count} instruction(s) en attente`,"autoLoop.messages.pending":`En attente`,"autoLoop.messages.dispatching":`Envoi en cours`,"autoLoop.messages.unknown":`Livraison incertaine`,"autoLoop.messages.delivered":`Livrée`,"autoLoop.messages.cancel":`Annuler l’instruction`,"autoLoop.messages.acknowledge":`Considérer comme reçue`,"autoLoop.messages.retry":`Renvoyer`,"autoLoop.messages.unknownHelp":`La livraison n’a pas pu être confirmée. Vérifiez la conversation avant de choisir. Renvoyer peut dupliquer une instruction déjà reçue.`,"autoLoop.reason.quota":`En attente du quota du fournisseur.`,"autoLoop.reason.transient":`Reprise après une interruption temporaire.`,"autoLoop.reason.awaiting-user":`En attente de votre réponse.`,"autoLoop.reason.capacity-or-lifecycle":`En attente d’une place disponible pour un agent.`,"autoLoop.reason.message-delivery-unknown":`Résolvez l’instruction à livraison incertaine avant de reprendre.`,"autoLoop.reason.error":`La boucle nécessite une intervention avant de continuer.`,"autoLoop.reason.stall":`Aucun progrès détecté. Consultez la dernière session avant de reprendre.`,"autoLoop.reason.awaiting-clarification":`Une précision est nécessaire avant de continuer.`,"autoLoop.toggle":`Auto-loop`,"autoLoop.start":`Démarrer l'auto-loop`,"autoLoop.prepare":`Préparer pour auto-loop`,"autoLoop.reprepare":`Re-préparer pour auto-loop`,"autoLoop.reprepareTooltip":`Relancer la phase de grooming pour ajouter ou rafraîchir les tâches avant de relancer la boucle`,"autoLoop.prepareBusy":`Attendre la fin de l'agent avant de préparer`,"autoLoop.forceReady":`Je sais ce que je fais — passer le grooming`,"autoLoop.forceReadyConfirm":`Passer le grooming et marquer auto-loop prêt ? La boucle peut stagner si les tâches ne sont pas atomiques.`,"autoLoop.stop":`Arrêter l'auto-loop`,"autoLoop.notReady":`Lancer d'abord « Préparer pour auto-loop »`,"autoLoop.noTasks":`Ajouter d'abord des tâches`,"autoLoop.progress":`Auto-loop · {done}/{total} tâches`,"autoLoop.preparing":`Auto-loop · préparation`,"autoLoop.preparingTooltip":`Grooming en cours — l'agent crée / révise les tâches. La boucle démarrera quand il appellera mark_auto_loop_ready.`,"autoLoop.running":`Auto-loop en cours`,"autoLoop.startInMode":`Démarrer en mode auto-loop`,"autoLoop.brainstormModelPrefix":`Brainstorm :`,"autoLoop.brainstormModelTooltip":`Modèle utilisé uniquement pour la session de brainstorming initiale — chaque tâche ensuite utilise le modèle choisi au-dessus`,"autoLoop.brainstormReasoningPrefix":`Brainstorm :`,"autoLoop.brainstormReasoningTooltip":`Niveau de raisonnement utilisé uniquement pour la session de brainstorming initiale`,"autoLoop.executionModelPrefix":`Loop :`,"autoLoop.executionModelTooltip":`Modèle utilisé pour chaque tâche de l'auto-loop après la session de brainstorming initiale`,"autoLoop.sessionMode.perTask":`Nouvelle session par tâche`,"autoLoop.sessionMode.label":`Session :`,"autoLoop.sessionMode.perTaskTooltip":`Chaque tâche démarre une session Claude Code neuve, sans mémoire des tâches précédentes`,"autoLoop.sessionMode.continuous":`Session continue`,"autoLoop.sessionMode.continuousTooltip":`Toutes les tâches s'enchaînent dans la même session — l'agent garde tout le contexte, mais la session s'allonge au fil du temps`,"koboCommand.prepAutoloopDesc":`Préparer les tâches pour le mode auto-loop (atomicité)`,"staleSessionBanner.title":`Auto-loop en cours`,"staleSessionBanner.message":`Vous consultez une ancienne session — l'agent travaille actuellement dans la dernière.`,"staleSessionBanner.staleTitle":`Session précédente`,"staleSessionBanner.staleMessage":`Vous consultez une ancienne session — les messages envoyés iront dans cette session, pas la dernière.`,"staleSessionBanner.switchToCurrent":`Basculer sur la session active`,"network.login.title":`Accès réseau`,"network.login.description":`Ce Kōbō nécessite un token pour être piloté depuis le réseau. Colle le token affiché dans les Réglages sur la machine hôte.`,"network.login.tokenLabel":`Token`,"network.login.tokenPlaceholder":`Colle ton token`,"network.login.connect":`Se connecter`,"network.login.invalid":`Token invalide`,"network.login.serverError":`Erreur serveur — réessaie.`,"network.login.unreachable":`Kōbō est injoignable — vérifie ta connexion.`,"layout.toggleWorkspaces":`Afficher/masquer les espaces de travail`,"layout.togglePanel":`Afficher/masquer le panneau latéral`,"unsaved.title":`Quitter sans enregistrer ?`,"unsaved.message":`Vous avez des modifications non enregistrées. Quitter cette page les abandonne.`,"unsaved.leave":`Quitter`,"unsaved.stay":`Rester`,"prCheckout.staleRetriesExhausted":`L'état du dépôt a continué de changer pendant l'application de vos choix. Fermez cette fenêtre et réessayez depuis le sélecteur de pull request.`,"prPicker.title":`Importer depuis une pull request`,"prPicker.filterAll":`Toutes`,"prPicker.filterMine":`Les miennes`,"prPicker.filterReviewRequested":`Revue demandée`,"prPicker.searchPlaceholder":`Rechercher des pull requests…`,"prPicker.loadMore":`Charger plus`,"prPicker.empty":`Aucune pull request ouverte ne correspond.`,"prPicker.forkNotSupported":`Cette PR provient d'un fork ; Kōbō ne peut pas la checkout.`,"prPicker.loadFailed":`Échec du chargement des pull requests.`,"prPicker.badge.workspaceExists":`Déjà ouverte dans Kōbō`,"prPicker.badge.worktreePresent":`Worktree présente`,"prPicker.badge.localBranch":`Branche locale`,"prPicker.badge.new":`Nouvelle`,"prPicker.badge.draft":`Brouillon`,"prCheckout.title":`Préparer la worktree`,"prCheckout.apply":`Appliquer`,"prCheckout.cancel":`Annuler`,"prCheckout.retry":`Réessayer`,"prCheckout.diagnoseFailed":`Échec du diagnostic de la pull request.`,"prCheckout.resolveFailed":`Échec de la résolution du checkout de la pull request.`,"prCheckout.path.required":`Saisir un chemin de worktree qui n'existe pas encore.`,"prCheckout.workspace.restoreNotAvailable":"La restauration d'un workspace purgé n'est pas encore possible depuis cet écran. Recréez son dossier de worktree sur le disque (par ex. `git worktree add`) : Kōbō le rattachera automatiquement sous 30 secondes environ.","prCheckout.staleReloaded":`Le dépôt a changé ; le diagnostic a été rafraîchi.`,"prCheckout.step.blocked":`Impossible de continuer`,"prCheckout.step.path":`Emplacement de la worktree`,"prCheckout.step.workspace":`Workspace existant`,"prCheckout.step.worktree":`Worktree existante`,"prCheckout.step.operation":`Opération git en cours`,"prCheckout.step.changes":`Modifications non commitées`,"prCheckout.step.divergence":`Branche locale vs origin`,"prCheckout.workspace.activeHint":`Un workspace nommé « {name} » suit déjà cette branche.`,"prCheckout.workspace.open":`Ouvrir ce workspace`,"prCheckout.workspace.continue":`Continuer sur un autre chemin`,"prCheckout.workspace.unarchive":`Désarchiver et l'ouvrir`,"prCheckout.workspace.restore":`Recréer sa worktree`,"prCheckout.worktree.orphanHint":`Une worktree existe déjà sur cette branche à {path}.`,"prCheckout.worktree.attach":`L'attacher`,"prCheckout.worktree.branchInUse":`Cette branche est déjà extraite. Rattachez son worktree existant.`,"prCheckout.worktree.createElsewhere":`En créer une autre ailleurs`,"prCheckout.operation.hint":`Un {operation} est en cours dans cette worktree.`,"prCheckout.operation.abort":`Abandonner`,"prCheckout.operation.cancel":`Ne pas y toucher et s'arrêter ici`,"prCheckout.changes.hint":`{modified} modifié(s), {staged} indexé(s), {untracked} non suivi(s).`,"prCheckout.changes.stash":`Les stash`,"prCheckout.changes.commit":`Les commit`,"prCheckout.changes.discard":`Les abandonner (conservées dans un stash étiqueté)`,"prCheckout.changes.keepResetConflict":`Conserver les modifications est incompatible avec un reset. Faites un stash ou un commit, ou conservez la branche.`,"prCheckout.changes.keep":`Les laisser telles quelles`,"prCheckout.divergence.behindHint":`Votre branche a {behind} commit(s) de retard sur origin.`,"prCheckout.divergence.aheadHint":`Votre branche a {ahead} commit(s) non pushé(s).`,"prCheckout.divergence.divergedHint":`{ahead} en avance, {behind} en retard sur origin.`,"prCheckout.divergence.fastForward":`Fast-forward vers origin`,"prCheckout.divergence.rebase":`Rebase sur origin`,"prCheckout.divergence.resetHard":`Réinitialiser sur origin (une branche de sauvegarde est créée d'abord)`,"prCheckout.divergence.keep":`Conserver l'état local`,"prCheckout.blocked.forgeUnavailable":`Le CLI de la forge est absent ou non authentifié.`,"prCheckout.blocked.forkPr":`Cette PR provient d'un fork ; Kōbō ne peut pas la checkout.`,"prCheckout.blocked.headBranchDeleted":`La branche n'existe plus sur le remote.`,"prCheckout.blocked.indexLock":`Un autre processus git est en cours (index.lock est présent).`,"prCheckout.blocked.pathOccupied":`{path} existe déjà et n'est pas une worktree.`,"prCheckout.blocked.worktreeOtherBranch":`{path} est une worktree sur une autre branche ({branch}).`,"prCheckout.blocked.noCommonAncestor":`Une branche locale nommée {branch} existe avec un historique sans rapport.`,"split.title":`Vue double workspace`,"split.open":`Ouvrir côte à côte`,"split.openBeside":`Ouvrir à côté`,"split.close":`Fermer la vue double`,"split.left":`Workspace de gauche`,"split.right":`Workspace de droite`,"split.choose":`Choisir un workspace`,"split.recipient":`Envoyer à : {name}`,"absence.title":`Depuis ta dernière visite`,"settings.activityDigestHint":`Affiche le récapitulatif des événements survenus pendant ton absence. Désactiver masque cette entrée et arrête la collecte des nouveaux événements, sans effacer l’historique existant.`,"absence.pending":`Changements à consulter`,"absence.retention":`Activité importante des 30 derniers jours, enregistrée depuis l’installation de cette fonctionnalité. Le suivi des visites est propre à ce navigateur.`,"absence.since":`Depuis le {date}`,"absence.error":`Impossible de charger l’activité.`,"absence.retry":`Réessayer`,"absence.empty":`Aucune nouvelle activité.`,"absence.more":`Charger la suite`,"absence.markRead":`Marquer les événements affichés comme lus`,"absence.kind.question":`Question posée`,"absence.kind.permission":`Autorisation demandée`,"absence.kind.completed":`Session terminée`,"absence.kind.error":`Erreur de l’agent`,"absence.kind.pr-merged":`PR mergée`,"absence.kind.pr-approved":`PR approuvée`,"absence.kind.pr-changes-requested":`Modifications demandées`,"absence.kind.pr-ci-failed":`CI en échec`,"absence.kind.pr-ci-recovered":`CI rétablie`,"absence.kind.pr-merge-conflict":`Conflit de merge`,"absence.kind.pr-ready-to-merge":`PR prête à merger`,"absence.kind.archived":`Workspace archivé`,"absence.kind.purged":`Worktree purgé`,"absence.kind.restored":`Worktree restauré`,"tours.split.controls.title":`Deux workspaces indépendants`,"tours.split.controls.description":`Choisis un workspace par panneau. Redimensionne la séparation ; chaque conversation garde son destinataire et ses panneaux.`,"tours.home.sort.title":`Trier les workspaces`,"tours.home.sort.description":`Choisis l’ordre et le sens dans chaque groupe. Ton choix est mémorisé.`,"tours.home.activity.title":`Consulter l’activité après une absence`,"tours.home.activity.description":`En bas du drawer gauche, retrouve les questions, fins de session, erreurs et changements de PR survenus pendant ton absence.`};export{e as default};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{n as e}from"./editor.api-
|
|
1
|
+
import{n as e}from"./editor.api-DhaLhNl-.js";var t=[`assign`,`flush`,`ftl`,`return`,`global`,`import`,`include`,`break`,`continue`,`local`,`nested`,`nt`,`setting`,`stop`,`t`,`lt`,`rt`,`fallback`],n=[`attempt`,`autoesc`,`autoEsc`,`compress`,`comment`,`escape`,`noescape`,`function`,`if`,`list`,`items`,`sep`,`macro`,`noparse`,`noParse`,`noautoesc`,`noAutoEsc`,`outputformat`,`switch`,`visit`,`recurse`],r={close:`>`,id:`angle`,open:`<`},i={close:`\\]`,id:`bracket`,open:`\\[`},a={close:`[>\\]]`,id:`auto`,open:`[<\\[]`},o={close:`\\}`,id:`dollar`,open1:`\\$`,open2:`\\{`},s={close:`\\]`,id:`bracket`,open1:`\\[`,open2:`=`};function c(r){return{brackets:[[`<`,`>`],[`[`,`]`],[`(`,`)`],[`{`,`}`]],comments:{blockComment:[`${r.open}--`,`--${r.close}`]},autoCloseBefore:`
|
|
2
2
|
\r }]),.:;=`,autoClosingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`,notIn:[`string`]},{open:`'`,close:`'`,notIn:[`string`]}],surroundingPairs:[{open:`"`,close:`"`},{open:`'`,close:`'`},{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`<`,close:`>`}],folding:{markers:{start:RegExp(`${r.open}#(?:${n.join(`|`)})([^/${r.close}]*(?!/)${r.close})[^${r.open}]*$`),end:RegExp(`${r.open}/#(?:${n.join(`|`)})[\\r\\n\\t ]*>`)}},onEnterRules:[{beforeText:RegExp(`${r.open}#(?!(?:${t.join(`|`)}))([a-zA-Z_]+)([^/${r.close}]*(?!/)${r.close})[^${r.open}]*$`),afterText:RegExp(`^${r.open}/#([a-zA-Z_]+)[\\r\\n\\t ]*${r.close}$`),action:{indentAction:e.IndentAction.IndentOutdent}},{beforeText:RegExp(`${r.open}#(?!(?:${t.join(`|`)}))([a-zA-Z_]+)([^/${r.close}]*(?!/)${r.close})[^${r.open}]*$`),action:{indentAction:e.IndentAction.Indent}}]}}function l(){return{brackets:[[`<`,`>`],[`[`,`]`],[`(`,`)`],[`{`,`}`]],autoCloseBefore:`
|
|
3
3
|
\r }]),.:;=`,autoClosingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`,notIn:[`string`]},{open:`'`,close:`'`,notIn:[`string`]}],surroundingPairs:[{open:`"`,close:`"`},{open:`'`,close:`'`},{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`<`,close:`>`}],folding:{markers:{start:RegExp(`[<\\[]#(?:${n.join(`|`)})([^/>\\]]*(?!/)[>\\]])[^<\\[]*$`),end:RegExp(`[<\\[]/#(?:${n.join(`|`)})[\\r\\n\\t ]*>`)}},onEnterRules:[{beforeText:RegExp(`[<\\[]#(?!(?:${t.join(`|`)}))([a-zA-Z_]+)([^/>\\]]*(?!/)[>\\]])[^[<\\[]]*$`),afterText:RegExp(`^[<\\[]/#([a-zA-Z_]+)[\\r\\n\\t ]*[>\\]]$`),action:{indentAction:e.IndentAction.IndentOutdent}},{beforeText:RegExp(`[<\\[]#(?!(?:${t.join(`|`)}))([a-zA-Z_]+)([^/>\\]]*(?!/)[>\\]])[^[<\\[]]*$`),action:{indentAction:e.IndentAction.Indent}}]}}function u(e,t){let n=`_${e.id}_${t.id}`,r=e=>e.replace(/__id__/g,n),i=e=>{let t=e.source.replace(/__id__/g,n);return new RegExp(t,e.flags)};return{unicode:!0,includeLF:!1,start:r(`default__id__`),ignoreCase:!1,defaultToken:`invalid`,tokenPostfix:`.freemarker2`,brackets:[{open:`{`,close:`}`,token:`delimiter.curly`},{open:`[`,close:`]`,token:`delimiter.square`},{open:`(`,close:`)`,token:`delimiter.parenthesis`},{open:`<`,close:`>`,token:`delimiter.angle`}],[r(`open__id__`)]:new RegExp(e.open),[r(`close__id__`)]:new RegExp(e.close),[r(`iOpen1__id__`)]:new RegExp(t.open1),[r(`iOpen2__id__`)]:new RegExp(t.open2),[r(`iClose__id__`)]:new RegExp(t.close),[r(`startTag__id__`)]:i(/(@open__id__)(#)/),[r(`endTag__id__`)]:i(/(@open__id__)(\/#)/),[r(`startOrEndTag__id__`)]:i(/(@open__id__)(\/?#)/),[r(`closeTag1__id__`)]:i(/((?:@blank)*)(@close__id__)/),[r(`closeTag2__id__`)]:i(/((?:@blank)*\/?)(@close__id__)/),blank:/[ \t\n\r]/,keywords:[`false`,`true`,`in`,`as`,`using`],directiveStartCloseTag1:/attempt|recover|sep|auto[eE]sc|no(?:autoe|AutoE)sc|compress|default|no[eE]scape|comment|no[pP]arse/,directiveStartCloseTag2:/else|break|continue|return|stop|flush|t|lt|rt|nt|nested|recurse|fallback|ftl/,directiveStartBlank:/if|else[iI]f|list|for[eE]ach|switch|case|assign|global|local|include|import|function|macro|transform|visit|stop|return|call|setting|output[fF]ormat|nested|recurse|escape|ftl|items/,directiveEndCloseTag1:/if|list|items|sep|recover|attempt|for[eE]ach|local|global|assign|function|macro|output[fF]ormat|auto[eE]sc|no(?:autoe|AutoE)sc|compress|transform|switch|escape|no[eE]scape/,escapedChar:/\\(?:[ntrfbgla\\'"\{=]|(?:x[0-9A-Fa-f]{1,4}))/,asciiDigit:/[0-9]/,integer:/[0-9]+/,nonEscapedIdStartChar:/[\$@-Z_a-z\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u1FFF\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183-\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3006\u3031-\u3035\u303B-\u303C\u3040-\u318F\u31A0-\u31BA\u31F0-\u31FF\u3300-\u337F\u3400-\u4DB5\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8D0-\uA8D9\uA8F2-\uA8F7\uA8FB\uA900-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF-\uA9D9\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5-\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40-\uFB41\uFB43-\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/,escapedIdChar:/\\[\-\.:#]/,idStartChar:/(?:@nonEscapedIdStartChar)|(?:@escapedIdChar)/,id:/(?:@idStartChar)(?:(?:@idStartChar)|(?:@asciiDigit))*/,specialHashKeys:/\*\*|\*|false|true|in|as|using/,namedSymbols:/<=|>=|\\lte|\\lt|<|\\gte|\\gt|>|&&|\\and|->|->|==|!=|\+=|-=|\*=|\/=|%=|\+\+|--|<=|&&|\|\||:|\.\.\.|\.\.\*|\.\.<|\.\.!|\?\?|=|<|\+|-|\*|\/|%|\||\.\.|\?|!|&|\.|,|;/,arrows:[`->`,`->`],delimiters:[`;`,`:`,`,`,`.`],stringOperators:[`lte`,`lt`,`gte`,`gt`],noParseTags:[`noparse`,`noParse`,`comment`],tokenizer:{[r(`default__id__`)]:[{include:r(`@directive_token__id__`)},{include:r(`@interpolation_and_text_token__id__`)}],[r(`fmExpression__id__.directive`)]:[{include:r(`@blank_and_expression_comment_token__id__`)},{include:r(`@directive_end_token__id__`)},{include:r(`@expression_token__id__`)}],[r(`fmExpression__id__.interpolation`)]:[{include:r(`@blank_and_expression_comment_token__id__`)},{include:r(`@expression_token__id__`)},{include:r(`@greater_operators_token__id__`)}],[r(`inParen__id__.plain`)]:[{include:r(`@blank_and_expression_comment_token__id__`)},{include:r(`@directive_end_token__id__`)},{include:r(`@expression_token__id__`)}],[r(`inParen__id__.gt`)]:[{include:r(`@blank_and_expression_comment_token__id__`)},{include:r(`@expression_token__id__`)},{include:r(`@greater_operators_token__id__`)}],[r(`noSpaceExpression__id__`)]:[{include:r(`@no_space_expression_end_token__id__`)},{include:r(`@directive_end_token__id__`)},{include:r(`@expression_token__id__`)}],[r(`unifiedCall__id__`)]:[{include:r(`@unified_call_token__id__`)}],[r(`singleString__id__`)]:[{include:r(`@string_single_token__id__`)}],[r(`doubleString__id__`)]:[{include:r(`@string_double_token__id__`)}],[r(`rawSingleString__id__`)]:[{include:r(`@string_single_raw_token__id__`)}],[r(`rawDoubleString__id__`)]:[{include:r(`@string_double_raw_token__id__`)}],[r(`expressionComment__id__`)]:[{include:r(`@expression_comment_token__id__`)}],[r(`noParse__id__`)]:[{include:r(`@no_parse_token__id__`)}],[r(`terseComment__id__`)]:[{include:r(`@terse_comment_token__id__`)}],[r(`directive_token__id__`)]:[[i(/(?:@startTag__id__)(@directiveStartCloseTag1)(?:@closeTag1__id__)/),e.id===`auto`?{cases:{"$1==<":{token:`@rematch`,switchTo:`@default_angle_${t.id}`},"$1==[":{token:`@rematch`,switchTo:`@default_bracket_${t.id}`}}}:[{token:`@brackets.directive`},{token:`delimiter.directive`},{cases:{"@noParseTags":{token:`tag`,next:r(`@noParse__id__.$3`)},"@default":{token:`tag`}}},{token:`delimiter.directive`},{token:`@brackets.directive`}]],[i(/(?:@startTag__id__)(@directiveStartCloseTag2)(?:@closeTag2__id__)/),e.id===`auto`?{cases:{"$1==<":{token:`@rematch`,switchTo:`@default_angle_${t.id}`},"$1==[":{token:`@rematch`,switchTo:`@default_bracket_${t.id}`}}}:[{token:`@brackets.directive`},{token:`delimiter.directive`},{token:`tag`},{token:`delimiter.directive`},{token:`@brackets.directive`}]],[i(/(?:@startTag__id__)(@directiveStartBlank)(@blank)/),e.id===`auto`?{cases:{"$1==<":{token:`@rematch`,switchTo:`@default_angle_${t.id}`},"$1==[":{token:`@rematch`,switchTo:`@default_bracket_${t.id}`}}}:[{token:`@brackets.directive`},{token:`delimiter.directive`},{token:`tag`},{token:``,next:r(`@fmExpression__id__.directive`)}]],[i(/(?:@endTag__id__)(@directiveEndCloseTag1)(?:@closeTag1__id__)/),e.id===`auto`?{cases:{"$1==<":{token:`@rematch`,switchTo:`@default_angle_${t.id}`},"$1==[":{token:`@rematch`,switchTo:`@default_bracket_${t.id}`}}}:[{token:`@brackets.directive`},{token:`delimiter.directive`},{token:`tag`},{token:`delimiter.directive`},{token:`@brackets.directive`}]],[i(/(@open__id__)(@)/),e.id===`auto`?{cases:{"$1==<":{token:`@rematch`,switchTo:`@default_angle_${t.id}`},"$1==[":{token:`@rematch`,switchTo:`@default_bracket_${t.id}`}}}:[{token:`@brackets.directive`},{token:`delimiter.directive`,next:r(`@unifiedCall__id__`)}]],[i(/(@open__id__)(\/@)((?:(?:@id)(?:\.(?:@id))*)?)(?:@closeTag1__id__)/),[{token:`@brackets.directive`},{token:`delimiter.directive`},{token:`tag`},{token:`delimiter.directive`},{token:`@brackets.directive`}]],[i(/(@open__id__)#--/),e.id===`auto`?{cases:{"$1==<":{token:`@rematch`,switchTo:`@default_angle_${t.id}`},"$1==[":{token:`@rematch`,switchTo:`@default_bracket_${t.id}`}}}:{token:`comment`,next:r(`@terseComment__id__`)}],[i(/(?:@startOrEndTag__id__)([a-zA-Z_]+)/),e.id===`auto`?{cases:{"$1==<":{token:`@rematch`,switchTo:`@default_angle_${t.id}`},"$1==[":{token:`@rematch`,switchTo:`@default_bracket_${t.id}`}}}:[{token:`@brackets.directive`},{token:`delimiter.directive`},{token:`tag.invalid`,next:r(`@fmExpression__id__.directive`)}]]],[r(`interpolation_and_text_token__id__`)]:[[i(/(@iOpen1__id__)(@iOpen2__id__)/),[{token:t.id===`bracket`?`@brackets.interpolation`:`delimiter.interpolation`},{token:t.id===`bracket`?`delimiter.interpolation`:`@brackets.interpolation`,next:r(`@fmExpression__id__.interpolation`)}]],[/[\$#<\[\{]|(?:@blank)+|[^\$<#\[\{\n\r\t ]+/,{token:`source`}]],[r(`string_single_token__id__`)]:[[/[^'\\]/,{token:`string`}],[/@escapedChar/,{token:`string.escape`}],[/'/,{token:`string`,next:`@pop`}]],[r(`string_double_token__id__`)]:[[/[^"\\]/,{token:`string`}],[/@escapedChar/,{token:`string.escape`}],[/"/,{token:`string`,next:`@pop`}]],[r(`string_single_raw_token__id__`)]:[[/[^']+/,{token:`string.raw`}],[/'/,{token:`string.raw`,next:`@pop`}]],[r(`string_double_raw_token__id__`)]:[[/[^"]+/,{token:`string.raw`}],[/"/,{token:`string.raw`,next:`@pop`}]],[r(`expression_token__id__`)]:[[/(r?)(['"])/,{cases:{"r'":[{token:`keyword`},{token:`string.raw`,next:r(`@rawSingleString__id__`)}],'r"':[{token:`keyword`},{token:`string.raw`,next:r(`@rawDoubleString__id__`)}],"'":[{token:`source`},{token:`string`,next:r(`@singleString__id__`)}],'"':[{token:`source`},{token:`string`,next:r(`@doubleString__id__`)}]}}],[/(?:@integer)(?:\.(?:@integer))?/,{cases:{"(?:@integer)":{token:`number`},"@default":{token:`number.float`}}}],[/(\.)(@blank*)(@specialHashKeys)/,[{token:`delimiter`},{token:``},{token:`identifier`}]],[/(?:@namedSymbols)/,{cases:{"@arrows":{token:`meta.arrow`},"@delimiters":{token:`delimiter`},"@default":{token:`operators`}}}],[/@id/,{cases:{"@keywords":{token:`keyword.$0`},"@stringOperators":{token:`operators`},"@default":{token:`identifier`}}}],[/[\[\]\(\)\{\}]/,{cases:{"\\[":{cases:{"$S2==gt":{token:`@brackets`,next:r(`@inParen__id__.gt`)},"@default":{token:`@brackets`,next:r(`@inParen__id__.plain`)}}},"\\]":{cases:{...t.id===`bracket`?{"$S2==interpolation":{token:`@brackets.interpolation`,next:`@popall`}}:{},...e.id===`bracket`?{"$S2==directive":{token:`@brackets.directive`,next:`@popall`}}:{},[r(`$S1==inParen__id__`)]:{token:`@brackets`,next:`@pop`},"@default":{token:`@brackets`}}},"\\(":{token:`@brackets`,next:r(`@inParen__id__.gt`)},"\\)":{cases:{[r(`$S1==inParen__id__`)]:{token:`@brackets`,next:`@pop`},"@default":{token:`@brackets`}}},"\\{":{cases:{"$S2==gt":{token:`@brackets`,next:r(`@inParen__id__.gt`)},"@default":{token:`@brackets`,next:r(`@inParen__id__.plain`)}}},"\\}":{cases:{...t.id===`bracket`?{}:{"$S2==interpolation":{token:`@brackets.interpolation`,next:`@popall`}},[r(`$S1==inParen__id__`)]:{token:`@brackets`,next:`@pop`},"@default":{token:`@brackets`}}}}}],[/\$\{/,{token:`delimiter.invalid`}]],[r(`blank_and_expression_comment_token__id__`)]:[[/(?:@blank)+/,{token:``}],[/[<\[][#!]--/,{token:`comment`,next:r(`@expressionComment__id__`)}]],[r(`directive_end_token__id__`)]:[[/>/,e.id===`bracket`?{token:`operators`}:{token:`@brackets.directive`,next:`@popall`}],[i(/(\/)(@close__id__)/),[{token:`delimiter.directive`},{token:`@brackets.directive`,next:`@popall`}]]],[r(`greater_operators_token__id__`)]:[[/>/,{token:`operators`}],[/>=/,{token:`operators`}]],[r(`no_space_expression_end_token__id__`)]:[[/(?:@blank)+/,{token:``,switchTo:r(`@fmExpression__id__.directive`)}]],[r(`unified_call_token__id__`)]:[[/(@id)((?:@blank)+)/,[{token:`tag`},{token:``,next:r(`@fmExpression__id__.directive`)}]],[i(/(@id)(\/?)(@close__id__)/),[{token:`tag`},{token:`delimiter.directive`},{token:`@brackets.directive`,next:`@popall`}]],[/./,{token:`@rematch`,next:r(`@noSpaceExpression__id__`)}]],[r(`no_parse_token__id__`)]:[[i(/(@open__id__)(\/#?)([a-zA-Z]+)((?:@blank)*)(@close__id__)/),{cases:{"$S2==$3":[{token:`@brackets.directive`},{token:`delimiter.directive`},{token:`tag`},{token:``},{token:`@brackets.directive`,next:`@popall`}],"$S2==comment":[{token:`comment`},{token:`comment`},{token:`comment`},{token:`comment`},{token:`comment`}],"@default":[{token:`source`},{token:`source`},{token:`source`},{token:`source`},{token:`source`}]}}],[/[^<\[\-]+|[<\[\-]/,{cases:{"$S2==comment":{token:`comment`},"@default":{token:`source`}}}]],[r(`expression_comment_token__id__`)]:[[/--[>\]]/,{token:`comment`,next:`@pop`}],[/[^\->\]]+|[>\]\-]/,{token:`comment`}]],[r(`terse_comment_token__id__`)]:[[i(/--(?:@close__id__)/),{token:`comment`,next:`@popall`}],[/[^<\[\-]+|[<\[\-]/,{token:`comment`}]]}}}function d(e){let t=u(r,e),n=u(i,e),o=u(a,e);return{...t,...n,...o,unicode:!0,includeLF:!1,start:`default_auto_${e.id}`,ignoreCase:!1,defaultToken:`invalid`,tokenPostfix:`.freemarker2`,brackets:[{open:`{`,close:`}`,token:`delimiter.curly`},{open:`[`,close:`]`,token:`delimiter.square`},{open:`(`,close:`)`,token:`delimiter.parenthesis`},{open:`<`,close:`>`,token:`delimiter.angle`}],tokenizer:{...t.tokenizer,...n.tokenizer,...o.tokenizer}}}var f={conf:c(r),language:u(r,o)},p={conf:c(i),language:u(i,o)},m={conf:c(r),language:u(r,s)},h={conf:c(i),language:u(i,s)},g={conf:l(),language:d(o)},_={conf:l(),language:d(s)};export{m as TagAngleInterpolationBracket,f as TagAngleInterpolationDollar,_ as TagAutoInterpolationBracket,g as TagAutoInterpolationDollar,h as TagBracketInterpolationBracket,p as TagBracketInterpolationDollar};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as e}from"./editor.api-
|
|
1
|
+
import{n as e}from"./editor.api-DhaLhNl-.js";var t=[`area`,`base`,`br`,`col`,`embed`,`hr`,`img`,`input`,`keygen`,`link`,`menuitem`,`meta`,`param`,`source`,`track`,`wbr`],n={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\$\^\&\*\(\)\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\s]+)/g,comments:{blockComment:[`{{!--`,`--}}`]},brackets:[[`<!--`,`-->`],[`<`,`>`],[`{{`,`}}`],[`{`,`}`],[`(`,`)`]],autoClosingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`},{open:`'`,close:`'`}],surroundingPairs:[{open:`<`,close:`>`},{open:`"`,close:`"`},{open:`'`,close:`'`}],onEnterRules:[{beforeText:RegExp(`<(?!(?:${t.join(`|`)}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,`i`),afterText:/^<\/(\w[\w\d]*)\s*>$/i,action:{indentAction:e.IndentAction.IndentOutdent}},{beforeText:RegExp(`<(?!(?:${t.join(`|`)}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,`i`),action:{indentAction:e.IndentAction.Indent}}]},r={defaultToken:``,tokenPostfix:``,tokenizer:{root:[[/\{\{!--/,`comment.block.start.handlebars`,`@commentBlock`],[/\{\{!/,`comment.start.handlebars`,`@comment`],[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.root`}],[/<!DOCTYPE/,`metatag.html`,`@doctype`],[/<!--/,`comment.html`,`@commentHtml`],[/(<)(\w+)(\/>)/,[`delimiter.html`,`tag.html`,`delimiter.html`]],[/(<)(script)/,[`delimiter.html`,{token:`tag.html`,next:`@script`}]],[/(<)(style)/,[`delimiter.html`,{token:`tag.html`,next:`@style`}]],[/(<)([:\w]+)/,[`delimiter.html`,{token:`tag.html`,next:`@otherTag`}]],[/(<\/)(\w+)/,[`delimiter.html`,{token:`tag.html`,next:`@otherTag`}]],[/</,`delimiter.html`],[/\{/,`delimiter.html`],[/[^<{]+/]],doctype:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.comment`}],[/[^>]+/,`metatag.content.html`],[/>/,`metatag.html`,`@pop`]],comment:[[/\}\}/,`comment.end.handlebars`,`@pop`],[/./,`comment.content.handlebars`]],commentBlock:[[/--\}\}/,`comment.block.end.handlebars`,`@pop`],[/./,`comment.content.handlebars`]],commentHtml:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.comment`}],[/-->/,`comment.html`,`@pop`],[/[^-]+/,`comment.content.html`],[/./,`comment.content.html`]],otherTag:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.otherTag`}],[/\/?>/,`delimiter.html`,`@pop`],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/[ \t\r\n]+/]],script:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.script`}],[/type/,`attribute.name`,`@scriptAfterType`],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/>/,{token:`delimiter.html`,next:`@scriptEmbedded.text/javascript`,nextEmbedded:`text/javascript`}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,[`delimiter.html`,`tag.html`,{token:`delimiter.html`,next:`@pop`}]]],scriptAfterType:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.scriptAfterType`}],[/=/,`delimiter`,`@scriptAfterTypeEquals`],[/>/,{token:`delimiter.html`,next:`@scriptEmbedded.text/javascript`,nextEmbedded:`text/javascript`}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:`@rematch`,next:`@pop`}]],scriptAfterTypeEquals:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.scriptAfterTypeEquals`}],[/"([^"]*)"/,{token:`attribute.value`,switchTo:`@scriptWithCustomType.$1`}],[/'([^']*)'/,{token:`attribute.value`,switchTo:`@scriptWithCustomType.$1`}],[/>/,{token:`delimiter.html`,next:`@scriptEmbedded.text/javascript`,nextEmbedded:`text/javascript`}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:`@rematch`,next:`@pop`}]],scriptWithCustomType:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.scriptWithCustomType.$S2`}],[/>/,{token:`delimiter.html`,next:`@scriptEmbedded.$S2`,nextEmbedded:`$S2`}],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:`@rematch`,next:`@pop`}]],scriptEmbedded:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInEmbeddedState.scriptEmbedded.$S2`,nextEmbedded:`@pop`}],[/<\/script/,{token:`@rematch`,next:`@pop`,nextEmbedded:`@pop`}]],style:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.style`}],[/type/,`attribute.name`,`@styleAfterType`],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/>/,{token:`delimiter.html`,next:`@styleEmbedded.text/css`,nextEmbedded:`text/css`}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,[`delimiter.html`,`tag.html`,{token:`delimiter.html`,next:`@pop`}]]],styleAfterType:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.styleAfterType`}],[/=/,`delimiter`,`@styleAfterTypeEquals`],[/>/,{token:`delimiter.html`,next:`@styleEmbedded.text/css`,nextEmbedded:`text/css`}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:`@rematch`,next:`@pop`}]],styleAfterTypeEquals:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.styleAfterTypeEquals`}],[/"([^"]*)"/,{token:`attribute.value`,switchTo:`@styleWithCustomType.$1`}],[/'([^']*)'/,{token:`attribute.value`,switchTo:`@styleWithCustomType.$1`}],[/>/,{token:`delimiter.html`,next:`@styleEmbedded.text/css`,nextEmbedded:`text/css`}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:`@rematch`,next:`@pop`}]],styleWithCustomType:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.styleWithCustomType.$S2`}],[/>/,{token:`delimiter.html`,next:`@styleEmbedded.$S2`,nextEmbedded:`$S2`}],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:`@rematch`,next:`@pop`}]],styleEmbedded:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInEmbeddedState.styleEmbedded.$S2`,nextEmbedded:`@pop`}],[/<\/style/,{token:`@rematch`,next:`@pop`,nextEmbedded:`@pop`}]],handlebarsInSimpleState:[[/\{\{\{?/,`delimiter.handlebars`],[/\}\}\}?/,{token:`delimiter.handlebars`,switchTo:`@$S2.$S3`}],{include:`handlebarsRoot`}],handlebarsInEmbeddedState:[[/\{\{\{?/,`delimiter.handlebars`],[/\}\}\}?/,{token:`delimiter.handlebars`,switchTo:`@$S2.$S3`,nextEmbedded:`$S3`}],{include:`handlebarsRoot`}],handlebarsRoot:[[/"[^"]*"/,`string.handlebars`],[/[#/][^\s}]+/,`keyword.helper.handlebars`],[/else\b/,`keyword.helper.handlebars`],[/[\s]+/],[/[^}]/,`variable.parameter.handlebars`]]}};export{n as conf,r as language};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as e}from"./editor.api-
|
|
1
|
+
import{n as e}from"./editor.api-DhaLhNl-.js";var t=[`area`,`base`,`br`,`col`,`embed`,`hr`,`img`,`input`,`keygen`,`link`,`menuitem`,`meta`,`param`,`source`,`track`,`wbr`],n={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\$\^\&\*\(\)\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\s]+)/g,comments:{blockComment:[`<!--`,`-->`]},brackets:[[`<!--`,`-->`],[`<`,`>`],[`{`,`}`],[`(`,`)`]],autoClosingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`},{open:`'`,close:`'`}],surroundingPairs:[{open:`"`,close:`"`},{open:`'`,close:`'`},{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`<`,close:`>`}],onEnterRules:[{beforeText:RegExp(`<(?!(?:${t.join(`|`)}))([_:\\w][_:\\w-.\\d]*)([^/>]*(?!/)>)[^<]*$`,`i`),afterText:/^<\/([_:\w][_:\w-.\d]*)\s*>$/i,action:{indentAction:e.IndentAction.IndentOutdent}},{beforeText:RegExp(`<(?!(?:${t.join(`|`)}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,`i`),action:{indentAction:e.IndentAction.Indent}}],folding:{markers:{start:RegExp(`^\\s*<!--\\s*#region\\b.*-->`),end:RegExp(`^\\s*<!--\\s*#endregion\\b.*-->`)}}},r={defaultToken:``,tokenPostfix:`.html`,ignoreCase:!0,tokenizer:{root:[[/<!DOCTYPE/,`metatag`,`@doctype`],[/<!--/,`comment`,`@comment`],[/(<)((?:[\w\-]+:)?[\w\-]+)(\s*)(\/>)/,[`delimiter`,`tag`,``,`delimiter`]],[/(<)(script)/,[`delimiter`,{token:`tag`,next:`@script`}]],[/(<)(style)/,[`delimiter`,{token:`tag`,next:`@style`}]],[/(<)((?:[\w\-]+:)?[\w\-]+)/,[`delimiter`,{token:`tag`,next:`@otherTag`}]],[/(<\/)((?:[\w\-]+:)?[\w\-]+)/,[`delimiter`,{token:`tag`,next:`@otherTag`}]],[/</,`delimiter`],[/[^<]+/]],doctype:[[/[^>]+/,`metatag.content`],[/>/,`metatag`,`@pop`]],comment:[[/-->/,`comment`,`@pop`],[/[^-]+/,`comment.content`],[/./,`comment.content`]],otherTag:[[/\/?>/,`delimiter`,`@pop`],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/[ \t\r\n]+/]],script:[[/type/,`attribute.name`,`@scriptAfterType`],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/>/,{token:`delimiter`,next:`@scriptEmbedded`,nextEmbedded:`text/javascript`}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,[`delimiter`,`tag`,{token:`delimiter`,next:`@pop`}]]],scriptAfterType:[[/=/,`delimiter`,`@scriptAfterTypeEquals`],[/>/,{token:`delimiter`,next:`@scriptEmbedded`,nextEmbedded:`text/javascript`}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:`@rematch`,next:`@pop`}]],scriptAfterTypeEquals:[[/"module"/,{token:`attribute.value`,switchTo:`@scriptWithCustomType.text/javascript`}],[/'module'/,{token:`attribute.value`,switchTo:`@scriptWithCustomType.text/javascript`}],[/"([^"]*)"/,{token:`attribute.value`,switchTo:`@scriptWithCustomType.$1`}],[/'([^']*)'/,{token:`attribute.value`,switchTo:`@scriptWithCustomType.$1`}],[/>/,{token:`delimiter`,next:`@scriptEmbedded`,nextEmbedded:`text/javascript`}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:`@rematch`,next:`@pop`}]],scriptWithCustomType:[[/>/,{token:`delimiter`,next:`@scriptEmbedded.$S2`,nextEmbedded:`$S2`}],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:`@rematch`,next:`@pop`}]],scriptEmbedded:[[/<\/script/,{token:`@rematch`,next:`@pop`,nextEmbedded:`@pop`}],[/[^<]+/,``]],style:[[/type/,`attribute.name`,`@styleAfterType`],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/>/,{token:`delimiter`,next:`@styleEmbedded`,nextEmbedded:`text/css`}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,[`delimiter`,`tag`,{token:`delimiter`,next:`@pop`}]]],styleAfterType:[[/=/,`delimiter`,`@styleAfterTypeEquals`],[/>/,{token:`delimiter`,next:`@styleEmbedded`,nextEmbedded:`text/css`}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:`@rematch`,next:`@pop`}]],styleAfterTypeEquals:[[/"([^"]*)"/,{token:`attribute.value`,switchTo:`@styleWithCustomType.$1`}],[/'([^']*)'/,{token:`attribute.value`,switchTo:`@styleWithCustomType.$1`}],[/>/,{token:`delimiter`,next:`@styleEmbedded`,nextEmbedded:`text/css`}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:`@rematch`,next:`@pop`}]],styleWithCustomType:[[/>/,{token:`delimiter`,next:`@styleEmbedded.$S2`,nextEmbedded:`$S2`}],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:`@rematch`,next:`@pop`}]],styleEmbedded:[[/<\/style/,{token:`@rematch`,next:`@pop`,nextEmbedded:`@pop`}],[/[^<]+/,``]]}};export{n as conf,r as language};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_t as e,f as t,gt as n,vt as r,yt as i}from"./index-DolbyIM4.js";var a=t(async({app:t})=>{if(t.use(e),r!==`en`)try{await i(r)}catch(e){console.error(`[i18n] could not load the saved locale, staying in English:`,e)}n(r)});export{a as default};
|