diff --git a/CHANGELOG.md b/CHANGELOG.md index a23e5d7..e8cba41 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -43,15 +43,18 @@ et [Semantic Versioning](https://semver.org/spec/v2.0.0.html). (pas de TOC, pas de PDF/Export). La fenêtre pop-out (`popout.html`) est alignée sur le même ordre markdown (groupes nav / édition / export / partage). Tests : `tests/frontend/toolbar-order.test.mjs` (9). -- **#91 Assistant IA — fenêtre de résultats améliorée** : un message soumis et la - réponse de l'assistant **en cours d'écriture** sont épinglés en haut de la fenêtre - de messages (`.bookslm-msg.latest { order: -1 }`), pour toujours voir le résultat - que l'assistant rédige ; un libellé **discret** au-dessus de chaque réponse rapporte - le fournisseur et le modèle réellement utilisés (SSE `provider`/`model`) ; un bouton - « Copier » sous chaque bloc (utilisateur et assistant) copie le texte brut dans le - presse-papiers avec toast de confirmation. Fiche : +- **#91 Assistant IA — zone de discussion façon Notion** : le fil de discussion est + reformaté (messages chronologiques, post utilisateur en bulle alignée à droite, + réponse assistant pleine largeur sans fond, appels d'outils agent repliés en + bloc « N étapes ») ; après l'envoi, la **question est ancrée en haut** de la zone + visible (`scrollIntoView` `block:start` + `scroll-margin-top`) et la réponse se + diffuse en dessous — le streaming ne provoque plus de saut de scroll ; un libellé + **discret** au-dessus de chaque réponse rapporte le fournisseur et le modèle + réellement utilisés (SSE `provider`/`model`) ; une **barre d'actions** au survol + sous chaque bloc : « Copier » (texte brut + toast) et, pour les réponses, + « Ajouter » (insertion dans le document ouvert dans l'éditeur Forge). Fiche : [docs/features/ai-assistant-conversation-ux.md](./docs/features/ai-assistant-conversation-ux.md) - Tests : `tests/frontend/ai.test.mjs` (71). + Tests : `tests/frontend/ai.test.mjs` (74). ### Corrigé diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 3d005cd..b19e45b 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -171,7 +171,7 @@ | 84 | Consolidation & sécurité — revue statique 2026-09-13 (phase 1, BUG-021→034) | 2.3.0 | [archive](./archive/COMPLETED_v1-v2.md) | | 83 | Barre d'outils d'édition mobile — ruban style Obsidian Android | 2.3.0 | [archive](./archive/COMPLETED_v1-v2.md) | | 88 | Assistant IA — contexte applicatif (documents ouverts, répertoire, recherche, fichiers récents) & liens de fichiers fiables (BUG-041, BUG-042) | 2.3.0 | [features/ai-app-context.md](./features/ai-app-context.md) | -| 91 | Assistant IA — Fenêtre de résultats : post en haut, fournisseur/modèle discret & bouton copier | 2.3.0 | [features/ai-assistant-conversation-ux.md](./features/ai-assistant-conversation-ux.md) | +| 91 | Assistant IA — Zone de discussion façon Notion : post ancré en haut, fournisseur/modèle discret & barre d'actions | 2.3.0 | [features/ai-assistant-conversation-ux.md](./features/ai-assistant-conversation-ux.md) | --- diff --git a/docs/features/ai-assistant-conversation-ux.md b/docs/features/ai-assistant-conversation-ux.md index 30860f3..7be7687 100644 --- a/docs/features/ai-assistant-conversation-ux.md +++ b/docs/features/ai-assistant-conversation-ux.md @@ -1,57 +1,81 @@ -# #91 — Assistant IA — Fenêtre de résultats : post en haut, fournisseur/modèle & bouton copier +# #91 — Assistant IA — Zone de discussion façon Notion : post ancré en haut, fournisseur/modèle discret & barre d'actions > **Statut :** ✅ Livré > **Effort :** 0,5-1 jour | **Impact :** 🟡 > **Références :** [Roadmap](../ROADMAP.md) · [BooksLM #76](./bookslm.md) · [Assistant UX #80](./ai-assistant-ux.md) · [Changelog](../../CHANGELOG.md) -- **Description :** Trois améliorations d'expérience dans la fenêtre de résultats de - l'assistant IA (`frontend/js/bookslm.js`, `frontend/style.css`) : - 1. **Post toujours en haut** : dès qu'un message est soumis, ce tour (le post - utilisateur **et** la réponse de l'assistant en cours d'écriture) est épinglé en - haut de la fenêtre de messages, afin que le résultat écrit par l'assistant reste - toujours visible — même après re-render successifs et auto-scroll. - 2. **Fournisseur & modèle discrets** : juste au-dessus du bloc de texte rédigé par - l'assistant, un libellé discret rapporte le fournisseur et le modèle réellement - utilisés (fournis par le backend via le flux SSE `{token, provider, model}`). - 3. **Bouton « Copier »** : sous le bloc soumis par l'utilisateur ainsi que sous le - bloc rédigé par l'assistant, un bouton copie le texte brut de ce bloc dans le - presse-papiers (avec toast de confirmation). +- **Description :** Refonte de la présentation de la fenêtre de résultats de + l'assistant IA (`frontend/js/bookslm.js`, `frontend/style.css`) sur le modèle de + l'assistant Notion : + 1. **Ancrage en haut** : après l'envoi, le post de l'utilisateur est amené tout en + haut de la zone visible (`scrollIntoView({ block: 'start' })` + + `scroll-margin-top`) ; la réponse se diffuse **en dessous**, lisible sans + défilement. Plus de scroll-into-bottom ni d'astuce `order: -1`. + 2. **Fil Notion-style** : messages en ordre chronologique ; post utilisateur = + bulle arrondie alignée à droite (max 80 %) ; réponse assistant = texte pleine + largeur **sans bulle de fond** ; les appels d'outils du mode agent se replient + dans un bloc discret « N étapes » (`
`). + 3. **Fournisseur & modèle discrets** : libellé au-dessus de chaque réponse, + issu du SSE réel du backend (`provider`/`model`). + 4. **Barre d'actions au survol** : sous chaque bloc non vide, « Copier » + (utilisateur et assistant) ; sous une réponse, « Ajouter » qui insère le texte + dans le document ouvert dans l'éditeur Forge (aucun bouton factice). -## A. Post toujours en haut — ✅ livré - - [x] **A1.** Chaque message est enveloppé dans un bloc `.bookslm-msg` ; le conteneur - `.bookslm-messages` est un flex column et les blocs du **dernier tour** (depuis le - dernier message utilisateur inclus) portent `.latest` → `order: -1`, les épinglant - en haut de la fenêtre. - - [x] **A2.** La détection du dernier tour se fait au rendu (`_renderMessages()`) en - recherchant le dernier message `role === 'user'` ; tout ce qui suit (sa réponse, ses - actions/cartes) reste groupé au-dessus de l'historique antérieur. - - [x] **A3.** L'auto-scroll vers le bas (`scrollTop = scrollHeight`) conserve le dernier - tour en haut, hors d'atteinte du contenu précédent. +## A. Positionnement automatique (ancre en haut) — ✅ livré + - [x] **A1.** `_renderMessages({ anchor: true })` appelé à l'envoi du message, à + l'ouverture d'un contexte, au rechargement d'une session et à la reprise après + confirmation agent : cible = dernier `.bookslm-msg.user`, `scrollIntoView` + fluide `block: 'start'`, repli calcul `scrollTop += delta` si indisponible. + - [x] **A2.** Re-rendus de streaming : la position de scroll est **préservée** + (plus de `scrollTop = scrollHeight`) — la réponse s'allonge sous la question + sans jamais déplacer la vue. + - [x] **A3.** Marge supérieure : `scroll-margin-top: 14px` sur `.bookslm-msg` + pour que le post ne colle pas au bord. + - [x] **A4.** Seule la zone du fil défile : `.bookslm-messages { flex: 1; overflow-y: auto }` + (en-tête, toolbar, statut et barre de saisie fixes — structure déjà en place). -## B. Fournisseur & modèle discrets — ✅ livré - - [x] **B1.** `_streamResponse()` capture `data.provider` et `data.model` du flux SSE - (déjà émis par `/chat` et `/agent`) sur le message assistant. - - [x] **B2.** Au rendu d'un message assistant, `.bookslm-msg-meta` affiche - « `fournisseur · modèle` » au-dessus du bloc (visible uniquement si l'info est reçue). - - [x] **B3.** Style discret (10px, `var(--text-secondary)`), non sélectionnable. +## B. Fil chronologique Notion-style — ✅ livré + - [x] **B1.** Ordre naturel (user puis assistant, empilés, `gap: 24px`). + - [x] **B2.** Utilisateur : bulle `--surface2` alignée à droite, `max-width: 80%`, + coins arrondis 18px. + - [x] **B3.** Assistant : `width: 100%`, pas de fond ni de padding de bulle — + le markdown occupe toute la largeur (titres, listes, code, sources inchangés). + - [x] **B4.** Mode agent : `_renderToolActivity()` → `
` + avec `` « N étapes » (i18n `ai.steps_count`) ; les lignes d'outils + restent accessibles en déroulant le bloc. -## C. Bouton « Copier » — ✅ livré - - [x] **C1.** `_appendCopyButton()` ajoute un bouton `.bookslm-copy-btn` sous chaque - bloc non vide (utilisateur et assistant) avec le texte i18n `bookslm.copy`. - - [x] **C2.** `_copyText()` copie le **texte brut** du message (`navigator.clipboard`, - repli `_fallbackCopy`) et affiche le toast `bookslm.copied`. - - [x] **C3.** Le bouton est masqué par défaut (opacité 0) et révélé au survol du bloc - `.bookslm-msg`. +## C. Fournisseur & modèle discrets — ✅ livré + - [x] **C1.** `_streamResponse()` capture `data.provider` / `data.model` du flux SSE + (déjà émis par `/chat` et `/agent`) sur le message assistant. + - [x] **C2.** `.bookslm-msg-meta` au-dessus du bloc assistant : + « fournisseur · modèle » (persisté avec la session, visible au rechargement). -## D. Tests & documentation — ✅ livré - - [x] **D1.** `tests/frontend/ai.test.mjs` : dernier tour épinglé, tag fournisseur/modèle - rendu, boutons copier présents sur les deux blocs, copie du texte brut, absence de - bouton pour un contenu vide. - - [x] **D2.** i18n FR/EN : `bookslm.copied`. - - [x] **D3.** CHANGELOG + Roadmap. +## D. Barre d'actions — ✅ livré + - [x] **D1.** `_appendActionBar()` sous chaque bloc non vide : bouton Copier pour + les deux rôles ; bouton Ajouter pour l'assistant uniquement. + - [x] **D2.** Copier : texte brut du message (`navigator.clipboard`, repli + `execCommand`) + toast `bookslm.copied`. + - [x] **D3.** Ajouter (`_insertIntoEditor`) : insertion du texte à la position de + fin de sélection dans `state.editorView` (Forge) ; toast `bookslm.inserted` ou + `bookslm.insert_no_editor` si aucun éditeur ouvert. + - [x] **D4.** Révélation au survol / focus clavier (`.bookslm-msg:hover`, + `:focus-within`) — icônes Lucide `copy` / `corner-down-left`. -## E. Points d'attention - - Le tag provient du **backend réel** (`provider`/`model` du SSE) et reflète donc le - modèle effectif même lorsque l'utilisateur conserve la sélection « par défaut ». - - Le copier utilise le texte brut (pas le HTML rendu) — cohérent avec l'export de - conversation et évite d'embarquer des liens/balises de rendu. \ No newline at end of file +## E. Tests & documentation — ✅ livré + - [x] **E1.** `tests/frontend/ai.test.mjs` : ordre chronologique, ancrage + `scrollIntoView block:start`, tag provider/modèle, barre d'actions par rôle, + copie du texte brut, insertion éditeur (mock `state.editorView`), bloc + repliable des étapes, absence de barre pour contenu vide. + - [x] **E2.** i18n FR/EN : `bookslm.copied`, `bookslm.insert`, `bookslm.insert_hint`, + `bookslm.inserted`, `bookslm.insert_no_editor`, `ai.steps_count`. + - [x] **E3.** CHANGELOG + Roadmap ; `SW_VERSION` bump (cache bust). + +## F. Points d'attention + - Le tag fournisseur provient du **backend réel** (SSE), donc correct même avec la + sélection « par défaut » du fournisseur. + - Le streaming appelle `_renderMessages()` à chaque chunk : l'ancre est posée une + seule fois à l'envoi, les re-rendus préservent ensuite le scroll — pas de sauts. + - L'ancien épinglage flex `order: -1` (première itération de #91) est **remplacé** : + l'ordre est redevenu chronologique, l'ancrage est fait par défilement explicite. + - Les pouces haut/bas Notion ne sont **pas** repris : aucun signal n'existe + côté backend ; « Ajouter » (insertion éditeur réelle) les remplace utilement. \ No newline at end of file diff --git a/frontend/js/bookslm.js b/frontend/js/bookslm.js index 0049585..739104a 100644 --- a/frontend/js/bookslm.js +++ b/frontend/js/bookslm.js @@ -215,7 +215,7 @@ class BooksLM { this._setHidden(false); this._updateHeader(); this._updateStatus(); - this._renderMessages(); + this._renderMessages({ anchor: true }); this._showSuggestions(); this._renderAttachments(); this._closeHistoryMenu(); @@ -1492,7 +1492,7 @@ class BooksLM { _pushAssistantNote(markdown) { this._messages.push({ role: 'assistant', content: markdown, sources: [], toolCalls: [], confirmation: null }); - this._renderMessages(); + this._renderMessages({ anchor: true }); this._saveHistory(); } @@ -1777,42 +1777,62 @@ class BooksLM { } } - _renderMessages() { + _renderMessages(opts = {}) { if (!this._panel) return; const container = this._panel.querySelector('.bookslm-messages'); if (!container) return; + const prevTop = container.scrollTop; container.innerHTML = ''; - // The "latest turn" — the most recent user post and, when present, its - // assistant answer — is pinned to the top of the window. Everything from - // the last user message onward stays in view so the submitted post and - // the answer being written are always visible. - let lastUserIdx = -1; - for (let i = this._messages.length - 1; i >= 0; i--) { - if (this._messages[i].role === 'user') { lastUserIdx = i; break; } + // Notion-style thread: chronological order, the user post anchored at the + // top of the visible area (never scroll-to-bottom — the answer streams + // below the question). Streaming re-renders preserve the scroll position + // so the reader is never jumped around. + for (const msg of this._messages) { + container.appendChild(this._chatBubble(msg)); } - for (let i = 0; i < this._messages.length; i++) { - const msg = this._messages[i]; - const bubble = this._chatBubble(msg, i >= lastUserIdx && lastUserIdx >= 0); - container.appendChild(bubble); - } - - container.scrollTop = container.scrollHeight; + if (opts.anchor) this._anchorLatestUser(); + else container.scrollTop = prevTop; } /** - * Build a single chat bubble (shared by user and assistant messages). - * - * Each bubble is wrapped in a `bookslm-msg` block. Bubbles flagged as part - * of the latest turn carry `.latest` and are pinned to the very top of the - * messages window (`.bookslm-msg.latest { order: -1; }`), so a submitted - * post and the answer being streamed stay visible regardless of auto-scroll - * to the bottom and of prior conversation history. + * Scroll the messages window so the most recent user post sits at the very + * top of the viewport (its `scroll-margin-top` keeps a breathing gap), + * reproducing Notion-AI's conversation anchoring. */ - _chatBubble(msg, isLatest) { + _anchorLatestUser() { + if (!this._panel) return; + const container = this._panel.querySelector('.bookslm-messages'); + if (!container) return; + const users = container.querySelectorAll('.bookslm-msg.user'); + const all = container.querySelectorAll('.bookslm-msg'); + // Fallback (admin notes with no user post): anchor the newest message. + const el = users[users.length - 1] || all[all.length - 1] || container.firstElementChild; + if (!el) return; + const apply = () => { + try { + el.scrollIntoView({ behavior: 'smooth', block: 'start' }); + } catch { + const cRect = container.getBoundingClientRect(); + const eRect = el.getBoundingClientRect(); + container.scrollTop += eRect.top - cRect.top; + } + }; + if (typeof requestAnimationFrame === 'function') requestAnimationFrame(apply); + else apply(); + } + + /** + * Build a single chat entry (user or assistant), Notion-style: + * • user → right-aligned rounded grey bubble (max 80%), + * • assistant → full-width text with no background bubble, a discreet + * provider/model tag above, a collapsible “N steps” block for agent + * tool calls, and a hover-revealed action bar (Copier) below. + */ + _chatBubble(msg) { const wrap = document.createElement('div'); - wrap.className = 'bookslm-msg ' + msg.role + (isLatest ? ' latest' : ''); + wrap.className = 'bookslm-msg ' + msg.role; if (msg.role === 'assistant') { // Discreet provider/model tag above the answer. Uses the actual engine @@ -1826,13 +1846,15 @@ class BooksLM { metaLine.title = label; wrap.appendChild(metaLine); } + // Notion-style: the tool calls collapse into a “N steps” line above the + // answer instead of a visible list. + if (msg.toolCalls && msg.toolCalls.length) { + wrap.appendChild(this._renderToolActivity(msg.toolCalls)); + } const bubble = document.createElement('div'); bubble.className = 'bookslm-bubble assistant'; const { text, actions } = this._extractActions(msg.content || ''); bubble.innerHTML = this._renderMarkdown(text); - if (msg.toolCalls && msg.toolCalls.length) { - bubble.insertBefore(this._renderToolActivity(msg.toolCalls), bubble.firstChild); - } if (actions.length) { const actionsDiv = document.createElement('div'); actionsDiv.className = 'bookslm-actions'; @@ -1863,26 +1885,71 @@ class BooksLM { wrap.appendChild(bubble); } - // Copy button under the message block. - this._appendCopyButton(wrap, msg); + // Notion-style action bar revealed on hover of the message block. + this._appendActionBar(wrap, msg); return wrap; } - /** Copy the raw message text to the clipboard (user or assistant block). */ - _appendCopyButton(wrap, msg) { + /** Hover action bar under a message: Copy (both roles) + Add (assistant). */ + _appendActionBar(wrap, msg) { const content = String(msg.content || '').trim(); if (!content) return; + const bar = document.createElement('div'); + bar.className = 'bookslm-msg-actions'; + + bar.appendChild(this._actionBtn(t('bookslm.copy'), 'copy', t('bookslm.copy'), () => { + this._copyText(content); + })); + if (msg.role === 'assistant') { + bar.appendChild(this._actionBtn(t('bookslm.insert'), 'insert', t('bookslm.insert_hint'), () => { + this._insertIntoEditor(content); + })); + } + wrap.appendChild(bar); + } + + _actionBtn(label, name, title, onClick) { const btn = document.createElement('button'); btn.type = 'button'; - btn.className = 'bookslm-copy-btn'; - btn.textContent = t('bookslm.copy'); - btn.title = t('bookslm.copy'); - btn.setAttribute('aria-label', t('bookslm.copy')); - btn.addEventListener('click', () => { - this._copyText(content); - }); - wrap.appendChild(btn); + btn.className = `bookslm-msg-action bookslm-msg-action-${name}`; + btn.title = title; + btn.setAttribute('aria-label', title); + const icon = document.createElement('span'); + icon.setAttribute('data-lucide', name === 'copy' ? 'copy' : 'corner-down-left'); + icon.style.cssText = 'width:12px;height:12px'; + btn.appendChild(icon); + const text = document.createElement('span'); + text.textContent = label; + btn.appendChild(text); + btn.addEventListener('click', onClick); + if (typeof safeCreateIcons === 'function') safeCreateIcons(); + return btn; + } + + /** + * Append an assistant answer to the Forge editor document (Notion “Ajouter”). + * No-ops with a toast when no editor session is open. + */ + _insertIntoEditor(text) { + const view = state.editorView; + if (!view || !view.state || typeof view.dispatch !== 'function') { + showToast(t('bookslm.insert_no_editor'), 'info'); + return; + } + try { + const at = view.state.selection.main.to; + const insert = (at > 0 ? '\n' : '') + text; + view.dispatch({ + changes: { from: at, insert }, + selection: { anchor: at + insert.length }, + }); + if (typeof view.focus === 'function') view.focus(); + showToast(t('bookslm.inserted'), 'success'); + } catch (e) { + console.warn('AI assistant: insert into editor failed', e); + showToast(t('bookslm.insert_no_editor'), 'error'); + } } _copyText(text) { @@ -1975,9 +2042,13 @@ class BooksLM { // ── Tool activity & confirmations (agent mode) ────────────────────── + /** Agent tool calls collapse into a discreet “N steps” line (Notion-style). */ _renderToolActivity(toolCalls) { - const wrap = document.createElement('div'); + const wrap = document.createElement('details'); wrap.className = 'bookslm-tool-trace'; + const summary = document.createElement('summary'); + summary.textContent = t('ai.steps_count', { count: toolCalls.length }); + wrap.appendChild(summary); for (const call of toolCalls) { const line = document.createElement('div'); line.className = 'bookslm-tool-line' + (call.ok === false ? ' failed' : ''); @@ -2128,6 +2199,7 @@ class BooksLM { // The confirmation is resolved: drop the card and show the continuation. msg.confirmation = null; this._messages.push(continuation); + this._renderMessages({ anchor: true }); await this._streamResponse(resp, continuation, payload); } finally { conf._applying = false; @@ -2178,7 +2250,7 @@ class BooksLM { .map((m) => ({ role: m.role, content: m.content })); this._messages.push({ role: 'user', content: text }); - this._renderMessages(); + this._renderMessages({ anchor: true }); let provider = null; let model = null; @@ -2764,7 +2836,7 @@ class BooksLM { this._messages = Array.isArray(session.messages) ? session.messages : []; this._closeHistoryMenu(); if (this._panel) { - this._renderMessages(); + this._renderMessages({ anchor: true }); this._showSuggestions(); this._renderHistoryMenu(); } diff --git a/frontend/locales/en.json b/frontend/locales/en.json index 74a2d1c..7a37c87 100644 --- a/frontend/locales/en.json +++ b/frontend/locales/en.json @@ -1,1872 +1,1877 @@ -{ - "_meta": { - "locale": "en", - "name": "English" - }, - "about.api_version": "API version", - "about.backend": "Backend", - "about.browser": "Browser", - "about.built_with": "Built with", - "about.editor": "Editor", - "about.file_watcher": "File watching", - "about.files": "Files", - "about.files_indexed": "Indexed files", - "about.footer": "Made with ☕, 🍕 and a few accidental git push --force.", - "about.frontend": "Frontend", - "about.fun_quote": "\"No LLM was harmed during this development.\"", - "about.git": "Git : —", - "about.icons": "Icons", - "about.joke_0": "0 known bugs. The others are shy.", - "about.joke_1": "Compiles on the first try. (Except Monday mornings.)", - "about.joke_2": "Written by a human. Probably.", - "about.joke_3": "No LLMs were harmed during this development.", - "about.joke_4": "When it works, we call it a feature.", - "about.joke_5": "CSS: 90% of dev time, 10% of the code.", - "about.joke_6": "Dark mode active since the project's birth.", - "about.joke_7": "Works on my machine™", - "about.joke_8": "Technically, everything is an edge case.", - "about.joke_9": "The CSS for this panel took longer than the backend.", - "about.language": "Language", - "about.last_delivery": "Last delivery : June 2026", - "about.made_with": "Made with ☕, 🎧 and a few accidental git push --force.", - "about.markdown_renderer": "Markdown rendering", - "about.name": "Name", - "about.platform": "Platform", - "about.section_app": "Application", - "about.section_components": "Components", - "about.section_env": "Environment", - "about.status": "Status", - "about.subtitle": "Your Obsidian notes, simply accessible.", - "about.syntax_highlight": "Syntax highlighting", - "about.tagline": "Your Obsidian notes,
simply accessible.", - "about.tests": "Tests", - "about.vaults_configured": "Configured vaults", - "about.version": "Version", - "admin.audit_all_actions": "All actions", - "admin.audit_empty": "No log available", - "admin.audit_filter_action": "Action", - "admin.audit_filter_user": "Filter by user", - "admin.audit_refresh": "Refresh", - "admin.audit_title": "Audit logs", - "admin.back_btn": "← Back", - "admin.backups_newest": "Newest: {days} days", - "admin.backups_oldest": "Oldest: {days} days", - "admin.backups_per_vault": "Per vault", - "admin.backups_title": "Backup statistics", - "admin.backups_total": "Total: {count} backups ({size})", - "admin.backups_vault_empty": "No backup", - "admin.close": "Close", - "admin.col_actions": "Actions", - "admin.col_last_login": "Last login", - "admin.col_role": "Role", - "admin.col_status": "Status", - "admin.col_user": "User", - "admin.col_vaults": "Vaults", - "admin.forbidden_msg": "You must be an administrator to access this page.", - "admin.forbidden_title": "Access denied", - "admin.header_subtitle": "Administrator dashboard", - "admin.new_user": "+ New user", - "admin.page_title": "ObsiGate — Administration", - "admin.stats_cpu": "CPU", - "admin.stats_disk": "Disk", - "admin.stats_memory": "Memory", - "admin.stats_refresh": "Last update: {time}", - "admin.stats_sessions": "Active sessions", - "admin.stats_title": "Real-time statistics", - "admin.stats_uptime": "Uptime", - "admin.title": "Administration — Users", - "admin.users_manage_btn": "Manage users", - "admin.users_manage_hint": "Open the user management modal (full CRUD)", - "admin.users_title": "User management", - "ai.action_applied": "Applied ✓", - "ai.action_apply": "Apply", - "ai.action_applying": "Applying…", - "ai.action_create_dir": "Create folder {path}", - "ai.action_create_file": "Create file {path}", - "ai.action_created_dir": "Folder created: {path}", - "ai.action_created_file": "File created: {path}", - "ai.action_failed": "Action failed: {error}", - "ai.agent_mode_off": "Agent mode off (read/search + actions)", - "ai.agent_mode_on": "Agent mode on (read/search tools + actions)", - "ai.casual": "Casual tone", - "ai.close": "Close assistant", - "ai.completion_added": "AI: completion added", - "ai.context_documents": "{count} open document(s)", - "ai.context_general": "General context", - "ai.context_general_desc": "Questions about the app and file creation", - "ai.continue": "Continue", - "ai.custom_rewrite": "Custom rewrite", - "ai.diff_preview": "Change preview", - "ai.done": "AI: text processed", - "ai.edit": "Edit", - "ai.error_invalid_key": "Invalid API key", - "ai.explain": "Explain", - "ai.fix_spelling": "Fix spelling", - "ai.fix_spelling_hint": "Fixes spelling and grammar", - "ai.frontmatter": "Generate frontmatter", - "ai.fullscreen": "Fullscreen", - "ai.generate": "Generate", - "ai.hint_add_details": "Adds details", - "ai.hint_edit_selection": "Modifies the selected text", - "ai.hint_generate": "Generates content from the selection", - "ai.hint_improve": "Improves text quality", - "ai.hint_translate": "Translates the selected text", - "ai.improve": "Improve", - "ai.input_hint": "Enter to send · Ctrl+Enter for a line break", - "ai.inline_completion_title": "AI Inline Completion (Ctrl+J) — Auto-complete text", - "ai.invalid_api_key": "AI: invalid API key. Check DEEPSEEK_API_KEY in .env", - "ai.longer": "Longer", - "ai.no_api_key": "No API key configured", - "ai.not_configured": "⚠️ AI not configured — add DEEPSEEK_API_KEY, OPENROUTER_API_KEY or GEMINI_API_KEY in .env", - "ai.processing": "⏳ AI: processing...", - "ai.professional": "Professional tone", - "ai.provider": "Provider", - "ai.provider_default": "— default —", - "ai.model": "Model", - "ai.model_default": "— default —", - "ai.model_loading": "Loading…", - "ai.model_offline": "offline", - "ai.model_load_error": "Load error", - "ai.model_settings": "Provider & model", - "ai.model_search": "Search a model…", - "ai.model_info": "Model capabilities", - "ai.model_more": "… {count} more — refine your search", - "ai.add_context": "Add context", - "ai.attach_image": "Attach an image", - "ai.cap_audio_speech": "Audio Speech", - "ai.cap_audio_transcription": "Audio Transcriptions", - "ai.cap_chat": "Chat", - "ai.cap_embeddings": "Embeddings", - "ai.cap_images": "Images", - "ai.cap_rerank": "Rerank", - "ai.cap_video": "Video", - "ai.cap_vision": "Vision capable", - "ai.commands": "Commands", - "ai.activity_sending": "Sending request…", - "ai.activity_streaming": "Receiving response…", - "ai.activity_tool": "Tool: {name}…", - "ai.activity_confirmation": "Waiting for confirmation…", - "ai.activity_error": "Request failed", - "ai.activity_done": "Done", - "ai.composer_label": "Message to the assistant", - "ai.create_skill": "Create a skill", - "ai.image": "image", - "ai.keys": "Stored API keys", - "ai.model_changed": "Model changed: {name}", - "ai.no_results": "No results", - "ai.none": "None", - "ai.provider_changed": "Provider changed: {name}", - "ai.providers": "Active providers", - "ai.remove": "Remove", - "ai.resize_panel": "Resize panel", - "ai.skill_created": "Skill \"{name}\" created", - "ai.skill_id": "Identifier", - "ai.skill_label": "Name", - "ai.skill_prompt": "Prompt / instructions", - "ai.skill_prompt_placeholder": "Describe the expected behaviour of the skill…", - "ai.usage_model": "Available models: {list}", - "ai.usage_provider": "Available providers: {list}", - "ai.vision_unsupported": "The selected model does not support image analysis", - "ai.quota_exceeded": "AI: quota exceeded or payment required", - "ai.rewrite": "💬 Rewrite", - "ai.rewrite_done": "AI: text rewritten", - "ai.rewrite_prompt": "Rewrite instruction:", - "ai.rewrite_placeholder": "e.g. make the tone more formal and add a conclusion", - "ai.rewrite_title": "Rewrite text according to your instructions", - "ai.select_text": "AI: select text to process", - "ai.shorter": "Shorter", - "ai.shorter_hint": "Makes the text more concise", - "ai.simplify": "Simplify", - "ai.simplify_hint": "Simplifies the language", - "ai.suggestion_capabilities": "What can you do?", - "ai.suggestion_create_file": "Create a meeting notes file", - "ai.suggestion_docs_contradictions": "Are there contradictions between these documents?", - "ai.suggestion_docs_keypoints": "What are the key points of these documents?", - "ai.suggestion_docs_summary": "Summarize the open documents", - "ai.suggestion_search": "How do I search my notes effectively?", - "ai.summarize": "Summarize", - "ai.text_processed": "AI: text processed ✓", - "ai.text_rewritten": "AI: text rewritten", - "ai.to_canvas": "Convert to Canvas", - "ai.to_list": "Convert to list", - "ai.to_table": "Convert to table", - "ai.tone_hint": "Changes the text tone", - "ai.tool_call": "Tool: {name}", - "ai.tool_call_failed": "Tool {name} failed", - "ai.toolbar_edit": "Edit", - "ai.toolbar_generate": "Generate", - "ai.toolbar_rewrite": "Rewrite", - "ai.toolbar_tone": "Tone", - "ai.toolbar_toolbox": "Toolbox", - "ai.toolbar_translate": "Translate", - "ai.toolbox": "🧰 Toolbox", - "ai.toolbox_hint": "Conversion tools", - "ai.translate_to": "Translate to {lang}", - "auth.cannot_delete_self": "Cannot delete your own account", - "auth.logged_out": "Signed out", - "auth.login_button": "Sign in", - "auth.login_error": "Invalid credentials", - "auth.login_title": "Secure access to your vaults", - "auth.logout_title": "Sign out", - "auth.network_error": "Network error — check your connection", - "auth.new_password": "New password (empty = unchanged)", - "auth.password": "Password", - "auth.password_min": "Min. 8 characters", - "auth.remember_me": "Remember me (30 days)", - "auth.session_expired": "Session expired, please sign in again", - "auth.user_deleted": "User deleted", - "auth.username": "Username", - "auto.0257e77f": "🧰 Toolbox ▾", - "auto.033a9ddf": "Default model", - "auto.03a6e5b1": "The operators used are displayed as", - "auto.13c3ee2c": "Search and autocomplete", - "auto.13eb7a51": "AI: invalid API key", - "auto.14c75ac6": "Select desired events", - "auto.195a8e44": "Create directory", - "auto.1a54bd69": "Combined example", - "auto.1a8a8118": "Drag and drop", - "auto.1abf6661": "The path displayed above the content is", - "auto.1d3330cc": "No automatic retry on failure", - "auto.1d46301c": "Line numbers", - "auto.1efbbc9a": "Editing with CodeMirror 6", - "auto.209c5490": "The top bar contains the essential elements:", - "auto.272dd29a": "Supported providers", - "auto.27a2f7c1": "ObsiGate supports opening multiple files simultaneously in tabs.", - "auto.28bf6aab": "Security: HMAC-SHA256 signature", - "auto.2a5af19b": "The workflow triggers automatically", - "auto.2bc24d2e": "All sensitive operations are logged", - "auto.2bc66bab": "Directory creation via API", - "auto.337d8626": "Light/dark theme", - "auto.37561472": "🛡️ Security", - "auto.396d0dd8": "The AI toolbar appears below the title", - "auto.3be698f6": "Favor operators", - "auto.404c8f1c": "Autocomplete helps you quickly find", - "auto.41d7c6af": "Dedicated directory", - "auto.460b8298": "Data", - "auto.4bc1f00a": "Use operators to refine your", - "auto.4c908ade": "Click a vault to open it and see its", - "auto.4d281c6c": "AI: text processed ✓", - "auto.4dfa6a25": "No vault filtering — a webhook listens to", - "auto.4fa5d7c2": "Quick editing", - "auto.559ef1da": "Recommended workflow", - "auto.598a0ca7": "Tracked events", - "auto.5a486420": "Delete directory", - "auto.5d4a2516": "Open a file in Edit mode (✏️ button", - "auto.5d936af6": "Generated regex", - "auto.62c3d50d": "💬 Rewrite", - "auto.678711b5": "Select a context", - "auto.695d9e47": "CodeMirror 6 Editor", - "auto.6c166d35": "ObsiGate is your web gateway to your Obsidian vaults. Access, browse, and search all your notes from any device via a modern and responsive interface.", - "auto.72e515fa": "Access control by vault", - "auto.753d30a8": "Open a file to see it", - "auto.774dbd63": "The Command Palette allows quick keyboard access to all ObsiGate functions. Use it to open files, execute commands, and navigate without touching the mouse.", - "auto.79f6e1dd": "Multi-window", - "auto.7c9cdc3c": "Check the events to listen to", - "auto.7e13c97a": "These settings apply immediately", - "auto.83a0efdf": "Reindexing", - "auto.9122fd5c": "Advanced configuration", - "auto.98c547ea": "do not trigger", - "auto.a05514cb": "Creation via API or palette", - "auto.a105a2d9": "Edit ▾", - "auto.a131dfab": "CodeMirror Editor", - "auto.a232672b": "Deployment", - "auto.a3319169": "📦 About", - "auto.aa8ca265": "The view uses the Barnes-Hut algorithm to calculate the layout in O(n log n), ensuring smooth performance even with hundreds of nodes.", - "auto.ab5e6155": "ObsiGate automatically creates backups before", - "auto.aedff644": "Create markdown file", - "auto.b114ed1c": "These settings are saved on the server. Some require a restart or reindexing.", - "auto.b419c2c2": "Python receiver (Flask)", - "auto.b86ba5ea": "Multi-criteria search", - "auto.b893650a": "Edit current file", - "auto.ba768f01": "Supported events", - "auto.c089d968": "Pin files to find them", - "auto.c14b5603": "🎨 Themes", - "auto.c4922a99": "🤖 Artificial Intelligence in the Editor", - "auto.caac40b9": "Choose a visual theme. Each theme offers", - "auto.cd7332c8": "Results include facets to refine", - "auto.ce4eb802": "Generate ▾", - "auto.d33601dc": "Real-time file monitoring via", - "auto.d4d28717": "Trigger", - "auto.e0b8a606": "Define tag patterns to hide from", - "auto.e61598c1": "Share a document to see it", - "auto.ec7260fa": "Supported file types", - "auto.edf89626": "The built-in editor offers:", - "auto.ef8c5f4d": "The built-in editor offers a complete editing experience:", - "auto.f346076a": "✏️ Advanced Editing", - "auto.f5a8c116": "Event", - "auto.f8ba6127": "🗂️ Hidden files", - "auto.fc694490": "Deletion via API or editor", - "backup.delete": "Delete", - "backup.diff": "Compare", - "backup.file_restored": "File restored successfully", - "backup.no_backups": "No backups", - "backup.preview": "Preview", - "backup.purge": "Purge", - "backup.restore": "Restore", - "backup.restore_failed": "Restore failed", - "backup.select_to_restore": "Select a backup to restore", - "backup.timestamp_not_found": "Cannot find backup timestamp", - "backup.title": "Backups", - "backup.version": "Version from {date}", - "backups.delete_confirm": "Delete this backup?", - "backups.empty": "No backups available for this file.", - "backups.hint": "Backups are created automatically before each modification.", - "backups.loading": "Loading backups...", - "backups.purge_file": "Delete ALL backups of", - "backups.purge_vault": "Delete ALL backups from vault", - "backups.restore_confirm": "to the selected backup version?\nThe current version will be saved.", - "backups.title": "Backups", - "button.cancel": "Cancel", - "common.actions": "Actions", - "common.all": "All", - "common.back": "Back", - "common.cancel": "Cancel", - "common.close": "Close", - "common.confirm": "Confirm", - "common.copied": "Copied!", - "common.copy": "Copy", - "common.create": "Create", - "common.delete": "Delete", - "common.download": "Download", - "common.edit": "Edit", - "common.error": "Error", - "common.loading": "Loading...", - "common.move": "Move", - "common.never": "Never", - "common.next": "Next", - "common.no": "No", - "common.none": "None", - "common.ok": "OK", - "common.previous": "Previous", - "common.refresh": "Refresh", - "common.rename": "Rename", - "common.root": "(root)", - "common.save": "Save", - "common.search": "Search", - "common.unknown": "Unknown", - "common.yes": "Yes", - "collab.peers_title": "{count} person(s) connected", - "collab.presence_title": "Real-time collaboration", - "collab.status_connected": "Collaboration active", - "collab.status_connecting": "Connecting to collaboration…", - "collab.status_disconnected": "Collaboration lost — reconnecting…", - "config.about": "About", - "config.about_error": "Loading error", - "config.about_loading": "Loading...", - "config.add_webhook": "Add", - "config.ai_deepseek_label": "DeepSeek API Key", - "config.ai_default_model": "Default model", - "config.ai_capabilities": "Model capabilities", - "config.ai_default_provider": "Default provider", - "config.ai_gemini_label": "Gemini API Key", - "config.ai_keys": "AI API keys", - "config.ai_keys_desc": "Configure API keys for the AI editor.", - "config.ai_model": "Model", - "config.ai_openrouter_label": "OpenRouter API Key", - "config.api_keys_saved": "API keys saved", - "config.backups": "Backups", - "config.backups_desc": "Manage automatic file backups.", - "config.client_config": "Client config", - "config.create_share": "Create share", - "config.debounce_label": "Debounce delay (ms)", - "config.diagnostics": "Diagnostics", - "config.diagnostics_desc": "Technical information about the server state.", - "config.display_name": "Display name", - "config.error_prefix": "Error", - "config.error_unknown": "Unknown error", - "config.force_reindex": "Force reindex", - "config.hidden_files": "Hidden files", - "config.hidden_files_desc": "Hide files/folders starting with a dot in the interface (they remain indexed and searchable)", - "config.hidden_files_toggle": "Hide hidden files/folders", - "config.hidden_include_label": "Include hidden files", - "config.hidden_whitelist_label": "Whitelist (comma-separated)", - "config.hint_activer_d_sactiver_la_surveillance_automatique_des": "Enable/disable automatic file monitoring", - "config.hint_annuler_la_recherche_apr_s_ce_d_lai_5000_120000_": "Cancel search after this delay (5000-120000)", - "config.hint_contenu_index_par_fichier_10k_1m_r_indexation_requ": "Max content size per file (bytes)", - "config.hint_d_lai_avant_ex_cution_de_la_recherche_100_2000_": "Delay before search execution (100-2000)", - "config.hint_d_lai_avant_traitement_des_changements_group_s_0_5": "Delay before processing grouped changes (0.5-10 seconds)", - "config.hint_entre_5_et_100_fichiers_sauvegarde_sur_le_serveur_": "Between 5 and 100 files (stored on server)", - "config.hint_forcer_le_mode_polling_au_lieu_de_inotify_natif_ut": "Forcer le mode polling au lieu de inotify natif (utile si le mode natif ne fonctionne pas)", - "config.hint_intervalle_de_scrutation_en_mode_polling_1_30_seco": "Intervalle de scrutation en mode polling (1-30 secondes)", - "config.hint_multiplicateur_de_pertinence_pour_les_correspondan": "Multiplicateur de pertinence pour les correspondances dans le titre", - "config.hint_nombre_de_r_sultats_affich_s_par_page_10_200_": "Number of results displayed per page (10-200)", - "config.hint_nombre_max_de_tokens_largis_par_pr_fixe_10_200_": "Max expanded tokens per prefix (10-200)", - "config.hint_nombre_maximum_de_versions_backup_conservees_par_f": "Maximum backup versions kept per file (1-50)", - "config.hint_nombre_minimum_de_caract_res_avant_recherche_1_5_": "Minimum characters before search triggers (1-5)", - "config.hint_threads_d_di_s_la_recherche_1_8_": "Dedicated search threads (1-8)", - "config.just_now": "just now", - "config.lang_hint": "Used by autocomplete and ghost text.", - "config.lang_label": "Preferred language", - "config.link_copied": "Link copied!", - "config.link_created": "Link created!", - "config.logout": "Sign out", - "config.max_backups": "Max backups per file", - "config.max_backups_desc": "Maximum backup versions kept per file (1-50)", - "config.max_backups_label": "Max backups per file", - "config.max_content_hint": "Indexed content per file (10K-1M). Reindex required.", - "config.max_content_label": "Max content size (bytes)", - "config.max_content_size": "Max content size (bytes)", - "config.max_prefix_expansions": "Max prefix expansions", - "config.min_query_label": "Min. query length", - "config.min_query_length": "Min query length", - "config.name_placeholder": "Your name", - "config.no_keys": "No keys to save", - "config.no_restart": "No restart needed", - "config.note": "Note:", - "config.open_new_window": "Open in new window", - "config.prefix_expansions_hint": "Max tokens expanded by prefix (10-200)", - "config.prefix_expansions_label": "Max prefix expansions", - "config.profile": "User profile", - "config.profile_desc": "Personal preferences to customize your ObsiGate experience.", - "config.project_repo": "project repository", - "config.recent_history_count": "Files in history", - "config.recent_history_count_desc": "Between 5 and 100 files (saved on server)", - "config.reindex": "Reindex", - "config.reindex_desc": "Rebuild the search index for all vaults.", - "config.reindex_error": "Reindex error", - "config.reindexing": "Reindexing...", - "config.reset": "Reset", - "config.restart_required": "Restart required", - "config.results_per_page": "Results per page", - "config.results_per_page_label": "Results per page", - "config.save": "Save", - "config.save_ai_keys": "Save keys", - "config.save_backend": "Save server configuration", - "config.save_error": "Save error", - "config.save_hidden": "Save", - "config.saved": "✓ Saved", - "config.saving": "Saving", - "config.search_timeout": "Search timeout (ms)", - "config.search_workers": "Search workers", - "config.search_workers_hint": "Dedicated search threads (1-8)", - "config.search_workers_label": "Search workers", - "config.section_a-propos": "📦 About", - "config.section_about": "About", - "config.section_actions-sur-fichiers": "File actions", - "config.section_activation": "Activation", - "config.section_affichage": "Affichage", - "config.section_ai": "AI API keys", - "config.section_arborescence-des-vaults": "Arborescence des vaults", - "config.section_astuces-et-bonnes-pratiques": "💡 Astuces et bonnes pratiques", - "config.section_audit-log": "Audit log", - "config.section_authentification": "Authentification", - "config.section_autocompletion": "Autocompletion", - "config.section_backend": "🖥️ Backend Settings", - "config.section_backup-automatique": "Backup automatique", - "config.section_backups": "Backups", - "config.section_barre-d-outils-ai": "Barre d'outils AI", - "config.section_breadcrumb-et-repositionnement": "Breadcrumb et repositionnement", - "config.section_cas-d-usage": "Cas d'usage", - "config.section_cas-d-usage-avances": "Advanced use cases", - "config.section_chips-de-filtres-actifs": "Chips de filtres actifs", - "config.section_cles-api-intelligence-artificielle": "🤖 Cles API Intelligence Artificielle", - "config.section_configuration": "Configuration", - "config.section_configuration-avancee": "Advanced configuration", - "config.section_construit-avec": "Construit avec", - "config.section_diag": "Diagnostics", - "config.section_diagnostics": "Diagnostics", - "config.section_editeur-codemirror": "CodeMirror Editor", - "config.section_editeur-codemirror-6": "CodeMirror 6 Editor", - "config.section_edition-avancee": "✏️ Advanced Editing", - "config.section_edition-avec-codemirror-6": "Editing with CodeMirror 6", - "config.section_en-tete": "Header", - "config.section_evenements-supportes": "Supported events", - "config.section_exemples-concrets": "Exemples concrets", - "config.section_facettes-et-tri": "Facettes et tri", - "config.section_fichiers": "📄 Files", - "config.section_filtrage-de-la-sidebar": "Filtrage de la sidebar", - "config.section_filtrage-de-tags": "Filtrage de tags", - "config.section_filtrage-de-tags-template": "Filtrage de tags template", - "config.section_fonctionnalites": "Features", - "config.section_format-du-payload": "Format du payload", - "config.section_gestion-des-onglets": "📑 Gestion des onglets", - "config.section_hidden": "Hidden files", - "config.section_historique-recent-redemarrage-non-requis": "📋 Recent History\n No restart required", - "config.section_indicateurs-visuels": "Indicateurs visuels", - "config.section_intelligence-artificielle-dans-l-editeur": "🤖 AI in the Editor", - "config.section_interaction": "Interaction", - "config.section_interface": "Interface", - "config.section_interface-utilisateur": "🧭 Interface utilisateur", - "config.section_limitations-actuelles": "Limitations actuelles", - "config.section_mode-commandes": "Mode commandes", - "config.section_mode-fichiers": "File mode", - "config.section_navigation": "Navigation", - "config.section_navigation-entre-onglets": "Navigation entre onglets", - "config.section_onglets": "Onglets", - "config.section_operateurs-avances": "Advanced operators", - "config.section_optimisations": "Optimisations", - "config.section_ouverture": "Ouverture", - "config.section_ouverture-d-onglets": "Ouverture d'onglets", - "config.section_palette-de-commandes": "⌨️ Palette de commandes", - "config.section_parametres-backend-redemarrage-requis": "Backend settings\n Restart required", - "config.section_parametres-de-recherche": "Search settings", - "config.section_partage-et-webhooks": "🔗 Partage et Webhooks", - "config.section_partages-publics": "📤 Partages publics", - "config.section_perf": "⚡ Performance", - "config.section_performance": "Performance", - "config.section_personnalisation": "🎨 Personnalisation", - "config.section_profil-utilisateur": "👤 Profil utilisateur", - "config.section_profile": "User profile", - "config.section_protection": "Protection", - "config.section_providers-supportes": "Supported providers", - "config.section_publication-publique": "Publication publique", - "config.section_raccourcis-clavier": "⌨️ Raccourcis clavier", - "config.section_recent": "📜 Recent History", - "config.section_recherche": "🔍 Recherche", - "config.section_recherche-et-autocompletion": "Search and autocompletion", - "config.section_recherche-simple": "Recherche simple", - "config.section_redimensionnement-de-la-sidebar": "Redimensionnement de la sidebar", - "config.section_sauvegarde-automatique": "Sauvegarde automatique", - "config.section_sauvegardes-et-audits": "💾 Sauvegardes et Audits", - "config.section_search": "Search settings", - "config.section_securite": "🛡️ Security", - "config.section_securite-signature-hmac-sha256": "Security: HMAC-SHA256 signature", - "config.section_selection-de-vault": "Vault selection", - "config.section_server": "Server", - "config.section_shares": "📤 Public Shares", - "config.section_sidebar-barre-laterale": "Sidebar", - "config.section_synchronisation-automatique": "Synchronisation automatique", - "config.section_tag-cloud": "Tag cloud", - "config.section_tags": "🏷️ Tag Filtering", - "config.section_tags-inline-vs-frontmatter": "Tags inline vs frontmatter", - "config.section_theme-clair-sombre": "Light/Dark theme", - "config.section_themes": "🎨 Themes", - "config.section_trucs-et-astuces": "Trucs et astuces", - "config.section_types-de-fichiers-supportes": "Supported file types", - "config.section_visualisation": "Visualisation", - "config.section_vue-graphe": "🗺️ Vue Graphe", - "config.section_watcher": "Auto sync", - "config.section_webhooks": "🔗 Webhooks", - "config.section_push": "🔔 Push notifications", - "config.section_plugins": "🧩 Plugins", - "config.section_workflow-recommande": "Recommended workflow", - "config.section_zone-de-contenu": "Zone de contenu", - "config.server_config": "Server config", - "config.settings_saved": "✓ Settings saved", - "config.share_revoked": "Share revoked", - "config.shares": "Public shares", - "config.shares_desc": "Manage public share links for your documents.", - "config.shares_empty": "No active shares", - "config.tag_boost_hint": "Relevance multiplier for tag matches", - "config.tag_boost_label": "Tag boost", - "config.tag_filtering_label": "Tag filtering", - "config.test": "Test", - "config.timeout_label": "Search timeout (ms)", - "config.title": "Settings", - "config.title_boost": "Title boost", - "config.title_boost_hint": "Relevance multiplier for title matches", - "config.title_boost_label": "Title boost", - "config.url_required": "URL required", - "config.watcher_debounce_label": "Debounce (s)", - "config.watcher_enabled_label": "Enable watcher", - "config.watcher_interval_label": "Polling interval (s)", - "config.watcher_polling_label": "Polling mode (fallback)", - "config.webhook_name_placeholder": "Name", - "config.webhook_url_placeholder": "URL", - "config.webhooks": "Webhooks", - "config.webhooks_desc": "HTTP notifications to external services on file changes.", - "config.plugins": "Plugins", - "config.plugins_desc": "Manage installed plugins for this vault.", - "config.workers_label": "Search workers", - "confirm.delete_dir": "Delete this folder and all its contents?", - "confirm.delete_dir_named": "Delete \"{path}\" and ALL its contents?", - "confirm.delete_file": "Permanently delete this file?", - "confirm.delete_file_named": "Delete file \"{path}\"?", - "confirm.logout": "Are you sure you want to sign out?", - "conflict.no_conflicts": "No conflicts detected", - "conflict.resolve_conflict": "Keep conflict version", - "conflict.resolve_local": "Keep local version", - "conflict.resolved": "Conflict resolved", - "dashboard.all_vaults": "All vaults", - "dashboard.bookmark_add": "Add to bookmarks", - "dashboard.bookmark_remove": "Remove from bookmarks", - "dashboard.bookmarks": "Bookmarks", - "dashboard.conflict_date": "Conflict of ", - "dashboard.conflict_resolved": "Conflict resolved", - "dashboard.conflicts": "Conflicts", - "dashboard.conflicts_title": "Sync conflicts", - "dashboard.copy_btn": "Copy", - "dashboard.count_files": "file", - "dashboard.count_files_plural": "files", - "dashboard.ctrl_hover_tip": "Hover over a document with Ctrl for a quick preview. Click Forge in the toolbar for the advanced editor.", - "dashboard.day_ago": "{n} d ago", - "dashboard.error_prefix": "Error: ", - "dashboard.expires": "Expires {date}", - "dashboard.hide": "Hide", - "dashboard.hour_ago": "{n} h ago", - "dashboard.just_now": "just now", - "dashboard.keep_conflict": "Keep conflict", - "dashboard.keep_original": "Keep original", - "dashboard.load_error": "Loading error", - "dashboard.loading": "Loading...", - "dashboard.min_ago": "{n} min ago", - "dashboard.no_bookmarks": "No bookmarks", - "dashboard.no_conflicts": "No conflicts", - "dashboard.no_recent": "No recent files", - "dashboard.no_shares": "No shared documents", - "dashboard.open_btn": "Open", - "dashboard.pin_error": "Pin error", - "dashboard.pin_hint": "Pin files to find them here.", - "dashboard.quick_help": "Quick Help", - "dashboard.recent": "Recent", - "dashboard.recent_hint": "Open a file to see it appear here", - "dashboard.shared_hint": "Share a document to see it appear here", - "dashboard.shares": "Shares", - "dashboard.show": "Show", - "dashboard.size_bytes": " B", - "dashboard.size_gb": " GB", - "dashboard.size_kb": " KB", - "dashboard.size_mb": " MB", - "dashboard.stats": "Statistics", - "dashboard.stats_files": "Files", - "dashboard.stats_size": "Total size", - "dashboard.stats_tags": "Unique tags", - "dashboard.stats_vaults": "Vaults", - "dashboard.tab_recent": "Recent", - "dashboard.tab_shared": "Shared", - "dashboard.tab_stats": "Statistics", - "dashboard.total_files": "Total files", - "dashboard.total_size": "Total size", - "dashboard.total_tags": "Unique tags", - "dashboard.vaults_count": "Vaults", - "dashboard.views": "{count} view(s)", - "dashboard.welcome": "Welcome to ObsiGate", - "dashboard.zero_files": "0 files", - "dragdrop.cross_vault_unsupported": "Cross-vault moves are not supported", - "dragdrop.move_failed": "Move failed", - "dragdrop.overlay_title": "Drop files or folders", - "dragdrop.overlay_vault_zone": "Import into Vault", - "dragdrop.overlay_ai_zone": "Analyze with AI Assistant", - "upload.uploading": "Uploading {count} file(s)...", - "upload.success": "Successfully imported {count} file(s)", - "upload.partial": "Imported {count} file(s) ({errors} errors)", - "upload.error": "Upload failed", - "upload.choose_target_folder": "Import Destination", - "upload.target_vault": "Target Vault", - "upload.vault_root": "/ (Vault root)", - "upload.target_directory": "Target subdirectory", - "upload.filter_folders": "Filter or search a folder...", - "upload.custom_folder": "Or enter a new subfolder path...", - "upload.import_summary": "Items to import: {files} file(s), {dirs} folder(s)", - "upload.import_button": "Import", - "editor.cancel": "Cancel", - "editor.close": "Close", - "editor.delete_error": "Delete error", - "editor.edit": "Edit current file", - "editor.edit_current_desc": "Open current file in editor", - "editor.find": "Find in file...", - "editor.find_case": "Case sensitive", - "editor.find_regex": "Regex", - "editor.find_whole": "Whole word", - "editor.forge_close_editor": "Close editor / modal", - "editor.forge_help": "Forge editor help", - "editor.no_results": "No results", - "editor.replace": "Replace", - "editor.save": "Save", - "editor.save_error": "Save error", - "editor.saved": "Saved ✓", - "editor.unsaved": "Unsaved changes", - "error.initialization": "Initialization error", - "file.copy_path": "Copy path", - "file.delete": "Delete", - "file.graph_view": "Graph view", - "file.new_file": "New file", - "file.new_folder": "New folder", - "file.properties": "Properties", - "file.rename": "Rename", - "forge.popout": "Open in new window", - "forge.popout_label": "pop-out", - "forge.title_placeholder": "Title...", - "graph.back": "Back", - "graph.btn_directory": "📁 Directory", - "graph.btn_full": "🌐 All", - "graph.cache_label": "(cached)", - "graph.category": "📂 Category", - "graph.click_to_open": "click to open", - "graph.ctrl_hover_preview": "Ctrl+hover = full preview", - "graph.ctrl_hover_preview_short": "Ctrl+hover = preview", - "graph.depth": "Depth", - "graph.depth_label": "depth={depth}", - "graph.edges_count": "{count} links", - "graph.error_loading": "Loading error", - "graph.export_png": "Export PNG", - "graph.favorites": "Favorites", - "graph.filter_tag": "Filter by tag", - "graph.filter_type": "Filter by type", - "graph.focus_mode": "Focus mode", - "graph.forward": "Forward", - "graph.fullscreen": "Full screen", - "graph.loading": "Building graph...", - "graph.nodes_count": "{count} nodes", - "graph.parent": "Parent", - "graph.published": "Published", - "graph.published_badge": "✅ published", - "graph.scope_directory": "Directory", - "graph.scope_full": "Full vault", - "graph.title": "Graph View — {vault}{path}", - "graph.type_directory": "Directory", - "graph.type_file": "File", - "graph.type_markdown": "Markdown", - "header.admin_panel": "Administration", - "header.config": "Settings", - "header.help": "Help", - "header.install_app": "Install app", - "header.logo": "ObsiGate", - "header.logout": "Sign out", - "header.menu_about": "About", - "header.menu_about_desc": "Version, credits & info", - "header.menu_admin": "Administration", - "header.menu_admin_desc": "Manage users", - "header.menu_api": "API", - "header.menu_api_desc": "OpenAPI documentation", - "header.menu_config": "Settings", - "header.menu_config_desc": "Application settings", - "header.menu_help": "User guide", - "header.menu_help_desc": "Open help", - "header.menu_logout": "Sign out", - "header.menu_logout_desc": "End session", - "header.menu_profile": "Profile", - "header.menu_profile_desc": "Language & preferences", - "header.menu_theme": "Theme", - "header.menu_theme_light": "Light", - "header.menu_toggle": "Menu", - "header.profile": "Profile", - "header.quick_help": "Quick Help", - "header.refresh": "Refresh", - "header.search_placeholder": "Search all vaults...", - "header.sidebar_toggle": "Toggle sidebar", - "header.sync_status": "Sync", - "help.00b9572b": "Results ranked by TF-IDF relevance", - "help.04df1506": "Global search with autocomplete", - "help.065f53ee": "Silent auto-save after 2s of inactivity", - "help.085ec31f": "Quick select at the top of the Vault tab", - "help.096367af": "Visual indicators", - "help.170a6982": "Horizontal display with the file name", - "help.229fd3e2": "Discord notification", - "help.2507242f": "🏷️ Tags", - "help.29afa01d": "🪝 Webhooks", - "help.2a2e5b0f": "⌨️ Keyboard shortcuts", - "help.2a92203f": "Tips and tricks", - "help.2c03a7ba": "Inline vs frontmatter tags", - "help.2dad2bfd": "Automatic save", - "help.381abec7": "Current limitations", - "help.3cf370b1": "Type a file name to find it quickly. The search uses the /api/suggest API for instant suggestions. Press Enter to open the selected file.", - "help.40dd7e38": "Test with curl", - "help.4de7e318": "The 50 most recent searches (localStorage)", - "help.550b0240": "Concrete examples", - "help.5ab8c78d": "Stay open until manually closed", - "help.5d0fbb81": "Workers, TF-IDF boosts, prefix expansions", - "help.5f87ea79": "Tag cloud", - "help.61ee5a22": "Interaction", - "help.62308f96": "Ctrl+Shift+Space: File palette (search by title)", - "help.62549eca": "💾 Backups and Audits", - "help.63f024d4": "Template tag filtering", - "help.686f8313": "💡 Tips and best practices", - "help.6a5ddef2": "Tags adapt to the selected vault", - "help.6ae5342c": "Index stats, memory, search engine", - "help.6b88a375": "Debounce delay, results per page, timeout", - "help.6b8fc728": "↑/↓ to navigate, Enter to select", - "help.6d547397": "Tab: Toggle between file mode and command mode", - "help.6e940dac": "Click the sidebar icon in the header", - "help.733f0559": "🗺️ Navigation", - "help.77f4f06e": "Payload format", - "help.7bcbb2e3": "Sidebar resizing", - "help.7db70e27": "Copy, Source, Download, Edit, Open in new window", - "help.83f1d9ca": "Protection", - "help.86e3825d": "🎨 Customization", - "help.8717768b": "Node metadata (tags, links, path)", - "help.89bd3c4c": "Only shows nodes with a specific tag", - "help.8c5341e0": "📑 Tab management", - "help.8c65b2f2": "🔗 Sharing and Webhooks", - "help.8caed987": "Display", - "help.9c7a0a8d": "🗺️ Graph View", - "help.9edeaa11": "Controls exploration depth (0-3)", - "help.9f78b3ec": "Easier navigation in long files", - "help.a4a4e21b": "\"×\" button to reset the filter", - "help.a579cf4d": "Preview note content without navigating", - "help.a648c49e": "Facets and sorting", - "help.ab2c4150": "Files (squares) and folders (circles) with icons", - "help.about": "About", - "help.access": "Access", - "help.action_buttons": "Action buttons", - "help.actions_available": "Buttons available above the content:", - "help.actions_detail": "Buttons available above the content:", - "help.activation": "Activation", - "help.active_filter_chips": "Active filter chips", - "help.active_tab": "Active tab", - "help.add_remove": "Add/Remove", - "help.adf30d78": "🔍 Search", - "help.advanced_operators": "Advanced operators", - "help.advanced_use_cases": "Advanced use cases", - "help.ai_completes": "Completes", - "help.ai_features": "Edit, tone, translate, generate and tools via AI.", - "help.ai_flash_green": "flashes green", - "help.ai_tone_casual": "Casual tone", - "help.all_vaults": "All vaults", - "help.atomic_writes": "Atomic writes", - "help.audit_log": "Audit log", - "help.auto_save": "Automatic save", - "help.auto_scroll": "Auto-scroll", - "help.autocomplete": "Autocomplete", - "help.b6619ac9": "Ctrl+Alt+Space: Command palette (action list)", - "help.backlinks_panel": "Backlinks panel", - "help.backup_auto": "Auto backup", - "help.before_write": "Before write", - "help.breadcrumb": "Breadcrumb", - "help.breadcrumb_clickable": "Clickable breadcrumb", - "help.breadcrumb_reposition": "Breadcrumb and repositioning", - "help.c017944b": "📄 Files", - "help.c48fb18a": "Authentication", - "help.c8532869": "Completion, rewrite, translation (see", - "help.case_sensitive": "Case-sensitive", - "help.cf8615b1": "Visualization", - "help.ci_cd": "CI/CD automation", - "help.clear": "Clear", - "help.clear_search": "Clear", - "help.click_segment": "Click a segment", - "help.click_tab": "Click a tab", - "help.click_vault": "Click the vault", - "help.clickable": "Clickable", - "help.close_help": "Close help", - "help.close_tab_x": "✕ button", - "help.code_preview": "Code + Preview", - "help.command_palette": "Command palette", - "help.configuration": "Settings", - "help.content_area": "Content area", - "help.content_shows": "The main area displays:", - "help.context_actions": "File actions", - "help.context_menu": "Context menu (right click)", - "help.copy_path": "Copy path", - "help.d186a19e": "The \"Recent\" tab in the sidebar lists your", - "help.d1ea1dc6": "n8n / Make (no-code)", - "help.d5c977ac": "Code blocks adapt to the theme", - "help.dark": "Dark", - "help.dashboard": "Dashboard statistics", - "help.delete": "Delete", - "help.desc_00b9572b": ":\n Results ranked by TF-IDF relevance", - "help.desc_04493800": ": 64\n caractères hexadécimaux, impossible à\n deviner", - "help.desc_065f53ee": ": Silent auto-save after 2s of inactivity, green confirmation flash", - "help.desc_071da87a": "Lecture seule : La vue publique n'affiche que le contenu sans édition", - "help.desc_0739c6a9": "Images : Support complet des syntaxes Obsidian", - "help.desc_085ec31f": ":\n Quick select at the top of the Vault tabs", - "help.desc_0f9a1e5b": "Use the sidebar to navigate between vaults and folders.", - "help.desc_11cf9e8a": "Éditer ▾ — Menu de modification du texte sélectionné : 🪄 Improve writing : Améliore la qualité, la clarté et le flux du texte", - "help.desc_13d206d4": "Transforms textual data into a readable Markdown table — ideal for comparisons and structured information.", - "help.desc_13d90039": "ObsiGate generates a shareable, read-only link.", - "help.desc_1577912b": "Rate limiting : 10 tentatives / 15 min par IP + verrouillage compte", - "help.desc_170a6982": "Converts a sentence or paragraph into a structured bullet-point list.", - "help.desc_188bc423": "Pour plus d'informations, consultez le dépôt du projet.", - "help.desc_19cf5730": "Rotation", - "help.desc_19cfa369": "Documents are automatically saved after each modification. A status indicator in the editor header confirms: Saved or Saving….", - "help.desc_1a04ae18": "Use the sidebar to navigate between vaults and folders.", - "help.desc_1ba39cc4": "Update", - "help.desc_1c130d89": "Translate — translates selected text to target language", - "help.desc_1f11691c": "Atomic writes : Écriture via fichier temporaire + renommage atomique", - "help.desc_2349271d": "Automatisation CI/CD : Déclencher un build quand une note de procédure est mise à jour", - "help.desc_26f81732": "Édition rapide : Ouvrez l'éditeur, modifiez, sauvegardez", - "help.desc_287be69c": "Vault", - "help.desc_2c220763": "Edit config.yaml to customize behavior", - "help.desc_2f2c16b5": "Publish", - "help.desc_31e7253b": "Each backup", - "help.desc_32e3d66d": "En cas d'erreur de clé API : AI: clé API invalide", - "help.desc_39979e71": "Vault", - "help.desc_39e97b2f": "Note: the file_modified event is reserved for future use and is not currently emitted.", - "help.desc_3ace259e": "— Inline completion", - "help.desc_3c4711b8": "Edit config.yaml to customize behavior", - "help.desc_3d4e9189": "Simplifies the language for easier reading — replaces complex terms and shortens long sentences.", - "help.desc_3da1896a": "Each webhook receives a POST with event details", - "help.desc_3db2812f": "X-ObsiGate-Signature: sha256=9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08 Pour vérifier côté récepteur : calculez HMAC-SHA256(corps_brut, secret) et comparez. Le header X-ObsiGate-Event contient aussi le type d'événement pour un routage rapide.", - "help.desc_40c92863": "Exploration par tags : Cliquez sur un tag dans une note pour voir toutes les notes similaires", - "help.desc_42a81347": "Casual and friendly tone — ideal for informal communication or social media.", - "help.desc_443b76b5": "Wikilinks : Naviguez entre notes comme dans Obsidian", - "help.desc_47e1e10f": "Générer ▾ — Génère du contenu à partir de la sélection : ℹ️ Explain this : Explique le texte sélectionné de façon claire", - "help.desc_4de7e318": ": The 50 most recent searches (localStorage)", - "help.desc_50a33a05": "Generates YAML frontmatter for the current document (title, date, tags based on content).", - "help.desc_5374685a": "Mobile-friendly : Utilisez le bouton hamburger sur mobile", - "help.desc_5396ed9e": "Profitez de l'historique : Réutilisez vos recherches fréquentes", - "help.desc_53bfaeca": "Navigation", - "help.desc_5524e921": "Adapts the tone for a formal, business context — suitable for reports, emails, and official documents.", - "help.desc_555e0305": "Pour changer de provider par défaut : AI_DEFAULT_PROVIDER=openrouter", - "help.desc_56760d7f": "Each webhook receives a POST with a JSON body containing the event type, vault, path, and a timestamp.", - "help.desc_58d2326f": "Use the sidebar to navigate between vaults and folders.", - "help.desc_599f3242": "Log", - "help.desc_5a53de53": "📏 Make shorter : Rend le texte plus concis tout en préservant l'information", - "help.desc_5ab8c78d": ":\n Stay open until manually closed", - "help.desc_5d0fbb81": ":\n Workers, TF-IDF boosts, prefix expansions", - "help.desc_5e9a7fd9": "In the", - "help.desc_5fc28b7d": "Created", - "help.desc_625112fd": "Sélectionnez un contexte : Choisissez un vault pour réduire le bruit", - "help.desc_660051b0": "Audit externe : Logger toutes les modifications dans une base de données externe", - "help.desc_664b1d09": "Use the sidebar to navigate between vaults and folders.", - "help.desc_68c2b170": "Rotation : Rotation automatique à 10 Mo", - "help.desc_6902f20d": "Favorisez les opérateurs : tag: et vault: accélèrent la recherche", - "help.desc_698d92ec": "Gestion de l'espace : Réduisez les sections Vaults/Tags selon vos besoins", - "help.desc_6a5ddef2": "Explains the selected passage with an educational style — defines technical terms and adds context.", - "help.desc_6a80241e": "Width", - "help.desc_6ae5342c": "Index stats", - "help.desc_6b649b1e": ": Highlighted in accent color", - "help.desc_6b88a375": ":\n Debounce delay, results per page, timeout", - "help.desc_6b8fc728": "Select", - "help.desc_6bc48f59": "Each webhook receives a POST with event details", - "help.desc_6caffeed": " — Conversion tools:", - "help.desc_6d68fbc9": "Create markdown file: Create a new .md file", - "help.desc_6ebebdfd": ": Each operator type has its color", - "help.desc_6f7c5889": "Alert", - "help.desc_71eeb16a": ":\n Réutilisez vos recherches fréquentes", - "help.desc_723ed8db": "Non-root Docker : Conteneur tourne avec UID 1000", - "help.desc_752789ab": "File", - "help.desc_759926ee": "Relaxed and friendly tone — ideal for informal communication or social media.", - "help.desc_7671e56a": "Avant écriture : Sauvegarde du contenu original dans .obsigate-backup/", - "help.desc_7708f226": "ObsiGate uses JWT tokens signed with a secret key defined in the .env file.", - "help.desc_7819b56f": "Each webhook receives a POST with event details", - "help.desc_7ab5be50": "Translates the selected text into the target language.", - "help.desc_7b45490b": "Each webhook receives a POST with event details", - "help.desc_7e86626c": "ObsiGate generates a shareable, read-only link. Anyone with the link can view the file content.", - "help.desc_7f1d0512": "Path traversal : Validation des chemins contre les attaques ../", - "help.desc_7ff2fa21": "Pendant une requête AI, un toast ⏳ AI: traitement en cours... s'affiche", - "help.desc_803161e5": "The toolbar contains the following buttons:", - "help.desc_828db5da": ": Both types are combined", - "help.desc_858681a1": ":\n Durée de vie en heures", - "help.desc_85effb89": "Each webhook receives a POST with event details", - "help.desc_8717768b": ": Node metadata (tags, links, path)", - "help.desc_87b348c3": "Recherche multi-critères : tag:docker tag:linux vault:IT nginx", - "help.desc_89a8f5de": "Example: publish a blog post when a file is marked publish: true.", - "help.desc_89bd3c4c": ": Only shows nodes with a specific tag", - "help.desc_8f0bffe3": "JWT tokens", - "help.desc_9186a3a3": "Explorez l'arborescence : Naviguez dans les dossiers", - "help.desc_93902d18": "Utilisez les tags : Filtrez par tags pour affiner", - "help.desc_9846fc07": "In the", - "help.desc_985d759b": "Token unique : 64 caractères hexadécimaux, impossible à deviner", - "help.desc_991307d6": " — Generate content from the selection:", - "help.desc_995a711f": ": Opens the CodeMirror editor", - "help.desc_99c6f0ec": "Share files with a read-only link", - "help.desc_9cb5974c": ": Ouvrez\n plusieurs notes dans des onglets séparés", - "help.desc_9d0e39d0": "Headers CSP : Content-Security-Policy, X-Frame-Options, XSS-Protection", - "help.desc_9edeaa11": ": Controls exploration depth (0-3)", - "help.desc_9f321d1e": "Backup", - "help.desc_9f78b3ec": ":\n Easier navigation in long files", - "help.desc_9fec424d": "Adapts the tone for a professional context — reports, emails, official documents.", - "help.desc_a0ec890a": " — Selected text modification menu:", - "help.desc_a13f7f2c": "Une fois terminé, AI: texte traité ✓ confirme le succès", - "help.desc_a4a4e21b": ": \"×\" button to reset the filter", - "help.desc_a52fc3b1": ": Downloads the file", - "help.desc_a579cf4d": ": Preview note content without navigating", - "help.desc_a601f22e": "Each webhook receives a POST with event details", - "help.desc_a69804cd": "Répertoire dédié : .obsigate-backup/ dans le répertoire de la vault", - "help.desc_a6cb3b26": "🔤 Fix spelling & grammar : Corrige les fautes d'orthographe et de grammaire", - "help.desc_a974f7a6": "Journal : Fichier data/audit.log au format JSON lines", - "help.desc_a9c2c520": "Webhooks automatically notify external services when files or directories change. Configure a URL to receive HTTP POST requests.", - "help.desc_a9db82b5": ": Centers the view on a specific node", - "help.desc_ab2c4150": ": Files (squares) and folders (circles) with icons", - "help.desc_action_buttons": "Copy, Source, Download, Edit, Open in new window", - "help.desc_adv_syntax": ": Python, JS, HTML, CSS, Java, C++, Rust, Go and many more", - "help.desc_ae213f54": ":\n Combinez opérateurs et texte libre", - "help.desc_aec0ad2c": "💬 Réécrire — Réécrit le texte selon vos instructions personnalisées. Une boîte de dialogue vous demande votre instruction.", - "help.desc_all_tags": ": Extracted from YAML frontmatters and inline (#tag)", - "help.desc_all_vaults": ": Global view of all your content", - "help.desc_autoscroll": ": The sidebar positions itself automatically", - "help.desc_b54c21ef": "Contrôle d'accès par vault : Chaque utilisateur voit uniquement ses vaults", - "help.desc_b5f89b3b": "ObsiGate integrates an AI assistant directly into the text editor. To activate it, configure at least one AI provider in the .env file (DeepSeek, OpenRouter, or Gemini).", - "help.desc_b6169f2e": "Each webhook receives a POST with event details", - "help.desc_b9c94994": ": Preview of the applied regex", - "help.desc_ba4578ae": "Restart the container:", - "help.desc_bc08f215": "ObsiGate uses JWT tokens signed with a secret key defined in the .env file.", - "help.desc_beed5686": "Click on", - "help.desc_breadcrumb": "File path (clickable to reposition sidebar)", - "help.desc_c1f72521": "Edit config.yaml to customize behavior", - "help.desc_c63f02cc": "Rewrites the text according to your custom instructions. A dialog prompts for your instruction.", - "help.desc_c8532869": ": Completion, rewrite, translation (see", - "help.desc_c992f2e5": "Remplissez : Nom (descriptif), URL (endpoint cible), Secret (optionnel)", - "help.desc_case_sensitive": ": \"Aa\" button to respect case", - "help.desc_cb6f0bfd": "Backup", - "help.desc_cc8e35ba": "Notifications : Alerter un canal Slack/Discord quand un document est créé", - "help.desc_cdf7bb46": "Recherchez intelligemment : Combinez opérateurs et texte libre", - "help.desc_cf5ccd40": "Simplifies the language for easier reading — replaces complex terms and shortens long sentences.", - "help.desc_cfe362a7": "Export PDF : Téléchargement du document partagé en PDF via/s/{token}/pdf", - "help.desc_check_btn": ": Manual save", - "help.desc_chip_remove": ": Click \"×\" to remove a filter", - "help.desc_chip_view": ": See active filters at a glance", - "help.desc_click_segment": ": Navigate to that folder", - "help.desc_click_tab": ": Activates the tab", - "help.desc_click_vault": ": Focus on the vault in the sidebar", - "help.desc_close_btn": ": Closes the tab (unless it's the only one)", - "help.desc_cm_autocomplete": ": Contextual suggestions", - "help.desc_cm_lines": ": Easy navigation", - "help.desc_cm_search": ": Ctrl+F to search in the file", - "help.desc_cm_syntax": ": Supports many languages", - "help.desc_combined": "searches \"web server\" in Markdown files of the IT vault with the linux tag.", - "help.desc_context_menu": ": Right-click on a vault or folder → Graph View", - "help.desc_copy_btn": ": Copies source content to clipboard", - "help.desc_ctrl_tab": ": Next tab", - "help.desc_ctrl_w": ": Close the active tab", - "help.desc_d186a19e": ": The Recent tab in the sidebar lists your latest files", - "help.desc_d3a71d97": "file_modified n'est pas encore dispatché (réservé pour version future)", - "help.desc_d5c977ac": "Code blocks", - "help.desc_d646b709": "Compte admin : Créé automatiquement au premier démarrage", - "help.desc_d66e911c": "In the", - "help.desc_d915c72b": "Synchronisation : Copier les nouveaux fichiers vers un autre système (SharePoint, Google Drive)", - "help.desc_d9cdaa89": "Copy", - "help.desc_d9e8ab0b": "🧰 Boîte ▾ — Outils de conversion : 📋 Convert to list : Transforme le texte en liste Markdown", - "help.desc_dc4d7186": "Each webhook receives a POST with event details", - "help.desc_delete_btn_new": ": Trash button to delete", - "help.desc_double_click": ": Opens the file in a persistent tab", - "help.desc_e0525213": "Inline completion (Ctrl+J). Automatically completes the text where the cursor is located.", - "help.desc_e23c94dd": ": In the toolbar (when available)", - "help.desc_e36f3eaa": "📐 Make longer : Ajoute des détails, exemples ou explications", - "help.desc_e3fce7a3": ": Opens the file in a temporary tab (preview, italic)", - "help.desc_e47d2328": "Preview", - "help.desc_e5246734": ": Previous tab", - "help.desc_e5b67e3d": "Your choice", - "help.desc_e5cf90b2": "Creates a concise summary of the selected text — bullet points capturing the essentials.", - "help.desc_e6129268": "Use the sidebar to navigate between vaults and folders.", - "help.desc_e7e3157a": "Timestamp : Chaque backup est horodaté", - "help.desc_e93517a5": "Download", - "help.desc_ec5f7a26": "Edit config.yaml to customize behavior", - "help.desc_ecf302ae": "Multi-fenêtres : Ouvrez plusieurs notes dans des onglets séparés", - "help.desc_edges": ": Outgoing wikilinks (blue) and incoming backlinks (green)", - "help.desc_eebf177f": "ObsiGate v1.7.0 - Porte d'entrée web pour vos vaults Obsidian", - "help.desc_ef1531ce": ": A temporary tab (italic) is replaced by the next click", - "help.desc_ef3f8158": ": Manage your filtering patterns", - "help.desc_examples": "Examples: ext:sh searches in bash scripts, ext:py in Python scripts, ext:md in Markdown files.", - "help.desc_expand": ": Click on a folder", - "help.desc_export_png": ": Save the graph as an image", - "help.desc_f0adf67a": ": Scroll wheel to zoom, click-drag to move", - "help.desc_f2d4e369": "✏️ Continue writing : Continue l'écriture à partir du texte", - "help.desc_f53badcd": "Add your API key in .env:", - "help.desc_f58da6e1": "Cliquez Ajouter", - "help.desc_f9083ce5": "File", - "help.desc_f952db17": "Refresh tokens : Cookies HttpOnly avec rotation automatique", - "help.desc_fa126609": "Converts the document structure into an Obsidian Canvas (visual cards).", - "help.desc_facet_vaults": ": Counters by vault", - "help.desc_fc9391f3": "ObsiGate sends an HTTP POST to your webhook URL with event details.", - "help.desc_fdeaf803": ": Each file type has its icon (markdown, code, etc.)", - "help.desc_file_suggest": ": File title suggestions", - "help.desc_filter_type": ": Include/exclude files, folders, markdown, other", - "help.desc_filter_usage": "Use the filter bar at the top of the sidebar to search quickly:", - "help.desc_filtering": "Search bar to filter files/tags", - "help.desc_find_in_page": ": Ctrl+F to search in the file (case, regex, whole word)", - "help.desc_frontmatter": ": tags: [docker, linux] or tags: docker, linux", - "help.desc_fullscreen": ": Button to expand the view", - "help.desc_graph_intro": "The graph view offers an interactive visualization of connections between your notes via wikilinks.", - "help.desc_graph_nav": ": Navigation history between nodes", - "help.desc_grouped_results": ": Display by vault with full paths", - "help.desc_hamburger": "(mobile) : Show/hide the sidebar", - "help.desc_hide": "Click the sidebar icon in the header", - "help.desc_images": ": Supports ![[image.png]]", - "help.desc_inline_tags": ": #docker in markdown content", - "help.desc_instant_filter": ": Type to filter files and folders", - "help.desc_logo": "Return to home", - "help.desc_markdown_all": ": Full markdown rendering", - "help.desc_md_render": "Markdown files are rendered with:", - "help.desc_menu_header": ": \"Vault\" dropdown in the Options menu", - "help.desc_menu_options": ": Access to settings, theme, help", - "help.desc_op_ext": ": Filter by file type", - "help.desc_op_path": ": Filter by path", - "help.desc_op_phrase": ": Exact phrase search", - "help.desc_op_tag": ": Filter by tag", - "help.desc_op_title": ": Search in titles only", - "help.desc_op_vault": ": Search in a specific vault", - "help.desc_open_file": ": Click on the file name", - "help.desc_open_new": ": Opens the file in a new tab", - "help.desc_patterns": ": Ex: #<% ... %> or #{{ ... }}", - "help.desc_quick_select": "Dropdown to change vault", - "help.desc_rendered_content": "Markdown with wikilinks and images", - "help.desc_resize": "Drag the right edge to adjust width", - "help.desc_save_btn_new": ": ✓ button to save", - "help.desc_search_all": ": Title, content, tags, paths", - "help.desc_search_bar": "Global search with autocomplete", - "help.desc_search_intro": "Type in the top search bar to start a fulltext search:", - "help.desc_sidebar_toggle": "Hide the sidebar for more space", - "help.desc_snippets": ": Excerpts with highlighted terms", - "help.desc_source_btn": ": Shows/hides raw markdown", - "help.desc_specific_vault": ": Focus on a single vault", - "help.desc_syntax_hl": ": Code block highlighting", - "help.desc_tag_cloud_intro": "The Tags tab in the sidebar displays a tag cloud:", - "help.desc_tag_filter_use": ": Use the filter bar to search for a tag", - "help.desc_tag_suggest": ": Tag suggestions with counters", - "help.desc_tags_tab": "Clickable tag cloud", - "help.desc_template_intro": "In the Configurations, you can hide template tags:", - "help.desc_title_tags": "File metadata", - "help.desc_trash_btn": ": Delete file", - "help.desc_two_tag_types": "ObsiGate supports two types of tags:", - "help.desc_vault_context": "Change context to filter the display:", - "help.desc_vault_indicator": "Shows the active context (All, vault1, etc.)", - "help.desc_vaults_tab": "File and folder tree", - "help.desc_visual_search": ": Search bar to highlight nodes", - "help.desc_wikilinks": ": [[link]] and [[link|text]]", - "help.double_click": "Double click", - "help.drag_drop_tabs": "Drag & drop tabs", - "help.e23c94dd": "In the toolbar (when available)", - "help.e3fce7a3": "Opens the file in a temporary tab (preview,", - "help.e5b67e3d": "Your choice is saved in localStorage", - "help.editor_section": "Editor", - "help.ef1531ce": "A temporary tab (italic) is replaced", - "help.experience": "Experience", - "help.export": "Export", - "help.external_audit": "External audit", - "help.f0adf67a": "Scroll wheel to zoom, click-drag to move", - "help.fallback_editor": "Fallback editor", - "help.fdeaf803": "Each file type has its icon (markdown, code, etc.)", - "help.fe388b67": "Optimizations", - "help.file_actions": "Actions on the open file:", - "help.file_viewer": "File viewer", - "help.filter_toggles": "Toggles Aa, wd, .*", - "help.filtering": "Filtering", - "help.find_capabilities": "Regex, whole word, case-sensitive search in the displayed document with DOM TreeWalker.", - "help.find_in_page": "Find in page", - "help.footer": "© 2026 — Made with ☕, 🎧 and a few", - "help.graph_context": "Context menu", - "help.graph_depth": "Depth slider", - "help.graph_export": "Export PNG", - "help.graph_filter_depth": "Filters & depth", - "help.graph_focus": "Focus mode", - "help.graph_fullscreen": "Full screen & PNG export", - "help.graph_info": "Info panel", - "help.graph_nav_arrows": "Navigation ← → ↑", - "help.graph_navigation": "History navigation ← → ↑", - "help.graph_nodes": "Nodes", - "help.graph_preview": "Ctrl+hover", - "help.graph_sticky": "Sticky panels", - "help.graph_tag_filter": "Filter by tag", - "help.graph_type_filter": "Filter by type", - "help.graph_view": "Graph view", - "help.graph_visual": "Visual search", - "help.graph_zoom": "Zoom/Pan", - "help.graph_zoom_pan": "Scroll wheel zoom & pan", - "help.guide_official": "Official guide", - "help.hamburger_btn": "Hamburger menu button", - "help.header_section": "Header", - "help.help_title": "Help", - "help.hide": "Hide", - "help.hide_help": "Hide help", - "help.highlighted_snippets": "Highlighted snippets", - "help.indexes": "ObsiGate indexes and displays:", - "help.instant": "Instant", - "help.light": "Light", - "help.logo": "ObsiGate logo", - "help.markdown": "Markdown syntax", - "help.menu_header": "Header menu", - "help.menu_options": "Options menu", - "help.mermaid_section": "Mermaid diagrams", - "help.mermaid_templates": "Templates", - "help.mobile": "Floating results bar", - "help.mobile_editor_gestures": ": swipe left → backlinks, swipe right → table of contents.", - "help.mobile_editor_gestures_label": "Touch gestures", - "help.mobile_editor_intro": "On phones and tablets, editing adapts to touch: floating toolbar, gestures and a full-screen reading mode.", - "help.mobile_editor_paste": ": persistent “Paste” button (works around the iOS restriction).", - "help.mobile_editor_paste_label": "Clipboard", - "help.mobile_editor_reading": ": full screen without header or sidebars; swipe horizontally to go to the next or previous file.", - "help.mobile_editor_reading_label": "Reading mode", - "help.mobile_editor_title": "📱 Mobile editing", - "help.mobile_editor_toolbar": ": horizontally scrollable ribbon (headings, bold, italic, strikethrough, highlight, code, quote, lists, checkboxes, links, tags, attachments). The ⚙ icon lets you add, remove or reorder commands; A−/A+ adjust the font size.", - "help.mobile_editor_toolbar_label": "Editing ribbon", - "help.mobile_editor_zoom": ": pinch with two fingers to zoom, drag the handle to resize the editing area.", - "help.mobile_editor_zoom_label": "Zoom & height", - "help.modal_title": "ObsiGate User Guide", - "help.multi_vault": "Multi-vault", - "help.nav_ai": "🤖 AI Editor", - "help.nav_backups": "💾 Backups", - "help.nav_customization": "🎨 Customization", - "help.nav_editing": "✏️ Editing", - "help.nav_files": "📁 Files", - "help.nav_graph": "🗺️ Graph", - "help.nav_interface": "🧭 Interface", - "help.nav_intro": "📘 Introduction", - "help.nav_mobile_editor": "📱 Mobile", - "help.nav_navigation": "🗺️ Navigation", - "help.nav_palette": "⌨️ Palette", - "help.nav_search": "🔍 Search", - "help.nav_security": "🛡️ Security", - "help.nav_sharing": "🔗 Sharing", - "help.nav_shortcuts": "⌨️ Shortcuts", - "help.nav_tabs": "📑 Tabs", - "help.nav_tags": "🏷️ Tags", - "help.nav_tips": "💡 Tips", - "help.nav_webhooks": "🪝 Webhooks", - "help.nav_plugins": "🧩 Plugins", - "help.nav_excalidraw": "🎨 Excalidraw", - "help.new_file": "New file", - "help.new_folder": "New folder", - "help.nights": "sleepless nights 😅", - "help.nodes_edges": "Edges", - "help.other": "Other", - "help.outline_panel": "Outline panel (right)", - "help.pagination": "Pagination", - "help.pal_close_the_palette": "Close the palette", - "help.pal_delete_a_folder_and_its_contents": "Delete a folder and its contents", - "help.pal_delete_the_file_from_the_active_tab": "Delete the file from the active tab", - "help.pal_move_desc": "Navigate the list", - "help.pal_open___select": "Open / select", - "help.pal_open_the_editor_on_the_active_tab": "Open the editor on the active tab", - "help.pal_open_this_guide": "Open this guide", - "help.pal_popout_desc": "Open the document in a detached window", - "help.pal_toggle_light_dark": "Toggle light/dark", - "help.pdf_export": "PDF export", - "help.persistent_display": "Persistent display in bar", - "help.persistent_tabs": "Persistent tabs", - "help.popout_button": "Dedicated button", - "help.powered_by": "Powered by Python, FastAPI, vanilla JS, CodeMirror, Mermaid, Lucide Icons and ❤️ for Obsidian.", - "help.preview_tab": "Preview", - "help.properties": "Properties", - "help.public_shares": "Public sharing", - "help.pwa_section": "PWA", - "help.quick_help": "Quick Help", - "help.quick_select": "Quick select", - "help.rate_limiting": "Rate limiting", - "help.recent_nav": "Recent navigation", - "help.rename": "Rename", - "help.rendered_content": "Rendered content", - "help.rendering_images": "Image rendering", - "help.rendering_md": "Rendering in Markdown", - "help.resize": "Resize", - "help.results_counter": "Results counter", - "help.results_grouped": "Grouped results", - "help.search_bar": "Search bar", - "help.search_dropdown": "Search dropdown", - "help.search_everywhere": "Search everywhere", - "help.search_facets": "Facets", - "help.search_filters": "Search filters", - "help.search_history": "Search history", - "help.search_operators": "Search operators", - "help.search_placeholder": "Search help...", - "help.search_save": "Saved searches", - "help.secret_redaction": "Secret redaction", - "help.security_section": "Security", - "help.share_button": "Share button", - "help.shortcut_ai_completion": "Inline AI completion (in editor)", - "help.shortcut_close": "Close editor / modal", - "help.shortcut_close_editor": "Close editor / modal", - "help.shortcut_close_palette": "Close palette", - "help.shortcut_close_tab": "Close tab", - "help.shortcut_command_palette": "Command palette", - "help.shortcut_file_palette": "File palette (quick nav.)", - "help.shortcut_focus_search": "Focus search bar", - "help.shortcut_forge_help": "Forge editor help", - "help.shortcut_next_tab": "Next tab", - "help.shortcut_palette": "Command palette", - "help.shortcut_palette_cmd": "Command palette (command mode)", - "help.shortcut_prev_tab": "Previous tab", - "help.shortcut_quick_insert": "Quick insert (Forge editor)", - "help.shortcut_quick_search": "Quick search (outside text field)", - "help.shortcut_redo": "Redo", - "help.shortcut_save": "Save", - "help.shortcut_save_file": "Save open file", - "help.shortcut_search_doc": "Search in document", - "help.shortcut_select": "Open/select", - "help.shortcut_tip": "Hover over a document with Ctrl for a quick preview. Click Forge in the toolbar for the advanced editor.", - "help.shortcut_undo": "Undo", - "help.shortcuts": "Keyboard shortcuts", - "help.shortcuts_title": "Shortcuts & Tips", - "help.sidebar_dropdown": "Sidebar dropdown", - "help.sidebar_features": "Sidebar features:", - "help.sidebar_filtering": "Sidebar filtering", - "help.sidebar_section": "Sidebar", - "help.sidebar_tabs": "The sidebar has two tabs:", - "help.sidebar_toggle_btn": "Sidebar toggle button", - "help.simple": "Simple", - "help.simple_search": "Simple search", - "help.single_click": "Single click", - "help.smart_scoring": "Smart scoring", - "help.sort_options": "Sort options", - "help.supported_languages": "Many languages supported", - "help.syncthing": "Syncthing conflicts", - "help.syncthing_conflicts": "Syncthing conflicts", - "help.tab_bar": "Tab bar", - "help.tab_features": "Features", - "help.tab_nav": "Tab navigation", - "help.tabs_section": "Opening tabs", - "help.theme_section": "Theme", - "help.theme_sync": "Synced theme", - "help.theme_toggle": "Toggle between themes:", - "help.themes": "Themes", - "help.tip_hide_sidebar": "Hide the sidebar", - "help.tip_sidebar_filter": "Use sidebar filtering", - "help.tip_use_tags": "Use tags to organize", - "help.title": "ObsiGate Help", - "help.title_tags": "Title and tags", - "help.toc_title": "CONTENTS", - "help.assistant_panel": "🧠 Assistant panel (BooksLM)", - "help.assistant_panel_desc": "The side assistant (floating button or a folder's context menu) answers in formatted Markdown and contextualises your directories or documents. In general mode it also knows what you are looking at: open documents, current directory, active search and recently modified files.", - "help.assistant_markdown": "Formatted answers: headings, lists, tables, quotes and code blocks.", - "help.assistant_links": "Cited files and paths are links: a bare filename copies the name to the clipboard, a folder is revealed in the tree, and a file path opens it in the viewer.", - "help.assistant_sessions": "The header history icon lists past sessions (reopen or delete); “+” starts a new conversation.", - "help.assistant_agent": "The \"agent mode\" button enables tools (read, list, search); modifying actions require confirmation with a change preview.", - "help.assistant_resize": "The left edge of the panel is resizable; the width is remembered.", - "help.assistant_at": "Type @ to attach a file or directory to the context, or to attach an image from a directory.", - "help.assistant_slash": "Type / to run a skill (research, summary, correction, plan…) or an admin command (/help, /providers, /model, /keys).", - "help.assistant_images": "Paste an image into the composer (or attach one) to analyse it with a vision-capable model. The ⓘ button shows the selected model's capabilities, and the model list is filterable by search.", - "help.toolbar_section": "AI toolbar", - "help.tree_section": "Vault tree", - "help.use_cases": "Use cases", - "help.vault_indicator": "Vault indicator", - "help.vault_selector": "Vault selector", - "help.vault_specific": "Specific vault", - "help.webhook_blog_post": "blog post when a file is marked", - "help.webhook_note": "Note: the event", - "help.webhook_notify": "automatically notify services", - "help.webhook_post": "HTTP POST to your", - "help.webhooks": "Webhooks", - "help.welcome_desc": "ObsiGate is your web gateway to your Obsidian vaults. Access, browse, and search all your notes from any device via a modern and responsive interface.", - "help.welcome_tag1": "⚡ Fast navigation", - "help.welcome_tag2": "🗂️ Multi-vault", - "help.welcome_tag3": "🏷️ Smart tags", - "help.welcome_tag4": "📝 Reading & editing", - "help.welcome_tag5": "🔍 TF-IDF search", - "help.welcome_title": "Welcome to ObsiGate", - "help.wikilinks": "Wikilinks", - "help.zoom_pan": "Zoom & Pan", - "mermaid.code": "Code", - "mermaid.copy_svg": "Copy SVG", - "mermaid.download_png": "Download PNG", - "mermaid.preview": "Preview", - "mermaid.zoom_in": "Zoom in", - "mermaid.zoom_out": "Zoom out", - "mobile.all_vaults": "📂 All vaults", - "mobile_editor.add_command": "Add a command", - "mobile_editor.backlinks": "Backlinks", - "mobile_editor.bold": "Bold", - "mobile_editor.close": "Close", - "mobile_editor.cmd_attachment": "Attachment", - "mobile_editor.cmd_bold": "Bold", - "mobile_editor.cmd_bullet": "Bullet list", - "mobile_editor.cmd_checkbox": "Checkbox", - "mobile_editor.cmd_code": "Inline code", - "mobile_editor.cmd_codeblock": "Code block", - "mobile_editor.cmd_dedent": "Outdent", - "mobile_editor.cmd_files": "Template / files", - "mobile_editor.cmd_h1": "Heading 1", - "mobile_editor.cmd_h2": "Heading 2", - "mobile_editor.cmd_h3": "Heading 3", - "mobile_editor.cmd_h4": "Heading 4", - "mobile_editor.cmd_h5": "Heading 5", - "mobile_editor.cmd_h6": "Heading 6", - "mobile_editor.cmd_highlight": "Highlight", - "mobile_editor.cmd_indent": "Indent", - "mobile_editor.cmd_italic": "Italic", - "mobile_editor.cmd_link": "External link", - "mobile_editor.cmd_ordered": "Numbered list", - "mobile_editor.cmd_quote": "Quote", - "mobile_editor.cmd_redo": "Redo", - "mobile_editor.cmd_strike": "Strikethrough", - "mobile_editor.cmd_tag": "Tag", - "mobile_editor.cmd_undo": "Undo", - "mobile_editor.cmd_wikilink": "Internal link", - "mobile_editor.code": "Code", - "mobile_editor.customize": "Customize toolbar", - "mobile_editor.customize_reset": "Reset", - "mobile_editor.customize_title": "Customize toolbar", - "mobile_editor.done": "Done", - "mobile_editor.error": "Loading error", - "mobile_editor.font_larger": "Increase font size", - "mobile_editor.font_smaller": "Decrease font size", - "mobile_editor.italic": "Italic", - "mobile_editor.link": "Link", - "mobile_editor.list": "Bullet list", - "mobile_editor.loading": "Loading…", - "mobile_editor.move_down": "Move down", - "mobile_editor.move_up": "Move up", - "mobile_editor.no_backlinks": "No backlinks", - "mobile_editor.no_headings": "No headings in this document", - "mobile_editor.no_next": "Last file in folder", - "mobile_editor.no_prev": "First file in folder", - "mobile_editor.paste": "Paste", - "mobile_editor.paste_hint": "Long-press the field then choose “Paste” (clipboard access denied).", - "mobile_editor.reading_enter": "Reading mode", - "mobile_editor.reading_exit": "Exit reading mode", - "mobile_editor.remove_command": "Remove", - "mobile_editor.resize": "Adjust editor height", - "mobile_editor.toc": "Table of contents", - "mobile_editor.toolbar": "Mobile editing toolbar", - "modal.create_btn": "Create", - "modal.create_file": "Create a file", - "modal.creating": "Creating...", - "modal.delete_dir": "Delete folder", - "modal.delete_dir_warning": "All files and subfolders will be permanently deleted.", - "modal.delete_file": "Delete file", - "modal.delete_irreversible": "This action is irreversible.", - "modal.delete_permanently": "Delete permanently", - "modal.delete_warning": "Warning!", - "modal.dir_to_delete": "Folder to delete:", - "modal.file_name": "File name", - "modal.file_to_delete": "File to delete:", - "modal.file_type": "File type", - "modal.in_folder": "In: {path}", - "month.april": "April", - "month.august": "August", - "month.december": "December", - "month.february": "February", - "month.january": "January", - "month.july": "July", - "month.june": "June", - "month.march": "March", - "month.may": "May", - "month.november": "November", - "month.october": "October", - "month.september": "September", - "offline.all_synced": "All changes synced", - "offline.conflict_title": "Sync conflict", - "offline.keep_local": "Keep local version", - "offline.keep_server": "Keep server version", - "offline.mode_offline": "Offline mode — changes will sync when back online", - "offline.pending": "{count} pending change(s)", - "offline.reconnected": "Connection restored — synchronizing...", - "offline.status": "Offline", - "offline.sync_now": "Sync now", - "palette.browse_dirs": "📂 Browse directories...", - "palette.browse_hint": "Navigate vaults to find a file", - "palette.browse_in": "In {path}", - "palette.browse_no_results": "No results — browse manually", - "palette.browse_open_file": "📂 Open a file in this directory", - "palette.browse_root": "root", - "palette.close_current": "Close current file", - "palette.close_current_desc": "Close active tab without deleting", - "palette.cmd_back_home": "🏠 Home", - "palette.cmd_back_home_desc": "Back to home", - "palette.cmd_config": "⚙️ Settings", - "palette.cmd_config_desc": "Open settings", - "palette.cmd_create_dir": "📁 Create directory", - "palette.cmd_create_dir_desc": "Choose vault, navigate, then name the directory", - "palette.cmd_create_file": "📄 Create markdown file", - "palette.cmd_create_file_desc": "Choose vault, navigate, then name the file", - "palette.cmd_delete_dir": "🗑️ Delete directory", - "palette.cmd_delete_dir_desc": "Choose vault, navigate and delete", - "palette.cmd_theme": "🌓 Toggle theme", - "palette.cmd_theme_desc": "Toggle light/dark", - "palette.del_all_content": "All content will be deleted", - "palette.delete_current": "Delete current file", - "palette.delete_current_desc": "Delete file from active tab", - "palette.delete_file_desc": "Search for a file to delete", - "palette.dir_delete_confirm": "All content will be deleted", - "palette.dir_name": "Directory name", - "palette.empty_dir": "📂 Empty directory", - "palette.error_loading": "Loading error", - "palette.error_prefix": "Error: {msg}", - "palette.file_name": "File name", - "palette.help_desc": "Open the guide", - "palette.md_hint": "(.md added if needed)", - "palette.mode_commands": "Commands", - "palette.mode_files": "Files", - "palette.no_results": "No results for \"{query}\"", - "palette.no_vaults": "No vaults found", - "palette.popout_desc": "Open document in a window", - "palette.reindex_desc": "Force full reindex", - "palette.search_commands": "Type a command...", - "palette.search_error": "Search error", - "palette.search_files": "Search files...", - "palette.type_command": "Type a command...", - "palette.type_search": "Search files... (+include -exclude)", - "palette.vault_count": "{count} files", - "pwa.dismiss": "Later", - "pwa.install_button": "Install", - "pwa.install_desc": "Install this app on your device for quick access.", - "pwa.install_title": "Install ObsiGate", - "search.advanced_operators": "Advanced operators", - "search.aria_label": "Search suggestions", - "search.case_sensitive": "Case sensitive", - "search.clear": "Clear", - "search.dropdown_clear_history": "Clear history", - "search.dropdown_files": "Files", - "search.dropdown_history": "History", - "search.error": "Search error", - "search.exclude_placeholder": "Exclude: vendor/*, *.lock", - "search.facet_tags": "Tags", - "search.facet_vaults": "Vaults", - "search.files_filtered": "{count} file(s) with filters", - "search.filter_path_title": "Path filters (Alt-F)", - "search.filters": "Filters", - "search.full_text": "Search everywhere", - "search.highlighted_snippets": "Highlighted snippets", - "search.include_placeholder": "Include: **/*.md, notes/**", - "search.loading": "Searching...", - "search.no_results": "No results found", - "search.operators_help": "Operators: tag:word, vault:name, title:word, path:word, ext:md", - "search.pagination": "Pagination", - "search.previous": "← Previous", - "search.query_time": "({time} ms)", - "search.regex": "Regular expression", - "search.results_count": "{count} result(s)", - "search.results_filtered": "{count} result(s) for \"{query}\" with filters", - "search.results_for": "{count} result(s) for \"{query}\"", - "search.save_search": "Save search", - "search.saved": "Search saved", - "search.sections_all_vaults": "All vaults", - "search.semantic_score": "sim", - "search.semantic_title": "Semantic search (Alt-S)", - "search.semantic_unavailable": "Semantic search unavailable", - "search.simple_search": "Simple search", - "search.smart_scoring": "Smart scoring", - "search.sort_date": "Date", - "search.sort_relevance": "Relevance", - "search.sort_title": "Title", - "search.whole_word": "Whole word", - "settings.about": "📦 About", - "settings.ai": "🤖 AI", - "settings.backend": "⚙️ Backend", - "settings.backend_hint": "These settings are saved on the server. Some require a restart or reindexing.", - "settings.backend_section": "Backend Settings", - "settings.client_label": "These settings apply immediately on the client side.", - "settings.diagnostics": "🩺 Diagnostics", - "settings.history_count_desc": "Between 5 and 100 files (saved on server)", - "settings.history_count_label": "Files in history", - "settings.history_section": "Recent History", - "settings.no_restart_badge": "No restart needed", - "settings.profile": "👤 Profile", - "settings.reindex": "Force reindex", - "settings.restart_badge": "Restart required", - "settings.save": "Save", - "settings.search": "Search", - "settings.tabs": "Tabs", - "settings.search_placeholder": "Search...", - "settings.sync": "🔄 Sync", - "settings.themes": "🎨 Themes", - "settings.plugins": "🧩 Plugins", - "share.copied": "Link copied!", - "share.copy_link": "Copy link", - "share.create": "Create share link", - "share.expires": "Expires on", - "share.never": "Never", - "share.revoke": "Revoke", - "share.title": "Public share", - "shortcut.ai_completion": "AI inline completion (in editor)", - "shortcut.close_editor": "Close editor / modal", - "shortcut.command_palette": "Command palette", - "shortcut.editor_help": "Forge editor help", - "shortcut.file_palette": "File palette (quick nav)", - "shortcut.focus_search": "Focus search bar", - "shortcut.quick_insert": "Quick insert (Forge editor)", - "shortcut.quick_search": "Quick search (outside text field)", - "shortcut.save_file": "Save open file", - "shortcut.search_in_doc": "Search in document", - "shortcut.tip_preview": "Hover a document with **Ctrl** for a quick preview. Click **Forge** in the toolbar for the advanced editor.", - "sidebar.all_vaults": "All vaults", - "sidebar.case_sensitive": "Case sensitive", - "sidebar.clear_filter": "Clear", - "sidebar.expand_collapse": "Expand/Collapse", - "sidebar.file_icons": "Icons", - "sidebar.filter_instant": "Instant search", - "sidebar.filter_path": "Path filters", - "sidebar.filter_placeholder": "Filter files...", - "sidebar.filter_results_grouped": "Grouped results", - "sidebar.loading": "Loading...", - "sidebar.no_recent_files": "No recent files", - "sidebar.no_results": "No matching directory or file.", - "sidebar.no_saved_searches": "No saved searches", - "sidebar.open_file": "Open file", - "sidebar.saved_dirs_tab": "Folders", - "sidebar.saved_searches_tab": "Searches", - "sidebar.sidebar_dropdown": "Vault context menu", - "sidebar.sidebar_filtering": "Sidebar filtering", - "sidebar.tab_backups": "Backups", - "sidebar.tab_recent": "Recent", - "sidebar.tab_saved": "Searches", - "sidebar.tab_tags": "Tags", - "sidebar.tab_vaults": "Vaults", - "sidebar.vault_context_all": "All vaults", - "sidebar.vault_specific": "Specific vault", - "sync.autocomplete": "Autocomplete", - "sync.autocomplete_active": "Autocomplete active", - "sync.connected": "Synchronized", - "sync.connected_short": "Connected", - "sync.disconnected": "Disconnected", - "sync.event_index_progress": "Vault indexed", - "sync.event_index_start": "Index starting", - "sync.event_index_updated": "Update", - "sync.event_vault_added": "Vault added", - "sync.event_vault_removed": "Vault removed", - "sync.index_complete": "Indexing complete ({count} files)", - "sync.index_reloaded": "Full index reloaded", - "sync.index_started": "Indexing started ({count} vaults)", - "sync.install_success": "ObsiGate installed successfully!", - "sync.model_not_loaded": "Model not loaded", - "sync.no_provider": "No provider", - "sync.no_recent_events": "No recent events", - "sync.not_configured": "Not configured", - "sync.processing": "Processing…", - "sync.update": "Update", - "sync.updating": "Updating...", - "sync.vault_added": "Vault \"{vault}\" added ({count} files)", - "sync.vault_added_label": "Vault added", - "sync.vault_files": "{vault} ({files} files)", - "sync.vault_indexed_label": "Vault indexed", - "sync.vault_removed": "Vault \"{vault}\" removed", - "sync.vault_removed_label": "Vault removed", - "sync.verifying": "Verifying…", - "theme.change": "Change theme", - "theme.dark": "Dark", - "theme.light": "Light", - "theme.high_contrast": "High Contrast", - "theme.sepia": "Sepia", - "theme.title": "Theme", - "theme.export_all": "Export Themes", - "theme.import": "Import Theme", - "theme.import_success": "{count} theme(s) imported", - "theme.import_error": "Import error", - "theme.delete_confirm": "Delete this custom theme?", - "themes.name_gradients": "Subtle gradients", - "themes.name_terminal": "Pure black & green", - "toast.ai_keys_saved": "API keys saved", - "toast.ai_no_key": "No keys to save", - "toast.bookmark_added": "Added to bookmarks", - "toast.bookmark_removed": "Removed from bookmarks", - "toast.cannot_delete_self": "Cannot delete your own account", - "toast.config_client_saved": "Client settings saved", - "toast.config_reset": "Configuration reset", - "toast.config_saved": "Configuration saved", - "toast.conflict_resolved": "Conflict resolved", - "toast.copied": "Copied!", - "toast.copy_error": "Copy error", - "toast.create_error": "Creation error", - "toast.created": "Created", - "toast.delete_error": "Deletion error", - "toast.deleted": "Deleted", - "toast.dir_created": "Folder \"{name}\" created", - "toast.dir_deleted": "Folder deleted ({count} files)", - "toast.dir_renamed": "Directory renamed", - "toast.dir_saved_search": "Folder saved to searches", - "toast.error_delete": "Delete error", - "toast.error_init": "Initialization error", - "toast.error_load": "Loading error", - "toast.error_network": "Network error", - "toast.error_rename": "Cannot rename this item", - "toast.file_created": "File \"{name}\" created", - "toast.file_deleted": "File deleted", - "toast.file_renamed": "File renamed", - "toast.hidden_saved": "✓ Settings saved", - "toast.index_reloaded": "Full index reloaded", - "toast.installed": "ObsiGate installed successfully!", - "toast.link_created": "Link created!", - "toast.moved": "Moved", - "toast.no_open_file": "No file open", - "toast.not_found_tree": "Item not found in tree", - "toast.path_copied": "Path copied: {path}", - "toast.reindex_done": "Reindexing complete", - "toast.reindex_started": "Reindexing...", - "toast.rename_error": "Rename error", - "toast.renamed": "Renamed", - "toast.saved": "Saved", - "toast.search_saved": "Search saved", - "toast.share_revoked": "Share revoked", - "toast.url_required": "URL required", - "toast.user_created": "User created", - "toast.user_deleted": "User deleted", - "toast.user_modified": "User modified", - "toast.viewer_error": "Viewer loading error", - "toc.hide_panel": "Hide panel", - "toc.no_headings": "No headings in this document", - "toc.title": "ON THIS PAGE", - "tree.new_file": "New file", - "tree.new_folder": "New folder", - "tree.vault_home": "Vault home", - "ui.backups_versions": "Backups / Versions", - "ui.cannot_rename": "Cannot rename this item", - "ui.delete_name_empty": "Name cannot be empty", - "ui.element_not_found": "Element not found in tree", - "ui.vault_readonly": "Read-only vault", - "vault.add_dynamic": "Add vault", - "vault.reindex": "Reindex vault", - "vault.remove_dynamic": "Remove vault", - "vaulthome.empty": "No files in this directory", - "vaulthome.error_loading": "Loading error:", - "vaulthome.file_count": "{count} file", - "vaulthome.file_count_plural": "{count} files", - "vaulthome.loading": "Loading files...", - "vaulthome.size_bytes": "B", - "vaulthome.size_kb": "KB", - "vaulthome.size_mb": "MB", - "viewer.backlinks": "Backlinks", - "viewer.binary_download": "Download file", - "viewer.binary_unsupported": "Unsupported binary file", - "viewer.bookmark_add": "Add to bookmarks", - "viewer.bookmark_remove": "Remove bookmarks", - "viewer.bookmark_toggle": "Add/Remove bookmarks", - "viewer.breadcrumb_home": "Home", - "viewer.click_to_download": "Click to download", - "viewer.copied": "Copied!", - "viewer.copy": "Copy", - "viewer.copy_error": "Copy error", - "viewer.download": "Download", - "viewer.download_md": "Download as .md", - "viewer.download_file": "Download file", - "viewer.pretty": "Pretty", - "viewer.pretty_title": "Formatted mode: colors and line numbers", - "viewer.download_pdf": "Download as PDF", - "viewer.edit": "Edit", - "viewer.error": "Loading error", - "viewer.export": "Export", - "viewer.export_done": "Export complete", - "viewer.export_epub": "Export as ePub", - "viewer.export_error": "Export error:", - "viewer.export_html": "Export as HTML", - "viewer.export_md_bundle": "Export as Markdown bundle (.zip)", - "viewer.export_start": "Exporting...", - "viewer.export_title": "Export document", - "viewer.forge_brand": "Forge", - "viewer.forge_title": "Forge (new editor)", - "viewer.index_start": "Starting index...", - "viewer.index_updated": "Updated", - "viewer.loaded_from_cache": "File loaded from offline cache", - "viewer.loading": "Loading file...", - "viewer.markdown": "Markdown", - "viewer.metadata_created": "Created", - "viewer.metadata_modified": "Modified", - "viewer.metadata_path": "Path", - "viewer.metadata_size": "Size", - "viewer.metadata_tags": "Tags", - "viewer.metadata_vault": "Vault", - "viewer.no_headings": "No headings in this document", - "viewer.on_this_page": "ON THIS PAGE", - "viewer.outline": "Outline", - "viewer.pdf_pages": "{count} pages", - "viewer.popout": "Open in popup", - "viewer.raw": "Raw", - "viewer.share": "Share", - "viewer.shared_doc_title": "Shared document — click to manage", - "viewer.source": "Source", - "viewer.syncing": "Updating...", - "viewer.toc": "Table of contents", - "viewer.unsupported_file": "This file is binary and cannot be displayed", - "webhook.trigger_create": "Creation via API or palette", - "webhook.trigger_delete": "Deletion via API or editor", - "webhook.trigger_dir_create": "Directory creation via API", - "webhook.trigger_dir_delete": "Directory deletion via API", - "webhook.trigger_dir_rename": "Directory rename via API", - "webhook.trigger_rename": "Rename via API", - "settings.security": "🔒 Account Security", - "settings.security_desc": "Enable two-factor authentication (2FA) to strengthen your account security.", - "mfa.title": "Two-Factor Authentication", - "mfa.subtitle": "Enter the 6-digit code from your authenticator app.", - "mfa.verify": "Verify", - "mfa.verifying": "Verifying...", - "mfa.use_recovery": "Use a recovery code", - "mfa.back_to_login": "Back to login", - "mfa.recovery_title": "Recovery Code", - "mfa.recovery_subtitle": "Enter one of your recovery codes (format: XXXX-XXXX).", - "mfa.use_totp": "Use authenticator code", - "mfa.status_label": "Two-Factor Authentication", - "mfa.enabled": "Enabled", - "mfa.disabled": "Disabled", - "mfa.enabled_desc": "Your account is protected by two-factor authentication.", - "mfa.setup_desc": "Add an extra layer of security to your account with TOTP.", - "mfa.enable_btn": "Enable 2FA", - "mfa.disable_btn": "Disable 2FA", - "mfa.scan_qr": "Scan this QR code with your authenticator app", - "mfa.manual_entry": "Manual entry (if you can't scan)", - "mfa.enter_code": "Enter the 6-digit code to confirm", - "mfa.confirm_enable": "Confirm & Enable", - "mfa.recovery_codes_title": "Recovery Codes", - "mfa.recovery_codes_warning": "Save these codes in a secure place. Each code can only be used once.", - "mfa.copy_codes": "Copy", - "mfa.download_codes": "Download", - "mfa.done": "Done", - "mfa.codes_copied": "Recovery codes copied!", - "mfa.disable_confirm_title": "Disable 2FA", - "mfa.disable_confirm_desc": "Enter your password and a valid TOTP code to disable two-factor authentication.", - "mfa.password_label": "Password", - "mfa.password_placeholder": "Your current password", - "mfa.totp_code_label": "TOTP Code", - "mfa.disable_confirm_btn": "Disable 2FA", - "mfa.disabled_success": "2FA has been disabled.", - "mfa.fill_all_fields": "Please fill in all fields.", - "bookslm.title": "BooksLM", - "bookslm.files_indexed": "{count} files indexed", - "bookslm.chars_loaded": "{chars} chars loaded", - "bookslm.placeholder": "", - "bookslm.send": "Send", - "bookslm.new_conversation": "New conversation", - "bookslm.export": "Export conversation", - "bookslm.toggle_sidebar": "Hide/Show AI sidebar", - "bookslm.copy": "Copy", - "bookslm.copied": "Copied to clipboard", - "bookslm.error": "AI service error", - "bookslm.regenerate": "Regenerate", - "bookslm.suggestion_summary": "Summarize this directory", - "bookslm.suggestion_themes": "What are the main themes?", - "bookslm.suggestion_contradictions": "Are there contradictions between these documents?", - "bookslm.no_context": "No files found in this directory", - "bookslm.context_too_large": "Directory too large — some files were truncated", - "bookslm.source": "Source", - "bookslm.session_history": "Session history", - "bookslm.session_delete": "Delete session", - "bookslm.history_empty": "No saved session", - "bookslm.untitled": "Untitled conversation", - "bookslm.no_vault": "No active vault to open this link", - "bookslm.copied_name": "Name copied: {name}", - "palette.bookslm_open": "BooksLM: Open for current directory", - "palette.bookslm_open_desc": "Opens the AI assistant for the current context (open documents or general)", - "palette.bookslm_new": "BooksLM: New conversation", - "palette.bookslm_new_desc": "Resets the AI assistant conversation", - "fab.open": "Open AI assistant", - "fab.close": "Close AI assistant", - "mfa.webauthn_title": "Security keys (WebAuthn)", - "mfa.webauthn_desc": "Authenticate with a physical key (YubiKey) or your device biometrics (Windows Hello, Touch ID).", - "mfa.webauthn_none": "No registered keys.", - "mfa.webauthn_add": "Add a security key", - "mfa.webauthn_label_prompt": "Key name (e.g. Pocket YubiKey)", - "mfa.webauthn_added": "Security key registered.", - "mfa.webauthn_removed": "Security key removed.", - "mfa.webauthn_remove": "Remove", - "mfa.webauthn_remove_confirm": "Enter your password to remove this key:", - "mfa.webauthn_prompt": "Present your security key or confirm with Windows Hello.", - "mfa.webauthn_btn": "Verify with my key", - "mfa.webauthn_cancelled": "WebAuthn ceremony cancelled.", - "mfa.webauthn_no_key": "No security key registered for this account.", - "plugins.title": "🧩 Plugins", - "plugins.description": "Extend ObsiGate with custom renderers, search filters, and editor actions.", - "plugins.install": "Install Plugin", - "plugins.template": "View Template", - "plugins.none": "No plugins installed.", - "plugins.manifest_json": "Manifest (plugin.json)", - "plugins.code": "Plugin Code (main file)", - "plugins.view_code": "View Code", - "plugins.uninstall": "Uninstall", - "plugins.enable": "Enable", - "plugins.disable": "Disable", - "plugins.enabled": "Plugin '{name}' enabled.", - "plugins.disabled": "Plugin '{name}' disabled.", - "plugins.installed": "Plugin '{name}' installed successfully.", - "plugins.uninstalled": "Plugin '{name}' uninstalled.", - "plugins.confirm_uninstall": "Uninstall plugin '{name}'? This cannot be undone.", - "help.plugins_title": "🧩 Plugins", - "help.plugins_intro": "Plugins extend ObsiGate: custom file rendering, search filters, editor actions, widgets and integrations. They run in sandboxed Web Workers — isolated from the page for security.", - "help.plugins_install": "Installation", - "help.plugins_install_1": "Open Settings → 🧩 Plugins.", - "help.plugins_install_2": "Click 'Install a plugin'.", - "help.plugins_install_3": "Select a .zip file containing the plugin.json manifest and the plugin code.", - "help.plugins_install_4": "The manifest is validated (name, semver version, hooks, permissions) before installation.", - "help.plugins_manage": "Management", - "help.plugins_manage_1": "Enable / Disable: buttons on each plugin — hooks only run if the plugin is enabled.", - "help.plugins_manage_2": "Uninstall: permanently removes the plugin from the vault.", - "help.plugins_manage_3": "Code: view the source code of the installed plugin.", - "help.plugins_dev": "Develop a plugin", - "help.plugins_dev_intro": "Download the template from Settings → Plugins → 'Get template'. A plugin consists of a plugin.json manifest and a main file (e.g. index.js).", - "help.plugins_hooks": "Available hooks", - "help.plugins_hook_render": "onFileRender", - "help.plugins_hook_render_desc": "transforms the displayed content of a file.", - "help.plugins_hook_search": "onSearchFilter", - "help.plugins_hook_search_desc": "filters search results.", - "help.plugins_hook_editor": "onEditorAction", - "help.plugins_hook_editor_desc": "intercepts editor actions.", - "help.plugins_hook_sidebar": "onSidebarItem", - "help.plugins_hook_sidebar_desc": "adds items to the sidebar.", - "help.plugins_hook_file": "onFileCreate / onFileDelete", - "help.plugins_hook_file_desc": "reacts to file creation / deletion.", - "help.plugins_hook_vault": "onVaultMount", - "help.plugins_hook_vault_desc": "runs when a vault is loaded.", - "help.plugins_security": "Security", - "help.plugins_security_1": "Web Worker sandbox: plugin code runs isolated, with no direct DOM access.", - "help.plugins_security_2": "Permissions: each declared hook must be satisfied by the manifest permissions.", - "help.plugins_security_3": "Secure packaging: the .zip is checked against path traversal on install.", - "help.plugins_security_4": "Admin only: installation and removal require the admin role.", - "help.plugins_template": "Use the Template button in Settings > Plugins to generate a valid starter plugin.", - "help.excalidraw_title": "🎨 Excalidraw diagrams", - "help.excalidraw_intro": ".excalidraw and .excalidraw.md files open in a full visual Excalidraw editor embedded in a sandboxed iframe.", - "help.excalidraw_open_title": "Opening", - "help.excalidraw_open": "Click a .excalidraw file in the tree: the editor opens instead of the markdown viewer.", - "help.excalidraw_edit": "Draw, add shapes, text, arrows and images — the complete Excalidraw experience.", - "help.excalidraw_save_title": "Saving", - "help.excalidraw_save": "Changes are saved automatically (2s debounce) or with Ctrl+S. The editor follows the light/dark theme.", - "help.excalidraw_search_title": "Search", - "help.excalidraw_search": "Text inside diagram elements is extracted on indexing, so it is searchable via the full-text search.", - "help.excalidraw_compat": "Files created with the Obsidian Excalidraw plugin (including the compressed .excalidraw.md format) are compatible.", - "help.footer_tagline": "- Web gateway for your Obsidian vaults" +{ + "_meta": { + "locale": "en", + "name": "English" + }, + "about.api_version": "API version", + "about.backend": "Backend", + "about.browser": "Browser", + "about.built_with": "Built with", + "about.editor": "Editor", + "about.file_watcher": "File watching", + "about.files": "Files", + "about.files_indexed": "Indexed files", + "about.footer": "Made with ☕, 🍕 and a few accidental git push --force.", + "about.frontend": "Frontend", + "about.fun_quote": "\"No LLM was harmed during this development.\"", + "about.git": "Git : —", + "about.icons": "Icons", + "about.joke_0": "0 known bugs. The others are shy.", + "about.joke_1": "Compiles on the first try. (Except Monday mornings.)", + "about.joke_2": "Written by a human. Probably.", + "about.joke_3": "No LLMs were harmed during this development.", + "about.joke_4": "When it works, we call it a feature.", + "about.joke_5": "CSS: 90% of dev time, 10% of the code.", + "about.joke_6": "Dark mode active since the project's birth.", + "about.joke_7": "Works on my machine™", + "about.joke_8": "Technically, everything is an edge case.", + "about.joke_9": "The CSS for this panel took longer than the backend.", + "about.language": "Language", + "about.last_delivery": "Last delivery : June 2026", + "about.made_with": "Made with ☕, 🎧 and a few accidental git push --force.", + "about.markdown_renderer": "Markdown rendering", + "about.name": "Name", + "about.platform": "Platform", + "about.section_app": "Application", + "about.section_components": "Components", + "about.section_env": "Environment", + "about.status": "Status", + "about.subtitle": "Your Obsidian notes, simply accessible.", + "about.syntax_highlight": "Syntax highlighting", + "about.tagline": "Your Obsidian notes,
simply accessible.", + "about.tests": "Tests", + "about.vaults_configured": "Configured vaults", + "about.version": "Version", + "admin.audit_all_actions": "All actions", + "admin.audit_empty": "No log available", + "admin.audit_filter_action": "Action", + "admin.audit_filter_user": "Filter by user", + "admin.audit_refresh": "Refresh", + "admin.audit_title": "Audit logs", + "admin.back_btn": "← Back", + "admin.backups_newest": "Newest: {days} days", + "admin.backups_oldest": "Oldest: {days} days", + "admin.backups_per_vault": "Per vault", + "admin.backups_title": "Backup statistics", + "admin.backups_total": "Total: {count} backups ({size})", + "admin.backups_vault_empty": "No backup", + "admin.close": "Close", + "admin.col_actions": "Actions", + "admin.col_last_login": "Last login", + "admin.col_role": "Role", + "admin.col_status": "Status", + "admin.col_user": "User", + "admin.col_vaults": "Vaults", + "admin.forbidden_msg": "You must be an administrator to access this page.", + "admin.forbidden_title": "Access denied", + "admin.header_subtitle": "Administrator dashboard", + "admin.new_user": "+ New user", + "admin.page_title": "ObsiGate — Administration", + "admin.stats_cpu": "CPU", + "admin.stats_disk": "Disk", + "admin.stats_memory": "Memory", + "admin.stats_refresh": "Last update: {time}", + "admin.stats_sessions": "Active sessions", + "admin.stats_title": "Real-time statistics", + "admin.stats_uptime": "Uptime", + "admin.title": "Administration — Users", + "admin.users_manage_btn": "Manage users", + "admin.users_manage_hint": "Open the user management modal (full CRUD)", + "admin.users_title": "User management", + "ai.action_applied": "Applied ✓", + "ai.action_apply": "Apply", + "ai.action_applying": "Applying…", + "ai.action_create_dir": "Create folder {path}", + "ai.action_create_file": "Create file {path}", + "ai.action_created_dir": "Folder created: {path}", + "ai.action_created_file": "File created: {path}", + "ai.action_failed": "Action failed: {error}", + "ai.agent_mode_off": "Agent mode off (read/search + actions)", + "ai.agent_mode_on": "Agent mode on (read/search tools + actions)", + "ai.casual": "Casual tone", + "ai.close": "Close assistant", + "ai.completion_added": "AI: completion added", + "ai.context_documents": "{count} open document(s)", + "ai.context_general": "General context", + "ai.context_general_desc": "Questions about the app and file creation", + "ai.continue": "Continue", + "ai.custom_rewrite": "Custom rewrite", + "ai.diff_preview": "Change preview", + "ai.done": "AI: text processed", + "ai.edit": "Edit", + "ai.error_invalid_key": "Invalid API key", + "ai.explain": "Explain", + "ai.fix_spelling": "Fix spelling", + "ai.fix_spelling_hint": "Fixes spelling and grammar", + "ai.frontmatter": "Generate frontmatter", + "ai.fullscreen": "Fullscreen", + "ai.generate": "Generate", + "ai.hint_add_details": "Adds details", + "ai.hint_edit_selection": "Modifies the selected text", + "ai.hint_generate": "Generates content from the selection", + "ai.hint_improve": "Improves text quality", + "ai.hint_translate": "Translates the selected text", + "ai.improve": "Improve", + "ai.input_hint": "Enter to send · Ctrl+Enter for a line break", + "ai.inline_completion_title": "AI Inline Completion (Ctrl+J) — Auto-complete text", + "ai.invalid_api_key": "AI: invalid API key. Check DEEPSEEK_API_KEY in .env", + "ai.longer": "Longer", + "ai.no_api_key": "No API key configured", + "ai.not_configured": "⚠️ AI not configured — add DEEPSEEK_API_KEY, OPENROUTER_API_KEY or GEMINI_API_KEY in .env", + "ai.processing": "⏳ AI: processing...", + "ai.professional": "Professional tone", + "ai.provider": "Provider", + "ai.provider_default": "— default —", + "ai.model": "Model", + "ai.model_default": "— default —", + "ai.model_loading": "Loading…", + "ai.model_offline": "offline", + "ai.model_load_error": "Load error", + "ai.model_settings": "Provider & model", + "ai.model_search": "Search a model…", + "ai.model_info": "Model capabilities", + "ai.model_more": "… {count} more — refine your search", + "ai.add_context": "Add context", + "ai.attach_image": "Attach an image", + "ai.cap_audio_speech": "Audio Speech", + "ai.cap_audio_transcription": "Audio Transcriptions", + "ai.cap_chat": "Chat", + "ai.cap_embeddings": "Embeddings", + "ai.cap_images": "Images", + "ai.cap_rerank": "Rerank", + "ai.cap_video": "Video", + "ai.cap_vision": "Vision capable", + "ai.commands": "Commands", + "ai.activity_sending": "Sending request…", + "ai.activity_streaming": "Receiving response…", + "ai.activity_tool": "Tool: {name}…", + "ai.activity_confirmation": "Waiting for confirmation…", + "ai.activity_error": "Request failed", + "ai.activity_done": "Done", + "ai.composer_label": "Message to the assistant", + "ai.create_skill": "Create a skill", + "ai.image": "image", + "ai.keys": "Stored API keys", + "ai.model_changed": "Model changed: {name}", + "ai.no_results": "No results", + "ai.none": "None", + "ai.provider_changed": "Provider changed: {name}", + "ai.providers": "Active providers", + "ai.remove": "Remove", + "ai.resize_panel": "Resize panel", + "ai.skill_created": "Skill \"{name}\" created", + "ai.skill_id": "Identifier", + "ai.skill_label": "Name", + "ai.skill_prompt": "Prompt / instructions", + "ai.skill_prompt_placeholder": "Describe the expected behaviour of the skill…", + "ai.usage_model": "Available models: {list}", + "ai.usage_provider": "Available providers: {list}", + "ai.vision_unsupported": "The selected model does not support image analysis", + "ai.quota_exceeded": "AI: quota exceeded or payment required", + "ai.rewrite": "💬 Rewrite", + "ai.rewrite_done": "AI: text rewritten", + "ai.rewrite_prompt": "Rewrite instruction:", + "ai.rewrite_placeholder": "e.g. make the tone more formal and add a conclusion", + "ai.rewrite_title": "Rewrite text according to your instructions", + "ai.select_text": "AI: select text to process", + "ai.shorter": "Shorter", + "ai.shorter_hint": "Makes the text more concise", + "ai.simplify": "Simplify", + "ai.simplify_hint": "Simplifies the language", + "ai.suggestion_capabilities": "What can you do?", + "ai.suggestion_create_file": "Create a meeting notes file", + "ai.suggestion_docs_contradictions": "Are there contradictions between these documents?", + "ai.suggestion_docs_keypoints": "What are the key points of these documents?", + "ai.suggestion_docs_summary": "Summarize the open documents", + "ai.suggestion_search": "How do I search my notes effectively?", + "ai.summarize": "Summarize", + "ai.text_processed": "AI: text processed ✓", + "ai.text_rewritten": "AI: text rewritten", + "ai.to_canvas": "Convert to Canvas", + "ai.to_list": "Convert to list", + "ai.to_table": "Convert to table", + "ai.tone_hint": "Changes the text tone", + "ai.tool_call": "Tool: {name}", + "ai.tool_call_failed": "Tool {name} failed", + "ai.toolbar_edit": "Edit", + "ai.toolbar_generate": "Generate", + "ai.toolbar_rewrite": "Rewrite", + "ai.toolbar_tone": "Tone", + "ai.toolbar_toolbox": "Toolbox", + "ai.toolbar_translate": "Translate", + "ai.toolbox": "🧰 Toolbox", + "ai.toolbox_hint": "Conversion tools", + "ai.translate_to": "Translate to {lang}", + "auth.cannot_delete_self": "Cannot delete your own account", + "auth.logged_out": "Signed out", + "auth.login_button": "Sign in", + "auth.login_error": "Invalid credentials", + "auth.login_title": "Secure access to your vaults", + "auth.logout_title": "Sign out", + "auth.network_error": "Network error — check your connection", + "auth.new_password": "New password (empty = unchanged)", + "auth.password": "Password", + "auth.password_min": "Min. 8 characters", + "auth.remember_me": "Remember me (30 days)", + "auth.session_expired": "Session expired, please sign in again", + "auth.user_deleted": "User deleted", + "auth.username": "Username", + "auto.0257e77f": "🧰 Toolbox ▾", + "auto.033a9ddf": "Default model", + "auto.03a6e5b1": "The operators used are displayed as", + "auto.13c3ee2c": "Search and autocomplete", + "auto.13eb7a51": "AI: invalid API key", + "auto.14c75ac6": "Select desired events", + "auto.195a8e44": "Create directory", + "auto.1a54bd69": "Combined example", + "auto.1a8a8118": "Drag and drop", + "auto.1abf6661": "The path displayed above the content is", + "auto.1d3330cc": "No automatic retry on failure", + "auto.1d46301c": "Line numbers", + "auto.1efbbc9a": "Editing with CodeMirror 6", + "auto.209c5490": "The top bar contains the essential elements:", + "auto.272dd29a": "Supported providers", + "auto.27a2f7c1": "ObsiGate supports opening multiple files simultaneously in tabs.", + "auto.28bf6aab": "Security: HMAC-SHA256 signature", + "auto.2a5af19b": "The workflow triggers automatically", + "auto.2bc24d2e": "All sensitive operations are logged", + "auto.2bc66bab": "Directory creation via API", + "auto.337d8626": "Light/dark theme", + "auto.37561472": "🛡️ Security", + "auto.396d0dd8": "The AI toolbar appears below the title", + "auto.3be698f6": "Favor operators", + "auto.404c8f1c": "Autocomplete helps you quickly find", + "auto.41d7c6af": "Dedicated directory", + "auto.460b8298": "Data", + "auto.4bc1f00a": "Use operators to refine your", + "auto.4c908ade": "Click a vault to open it and see its", + "auto.4d281c6c": "AI: text processed ✓", + "auto.4dfa6a25": "No vault filtering — a webhook listens to", + "auto.4fa5d7c2": "Quick editing", + "auto.559ef1da": "Recommended workflow", + "auto.598a0ca7": "Tracked events", + "auto.5a486420": "Delete directory", + "auto.5d4a2516": "Open a file in Edit mode (✏️ button", + "auto.5d936af6": "Generated regex", + "auto.62c3d50d": "💬 Rewrite", + "auto.678711b5": "Select a context", + "auto.695d9e47": "CodeMirror 6 Editor", + "auto.6c166d35": "ObsiGate is your web gateway to your Obsidian vaults. Access, browse, and search all your notes from any device via a modern and responsive interface.", + "auto.72e515fa": "Access control by vault", + "auto.753d30a8": "Open a file to see it", + "auto.774dbd63": "The Command Palette allows quick keyboard access to all ObsiGate functions. Use it to open files, execute commands, and navigate without touching the mouse.", + "auto.79f6e1dd": "Multi-window", + "auto.7c9cdc3c": "Check the events to listen to", + "auto.7e13c97a": "These settings apply immediately", + "auto.83a0efdf": "Reindexing", + "auto.9122fd5c": "Advanced configuration", + "auto.98c547ea": "do not trigger", + "auto.a05514cb": "Creation via API or palette", + "auto.a105a2d9": "Edit ▾", + "auto.a131dfab": "CodeMirror Editor", + "auto.a232672b": "Deployment", + "auto.a3319169": "📦 About", + "auto.aa8ca265": "The view uses the Barnes-Hut algorithm to calculate the layout in O(n log n), ensuring smooth performance even with hundreds of nodes.", + "auto.ab5e6155": "ObsiGate automatically creates backups before", + "auto.aedff644": "Create markdown file", + "auto.b114ed1c": "These settings are saved on the server. Some require a restart or reindexing.", + "auto.b419c2c2": "Python receiver (Flask)", + "auto.b86ba5ea": "Multi-criteria search", + "auto.b893650a": "Edit current file", + "auto.ba768f01": "Supported events", + "auto.c089d968": "Pin files to find them", + "auto.c14b5603": "🎨 Themes", + "auto.c4922a99": "🤖 Artificial Intelligence in the Editor", + "auto.caac40b9": "Choose a visual theme. Each theme offers", + "auto.cd7332c8": "Results include facets to refine", + "auto.ce4eb802": "Generate ▾", + "auto.d33601dc": "Real-time file monitoring via", + "auto.d4d28717": "Trigger", + "auto.e0b8a606": "Define tag patterns to hide from", + "auto.e61598c1": "Share a document to see it", + "auto.ec7260fa": "Supported file types", + "auto.edf89626": "The built-in editor offers:", + "auto.ef8c5f4d": "The built-in editor offers a complete editing experience:", + "auto.f346076a": "✏️ Advanced Editing", + "auto.f5a8c116": "Event", + "auto.f8ba6127": "🗂️ Hidden files", + "auto.fc694490": "Deletion via API or editor", + "backup.delete": "Delete", + "backup.diff": "Compare", + "backup.file_restored": "File restored successfully", + "backup.no_backups": "No backups", + "backup.preview": "Preview", + "backup.purge": "Purge", + "backup.restore": "Restore", + "backup.restore_failed": "Restore failed", + "backup.select_to_restore": "Select a backup to restore", + "backup.timestamp_not_found": "Cannot find backup timestamp", + "backup.title": "Backups", + "backup.version": "Version from {date}", + "backups.delete_confirm": "Delete this backup?", + "backups.empty": "No backups available for this file.", + "backups.hint": "Backups are created automatically before each modification.", + "backups.loading": "Loading backups...", + "backups.purge_file": "Delete ALL backups of", + "backups.purge_vault": "Delete ALL backups from vault", + "backups.restore_confirm": "to the selected backup version?\nThe current version will be saved.", + "backups.title": "Backups", + "button.cancel": "Cancel", + "common.actions": "Actions", + "common.all": "All", + "common.back": "Back", + "common.cancel": "Cancel", + "common.close": "Close", + "common.confirm": "Confirm", + "common.copied": "Copied!", + "common.copy": "Copy", + "common.create": "Create", + "common.delete": "Delete", + "common.download": "Download", + "common.edit": "Edit", + "common.error": "Error", + "common.loading": "Loading...", + "common.move": "Move", + "common.never": "Never", + "common.next": "Next", + "common.no": "No", + "common.none": "None", + "common.ok": "OK", + "common.previous": "Previous", + "common.refresh": "Refresh", + "common.rename": "Rename", + "common.root": "(root)", + "common.save": "Save", + "common.search": "Search", + "common.unknown": "Unknown", + "common.yes": "Yes", + "collab.peers_title": "{count} person(s) connected", + "collab.presence_title": "Real-time collaboration", + "collab.status_connected": "Collaboration active", + "collab.status_connecting": "Connecting to collaboration…", + "collab.status_disconnected": "Collaboration lost — reconnecting…", + "config.about": "About", + "config.about_error": "Loading error", + "config.about_loading": "Loading...", + "config.add_webhook": "Add", + "config.ai_deepseek_label": "DeepSeek API Key", + "config.ai_default_model": "Default model", + "config.ai_capabilities": "Model capabilities", + "config.ai_default_provider": "Default provider", + "config.ai_gemini_label": "Gemini API Key", + "config.ai_keys": "AI API keys", + "config.ai_keys_desc": "Configure API keys for the AI editor.", + "config.ai_model": "Model", + "config.ai_openrouter_label": "OpenRouter API Key", + "config.api_keys_saved": "API keys saved", + "config.backups": "Backups", + "config.backups_desc": "Manage automatic file backups.", + "config.client_config": "Client config", + "config.create_share": "Create share", + "config.debounce_label": "Debounce delay (ms)", + "config.diagnostics": "Diagnostics", + "config.diagnostics_desc": "Technical information about the server state.", + "config.display_name": "Display name", + "config.error_prefix": "Error", + "config.error_unknown": "Unknown error", + "config.force_reindex": "Force reindex", + "config.hidden_files": "Hidden files", + "config.hidden_files_desc": "Hide files/folders starting with a dot in the interface (they remain indexed and searchable)", + "config.hidden_files_toggle": "Hide hidden files/folders", + "config.hidden_include_label": "Include hidden files", + "config.hidden_whitelist_label": "Whitelist (comma-separated)", + "config.hint_activer_d_sactiver_la_surveillance_automatique_des": "Enable/disable automatic file monitoring", + "config.hint_annuler_la_recherche_apr_s_ce_d_lai_5000_120000_": "Cancel search after this delay (5000-120000)", + "config.hint_contenu_index_par_fichier_10k_1m_r_indexation_requ": "Max content size per file (bytes)", + "config.hint_d_lai_avant_ex_cution_de_la_recherche_100_2000_": "Delay before search execution (100-2000)", + "config.hint_d_lai_avant_traitement_des_changements_group_s_0_5": "Delay before processing grouped changes (0.5-10 seconds)", + "config.hint_entre_5_et_100_fichiers_sauvegarde_sur_le_serveur_": "Between 5 and 100 files (stored on server)", + "config.hint_forcer_le_mode_polling_au_lieu_de_inotify_natif_ut": "Forcer le mode polling au lieu de inotify natif (utile si le mode natif ne fonctionne pas)", + "config.hint_intervalle_de_scrutation_en_mode_polling_1_30_seco": "Intervalle de scrutation en mode polling (1-30 secondes)", + "config.hint_multiplicateur_de_pertinence_pour_les_correspondan": "Multiplicateur de pertinence pour les correspondances dans le titre", + "config.hint_nombre_de_r_sultats_affich_s_par_page_10_200_": "Number of results displayed per page (10-200)", + "config.hint_nombre_max_de_tokens_largis_par_pr_fixe_10_200_": "Max expanded tokens per prefix (10-200)", + "config.hint_nombre_maximum_de_versions_backup_conservees_par_f": "Maximum backup versions kept per file (1-50)", + "config.hint_nombre_minimum_de_caract_res_avant_recherche_1_5_": "Minimum characters before search triggers (1-5)", + "config.hint_threads_d_di_s_la_recherche_1_8_": "Dedicated search threads (1-8)", + "config.just_now": "just now", + "config.lang_hint": "Used by autocomplete and ghost text.", + "config.lang_label": "Preferred language", + "config.link_copied": "Link copied!", + "config.link_created": "Link created!", + "config.logout": "Sign out", + "config.max_backups": "Max backups per file", + "config.max_backups_desc": "Maximum backup versions kept per file (1-50)", + "config.max_backups_label": "Max backups per file", + "config.max_content_hint": "Indexed content per file (10K-1M). Reindex required.", + "config.max_content_label": "Max content size (bytes)", + "config.max_content_size": "Max content size (bytes)", + "config.max_prefix_expansions": "Max prefix expansions", + "config.min_query_label": "Min. query length", + "config.min_query_length": "Min query length", + "config.name_placeholder": "Your name", + "config.no_keys": "No keys to save", + "config.no_restart": "No restart needed", + "config.note": "Note:", + "config.open_new_window": "Open in new window", + "config.prefix_expansions_hint": "Max tokens expanded by prefix (10-200)", + "config.prefix_expansions_label": "Max prefix expansions", + "config.profile": "User profile", + "config.profile_desc": "Personal preferences to customize your ObsiGate experience.", + "config.project_repo": "project repository", + "config.recent_history_count": "Files in history", + "config.recent_history_count_desc": "Between 5 and 100 files (saved on server)", + "config.reindex": "Reindex", + "config.reindex_desc": "Rebuild the search index for all vaults.", + "config.reindex_error": "Reindex error", + "config.reindexing": "Reindexing...", + "config.reset": "Reset", + "config.restart_required": "Restart required", + "config.results_per_page": "Results per page", + "config.results_per_page_label": "Results per page", + "config.save": "Save", + "config.save_ai_keys": "Save keys", + "config.save_backend": "Save server configuration", + "config.save_error": "Save error", + "config.save_hidden": "Save", + "config.saved": "✓ Saved", + "config.saving": "Saving", + "config.search_timeout": "Search timeout (ms)", + "config.search_workers": "Search workers", + "config.search_workers_hint": "Dedicated search threads (1-8)", + "config.search_workers_label": "Search workers", + "config.section_a-propos": "📦 About", + "config.section_about": "About", + "config.section_actions-sur-fichiers": "File actions", + "config.section_activation": "Activation", + "config.section_affichage": "Affichage", + "config.section_ai": "AI API keys", + "config.section_arborescence-des-vaults": "Arborescence des vaults", + "config.section_astuces-et-bonnes-pratiques": "💡 Astuces et bonnes pratiques", + "config.section_audit-log": "Audit log", + "config.section_authentification": "Authentification", + "config.section_autocompletion": "Autocompletion", + "config.section_backend": "🖥️ Backend Settings", + "config.section_backup-automatique": "Backup automatique", + "config.section_backups": "Backups", + "config.section_barre-d-outils-ai": "Barre d'outils AI", + "config.section_breadcrumb-et-repositionnement": "Breadcrumb et repositionnement", + "config.section_cas-d-usage": "Cas d'usage", + "config.section_cas-d-usage-avances": "Advanced use cases", + "config.section_chips-de-filtres-actifs": "Chips de filtres actifs", + "config.section_cles-api-intelligence-artificielle": "🤖 Cles API Intelligence Artificielle", + "config.section_configuration": "Configuration", + "config.section_configuration-avancee": "Advanced configuration", + "config.section_construit-avec": "Construit avec", + "config.section_diag": "Diagnostics", + "config.section_diagnostics": "Diagnostics", + "config.section_editeur-codemirror": "CodeMirror Editor", + "config.section_editeur-codemirror-6": "CodeMirror 6 Editor", + "config.section_edition-avancee": "✏️ Advanced Editing", + "config.section_edition-avec-codemirror-6": "Editing with CodeMirror 6", + "config.section_en-tete": "Header", + "config.section_evenements-supportes": "Supported events", + "config.section_exemples-concrets": "Exemples concrets", + "config.section_facettes-et-tri": "Facettes et tri", + "config.section_fichiers": "📄 Files", + "config.section_filtrage-de-la-sidebar": "Filtrage de la sidebar", + "config.section_filtrage-de-tags": "Filtrage de tags", + "config.section_filtrage-de-tags-template": "Filtrage de tags template", + "config.section_fonctionnalites": "Features", + "config.section_format-du-payload": "Format du payload", + "config.section_gestion-des-onglets": "📑 Gestion des onglets", + "config.section_hidden": "Hidden files", + "config.section_historique-recent-redemarrage-non-requis": "📋 Recent History\n No restart required", + "config.section_indicateurs-visuels": "Indicateurs visuels", + "config.section_intelligence-artificielle-dans-l-editeur": "🤖 AI in the Editor", + "config.section_interaction": "Interaction", + "config.section_interface": "Interface", + "config.section_interface-utilisateur": "🧭 Interface utilisateur", + "config.section_limitations-actuelles": "Limitations actuelles", + "config.section_mode-commandes": "Mode commandes", + "config.section_mode-fichiers": "File mode", + "config.section_navigation": "Navigation", + "config.section_navigation-entre-onglets": "Navigation entre onglets", + "config.section_onglets": "Onglets", + "config.section_operateurs-avances": "Advanced operators", + "config.section_optimisations": "Optimisations", + "config.section_ouverture": "Ouverture", + "config.section_ouverture-d-onglets": "Ouverture d'onglets", + "config.section_palette-de-commandes": "⌨️ Palette de commandes", + "config.section_parametres-backend-redemarrage-requis": "Backend settings\n Restart required", + "config.section_parametres-de-recherche": "Search settings", + "config.section_partage-et-webhooks": "🔗 Partage et Webhooks", + "config.section_partages-publics": "📤 Partages publics", + "config.section_perf": "⚡ Performance", + "config.section_performance": "Performance", + "config.section_personnalisation": "🎨 Personnalisation", + "config.section_profil-utilisateur": "👤 Profil utilisateur", + "config.section_profile": "User profile", + "config.section_protection": "Protection", + "config.section_providers-supportes": "Supported providers", + "config.section_publication-publique": "Publication publique", + "config.section_raccourcis-clavier": "⌨️ Raccourcis clavier", + "config.section_recent": "📜 Recent History", + "config.section_recherche": "🔍 Recherche", + "config.section_recherche-et-autocompletion": "Search and autocompletion", + "config.section_recherche-simple": "Recherche simple", + "config.section_redimensionnement-de-la-sidebar": "Redimensionnement de la sidebar", + "config.section_sauvegarde-automatique": "Sauvegarde automatique", + "config.section_sauvegardes-et-audits": "💾 Sauvegardes et Audits", + "config.section_search": "Search settings", + "config.section_securite": "🛡️ Security", + "config.section_securite-signature-hmac-sha256": "Security: HMAC-SHA256 signature", + "config.section_selection-de-vault": "Vault selection", + "config.section_server": "Server", + "config.section_shares": "📤 Public Shares", + "config.section_sidebar-barre-laterale": "Sidebar", + "config.section_synchronisation-automatique": "Synchronisation automatique", + "config.section_tag-cloud": "Tag cloud", + "config.section_tags": "🏷️ Tag Filtering", + "config.section_tags-inline-vs-frontmatter": "Tags inline vs frontmatter", + "config.section_theme-clair-sombre": "Light/Dark theme", + "config.section_themes": "🎨 Themes", + "config.section_trucs-et-astuces": "Trucs et astuces", + "config.section_types-de-fichiers-supportes": "Supported file types", + "config.section_visualisation": "Visualisation", + "config.section_vue-graphe": "🗺️ Vue Graphe", + "config.section_watcher": "Auto sync", + "config.section_webhooks": "🔗 Webhooks", + "config.section_push": "🔔 Push notifications", + "config.section_plugins": "🧩 Plugins", + "config.section_workflow-recommande": "Recommended workflow", + "config.section_zone-de-contenu": "Zone de contenu", + "config.server_config": "Server config", + "config.settings_saved": "✓ Settings saved", + "config.share_revoked": "Share revoked", + "config.shares": "Public shares", + "config.shares_desc": "Manage public share links for your documents.", + "config.shares_empty": "No active shares", + "config.tag_boost_hint": "Relevance multiplier for tag matches", + "config.tag_boost_label": "Tag boost", + "config.tag_filtering_label": "Tag filtering", + "config.test": "Test", + "config.timeout_label": "Search timeout (ms)", + "config.title": "Settings", + "config.title_boost": "Title boost", + "config.title_boost_hint": "Relevance multiplier for title matches", + "config.title_boost_label": "Title boost", + "config.url_required": "URL required", + "config.watcher_debounce_label": "Debounce (s)", + "config.watcher_enabled_label": "Enable watcher", + "config.watcher_interval_label": "Polling interval (s)", + "config.watcher_polling_label": "Polling mode (fallback)", + "config.webhook_name_placeholder": "Name", + "config.webhook_url_placeholder": "URL", + "config.webhooks": "Webhooks", + "config.webhooks_desc": "HTTP notifications to external services on file changes.", + "config.plugins": "Plugins", + "config.plugins_desc": "Manage installed plugins for this vault.", + "config.workers_label": "Search workers", + "confirm.delete_dir": "Delete this folder and all its contents?", + "confirm.delete_dir_named": "Delete \"{path}\" and ALL its contents?", + "confirm.delete_file": "Permanently delete this file?", + "confirm.delete_file_named": "Delete file \"{path}\"?", + "confirm.logout": "Are you sure you want to sign out?", + "conflict.no_conflicts": "No conflicts detected", + "conflict.resolve_conflict": "Keep conflict version", + "conflict.resolve_local": "Keep local version", + "conflict.resolved": "Conflict resolved", + "dashboard.all_vaults": "All vaults", + "dashboard.bookmark_add": "Add to bookmarks", + "dashboard.bookmark_remove": "Remove from bookmarks", + "dashboard.bookmarks": "Bookmarks", + "dashboard.conflict_date": "Conflict of ", + "dashboard.conflict_resolved": "Conflict resolved", + "dashboard.conflicts": "Conflicts", + "dashboard.conflicts_title": "Sync conflicts", + "dashboard.copy_btn": "Copy", + "dashboard.count_files": "file", + "dashboard.count_files_plural": "files", + "dashboard.ctrl_hover_tip": "Hover over a document with Ctrl for a quick preview. Click Forge in the toolbar for the advanced editor.", + "dashboard.day_ago": "{n} d ago", + "dashboard.error_prefix": "Error: ", + "dashboard.expires": "Expires {date}", + "dashboard.hide": "Hide", + "dashboard.hour_ago": "{n} h ago", + "dashboard.just_now": "just now", + "dashboard.keep_conflict": "Keep conflict", + "dashboard.keep_original": "Keep original", + "dashboard.load_error": "Loading error", + "dashboard.loading": "Loading...", + "dashboard.min_ago": "{n} min ago", + "dashboard.no_bookmarks": "No bookmarks", + "dashboard.no_conflicts": "No conflicts", + "dashboard.no_recent": "No recent files", + "dashboard.no_shares": "No shared documents", + "dashboard.open_btn": "Open", + "dashboard.pin_error": "Pin error", + "dashboard.pin_hint": "Pin files to find them here.", + "dashboard.quick_help": "Quick Help", + "dashboard.recent": "Recent", + "dashboard.recent_hint": "Open a file to see it appear here", + "dashboard.shared_hint": "Share a document to see it appear here", + "dashboard.shares": "Shares", + "dashboard.show": "Show", + "dashboard.size_bytes": " B", + "dashboard.size_gb": " GB", + "dashboard.size_kb": " KB", + "dashboard.size_mb": " MB", + "dashboard.stats": "Statistics", + "dashboard.stats_files": "Files", + "dashboard.stats_size": "Total size", + "dashboard.stats_tags": "Unique tags", + "dashboard.stats_vaults": "Vaults", + "dashboard.tab_recent": "Recent", + "dashboard.tab_shared": "Shared", + "dashboard.tab_stats": "Statistics", + "dashboard.total_files": "Total files", + "dashboard.total_size": "Total size", + "dashboard.total_tags": "Unique tags", + "dashboard.vaults_count": "Vaults", + "dashboard.views": "{count} view(s)", + "dashboard.welcome": "Welcome to ObsiGate", + "dashboard.zero_files": "0 files", + "dragdrop.cross_vault_unsupported": "Cross-vault moves are not supported", + "dragdrop.move_failed": "Move failed", + "dragdrop.overlay_title": "Drop files or folders", + "dragdrop.overlay_vault_zone": "Import into Vault", + "dragdrop.overlay_ai_zone": "Analyze with AI Assistant", + "upload.uploading": "Uploading {count} file(s)...", + "upload.success": "Successfully imported {count} file(s)", + "upload.partial": "Imported {count} file(s) ({errors} errors)", + "upload.error": "Upload failed", + "upload.choose_target_folder": "Import Destination", + "upload.target_vault": "Target Vault", + "upload.vault_root": "/ (Vault root)", + "upload.target_directory": "Target subdirectory", + "upload.filter_folders": "Filter or search a folder...", + "upload.custom_folder": "Or enter a new subfolder path...", + "upload.import_summary": "Items to import: {files} file(s), {dirs} folder(s)", + "upload.import_button": "Import", + "editor.cancel": "Cancel", + "editor.close": "Close", + "editor.delete_error": "Delete error", + "editor.edit": "Edit current file", + "editor.edit_current_desc": "Open current file in editor", + "editor.find": "Find in file...", + "editor.find_case": "Case sensitive", + "editor.find_regex": "Regex", + "editor.find_whole": "Whole word", + "editor.forge_close_editor": "Close editor / modal", + "editor.forge_help": "Forge editor help", + "editor.no_results": "No results", + "editor.replace": "Replace", + "editor.save": "Save", + "editor.save_error": "Save error", + "editor.saved": "Saved ✓", + "editor.unsaved": "Unsaved changes", + "error.initialization": "Initialization error", + "file.copy_path": "Copy path", + "file.delete": "Delete", + "file.graph_view": "Graph view", + "file.new_file": "New file", + "file.new_folder": "New folder", + "file.properties": "Properties", + "file.rename": "Rename", + "forge.popout": "Open in new window", + "forge.popout_label": "pop-out", + "forge.title_placeholder": "Title...", + "graph.back": "Back", + "graph.btn_directory": "📁 Directory", + "graph.btn_full": "🌐 All", + "graph.cache_label": "(cached)", + "graph.category": "📂 Category", + "graph.click_to_open": "click to open", + "graph.ctrl_hover_preview": "Ctrl+hover = full preview", + "graph.ctrl_hover_preview_short": "Ctrl+hover = preview", + "graph.depth": "Depth", + "graph.depth_label": "depth={depth}", + "graph.edges_count": "{count} links", + "graph.error_loading": "Loading error", + "graph.export_png": "Export PNG", + "graph.favorites": "Favorites", + "graph.filter_tag": "Filter by tag", + "graph.filter_type": "Filter by type", + "graph.focus_mode": "Focus mode", + "graph.forward": "Forward", + "graph.fullscreen": "Full screen", + "graph.loading": "Building graph...", + "graph.nodes_count": "{count} nodes", + "graph.parent": "Parent", + "graph.published": "Published", + "graph.published_badge": "✅ published", + "graph.scope_directory": "Directory", + "graph.scope_full": "Full vault", + "graph.title": "Graph View — {vault}{path}", + "graph.type_directory": "Directory", + "graph.type_file": "File", + "graph.type_markdown": "Markdown", + "header.admin_panel": "Administration", + "header.config": "Settings", + "header.help": "Help", + "header.install_app": "Install app", + "header.logo": "ObsiGate", + "header.logout": "Sign out", + "header.menu_about": "About", + "header.menu_about_desc": "Version, credits & info", + "header.menu_admin": "Administration", + "header.menu_admin_desc": "Manage users", + "header.menu_api": "API", + "header.menu_api_desc": "OpenAPI documentation", + "header.menu_config": "Settings", + "header.menu_config_desc": "Application settings", + "header.menu_help": "User guide", + "header.menu_help_desc": "Open help", + "header.menu_logout": "Sign out", + "header.menu_logout_desc": "End session", + "header.menu_profile": "Profile", + "header.menu_profile_desc": "Language & preferences", + "header.menu_theme": "Theme", + "header.menu_theme_light": "Light", + "header.menu_toggle": "Menu", + "header.profile": "Profile", + "header.quick_help": "Quick Help", + "header.refresh": "Refresh", + "header.search_placeholder": "Search all vaults...", + "header.sidebar_toggle": "Toggle sidebar", + "header.sync_status": "Sync", + "help.00b9572b": "Results ranked by TF-IDF relevance", + "help.04df1506": "Global search with autocomplete", + "help.065f53ee": "Silent auto-save after 2s of inactivity", + "help.085ec31f": "Quick select at the top of the Vault tab", + "help.096367af": "Visual indicators", + "help.170a6982": "Horizontal display with the file name", + "help.229fd3e2": "Discord notification", + "help.2507242f": "🏷️ Tags", + "help.29afa01d": "🪝 Webhooks", + "help.2a2e5b0f": "⌨️ Keyboard shortcuts", + "help.2a92203f": "Tips and tricks", + "help.2c03a7ba": "Inline vs frontmatter tags", + "help.2dad2bfd": "Automatic save", + "help.381abec7": "Current limitations", + "help.3cf370b1": "Type a file name to find it quickly. The search uses the /api/suggest API for instant suggestions. Press Enter to open the selected file.", + "help.40dd7e38": "Test with curl", + "help.4de7e318": "The 50 most recent searches (localStorage)", + "help.550b0240": "Concrete examples", + "help.5ab8c78d": "Stay open until manually closed", + "help.5d0fbb81": "Workers, TF-IDF boosts, prefix expansions", + "help.5f87ea79": "Tag cloud", + "help.61ee5a22": "Interaction", + "help.62308f96": "Ctrl+Shift+Space: File palette (search by title)", + "help.62549eca": "💾 Backups and Audits", + "help.63f024d4": "Template tag filtering", + "help.686f8313": "💡 Tips and best practices", + "help.6a5ddef2": "Tags adapt to the selected vault", + "help.6ae5342c": "Index stats, memory, search engine", + "help.6b88a375": "Debounce delay, results per page, timeout", + "help.6b8fc728": "↑/↓ to navigate, Enter to select", + "help.6d547397": "Tab: Toggle between file mode and command mode", + "help.6e940dac": "Click the sidebar icon in the header", + "help.733f0559": "🗺️ Navigation", + "help.77f4f06e": "Payload format", + "help.7bcbb2e3": "Sidebar resizing", + "help.7db70e27": "Copy, Source, Download, Edit, Open in new window", + "help.83f1d9ca": "Protection", + "help.86e3825d": "🎨 Customization", + "help.8717768b": "Node metadata (tags, links, path)", + "help.89bd3c4c": "Only shows nodes with a specific tag", + "help.8c5341e0": "📑 Tab management", + "help.8c65b2f2": "🔗 Sharing and Webhooks", + "help.8caed987": "Display", + "help.9c7a0a8d": "🗺️ Graph View", + "help.9edeaa11": "Controls exploration depth (0-3)", + "help.9f78b3ec": "Easier navigation in long files", + "help.a4a4e21b": "\"×\" button to reset the filter", + "help.a579cf4d": "Preview note content without navigating", + "help.a648c49e": "Facets and sorting", + "help.ab2c4150": "Files (squares) and folders (circles) with icons", + "help.about": "About", + "help.access": "Access", + "help.action_buttons": "Action buttons", + "help.actions_available": "Buttons available above the content:", + "help.actions_detail": "Buttons available above the content:", + "help.activation": "Activation", + "help.active_filter_chips": "Active filter chips", + "help.active_tab": "Active tab", + "help.add_remove": "Add/Remove", + "help.adf30d78": "🔍 Search", + "help.advanced_operators": "Advanced operators", + "help.advanced_use_cases": "Advanced use cases", + "help.ai_completes": "Completes", + "help.ai_features": "Edit, tone, translate, generate and tools via AI.", + "help.ai_flash_green": "flashes green", + "help.ai_tone_casual": "Casual tone", + "help.all_vaults": "All vaults", + "help.atomic_writes": "Atomic writes", + "help.audit_log": "Audit log", + "help.auto_save": "Automatic save", + "help.auto_scroll": "Auto-scroll", + "help.autocomplete": "Autocomplete", + "help.b6619ac9": "Ctrl+Alt+Space: Command palette (action list)", + "help.backlinks_panel": "Backlinks panel", + "help.backup_auto": "Auto backup", + "help.before_write": "Before write", + "help.breadcrumb": "Breadcrumb", + "help.breadcrumb_clickable": "Clickable breadcrumb", + "help.breadcrumb_reposition": "Breadcrumb and repositioning", + "help.c017944b": "📄 Files", + "help.c48fb18a": "Authentication", + "help.c8532869": "Completion, rewrite, translation (see", + "help.case_sensitive": "Case-sensitive", + "help.cf8615b1": "Visualization", + "help.ci_cd": "CI/CD automation", + "help.clear": "Clear", + "help.clear_search": "Clear", + "help.click_segment": "Click a segment", + "help.click_tab": "Click a tab", + "help.click_vault": "Click the vault", + "help.clickable": "Clickable", + "help.close_help": "Close help", + "help.close_tab_x": "✕ button", + "help.code_preview": "Code + Preview", + "help.command_palette": "Command palette", + "help.configuration": "Settings", + "help.content_area": "Content area", + "help.content_shows": "The main area displays:", + "help.context_actions": "File actions", + "help.context_menu": "Context menu (right click)", + "help.copy_path": "Copy path", + "help.d186a19e": "The \"Recent\" tab in the sidebar lists your", + "help.d1ea1dc6": "n8n / Make (no-code)", + "help.d5c977ac": "Code blocks adapt to the theme", + "help.dark": "Dark", + "help.dashboard": "Dashboard statistics", + "help.delete": "Delete", + "help.desc_00b9572b": ":\n Results ranked by TF-IDF relevance", + "help.desc_04493800": ": 64\n caractères hexadécimaux, impossible à\n deviner", + "help.desc_065f53ee": ": Silent auto-save after 2s of inactivity, green confirmation flash", + "help.desc_071da87a": "Lecture seule : La vue publique n'affiche que le contenu sans édition", + "help.desc_0739c6a9": "Images : Support complet des syntaxes Obsidian", + "help.desc_085ec31f": ":\n Quick select at the top of the Vault tabs", + "help.desc_0f9a1e5b": "Use the sidebar to navigate between vaults and folders.", + "help.desc_11cf9e8a": "Éditer ▾ — Menu de modification du texte sélectionné : 🪄 Improve writing : Améliore la qualité, la clarté et le flux du texte", + "help.desc_13d206d4": "Transforms textual data into a readable Markdown table — ideal for comparisons and structured information.", + "help.desc_13d90039": "ObsiGate generates a shareable, read-only link.", + "help.desc_1577912b": "Rate limiting : 10 tentatives / 15 min par IP + verrouillage compte", + "help.desc_170a6982": "Converts a sentence or paragraph into a structured bullet-point list.", + "help.desc_188bc423": "Pour plus d'informations, consultez le dépôt du projet.", + "help.desc_19cf5730": "Rotation", + "help.desc_19cfa369": "Documents are automatically saved after each modification. A status indicator in the editor header confirms: Saved or Saving….", + "help.desc_1a04ae18": "Use the sidebar to navigate between vaults and folders.", + "help.desc_1ba39cc4": "Update", + "help.desc_1c130d89": "Translate — translates selected text to target language", + "help.desc_1f11691c": "Atomic writes : Écriture via fichier temporaire + renommage atomique", + "help.desc_2349271d": "Automatisation CI/CD : Déclencher un build quand une note de procédure est mise à jour", + "help.desc_26f81732": "Édition rapide : Ouvrez l'éditeur, modifiez, sauvegardez", + "help.desc_287be69c": "Vault", + "help.desc_2c220763": "Edit config.yaml to customize behavior", + "help.desc_2f2c16b5": "Publish", + "help.desc_31e7253b": "Each backup", + "help.desc_32e3d66d": "En cas d'erreur de clé API : AI: clé API invalide", + "help.desc_39979e71": "Vault", + "help.desc_39e97b2f": "Note: the file_modified event is reserved for future use and is not currently emitted.", + "help.desc_3ace259e": "— Inline completion", + "help.desc_3c4711b8": "Edit config.yaml to customize behavior", + "help.desc_3d4e9189": "Simplifies the language for easier reading — replaces complex terms and shortens long sentences.", + "help.desc_3da1896a": "Each webhook receives a POST with event details", + "help.desc_3db2812f": "X-ObsiGate-Signature: sha256=9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08 Pour vérifier côté récepteur : calculez HMAC-SHA256(corps_brut, secret) et comparez. Le header X-ObsiGate-Event contient aussi le type d'événement pour un routage rapide.", + "help.desc_40c92863": "Exploration par tags : Cliquez sur un tag dans une note pour voir toutes les notes similaires", + "help.desc_42a81347": "Casual and friendly tone — ideal for informal communication or social media.", + "help.desc_443b76b5": "Wikilinks : Naviguez entre notes comme dans Obsidian", + "help.desc_47e1e10f": "Générer ▾ — Génère du contenu à partir de la sélection : ℹ️ Explain this : Explique le texte sélectionné de façon claire", + "help.desc_4de7e318": ": The 50 most recent searches (localStorage)", + "help.desc_50a33a05": "Generates YAML frontmatter for the current document (title, date, tags based on content).", + "help.desc_5374685a": "Mobile-friendly : Utilisez le bouton hamburger sur mobile", + "help.desc_5396ed9e": "Profitez de l'historique : Réutilisez vos recherches fréquentes", + "help.desc_53bfaeca": "Navigation", + "help.desc_5524e921": "Adapts the tone for a formal, business context — suitable for reports, emails, and official documents.", + "help.desc_555e0305": "Pour changer de provider par défaut : AI_DEFAULT_PROVIDER=openrouter", + "help.desc_56760d7f": "Each webhook receives a POST with a JSON body containing the event type, vault, path, and a timestamp.", + "help.desc_58d2326f": "Use the sidebar to navigate between vaults and folders.", + "help.desc_599f3242": "Log", + "help.desc_5a53de53": "📏 Make shorter : Rend le texte plus concis tout en préservant l'information", + "help.desc_5ab8c78d": ":\n Stay open until manually closed", + "help.desc_5d0fbb81": ":\n Workers, TF-IDF boosts, prefix expansions", + "help.desc_5e9a7fd9": "In the", + "help.desc_5fc28b7d": "Created", + "help.desc_625112fd": "Sélectionnez un contexte : Choisissez un vault pour réduire le bruit", + "help.desc_660051b0": "Audit externe : Logger toutes les modifications dans une base de données externe", + "help.desc_664b1d09": "Use the sidebar to navigate between vaults and folders.", + "help.desc_68c2b170": "Rotation : Rotation automatique à 10 Mo", + "help.desc_6902f20d": "Favorisez les opérateurs : tag: et vault: accélèrent la recherche", + "help.desc_698d92ec": "Gestion de l'espace : Réduisez les sections Vaults/Tags selon vos besoins", + "help.desc_6a5ddef2": "Explains the selected passage with an educational style — defines technical terms and adds context.", + "help.desc_6a80241e": "Width", + "help.desc_6ae5342c": "Index stats", + "help.desc_6b649b1e": ": Highlighted in accent color", + "help.desc_6b88a375": ":\n Debounce delay, results per page, timeout", + "help.desc_6b8fc728": "Select", + "help.desc_6bc48f59": "Each webhook receives a POST with event details", + "help.desc_6caffeed": " — Conversion tools:", + "help.desc_6d68fbc9": "Create markdown file: Create a new .md file", + "help.desc_6ebebdfd": ": Each operator type has its color", + "help.desc_6f7c5889": "Alert", + "help.desc_71eeb16a": ":\n Réutilisez vos recherches fréquentes", + "help.desc_723ed8db": "Non-root Docker : Conteneur tourne avec UID 1000", + "help.desc_752789ab": "File", + "help.desc_759926ee": "Relaxed and friendly tone — ideal for informal communication or social media.", + "help.desc_7671e56a": "Avant écriture : Sauvegarde du contenu original dans .obsigate-backup/", + "help.desc_7708f226": "ObsiGate uses JWT tokens signed with a secret key defined in the .env file.", + "help.desc_7819b56f": "Each webhook receives a POST with event details", + "help.desc_7ab5be50": "Translates the selected text into the target language.", + "help.desc_7b45490b": "Each webhook receives a POST with event details", + "help.desc_7e86626c": "ObsiGate generates a shareable, read-only link. Anyone with the link can view the file content.", + "help.desc_7f1d0512": "Path traversal : Validation des chemins contre les attaques ../", + "help.desc_7ff2fa21": "Pendant une requête AI, un toast ⏳ AI: traitement en cours... s'affiche", + "help.desc_803161e5": "The toolbar contains the following buttons:", + "help.desc_828db5da": ": Both types are combined", + "help.desc_858681a1": ":\n Durée de vie en heures", + "help.desc_85effb89": "Each webhook receives a POST with event details", + "help.desc_8717768b": ": Node metadata (tags, links, path)", + "help.desc_87b348c3": "Recherche multi-critères : tag:docker tag:linux vault:IT nginx", + "help.desc_89a8f5de": "Example: publish a blog post when a file is marked publish: true.", + "help.desc_89bd3c4c": ": Only shows nodes with a specific tag", + "help.desc_8f0bffe3": "JWT tokens", + "help.desc_9186a3a3": "Explorez l'arborescence : Naviguez dans les dossiers", + "help.desc_93902d18": "Utilisez les tags : Filtrez par tags pour affiner", + "help.desc_9846fc07": "In the", + "help.desc_985d759b": "Token unique : 64 caractères hexadécimaux, impossible à deviner", + "help.desc_991307d6": " — Generate content from the selection:", + "help.desc_995a711f": ": Opens the CodeMirror editor", + "help.desc_99c6f0ec": "Share files with a read-only link", + "help.desc_9cb5974c": ": Ouvrez\n plusieurs notes dans des onglets séparés", + "help.desc_9d0e39d0": "Headers CSP : Content-Security-Policy, X-Frame-Options, XSS-Protection", + "help.desc_9edeaa11": ": Controls exploration depth (0-3)", + "help.desc_9f321d1e": "Backup", + "help.desc_9f78b3ec": ":\n Easier navigation in long files", + "help.desc_9fec424d": "Adapts the tone for a professional context — reports, emails, official documents.", + "help.desc_a0ec890a": " — Selected text modification menu:", + "help.desc_a13f7f2c": "Une fois terminé, AI: texte traité ✓ confirme le succès", + "help.desc_a4a4e21b": ": \"×\" button to reset the filter", + "help.desc_a52fc3b1": ": Downloads the file", + "help.desc_a579cf4d": ": Preview note content without navigating", + "help.desc_a601f22e": "Each webhook receives a POST with event details", + "help.desc_a69804cd": "Répertoire dédié : .obsigate-backup/ dans le répertoire de la vault", + "help.desc_a6cb3b26": "🔤 Fix spelling & grammar : Corrige les fautes d'orthographe et de grammaire", + "help.desc_a974f7a6": "Journal : Fichier data/audit.log au format JSON lines", + "help.desc_a9c2c520": "Webhooks automatically notify external services when files or directories change. Configure a URL to receive HTTP POST requests.", + "help.desc_a9db82b5": ": Centers the view on a specific node", + "help.desc_ab2c4150": ": Files (squares) and folders (circles) with icons", + "help.desc_action_buttons": "Copy, Source, Download, Edit, Open in new window", + "help.desc_adv_syntax": ": Python, JS, HTML, CSS, Java, C++, Rust, Go and many more", + "help.desc_ae213f54": ":\n Combinez opérateurs et texte libre", + "help.desc_aec0ad2c": "💬 Réécrire — Réécrit le texte selon vos instructions personnalisées. Une boîte de dialogue vous demande votre instruction.", + "help.desc_all_tags": ": Extracted from YAML frontmatters and inline (#tag)", + "help.desc_all_vaults": ": Global view of all your content", + "help.desc_autoscroll": ": The sidebar positions itself automatically", + "help.desc_b54c21ef": "Contrôle d'accès par vault : Chaque utilisateur voit uniquement ses vaults", + "help.desc_b5f89b3b": "ObsiGate integrates an AI assistant directly into the text editor. To activate it, configure at least one AI provider in the .env file (DeepSeek, OpenRouter, or Gemini).", + "help.desc_b6169f2e": "Each webhook receives a POST with event details", + "help.desc_b9c94994": ": Preview of the applied regex", + "help.desc_ba4578ae": "Restart the container:", + "help.desc_bc08f215": "ObsiGate uses JWT tokens signed with a secret key defined in the .env file.", + "help.desc_beed5686": "Click on", + "help.desc_breadcrumb": "File path (clickable to reposition sidebar)", + "help.desc_c1f72521": "Edit config.yaml to customize behavior", + "help.desc_c63f02cc": "Rewrites the text according to your custom instructions. A dialog prompts for your instruction.", + "help.desc_c8532869": ": Completion, rewrite, translation (see", + "help.desc_c992f2e5": "Remplissez : Nom (descriptif), URL (endpoint cible), Secret (optionnel)", + "help.desc_case_sensitive": ": \"Aa\" button to respect case", + "help.desc_cb6f0bfd": "Backup", + "help.desc_cc8e35ba": "Notifications : Alerter un canal Slack/Discord quand un document est créé", + "help.desc_cdf7bb46": "Recherchez intelligemment : Combinez opérateurs et texte libre", + "help.desc_cf5ccd40": "Simplifies the language for easier reading — replaces complex terms and shortens long sentences.", + "help.desc_cfe362a7": "Export PDF : Téléchargement du document partagé en PDF via/s/{token}/pdf", + "help.desc_check_btn": ": Manual save", + "help.desc_chip_remove": ": Click \"×\" to remove a filter", + "help.desc_chip_view": ": See active filters at a glance", + "help.desc_click_segment": ": Navigate to that folder", + "help.desc_click_tab": ": Activates the tab", + "help.desc_click_vault": ": Focus on the vault in the sidebar", + "help.desc_close_btn": ": Closes the tab (unless it's the only one)", + "help.desc_cm_autocomplete": ": Contextual suggestions", + "help.desc_cm_lines": ": Easy navigation", + "help.desc_cm_search": ": Ctrl+F to search in the file", + "help.desc_cm_syntax": ": Supports many languages", + "help.desc_combined": "searches \"web server\" in Markdown files of the IT vault with the linux tag.", + "help.desc_context_menu": ": Right-click on a vault or folder → Graph View", + "help.desc_copy_btn": ": Copies source content to clipboard", + "help.desc_ctrl_tab": ": Next tab", + "help.desc_ctrl_w": ": Close the active tab", + "help.desc_d186a19e": ": The Recent tab in the sidebar lists your latest files", + "help.desc_d3a71d97": "file_modified n'est pas encore dispatché (réservé pour version future)", + "help.desc_d5c977ac": "Code blocks", + "help.desc_d646b709": "Compte admin : Créé automatiquement au premier démarrage", + "help.desc_d66e911c": "In the", + "help.desc_d915c72b": "Synchronisation : Copier les nouveaux fichiers vers un autre système (SharePoint, Google Drive)", + "help.desc_d9cdaa89": "Copy", + "help.desc_d9e8ab0b": "🧰 Boîte ▾ — Outils de conversion : 📋 Convert to list : Transforme le texte en liste Markdown", + "help.desc_dc4d7186": "Each webhook receives a POST with event details", + "help.desc_delete_btn_new": ": Trash button to delete", + "help.desc_double_click": ": Opens the file in a persistent tab", + "help.desc_e0525213": "Inline completion (Ctrl+J). Automatically completes the text where the cursor is located.", + "help.desc_e23c94dd": ": In the toolbar (when available)", + "help.desc_e36f3eaa": "📐 Make longer : Ajoute des détails, exemples ou explications", + "help.desc_e3fce7a3": ": Opens the file in a temporary tab (preview, italic)", + "help.desc_e47d2328": "Preview", + "help.desc_e5246734": ": Previous tab", + "help.desc_e5b67e3d": "Your choice", + "help.desc_e5cf90b2": "Creates a concise summary of the selected text — bullet points capturing the essentials.", + "help.desc_e6129268": "Use the sidebar to navigate between vaults and folders.", + "help.desc_e7e3157a": "Timestamp : Chaque backup est horodaté", + "help.desc_e93517a5": "Download", + "help.desc_ec5f7a26": "Edit config.yaml to customize behavior", + "help.desc_ecf302ae": "Multi-fenêtres : Ouvrez plusieurs notes dans des onglets séparés", + "help.desc_edges": ": Outgoing wikilinks (blue) and incoming backlinks (green)", + "help.desc_eebf177f": "ObsiGate v1.7.0 - Porte d'entrée web pour vos vaults Obsidian", + "help.desc_ef1531ce": ": A temporary tab (italic) is replaced by the next click", + "help.desc_ef3f8158": ": Manage your filtering patterns", + "help.desc_examples": "Examples: ext:sh searches in bash scripts, ext:py in Python scripts, ext:md in Markdown files.", + "help.desc_expand": ": Click on a folder", + "help.desc_export_png": ": Save the graph as an image", + "help.desc_f0adf67a": ": Scroll wheel to zoom, click-drag to move", + "help.desc_f2d4e369": "✏️ Continue writing : Continue l'écriture à partir du texte", + "help.desc_f53badcd": "Add your API key in .env:", + "help.desc_f58da6e1": "Cliquez Ajouter", + "help.desc_f9083ce5": "File", + "help.desc_f952db17": "Refresh tokens : Cookies HttpOnly avec rotation automatique", + "help.desc_fa126609": "Converts the document structure into an Obsidian Canvas (visual cards).", + "help.desc_facet_vaults": ": Counters by vault", + "help.desc_fc9391f3": "ObsiGate sends an HTTP POST to your webhook URL with event details.", + "help.desc_fdeaf803": ": Each file type has its icon (markdown, code, etc.)", + "help.desc_file_suggest": ": File title suggestions", + "help.desc_filter_type": ": Include/exclude files, folders, markdown, other", + "help.desc_filter_usage": "Use the filter bar at the top of the sidebar to search quickly:", + "help.desc_filtering": "Search bar to filter files/tags", + "help.desc_find_in_page": ": Ctrl+F to search in the file (case, regex, whole word)", + "help.desc_frontmatter": ": tags: [docker, linux] or tags: docker, linux", + "help.desc_fullscreen": ": Button to expand the view", + "help.desc_graph_intro": "The graph view offers an interactive visualization of connections between your notes via wikilinks.", + "help.desc_graph_nav": ": Navigation history between nodes", + "help.desc_grouped_results": ": Display by vault with full paths", + "help.desc_hamburger": "(mobile) : Show/hide the sidebar", + "help.desc_hide": "Click the sidebar icon in the header", + "help.desc_images": ": Supports ![[image.png]]", + "help.desc_inline_tags": ": #docker in markdown content", + "help.desc_instant_filter": ": Type to filter files and folders", + "help.desc_logo": "Return to home", + "help.desc_markdown_all": ": Full markdown rendering", + "help.desc_md_render": "Markdown files are rendered with:", + "help.desc_menu_header": ": \"Vault\" dropdown in the Options menu", + "help.desc_menu_options": ": Access to settings, theme, help", + "help.desc_op_ext": ": Filter by file type", + "help.desc_op_path": ": Filter by path", + "help.desc_op_phrase": ": Exact phrase search", + "help.desc_op_tag": ": Filter by tag", + "help.desc_op_title": ": Search in titles only", + "help.desc_op_vault": ": Search in a specific vault", + "help.desc_open_file": ": Click on the file name", + "help.desc_open_new": ": Opens the file in a new tab", + "help.desc_patterns": ": Ex: #<% ... %> or #{{ ... }}", + "help.desc_quick_select": "Dropdown to change vault", + "help.desc_rendered_content": "Markdown with wikilinks and images", + "help.desc_resize": "Drag the right edge to adjust width", + "help.desc_save_btn_new": ": ✓ button to save", + "help.desc_search_all": ": Title, content, tags, paths", + "help.desc_search_bar": "Global search with autocomplete", + "help.desc_search_intro": "Type in the top search bar to start a fulltext search:", + "help.desc_sidebar_toggle": "Hide the sidebar for more space", + "help.desc_snippets": ": Excerpts with highlighted terms", + "help.desc_source_btn": ": Shows/hides raw markdown", + "help.desc_specific_vault": ": Focus on a single vault", + "help.desc_syntax_hl": ": Code block highlighting", + "help.desc_tag_cloud_intro": "The Tags tab in the sidebar displays a tag cloud:", + "help.desc_tag_filter_use": ": Use the filter bar to search for a tag", + "help.desc_tag_suggest": ": Tag suggestions with counters", + "help.desc_tags_tab": "Clickable tag cloud", + "help.desc_template_intro": "In the Configurations, you can hide template tags:", + "help.desc_title_tags": "File metadata", + "help.desc_trash_btn": ": Delete file", + "help.desc_two_tag_types": "ObsiGate supports two types of tags:", + "help.desc_vault_context": "Change context to filter the display:", + "help.desc_vault_indicator": "Shows the active context (All, vault1, etc.)", + "help.desc_vaults_tab": "File and folder tree", + "help.desc_visual_search": ": Search bar to highlight nodes", + "help.desc_wikilinks": ": [[link]] and [[link|text]]", + "help.double_click": "Double click", + "help.drag_drop_tabs": "Drag & drop tabs", + "help.e23c94dd": "In the toolbar (when available)", + "help.e3fce7a3": "Opens the file in a temporary tab (preview,", + "help.e5b67e3d": "Your choice is saved in localStorage", + "help.editor_section": "Editor", + "help.ef1531ce": "A temporary tab (italic) is replaced", + "help.experience": "Experience", + "help.export": "Export", + "help.external_audit": "External audit", + "help.f0adf67a": "Scroll wheel to zoom, click-drag to move", + "help.fallback_editor": "Fallback editor", + "help.fdeaf803": "Each file type has its icon (markdown, code, etc.)", + "help.fe388b67": "Optimizations", + "help.file_actions": "Actions on the open file:", + "help.file_viewer": "File viewer", + "help.filter_toggles": "Toggles Aa, wd, .*", + "help.filtering": "Filtering", + "help.find_capabilities": "Regex, whole word, case-sensitive search in the displayed document with DOM TreeWalker.", + "help.find_in_page": "Find in page", + "help.footer": "© 2026 — Made with ☕, 🎧 and a few", + "help.graph_context": "Context menu", + "help.graph_depth": "Depth slider", + "help.graph_export": "Export PNG", + "help.graph_filter_depth": "Filters & depth", + "help.graph_focus": "Focus mode", + "help.graph_fullscreen": "Full screen & PNG export", + "help.graph_info": "Info panel", + "help.graph_nav_arrows": "Navigation ← → ↑", + "help.graph_navigation": "History navigation ← → ↑", + "help.graph_nodes": "Nodes", + "help.graph_preview": "Ctrl+hover", + "help.graph_sticky": "Sticky panels", + "help.graph_tag_filter": "Filter by tag", + "help.graph_type_filter": "Filter by type", + "help.graph_view": "Graph view", + "help.graph_visual": "Visual search", + "help.graph_zoom": "Zoom/Pan", + "help.graph_zoom_pan": "Scroll wheel zoom & pan", + "help.guide_official": "Official guide", + "help.hamburger_btn": "Hamburger menu button", + "help.header_section": "Header", + "help.help_title": "Help", + "help.hide": "Hide", + "help.hide_help": "Hide help", + "help.highlighted_snippets": "Highlighted snippets", + "help.indexes": "ObsiGate indexes and displays:", + "help.instant": "Instant", + "help.light": "Light", + "help.logo": "ObsiGate logo", + "help.markdown": "Markdown syntax", + "help.menu_header": "Header menu", + "help.menu_options": "Options menu", + "help.mermaid_section": "Mermaid diagrams", + "help.mermaid_templates": "Templates", + "help.mobile": "Floating results bar", + "help.mobile_editor_gestures": ": swipe left → backlinks, swipe right → table of contents.", + "help.mobile_editor_gestures_label": "Touch gestures", + "help.mobile_editor_intro": "On phones and tablets, editing adapts to touch: floating toolbar, gestures and a full-screen reading mode.", + "help.mobile_editor_paste": ": persistent “Paste” button (works around the iOS restriction).", + "help.mobile_editor_paste_label": "Clipboard", + "help.mobile_editor_reading": ": full screen without header or sidebars; swipe horizontally to go to the next or previous file.", + "help.mobile_editor_reading_label": "Reading mode", + "help.mobile_editor_title": "📱 Mobile editing", + "help.mobile_editor_toolbar": ": horizontally scrollable ribbon (headings, bold, italic, strikethrough, highlight, code, quote, lists, checkboxes, links, tags, attachments). The ⚙ icon lets you add, remove or reorder commands; A−/A+ adjust the font size.", + "help.mobile_editor_toolbar_label": "Editing ribbon", + "help.mobile_editor_zoom": ": pinch with two fingers to zoom, drag the handle to resize the editing area.", + "help.mobile_editor_zoom_label": "Zoom & height", + "help.modal_title": "ObsiGate User Guide", + "help.multi_vault": "Multi-vault", + "help.nav_ai": "🤖 AI Editor", + "help.nav_backups": "💾 Backups", + "help.nav_customization": "🎨 Customization", + "help.nav_editing": "✏️ Editing", + "help.nav_files": "📁 Files", + "help.nav_graph": "🗺️ Graph", + "help.nav_interface": "🧭 Interface", + "help.nav_intro": "📘 Introduction", + "help.nav_mobile_editor": "📱 Mobile", + "help.nav_navigation": "🗺️ Navigation", + "help.nav_palette": "⌨️ Palette", + "help.nav_search": "🔍 Search", + "help.nav_security": "🛡️ Security", + "help.nav_sharing": "🔗 Sharing", + "help.nav_shortcuts": "⌨️ Shortcuts", + "help.nav_tabs": "📑 Tabs", + "help.nav_tags": "🏷️ Tags", + "help.nav_tips": "💡 Tips", + "help.nav_webhooks": "🪝 Webhooks", + "help.nav_plugins": "🧩 Plugins", + "help.nav_excalidraw": "🎨 Excalidraw", + "help.new_file": "New file", + "help.new_folder": "New folder", + "help.nights": "sleepless nights 😅", + "help.nodes_edges": "Edges", + "help.other": "Other", + "help.outline_panel": "Outline panel (right)", + "help.pagination": "Pagination", + "help.pal_close_the_palette": "Close the palette", + "help.pal_delete_a_folder_and_its_contents": "Delete a folder and its contents", + "help.pal_delete_the_file_from_the_active_tab": "Delete the file from the active tab", + "help.pal_move_desc": "Navigate the list", + "help.pal_open___select": "Open / select", + "help.pal_open_the_editor_on_the_active_tab": "Open the editor on the active tab", + "help.pal_open_this_guide": "Open this guide", + "help.pal_popout_desc": "Open the document in a detached window", + "help.pal_toggle_light_dark": "Toggle light/dark", + "help.pdf_export": "PDF export", + "help.persistent_display": "Persistent display in bar", + "help.persistent_tabs": "Persistent tabs", + "help.popout_button": "Dedicated button", + "help.powered_by": "Powered by Python, FastAPI, vanilla JS, CodeMirror, Mermaid, Lucide Icons and ❤️ for Obsidian.", + "help.preview_tab": "Preview", + "help.properties": "Properties", + "help.public_shares": "Public sharing", + "help.pwa_section": "PWA", + "help.quick_help": "Quick Help", + "help.quick_select": "Quick select", + "help.rate_limiting": "Rate limiting", + "help.recent_nav": "Recent navigation", + "help.rename": "Rename", + "help.rendered_content": "Rendered content", + "help.rendering_images": "Image rendering", + "help.rendering_md": "Rendering in Markdown", + "help.resize": "Resize", + "help.results_counter": "Results counter", + "help.results_grouped": "Grouped results", + "help.search_bar": "Search bar", + "help.search_dropdown": "Search dropdown", + "help.search_everywhere": "Search everywhere", + "help.search_facets": "Facets", + "help.search_filters": "Search filters", + "help.search_history": "Search history", + "help.search_operators": "Search operators", + "help.search_placeholder": "Search help...", + "help.search_save": "Saved searches", + "help.secret_redaction": "Secret redaction", + "help.security_section": "Security", + "help.share_button": "Share button", + "help.shortcut_ai_completion": "Inline AI completion (in editor)", + "help.shortcut_close": "Close editor / modal", + "help.shortcut_close_editor": "Close editor / modal", + "help.shortcut_close_palette": "Close palette", + "help.shortcut_close_tab": "Close tab", + "help.shortcut_command_palette": "Command palette", + "help.shortcut_file_palette": "File palette (quick nav.)", + "help.shortcut_focus_search": "Focus search bar", + "help.shortcut_forge_help": "Forge editor help", + "help.shortcut_next_tab": "Next tab", + "help.shortcut_palette": "Command palette", + "help.shortcut_palette_cmd": "Command palette (command mode)", + "help.shortcut_prev_tab": "Previous tab", + "help.shortcut_quick_insert": "Quick insert (Forge editor)", + "help.shortcut_quick_search": "Quick search (outside text field)", + "help.shortcut_redo": "Redo", + "help.shortcut_save": "Save", + "help.shortcut_save_file": "Save open file", + "help.shortcut_search_doc": "Search in document", + "help.shortcut_select": "Open/select", + "help.shortcut_tip": "Hover over a document with Ctrl for a quick preview. Click Forge in the toolbar for the advanced editor.", + "help.shortcut_undo": "Undo", + "help.shortcuts": "Keyboard shortcuts", + "help.shortcuts_title": "Shortcuts & Tips", + "help.sidebar_dropdown": "Sidebar dropdown", + "help.sidebar_features": "Sidebar features:", + "help.sidebar_filtering": "Sidebar filtering", + "help.sidebar_section": "Sidebar", + "help.sidebar_tabs": "The sidebar has two tabs:", + "help.sidebar_toggle_btn": "Sidebar toggle button", + "help.simple": "Simple", + "help.simple_search": "Simple search", + "help.single_click": "Single click", + "help.smart_scoring": "Smart scoring", + "help.sort_options": "Sort options", + "help.supported_languages": "Many languages supported", + "help.syncthing": "Syncthing conflicts", + "help.syncthing_conflicts": "Syncthing conflicts", + "help.tab_bar": "Tab bar", + "help.tab_features": "Features", + "help.tab_nav": "Tab navigation", + "help.tabs_section": "Opening tabs", + "help.theme_section": "Theme", + "help.theme_sync": "Synced theme", + "help.theme_toggle": "Toggle between themes:", + "help.themes": "Themes", + "help.tip_hide_sidebar": "Hide the sidebar", + "help.tip_sidebar_filter": "Use sidebar filtering", + "help.tip_use_tags": "Use tags to organize", + "help.title": "ObsiGate Help", + "help.title_tags": "Title and tags", + "help.toc_title": "CONTENTS", + "help.assistant_panel": "🧠 Assistant panel (BooksLM)", + "help.assistant_panel_desc": "The side assistant (floating button or a folder's context menu) answers in formatted Markdown and contextualises your directories or documents. In general mode it also knows what you are looking at: open documents, current directory, active search and recently modified files.", + "help.assistant_markdown": "Formatted answers: headings, lists, tables, quotes and code blocks.", + "help.assistant_links": "Cited files and paths are links: a bare filename copies the name to the clipboard, a folder is revealed in the tree, and a file path opens it in the viewer.", + "help.assistant_sessions": "The header history icon lists past sessions (reopen or delete); “+” starts a new conversation.", + "help.assistant_agent": "The \"agent mode\" button enables tools (read, list, search); modifying actions require confirmation with a change preview.", + "help.assistant_resize": "The left edge of the panel is resizable; the width is remembered.", + "help.assistant_at": "Type @ to attach a file or directory to the context, or to attach an image from a directory.", + "help.assistant_slash": "Type / to run a skill (research, summary, correction, plan…) or an admin command (/help, /providers, /model, /keys).", + "help.assistant_images": "Paste an image into the composer (or attach one) to analyse it with a vision-capable model. The ⓘ button shows the selected model's capabilities, and the model list is filterable by search.", + "help.toolbar_section": "AI toolbar", + "help.tree_section": "Vault tree", + "help.use_cases": "Use cases", + "help.vault_indicator": "Vault indicator", + "help.vault_selector": "Vault selector", + "help.vault_specific": "Specific vault", + "help.webhook_blog_post": "blog post when a file is marked", + "help.webhook_note": "Note: the event", + "help.webhook_notify": "automatically notify services", + "help.webhook_post": "HTTP POST to your", + "help.webhooks": "Webhooks", + "help.welcome_desc": "ObsiGate is your web gateway to your Obsidian vaults. Access, browse, and search all your notes from any device via a modern and responsive interface.", + "help.welcome_tag1": "⚡ Fast navigation", + "help.welcome_tag2": "🗂️ Multi-vault", + "help.welcome_tag3": "🏷️ Smart tags", + "help.welcome_tag4": "📝 Reading & editing", + "help.welcome_tag5": "🔍 TF-IDF search", + "help.welcome_title": "Welcome to ObsiGate", + "help.wikilinks": "Wikilinks", + "help.zoom_pan": "Zoom & Pan", + "mermaid.code": "Code", + "mermaid.copy_svg": "Copy SVG", + "mermaid.download_png": "Download PNG", + "mermaid.preview": "Preview", + "mermaid.zoom_in": "Zoom in", + "mermaid.zoom_out": "Zoom out", + "mobile.all_vaults": "📂 All vaults", + "mobile_editor.add_command": "Add a command", + "mobile_editor.backlinks": "Backlinks", + "mobile_editor.bold": "Bold", + "mobile_editor.close": "Close", + "mobile_editor.cmd_attachment": "Attachment", + "mobile_editor.cmd_bold": "Bold", + "mobile_editor.cmd_bullet": "Bullet list", + "mobile_editor.cmd_checkbox": "Checkbox", + "mobile_editor.cmd_code": "Inline code", + "mobile_editor.cmd_codeblock": "Code block", + "mobile_editor.cmd_dedent": "Outdent", + "mobile_editor.cmd_files": "Template / files", + "mobile_editor.cmd_h1": "Heading 1", + "mobile_editor.cmd_h2": "Heading 2", + "mobile_editor.cmd_h3": "Heading 3", + "mobile_editor.cmd_h4": "Heading 4", + "mobile_editor.cmd_h5": "Heading 5", + "mobile_editor.cmd_h6": "Heading 6", + "mobile_editor.cmd_highlight": "Highlight", + "mobile_editor.cmd_indent": "Indent", + "mobile_editor.cmd_italic": "Italic", + "mobile_editor.cmd_link": "External link", + "mobile_editor.cmd_ordered": "Numbered list", + "mobile_editor.cmd_quote": "Quote", + "mobile_editor.cmd_redo": "Redo", + "mobile_editor.cmd_strike": "Strikethrough", + "mobile_editor.cmd_tag": "Tag", + "mobile_editor.cmd_undo": "Undo", + "mobile_editor.cmd_wikilink": "Internal link", + "mobile_editor.code": "Code", + "mobile_editor.customize": "Customize toolbar", + "mobile_editor.customize_reset": "Reset", + "mobile_editor.customize_title": "Customize toolbar", + "mobile_editor.done": "Done", + "mobile_editor.error": "Loading error", + "mobile_editor.font_larger": "Increase font size", + "mobile_editor.font_smaller": "Decrease font size", + "mobile_editor.italic": "Italic", + "mobile_editor.link": "Link", + "mobile_editor.list": "Bullet list", + "mobile_editor.loading": "Loading…", + "mobile_editor.move_down": "Move down", + "mobile_editor.move_up": "Move up", + "mobile_editor.no_backlinks": "No backlinks", + "mobile_editor.no_headings": "No headings in this document", + "mobile_editor.no_next": "Last file in folder", + "mobile_editor.no_prev": "First file in folder", + "mobile_editor.paste": "Paste", + "mobile_editor.paste_hint": "Long-press the field then choose “Paste” (clipboard access denied).", + "mobile_editor.reading_enter": "Reading mode", + "mobile_editor.reading_exit": "Exit reading mode", + "mobile_editor.remove_command": "Remove", + "mobile_editor.resize": "Adjust editor height", + "mobile_editor.toc": "Table of contents", + "mobile_editor.toolbar": "Mobile editing toolbar", + "modal.create_btn": "Create", + "modal.create_file": "Create a file", + "modal.creating": "Creating...", + "modal.delete_dir": "Delete folder", + "modal.delete_dir_warning": "All files and subfolders will be permanently deleted.", + "modal.delete_file": "Delete file", + "modal.delete_irreversible": "This action is irreversible.", + "modal.delete_permanently": "Delete permanently", + "modal.delete_warning": "Warning!", + "modal.dir_to_delete": "Folder to delete:", + "modal.file_name": "File name", + "modal.file_to_delete": "File to delete:", + "modal.file_type": "File type", + "modal.in_folder": "In: {path}", + "month.april": "April", + "month.august": "August", + "month.december": "December", + "month.february": "February", + "month.january": "January", + "month.july": "July", + "month.june": "June", + "month.march": "March", + "month.may": "May", + "month.november": "November", + "month.october": "October", + "month.september": "September", + "offline.all_synced": "All changes synced", + "offline.conflict_title": "Sync conflict", + "offline.keep_local": "Keep local version", + "offline.keep_server": "Keep server version", + "offline.mode_offline": "Offline mode — changes will sync when back online", + "offline.pending": "{count} pending change(s)", + "offline.reconnected": "Connection restored — synchronizing...", + "offline.status": "Offline", + "offline.sync_now": "Sync now", + "palette.browse_dirs": "📂 Browse directories...", + "palette.browse_hint": "Navigate vaults to find a file", + "palette.browse_in": "In {path}", + "palette.browse_no_results": "No results — browse manually", + "palette.browse_open_file": "📂 Open a file in this directory", + "palette.browse_root": "root", + "palette.close_current": "Close current file", + "palette.close_current_desc": "Close active tab without deleting", + "palette.cmd_back_home": "🏠 Home", + "palette.cmd_back_home_desc": "Back to home", + "palette.cmd_config": "⚙️ Settings", + "palette.cmd_config_desc": "Open settings", + "palette.cmd_create_dir": "📁 Create directory", + "palette.cmd_create_dir_desc": "Choose vault, navigate, then name the directory", + "palette.cmd_create_file": "📄 Create markdown file", + "palette.cmd_create_file_desc": "Choose vault, navigate, then name the file", + "palette.cmd_delete_dir": "🗑️ Delete directory", + "palette.cmd_delete_dir_desc": "Choose vault, navigate and delete", + "palette.cmd_theme": "🌓 Toggle theme", + "palette.cmd_theme_desc": "Toggle light/dark", + "palette.del_all_content": "All content will be deleted", + "palette.delete_current": "Delete current file", + "palette.delete_current_desc": "Delete file from active tab", + "palette.delete_file_desc": "Search for a file to delete", + "palette.dir_delete_confirm": "All content will be deleted", + "palette.dir_name": "Directory name", + "palette.empty_dir": "📂 Empty directory", + "palette.error_loading": "Loading error", + "palette.error_prefix": "Error: {msg}", + "palette.file_name": "File name", + "palette.help_desc": "Open the guide", + "palette.md_hint": "(.md added if needed)", + "palette.mode_commands": "Commands", + "palette.mode_files": "Files", + "palette.no_results": "No results for \"{query}\"", + "palette.no_vaults": "No vaults found", + "palette.popout_desc": "Open document in a window", + "palette.reindex_desc": "Force full reindex", + "palette.search_commands": "Type a command...", + "palette.search_error": "Search error", + "palette.search_files": "Search files...", + "palette.type_command": "Type a command...", + "palette.type_search": "Search files... (+include -exclude)", + "palette.vault_count": "{count} files", + "pwa.dismiss": "Later", + "pwa.install_button": "Install", + "pwa.install_desc": "Install this app on your device for quick access.", + "pwa.install_title": "Install ObsiGate", + "search.advanced_operators": "Advanced operators", + "search.aria_label": "Search suggestions", + "search.case_sensitive": "Case sensitive", + "search.clear": "Clear", + "search.dropdown_clear_history": "Clear history", + "search.dropdown_files": "Files", + "search.dropdown_history": "History", + "search.error": "Search error", + "search.exclude_placeholder": "Exclude: vendor/*, *.lock", + "search.facet_tags": "Tags", + "search.facet_vaults": "Vaults", + "search.files_filtered": "{count} file(s) with filters", + "search.filter_path_title": "Path filters (Alt-F)", + "search.filters": "Filters", + "search.full_text": "Search everywhere", + "search.highlighted_snippets": "Highlighted snippets", + "search.include_placeholder": "Include: **/*.md, notes/**", + "search.loading": "Searching...", + "search.no_results": "No results found", + "search.operators_help": "Operators: tag:word, vault:name, title:word, path:word, ext:md", + "search.pagination": "Pagination", + "search.previous": "← Previous", + "search.query_time": "({time} ms)", + "search.regex": "Regular expression", + "search.results_count": "{count} result(s)", + "search.results_filtered": "{count} result(s) for \"{query}\" with filters", + "search.results_for": "{count} result(s) for \"{query}\"", + "search.save_search": "Save search", + "search.saved": "Search saved", + "search.sections_all_vaults": "All vaults", + "search.semantic_score": "sim", + "search.semantic_title": "Semantic search (Alt-S)", + "search.semantic_unavailable": "Semantic search unavailable", + "search.simple_search": "Simple search", + "search.smart_scoring": "Smart scoring", + "search.sort_date": "Date", + "search.sort_relevance": "Relevance", + "search.sort_title": "Title", + "search.whole_word": "Whole word", + "settings.about": "📦 About", + "settings.ai": "🤖 AI", + "settings.backend": "⚙️ Backend", + "settings.backend_hint": "These settings are saved on the server. Some require a restart or reindexing.", + "settings.backend_section": "Backend Settings", + "settings.client_label": "These settings apply immediately on the client side.", + "settings.diagnostics": "🩺 Diagnostics", + "settings.history_count_desc": "Between 5 and 100 files (saved on server)", + "settings.history_count_label": "Files in history", + "settings.history_section": "Recent History", + "settings.no_restart_badge": "No restart needed", + "settings.profile": "👤 Profile", + "settings.reindex": "Force reindex", + "settings.restart_badge": "Restart required", + "settings.save": "Save", + "settings.search": "Search", + "settings.tabs": "Tabs", + "settings.search_placeholder": "Search...", + "settings.sync": "🔄 Sync", + "settings.themes": "🎨 Themes", + "settings.plugins": "🧩 Plugins", + "share.copied": "Link copied!", + "share.copy_link": "Copy link", + "share.create": "Create share link", + "share.expires": "Expires on", + "share.never": "Never", + "share.revoke": "Revoke", + "share.title": "Public share", + "shortcut.ai_completion": "AI inline completion (in editor)", + "shortcut.close_editor": "Close editor / modal", + "shortcut.command_palette": "Command palette", + "shortcut.editor_help": "Forge editor help", + "shortcut.file_palette": "File palette (quick nav)", + "shortcut.focus_search": "Focus search bar", + "shortcut.quick_insert": "Quick insert (Forge editor)", + "shortcut.quick_search": "Quick search (outside text field)", + "shortcut.save_file": "Save open file", + "shortcut.search_in_doc": "Search in document", + "shortcut.tip_preview": "Hover a document with **Ctrl** for a quick preview. Click **Forge** in the toolbar for the advanced editor.", + "sidebar.all_vaults": "All vaults", + "sidebar.case_sensitive": "Case sensitive", + "sidebar.clear_filter": "Clear", + "sidebar.expand_collapse": "Expand/Collapse", + "sidebar.file_icons": "Icons", + "sidebar.filter_instant": "Instant search", + "sidebar.filter_path": "Path filters", + "sidebar.filter_placeholder": "Filter files...", + "sidebar.filter_results_grouped": "Grouped results", + "sidebar.loading": "Loading...", + "sidebar.no_recent_files": "No recent files", + "sidebar.no_results": "No matching directory or file.", + "sidebar.no_saved_searches": "No saved searches", + "sidebar.open_file": "Open file", + "sidebar.saved_dirs_tab": "Folders", + "sidebar.saved_searches_tab": "Searches", + "sidebar.sidebar_dropdown": "Vault context menu", + "sidebar.sidebar_filtering": "Sidebar filtering", + "sidebar.tab_backups": "Backups", + "sidebar.tab_recent": "Recent", + "sidebar.tab_saved": "Searches", + "sidebar.tab_tags": "Tags", + "sidebar.tab_vaults": "Vaults", + "sidebar.vault_context_all": "All vaults", + "sidebar.vault_specific": "Specific vault", + "sync.autocomplete": "Autocomplete", + "sync.autocomplete_active": "Autocomplete active", + "sync.connected": "Synchronized", + "sync.connected_short": "Connected", + "sync.disconnected": "Disconnected", + "sync.event_index_progress": "Vault indexed", + "sync.event_index_start": "Index starting", + "sync.event_index_updated": "Update", + "sync.event_vault_added": "Vault added", + "sync.event_vault_removed": "Vault removed", + "sync.index_complete": "Indexing complete ({count} files)", + "sync.index_reloaded": "Full index reloaded", + "sync.index_started": "Indexing started ({count} vaults)", + "sync.install_success": "ObsiGate installed successfully!", + "sync.model_not_loaded": "Model not loaded", + "sync.no_provider": "No provider", + "sync.no_recent_events": "No recent events", + "sync.not_configured": "Not configured", + "sync.processing": "Processing…", + "sync.update": "Update", + "sync.updating": "Updating...", + "sync.vault_added": "Vault \"{vault}\" added ({count} files)", + "sync.vault_added_label": "Vault added", + "sync.vault_files": "{vault} ({files} files)", + "sync.vault_indexed_label": "Vault indexed", + "sync.vault_removed": "Vault \"{vault}\" removed", + "sync.vault_removed_label": "Vault removed", + "sync.verifying": "Verifying…", + "theme.change": "Change theme", + "theme.dark": "Dark", + "theme.light": "Light", + "theme.high_contrast": "High Contrast", + "theme.sepia": "Sepia", + "theme.title": "Theme", + "theme.export_all": "Export Themes", + "theme.import": "Import Theme", + "theme.import_success": "{count} theme(s) imported", + "theme.import_error": "Import error", + "theme.delete_confirm": "Delete this custom theme?", + "themes.name_gradients": "Subtle gradients", + "themes.name_terminal": "Pure black & green", + "toast.ai_keys_saved": "API keys saved", + "toast.ai_no_key": "No keys to save", + "toast.bookmark_added": "Added to bookmarks", + "toast.bookmark_removed": "Removed from bookmarks", + "toast.cannot_delete_self": "Cannot delete your own account", + "toast.config_client_saved": "Client settings saved", + "toast.config_reset": "Configuration reset", + "toast.config_saved": "Configuration saved", + "toast.conflict_resolved": "Conflict resolved", + "toast.copied": "Copied!", + "toast.copy_error": "Copy error", + "toast.create_error": "Creation error", + "toast.created": "Created", + "toast.delete_error": "Deletion error", + "toast.deleted": "Deleted", + "toast.dir_created": "Folder \"{name}\" created", + "toast.dir_deleted": "Folder deleted ({count} files)", + "toast.dir_renamed": "Directory renamed", + "toast.dir_saved_search": "Folder saved to searches", + "toast.error_delete": "Delete error", + "toast.error_init": "Initialization error", + "toast.error_load": "Loading error", + "toast.error_network": "Network error", + "toast.error_rename": "Cannot rename this item", + "toast.file_created": "File \"{name}\" created", + "toast.file_deleted": "File deleted", + "toast.file_renamed": "File renamed", + "toast.hidden_saved": "✓ Settings saved", + "toast.index_reloaded": "Full index reloaded", + "toast.installed": "ObsiGate installed successfully!", + "toast.link_created": "Link created!", + "toast.moved": "Moved", + "toast.no_open_file": "No file open", + "toast.not_found_tree": "Item not found in tree", + "toast.path_copied": "Path copied: {path}", + "toast.reindex_done": "Reindexing complete", + "toast.reindex_started": "Reindexing...", + "toast.rename_error": "Rename error", + "toast.renamed": "Renamed", + "toast.saved": "Saved", + "toast.search_saved": "Search saved", + "toast.share_revoked": "Share revoked", + "toast.url_required": "URL required", + "toast.user_created": "User created", + "toast.user_deleted": "User deleted", + "toast.user_modified": "User modified", + "toast.viewer_error": "Viewer loading error", + "toc.hide_panel": "Hide panel", + "toc.no_headings": "No headings in this document", + "toc.title": "ON THIS PAGE", + "tree.new_file": "New file", + "tree.new_folder": "New folder", + "tree.vault_home": "Vault home", + "ui.backups_versions": "Backups / Versions", + "ui.cannot_rename": "Cannot rename this item", + "ui.delete_name_empty": "Name cannot be empty", + "ui.element_not_found": "Element not found in tree", + "ui.vault_readonly": "Read-only vault", + "vault.add_dynamic": "Add vault", + "vault.reindex": "Reindex vault", + "vault.remove_dynamic": "Remove vault", + "vaulthome.empty": "No files in this directory", + "vaulthome.error_loading": "Loading error:", + "vaulthome.file_count": "{count} file", + "vaulthome.file_count_plural": "{count} files", + "vaulthome.loading": "Loading files...", + "vaulthome.size_bytes": "B", + "vaulthome.size_kb": "KB", + "vaulthome.size_mb": "MB", + "viewer.backlinks": "Backlinks", + "viewer.binary_download": "Download file", + "viewer.binary_unsupported": "Unsupported binary file", + "viewer.bookmark_add": "Add to bookmarks", + "viewer.bookmark_remove": "Remove bookmarks", + "viewer.bookmark_toggle": "Add/Remove bookmarks", + "viewer.breadcrumb_home": "Home", + "viewer.click_to_download": "Click to download", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "viewer.copy_error": "Copy error", + "viewer.download": "Download", + "viewer.download_md": "Download as .md", + "viewer.download_file": "Download file", + "viewer.pretty": "Pretty", + "viewer.pretty_title": "Formatted mode: colors and line numbers", + "viewer.download_pdf": "Download as PDF", + "viewer.edit": "Edit", + "viewer.error": "Loading error", + "viewer.export": "Export", + "viewer.export_done": "Export complete", + "viewer.export_epub": "Export as ePub", + "viewer.export_error": "Export error:", + "viewer.export_html": "Export as HTML", + "viewer.export_md_bundle": "Export as Markdown bundle (.zip)", + "viewer.export_start": "Exporting...", + "viewer.export_title": "Export document", + "viewer.forge_brand": "Forge", + "viewer.forge_title": "Forge (new editor)", + "viewer.index_start": "Starting index...", + "viewer.index_updated": "Updated", + "viewer.loaded_from_cache": "File loaded from offline cache", + "viewer.loading": "Loading file...", + "viewer.markdown": "Markdown", + "viewer.metadata_created": "Created", + "viewer.metadata_modified": "Modified", + "viewer.metadata_path": "Path", + "viewer.metadata_size": "Size", + "viewer.metadata_tags": "Tags", + "viewer.metadata_vault": "Vault", + "viewer.no_headings": "No headings in this document", + "viewer.on_this_page": "ON THIS PAGE", + "viewer.outline": "Outline", + "viewer.pdf_pages": "{count} pages", + "viewer.popout": "Open in popup", + "viewer.raw": "Raw", + "viewer.share": "Share", + "viewer.shared_doc_title": "Shared document — click to manage", + "viewer.source": "Source", + "viewer.syncing": "Updating...", + "viewer.toc": "Table of contents", + "viewer.unsupported_file": "This file is binary and cannot be displayed", + "webhook.trigger_create": "Creation via API or palette", + "webhook.trigger_delete": "Deletion via API or editor", + "webhook.trigger_dir_create": "Directory creation via API", + "webhook.trigger_dir_delete": "Directory deletion via API", + "webhook.trigger_dir_rename": "Directory rename via API", + "webhook.trigger_rename": "Rename via API", + "settings.security": "🔒 Account Security", + "settings.security_desc": "Enable two-factor authentication (2FA) to strengthen your account security.", + "mfa.title": "Two-Factor Authentication", + "mfa.subtitle": "Enter the 6-digit code from your authenticator app.", + "mfa.verify": "Verify", + "mfa.verifying": "Verifying...", + "mfa.use_recovery": "Use a recovery code", + "mfa.back_to_login": "Back to login", + "mfa.recovery_title": "Recovery Code", + "mfa.recovery_subtitle": "Enter one of your recovery codes (format: XXXX-XXXX).", + "mfa.use_totp": "Use authenticator code", + "mfa.status_label": "Two-Factor Authentication", + "mfa.enabled": "Enabled", + "mfa.disabled": "Disabled", + "mfa.enabled_desc": "Your account is protected by two-factor authentication.", + "mfa.setup_desc": "Add an extra layer of security to your account with TOTP.", + "mfa.enable_btn": "Enable 2FA", + "mfa.disable_btn": "Disable 2FA", + "mfa.scan_qr": "Scan this QR code with your authenticator app", + "mfa.manual_entry": "Manual entry (if you can't scan)", + "mfa.enter_code": "Enter the 6-digit code to confirm", + "mfa.confirm_enable": "Confirm & Enable", + "mfa.recovery_codes_title": "Recovery Codes", + "mfa.recovery_codes_warning": "Save these codes in a secure place. Each code can only be used once.", + "mfa.copy_codes": "Copy", + "mfa.download_codes": "Download", + "mfa.done": "Done", + "mfa.codes_copied": "Recovery codes copied!", + "mfa.disable_confirm_title": "Disable 2FA", + "mfa.disable_confirm_desc": "Enter your password and a valid TOTP code to disable two-factor authentication.", + "mfa.password_label": "Password", + "mfa.password_placeholder": "Your current password", + "mfa.totp_code_label": "TOTP Code", + "mfa.disable_confirm_btn": "Disable 2FA", + "mfa.disabled_success": "2FA has been disabled.", + "mfa.fill_all_fields": "Please fill in all fields.", + "bookslm.title": "BooksLM", + "bookslm.files_indexed": "{count} files indexed", + "bookslm.chars_loaded": "{chars} chars loaded", + "bookslm.placeholder": "", + "bookslm.send": "Send", + "bookslm.new_conversation": "New conversation", + "bookslm.export": "Export conversation", + "bookslm.toggle_sidebar": "Hide/Show AI sidebar", + "bookslm.copy": "Copy", + "bookslm.insert": "Add", + "bookslm.insert_hint": "Append the answer to the document open in the editor", + "bookslm.inserted": "Answer added to the document", + "bookslm.insert_no_editor": "No document open in the editor", + "ai.steps_count": "{count} steps", + "bookslm.copied": "Copied to clipboard", + "bookslm.error": "AI service error", + "bookslm.regenerate": "Regenerate", + "bookslm.suggestion_summary": "Summarize this directory", + "bookslm.suggestion_themes": "What are the main themes?", + "bookslm.suggestion_contradictions": "Are there contradictions between these documents?", + "bookslm.no_context": "No files found in this directory", + "bookslm.context_too_large": "Directory too large — some files were truncated", + "bookslm.source": "Source", + "bookslm.session_history": "Session history", + "bookslm.session_delete": "Delete session", + "bookslm.history_empty": "No saved session", + "bookslm.untitled": "Untitled conversation", + "bookslm.no_vault": "No active vault to open this link", + "bookslm.copied_name": "Name copied: {name}", + "palette.bookslm_open": "BooksLM: Open for current directory", + "palette.bookslm_open_desc": "Opens the AI assistant for the current context (open documents or general)", + "palette.bookslm_new": "BooksLM: New conversation", + "palette.bookslm_new_desc": "Resets the AI assistant conversation", + "fab.open": "Open AI assistant", + "fab.close": "Close AI assistant", + "mfa.webauthn_title": "Security keys (WebAuthn)", + "mfa.webauthn_desc": "Authenticate with a physical key (YubiKey) or your device biometrics (Windows Hello, Touch ID).", + "mfa.webauthn_none": "No registered keys.", + "mfa.webauthn_add": "Add a security key", + "mfa.webauthn_label_prompt": "Key name (e.g. Pocket YubiKey)", + "mfa.webauthn_added": "Security key registered.", + "mfa.webauthn_removed": "Security key removed.", + "mfa.webauthn_remove": "Remove", + "mfa.webauthn_remove_confirm": "Enter your password to remove this key:", + "mfa.webauthn_prompt": "Present your security key or confirm with Windows Hello.", + "mfa.webauthn_btn": "Verify with my key", + "mfa.webauthn_cancelled": "WebAuthn ceremony cancelled.", + "mfa.webauthn_no_key": "No security key registered for this account.", + "plugins.title": "🧩 Plugins", + "plugins.description": "Extend ObsiGate with custom renderers, search filters, and editor actions.", + "plugins.install": "Install Plugin", + "plugins.template": "View Template", + "plugins.none": "No plugins installed.", + "plugins.manifest_json": "Manifest (plugin.json)", + "plugins.code": "Plugin Code (main file)", + "plugins.view_code": "View Code", + "plugins.uninstall": "Uninstall", + "plugins.enable": "Enable", + "plugins.disable": "Disable", + "plugins.enabled": "Plugin '{name}' enabled.", + "plugins.disabled": "Plugin '{name}' disabled.", + "plugins.installed": "Plugin '{name}' installed successfully.", + "plugins.uninstalled": "Plugin '{name}' uninstalled.", + "plugins.confirm_uninstall": "Uninstall plugin '{name}'? This cannot be undone.", + "help.plugins_title": "🧩 Plugins", + "help.plugins_intro": "Plugins extend ObsiGate: custom file rendering, search filters, editor actions, widgets and integrations. They run in sandboxed Web Workers — isolated from the page for security.", + "help.plugins_install": "Installation", + "help.plugins_install_1": "Open Settings → 🧩 Plugins.", + "help.plugins_install_2": "Click 'Install a plugin'.", + "help.plugins_install_3": "Select a .zip file containing the plugin.json manifest and the plugin code.", + "help.plugins_install_4": "The manifest is validated (name, semver version, hooks, permissions) before installation.", + "help.plugins_manage": "Management", + "help.plugins_manage_1": "Enable / Disable: buttons on each plugin — hooks only run if the plugin is enabled.", + "help.plugins_manage_2": "Uninstall: permanently removes the plugin from the vault.", + "help.plugins_manage_3": "Code: view the source code of the installed plugin.", + "help.plugins_dev": "Develop a plugin", + "help.plugins_dev_intro": "Download the template from Settings → Plugins → 'Get template'. A plugin consists of a plugin.json manifest and a main file (e.g. index.js).", + "help.plugins_hooks": "Available hooks", + "help.plugins_hook_render": "onFileRender", + "help.plugins_hook_render_desc": "transforms the displayed content of a file.", + "help.plugins_hook_search": "onSearchFilter", + "help.plugins_hook_search_desc": "filters search results.", + "help.plugins_hook_editor": "onEditorAction", + "help.plugins_hook_editor_desc": "intercepts editor actions.", + "help.plugins_hook_sidebar": "onSidebarItem", + "help.plugins_hook_sidebar_desc": "adds items to the sidebar.", + "help.plugins_hook_file": "onFileCreate / onFileDelete", + "help.plugins_hook_file_desc": "reacts to file creation / deletion.", + "help.plugins_hook_vault": "onVaultMount", + "help.plugins_hook_vault_desc": "runs when a vault is loaded.", + "help.plugins_security": "Security", + "help.plugins_security_1": "Web Worker sandbox: plugin code runs isolated, with no direct DOM access.", + "help.plugins_security_2": "Permissions: each declared hook must be satisfied by the manifest permissions.", + "help.plugins_security_3": "Secure packaging: the .zip is checked against path traversal on install.", + "help.plugins_security_4": "Admin only: installation and removal require the admin role.", + "help.plugins_template": "Use the Template button in Settings > Plugins to generate a valid starter plugin.", + "help.excalidraw_title": "🎨 Excalidraw diagrams", + "help.excalidraw_intro": ".excalidraw and .excalidraw.md files open in a full visual Excalidraw editor embedded in a sandboxed iframe.", + "help.excalidraw_open_title": "Opening", + "help.excalidraw_open": "Click a .excalidraw file in the tree: the editor opens instead of the markdown viewer.", + "help.excalidraw_edit": "Draw, add shapes, text, arrows and images — the complete Excalidraw experience.", + "help.excalidraw_save_title": "Saving", + "help.excalidraw_save": "Changes are saved automatically (2s debounce) or with Ctrl+S. The editor follows the light/dark theme.", + "help.excalidraw_search_title": "Search", + "help.excalidraw_search": "Text inside diagram elements is extracted on indexing, so it is searchable via the full-text search.", + "help.excalidraw_compat": "Files created with the Obsidian Excalidraw plugin (including the compressed .excalidraw.md format) are compatible.", + "help.footer_tagline": "- Web gateway for your Obsidian vaults" } \ No newline at end of file diff --git a/frontend/locales/fr.json b/frontend/locales/fr.json index 6102217..b7fef0b 100644 --- a/frontend/locales/fr.json +++ b/frontend/locales/fr.json @@ -1,1872 +1,1877 @@ -{ - "_meta": { - "locale": "fr", - "name": "Français" - }, - "about.api_version": "Version API", - "about.backend": "Backend", - "about.browser": "Navigateur", - "about.built_with": "Construit avec", - "about.editor": "Éditeur", - "about.file_watcher": "Surveillance fichiers", - "about.files": "Fichiers", - "about.files_indexed": "Fichiers indexés", - "about.footer": "Fait avec ☕, 🍕 et quelques git push --force accidentels.", - "about.frontend": "Frontend", - "about.fun_quote": "« Aucun LLM n'a été blessé durant ce développement. »", - "about.git": "Git : —", - "about.icons": "Icônes", - "about.joke_0": "0 bug connu. Les autres sont timides.", - "about.joke_1": "Compile du premier coup. (Sauf le lundi matin.)", - "about.joke_2": "Écrit par un humain. Probablement.", - "about.joke_3": "Aucun LLM n'a été blessé durant ce développement.", - "about.joke_4": "Quand ça marche, on appelle ça une feature.", - "about.joke_5": "CSS: 90% du temps de dev, 10% du code.", - "about.joke_6": "Dark mode activé depuis la naissance du projet.", - "about.joke_7": "Ça marche sur ma machine™", - "about.joke_8": "Techniquement, tout est un edge case.", - "about.joke_9": "Le CSS de ce panneau a pris plus de temps que le backend.", - "about.language": "Langue", - "about.last_delivery": "Dernière livraison : Juin 2026", - "about.made_with": "Fait avec ☕, 🎧 et quelques git push --force accidentels.", - "about.markdown_renderer": "Rendu Markdown", - "about.name": "Nom", - "about.platform": "Plateforme", - "about.section_app": "Application", - "about.section_components": "Composants", - "about.section_env": "Environnement", - "about.status": "Statut", - "about.subtitle": "Vos notes Obsidian, simplement accessibles.", - "about.syntax_highlight": "Coloration syntaxe", - "about.tagline": "Vos notes Obsidian,
simplement accessibles.", - "about.tests": "Tests", - "about.vaults_configured": "Vaults configurés", - "about.version": "Version", - "admin.audit_all_actions": "Toutes les actions", - "admin.audit_empty": "Aucun log disponible", - "admin.audit_filter_action": "Action", - "admin.audit_filter_user": "Filtrer par utilisateur", - "admin.audit_refresh": "Rafraîchir", - "admin.audit_title": "Logs d'audit", - "admin.back_btn": "← Retour", - "admin.backups_newest": "Plus récent : {days} jours", - "admin.backups_oldest": "Plus ancien : {days} jours", - "admin.backups_per_vault": "Par vault", - "admin.backups_title": "Statistiques backups", - "admin.backups_total": "Total : {count} backups ({size})", - "admin.backups_vault_empty": "Aucun backup", - "admin.close": "Fermer", - "admin.col_actions": "Actions", - "admin.col_last_login": "Dernière connexion", - "admin.col_role": "Rôle", - "admin.col_status": "Statut", - "admin.col_user": "Utilisateur", - "admin.col_vaults": "Vaults", - "admin.forbidden_msg": "Vous devez être administrateur pour accéder à cette page.", - "admin.forbidden_title": "Accès refusé", - "admin.header_subtitle": "Tableau de bord administrateur", - "admin.new_user": "+ Nouvel utilisateur", - "admin.page_title": "ObsiGate — Administration", - "admin.stats_cpu": "CPU", - "admin.stats_disk": "Disque", - "admin.stats_memory": "Mémoire", - "admin.stats_refresh": "Dernière mise à jour : {time}", - "admin.stats_sessions": "Sessions actives", - "admin.stats_title": "Statistiques temps réel", - "admin.stats_uptime": "Uptime", - "admin.title": "Administration — Utilisateurs", - "admin.users_manage_btn": "Gérer les utilisateurs", - "admin.users_manage_hint": "Ouvrir la modale de gestion des utilisateurs (CRUD complet)", - "admin.users_title": "Gestion utilisateurs", - "ai.action_applied": "Appliqué ✓", - "ai.action_apply": "Appliquer", - "ai.action_applying": "Application…", - "ai.action_create_dir": "Créer le dossier {path}", - "ai.action_create_file": "Créer le fichier {path}", - "ai.action_created_dir": "Dossier créé : {path}", - "ai.action_created_file": "Fichier créé : {path}", - "ai.action_failed": "Échec de l'action : {error}", - "ai.agent_mode_off": "Mode agent désactivé (lecture/recherche + actions)", - "ai.agent_mode_on": "Mode agent activé (outils de lecture/recherche + actions)", - "ai.casual": "Ton décontracté", - "ai.close": "Fermer l'assistant", - "ai.completion_added": "AI: complétion ajoutée", - "ai.context_documents": "{count} document(s) ouvert(s)", - "ai.context_general": "Contexte général", - "ai.context_general_desc": "Questions sur l'application et création de fichiers", - "ai.continue": "Continuer", - "ai.custom_rewrite": "Réécriture personnalisée", - "ai.diff_preview": "Aperçu des modifications", - "ai.done": "AI: texte traité", - "ai.edit": "Éditer", - "ai.error_invalid_key": "clé API invalide", - "ai.explain": "Expliquer", - "ai.fix_spelling": "Corriger l'orthographe", - "ai.fix_spelling_hint": "Corrige les fautes", - "ai.frontmatter": "Générer frontmatter", - "ai.fullscreen": "Plein écran", - "ai.generate": "Générer", - "ai.hint_add_details": "Ajoute des détails", - "ai.hint_edit_selection": "Modifie le texte sélectionné", - "ai.hint_generate": "Génère du contenu à partir de la sélection", - "ai.hint_improve": "Améliore la qualité du texte", - "ai.hint_translate": "Traduit le texte sélectionné", - "ai.improve": "Améliorer", - "ai.input_hint": "Entrée pour envoyer · Ctrl+Entrée pour un saut de ligne", - "ai.inline_completion_title": "AI Inline Completion (Ctrl+J) — Complète le texte automatiquement", - "ai.invalid_api_key": "AI: clé API invalide. Vérifiez DEEPSEEK_API_KEY dans .env", - "ai.longer": "Allonger", - "ai.no_api_key": "Aucune clé API configurée", - "ai.not_configured": "⚠️ AI non configuré — ajouter DEEPSEEK_API_KEY, OPENROUTER_API_KEY ou GEMINI_API_KEY dans .env", - "ai.processing": "⏳ AI: traitement en cours...", - "ai.professional": "Ton professionnel", - "ai.provider": "Fournisseur", - "ai.provider_default": "— défaut —", - "ai.model": "Modèle", - "ai.model_default": "— défaut —", - "ai.model_loading": "Chargement…", - "ai.model_offline": "hors ligne", - "ai.model_load_error": "Erreur de chargement", - "ai.model_settings": "Fournisseur & modèle", - "ai.model_search": "Rechercher un modèle…", - "ai.model_info": "Capacités du modèle", - "ai.model_more": "… {count} autres — affinez la recherche", - "ai.add_context": "Ajouter un contexte", - "ai.attach_image": "Joindre une image", - "ai.cap_audio_speech": "Audio Speech", - "ai.cap_audio_transcription": "Audio Transcriptions", - "ai.cap_chat": "Chat", - "ai.cap_embeddings": "Embeddings", - "ai.cap_images": "Images", - "ai.cap_rerank": "Rerank", - "ai.cap_video": "Video", - "ai.cap_vision": "Vision capable", - "ai.commands": "Commandes", - "ai.activity_sending": "Envoi de la requête…", - "ai.activity_streaming": "Réponse en cours…", - "ai.activity_tool": "Outil : {name}…", - "ai.activity_confirmation": "En attente de confirmation…", - "ai.activity_error": "Échec de la requête", - "ai.activity_done": "Terminé", - "ai.composer_label": "Message à l'assistant", - "ai.create_skill": "Créer un skill", - "ai.image": "image", - "ai.keys": "Clés API enregistrées", - "ai.model_changed": "Modèle changé : {name}", - "ai.no_results": "Aucun résultat", - "ai.none": "Aucun", - "ai.provider_changed": "Fournisseur changé : {name}", - "ai.providers": "Fournisseurs actifs", - "ai.remove": "Retirer", - "ai.resize_panel": "Redimensionner le panneau", - "ai.skill_created": "Skill « {name} » créé", - "ai.skill_id": "Identifiant", - "ai.skill_label": "Nom", - "ai.skill_prompt": "Prompt / instructions", - "ai.skill_prompt_placeholder": "Décris le comportement attendu du skill…", - "ai.usage_model": "Modèles disponibles : {list}", - "ai.usage_provider": "Fournisseurs disponibles : {list}", - "ai.vision_unsupported": "Le modèle sélectionné ne supporte pas l'analyse d'images", - "ai.quota_exceeded": "AI: quota dépassé ou paiement requis", - "ai.rewrite": "💬 Réécrire", - "ai.rewrite_done": "AI: texte réécrit", - "ai.rewrite_prompt": "Instruction de réécriture :", - "ai.rewrite_placeholder": "Ex. : rends le ton plus formel et ajoute une conclusion", - "ai.rewrite_title": "Réécrit le texte selon vos instructions", - "ai.select_text": "AI: sélectionnez du texte à traiter", - "ai.shorter": "Raccourcir", - "ai.shorter_hint": "Rend le texte plus concis", - "ai.simplify": "Simplifier", - "ai.simplify_hint": "Simplifie le langage", - "ai.suggestion_capabilities": "Que sais-tu faire ?", - "ai.suggestion_create_file": "Crée un fichier de notes de réunion", - "ai.suggestion_docs_contradictions": "Y a-t-il des contradictions entre ces documents ?", - "ai.suggestion_docs_keypoints": "Quels sont les points clés de ces documents ?", - "ai.suggestion_docs_summary": "Résume les documents ouverts", - "ai.suggestion_search": "Comment rechercher efficacement dans mes notes ?", - "ai.summarize": "Résumer", - "ai.text_processed": "AI: texte traité ✓", - "ai.text_rewritten": "AI: texte réécrit", - "ai.to_canvas": "Convertir en Canvas", - "ai.to_list": "Convertir en liste", - "ai.to_table": "Convertir en tableau", - "ai.tone_hint": "Change le ton du texte", - "ai.tool_call": "Outil : {name}", - "ai.tool_call_failed": "Outil {name} en échec", - "ai.toolbar_edit": "Éditer", - "ai.toolbar_generate": "Générer", - "ai.toolbar_rewrite": "Réécrire", - "ai.toolbar_tone": "Ton", - "ai.toolbar_toolbox": "Toolbox", - "ai.toolbar_translate": "Traduire", - "ai.toolbox": "🧰 Boîte", - "ai.toolbox_hint": "Outils de conversion", - "ai.translate_to": "Traduire en {lang}", - "auth.cannot_delete_self": "Impossible de supprimer son propre compte", - "auth.logged_out": "Déconnecté", - "auth.login_button": "Se connecter", - "auth.login_error": "Identifiants invalides", - "auth.login_title": "Accès sécurisé à vos vaults", - "auth.logout_title": "Déconnexion", - "auth.network_error": "Erreur réseau — vérifiez votre connexion", - "auth.new_password": "Nouveau mot de passe (vide = inchangé)", - "auth.password": "Mot de passe", - "auth.password_min": "Min. 8 caracteres", - "auth.remember_me": "Se souvenir de moi (30 jours)", - "auth.session_expired": "Session expirée, veuillez vous reconnecter", - "auth.user_deleted": "Utilisateur supprimé", - "auth.username": "Nom d'utilisateur", - "auto.0257e77f": "🧰 Boîte ▾", - "auto.033a9ddf": "Modèle par défaut", - "auto.03a6e5b1": "Les opérateurs utilisés s'affichent sous forme\n de chips colorés :", - "auto.13c3ee2c": "Recherche et autocomplétion", - "auto.13eb7a51": "AI: clé API invalide", - "auto.14c75ac6": "Sélectionnez les événements souhaités", - "auto.195a8e44": "Créer répertoire", - "auto.1a54bd69": "Exemple combiné", - "auto.1a8a8118": "Glisser-déposer", - "auto.1abf6661": "Le chemin affiché au-dessus du contenu est\n interactif :", - "auto.1d3330cc": "Pas de retry automatique en cas d'échec", - "auto.1d46301c": "Numéros de ligne", - "auto.1efbbc9a": "Édition avec CodeMirror 6", - "auto.209c5490": "La barre supérieure contient les éléments\n essentiels :", - "auto.272dd29a": "Providers supportés", - "auto.27a2f7c1": "ObsiGate supporte l'ouverture de plusieurs\n fichiers simultanément dans des onglets.", - "auto.28bf6aab": "Sécurité : signature HMAC-SHA256", - "auto.2a5af19b": "Le workflow se déclenche automatiquement à\n chaque événement", - "auto.2bc24d2e": "Toutes les opérations sensibles sont tracées\n dans un journal.", - "auto.2bc66bab": "Création de dossier via l'API", - "auto.337d8626": "Thème clair/sombre", - "auto.37561472": "🛡️ Sécurité", - "auto.396d0dd8": "La barre d'outils AI apparaît sous le titre\n de l'éditeur", - "auto.3be698f6": "Favorisez les opérateurs", - "auto.404c8f1c": "L'autocomplétion vous aide à trouver rapidement\n :", - "auto.41d7c6af": "Répertoire dédié", - "auto.460b8298": "Données", - "auto.4bc1f00a": "Utilisez des opérateurs pour affiner votre\n recherche :", - "auto.4c908ade": "Cliquez sur un vault pour l'ouvrir et voir son\n contenu. Les dossiers affichent un chevron et un\n badge avec le nombre d'éléments.", - "auto.4d281c6c": "AI: texte traité ✓", - "auto.4dfa6a25": "Pas de filtrage par vault — un webhook\n écoute toutes les vaults", - "auto.4fa5d7c2": "Édition rapide", - "auto.559ef1da": "Workflow recommandé", - "auto.598a0ca7": "Événements tracés", - "auto.5a486420": "Supprimer répertoire", - "auto.5d4a2516": "Ouvrez un fichier en mode Édition (bouton ✏️\n Éditer)", - "auto.5d936af6": "Regex générée", - "auto.62c3d50d": "💬 Réécrire", - "auto.678711b5": "Sélectionnez un contexte", - "auto.695d9e47": "Éditeur CodeMirror 6", - "auto.6c166d35": "ObsiGate est votre porte d'entrée web vers\n vos vaults Obsidian. Accédez, naviguez et\n recherchez dans toutes vos notes depuis\n n'importe quel appareil via une interface\n moderne et responsive.", - "auto.72e515fa": "Contrôle d'accès par vault", - "auto.753d30a8": "Ouvrez un fichier pour le voir\n apparaître ici", - "auto.774dbd63": "La palette de commandes permet d'accéder\n rapidement aux fichiers et aux actions sans\n utiliser la souris.", - "auto.79f6e1dd": "Multi-fenêtres", - "auto.7c9cdc3c": "Cochez les événements à écouter", - "auto.7e13c97a": "Ces paramètres s'appliquent immédiatement\n côté client.", - "auto.83a0efdf": "Réindexation", - "auto.9122fd5c": "Configuration avancée", - "auto.98c547ea": "ne déclenchent pas", - "auto.a05514cb": "Création via l'API ou la palette", - "auto.a105a2d9": "Éditer ▾", - "auto.a131dfab": "Éditeur CodeMirror", - "auto.a232672b": "Déploiement", - "auto.a3319169": "📦 À propos", - "auto.aa8ca265": "La vue utilise l'algorithme Barnes-Hut pour\n calculer la disposition en O(n log n),\n garantissant des performances fluides même avec\n des centaines de nœuds.", - "auto.ab5e6155": "ObsiGate crée automatiquement des sauvegardes\n avant chaque modification destructive.", - "auto.aedff644": "Créer fichier markdown", - "auto.b114ed1c": "Ces paramètres sont sauvegardés sur le\n serveur. Certains nécessitent un redémarrage\n ou une réindexation.", - "auto.b419c2c2": "Récepteur Python (Flask)", - "auto.b86ba5ea": "Recherche multi-critères", - "auto.b893650a": "Éditer fichier courant", - "auto.ba768f01": "Événements supportés", - "auto.c089d968": "Épinglez des fichiers pour les retrouver\n ici.", - "auto.c14b5603": "🎨 Thèmes", - "auto.c4922a99": "🤖 Intelligence Artificielle dans l'Éditeur", - "auto.caac40b9": "Choisissez un thème visuel. Chaque thème\n offre un mode sombre et clair.", - "auto.cd7332c8": "Les résultats incluent des facettes pour affiner\n :", - "auto.ce4eb802": "Générer ▾", - "auto.d33601dc": "Surveillance des fichiers en temps réel via\n watchdog. Les modifications sont détectées\n automatiquement et l'index est mis à jour\n sans redémarrage.", - "auto.d4d28717": "Déclencheur", - "auto.e0b8a606": "Définissez les patterns de tags à masquer\n dans la sidebar. Vous pouvez utiliser des\n wildcards pour cibler les tags de template.", - "auto.e61598c1": "Partagez un document pour le voir\n apparaître ici", - "auto.ec7260fa": "Types de fichiers supportés", - "auto.edf89626": "L'éditeur intégré offre :", - "auto.ef8c5f4d": "L'éditeur intégré offre une expérience complète\n d'édition :", - "auto.f346076a": "✏️ Édition avancée", - "auto.f5a8c116": "Événement", - "auto.f8ba6127": "🗂️ Fichiers cachés", - "auto.fc694490": "Suppression via l'API ou l'éditeur", - "backup.delete": "Supprimer", - "backup.diff": "Comparer", - "backup.file_restored": "Fichier restauré avec succès", - "backup.no_backups": "Aucune sauvegarde", - "backup.preview": "Aperçu", - "backup.purge": "Purger", - "backup.restore": "Restaurer", - "backup.restore_failed": "Échec de la restauration", - "backup.select_to_restore": "Sélectionnez un backup à restaurer", - "backup.timestamp_not_found": "Impossible de trouver le timestamp du backup", - "backup.title": "Sauvegardes", - "backup.version": "Version du {date}", - "backups.delete_confirm": "Supprimer ce backup ?", - "backups.empty": "Aucun backup disponible pour ce fichier.", - "backups.hint": "Les backups sont crees automatiquement avant chaque modification.", - "backups.loading": "Chargement des backups...", - "backups.purge_file": "Supprimer TOUS les backups de", - "backups.purge_vault": "Supprimer TOUS les backups du vault", - "backups.restore_confirm": "a la version du backup selectionne ?\nLa version actuelle sera sauvegardee.", - "backups.title": "Backups", - "button.cancel": "Annuler", - "common.actions": "Actions", - "common.all": "Tous", - "common.back": "Retour", - "common.cancel": "Annuler", - "common.close": "Fermer", - "common.confirm": "Confirmer", - "common.copied": "Copié !", - "common.copy": "Copier", - "common.create": "Créer", - "common.delete": "Supprimer", - "common.download": "Télécharger", - "common.edit": "Éditer", - "common.error": "Erreur", - "common.loading": "Chargement...", - "common.move": "Déplacer", - "common.never": "Jamais", - "common.next": "Suivant", - "common.no": "Non", - "common.none": "Aucun", - "common.ok": "OK", - "common.previous": "Précédent", - "common.refresh": "Rafraîchir", - "common.rename": "Renommer", - "common.root": "(racine)", - "common.save": "Enregistrer", - "common.search": "Rechercher", - "common.unknown": "Inconnue", - "common.yes": "Oui", - "collab.peers_title": "{count} personne(s) connectée(s)", - "collab.presence_title": "Collaboration temps réel", - "collab.status_connected": "Collaboration active", - "collab.status_connecting": "Connexion à la collaboration…", - "collab.status_disconnected": "Collaboration interrompue — reconnexion…", - "config.about": "À propos", - "config.about_error": "Erreur de chargement", - "config.about_loading": "Chargement...", - "config.add_webhook": "Ajouter", - "config.ai_deepseek_label": "DeepSeek API Key", - "config.ai_default_model": "Modèle par défaut", - "config.ai_capabilities": "Capacités du modèle", - "config.ai_default_provider": "Fournisseur par défaut", - "config.ai_gemini_label": "Gemini API Key", - "config.ai_keys": "Clés API IA", - "config.ai_keys_desc": "Configurez les clés API pour l'éditeur IA.", - "config.ai_model": "Modèle", - "config.ai_openrouter_label": "OpenRouter API Key", - "config.api_keys_saved": "Clés API sauvegardées", - "config.backups": "Sauvegardes", - "config.backups_desc": "Gérez les sauvegardes automatiques de vos fichiers.", - "config.client_config": "Configuration client", - "config.create_share": "Créer un partage", - "config.debounce_label": "Délai debounce (ms)", - "config.diagnostics": "Diagnostics", - "config.diagnostics_desc": "Informations techniques sur l'état du serveur.", - "config.display_name": "Nom d'affichage", - "config.error_prefix": "Erreur", - "config.error_unknown": "Erreur inconnue", - "config.force_reindex": "Forcer réindexation", - "config.hidden_files": "Fichiers cachés", - "config.hidden_files_desc": "Masquer les fichiers/dossiers commencant par un point dans l'interface (ils restent indexes et cherchables)", - "config.hidden_files_toggle": "Masquer les fichiers/dossiers caches", - "config.hidden_include_label": "Inclure les fichiers cachés", - "config.hidden_whitelist_label": "Whitelist (séparés par des virgules)", - "config.hint_activer_d_sactiver_la_surveillance_automatique_des": "Activer/désactiver la surveillance automatique des fichiers", - "config.hint_annuler_la_recherche_apr_s_ce_d_lai_5000_120000_": "Annuler la recherche après ce délai (5000-120000)", - "config.hint_contenu_index_par_fichier_10k_1m_r_indexation_requ": "Contenu indexé par fichier (10K-1M). Réindexation requise.", - "config.hint_d_lai_avant_ex_cution_de_la_recherche_100_2000_": "Délai avant exécution de la recherche (100-2000)", - "config.hint_d_lai_avant_traitement_des_changements_group_s_0_5": "Délai avant traitement des changements groupés (0.5-10 secondes)", - "config.hint_entre_5_et_100_fichiers_sauvegarde_sur_le_serveur_": "Entre 5 et 100 fichiers (sauvegarde sur le serveur)", - "config.hint_forcer_le_mode_polling_au_lieu_de_inotify_natif_ut": "Forcer le mode polling au lieu de inotify natif (utile si le mode natif ne fonctionne pas)", - "config.hint_intervalle_de_scrutation_en_mode_polling_1_30_seco": "Intervalle de scrutation en mode polling (1-30 secondes)", - "config.hint_multiplicateur_de_pertinence_pour_les_correspondan": "Multiplicateur de pertinence pour les correspondances dans le titre", - "config.hint_nombre_de_r_sultats_affich_s_par_page_10_200_": "Nombre de résultats affichés par page (10-200)", - "config.hint_nombre_max_de_tokens_largis_par_pr_fixe_10_200_": "Nombre max de tokens élargis par préfixe (10-200)", - "config.hint_nombre_maximum_de_versions_backup_conservees_par_f": "Nombre maximum de versions backup conservees par fichier (1-50)", - "config.hint_nombre_minimum_de_caract_res_avant_recherche_1_5_": "Nombre minimum de caractères avant recherche (1-5)", - "config.hint_threads_d_di_s_la_recherche_1_8_": "Threads dédiés à la recherche (1-8)", - "config.just_now": "a l'instant", - "config.lang_hint": "Utilisée par l'autocomplétion et le ghost text.", - "config.lang_label": "Langue préférée", - "config.link_copied": "Lien copié !", - "config.link_created": "Lien créé !", - "config.logout": "Déconnexion", - "config.max_backups": "Max backups par fichier", - "config.max_backups_desc": "Nombre maximum de versions backup conservées par fichier (1-50)", - "config.max_backups_label": "Max backups par fichier", - "config.max_content_hint": "Contenu indexé par fichier (10K-1M). Réindexation requise.", - "config.max_content_label": "Taille max contenu (octets)", - "config.max_content_size": "Taille max contenu (octets)", - "config.max_prefix_expansions": "Expansions préfixe max", - "config.min_query_label": "Longueur min. requête", - "config.min_query_length": "Longueur min. requête", - "config.name_placeholder": "Votre nom", - "config.no_keys": "Aucune clé à sauvegarder", - "config.no_restart": "Redémarrage non requis", - "config.note": "Note :", - "config.open_new_window": "Ouvrir dans nouvelle fenêtre", - "config.prefix_expansions_hint": "Nombre max de tokens élargis par préfixe (10-200)", - "config.prefix_expansions_label": "Expansions préfixe max", - "config.profile": "Profil utilisateur", - "config.profile_desc": "Préférences personnelles pour personnaliser l'expérience ObsiGate.", - "config.project_repo": "dépôt du projet", - "config.recent_history_count": "Nombre de fichiers dans l'historique", - "config.recent_history_count_desc": "Entre 5 et 100 fichiers (sauvegarde sur le serveur)", - "config.reindex": "Réindexer", - "config.reindex_desc": "Reconstruire l'index de recherche pour toutes les vaults.", - "config.reindex_error": "Erreur de réindexation", - "config.reindexing": "Réindexation...", - "config.reset": "Réinitialiser", - "config.restart_required": "Redémarrage requis", - "config.results_per_page": "Résultats par page", - "config.results_per_page_label": "Résultats par page", - "config.save": "Enregistrer", - "config.save_ai_keys": "Enregistrer les clés", - "config.save_backend": "Sauvegarder la configuration serveur", - "config.save_error": "Erreur de sauvegarde", - "config.save_hidden": "Enregistrer", - "config.saved": "✓ Sauvegardé", - "config.saving": "Sauvegarde", - "config.search_timeout": "Timeout recherche (ms)", - "config.search_workers": "Workers de recherche", - "config.search_workers_hint": "Threads dédiés à la recherche (1-8)", - "config.search_workers_label": "Workers de recherche", - "config.section_a-propos": "📦 À propos", - "config.section_about": "À propos", - "config.section_actions-sur-fichiers": "Actions sur fichiers", - "config.section_activation": "Activation", - "config.section_affichage": "Affichage", - "config.section_ai": "Clés API IA", - "config.section_arborescence-des-vaults": "Arborescence des vaults", - "config.section_astuces-et-bonnes-pratiques": "💡 Astuces et bonnes pratiques", - "config.section_audit-log": "Audit log", - "config.section_authentification": "Authentification", - "config.section_autocompletion": "Autocomplétion", - "config.section_backend": "🖥️ Paramètres backend", - "config.section_backup-automatique": "Backup automatique", - "config.section_backups": "Sauvegardes", - "config.section_barre-d-outils-ai": "Barre d'outils AI", - "config.section_breadcrumb-et-repositionnement": "Breadcrumb et repositionnement", - "config.section_cas-d-usage": "Cas d'usage", - "config.section_cas-d-usage-avances": "Cas d'usage avancés", - "config.section_chips-de-filtres-actifs": "Chips de filtres actifs", - "config.section_cles-api-intelligence-artificielle": "🤖 Cles API Intelligence Artificielle", - "config.section_configuration": "Configuration", - "config.section_configuration-avancee": "Configuration avancée", - "config.section_construit-avec": "Construit avec", - "config.section_diag": "Diagnostics", - "config.section_diagnostics": "Diagnostics", - "config.section_editeur-codemirror": "Éditeur CodeMirror", - "config.section_editeur-codemirror-6": "Éditeur CodeMirror 6", - "config.section_edition-avancee": "✏️ Édition avancée", - "config.section_edition-avec-codemirror-6": "Édition avec CodeMirror 6", - "config.section_en-tete": "En-tête", - "config.section_evenements-supportes": "Événements supportés", - "config.section_exemples-concrets": "Exemples concrets", - "config.section_facettes-et-tri": "Facettes et tri", - "config.section_fichiers": "📄 Fichiers", - "config.section_filtrage-de-la-sidebar": "Filtrage de la sidebar", - "config.section_filtrage-de-tags": "Filtrage de tags", - "config.section_filtrage-de-tags-template": "Filtrage de tags template", - "config.section_fonctionnalites": "Fonctionnalités", - "config.section_format-du-payload": "Format du payload", - "config.section_gestion-des-onglets": "📑 Gestion des onglets", - "config.section_hidden": "Fichiers cachés", - "config.section_historique-recent-redemarrage-non-requis": "📋 Historique récent\n Redémarrage non requis", - "config.section_indicateurs-visuels": "Indicateurs visuels", - "config.section_intelligence-artificielle-dans-l-editeur": "🤖 Intelligence Artificielle dans l'Éditeur", - "config.section_interaction": "Interaction", - "config.section_interface": "Interface", - "config.section_interface-utilisateur": "🧭 Interface utilisateur", - "config.section_limitations-actuelles": "Limitations actuelles", - "config.section_mode-commandes": "Mode commandes", - "config.section_mode-fichiers": "Mode fichiers", - "config.section_navigation": "Navigation", - "config.section_navigation-entre-onglets": "Navigation entre onglets", - "config.section_onglets": "Onglets", - "config.section_operateurs-avances": "Opérateurs avancés", - "config.section_optimisations": "Optimisations", - "config.section_ouverture": "Ouverture", - "config.section_ouverture-d-onglets": "Ouverture d'onglets", - "config.section_palette-de-commandes": "⌨️ Palette de commandes", - "config.section_parametres-backend-redemarrage-requis": "Paramètres backend\n Redémarrage requis", - "config.section_parametres-de-recherche": "Paramètres de recherche", - "config.section_partage-et-webhooks": "🔗 Partage et Webhooks", - "config.section_partages-publics": "📤 Partages publics", - "config.section_perf": "Performance", - "config.section_performance": "Performance", - "config.section_personnalisation": "🎨 Personnalisation", - "config.section_profil-utilisateur": "👤 Profil utilisateur", - "config.section_profile": "Profil utilisateur", - "config.section_protection": "Protection", - "config.section_providers-supportes": "Providers supportés", - "config.section_publication-publique": "Publication publique", - "config.section_raccourcis-clavier": "⌨️ Raccourcis clavier", - "config.section_recent": "📜 Historique récent", - "config.section_recherche": "🔍 Recherche", - "config.section_recherche-et-autocompletion": "Recherche et autocomplétion", - "config.section_recherche-simple": "Recherche simple", - "config.section_redimensionnement-de-la-sidebar": "Redimensionnement de la sidebar", - "config.section_sauvegarde-automatique": "Sauvegarde automatique", - "config.section_sauvegardes-et-audits": "💾 Sauvegardes et Audits", - "config.section_search": "Paramètres de recherche", - "config.section_securite": "🛡️ Sécurité", - "config.section_securite-signature-hmac-sha256": "Sécurité : signature HMAC-SHA256", - "config.section_selection-de-vault": "Sélection de vault", - "config.section_server": "Serveur", - "config.section_shares": "Partages publics", - "config.section_sidebar-barre-laterale": "Sidebar (barre latérale)", - "config.section_synchronisation-automatique": "Synchronisation automatique", - "config.section_tag-cloud": "Tag cloud", - "config.section_tags": "🏷️ Tags", - "config.section_tags-inline-vs-frontmatter": "Tags inline vs frontmatter", - "config.section_theme-clair-sombre": "Thème clair/sombre", - "config.section_themes": "🎨 Thèmes", - "config.section_trucs-et-astuces": "Trucs et astuces", - "config.section_types-de-fichiers-supportes": "Types de fichiers supportés", - "config.section_visualisation": "Visualisation", - "config.section_vue-graphe": "🗺️ Vue Graphe", - "config.section_watcher": "Synchronisation automatique", - "config.section_webhooks": "🪝 Webhooks", - "config.section_push": "🔔 Notifications push", - "config.section_plugins": "🧩 Plugins", - "config.section_workflow-recommande": "Workflow recommandé", - "config.section_zone-de-contenu": "Zone de contenu", - "config.server_config": "Configuration serveur", - "config.settings_saved": "✓ Paramètres sauvegardés", - "config.share_revoked": "Partage révoqué", - "config.shares": "Partages publics", - "config.shares_desc": "Gérez les liens de partage public de vos documents.", - "config.shares_empty": "Aucun partage actif", - "config.tag_boost_hint": "Multiplicateur de pertinence pour les correspondances dans les tags", - "config.tag_boost_label": "Boost tags", - "config.tag_filtering_label": "Filtrage de tags", - "config.test": "Tester", - "config.timeout_label": "Timeout recherche (ms)", - "config.title": "Configuration", - "config.title_boost": "Boost titre", - "config.title_boost_hint": "Multiplicateur de pertinence pour les correspondances dans le titre", - "config.title_boost_label": "Boost titre", - "config.url_required": "URL requise", - "config.watcher_debounce_label": "Debounce (s)", - "config.watcher_enabled_label": "Activer la surveillance", - "config.watcher_interval_label": "Intervalle polling (s)", - "config.watcher_polling_label": "Mode polling (fallback)", - "config.webhook_name_placeholder": "Nom", - "config.webhook_url_placeholder": "URL", - "config.webhooks": "Webhooks", - "config.webhooks_desc": "Notifications HTTP vers des services externes lors des changements de fichiers.", - "config.plugins": "Plugins", - "config.plugins_desc": "Gérer les plugins installés pour ce vault.", - "config.workers_label": "Workers de recherche", - "confirm.delete_dir": "Supprimer ce dossier et tout son contenu ?", - "confirm.delete_dir_named": "Supprimer \"{path}\" et TOUT son contenu ?", - "confirm.delete_file": "Supprimer définitivement ce fichier ?", - "confirm.delete_file_named": "Supprimer le fichier \"{path}\" ?", - "confirm.logout": "Voulez-vous vraiment vous déconnecter ?", - "conflict.no_conflicts": "Aucun conflit détecté", - "conflict.resolve_conflict": "Garder version conflit", - "conflict.resolve_local": "Garder version locale", - "conflict.resolved": "Conflit résolu", - "dashboard.all_vaults": "Tous les vaults", - "dashboard.bookmark_add": "Ajouter aux bookmarks", - "dashboard.bookmark_remove": "Retirer des bookmarks", - "dashboard.bookmarks": "Favoris", - "dashboard.conflict_date": "Conflit du ", - "dashboard.conflict_resolved": "Conflit résolu", - "dashboard.conflicts": "Conflits", - "dashboard.conflicts_title": "Conflits de synchronisation", - "dashboard.copy_btn": "Copier", - "dashboard.count_files": "fichier", - "dashboard.count_files_plural": "fichiers", - "dashboard.ctrl_hover_tip": "Survolez un document avec Ctrl pour un aperçu rapide. Cliquez sur Forge dans la barre d'outils pour l'éditeur avancé.", - "dashboard.day_ago": "il y a {n} j", - "dashboard.error_prefix": "Erreur: ", - "dashboard.expires": "Expire le {date}", - "dashboard.hide": "Masquer", - "dashboard.hour_ago": "il y a {n} h", - "dashboard.just_now": "à l'instant", - "dashboard.keep_conflict": "Garder le conflit", - "dashboard.keep_original": "Garder l'original", - "dashboard.load_error": "Erreur de chargement", - "dashboard.loading": "Chargement...", - "dashboard.min_ago": "il y a {n} min", - "dashboard.no_bookmarks": "Aucun favori", - "dashboard.no_conflicts": "Aucun conflit", - "dashboard.no_recent": "Aucun fichier récent", - "dashboard.no_shares": "Aucun document partagé", - "dashboard.open_btn": "Ouvrir", - "dashboard.pin_error": "Erreur lors de l'épinglage", - "dashboard.pin_hint": "Épinglez des fichiers pour les retrouver ici.", - "dashboard.quick_help": "Raccourcis & Astuces", - "dashboard.recent": "Récents", - "dashboard.recent_hint": "Ouvrez un fichier pour le voir apparaître ici", - "dashboard.shared_hint": "Partagez un document pour le voir apparaître ici", - "dashboard.shares": "Partages", - "dashboard.show": "Afficher", - "dashboard.size_bytes": " o", - "dashboard.size_gb": " Go", - "dashboard.size_kb": " Ko", - "dashboard.size_mb": " Mo", - "dashboard.stats": "Statistiques", - "dashboard.stats_files": "Fichiers", - "dashboard.stats_size": "Taille totale", - "dashboard.stats_tags": "Tags uniques", - "dashboard.stats_vaults": "Vaults", - "dashboard.tab_recent": "Récents", - "dashboard.tab_shared": "Partagés", - "dashboard.tab_stats": "Statistiques", - "dashboard.total_files": "Fichiers totaux", - "dashboard.total_size": "Taille totale", - "dashboard.total_tags": "Tags uniques", - "dashboard.vaults_count": "Vaults", - "dashboard.views": "{count} vue(s)", - "dashboard.welcome": "Bienvenue dans ObsiGate", - "dashboard.zero_files": "0 fichiers", - "dragdrop.cross_vault_unsupported": "Le déplacement entre vaults différents n'est pas supporté", - "dragdrop.move_failed": "Échec du déplacement", - "dragdrop.overlay_title": "Déposer des fichiers ou dossiers", - "dragdrop.overlay_vault_zone": "Importer dans le Vault", - "dragdrop.overlay_ai_zone": "Analyser avec l'Assistant IA", - "upload.uploading": "Téléversement de {count} fichier(s)...", - "upload.success": "{count} fichier(s) importé(s) avec succès", - "upload.partial": "{count} fichier(s) importé(s) ({errors} erreurs)", - "upload.error": "Échec de l'importation", - "upload.choose_target_folder": "Destination de l'importation", - "upload.target_vault": "Voute cible", - "upload.vault_root": "/ (Racine de la voute)", - "upload.target_directory": "Sous-répertoire cible", - "upload.filter_folders": "Filtrer ou rechercher un dossier...", - "upload.custom_folder": "Ou saisir un nouveau sous-dossier...", - "upload.import_summary": "Éléments à importer : {files} fichier(s), {dirs} dossier(s)", - "upload.import_button": "Importer", - "editor.cancel": "Annuler", - "editor.close": "Fermer", - "editor.delete_error": "Erreur de suppression", - "editor.edit": "Éditer fichier courant", - "editor.edit_current_desc": "Ouvrir le fichier actif dans l'éditeur", - "editor.find": "Rechercher dans le fichier...", - "editor.find_case": "Respecter la casse", - "editor.find_regex": "Regex", - "editor.find_whole": "Mot entier", - "editor.forge_close_editor": "Fermer l'éditeur / modale", - "editor.forge_help": "Aide de l'éditeur Forge", - "editor.no_results": "Aucun résultat", - "editor.replace": "Remplacer", - "editor.save": "Enregistrer", - "editor.save_error": "Erreur de sauvegarde", - "editor.saved": "Sauvegardé ✓", - "editor.unsaved": "Modifications non sauvegardées", - "error.initialization": "Erreur lors de l'initialisation", - "file.copy_path": "Copier le chemin", - "file.delete": "Supprimer", - "file.graph_view": "Vue graphe", - "file.new_file": "Nouveau fichier", - "file.new_folder": "Nouveau dossier", - "file.properties": "Propriétés", - "file.rename": "Renommer", - "forge.popout": "Ouvrir dans une nouvelle fenêtre", - "forge.popout_label": "pop-out", - "forge.title_placeholder": "Titre...", - "graph.back": "Retour", - "graph.btn_directory": "📁 Dossier", - "graph.btn_full": "🌐 Tout", - "graph.cache_label": "(cache)", - "graph.category": "📂 Catégorie", - "graph.click_to_open": "cliquer pour ouvrir", - "graph.ctrl_hover_preview": "Ctrl+survol = aperçu complet", - "graph.ctrl_hover_preview_short": "Ctrl+survol = aperçu", - "graph.depth": "Profondeur", - "graph.depth_label": "prof={depth}", - "graph.edges_count": "{count} liens", - "graph.error_loading": "Erreur de chargement", - "graph.export_png": "Exporter PNG", - "graph.favorites": "Favoris", - "graph.filter_tag": "Filtrer par tag", - "graph.filter_type": "Filtrer par type", - "graph.focus_mode": "Mode focus", - "graph.forward": "Avancer", - "graph.fullscreen": "Plein écran", - "graph.loading": "Construction du graphe...", - "graph.nodes_count": "{count} nœuds", - "graph.parent": "Parent", - "graph.published": "Publié", - "graph.published_badge": "✅ publié", - "graph.scope_directory": "Dossier", - "graph.scope_full": "Vault complet", - "graph.title": "Vue Graphique — {vault}{path}", - "graph.type_directory": "Dossier", - "graph.type_file": "Fichier", - "graph.type_markdown": "Markdown", - "header.admin_panel": "Administration", - "header.config": "Configuration", - "header.help": "Aide", - "header.install_app": "Installer l'application", - "header.logo": "ObsiGate", - "header.logout": "Déconnexion", - "header.menu_about": "À propos", - "header.menu_about_desc": "Version, crédits & info", - "header.menu_admin": "Administration", - "header.menu_admin_desc": "Gérer les utilisateurs", - "header.menu_api": "API", - "header.menu_api_desc": "Documentation OpenAPI", - "header.menu_config": "Configurations", - "header.menu_config_desc": "Paramètres de l'application", - "header.menu_help": "Guide d'utilisation", - "header.menu_help_desc": "Ouvrir l'aide", - "header.menu_logout": "Déconnexion", - "header.menu_logout_desc": "Quitter la session", - "header.menu_profile": "Profil", - "header.menu_profile_desc": "Langue & préférences", - "header.menu_theme": "Thème", - "header.menu_theme_light": "Clair", - "header.menu_toggle": "Menu", - "header.profile": "Profil", - "header.quick_help": "Raccourcis & Astuces", - "header.refresh": "Rafraîchir", - "header.search_placeholder": "Rechercher dans toutes les vaults...", - "header.sidebar_toggle": "Afficher/Masquer la sidebar", - "header.sync_status": "Synchronisation", - "help.00b9572b": ":\n Résultats classés par pertinence TF-IDF", - "help.04df1506": ":\n Recherche globale avec autocomplétion", - "help.065f53ee": ":\n Auto-save silencieux après 2s d'inactivité,\n flash vert de confirmation", - "help.085ec31f": ":\n Sélection rapide en haut de l'onglet Vaults", - "help.096367af": "Indicateurs visuels", - "help.170a6982": ": Affichage\n horizontal avec le nom du fichier et son\n icône", - "help.229fd3e2": "Notification Discord", - "help.2507242f": "🏷️ Tags", - "help.29afa01d": "🪝 Webhooks", - "help.2a2e5b0f": "⌨️ Raccourcis clavier", - "help.2a92203f": "Trucs et astuces", - "help.2c03a7ba": "Tags inline vs frontmatter", - "help.2dad2bfd": "Sauvegarde automatique", - "help.381abec7": "Limitations actuelles", - "help.3cf370b1": "Mode commandes", - "help.40dd7e38": "Tester avec curl", - "help.4de7e318": ": Les 50\n dernières recherches (localStorage)", - "help.550b0240": "Exemples concrets", - "help.5ab8c78d": ":\n Restent ouverts jusqu'à fermeture manuelle", - "help.5d0fbb81": ":\n Workers, boosts TF-IDF, expansions préfixe", - "help.5f87ea79": "Tag cloud", - "help.61ee5a22": "Interaction", - "help.62308f96": "⌨️ Palette de commandes", - "help.62549eca": "💾 Sauvegardes et Audits", - "help.63f024d4": "Filtrage de tags template", - "help.686f8313": "💡 Astuces et bonnes pratiques", - "help.6a5ddef2": ": Les tags\n s'adaptent au vault sélectionné", - "help.6ae5342c": ": Stats index,\n mémoire, moteur de recherche", - "help.6b88a375": ":\n Délai debounce, résultats par page, timeout", - "help.6b8fc728": ": ↑/↓\n pour naviguer, Enter pour sélectionner", - "help.6d547397": "Mode fichiers", - "help.6e940dac": ": Cliquez sur\n l'icône sidebar dans le header", - "help.733f0559": "🗺️ Navigation", - "help.77f4f06e": "Format du payload", - "help.7bcbb2e3": "Redimensionnement de la sidebar", - "help.7db70e27": ": Copier,\n Source, Télécharger, Éditer, Ouvrir dans\n nouvelle fenêtre", - "help.83f1d9ca": "Protection", - "help.86e3825d": "🎨 Personnalisation", - "help.8717768b": ":\n Métadonnées du nœud (tags, liens, chemin)", - "help.89bd3c4c": ": N'affiche\n que les nœuds avec un tag spécifique", - "help.8c5341e0": "📑 Gestion des onglets", - "help.8c65b2f2": "🔗 Partage et Webhooks", - "help.8caed987": "Affichage", - "help.9c7a0a8d": "🗺️ Vue Graphe", - "help.9edeaa11": ":\n Contrôle la profondeur d'exploration (0-3)", - "help.9f78b3ec": ":\n Navigation facilitée dans les fichiers longs", - "help.a4a4e21b": ": Bouton \"×\" pour\n réinitialiser le filtre", - "help.a579cf4d": ": Aperçu du\n contenu de la note sans naviguer", - "help.a648c49e": "Facettes et tri", - "help.ab2c4150": ": Fichiers (carrés)\n et dossiers (cercles) avec icônes", - "help.about": "À propos", - "help.access": "Accès", - "help.action_buttons": "Boutons d'action", - "help.actions_available": "Boutons disponibles au-dessus du contenu :", - "help.actions_detail": "Boutons disponibles au-dessus du contenu :", - "help.activation": "Activation", - "help.active_filter_chips": "Chips de filtres actifs", - "help.active_tab": "Onglet actif", - "help.add_remove": "Ajout/Suppression", - "help.adf30d78": "🔍 Recherche", - "help.advanced_operators": "Opérateurs avancés", - "help.advanced_use_cases": "Cas d'usage avancés", - "help.ai_completes": "Complète", - "help.ai_features": "Édition, ton, traduction, génération et outils via AI.", - "help.ai_flash_green": "flashe en vert", - "help.ai_tone_casual": "Ton décontracté", - "help.all_vaults": "Tous les vaults", - "help.atomic_writes": "Atomic writes", - "help.audit_log": "Audit log", - "help.auto_save": "Sauvegarde automatique", - "help.auto_scroll": "Auto-scroll", - "help.autocomplete": "Autocomplétion", - "help.b6619ac9": "Ouverture", - "help.backlinks_panel": "Panneau Backlinks", - "help.backup_auto": "Backup automatique", - "help.before_write": "Avant écriture", - "help.breadcrumb": "Breadcrumb", - "help.breadcrumb_clickable": "Breadcrumb cliquable", - "help.breadcrumb_reposition": "Breadcrumb et repositionnement", - "help.c017944b": "📄 Fichiers", - "help.c48fb18a": "Authentification", - "help.c8532869": ":\n Complétion, réécriture, traduction (voir\n section", - "help.case_sensitive": "Case-sensitive", - "help.cf8615b1": "Visualisation", - "help.ci_cd": "Automatisation CI/CD", - "help.clear": "Effacer", - "help.clear_search": "Effacer", - "help.click_segment": "Cliquez sur un segment", - "help.click_tab": "Clic sur un onglet", - "help.click_vault": "Cliquez sur le vault", - "help.clickable": "Cliquable", - "help.close_help": "Fermer l'aide", - "help.close_tab_x": "Bouton ✕", - "help.code_preview": "Code + Prévisualisation", - "help.command_palette": "Palette de commande", - "help.configuration": "Configuration", - "help.content_area": "Zone de contenu", - "help.content_shows": "La zone centrale affiche :", - "help.context_actions": "Actions sur fichiers", - "help.context_menu": "Menu contextuel (clic droit)", - "help.copy_path": "Copier le chemin", - "help.d186a19e": ":\n L'onglet \"Récent\" dans la sidebar liste vos\n derniers fichiers", - "help.d1ea1dc6": "n8n / Make (no-code)", - "help.d5c977ac": ": Les blocs de\n code s'adaptent au thème", - "help.dark": "Sombre", - "help.dashboard": "Dashboard statistiques", - "help.delete": "Supprimer", - "help.desc_00b9572b": ":\n Résultats classés par pertinence TF-IDF", - "help.desc_04493800": ": 64\n caractères hexadécimaux, impossible à\n deviner", - "help.desc_065f53ee": ":\n Auto-save silencieux après 2s d'inactivité,\n flash vert de confirmation", - "help.desc_071da87a": "Lecture seule : La vue\n publique n'affiche que le contenu sans\n édition", - "help.desc_0739c6a9": "Images : Support complet\n des syntaxes Obsidian", - "help.desc_085ec31f": ":\n Sélection rapide en haut de l'onglet Vaults", - "help.desc_0f9a1e5b": "Utilisez le filtrage sidebar\n : Plus rapide que la recherche globale pour\n trouver un fichier", - "help.desc_11cf9e8a": "Éditer ▾ — Menu de\n modification du texte sélectionné :\n \n 🪄\n Improve writing :\n Améliore la qualité, la clarté et le\n flux du texte", - "help.desc_13d206d4": "📊\n Convert to table :\n Transforme en tableau Markdown", - "help.desc_13d90039": "ObsiGate permet de partager des documents via un\n lien public temporaire.", - "help.desc_1577912b": "Rate limiting : 10\n tentatives / 15 min par IP + verrouillage\n compte", - "help.desc_170a6982": ": Affichage\n horizontal avec le nom du fichier et son\n icône", - "help.desc_188bc423": "Pour plus d'informations, consultez le\n dépôt du projet.", - "help.desc_19cf5730": ": Rotation\n automatique à 10 Mo", - "help.desc_19cfa369": "L'éditeur sauvegarde automatiquement après 2\n secondes d'inactivité. Le bouton de sauvegarde\n flashe en vert brièvement pour\n confirmer.", - "help.desc_1a04ae18": "Masquez la sidebar : Plus\n d'espace pour le contenu", - "help.desc_1ba39cc4": ":\n Déclencher un build quand une note de\n procédure est mise à jour", - "help.desc_1c130d89": "— Traduit le\n texte sélectionné vers une autre langue :", - "help.desc_1f11691c": "Atomic writes : Écriture\n via fichier temporaire + renommage atomique", - "help.desc_2349271d": "Automatisation CI/CD :\n Déclencher un build quand une note de\n procédure est mise à jour", - "help.desc_26f81732": "Édition rapide : Ouvrez\n l'éditeur, modifiez, sauvegardez", - "help.desc_287be69c": ":\n Réduisez les sections Vaults/Tags selon vos\n besoins", - "help.desc_2c220763": "Gestion des liens : Liste\n et révocation dans les Configurations", - "help.desc_2f2c16b5": ": Publier un\n article de blog quand un fichier est marqué", - "help.desc_31e7253b": ": Chaque backup\n est horodaté", - "help.desc_32e3d66d": "En cas d'erreur de clé API :\n AI: clé API invalide", - "help.desc_39979e71": ":\n Choisissez un vault pour réduire le bruit", - "help.desc_39e97b2f": "Note : l'événement\n file_modified est réservé pour\n usage futur. Les modifications de contenu\n via l'éditeur ne déclenchent pas encore de\n webhook.", - "help.desc_3ace259e": "— Complétion inline\n (", - "help.desc_3c4711b8": "Événements tracés :\n Écritures, suppressions, changements de\n configuration", - "help.desc_3d4e9189": "📋\n Simplify language :\n Simplifie le langage, évite le\n jargon", - "help.desc_3da1896a": "Les webhooks peuvent être activés/désactivés,\n modifiés ou supprimés à tout moment. Le\n last_fired_at indique la dernière\n exécution.", - "help.desc_3db2812f": "X-ObsiGate-Signature: sha256=9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08\n \n Pour vérifier côté récepteur : calculez\n HMAC-SHA256(corps_brut, secret) et\n comparez. Le header\n X-ObsiGate-Event contient aussi le\n type d'événement pour un routage rapide.", - "help.desc_40c92863": "Exploration par tags :\n Cliquez sur un tag dans une note pour voir\n toutes les notes similaires", - "help.desc_42a81347": ": Dernière\n modification", - "help.desc_443b76b5": "Wikilinks : Naviguez entre\n notes comme dans Obsidian", - "help.desc_47e1e10f": "Générer ▾ — Génère du\n contenu à partir de la sélection :\n \n ℹ️ Explain this :\n Explique le texte sélectionné de\n façon claire", - "help.desc_4de7e318": ": Les 50\n dernières recherches (localStorage)", - "help.desc_50a33a05": "⚙️\n Generate frontmatter\n : Génère un bloc YAML frontmatter", - "help.desc_5374685a": "Mobile-friendly : Utilisez\n le bouton hamburger sur mobile", - "help.desc_5396ed9e": "Profitez de l'historique :\n Réutilisez vos recherches fréquentes", - "help.desc_53bfaeca": ": Navigation par\n pages de 50 résultats", - "help.desc_5524e921": "Ton ▾ — Change le ton du\n texte :\n \n \n 💼 Professional :\n Ton formel et professionnel", - "help.desc_555e0305": "Pour changer de provider par défaut :\n AI_DEFAULT_PROVIDER=openrouter", - "help.desc_56760d7f": "Chaque webhook reçoit un POST avec\n Content-Type: application/json :", - "help.desc_58d2326f": "Navigation visuelle : Le\n breadcrumb repositionne automatiquement la\n sidebar", - "help.desc_599f3242": ": Logger\n toutes les modifications dans une base de\n données externe", - "help.desc_5a53de53": "📏 Make shorter :\n Rend le texte plus concis tout en\n préservant l'information", - "help.desc_5ab8c78d": ":\n Restent ouverts jusqu'à fermeture manuelle", - "help.desc_5d0fbb81": ":\n Workers, boosts TF-IDF, expansions préfixe", - "help.desc_5e9a7fd9": ": Liste\n et révocation dans les Configurations", - "help.desc_5fc28b7d": ": Créé\n automatiquement au premier démarrage", - "help.desc_625112fd": "Sélectionnez un contexte :\n Choisissez un vault pour réduire le bruit", - "help.desc_660051b0": "Audit externe : Logger\n toutes les modifications dans une base de\n données externe", - "help.desc_664b1d09": "Breadcrumb cliquable :\n Repositionnez rapidement la sidebar", - "help.desc_68c2b170": "Rotation : Rotation\n automatique à 10 Mo", - "help.desc_6902f20d": "Favorisez les opérateurs :\n tag: et\n vault: accélèrent la recherche", - "help.desc_698d92ec": "Gestion de l'espace :\n Réduisez les sections Vaults/Tags selon vos\n besoins", - "help.desc_6a5ddef2": ": Les tags\n s'adaptent au vault sélectionné", - "help.desc_6a80241e": ": La largeur\n est sauvegardée", - "help.desc_6ae5342c": ": Stats index,\n mémoire, moteur de recherche", - "help.desc_6b649b1e": ": Surligné en\n couleur d'accentuation", - "help.desc_6b88a375": ":\n Délai debounce, résultats par page, timeout", - "help.desc_6b8fc728": ": ↑/↓\n pour naviguer, Enter pour sélectionner", - "help.desc_6bc48f59": "Créez un\n Webhook Trigger dans n8n ou\n Make", - "help.desc_6caffeed": ": Cliquez pour\n filtrer les résultats", - "help.desc_6d68fbc9": "from flask import Flask, request\\nimport hmac, hashlib\\n\\napp = Flask(__name__)\\nWEBHOOK_SECRET = \"mon-secret\" # même que dans ObsiGate\\n\\n@app.route(\"/webhook\", methods=[\"POST\"])\\ndef webhook():\\n # Vérifier la signature\\n signature = request.headers.get(\"X-ObsiGate-Signature\", \"\")\\n body = request.get_data()\\n expected = \"sha256=\" + hmac.new(\\n WEBHOOK_SECRET.encode(), body, hashlib.sha256\\n ).hexdigest()\\n if not hmac.compare_digest(signature, expected):\\n return \"Invalid signature\", 403\\n\\n payload = request.get_json()\\n print(f\"Événement: {payload['event']}\")\\n print(f\"Fichier: {payload['data']['vault']}/{payload['data']['path']}\")\\n return \"OK\", 200\\n\\napp.run(port=5000)\n\n n8n / Make (no-code)\n \n \n Créez un\n Webhook Trigger dans n8n ou\n Make\n \n \n Copiez l'URL générée (ex:\n https://n8n.monserveur.com/webhook/abc123)\n \n \n Dans ObsiGate, ajoutez un webhook pointant\n vers cette URL\n \n Sélectionnez les événements souhaités\n \n Le workflow se déclenche automatiquement à\n chaque événement\n \n \n\n Notification Discord\n \n Utilisez un webhook relais (n8n, Make, ou un\n script) pour transformer le payload ObsiGate en\n message Discord :", - "help.desc_6ebebdfd": ": Chaque type\n d'opérateur a sa couleur", - "help.desc_6f7c5889": ": Alerter un\n canal Slack/Discord quand un document est\n créé", - "help.desc_71eeb16a": ":\n Réutilisez vos recherches fréquentes", - "help.desc_723ed8db": "Non-root Docker : Conteneur\n tourne avec UID 1000", - "help.desc_752789ab": ": Écriture\n via fichier temporaire + renommage atomique", - "help.desc_759926ee": "💬 Casual : Ton\n décontracté et conversationnel", - "help.desc_7671e56a": "Avant écriture : Sauvegarde\n du contenu original dans\n .obsigate-backup/", - "help.desc_7708f226": "JWT + Argon2id : Tokens JWT\n avec mots de passe hachés Argon2id", - "help.desc_7819b56f": "Copiez l'URL générée (ex:\n https://n8n.monserveur.com/webhook/abc123)", - "help.desc_7ab5be50": "Traduire ▾ — Traduit le\n texte sélectionné vers une autre langue :\n \n 🇬🇧 English · 🇨🇳 Chinese · 🇯🇵\n Japanese · 🇩🇪 German · 🇫🇷 French ·\n 🇪🇸 Spanish", - "help.desc_7b45490b": "Dans ObsiGate, ajoutez un webhook pointant\n vers cette URL", - "help.desc_7e86626c": "Bouton Partager : Dans les\n actions du fichier, génère un lien unique", - "help.desc_7f1d0512": "Path traversal : Validation\n des chemins contre les attaques\n ../", - "help.desc_7ff2fa21": "Pendant une requête AI, un toast\n ⏳ AI: traitement en cours...\n s'affiche", - "help.desc_803161e5": "La barre d'outils contient les boutons suivants\n :", - "help.desc_828db5da": ": Les\n deux types sont combinés", - "help.desc_858681a1": ":\n Durée de vie en heures", - "help.desc_85effb89": "Timeout de 5 secondes par\n requête — les webhooks sont \"fire and\n forget\" (pas de retry)", - "help.desc_8717768b": ":\n Métadonnées du nœud (tags, liens, chemin)", - "help.desc_87b348c3": "Recherche multi-critères :\n tag:docker tag:linux vault:IT\n nginx", - "help.desc_89a8f5de": "Déploiement : Publier un\n article de blog quand un fichier est marquépublish: true", - "help.desc_89bd3c4c": ": N'affiche\n que les nœuds avec un tag spécifique", - "help.desc_8f0bffe3": ": Tokens JWT\n avec mots de passe hachés Argon2id", - "help.desc_9186a3a3": "Explorez l'arborescence :\n Naviguez dans les dossiers", - "help.desc_93902d18": "Utilisez les tags : Filtrez\n par tags pour affiner", - "help.desc_9846fc07": ": Masque\n JWT, clés API, tokens GitHub dans les\n aperçus", - "help.desc_985d759b": "Token unique : 64\n caractères hexadécimaux, impossible à\n deviner", - "help.desc_991307d6": "— Génère du\n contenu à partir de la sélection :", - "help.desc_995a711f": ": Ouvre l'éditeur\n CodeMirror", - "help.desc_99c6f0ec": "Export : Téléchargez des\n fichiers pour backup ou partage", - "help.desc_9cb5974c": ": Ouvrez\n plusieurs notes dans des onglets séparés", - "help.desc_9d0e39d0": "Headers CSP :\n Content-Security-Policy, X-Frame-Options,\n XSS-Protection", - "help.desc_9edeaa11": ":\n Contrôle la profondeur d'exploration (0-3)", - "help.desc_9f321d1e": ":\n Écritures, suppressions, changements de\n configuration", - "help.desc_9f78b3ec": ":\n Navigation facilitée dans les fichiers longs", - "help.desc_9fec424d": ": Score\n TF-IDF (défaut)", - "help.desc_a0ec890a": "— Menu de\n modification du texte sélectionné :", - "help.desc_a13f7f2c": "Une fois terminé,\n AI: texte traité ✓ confirme\n le succès", - "help.desc_a4a4e21b": ": Bouton \"×\" pour\n réinitialiser le filtre", - "help.desc_a52fc3b1": ": Télécharge le\n fichier", - "help.desc_a579cf4d": ": Aperçu du\n contenu de la note sans naviguer", - "help.desc_a601f22e": "Allez dans ⚙️ Configurations → onglet\n Webhooks", - "help.desc_a69804cd": "Répertoire dédié :\n .obsigate-backup/ dans le\n répertoire de la vault", - "help.desc_a6cb3b26": "🔤\n Fix spelling & grammar\n : Corrige les fautes d'orthographe\n et de grammaire", - "help.desc_a974f7a6": "Journal : Fichier\n data/audit.log au format JSON\n lines", - "help.desc_a9c2c520": "Les webhooks permettent à ObsiGate de\n notifier automatiquement des services\n externes\n lorsque des fichiers ou dossiers sont modifiés.\n Chaque événement déclenche un\n POST HTTP vers l'URL de votre\n choix, avec un payload JSON détaillé.", - "help.desc_a9db82b5": ": Centre la vue\n sur un nœud spécifique", - "help.desc_ab2c4150": ": Fichiers (carrés)\n et dossiers (cercles) avec icônes", - "help.desc_action_buttons": "Copier, Source, Télécharger, Éditer, Ouvrir dans nouvelle fenêtre", - "help.desc_adv_syntax": ":\n Python, JS, HTML, CSS, Java, C++, Rust, Go\n et bien d'autres", - "help.desc_ae213f54": ":\n Combinez opérateurs et texte libre", - "help.desc_aec0ad2c": "💬 Réécrire — Réécrit le\n texte selon vos instructions personnalisées.\n Une boîte de dialogue vous demande votre\n instruction.", - "help.desc_all_tags": ": Extraits des frontmatters YAML et inline (#tag)", - "help.desc_all_vaults": ": Vue globale de tous vos contenus", - "help.desc_autoscroll": ": La sidebar se positionne automatiquement", - "help.desc_b54c21ef": "Contrôle d'accès par vault\n : Chaque utilisateur voit uniquement ses\n vaults", - "help.desc_b5f89b3b": "ObsiGate intègre un assistant IA directement\n dans l'éditeur de texte. Pour l'activer,\n configurez au moins un provider AI dans le\n fichier .env (DeepSeek, OpenRouter\n ou Gemini).", - "help.desc_b6169f2e": "Les webhooks se gèrent dans le modal\n Configurations (⚙️ menu\n Options), section Webhooks. Réservé aux\n administrateurs.", - "help.desc_b9c94994": ": Aperçu de\n la regex appliquée", - "help.desc_ba4578ae": "Redémarrez le conteneur :\n docker compose down && docker compose\n up -d --build", - "help.desc_bc08f215": "Secret redactor : Masque\n JWT, clés API, tokens GitHub dans les\n aperçus", - "help.desc_beed5686": ": Cliquez sur\n \"Thème\" dans le menu", - "help.desc_breadcrumb": "Chemin du fichier (cliquable pour repositionner la sidebar)", - "help.desc_c1f72521": "{\n \"event\": \"file_created\",\n \"timestamp\": \"2026-06-03T14:30:00.123456+00:00\",\n \"data\": {\n \"vault\": \"IT\",\n \"path\": \"procedures/deploiement.md\"\n }\n}\n\n Sécurité : signature HMAC-SHA256\n \n Si vous configurez un secret, chaque requête\n inclut un header\n X-ObsiGate-Signature :", - "help.desc_c63f02cc": "— Réécrit le\n texte selon vos instructions personnalisées.\n Une boîte de dialogue vous demande votre\n instruction.", - "help.desc_c8532869": ":\n Complétion, réécriture, traduction (voir\n section", - "help.desc_c992f2e5": "Remplissez :\n Nom (descriptif),\n URL (endpoint cible),\n Secret (optionnel)", - "help.desc_case_sensitive": ": Bouton \"Aa\" pour respecter la casse", - "help.desc_cb6f0bfd": ": Ouvrez\n l'éditeur, modifiez, sauvegardez", - "help.desc_cc8e35ba": "Notifications : Alerter un\n canal Slack/Discord quand un document est\n créé", - "help.desc_cdf7bb46": "Recherchez intelligemment :\n Combinez opérateurs et texte libre", - "help.desc_cf5ccd40": ": Compteurs\n par tag dans les résultats", - "help.desc_cfe362a7": "Export PDF : Téléchargement\n du document partagé en PDF via/s/{token}/pdf", - "help.desc_check_btn": ": Sauvegarde\n manuelle", - "help.desc_chip_remove": ": Cliquez sur \"×\" pour retirer un filtre", - "help.desc_chip_view": ": Voir d'un coup d'œil les filtres actifs", - "help.desc_click_segment": ": Navigation vers ce dossier", - "help.desc_click_tab": ": Active l'onglet", - "help.desc_click_vault": ": Focus sur le vault dans la sidebar", - "help.desc_close_btn": ": Ferme l'onglet (sauf s'il est seul)", - "help.desc_cm_autocomplete": ":\n Suggestions contextuelles", - "help.desc_cm_lines": ":\n Navigation facile", - "help.desc_cm_search": ": Ctrl+F pour\n chercher dans le fichier", - "help.desc_cm_syntax": ":\n Support de nombreux langages", - "help.desc_combined": "recherche \"serveur web\" dans les fichiers\n Markdown du vault IT avec le tag linux.", - "help.desc_context_menu": ": Clic\n droit sur un vault ou dossier → Vue\n Graphique", - "help.desc_copy_btn": ": Copie le contenu\n source dans le presse-papiers", - "help.desc_ctrl_tab": ": Onglet suivant", - "help.desc_ctrl_w": ": Fermer l'onglet actif", - "help.desc_d186a19e": ":\n L'onglet \"Récent\" dans la sidebar liste vos\n derniers fichiers", - "help.desc_d3a71d97": "file_modified n'est pas encore\n dispatché (réservé pour version future)", - "help.desc_d5c977ac": ": Les blocs de\n code s'adaptent au thème", - "help.desc_d646b709": "Compte admin : Créé\n automatiquement au premier démarrage", - "help.desc_d66e911c": ": Dans les\n actions du fichier, génère un lien unique", - "help.desc_d915c72b": "Synchronisation : Copier\n les nouveaux fichiers vers un autre système\n (SharePoint, Google Drive)", - "help.desc_d9cdaa89": ": Copier\n les nouveaux fichiers vers un autre système\n (SharePoint, Google Drive)", - "help.desc_d9e8ab0b": "🧰 Boîte ▾ — Outils de\n conversion :\n \n \n 📋\n Convert to list :\n Transforme le texte en liste\n Markdown", - "help.desc_dc4d7186": "Les modifications détectées par le watcher\n filesystem (watchdog)\n ne déclenchent pas de\n webhooks — seules les opérations via l'API\n REST sont prises en compte", - "help.desc_delete_btn_new": ": Bouton\n corbeille pour supprimer", - "help.desc_double_click": ": Ouvre le fichier dans un onglet persistant", - "help.desc_e0525213": "✦ AI — Complétion inline\n (Ctrl+J). Complète\n automatiquement le texte là où se trouve le\n curseur.", - "help.desc_e23c94dd": ": Dans la\n barre d'outils (le cas échéant)", - "help.desc_e36f3eaa": "📐 Make longer :\n Ajoute des détails, exemples ou\n explications", - "help.desc_e3fce7a3": ": Ouvre le\n fichier dans un onglet temporaire (aperçu,\n italique)", - "help.desc_e47d2328": ": La vue\n publique n'affiche que le contenu sans\n édition", - "help.desc_e5246734": ": Onglet\n précédent", - "help.desc_e5b67e3d": ": Votre choix\n est sauvegardé en localStorage", - "help.desc_e5cf90b2": "📝 Summarize :\n Résume le texte de façon concise", - "help.desc_e6129268": "Confort de lecture :\n Ajustez la largeur de la sidebar", - "help.desc_e7e3157a": "Timestamp : Chaque backup\n est horodaté", - "help.desc_e93517a5": ": Téléchargement\n du document partagé en PDF via", - "help.desc_ec5f7a26": "Expiration configurable :\n Durée de vie en heures", - "help.desc_ecf302ae": "Multi-fenêtres : Ouvrez\n plusieurs notes dans des onglets séparés", - "help.desc_edges": ": Wikilinks sortants\n (bleu) et backlinks entrants (vert)", - "help.desc_eebf177f": "ObsiGate v1.7.0 - Porte\n d'entrée web pour vos vaults Obsidian", - "help.desc_ef1531ce": ": Un\n onglet temporaire (italique) est remplacé\n par le prochain clic", - "help.desc_ef3f8158": ": Gérez\n vos patterns de filtrage", - "help.desc_examples": ":\n ext:sh recherche dans les scripts\n bash, ext:py dans les scripts\n Python, ext:md dans les fichiers\n Markdown.\n

", - "help.desc_expand": ": Cliquez sur un dossier", - "help.desc_export_png": ": Sauvegardez le\n graphe en image", - "help.desc_f0adf67a": ": Molette pour\n zoomer, cliquer-glisser pour se déplacer", - "help.desc_f2d4e369": "✏️\n Continue writing :\n Continue l'écriture à partir du\n texte", - "help.desc_f53badcd": "Ajoutez votre clé API dans\n .env :\n DEEPSEEK_API_KEY=sk-...", - "help.desc_f58da6e1": "Cliquez Ajouter", - "help.desc_f9083ce5": ": Téléchargez des\n fichiers pour backup ou partage", - "help.desc_f952db17": "Refresh tokens : Cookies\n HttpOnly avec rotation automatique", - "help.desc_fa126609": "🔷\n Convert to canvas :\n Convertit en diagramme Mermaid.js", - "help.desc_facet_vaults": ": Compteurs par vault", - "help.desc_fc9391f3": "# Exemple avec curl + jq dans un script bash\nWEBHOOK_URL=\"https://discord.com/api/webhooks/...\"\nOBSIGATE_SECRET=\"mon-secret\"\n\n# Lire le payload depuis stdin\nread -r payload\nevent=$(echo \"$payload\" | jq -r '.event')\npath=$(echo \"$payload\" | jq -r '.data.path')\n\ncurl -H \"Content-Type: application/json\" -d \"{\n \\\"content\\\": \\\"📝 **$event** — $path\\\"\n}\" \"$WEBHOOK_URL\"\n\n Tester avec curl\n # Simuler ce qu'ObsiGate envoie (pour tester votre endpoint)\ncurl -X POST https://votre-serveur.com/webhook \\\n -H \"Content-Type: application/json\" \\\n -H \"X-ObsiGate-Event: file_created\" \\\n -H \"X-ObsiGate-Signature: sha256=$(echo -n '{\"event\":\"file_created\",...}' | openssl dgst -sha256 -hmac 'mon-secret' | cut -d' ' -f2)\" \\\n -d '{\"event\":\"file_created\",\"timestamp\":\"2026-06-03T14:30:00Z\",\"data\":{\"vault\":\"IT\",\"path\":\"notes/test.md\"}}'\n\n Limitations actuelles\n \n \n Timeout de 5 secondes par\n requête — les webhooks sont \"fire and\n forget\" (pas de retry)\n \n \n Les modifications détectées par le watcher\n filesystem (watchdog)\n ne déclenchent pas de\n webhooks — seules les opérations via l'API\n REST sont prises en compte\n \n \n file_modified n'est pas encore\n dispatché (réservé pour version future)\n \n Pas de retry automatique en cas d'échec\n \n Pas de filtrage par vault — un webhook\n écoute toutes les vaults\n \n \n \n \n 💾 Sauvegardes et Audits\n\n Backup automatique\n \n ObsiGate crée automatiquement des sauvegardes\n avant chaque modification destructive.", - "help.desc_fdeaf803": ": Chaque type de\n fichier a son icône (markdown, code, etc.)", - "help.desc_file_suggest": ": Suggestions de titres de fichiers", - "help.desc_filter_type": ":\n Inclut/exclut fichiers, dossiers, markdown,\n autres", - "help.desc_filter_usage": "Utilisez la barre de filtrage en haut de la sidebar pour rechercher rapidement :", - "help.desc_filtering": "Barre de recherche pour filtrer fichiers/tags", - "help.desc_find_in_page": ": Ctrl+F pour\n chercher dans le fichier (casse, regex, mot\n entier)", - "help.desc_frontmatter": ": tags: [docker, linux] ou tags: docker, linux", - "help.desc_fullscreen": ": Bouton pour\n agrandir la vue", - "help.desc_graph_intro": "La vue graphe offre une visualisation\n interactive des connexions entre vos notes via\n les wikilinks.", - "help.desc_graph_nav": ":\n Historique de navigation entre les nœuds", - "help.desc_grouped_results": ": Affichage par vault avec chemins complets", - "help.desc_hamburger": "(mobile) : Affiche/masque la sidebar", - "help.desc_hide": "Cliquez sur l'icône sidebar dans le header", - "help.desc_images": ": Support\n de ![[image.png]]", - "help.desc_inline_tags": ": #docker dans le contenu markdown", - "help.desc_instant_filter": ": Tapez pour filtrer fichiers et dossiers", - "help.desc_logo": "Retour à l'accueil", - "help.desc_markdown_all": ":\n Rendu complet du markdown", - "help.desc_md_render": "Les fichiers markdown sont rendus avec :", - "help.desc_menu_header": ": Dropdown \"Vault\" dans le menu Options", - "help.desc_menu_options": ": Accès aux\n paramètres, thème, aide", - "help.desc_op_ext": ": Filtrer par type de fichier", - "help.desc_op_path": ": Filtrer par chemin", - "help.desc_op_phrase": ": Recherche de phrase entre guillemets", - "help.desc_op_tag": ": Filtrer par tag", - "help.desc_op_title": ": Chercher dans les titres uniquement", - "help.desc_op_vault": ": Rechercher dans un vault spécifique", - "help.desc_open_file": ": Cliquez sur le nom du fichier", - "help.desc_open_new": ": Ouvre le fichier dans un nouvel onglet", - "help.desc_patterns": ": Ex: #<% ... %> ou #{{ ... }}", - "help.desc_quick_select": "Dropdown pour changer de vault", - "help.desc_rendered_content": "Markdown avec wikilinks et images", - "help.desc_resize": "Glissez le bord droit pour ajuster la largeur", - "help.desc_save_btn_new": ": Bouton ✓ pour\n enregistrer", - "help.desc_search_all": ": Titre, contenu, tags, chemins", - "help.desc_search_bar": "Recherche globale avec autocomplétion", - "help.desc_search_intro": "

\n Tapez dans la barre de recherche en haut pour\n lancer une recherche fulltext :\n

", - "help.desc_sidebar_toggle": "Masque la sidebar pour plus d'espace", - "help.desc_snippets": ": Extraits avec termes en surbrillance", - "help.desc_source_btn": ": Affiche/masque le\n markdown brut", - "help.desc_specific_vault": ": Focus sur un seul vault", - "help.desc_syntax_hl": ":\n Coloration des blocs de code", - "help.desc_tag_cloud_intro": "

\n L'onglet Tags de la sidebar affiche un nuage de\n tags :\n

", - "help.desc_tag_filter_use": ": Utilisez la barre de filtrage pour chercher un tag", - "help.desc_tag_suggest": ": Suggestions de tags avec compteurs", - "help.desc_tags_tab": "Nuage de tags cliquables", - "help.desc_template_intro": "

\n Dans les Configurations, vous pouvez masquer les\n tags de template :\n

", - "help.desc_title_tags": "Métadonnées du fichier", - "help.desc_trash_btn": ": Suppression du\n fichier", - "help.desc_two_tag_types": "

ObsiGate supporte deux types de tags :

", - "help.desc_vault_context": "Changez de contexte pour filtrer l'affichage :", - "help.desc_vault_indicator": "Affiche le contexte actif (All, vault1, etc.)", - "help.desc_vaults_tab": "Arborescence des fichiers et dossiers", - "help.desc_visual_search": ": Barre\n de recherche pour surligner des nœuds", - "help.desc_wikilinks": ":\n [[lien]] et\n [[lien|texte]]", - "help.double_click": "Double clic", - "help.drag_drop_tabs": "Drag & drop des onglets", - "help.e23c94dd": ": Dans la\n barre d'outils (le cas échéant)", - "help.e3fce7a3": ": Ouvre le\n fichier dans un onglet temporaire (aperçu,\n italique)", - "help.e5b67e3d": ": Votre choix\n est sauvegardé en localStorage", - "help.editor_section": "Éditeur", - "help.ef1531ce": ": Un\n onglet temporaire (italique) est remplacé\n par le prochain clic", - "help.experience": "Expérience", - "help.export": "Export", - "help.external_audit": "Audit externe", - "help.f0adf67a": ": Molette pour\n zoomer, cliquer-glisser pour se déplacer", - "help.fallback_editor": "Éditeur de fallback", - "help.fdeaf803": ": Chaque type de\n fichier a son icône (markdown, code, etc.)", - "help.fe388b67": "Optimisations", - "help.file_actions": "Actions sur le fichier ouvert :", - "help.file_viewer": "Visionneur de fichier", - "help.filter_toggles": "Toggles Aa, wd, .*", - "help.filtering": "Filtrage", - "help.find_capabilities": "Recherche regex, mot entier, case-sensitive dans le document affiché avec TreeWalker DOM.", - "help.find_in_page": "Recherche dans la page", - "help.footer": "© 2026 — Fait avec ☕, 🎧 et quelques", - "help.graph_context": "Menu contextuel", - "help.graph_depth": "Slider de profondeur", - "help.graph_export": "Export PNG", - "help.graph_filter_depth": "Filtres & profondeur", - "help.graph_focus": "Mode focus", - "help.graph_fullscreen": "Plein écran & export PNG", - "help.graph_info": "Panneau d'info", - "help.graph_nav_arrows": "Navigation ← → ↑", - "help.graph_navigation": "Navigation historique ← → ↑", - "help.graph_nodes": "Nœuds", - "help.graph_preview": "Ctrl+survol", - "help.graph_sticky": "Sticky panels", - "help.graph_tag_filter": "Filtre par tag", - "help.graph_type_filter": "Filtre par type", - "help.graph_view": "Vue graphe", - "help.graph_visual": "Recherche visuelle", - "help.graph_zoom": "Zoom/Pan", - "help.graph_zoom_pan": "Zoom & pan molette", - "help.guide_official": "Guide officiel", - "help.hamburger_btn": "Bouton menu hamburger", - "help.header_section": "En-tête", - "help.help_title": "Aide", - "help.hide": "Masquage", - "help.hide_help": "Masquer l'aide", - "help.highlighted_snippets": "Snippets surlignés", - "help.indexes": "ObsiGate indexe et affiche :", - "help.instant": "Instantanée", - "help.light": "Clair", - "help.logo": "Logo ObsiGate", - "help.markdown": "Syntaxe Markdown", - "help.menu_header": "Menu header", - "help.menu_options": "Menu Options", - "help.mermaid_section": "Diagrammes Mermaid", - "help.mermaid_templates": "Templates", - "help.mobile": "Barre flottante résultats", - "help.mobile_editor_gestures": " : balayage vers la gauche → liens entrants, vers la droite → table des matières.", - "help.mobile_editor_gestures_label": "Gestes tactiles", - "help.mobile_editor_intro": "Sur téléphone et tablette, l'édition s'adapte au tactile : barre d'outils flottante, gestes et mode lecture plein écran.", - "help.mobile_editor_paste": " : bouton « Coller » persistant (contourne la restriction iOS).", - "help.mobile_editor_paste_label": "Presse-papiers", - "help.mobile_editor_reading": " : plein écran sans en-tête ni barres latérales ; balayage horizontal pour passer au fichier suivant ou précédent.", - "help.mobile_editor_reading_label": "Mode lecture", - "help.mobile_editor_title": "📱 Édition mobile", - "help.mobile_editor_toolbar": " : ruban horizontal défilable (titres, gras, italique, barré, surligné, code, citation, listes, cases à cocher, liens, tags, pièces jointes). L'icône ⚙ permet d'ajouter, retirer ou réordonner les commandes ; A−/A+ ajustent la taille de la police.", - "help.mobile_editor_toolbar_label": "Ruban d'édition", - "help.mobile_editor_zoom": " : pincement à deux doigts pour zoomer, poignée pour redimensionner la zone d'édition.", - "help.mobile_editor_zoom_label": "Zoom & hauteur", - "help.modal_title": "Guide d'utilisation ObsiGate", - "help.multi_vault": "Multi-vault", - "help.nav_ai": "🤖 IA Éditeur", - "help.nav_backups": "💾 Sauvegardes", - "help.nav_customization": "🎨 Personnalisation", - "help.nav_editing": "✏️ Édition", - "help.nav_files": "📁 Fichiers", - "help.nav_graph": "🗺️ Graphe", - "help.nav_interface": "🧭 Interface", - "help.nav_intro": "📘 Introduction", - "help.nav_mobile_editor": "📱 Mobile", - "help.nav_navigation": "🗺️ Navigation", - "help.nav_palette": "⌨️ Palette", - "help.nav_search": "🔍 Recherche", - "help.nav_security": "🛡️ Sécurité", - "help.nav_sharing": "🔗 Partage", - "help.nav_shortcuts": "⌨️ Raccourcis", - "help.nav_tabs": "📑 Onglets", - "help.nav_tags": "🏷️ Tags", - "help.nav_tips": "💡 Astuces", - "help.nav_webhooks": "🪝 Webhooks", - "help.nav_plugins": "🧩 Plugins", - "help.nav_excalidraw": "🎨 Excalidraw", - "help.new_file": "Nouveau fichier", - "help.new_folder": "Nouveau dossier", - "help.nights": "nuits blanches 😅", - "help.nodes_edges": "Arêtes", - "help.other": "Autres", - "help.outline_panel": "Panneau Plan (droite)", - "help.pagination": "Pagination", - "help.pal_close_the_palette": "Fermer la palette", - "help.pal_delete_a_folder_and_its_contents": "Supprime un dossier et son contenu", - "help.pal_delete_the_file_from_the_active_tab": "Supprime le fichier de l'onglet actif", - "help.pal_move_desc": "Se déplacer dans la liste", - "help.pal_open___select": "Ouvrir/sélectionner", - "help.pal_open_the_editor_on_the_active_tab": "Ouvre l'éditeur sur l'onglet actif", - "help.pal_open_this_guide": "Ouvre ce guide", - "help.pal_popout_desc": "Ouvre le document dans une fenêtre détachée", - "help.pal_toggle_light_dark": "Bascule clair/sombre", - "help.pdf_export": "Export PDF", - "help.persistent_display": "Affichage persistant dans la barre", - "help.persistent_tabs": "Onglets persistants", - "help.popout_button": "Bouton dédié", - "help.powered_by": "Propulsé par Python, FastAPI, vanilla JS, CodeMirror, Mermaid, Lucide Icons et ❤️ pour Obsidian.", - "help.preview_tab": "Prévisualisation", - "help.properties": "Propriétés", - "help.public_shares": "Publication publique", - "help.pwa_section": "PWA", - "help.quick_help": "Raccourcis & Astuces", - "help.quick_select": "Sélection rapide", - "help.rate_limiting": "Rate limiting", - "help.recent_nav": "Navigation récente", - "help.rename": "Renommer", - "help.rendered_content": "Contenu rendu", - "help.rendering_images": "Rendu d'images", - "help.rendering_md": "Rendu dans le Markdown", - "help.resize": "Redimensionnement", - "help.results_counter": "Compteur de résultats", - "help.results_grouped": "Résultats groupés", - "help.search_bar": "Barre de recherche", - "help.search_dropdown": "Dropdown de recherche", - "help.search_everywhere": "Recherche dans tout", - "help.search_facets": "Facettes", - "help.search_filters": "Filtres de recherche", - "help.search_history": "Historique de recherche", - "help.search_operators": "Opérateurs de recherche", - "help.search_placeholder": "Rechercher dans l'aide...", - "help.search_save": "Recherches sauvegardées", - "help.secret_redaction": "Redaction de secrets", - "help.security_section": "Sécurité", - "help.share_button": "Bouton Partager", - "help.shortcut_ai_completion": "Completion IA inline (dans l'éditeur)", - "help.shortcut_close": "Fermer l'éditeur / modale", - "help.shortcut_close_editor": "Fermer l'éditeur / modale", - "help.shortcut_close_palette": "Fermer la palette", - "help.shortcut_close_tab": "Fermer l'onglet", - "help.shortcut_command_palette": "Palette de commandes", - "help.shortcut_file_palette": "Palette de fichiers (nav. rapide)", - "help.shortcut_focus_search": "Focus barre de recherche", - "help.shortcut_forge_help": "Aide de l'éditeur Forge", - "help.shortcut_next_tab": "Onglet suivant", - "help.shortcut_palette": "Palette de commandes", - "help.shortcut_palette_cmd": "Palette de commandes (mode commande)", - "help.shortcut_prev_tab": "Onglet précédent", - "help.shortcut_quick_insert": "Insertion rapide (éditeur Forge)", - "help.shortcut_quick_search": "Recherche rapide (hors champ texte)", - "help.shortcut_redo": "Refaire", - "help.shortcut_save": "Sauvegarder", - "help.shortcut_save_file": "Sauvegarder le fichier ouvert", - "help.shortcut_search_doc": "Rechercher dans le document", - "help.shortcut_select": "Ouvrir/sélectionner", - "help.shortcut_tip": "Survolez un document avec Ctrl pour un aperçu rapide. Cliquez sur Forge dans la barre d'outils pour l'éditeur avancé.", - "help.shortcut_undo": "Annuler", - "help.shortcuts": "Raccourcis clavier", - "help.shortcuts_title": "Raccourcis & Astuces", - "help.sidebar_dropdown": "Sidebar dropdown", - "help.sidebar_features": "Fonctionnalités de la sidebar :", - "help.sidebar_filtering": "Filtrage de la sidebar", - "help.sidebar_section": "Sidebar (barre latérale)", - "help.sidebar_tabs": "La sidebar est divisée en deux onglets :", - "help.sidebar_toggle_btn": "Bouton toggle sidebar", - "help.simple": "Simple", - "help.simple_search": "Recherche simple", - "help.single_click": "Simple clic", - "help.smart_scoring": "Scoring intelligent", - "help.sort_options": "Options de tri", - "help.supported_languages": "Support de nombreux langages", - "help.syncthing": "Conflits Syncthing", - "help.syncthing_conflicts": "Conflits Syncthing", - "help.tab_bar": "Barre d'onglets", - "help.tab_features": "Fonctionnalités", - "help.tab_nav": "Navigation entre onglets", - "help.tabs_section": "Ouverture d'onglets", - "help.theme_section": "Thème", - "help.theme_sync": "Thème synchronisé", - "help.theme_toggle": "Basculez entre les thèmes :", - "help.themes": "Thèmes", - "help.tip_hide_sidebar": "Masquez la sidebar", - "help.tip_sidebar_filter": "Utilisez le filtrage sidebar", - "help.tip_use_tags": "Utilisez les tags", - "help.title": "Aide ObsiGate", - "help.title_tags": "Titre et tags", - "help.toc_title": "SOMMAIRE", - "help.assistant_panel": "🧠 Panneau Assistant (BooksLM)", - "help.assistant_panel_desc": "L'assistant latéral (bouton flottant ou menu contextuel d'un dossier) répond en Markdown formaté et contextualise vos répertoires ou documents. En contexte général, il connaît aussi ce que vous voyez : documents ouverts, répertoire courant, recherche en cours et fichiers récemment modifiés.", - "help.assistant_markdown": "Réponses formatées : titres, listes, tableaux, citations et blocs de code.", - "help.assistant_links": "Les fichiers et chemins cités sont des liens : un simple nom de fichier copie le nom dans le presse-papiers, un dossier est révélé dans l'arborescence, et un chemin de fichier l'ouvre dans le viewer.", - "help.assistant_sessions": "L'icône historique de l'en-tête liste les sessions passées (recharger ou supprimer) ; « + » démarre une nouvelle conversation.", - "help.assistant_agent": "Le bouton « mode agent » active les outils (lire, lister, chercher) ; les actions de modification demandent une confirmation avec aperçu des changements.", - "help.assistant_resize": "Le bord gauche du panneau est redimensionnable ; la largeur est mémorisée.", - "help.assistant_at": "Tapez @ pour joindre un fichier ou un répertoire au contexte, ou pour attacher une image d'un répertoire.", - "help.assistant_slash": "Tapez / pour lancer un skill (recherche, résumé, correction, plan…) ou une commande admin (/help, /providers, /model, /keys).", - "help.assistant_images": "Collez une image dans la zone de saisie (ou joignez-la) pour l'analyser avec un modèle compatible vision. Le bouton ⓘ affiche les capacités du modèle sélectionné, et la liste des modèles est filtrable par recherche.", - "help.toolbar_section": "Barre d'outils AI", - "help.tree_section": "Arborescence des vaults", - "help.use_cases": "Cas d'usage", - "help.vault_indicator": "Indicateur de vault", - "help.vault_selector": "Sélection de vault", - "help.vault_specific": "Vault spécifique", - "help.webhook_blog_post": "article de blog quand un fichier est marqué", - "help.webhook_note": "Note : l'événement", - "help.webhook_notify": "notifier automatiquement des services", - "help.webhook_post": "HTTP vers l'URL de votre", - "help.webhooks": "Webhooks", - "help.welcome_desc": "ObsiGate est votre porte d'entrée web vers vos vaults Obsidian. Accédez, naviguez et recherchez dans toutes vos notes depuis n'importe quel appareil via une interface moderne et responsive.", - "help.welcome_tag1": "⚡ Navigation rapide", - "help.welcome_tag2": "📁 Multi-vault", - "help.welcome_tag3": "🏷️ Tags intelligents", - "help.welcome_tag4": "📖 Lecture et édition", - "help.welcome_tag5": "🔍 Recherche TF-IDF", - "help.welcome_title": "Bienvenue dans ObsiGate", - "help.wikilinks": "Wikilinks", - "help.zoom_pan": "Zoom & Pan", - "mermaid.code": "Code", - "mermaid.copy_svg": "Copier SVG", - "mermaid.download_png": "Télécharger PNG", - "mermaid.preview": "Aperçu", - "mermaid.zoom_in": "Zoom avant", - "mermaid.zoom_out": "Zoom arrière", - "mobile.all_vaults": "📂 Toutes les vaults", - "mobile_editor.add_command": "Ajouter une commande", - "mobile_editor.backlinks": "Liens entrants", - "mobile_editor.bold": "Gras", - "mobile_editor.close": "Fermer", - "mobile_editor.cmd_attachment": "Pièce jointe", - "mobile_editor.cmd_bold": "Gras", - "mobile_editor.cmd_bullet": "Liste à puces", - "mobile_editor.cmd_checkbox": "Case à cocher", - "mobile_editor.cmd_code": "Code en ligne", - "mobile_editor.cmd_codeblock": "Bloc de code", - "mobile_editor.cmd_dedent": "Désindenter", - "mobile_editor.cmd_files": "Modèle / fichiers", - "mobile_editor.cmd_h1": "Titre 1", - "mobile_editor.cmd_h2": "Titre 2", - "mobile_editor.cmd_h3": "Titre 3", - "mobile_editor.cmd_h4": "Titre 4", - "mobile_editor.cmd_h5": "Titre 5", - "mobile_editor.cmd_h6": "Titre 6", - "mobile_editor.cmd_highlight": "Surligné", - "mobile_editor.cmd_indent": "Indenter", - "mobile_editor.cmd_italic": "Italique", - "mobile_editor.cmd_link": "Lien externe", - "mobile_editor.cmd_ordered": "Liste numérotée", - "mobile_editor.cmd_quote": "Citation", - "mobile_editor.cmd_redo": "Refaire", - "mobile_editor.cmd_strike": "Barré", - "mobile_editor.cmd_tag": "Tag", - "mobile_editor.cmd_undo": "Annuler", - "mobile_editor.cmd_wikilink": "Lien interne", - "mobile_editor.code": "Code", - "mobile_editor.customize": "Personnaliser la barre", - "mobile_editor.customize_reset": "Réinitialiser", - "mobile_editor.customize_title": "Personnaliser la barre d'outils", - "mobile_editor.done": "Terminé", - "mobile_editor.error": "Erreur de chargement", - "mobile_editor.font_larger": "Agrandir la police", - "mobile_editor.font_smaller": "Réduire la police", - "mobile_editor.italic": "Italique", - "mobile_editor.link": "Lien", - "mobile_editor.list": "Liste à puces", - "mobile_editor.loading": "Chargement…", - "mobile_editor.move_down": "Descendre", - "mobile_editor.move_up": "Monter", - "mobile_editor.no_backlinks": "Aucun lien entrant", - "mobile_editor.no_headings": "Aucun titre dans ce document", - "mobile_editor.no_next": "Dernier fichier du dossier", - "mobile_editor.no_prev": "Premier fichier du dossier", - "mobile_editor.paste": "Coller", - "mobile_editor.paste_hint": "Appuyez longuement dans le champ puis choisissez « Coller » (accès au presse-papiers refusé).", - "mobile_editor.reading_enter": "Mode lecture", - "mobile_editor.reading_exit": "Quitter le mode lecture", - "mobile_editor.remove_command": "Supprimer", - "mobile_editor.resize": "Ajuster la hauteur de l'éditeur", - "mobile_editor.toc": "Table des matières", - "mobile_editor.toolbar": "Barre d'outils d'édition mobile", - "modal.create_btn": "Créer", - "modal.create_file": "Créer un fichier", - "modal.creating": "Création...", - "modal.delete_dir": "Supprimer le dossier", - "modal.delete_dir_warning": "Tous les fichiers et sous-dossiers seront supprimés définitivement.", - "modal.delete_file": "Supprimer le fichier", - "modal.delete_irreversible": "Cette action est irréversible.", - "modal.delete_permanently": "Supprimer définitivement", - "modal.delete_warning": "Attention !", - "modal.dir_to_delete": "Dossier à supprimer:", - "modal.file_name": "Nom du fichier", - "modal.file_to_delete": "Fichier à supprimer:", - "modal.file_type": "Type de fichier", - "modal.in_folder": "Dans: {path}", - "month.april": "Avril", - "month.august": "Août", - "month.december": "Décembre", - "month.february": "Février", - "month.january": "Janvier", - "month.july": "Juillet", - "month.june": "Juin", - "month.march": "Mars", - "month.may": "Mai", - "month.november": "Novembre", - "month.october": "Octobre", - "month.september": "Septembre", - "offline.all_synced": "Toutes les modifications ont été synchronisées", - "offline.conflict_title": "Conflit de synchronisation", - "offline.keep_local": "Garder version locale", - "offline.keep_server": "Garder version serveur", - "offline.mode_offline": "Mode hors-ligne — vos modifications seront synchronisées au retour", - "offline.pending": "{count} modification(s) en attente", - "offline.reconnected": "Connexion rétablie — synchronisation en cours...", - "offline.status": "Hors-ligne", - "offline.sync_now": "Synchroniser maintenant", - "palette.browse_dirs": "📂 Parcourir les répertoires...", - "palette.browse_hint": "Naviguer dans les vaults pour trouver un fichier", - "palette.browse_in": "Dans {path}", - "palette.browse_no_results": "Aucun résultat — naviguer manuellement", - "palette.browse_open_file": "📂 Ouvrir un fichier dans ce dossier", - "palette.browse_root": "racine", - "palette.close_current": "Fermer fichier courant", - "palette.close_current_desc": "Fermer l'onglet actif sans supprimer", - "palette.cmd_back_home": "🏠 Accueil", - "palette.cmd_back_home_desc": "Retour à l'accueil", - "palette.cmd_config": "⚙️ Configuration", - "palette.cmd_config_desc": "Ouvrir les paramètres", - "palette.cmd_create_dir": "📁 Créer répertoire", - "palette.cmd_create_dir_desc": "Choisir la vault, naviguer, puis nommer le dossier", - "palette.cmd_create_file": "📄 Créer fichier markdown", - "palette.cmd_create_file_desc": "Choisir la vault, naviguer, puis nommer le fichier", - "palette.cmd_delete_dir": "🗑️ Supprimer répertoire", - "palette.cmd_delete_dir_desc": "Choisir la vault, naviguer et supprimer", - "palette.cmd_theme": "🌓 Changer le thème", - "palette.cmd_theme_desc": "Basculer clair/sombre", - "palette.del_all_content": "Tout le contenu sera supprimé", - "palette.delete_current": "Supprimer fichier courant", - "palette.delete_current_desc": "Supprimer le fichier de l'onglet actif", - "palette.delete_file_desc": "Rechercher un fichier à supprimer", - "palette.dir_delete_confirm": "Tout le contenu sera supprimé", - "palette.dir_name": "Nom du dossier", - "palette.empty_dir": "📂 Dossier vide", - "palette.error_loading": "Erreur de chargement", - "palette.error_prefix": "Erreur : {msg}", - "palette.file_name": "Nom du fichier", - "palette.help_desc": "Ouvrir le guide", - "palette.md_hint": "(.md ajouté si besoin)", - "palette.mode_commands": "Commandes", - "palette.mode_files": "Fichiers", - "palette.no_results": "Aucun résultat pour \"{query}\"", - "palette.no_vaults": "Aucune vault trouvée", - "palette.popout_desc": "Ouvrir le document dans une fenêtre", - "palette.reindex_desc": "Forcer la réindexation complète", - "palette.search_commands": "Tapez une commande...", - "palette.search_error": "Erreur de recherche", - "palette.search_files": "Rechercher un fichier...", - "palette.type_command": "Tapez une commande...", - "palette.type_search": "Rechercher un fichier... (+inclure -exclure)", - "palette.vault_count": "{count} fichiers", - "pwa.dismiss": "Plus tard", - "pwa.install_button": "Installer", - "pwa.install_desc": "Installez cette application sur votre appareil pour un accès rapide.", - "pwa.install_title": "Installer ObsiGate", - "search.advanced_operators": "Opérateurs avancés", - "search.aria_label": "Suggestions de recherche", - "search.case_sensitive": "Respecter la casse", - "search.clear": "Effacer", - "search.dropdown_clear_history": "Effacer l'historique", - "search.dropdown_files": "Fichiers", - "search.dropdown_history": "Historique", - "search.error": "Erreur de recherche", - "search.exclude_placeholder": "Exclure: vendor/*, *.lock", - "search.facet_tags": "Tags", - "search.facet_vaults": "Vaults", - "search.files_filtered": "{count} fichier(s) avec filtres", - "search.filter_path_title": "Filtres de chemin (Alt-F)", - "search.filters": "Filtres", - "search.full_text": "Recherche dans tout", - "search.highlighted_snippets": "Snippets surlignés", - "search.include_placeholder": "Inclure: **/*.md, notes/**", - "search.loading": "Recherche en cours...", - "search.no_results": "Aucun résultat trouvé", - "search.operators_help": "Opérateurs : tag:mot, vault:nom, title:mot, path:mot, ext:md", - "search.pagination": "Pagination", - "search.previous": "← Précédent", - "search.query_time": "({time} ms)", - "search.regex": "Expression régulière", - "search.results_count": "{count} résultat(s)", - "search.results_filtered": "{count} résultat(s) pour \"{query}\" avec filtres", - "search.results_for": "{count} résultat(s) pour \"{query}\"", - "search.save_search": "Sauvegarder la recherche", - "search.saved": "Recherche sauvegardée", - "search.sections_all_vaults": "Tous les vaults", - "search.semantic_score": "sim", - "search.semantic_title": "Recherche sémantique (Alt-S)", - "search.semantic_unavailable": "Recherche sémantique indisponible", - "search.simple_search": "Recherche simple", - "search.smart_scoring": "Scoring intelligent", - "search.sort_date": "Date", - "search.sort_relevance": "Pertinence", - "search.sort_title": "Titre", - "search.whole_word": "Mot entier", - "settings.about": "📦 À propos", - "settings.ai": "🤖 IA", - "settings.backend": "⚙️ Backend", - "settings.backend_hint": "Ces paramètres sont sauvegardés sur le serveur. Certains nécessitent un redémarrage ou une réindexation.", - "settings.backend_section": "Paramètres backend", - "settings.client_label": "Ces paramètres s'appliquent immédiatement côté client.", - "settings.diagnostics": "🩺 Diagnostics", - "settings.history_count_desc": "Entre 5 et 100 fichiers (sauvegarde sur le serveur)", - "settings.history_count_label": "Nombre de fichiers dans l'historique", - "settings.history_section": "Historique récent", - "settings.no_restart_badge": "Redémarrage non requis", - "settings.profile": "👤 Profil", - "settings.reindex": "Forcer réindexation", - "settings.restart_badge": "Redémarrage requis", - "settings.save": "Sauvegarder", - "settings.search": "Recherche", - "settings.tabs": "Tabs", - "settings.search_placeholder": "Rechercher...", - "settings.sync": "🔄 Synchronisation", - "settings.themes": "🎨 Thèmes", - "settings.plugins": "🧩 Plugins", - "share.copied": "Lien copié !", - "share.copy_link": "Copier le lien", - "share.create": "Créer un lien de partage", - "share.expires": "Expire le", - "share.never": "Jamais", - "share.revoke": "Révoquer", - "share.title": "Partage public", - "shortcut.ai_completion": "Completion IA inline (dans l'éditeur)", - "shortcut.close_editor": "Fermer l'éditeur / modale", - "shortcut.command_palette": "Palette de commandes", - "shortcut.editor_help": "Aide de l'éditeur Forge", - "shortcut.file_palette": "Palette de fichiers (nav. rapide)", - "shortcut.focus_search": "Focus barre de recherche", - "shortcut.quick_insert": "Insertion rapide (éditeur Forge)", - "shortcut.quick_search": "Recherche rapide (hors champ texte)", - "shortcut.save_file": "Sauvegarder le fichier ouvert", - "shortcut.search_in_doc": "Rechercher dans le document", - "shortcut.tip_preview": "Survolez un document avec **Ctrl** pour un aperçu rapide. Cliquez sur **Forge** dans la barre d'outils pour l'éditeur avancé.", - "sidebar.all_vaults": "Tous les vaults", - "sidebar.case_sensitive": "Respecter la casse", - "sidebar.clear_filter": "Effacer", - "sidebar.expand_collapse": "Développer/Réduire", - "sidebar.file_icons": "Icônes", - "sidebar.filter_instant": "Recherche instantanée", - "sidebar.filter_path": "Filtres de chemin", - "sidebar.filter_placeholder": "Filtrer fichiers...", - "sidebar.filter_results_grouped": "Résultats groupés", - "sidebar.loading": "Chargement...", - "sidebar.no_recent_files": "Aucun fichier récent", - "sidebar.no_results": "Aucun repertoire ou fichier correspondant.", - "sidebar.no_saved_searches": "Aucune recherche sauvegardée", - "sidebar.open_file": "Ouvrir un fichier", - "sidebar.saved_dirs_tab": "Répertoires", - "sidebar.saved_searches_tab": "Recherches", - "sidebar.sidebar_dropdown": "Menu contextuel vault", - "sidebar.sidebar_filtering": "Filtrage de la sidebar", - "sidebar.tab_backups": "Sauvegardes", - "sidebar.tab_recent": "Récents", - "sidebar.tab_saved": "Recherches", - "sidebar.tab_tags": "Tags", - "sidebar.tab_vaults": "Vaults", - "sidebar.vault_context_all": "Toutes les vaults", - "sidebar.vault_specific": "Vault spécifique", - "sync.autocomplete": "Auto-complétion", - "sync.autocomplete_active": "Auto-complétion active", - "sync.connected": "Synchronisé", - "sync.connected_short": "Connecté", - "sync.disconnected": "Déconnecté", - "sync.event_index_progress": "Vault indexé", - "sync.event_index_start": "Démarrage index.", - "sync.event_index_updated": "Mise à jour", - "sync.event_vault_added": "Vault ajouté", - "sync.event_vault_removed": "Vault supprimé", - "sync.index_complete": "Indexation terminée ({count} fichiers)", - "sync.index_reloaded": "Index complet rechargé", - "sync.index_started": "Indexation démarrée ({count} vaults)", - "sync.install_success": "ObsiGate installé avec succès !", - "sync.model_not_loaded": "Modèle non chargé", - "sync.no_provider": "Aucun fournisseur", - "sync.no_recent_events": "Aucun événement récent", - "sync.not_configured": "Non configuré", - "sync.processing": "Traitement en cours…", - "sync.update": "Mettre à jour", - "sync.updating": "Mise à jour...", - "sync.vault_added": "Vault \"{vault}\" ajouté ({count} fichiers)", - "sync.vault_added_label": "Vault ajouté", - "sync.vault_files": "{vault} ({files} fichiers)", - "sync.vault_indexed_label": "Vault indexé", - "sync.vault_removed": "Vault \"{vault}\" supprimé", - "sync.vault_removed_label": "Vault supprimé", - "sync.verifying": "Vérification…", - "theme.change": "Changer le thème", - "theme.dark": "Sombre", - "theme.light": "Clair", - "theme.high_contrast": "Contraste élevé", - "theme.sepia": "Sépia", - "theme.title": "Thème", - "theme.export_all": "Exporter les thèmes", - "theme.import": "Importer un thème", - "theme.import_success": "{count} thème(s) importé(s)", - "theme.import_error": "Erreur d'importation", - "theme.delete_confirm": "Supprimer ce thème personnalisé ?", - "themes.name_gradients": "Degrades subtils", - "themes.name_terminal": "Noir pur & vert", - "toast.ai_keys_saved": "Clés API sauvegardées", - "toast.ai_no_key": "Aucune clé à sauvegarder", - "toast.bookmark_added": "Ajouté aux favoris", - "toast.bookmark_removed": "Retiré des favoris", - "toast.cannot_delete_self": "Impossible de supprimer son propre compte", - "toast.config_client_saved": "Paramètres client sauvegardés", - "toast.config_reset": "Configuration réinitialisée", - "toast.config_saved": "Configuration sauvegardée", - "toast.conflict_resolved": "Conflit résolu", - "toast.copied": "Copié !", - "toast.copy_error": "Erreur lors de la copie", - "toast.create_error": "Erreur lors de la création", - "toast.created": "Créé", - "toast.delete_error": "Erreur lors de la suppression", - "toast.deleted": "Supprimé", - "toast.dir_created": "Dossier \"{name}\" créé", - "toast.dir_deleted": "Dossier supprimé ({count} fichiers)", - "toast.dir_renamed": "Dossier renommé", - "toast.dir_saved_search": "Répertoire sauvegardé dans les recherches", - "toast.error_delete": "Erreur de suppression", - "toast.error_init": "Erreur lors de l'initialisation", - "toast.error_load": "Erreur de chargement", - "toast.error_network": "Erreur réseau", - "toast.error_rename": "Impossible de renommer cet élément", - "toast.file_created": "Fichier \"{name}\" créé", - "toast.file_deleted": "Fichier supprimé", - "toast.file_renamed": "Fichier renommé", - "toast.hidden_saved": "✓ Paramètres sauvegardés", - "toast.index_reloaded": "Index complet rechargé", - "toast.installed": "ObsiGate installé avec succès !", - "toast.link_created": "Lien créé !", - "toast.moved": "Déplacé", - "toast.no_open_file": "Aucun fichier ouvert", - "toast.not_found_tree": "Élément introuvable dans l'arborescence", - "toast.path_copied": "Chemin copié : {path}", - "toast.reindex_done": "Réindexation terminée", - "toast.reindex_started": "Réindexation en cours...", - "toast.rename_error": "Erreur lors du renommage", - "toast.renamed": "Renommé", - "toast.saved": "Sauvegardé", - "toast.search_saved": "Recherche sauvegardée", - "toast.share_revoked": "Partage révoqué", - "toast.url_required": "URL requise", - "toast.user_created": "Utilisateur créé", - "toast.user_deleted": "Utilisateur supprimé", - "toast.user_modified": "Utilisateur modifié", - "toast.viewer_error": "Erreur lors du chargement du viewer", - "toc.hide_panel": "Masquer le panneau", - "toc.no_headings": "Aucun titre dans ce document", - "toc.title": "SUR CETTE PAGE", - "tree.new_file": "Nouveau fichier", - "tree.new_folder": "Nouveau dossier", - "tree.vault_home": "Accueil du vault", - "ui.backups_versions": "Backups / Versions", - "ui.cannot_rename": "Impossible de renommer cet élément", - "ui.delete_name_empty": "Le nom ne peut pas etre vide", - "ui.element_not_found": "Élément introuvable dans l'arborescence", - "ui.vault_readonly": "Vault en lecture seule", - "vault.add_dynamic": "Ajouter une vault", - "vault.reindex": "Réindexer la vault", - "vault.remove_dynamic": "Retirer la vault", - "vaulthome.empty": "Aucun fichier dans ce repertoire", - "vaulthome.error_loading": "Erreur de chargement:", - "vaulthome.file_count": "{count} fichier", - "vaulthome.file_count_plural": "{count} fichiers", - "vaulthome.loading": "Chargement des fichiers...", - "vaulthome.size_bytes": "o", - "vaulthome.size_kb": "Ko", - "vaulthome.size_mb": "Mo", - "viewer.backlinks": "Backlinks", - "viewer.binary_download": "Télécharger le fichier", - "viewer.binary_unsupported": "Fichier binaire non supporté", - "viewer.bookmark_add": "Ajouter aux bookmarks", - "viewer.bookmark_remove": "Retirer des bookmarks", - "viewer.bookmark_toggle": "Ajouter/Retirer des bookmarks", - "viewer.breadcrumb_home": "Accueil", - "viewer.click_to_download": "Cliquez pour le télécharger", - "viewer.copied": "Copié !", - "viewer.copy": "Copier", - "viewer.copy_error": "Erreur lors de la copie", - "viewer.download": "Télécharger", - "viewer.download_md": "Télécharger en .md", - "viewer.download_file": "Télécharger le fichier", - "viewer.pretty": "Pretty", - "viewer.pretty_title": "Mode formaté : couleurs et numéros de ligne", - "viewer.download_pdf": "Télécharger en PDF", - "viewer.edit": "Éditer", - "viewer.error": "Erreur de chargement", - "viewer.export": "Exporter", - "viewer.export_done": "Export terminé", - "viewer.export_epub": "Exporter en ePub", - "viewer.export_error": "Erreur d'export :", - "viewer.export_html": "Exporter en HTML", - "viewer.export_md_bundle": "Exporter en bundle Markdown (.zip)", - "viewer.export_start": "Export en cours...", - "viewer.export_title": "Exporter le document", - "viewer.forge_brand": "Forge", - "viewer.forge_title": "Forge (nouvel éditeur)", - "viewer.index_start": "Démarrage index.", - "viewer.index_updated": "Mise à jour", - "viewer.loaded_from_cache": "Fichier chargé depuis le cache hors-ligne", - "viewer.loading": "Chargement du fichier...", - "viewer.markdown": "Markdown", - "viewer.metadata_created": "Créé", - "viewer.metadata_modified": "Modifié", - "viewer.metadata_path": "Chemin", - "viewer.metadata_size": "Taille", - "viewer.metadata_tags": "Tags", - "viewer.metadata_vault": "Vault", - "viewer.no_headings": "Aucun titre dans ce document", - "viewer.on_this_page": "SUR CETTE PAGE", - "viewer.outline": "Plan", - "viewer.pdf_pages": "{count} pages", - "viewer.popout": "Ouvrir dans une fenêtre", - "viewer.raw": "Brut", - "viewer.share": "Partager", - "viewer.shared_doc_title": "Document partagé — cliquer pour gérer", - "viewer.source": "Source", - "viewer.syncing": "Mise à jour...", - "viewer.toc": "Table des matières", - "viewer.unsupported_file": "Ce fichier est binaire et ne peut pas être affiché", - "webhook.trigger_create": "Création via API ou palette", - "webhook.trigger_delete": "Suppression via API ou éditeur", - "webhook.trigger_dir_create": "Création de dossier via API", - "webhook.trigger_dir_delete": "Suppression de dossier via l'API", - "webhook.trigger_dir_rename": "Renommage de dossier via l'API", - "webhook.trigger_rename": "Renommage via l'API", - "settings.security": "🔒 Sécurité du compte", - "settings.security_desc": "Activez l'authentification à deux facteurs (2FA) pour renforcer la sécurité de votre compte.", - "mfa.title": "Authentification à deux facteurs", - "mfa.subtitle": "Entrez le code à 6 chiffres de votre application d'authentification.", - "mfa.verify": "Vérifier", - "mfa.verifying": "Vérification...", - "mfa.use_recovery": "Utiliser un code de récupération", - "mfa.back_to_login": "Retour à la connexion", - "mfa.recovery_title": "Code de récupération", - "mfa.recovery_subtitle": "Entrez l'un de vos codes de récupération (format : XXXX-XXXX).", - "mfa.use_totp": "Utiliser le code authenticator", - "mfa.status_label": "Authentification à deux facteurs", - "mfa.enabled": "Activée", - "mfa.disabled": "Désactivée", - "mfa.enabled_desc": "Votre compte est protégé par l'authentification à deux facteurs.", - "mfa.setup_desc": "Ajoutez une couche de sécurité supplémentaire à votre compte avec le TOTP.", - "mfa.enable_btn": "Activer la 2FA", - "mfa.disable_btn": "Désactiver la 2FA", - "mfa.scan_qr": "Scannez ce QR code avec votre application d'authentification", - "mfa.manual_entry": "Saisie manuelle (si vous ne pouvez pas scanner)", - "mfa.enter_code": "Entrez le code à 6 chiffres pour confirmer", - "mfa.confirm_enable": "Confirmer et activer", - "mfa.recovery_codes_title": "Codes de récupération", - "mfa.recovery_codes_warning": "Enregistrez ces codes dans un endroit sûr. Chaque code ne peut être utilisé qu'une seule fois.", - "mfa.copy_codes": "Copier", - "mfa.download_codes": "Télécharger", - "mfa.done": "Terminé", - "mfa.codes_copied": "Codes de récupération copiés !", - "mfa.disable_confirm_title": "Désactiver la 2FA", - "mfa.disable_confirm_desc": "Entrez votre mot de passe et un code TOTP valide pour désactiver l'authentification à deux facteurs.", - "mfa.password_label": "Mot de passe", - "mfa.password_placeholder": "Votre mot de passe actuel", - "mfa.totp_code_label": "Code TOTP", - "mfa.disable_confirm_btn": "Désactiver la 2FA", - "mfa.disabled_success": "La 2FA a été désactivée.", - "mfa.fill_all_fields": "Veuillez remplir tous les champs.", - "bookslm.title": "BooksLM", - "bookslm.files_indexed": "{count} fichiers indexés", - "bookslm.chars_loaded": "{chars} caractères chargés", - "bookslm.placeholder": "", - "bookslm.send": "Envoyer", - "bookslm.new_conversation": "Nouvelle conversation", - "bookslm.export": "Exporter la conversation", - "bookslm.toggle_sidebar": "Masquer/Afficher la sidebar AI", - "bookslm.copy": "Copier", - "bookslm.copied": "Réponse copiée dans le presse-papiers", - "bookslm.error": "Erreur du service AI", - "bookslm.regenerate": "Régénérer", - "bookslm.suggestion_summary": "Résume ce répertoire", - "bookslm.suggestion_themes": "Quels sont les thèmes principaux ?", - "bookslm.suggestion_contradictions": "Y a-t-il des contradictions entre ces documents ?", - "bookslm.no_context": "Aucun fichier trouvé dans ce répertoire", - "bookslm.context_too_large": "Répertoire trop volumineux — certains fichiers ont été tronqués", - "bookslm.source": "Source", - "bookslm.session_history": "Historique des sessions", - "bookslm.session_delete": "Supprimer la session", - "bookslm.history_empty": "Aucune session enregistrée", - "bookslm.untitled": "Conversation sans titre", - "bookslm.no_vault": "Aucun vault actif pour ouvrir ce lien", - "bookslm.copied_name": "Nom copié : {name}", - "palette.bookslm_open": "BooksLM: Ouvrir pour le répertoire courant", - "palette.bookslm_open_desc": "Ouvre l'assistant AI pour le contexte courant (documents ouverts ou général)", - "palette.bookslm_new": "BooksLM: Nouvelle conversation", - "palette.bookslm_new_desc": "Réinitialise la conversation de l'assistant AI", - "fab.open": "Ouvrir l'assistant AI", - "fab.close": "Fermer l'assistant AI", - "mfa.webauthn_title": "Clés de sécurité (WebAuthn)", - "mfa.webauthn_desc": "Authentifiez-vous avec une clé physique (YubiKey) ou la biométrie de votre appareil (Windows Hello, Touch ID).", - "mfa.webauthn_none": "Aucune clé enregistrée.", - "mfa.webauthn_add": "Ajouter une clé de sécurité", - "mfa.webauthn_label_prompt": "Nom de la clé (ex : YubiKey de poche)", - "mfa.webauthn_added": "Clé de sécurité enregistrée.", - "mfa.webauthn_removed": "Clé de sécurité supprimée.", - "mfa.webauthn_remove": "Retirer", - "mfa.webauthn_remove_confirm": "Entrez votre mot de passe pour retirer cette clé :", - "mfa.webauthn_prompt": "Présentez votre clé de sécurité ou confirmez avec Windows Hello.", - "mfa.webauthn_btn": "Valider avec ma clé", - "mfa.webauthn_cancelled": "Cérémonie WebAuthn annulée.", - "mfa.webauthn_no_key": "Aucune clé de sécurité enregistrée pour ce compte.", - "plugins.title": "🧩 Plugins", - "plugins.description": "Étendez ObsiGate avec des renderers personnalisés, filtres de recherche et actions d'éditeur.", - "plugins.install": "Installer le plugin", - "plugins.template": "Voir le modèle", - "plugins.none": "Aucun plugin installé.", - "plugins.manifest_json": "Manifeste (plugin.json)", - "plugins.code": "Code du plugin (fichier principal)", - "plugins.view_code": "Voir le code", - "plugins.uninstall": "Désinstaller", - "plugins.enable": "Activer", - "plugins.disable": "Désactiver", - "plugins.enabled": "Plugin '{name}' activé.", - "plugins.disabled": "Plugin '{name}' désactivé.", - "plugins.installed": "Plugin '{name}' installé avec succès.", - "plugins.uninstalled": "Plugin '{name}' désinstallé.", - "plugins.confirm_uninstall": "Désinstaller le plugin '{name}' ? Cette action est irréversible.", - "help.plugins_title": "🧩 Plugins", - "help.plugins_intro": "Les plugins étendent ObsiGate : affichage personnalisé des fichiers, filtres de recherche, actions d'édition, widgets et intégrations. Ils s'exécutent dans des Web Workers sandboxés — isolés de la page pour la sécurité.", - "help.plugins_install": "Installation", - "help.plugins_install_1": "Ouvrez Réglages → 🧩 Plugins.", - "help.plugins_install_2": "Cliquez « Installer un plugin ».", - "help.plugins_install_3": "Sélectionnez un fichier .zip contenant le manifest plugin.json et le code du plugin.", - "help.plugins_install_4": "Le manifest est validé (nom, version semver, hooks, permissions) avant installation.", - "help.plugins_manage": "Gestion", - "help.plugins_manage_1": "Activer / Désactiver : boutons sur chaque plugin — les hooks ne tournent que si le plugin est activé.", - "help.plugins_manage_2": "Désinstaller : supprime définitivement le plugin du vault.", - "help.plugins_manage_3": "Code : visualisez le code source du plugin installé.", - "help.plugins_dev": "Développer un plugin", - "help.plugins_dev_intro": "Téléchargez le modèle depuis Réglages → Plugins → « Obtenir le modèle ». Un plugin se compose d'un manifest plugin.json et d'un fichier principal (ex. index.js).", - "help.plugins_hooks": "Hooks disponibles", - "help.plugins_hook_render": "onFileRender", - "help.plugins_hook_render_desc": "transforme le contenu affiché d'un fichier.", - "help.plugins_hook_search": "onSearchFilter", - "help.plugins_hook_search_desc": "filtre les résultats de recherche.", - "help.plugins_hook_editor": "onEditorAction", - "help.plugins_hook_editor_desc": "intercepte les actions de l'éditeur.", - "help.plugins_hook_sidebar": "onSidebarItem", - "help.plugins_hook_sidebar_desc": "ajoute des éléments à la barre latérale.", - "help.plugins_hook_file": "onFileCreate / onFileDelete", - "help.plugins_hook_file_desc": "réagit à la création / suppression de fichiers.", - "help.plugins_hook_vault": "onVaultMount", - "help.plugins_hook_vault_desc": "exécuté au chargement d'un vault.", - "help.plugins_security": "Sécurité", - "help.plugins_security_1": "Sandbox Web Worker : le code plugin tourne isolé, sans accès direct au DOM.", - "help.plugins_security_2": "Permissions : chaque hook déclaré doit être satisfait par les permissions du manifest.", - "help.plugins_security_3": "Empaquetage sécurisé : le .zip est vérifié contre le path traversal à l'installation.", - "help.plugins_security_4": "Admin uniquement : l'installation et la suppression requièrent le rôle admin.", - "help.plugins_template": "Utilisez le bouton Template dans Paramètres > Plugins pour générer un plugin starter valide.", - "help.excalidraw_title": "🎨 Diagrammes Excalidraw", - "help.excalidraw_intro": "Les fichiers .excalidraw et .excalidraw.md s'ouvrent dans un éditeur visuel Excalidraw complet, intégré dans une iframe sandboxée.", - "help.excalidraw_open_title": "Ouverture", - "help.excalidraw_open": "Cliquez sur un fichier .excalidraw dans l'arborescence : l'éditeur s'ouvre à la place du viewer markdown.", - "help.excalidraw_edit": "Dessinez, ajoutez des formes, du texte, des flèches et des images — l'expérience Excalidraw complète.", - "help.excalidraw_save_title": "Sauvegarde", - "help.excalidraw_save": "Les modifications sont sauvegardées automatiquement (2 s) ou avec Ctrl+S. L'éditeur suit le thème clair/sombre.", - "help.excalidraw_search_title": "Recherche", - "help.excalidraw_search": "Le texte des éléments du diagramme est extrait à l'indexation : il est donc recherchable via la recherche full-text.", - "help.excalidraw_compat": "Les fichiers créés avec le plugin Obsidian Excalidraw (y compris le format .excalidraw.md compressé) sont compatibles.", - "help.footer_tagline": "- Porte d'entrée web pour vos vaults Obsidian" +{ + "_meta": { + "locale": "fr", + "name": "Français" + }, + "about.api_version": "Version API", + "about.backend": "Backend", + "about.browser": "Navigateur", + "about.built_with": "Construit avec", + "about.editor": "Éditeur", + "about.file_watcher": "Surveillance fichiers", + "about.files": "Fichiers", + "about.files_indexed": "Fichiers indexés", + "about.footer": "Fait avec ☕, 🍕 et quelques git push --force accidentels.", + "about.frontend": "Frontend", + "about.fun_quote": "« Aucun LLM n'a été blessé durant ce développement. »", + "about.git": "Git : —", + "about.icons": "Icônes", + "about.joke_0": "0 bug connu. Les autres sont timides.", + "about.joke_1": "Compile du premier coup. (Sauf le lundi matin.)", + "about.joke_2": "Écrit par un humain. Probablement.", + "about.joke_3": "Aucun LLM n'a été blessé durant ce développement.", + "about.joke_4": "Quand ça marche, on appelle ça une feature.", + "about.joke_5": "CSS: 90% du temps de dev, 10% du code.", + "about.joke_6": "Dark mode activé depuis la naissance du projet.", + "about.joke_7": "Ça marche sur ma machine™", + "about.joke_8": "Techniquement, tout est un edge case.", + "about.joke_9": "Le CSS de ce panneau a pris plus de temps que le backend.", + "about.language": "Langue", + "about.last_delivery": "Dernière livraison : Juin 2026", + "about.made_with": "Fait avec ☕, 🎧 et quelques git push --force accidentels.", + "about.markdown_renderer": "Rendu Markdown", + "about.name": "Nom", + "about.platform": "Plateforme", + "about.section_app": "Application", + "about.section_components": "Composants", + "about.section_env": "Environnement", + "about.status": "Statut", + "about.subtitle": "Vos notes Obsidian, simplement accessibles.", + "about.syntax_highlight": "Coloration syntaxe", + "about.tagline": "Vos notes Obsidian,
simplement accessibles.", + "about.tests": "Tests", + "about.vaults_configured": "Vaults configurés", + "about.version": "Version", + "admin.audit_all_actions": "Toutes les actions", + "admin.audit_empty": "Aucun log disponible", + "admin.audit_filter_action": "Action", + "admin.audit_filter_user": "Filtrer par utilisateur", + "admin.audit_refresh": "Rafraîchir", + "admin.audit_title": "Logs d'audit", + "admin.back_btn": "← Retour", + "admin.backups_newest": "Plus récent : {days} jours", + "admin.backups_oldest": "Plus ancien : {days} jours", + "admin.backups_per_vault": "Par vault", + "admin.backups_title": "Statistiques backups", + "admin.backups_total": "Total : {count} backups ({size})", + "admin.backups_vault_empty": "Aucun backup", + "admin.close": "Fermer", + "admin.col_actions": "Actions", + "admin.col_last_login": "Dernière connexion", + "admin.col_role": "Rôle", + "admin.col_status": "Statut", + "admin.col_user": "Utilisateur", + "admin.col_vaults": "Vaults", + "admin.forbidden_msg": "Vous devez être administrateur pour accéder à cette page.", + "admin.forbidden_title": "Accès refusé", + "admin.header_subtitle": "Tableau de bord administrateur", + "admin.new_user": "+ Nouvel utilisateur", + "admin.page_title": "ObsiGate — Administration", + "admin.stats_cpu": "CPU", + "admin.stats_disk": "Disque", + "admin.stats_memory": "Mémoire", + "admin.stats_refresh": "Dernière mise à jour : {time}", + "admin.stats_sessions": "Sessions actives", + "admin.stats_title": "Statistiques temps réel", + "admin.stats_uptime": "Uptime", + "admin.title": "Administration — Utilisateurs", + "admin.users_manage_btn": "Gérer les utilisateurs", + "admin.users_manage_hint": "Ouvrir la modale de gestion des utilisateurs (CRUD complet)", + "admin.users_title": "Gestion utilisateurs", + "ai.action_applied": "Appliqué ✓", + "ai.action_apply": "Appliquer", + "ai.action_applying": "Application…", + "ai.action_create_dir": "Créer le dossier {path}", + "ai.action_create_file": "Créer le fichier {path}", + "ai.action_created_dir": "Dossier créé : {path}", + "ai.action_created_file": "Fichier créé : {path}", + "ai.action_failed": "Échec de l'action : {error}", + "ai.agent_mode_off": "Mode agent désactivé (lecture/recherche + actions)", + "ai.agent_mode_on": "Mode agent activé (outils de lecture/recherche + actions)", + "ai.casual": "Ton décontracté", + "ai.close": "Fermer l'assistant", + "ai.completion_added": "AI: complétion ajoutée", + "ai.context_documents": "{count} document(s) ouvert(s)", + "ai.context_general": "Contexte général", + "ai.context_general_desc": "Questions sur l'application et création de fichiers", + "ai.continue": "Continuer", + "ai.custom_rewrite": "Réécriture personnalisée", + "ai.diff_preview": "Aperçu des modifications", + "ai.done": "AI: texte traité", + "ai.edit": "Éditer", + "ai.error_invalid_key": "clé API invalide", + "ai.explain": "Expliquer", + "ai.fix_spelling": "Corriger l'orthographe", + "ai.fix_spelling_hint": "Corrige les fautes", + "ai.frontmatter": "Générer frontmatter", + "ai.fullscreen": "Plein écran", + "ai.generate": "Générer", + "ai.hint_add_details": "Ajoute des détails", + "ai.hint_edit_selection": "Modifie le texte sélectionné", + "ai.hint_generate": "Génère du contenu à partir de la sélection", + "ai.hint_improve": "Améliore la qualité du texte", + "ai.hint_translate": "Traduit le texte sélectionné", + "ai.improve": "Améliorer", + "ai.input_hint": "Entrée pour envoyer · Ctrl+Entrée pour un saut de ligne", + "ai.inline_completion_title": "AI Inline Completion (Ctrl+J) — Complète le texte automatiquement", + "ai.invalid_api_key": "AI: clé API invalide. Vérifiez DEEPSEEK_API_KEY dans .env", + "ai.longer": "Allonger", + "ai.no_api_key": "Aucune clé API configurée", + "ai.not_configured": "⚠️ AI non configuré — ajouter DEEPSEEK_API_KEY, OPENROUTER_API_KEY ou GEMINI_API_KEY dans .env", + "ai.processing": "⏳ AI: traitement en cours...", + "ai.professional": "Ton professionnel", + "ai.provider": "Fournisseur", + "ai.provider_default": "— défaut —", + "ai.model": "Modèle", + "ai.model_default": "— défaut —", + "ai.model_loading": "Chargement…", + "ai.model_offline": "hors ligne", + "ai.model_load_error": "Erreur de chargement", + "ai.model_settings": "Fournisseur & modèle", + "ai.model_search": "Rechercher un modèle…", + "ai.model_info": "Capacités du modèle", + "ai.model_more": "… {count} autres — affinez la recherche", + "ai.add_context": "Ajouter un contexte", + "ai.attach_image": "Joindre une image", + "ai.cap_audio_speech": "Audio Speech", + "ai.cap_audio_transcription": "Audio Transcriptions", + "ai.cap_chat": "Chat", + "ai.cap_embeddings": "Embeddings", + "ai.cap_images": "Images", + "ai.cap_rerank": "Rerank", + "ai.cap_video": "Video", + "ai.cap_vision": "Vision capable", + "ai.commands": "Commandes", + "ai.activity_sending": "Envoi de la requête…", + "ai.activity_streaming": "Réponse en cours…", + "ai.activity_tool": "Outil : {name}…", + "ai.activity_confirmation": "En attente de confirmation…", + "ai.activity_error": "Échec de la requête", + "ai.activity_done": "Terminé", + "ai.composer_label": "Message à l'assistant", + "ai.create_skill": "Créer un skill", + "ai.image": "image", + "ai.keys": "Clés API enregistrées", + "ai.model_changed": "Modèle changé : {name}", + "ai.no_results": "Aucun résultat", + "ai.none": "Aucun", + "ai.provider_changed": "Fournisseur changé : {name}", + "ai.providers": "Fournisseurs actifs", + "ai.remove": "Retirer", + "ai.resize_panel": "Redimensionner le panneau", + "ai.skill_created": "Skill « {name} » créé", + "ai.skill_id": "Identifiant", + "ai.skill_label": "Nom", + "ai.skill_prompt": "Prompt / instructions", + "ai.skill_prompt_placeholder": "Décris le comportement attendu du skill…", + "ai.usage_model": "Modèles disponibles : {list}", + "ai.usage_provider": "Fournisseurs disponibles : {list}", + "ai.vision_unsupported": "Le modèle sélectionné ne supporte pas l'analyse d'images", + "ai.quota_exceeded": "AI: quota dépassé ou paiement requis", + "ai.rewrite": "💬 Réécrire", + "ai.rewrite_done": "AI: texte réécrit", + "ai.rewrite_prompt": "Instruction de réécriture :", + "ai.rewrite_placeholder": "Ex. : rends le ton plus formel et ajoute une conclusion", + "ai.rewrite_title": "Réécrit le texte selon vos instructions", + "ai.select_text": "AI: sélectionnez du texte à traiter", + "ai.shorter": "Raccourcir", + "ai.shorter_hint": "Rend le texte plus concis", + "ai.simplify": "Simplifier", + "ai.simplify_hint": "Simplifie le langage", + "ai.suggestion_capabilities": "Que sais-tu faire ?", + "ai.suggestion_create_file": "Crée un fichier de notes de réunion", + "ai.suggestion_docs_contradictions": "Y a-t-il des contradictions entre ces documents ?", + "ai.suggestion_docs_keypoints": "Quels sont les points clés de ces documents ?", + "ai.suggestion_docs_summary": "Résume les documents ouverts", + "ai.suggestion_search": "Comment rechercher efficacement dans mes notes ?", + "ai.summarize": "Résumer", + "ai.text_processed": "AI: texte traité ✓", + "ai.text_rewritten": "AI: texte réécrit", + "ai.to_canvas": "Convertir en Canvas", + "ai.to_list": "Convertir en liste", + "ai.to_table": "Convertir en tableau", + "ai.tone_hint": "Change le ton du texte", + "ai.tool_call": "Outil : {name}", + "ai.tool_call_failed": "Outil {name} en échec", + "ai.toolbar_edit": "Éditer", + "ai.toolbar_generate": "Générer", + "ai.toolbar_rewrite": "Réécrire", + "ai.toolbar_tone": "Ton", + "ai.toolbar_toolbox": "Toolbox", + "ai.toolbar_translate": "Traduire", + "ai.toolbox": "🧰 Boîte", + "ai.toolbox_hint": "Outils de conversion", + "ai.translate_to": "Traduire en {lang}", + "auth.cannot_delete_self": "Impossible de supprimer son propre compte", + "auth.logged_out": "Déconnecté", + "auth.login_button": "Se connecter", + "auth.login_error": "Identifiants invalides", + "auth.login_title": "Accès sécurisé à vos vaults", + "auth.logout_title": "Déconnexion", + "auth.network_error": "Erreur réseau — vérifiez votre connexion", + "auth.new_password": "Nouveau mot de passe (vide = inchangé)", + "auth.password": "Mot de passe", + "auth.password_min": "Min. 8 caracteres", + "auth.remember_me": "Se souvenir de moi (30 jours)", + "auth.session_expired": "Session expirée, veuillez vous reconnecter", + "auth.user_deleted": "Utilisateur supprimé", + "auth.username": "Nom d'utilisateur", + "auto.0257e77f": "🧰 Boîte ▾", + "auto.033a9ddf": "Modèle par défaut", + "auto.03a6e5b1": "Les opérateurs utilisés s'affichent sous forme\n de chips colorés :", + "auto.13c3ee2c": "Recherche et autocomplétion", + "auto.13eb7a51": "AI: clé API invalide", + "auto.14c75ac6": "Sélectionnez les événements souhaités", + "auto.195a8e44": "Créer répertoire", + "auto.1a54bd69": "Exemple combiné", + "auto.1a8a8118": "Glisser-déposer", + "auto.1abf6661": "Le chemin affiché au-dessus du contenu est\n interactif :", + "auto.1d3330cc": "Pas de retry automatique en cas d'échec", + "auto.1d46301c": "Numéros de ligne", + "auto.1efbbc9a": "Édition avec CodeMirror 6", + "auto.209c5490": "La barre supérieure contient les éléments\n essentiels :", + "auto.272dd29a": "Providers supportés", + "auto.27a2f7c1": "ObsiGate supporte l'ouverture de plusieurs\n fichiers simultanément dans des onglets.", + "auto.28bf6aab": "Sécurité : signature HMAC-SHA256", + "auto.2a5af19b": "Le workflow se déclenche automatiquement à\n chaque événement", + "auto.2bc24d2e": "Toutes les opérations sensibles sont tracées\n dans un journal.", + "auto.2bc66bab": "Création de dossier via l'API", + "auto.337d8626": "Thème clair/sombre", + "auto.37561472": "🛡️ Sécurité", + "auto.396d0dd8": "La barre d'outils AI apparaît sous le titre\n de l'éditeur", + "auto.3be698f6": "Favorisez les opérateurs", + "auto.404c8f1c": "L'autocomplétion vous aide à trouver rapidement\n :", + "auto.41d7c6af": "Répertoire dédié", + "auto.460b8298": "Données", + "auto.4bc1f00a": "Utilisez des opérateurs pour affiner votre\n recherche :", + "auto.4c908ade": "Cliquez sur un vault pour l'ouvrir et voir son\n contenu. Les dossiers affichent un chevron et un\n badge avec le nombre d'éléments.", + "auto.4d281c6c": "AI: texte traité ✓", + "auto.4dfa6a25": "Pas de filtrage par vault — un webhook\n écoute toutes les vaults", + "auto.4fa5d7c2": "Édition rapide", + "auto.559ef1da": "Workflow recommandé", + "auto.598a0ca7": "Événements tracés", + "auto.5a486420": "Supprimer répertoire", + "auto.5d4a2516": "Ouvrez un fichier en mode Édition (bouton ✏️\n Éditer)", + "auto.5d936af6": "Regex générée", + "auto.62c3d50d": "💬 Réécrire", + "auto.678711b5": "Sélectionnez un contexte", + "auto.695d9e47": "Éditeur CodeMirror 6", + "auto.6c166d35": "ObsiGate est votre porte d'entrée web vers\n vos vaults Obsidian. Accédez, naviguez et\n recherchez dans toutes vos notes depuis\n n'importe quel appareil via une interface\n moderne et responsive.", + "auto.72e515fa": "Contrôle d'accès par vault", + "auto.753d30a8": "Ouvrez un fichier pour le voir\n apparaître ici", + "auto.774dbd63": "La palette de commandes permet d'accéder\n rapidement aux fichiers et aux actions sans\n utiliser la souris.", + "auto.79f6e1dd": "Multi-fenêtres", + "auto.7c9cdc3c": "Cochez les événements à écouter", + "auto.7e13c97a": "Ces paramètres s'appliquent immédiatement\n côté client.", + "auto.83a0efdf": "Réindexation", + "auto.9122fd5c": "Configuration avancée", + "auto.98c547ea": "ne déclenchent pas", + "auto.a05514cb": "Création via l'API ou la palette", + "auto.a105a2d9": "Éditer ▾", + "auto.a131dfab": "Éditeur CodeMirror", + "auto.a232672b": "Déploiement", + "auto.a3319169": "📦 À propos", + "auto.aa8ca265": "La vue utilise l'algorithme Barnes-Hut pour\n calculer la disposition en O(n log n),\n garantissant des performances fluides même avec\n des centaines de nœuds.", + "auto.ab5e6155": "ObsiGate crée automatiquement des sauvegardes\n avant chaque modification destructive.", + "auto.aedff644": "Créer fichier markdown", + "auto.b114ed1c": "Ces paramètres sont sauvegardés sur le\n serveur. Certains nécessitent un redémarrage\n ou une réindexation.", + "auto.b419c2c2": "Récepteur Python (Flask)", + "auto.b86ba5ea": "Recherche multi-critères", + "auto.b893650a": "Éditer fichier courant", + "auto.ba768f01": "Événements supportés", + "auto.c089d968": "Épinglez des fichiers pour les retrouver\n ici.", + "auto.c14b5603": "🎨 Thèmes", + "auto.c4922a99": "🤖 Intelligence Artificielle dans l'Éditeur", + "auto.caac40b9": "Choisissez un thème visuel. Chaque thème\n offre un mode sombre et clair.", + "auto.cd7332c8": "Les résultats incluent des facettes pour affiner\n :", + "auto.ce4eb802": "Générer ▾", + "auto.d33601dc": "Surveillance des fichiers en temps réel via\n watchdog. Les modifications sont détectées\n automatiquement et l'index est mis à jour\n sans redémarrage.", + "auto.d4d28717": "Déclencheur", + "auto.e0b8a606": "Définissez les patterns de tags à masquer\n dans la sidebar. Vous pouvez utiliser des\n wildcards pour cibler les tags de template.", + "auto.e61598c1": "Partagez un document pour le voir\n apparaître ici", + "auto.ec7260fa": "Types de fichiers supportés", + "auto.edf89626": "L'éditeur intégré offre :", + "auto.ef8c5f4d": "L'éditeur intégré offre une expérience complète\n d'édition :", + "auto.f346076a": "✏️ Édition avancée", + "auto.f5a8c116": "Événement", + "auto.f8ba6127": "🗂️ Fichiers cachés", + "auto.fc694490": "Suppression via l'API ou l'éditeur", + "backup.delete": "Supprimer", + "backup.diff": "Comparer", + "backup.file_restored": "Fichier restauré avec succès", + "backup.no_backups": "Aucune sauvegarde", + "backup.preview": "Aperçu", + "backup.purge": "Purger", + "backup.restore": "Restaurer", + "backup.restore_failed": "Échec de la restauration", + "backup.select_to_restore": "Sélectionnez un backup à restaurer", + "backup.timestamp_not_found": "Impossible de trouver le timestamp du backup", + "backup.title": "Sauvegardes", + "backup.version": "Version du {date}", + "backups.delete_confirm": "Supprimer ce backup ?", + "backups.empty": "Aucun backup disponible pour ce fichier.", + "backups.hint": "Les backups sont crees automatiquement avant chaque modification.", + "backups.loading": "Chargement des backups...", + "backups.purge_file": "Supprimer TOUS les backups de", + "backups.purge_vault": "Supprimer TOUS les backups du vault", + "backups.restore_confirm": "a la version du backup selectionne ?\nLa version actuelle sera sauvegardee.", + "backups.title": "Backups", + "button.cancel": "Annuler", + "common.actions": "Actions", + "common.all": "Tous", + "common.back": "Retour", + "common.cancel": "Annuler", + "common.close": "Fermer", + "common.confirm": "Confirmer", + "common.copied": "Copié !", + "common.copy": "Copier", + "common.create": "Créer", + "common.delete": "Supprimer", + "common.download": "Télécharger", + "common.edit": "Éditer", + "common.error": "Erreur", + "common.loading": "Chargement...", + "common.move": "Déplacer", + "common.never": "Jamais", + "common.next": "Suivant", + "common.no": "Non", + "common.none": "Aucun", + "common.ok": "OK", + "common.previous": "Précédent", + "common.refresh": "Rafraîchir", + "common.rename": "Renommer", + "common.root": "(racine)", + "common.save": "Enregistrer", + "common.search": "Rechercher", + "common.unknown": "Inconnue", + "common.yes": "Oui", + "collab.peers_title": "{count} personne(s) connectée(s)", + "collab.presence_title": "Collaboration temps réel", + "collab.status_connected": "Collaboration active", + "collab.status_connecting": "Connexion à la collaboration…", + "collab.status_disconnected": "Collaboration interrompue — reconnexion…", + "config.about": "À propos", + "config.about_error": "Erreur de chargement", + "config.about_loading": "Chargement...", + "config.add_webhook": "Ajouter", + "config.ai_deepseek_label": "DeepSeek API Key", + "config.ai_default_model": "Modèle par défaut", + "config.ai_capabilities": "Capacités du modèle", + "config.ai_default_provider": "Fournisseur par défaut", + "config.ai_gemini_label": "Gemini API Key", + "config.ai_keys": "Clés API IA", + "config.ai_keys_desc": "Configurez les clés API pour l'éditeur IA.", + "config.ai_model": "Modèle", + "config.ai_openrouter_label": "OpenRouter API Key", + "config.api_keys_saved": "Clés API sauvegardées", + "config.backups": "Sauvegardes", + "config.backups_desc": "Gérez les sauvegardes automatiques de vos fichiers.", + "config.client_config": "Configuration client", + "config.create_share": "Créer un partage", + "config.debounce_label": "Délai debounce (ms)", + "config.diagnostics": "Diagnostics", + "config.diagnostics_desc": "Informations techniques sur l'état du serveur.", + "config.display_name": "Nom d'affichage", + "config.error_prefix": "Erreur", + "config.error_unknown": "Erreur inconnue", + "config.force_reindex": "Forcer réindexation", + "config.hidden_files": "Fichiers cachés", + "config.hidden_files_desc": "Masquer les fichiers/dossiers commencant par un point dans l'interface (ils restent indexes et cherchables)", + "config.hidden_files_toggle": "Masquer les fichiers/dossiers caches", + "config.hidden_include_label": "Inclure les fichiers cachés", + "config.hidden_whitelist_label": "Whitelist (séparés par des virgules)", + "config.hint_activer_d_sactiver_la_surveillance_automatique_des": "Activer/désactiver la surveillance automatique des fichiers", + "config.hint_annuler_la_recherche_apr_s_ce_d_lai_5000_120000_": "Annuler la recherche après ce délai (5000-120000)", + "config.hint_contenu_index_par_fichier_10k_1m_r_indexation_requ": "Contenu indexé par fichier (10K-1M). Réindexation requise.", + "config.hint_d_lai_avant_ex_cution_de_la_recherche_100_2000_": "Délai avant exécution de la recherche (100-2000)", + "config.hint_d_lai_avant_traitement_des_changements_group_s_0_5": "Délai avant traitement des changements groupés (0.5-10 secondes)", + "config.hint_entre_5_et_100_fichiers_sauvegarde_sur_le_serveur_": "Entre 5 et 100 fichiers (sauvegarde sur le serveur)", + "config.hint_forcer_le_mode_polling_au_lieu_de_inotify_natif_ut": "Forcer le mode polling au lieu de inotify natif (utile si le mode natif ne fonctionne pas)", + "config.hint_intervalle_de_scrutation_en_mode_polling_1_30_seco": "Intervalle de scrutation en mode polling (1-30 secondes)", + "config.hint_multiplicateur_de_pertinence_pour_les_correspondan": "Multiplicateur de pertinence pour les correspondances dans le titre", + "config.hint_nombre_de_r_sultats_affich_s_par_page_10_200_": "Nombre de résultats affichés par page (10-200)", + "config.hint_nombre_max_de_tokens_largis_par_pr_fixe_10_200_": "Nombre max de tokens élargis par préfixe (10-200)", + "config.hint_nombre_maximum_de_versions_backup_conservees_par_f": "Nombre maximum de versions backup conservees par fichier (1-50)", + "config.hint_nombre_minimum_de_caract_res_avant_recherche_1_5_": "Nombre minimum de caractères avant recherche (1-5)", + "config.hint_threads_d_di_s_la_recherche_1_8_": "Threads dédiés à la recherche (1-8)", + "config.just_now": "a l'instant", + "config.lang_hint": "Utilisée par l'autocomplétion et le ghost text.", + "config.lang_label": "Langue préférée", + "config.link_copied": "Lien copié !", + "config.link_created": "Lien créé !", + "config.logout": "Déconnexion", + "config.max_backups": "Max backups par fichier", + "config.max_backups_desc": "Nombre maximum de versions backup conservées par fichier (1-50)", + "config.max_backups_label": "Max backups par fichier", + "config.max_content_hint": "Contenu indexé par fichier (10K-1M). Réindexation requise.", + "config.max_content_label": "Taille max contenu (octets)", + "config.max_content_size": "Taille max contenu (octets)", + "config.max_prefix_expansions": "Expansions préfixe max", + "config.min_query_label": "Longueur min. requête", + "config.min_query_length": "Longueur min. requête", + "config.name_placeholder": "Votre nom", + "config.no_keys": "Aucune clé à sauvegarder", + "config.no_restart": "Redémarrage non requis", + "config.note": "Note :", + "config.open_new_window": "Ouvrir dans nouvelle fenêtre", + "config.prefix_expansions_hint": "Nombre max de tokens élargis par préfixe (10-200)", + "config.prefix_expansions_label": "Expansions préfixe max", + "config.profile": "Profil utilisateur", + "config.profile_desc": "Préférences personnelles pour personnaliser l'expérience ObsiGate.", + "config.project_repo": "dépôt du projet", + "config.recent_history_count": "Nombre de fichiers dans l'historique", + "config.recent_history_count_desc": "Entre 5 et 100 fichiers (sauvegarde sur le serveur)", + "config.reindex": "Réindexer", + "config.reindex_desc": "Reconstruire l'index de recherche pour toutes les vaults.", + "config.reindex_error": "Erreur de réindexation", + "config.reindexing": "Réindexation...", + "config.reset": "Réinitialiser", + "config.restart_required": "Redémarrage requis", + "config.results_per_page": "Résultats par page", + "config.results_per_page_label": "Résultats par page", + "config.save": "Enregistrer", + "config.save_ai_keys": "Enregistrer les clés", + "config.save_backend": "Sauvegarder la configuration serveur", + "config.save_error": "Erreur de sauvegarde", + "config.save_hidden": "Enregistrer", + "config.saved": "✓ Sauvegardé", + "config.saving": "Sauvegarde", + "config.search_timeout": "Timeout recherche (ms)", + "config.search_workers": "Workers de recherche", + "config.search_workers_hint": "Threads dédiés à la recherche (1-8)", + "config.search_workers_label": "Workers de recherche", + "config.section_a-propos": "📦 À propos", + "config.section_about": "À propos", + "config.section_actions-sur-fichiers": "Actions sur fichiers", + "config.section_activation": "Activation", + "config.section_affichage": "Affichage", + "config.section_ai": "Clés API IA", + "config.section_arborescence-des-vaults": "Arborescence des vaults", + "config.section_astuces-et-bonnes-pratiques": "💡 Astuces et bonnes pratiques", + "config.section_audit-log": "Audit log", + "config.section_authentification": "Authentification", + "config.section_autocompletion": "Autocomplétion", + "config.section_backend": "🖥️ Paramètres backend", + "config.section_backup-automatique": "Backup automatique", + "config.section_backups": "Sauvegardes", + "config.section_barre-d-outils-ai": "Barre d'outils AI", + "config.section_breadcrumb-et-repositionnement": "Breadcrumb et repositionnement", + "config.section_cas-d-usage": "Cas d'usage", + "config.section_cas-d-usage-avances": "Cas d'usage avancés", + "config.section_chips-de-filtres-actifs": "Chips de filtres actifs", + "config.section_cles-api-intelligence-artificielle": "🤖 Cles API Intelligence Artificielle", + "config.section_configuration": "Configuration", + "config.section_configuration-avancee": "Configuration avancée", + "config.section_construit-avec": "Construit avec", + "config.section_diag": "Diagnostics", + "config.section_diagnostics": "Diagnostics", + "config.section_editeur-codemirror": "Éditeur CodeMirror", + "config.section_editeur-codemirror-6": "Éditeur CodeMirror 6", + "config.section_edition-avancee": "✏️ Édition avancée", + "config.section_edition-avec-codemirror-6": "Édition avec CodeMirror 6", + "config.section_en-tete": "En-tête", + "config.section_evenements-supportes": "Événements supportés", + "config.section_exemples-concrets": "Exemples concrets", + "config.section_facettes-et-tri": "Facettes et tri", + "config.section_fichiers": "📄 Fichiers", + "config.section_filtrage-de-la-sidebar": "Filtrage de la sidebar", + "config.section_filtrage-de-tags": "Filtrage de tags", + "config.section_filtrage-de-tags-template": "Filtrage de tags template", + "config.section_fonctionnalites": "Fonctionnalités", + "config.section_format-du-payload": "Format du payload", + "config.section_gestion-des-onglets": "📑 Gestion des onglets", + "config.section_hidden": "Fichiers cachés", + "config.section_historique-recent-redemarrage-non-requis": "📋 Historique récent\n Redémarrage non requis", + "config.section_indicateurs-visuels": "Indicateurs visuels", + "config.section_intelligence-artificielle-dans-l-editeur": "🤖 Intelligence Artificielle dans l'Éditeur", + "config.section_interaction": "Interaction", + "config.section_interface": "Interface", + "config.section_interface-utilisateur": "🧭 Interface utilisateur", + "config.section_limitations-actuelles": "Limitations actuelles", + "config.section_mode-commandes": "Mode commandes", + "config.section_mode-fichiers": "Mode fichiers", + "config.section_navigation": "Navigation", + "config.section_navigation-entre-onglets": "Navigation entre onglets", + "config.section_onglets": "Onglets", + "config.section_operateurs-avances": "Opérateurs avancés", + "config.section_optimisations": "Optimisations", + "config.section_ouverture": "Ouverture", + "config.section_ouverture-d-onglets": "Ouverture d'onglets", + "config.section_palette-de-commandes": "⌨️ Palette de commandes", + "config.section_parametres-backend-redemarrage-requis": "Paramètres backend\n Redémarrage requis", + "config.section_parametres-de-recherche": "Paramètres de recherche", + "config.section_partage-et-webhooks": "🔗 Partage et Webhooks", + "config.section_partages-publics": "📤 Partages publics", + "config.section_perf": "Performance", + "config.section_performance": "Performance", + "config.section_personnalisation": "🎨 Personnalisation", + "config.section_profil-utilisateur": "👤 Profil utilisateur", + "config.section_profile": "Profil utilisateur", + "config.section_protection": "Protection", + "config.section_providers-supportes": "Providers supportés", + "config.section_publication-publique": "Publication publique", + "config.section_raccourcis-clavier": "⌨️ Raccourcis clavier", + "config.section_recent": "📜 Historique récent", + "config.section_recherche": "🔍 Recherche", + "config.section_recherche-et-autocompletion": "Recherche et autocomplétion", + "config.section_recherche-simple": "Recherche simple", + "config.section_redimensionnement-de-la-sidebar": "Redimensionnement de la sidebar", + "config.section_sauvegarde-automatique": "Sauvegarde automatique", + "config.section_sauvegardes-et-audits": "💾 Sauvegardes et Audits", + "config.section_search": "Paramètres de recherche", + "config.section_securite": "🛡️ Sécurité", + "config.section_securite-signature-hmac-sha256": "Sécurité : signature HMAC-SHA256", + "config.section_selection-de-vault": "Sélection de vault", + "config.section_server": "Serveur", + "config.section_shares": "Partages publics", + "config.section_sidebar-barre-laterale": "Sidebar (barre latérale)", + "config.section_synchronisation-automatique": "Synchronisation automatique", + "config.section_tag-cloud": "Tag cloud", + "config.section_tags": "🏷️ Tags", + "config.section_tags-inline-vs-frontmatter": "Tags inline vs frontmatter", + "config.section_theme-clair-sombre": "Thème clair/sombre", + "config.section_themes": "🎨 Thèmes", + "config.section_trucs-et-astuces": "Trucs et astuces", + "config.section_types-de-fichiers-supportes": "Types de fichiers supportés", + "config.section_visualisation": "Visualisation", + "config.section_vue-graphe": "🗺️ Vue Graphe", + "config.section_watcher": "Synchronisation automatique", + "config.section_webhooks": "🪝 Webhooks", + "config.section_push": "🔔 Notifications push", + "config.section_plugins": "🧩 Plugins", + "config.section_workflow-recommande": "Workflow recommandé", + "config.section_zone-de-contenu": "Zone de contenu", + "config.server_config": "Configuration serveur", + "config.settings_saved": "✓ Paramètres sauvegardés", + "config.share_revoked": "Partage révoqué", + "config.shares": "Partages publics", + "config.shares_desc": "Gérez les liens de partage public de vos documents.", + "config.shares_empty": "Aucun partage actif", + "config.tag_boost_hint": "Multiplicateur de pertinence pour les correspondances dans les tags", + "config.tag_boost_label": "Boost tags", + "config.tag_filtering_label": "Filtrage de tags", + "config.test": "Tester", + "config.timeout_label": "Timeout recherche (ms)", + "config.title": "Configuration", + "config.title_boost": "Boost titre", + "config.title_boost_hint": "Multiplicateur de pertinence pour les correspondances dans le titre", + "config.title_boost_label": "Boost titre", + "config.url_required": "URL requise", + "config.watcher_debounce_label": "Debounce (s)", + "config.watcher_enabled_label": "Activer la surveillance", + "config.watcher_interval_label": "Intervalle polling (s)", + "config.watcher_polling_label": "Mode polling (fallback)", + "config.webhook_name_placeholder": "Nom", + "config.webhook_url_placeholder": "URL", + "config.webhooks": "Webhooks", + "config.webhooks_desc": "Notifications HTTP vers des services externes lors des changements de fichiers.", + "config.plugins": "Plugins", + "config.plugins_desc": "Gérer les plugins installés pour ce vault.", + "config.workers_label": "Workers de recherche", + "confirm.delete_dir": "Supprimer ce dossier et tout son contenu ?", + "confirm.delete_dir_named": "Supprimer \"{path}\" et TOUT son contenu ?", + "confirm.delete_file": "Supprimer définitivement ce fichier ?", + "confirm.delete_file_named": "Supprimer le fichier \"{path}\" ?", + "confirm.logout": "Voulez-vous vraiment vous déconnecter ?", + "conflict.no_conflicts": "Aucun conflit détecté", + "conflict.resolve_conflict": "Garder version conflit", + "conflict.resolve_local": "Garder version locale", + "conflict.resolved": "Conflit résolu", + "dashboard.all_vaults": "Tous les vaults", + "dashboard.bookmark_add": "Ajouter aux bookmarks", + "dashboard.bookmark_remove": "Retirer des bookmarks", + "dashboard.bookmarks": "Favoris", + "dashboard.conflict_date": "Conflit du ", + "dashboard.conflict_resolved": "Conflit résolu", + "dashboard.conflicts": "Conflits", + "dashboard.conflicts_title": "Conflits de synchronisation", + "dashboard.copy_btn": "Copier", + "dashboard.count_files": "fichier", + "dashboard.count_files_plural": "fichiers", + "dashboard.ctrl_hover_tip": "Survolez un document avec Ctrl pour un aperçu rapide. Cliquez sur Forge dans la barre d'outils pour l'éditeur avancé.", + "dashboard.day_ago": "il y a {n} j", + "dashboard.error_prefix": "Erreur: ", + "dashboard.expires": "Expire le {date}", + "dashboard.hide": "Masquer", + "dashboard.hour_ago": "il y a {n} h", + "dashboard.just_now": "à l'instant", + "dashboard.keep_conflict": "Garder le conflit", + "dashboard.keep_original": "Garder l'original", + "dashboard.load_error": "Erreur de chargement", + "dashboard.loading": "Chargement...", + "dashboard.min_ago": "il y a {n} min", + "dashboard.no_bookmarks": "Aucun favori", + "dashboard.no_conflicts": "Aucun conflit", + "dashboard.no_recent": "Aucun fichier récent", + "dashboard.no_shares": "Aucun document partagé", + "dashboard.open_btn": "Ouvrir", + "dashboard.pin_error": "Erreur lors de l'épinglage", + "dashboard.pin_hint": "Épinglez des fichiers pour les retrouver ici.", + "dashboard.quick_help": "Raccourcis & Astuces", + "dashboard.recent": "Récents", + "dashboard.recent_hint": "Ouvrez un fichier pour le voir apparaître ici", + "dashboard.shared_hint": "Partagez un document pour le voir apparaître ici", + "dashboard.shares": "Partages", + "dashboard.show": "Afficher", + "dashboard.size_bytes": " o", + "dashboard.size_gb": " Go", + "dashboard.size_kb": " Ko", + "dashboard.size_mb": " Mo", + "dashboard.stats": "Statistiques", + "dashboard.stats_files": "Fichiers", + "dashboard.stats_size": "Taille totale", + "dashboard.stats_tags": "Tags uniques", + "dashboard.stats_vaults": "Vaults", + "dashboard.tab_recent": "Récents", + "dashboard.tab_shared": "Partagés", + "dashboard.tab_stats": "Statistiques", + "dashboard.total_files": "Fichiers totaux", + "dashboard.total_size": "Taille totale", + "dashboard.total_tags": "Tags uniques", + "dashboard.vaults_count": "Vaults", + "dashboard.views": "{count} vue(s)", + "dashboard.welcome": "Bienvenue dans ObsiGate", + "dashboard.zero_files": "0 fichiers", + "dragdrop.cross_vault_unsupported": "Le déplacement entre vaults différents n'est pas supporté", + "dragdrop.move_failed": "Échec du déplacement", + "dragdrop.overlay_title": "Déposer des fichiers ou dossiers", + "dragdrop.overlay_vault_zone": "Importer dans le Vault", + "dragdrop.overlay_ai_zone": "Analyser avec l'Assistant IA", + "upload.uploading": "Téléversement de {count} fichier(s)...", + "upload.success": "{count} fichier(s) importé(s) avec succès", + "upload.partial": "{count} fichier(s) importé(s) ({errors} erreurs)", + "upload.error": "Échec de l'importation", + "upload.choose_target_folder": "Destination de l'importation", + "upload.target_vault": "Voute cible", + "upload.vault_root": "/ (Racine de la voute)", + "upload.target_directory": "Sous-répertoire cible", + "upload.filter_folders": "Filtrer ou rechercher un dossier...", + "upload.custom_folder": "Ou saisir un nouveau sous-dossier...", + "upload.import_summary": "Éléments à importer : {files} fichier(s), {dirs} dossier(s)", + "upload.import_button": "Importer", + "editor.cancel": "Annuler", + "editor.close": "Fermer", + "editor.delete_error": "Erreur de suppression", + "editor.edit": "Éditer fichier courant", + "editor.edit_current_desc": "Ouvrir le fichier actif dans l'éditeur", + "editor.find": "Rechercher dans le fichier...", + "editor.find_case": "Respecter la casse", + "editor.find_regex": "Regex", + "editor.find_whole": "Mot entier", + "editor.forge_close_editor": "Fermer l'éditeur / modale", + "editor.forge_help": "Aide de l'éditeur Forge", + "editor.no_results": "Aucun résultat", + "editor.replace": "Remplacer", + "editor.save": "Enregistrer", + "editor.save_error": "Erreur de sauvegarde", + "editor.saved": "Sauvegardé ✓", + "editor.unsaved": "Modifications non sauvegardées", + "error.initialization": "Erreur lors de l'initialisation", + "file.copy_path": "Copier le chemin", + "file.delete": "Supprimer", + "file.graph_view": "Vue graphe", + "file.new_file": "Nouveau fichier", + "file.new_folder": "Nouveau dossier", + "file.properties": "Propriétés", + "file.rename": "Renommer", + "forge.popout": "Ouvrir dans une nouvelle fenêtre", + "forge.popout_label": "pop-out", + "forge.title_placeholder": "Titre...", + "graph.back": "Retour", + "graph.btn_directory": "📁 Dossier", + "graph.btn_full": "🌐 Tout", + "graph.cache_label": "(cache)", + "graph.category": "📂 Catégorie", + "graph.click_to_open": "cliquer pour ouvrir", + "graph.ctrl_hover_preview": "Ctrl+survol = aperçu complet", + "graph.ctrl_hover_preview_short": "Ctrl+survol = aperçu", + "graph.depth": "Profondeur", + "graph.depth_label": "prof={depth}", + "graph.edges_count": "{count} liens", + "graph.error_loading": "Erreur de chargement", + "graph.export_png": "Exporter PNG", + "graph.favorites": "Favoris", + "graph.filter_tag": "Filtrer par tag", + "graph.filter_type": "Filtrer par type", + "graph.focus_mode": "Mode focus", + "graph.forward": "Avancer", + "graph.fullscreen": "Plein écran", + "graph.loading": "Construction du graphe...", + "graph.nodes_count": "{count} nœuds", + "graph.parent": "Parent", + "graph.published": "Publié", + "graph.published_badge": "✅ publié", + "graph.scope_directory": "Dossier", + "graph.scope_full": "Vault complet", + "graph.title": "Vue Graphique — {vault}{path}", + "graph.type_directory": "Dossier", + "graph.type_file": "Fichier", + "graph.type_markdown": "Markdown", + "header.admin_panel": "Administration", + "header.config": "Configuration", + "header.help": "Aide", + "header.install_app": "Installer l'application", + "header.logo": "ObsiGate", + "header.logout": "Déconnexion", + "header.menu_about": "À propos", + "header.menu_about_desc": "Version, crédits & info", + "header.menu_admin": "Administration", + "header.menu_admin_desc": "Gérer les utilisateurs", + "header.menu_api": "API", + "header.menu_api_desc": "Documentation OpenAPI", + "header.menu_config": "Configurations", + "header.menu_config_desc": "Paramètres de l'application", + "header.menu_help": "Guide d'utilisation", + "header.menu_help_desc": "Ouvrir l'aide", + "header.menu_logout": "Déconnexion", + "header.menu_logout_desc": "Quitter la session", + "header.menu_profile": "Profil", + "header.menu_profile_desc": "Langue & préférences", + "header.menu_theme": "Thème", + "header.menu_theme_light": "Clair", + "header.menu_toggle": "Menu", + "header.profile": "Profil", + "header.quick_help": "Raccourcis & Astuces", + "header.refresh": "Rafraîchir", + "header.search_placeholder": "Rechercher dans toutes les vaults...", + "header.sidebar_toggle": "Afficher/Masquer la sidebar", + "header.sync_status": "Synchronisation", + "help.00b9572b": ":\n Résultats classés par pertinence TF-IDF", + "help.04df1506": ":\n Recherche globale avec autocomplétion", + "help.065f53ee": ":\n Auto-save silencieux après 2s d'inactivité,\n flash vert de confirmation", + "help.085ec31f": ":\n Sélection rapide en haut de l'onglet Vaults", + "help.096367af": "Indicateurs visuels", + "help.170a6982": ": Affichage\n horizontal avec le nom du fichier et son\n icône", + "help.229fd3e2": "Notification Discord", + "help.2507242f": "🏷️ Tags", + "help.29afa01d": "🪝 Webhooks", + "help.2a2e5b0f": "⌨️ Raccourcis clavier", + "help.2a92203f": "Trucs et astuces", + "help.2c03a7ba": "Tags inline vs frontmatter", + "help.2dad2bfd": "Sauvegarde automatique", + "help.381abec7": "Limitations actuelles", + "help.3cf370b1": "Mode commandes", + "help.40dd7e38": "Tester avec curl", + "help.4de7e318": ": Les 50\n dernières recherches (localStorage)", + "help.550b0240": "Exemples concrets", + "help.5ab8c78d": ":\n Restent ouverts jusqu'à fermeture manuelle", + "help.5d0fbb81": ":\n Workers, boosts TF-IDF, expansions préfixe", + "help.5f87ea79": "Tag cloud", + "help.61ee5a22": "Interaction", + "help.62308f96": "⌨️ Palette de commandes", + "help.62549eca": "💾 Sauvegardes et Audits", + "help.63f024d4": "Filtrage de tags template", + "help.686f8313": "💡 Astuces et bonnes pratiques", + "help.6a5ddef2": ": Les tags\n s'adaptent au vault sélectionné", + "help.6ae5342c": ": Stats index,\n mémoire, moteur de recherche", + "help.6b88a375": ":\n Délai debounce, résultats par page, timeout", + "help.6b8fc728": ": ↑/↓\n pour naviguer, Enter pour sélectionner", + "help.6d547397": "Mode fichiers", + "help.6e940dac": ": Cliquez sur\n l'icône sidebar dans le header", + "help.733f0559": "🗺️ Navigation", + "help.77f4f06e": "Format du payload", + "help.7bcbb2e3": "Redimensionnement de la sidebar", + "help.7db70e27": ": Copier,\n Source, Télécharger, Éditer, Ouvrir dans\n nouvelle fenêtre", + "help.83f1d9ca": "Protection", + "help.86e3825d": "🎨 Personnalisation", + "help.8717768b": ":\n Métadonnées du nœud (tags, liens, chemin)", + "help.89bd3c4c": ": N'affiche\n que les nœuds avec un tag spécifique", + "help.8c5341e0": "📑 Gestion des onglets", + "help.8c65b2f2": "🔗 Partage et Webhooks", + "help.8caed987": "Affichage", + "help.9c7a0a8d": "🗺️ Vue Graphe", + "help.9edeaa11": ":\n Contrôle la profondeur d'exploration (0-3)", + "help.9f78b3ec": ":\n Navigation facilitée dans les fichiers longs", + "help.a4a4e21b": ": Bouton \"×\" pour\n réinitialiser le filtre", + "help.a579cf4d": ": Aperçu du\n contenu de la note sans naviguer", + "help.a648c49e": "Facettes et tri", + "help.ab2c4150": ": Fichiers (carrés)\n et dossiers (cercles) avec icônes", + "help.about": "À propos", + "help.access": "Accès", + "help.action_buttons": "Boutons d'action", + "help.actions_available": "Boutons disponibles au-dessus du contenu :", + "help.actions_detail": "Boutons disponibles au-dessus du contenu :", + "help.activation": "Activation", + "help.active_filter_chips": "Chips de filtres actifs", + "help.active_tab": "Onglet actif", + "help.add_remove": "Ajout/Suppression", + "help.adf30d78": "🔍 Recherche", + "help.advanced_operators": "Opérateurs avancés", + "help.advanced_use_cases": "Cas d'usage avancés", + "help.ai_completes": "Complète", + "help.ai_features": "Édition, ton, traduction, génération et outils via AI.", + "help.ai_flash_green": "flashe en vert", + "help.ai_tone_casual": "Ton décontracté", + "help.all_vaults": "Tous les vaults", + "help.atomic_writes": "Atomic writes", + "help.audit_log": "Audit log", + "help.auto_save": "Sauvegarde automatique", + "help.auto_scroll": "Auto-scroll", + "help.autocomplete": "Autocomplétion", + "help.b6619ac9": "Ouverture", + "help.backlinks_panel": "Panneau Backlinks", + "help.backup_auto": "Backup automatique", + "help.before_write": "Avant écriture", + "help.breadcrumb": "Breadcrumb", + "help.breadcrumb_clickable": "Breadcrumb cliquable", + "help.breadcrumb_reposition": "Breadcrumb et repositionnement", + "help.c017944b": "📄 Fichiers", + "help.c48fb18a": "Authentification", + "help.c8532869": ":\n Complétion, réécriture, traduction (voir\n section", + "help.case_sensitive": "Case-sensitive", + "help.cf8615b1": "Visualisation", + "help.ci_cd": "Automatisation CI/CD", + "help.clear": "Effacer", + "help.clear_search": "Effacer", + "help.click_segment": "Cliquez sur un segment", + "help.click_tab": "Clic sur un onglet", + "help.click_vault": "Cliquez sur le vault", + "help.clickable": "Cliquable", + "help.close_help": "Fermer l'aide", + "help.close_tab_x": "Bouton ✕", + "help.code_preview": "Code + Prévisualisation", + "help.command_palette": "Palette de commande", + "help.configuration": "Configuration", + "help.content_area": "Zone de contenu", + "help.content_shows": "La zone centrale affiche :", + "help.context_actions": "Actions sur fichiers", + "help.context_menu": "Menu contextuel (clic droit)", + "help.copy_path": "Copier le chemin", + "help.d186a19e": ":\n L'onglet \"Récent\" dans la sidebar liste vos\n derniers fichiers", + "help.d1ea1dc6": "n8n / Make (no-code)", + "help.d5c977ac": ": Les blocs de\n code s'adaptent au thème", + "help.dark": "Sombre", + "help.dashboard": "Dashboard statistiques", + "help.delete": "Supprimer", + "help.desc_00b9572b": ":\n Résultats classés par pertinence TF-IDF", + "help.desc_04493800": ": 64\n caractères hexadécimaux, impossible à\n deviner", + "help.desc_065f53ee": ":\n Auto-save silencieux après 2s d'inactivité,\n flash vert de confirmation", + "help.desc_071da87a": "Lecture seule : La vue\n publique n'affiche que le contenu sans\n édition", + "help.desc_0739c6a9": "Images : Support complet\n des syntaxes Obsidian", + "help.desc_085ec31f": ":\n Sélection rapide en haut de l'onglet Vaults", + "help.desc_0f9a1e5b": "Utilisez le filtrage sidebar\n : Plus rapide que la recherche globale pour\n trouver un fichier", + "help.desc_11cf9e8a": "Éditer ▾ — Menu de\n modification du texte sélectionné :\n \n 🪄\n Improve writing :\n Améliore la qualité, la clarté et le\n flux du texte", + "help.desc_13d206d4": "📊\n Convert to table :\n Transforme en tableau Markdown", + "help.desc_13d90039": "ObsiGate permet de partager des documents via un\n lien public temporaire.", + "help.desc_1577912b": "Rate limiting : 10\n tentatives / 15 min par IP + verrouillage\n compte", + "help.desc_170a6982": ": Affichage\n horizontal avec le nom du fichier et son\n icône", + "help.desc_188bc423": "Pour plus d'informations, consultez le\n dépôt du projet.", + "help.desc_19cf5730": ": Rotation\n automatique à 10 Mo", + "help.desc_19cfa369": "L'éditeur sauvegarde automatiquement après 2\n secondes d'inactivité. Le bouton de sauvegarde\n flashe en vert brièvement pour\n confirmer.", + "help.desc_1a04ae18": "Masquez la sidebar : Plus\n d'espace pour le contenu", + "help.desc_1ba39cc4": ":\n Déclencher un build quand une note de\n procédure est mise à jour", + "help.desc_1c130d89": "— Traduit le\n texte sélectionné vers une autre langue :", + "help.desc_1f11691c": "Atomic writes : Écriture\n via fichier temporaire + renommage atomique", + "help.desc_2349271d": "Automatisation CI/CD :\n Déclencher un build quand une note de\n procédure est mise à jour", + "help.desc_26f81732": "Édition rapide : Ouvrez\n l'éditeur, modifiez, sauvegardez", + "help.desc_287be69c": ":\n Réduisez les sections Vaults/Tags selon vos\n besoins", + "help.desc_2c220763": "Gestion des liens : Liste\n et révocation dans les Configurations", + "help.desc_2f2c16b5": ": Publier un\n article de blog quand un fichier est marqué", + "help.desc_31e7253b": ": Chaque backup\n est horodaté", + "help.desc_32e3d66d": "En cas d'erreur de clé API :\n AI: clé API invalide", + "help.desc_39979e71": ":\n Choisissez un vault pour réduire le bruit", + "help.desc_39e97b2f": "Note : l'événement\n file_modified est réservé pour\n usage futur. Les modifications de contenu\n via l'éditeur ne déclenchent pas encore de\n webhook.", + "help.desc_3ace259e": "— Complétion inline\n (", + "help.desc_3c4711b8": "Événements tracés :\n Écritures, suppressions, changements de\n configuration", + "help.desc_3d4e9189": "📋\n Simplify language :\n Simplifie le langage, évite le\n jargon", + "help.desc_3da1896a": "Les webhooks peuvent être activés/désactivés,\n modifiés ou supprimés à tout moment. Le\n last_fired_at indique la dernière\n exécution.", + "help.desc_3db2812f": "X-ObsiGate-Signature: sha256=9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08\n \n Pour vérifier côté récepteur : calculez\n HMAC-SHA256(corps_brut, secret) et\n comparez. Le header\n X-ObsiGate-Event contient aussi le\n type d'événement pour un routage rapide.", + "help.desc_40c92863": "Exploration par tags :\n Cliquez sur un tag dans une note pour voir\n toutes les notes similaires", + "help.desc_42a81347": ": Dernière\n modification", + "help.desc_443b76b5": "Wikilinks : Naviguez entre\n notes comme dans Obsidian", + "help.desc_47e1e10f": "Générer ▾ — Génère du\n contenu à partir de la sélection :\n \n ℹ️ Explain this :\n Explique le texte sélectionné de\n façon claire", + "help.desc_4de7e318": ": Les 50\n dernières recherches (localStorage)", + "help.desc_50a33a05": "⚙️\n Generate frontmatter\n : Génère un bloc YAML frontmatter", + "help.desc_5374685a": "Mobile-friendly : Utilisez\n le bouton hamburger sur mobile", + "help.desc_5396ed9e": "Profitez de l'historique :\n Réutilisez vos recherches fréquentes", + "help.desc_53bfaeca": ": Navigation par\n pages de 50 résultats", + "help.desc_5524e921": "Ton ▾ — Change le ton du\n texte :\n \n \n 💼 Professional :\n Ton formel et professionnel", + "help.desc_555e0305": "Pour changer de provider par défaut :\n AI_DEFAULT_PROVIDER=openrouter", + "help.desc_56760d7f": "Chaque webhook reçoit un POST avec\n Content-Type: application/json :", + "help.desc_58d2326f": "Navigation visuelle : Le\n breadcrumb repositionne automatiquement la\n sidebar", + "help.desc_599f3242": ": Logger\n toutes les modifications dans une base de\n données externe", + "help.desc_5a53de53": "📏 Make shorter :\n Rend le texte plus concis tout en\n préservant l'information", + "help.desc_5ab8c78d": ":\n Restent ouverts jusqu'à fermeture manuelle", + "help.desc_5d0fbb81": ":\n Workers, boosts TF-IDF, expansions préfixe", + "help.desc_5e9a7fd9": ": Liste\n et révocation dans les Configurations", + "help.desc_5fc28b7d": ": Créé\n automatiquement au premier démarrage", + "help.desc_625112fd": "Sélectionnez un contexte :\n Choisissez un vault pour réduire le bruit", + "help.desc_660051b0": "Audit externe : Logger\n toutes les modifications dans une base de\n données externe", + "help.desc_664b1d09": "Breadcrumb cliquable :\n Repositionnez rapidement la sidebar", + "help.desc_68c2b170": "Rotation : Rotation\n automatique à 10 Mo", + "help.desc_6902f20d": "Favorisez les opérateurs :\n tag: et\n vault: accélèrent la recherche", + "help.desc_698d92ec": "Gestion de l'espace :\n Réduisez les sections Vaults/Tags selon vos\n besoins", + "help.desc_6a5ddef2": ": Les tags\n s'adaptent au vault sélectionné", + "help.desc_6a80241e": ": La largeur\n est sauvegardée", + "help.desc_6ae5342c": ": Stats index,\n mémoire, moteur de recherche", + "help.desc_6b649b1e": ": Surligné en\n couleur d'accentuation", + "help.desc_6b88a375": ":\n Délai debounce, résultats par page, timeout", + "help.desc_6b8fc728": ": ↑/↓\n pour naviguer, Enter pour sélectionner", + "help.desc_6bc48f59": "Créez un\n Webhook Trigger dans n8n ou\n Make", + "help.desc_6caffeed": ": Cliquez pour\n filtrer les résultats", + "help.desc_6d68fbc9": "from flask import Flask, request\\nimport hmac, hashlib\\n\\napp = Flask(__name__)\\nWEBHOOK_SECRET = \"mon-secret\" # même que dans ObsiGate\\n\\n@app.route(\"/webhook\", methods=[\"POST\"])\\ndef webhook():\\n # Vérifier la signature\\n signature = request.headers.get(\"X-ObsiGate-Signature\", \"\")\\n body = request.get_data()\\n expected = \"sha256=\" + hmac.new(\\n WEBHOOK_SECRET.encode(), body, hashlib.sha256\\n ).hexdigest()\\n if not hmac.compare_digest(signature, expected):\\n return \"Invalid signature\", 403\\n\\n payload = request.get_json()\\n print(f\"Événement: {payload['event']}\")\\n print(f\"Fichier: {payload['data']['vault']}/{payload['data']['path']}\")\\n return \"OK\", 200\\n\\napp.run(port=5000)\n\n n8n / Make (no-code)\n \n \n Créez un\n Webhook Trigger dans n8n ou\n Make\n \n \n Copiez l'URL générée (ex:\n https://n8n.monserveur.com/webhook/abc123)\n \n \n Dans ObsiGate, ajoutez un webhook pointant\n vers cette URL\n \n Sélectionnez les événements souhaités\n \n Le workflow se déclenche automatiquement à\n chaque événement\n \n \n\n Notification Discord\n \n Utilisez un webhook relais (n8n, Make, ou un\n script) pour transformer le payload ObsiGate en\n message Discord :", + "help.desc_6ebebdfd": ": Chaque type\n d'opérateur a sa couleur", + "help.desc_6f7c5889": ": Alerter un\n canal Slack/Discord quand un document est\n créé", + "help.desc_71eeb16a": ":\n Réutilisez vos recherches fréquentes", + "help.desc_723ed8db": "Non-root Docker : Conteneur\n tourne avec UID 1000", + "help.desc_752789ab": ": Écriture\n via fichier temporaire + renommage atomique", + "help.desc_759926ee": "💬 Casual : Ton\n décontracté et conversationnel", + "help.desc_7671e56a": "Avant écriture : Sauvegarde\n du contenu original dans\n .obsigate-backup/", + "help.desc_7708f226": "JWT + Argon2id : Tokens JWT\n avec mots de passe hachés Argon2id", + "help.desc_7819b56f": "Copiez l'URL générée (ex:\n https://n8n.monserveur.com/webhook/abc123)", + "help.desc_7ab5be50": "Traduire ▾ — Traduit le\n texte sélectionné vers une autre langue :\n \n 🇬🇧 English · 🇨🇳 Chinese · 🇯🇵\n Japanese · 🇩🇪 German · 🇫🇷 French ·\n 🇪🇸 Spanish", + "help.desc_7b45490b": "Dans ObsiGate, ajoutez un webhook pointant\n vers cette URL", + "help.desc_7e86626c": "Bouton Partager : Dans les\n actions du fichier, génère un lien unique", + "help.desc_7f1d0512": "Path traversal : Validation\n des chemins contre les attaques\n ../", + "help.desc_7ff2fa21": "Pendant une requête AI, un toast\n ⏳ AI: traitement en cours...\n s'affiche", + "help.desc_803161e5": "La barre d'outils contient les boutons suivants\n :", + "help.desc_828db5da": ": Les\n deux types sont combinés", + "help.desc_858681a1": ":\n Durée de vie en heures", + "help.desc_85effb89": "Timeout de 5 secondes par\n requête — les webhooks sont \"fire and\n forget\" (pas de retry)", + "help.desc_8717768b": ":\n Métadonnées du nœud (tags, liens, chemin)", + "help.desc_87b348c3": "Recherche multi-critères :\n tag:docker tag:linux vault:IT\n nginx", + "help.desc_89a8f5de": "Déploiement : Publier un\n article de blog quand un fichier est marquépublish: true", + "help.desc_89bd3c4c": ": N'affiche\n que les nœuds avec un tag spécifique", + "help.desc_8f0bffe3": ": Tokens JWT\n avec mots de passe hachés Argon2id", + "help.desc_9186a3a3": "Explorez l'arborescence :\n Naviguez dans les dossiers", + "help.desc_93902d18": "Utilisez les tags : Filtrez\n par tags pour affiner", + "help.desc_9846fc07": ": Masque\n JWT, clés API, tokens GitHub dans les\n aperçus", + "help.desc_985d759b": "Token unique : 64\n caractères hexadécimaux, impossible à\n deviner", + "help.desc_991307d6": "— Génère du\n contenu à partir de la sélection :", + "help.desc_995a711f": ": Ouvre l'éditeur\n CodeMirror", + "help.desc_99c6f0ec": "Export : Téléchargez des\n fichiers pour backup ou partage", + "help.desc_9cb5974c": ": Ouvrez\n plusieurs notes dans des onglets séparés", + "help.desc_9d0e39d0": "Headers CSP :\n Content-Security-Policy, X-Frame-Options,\n XSS-Protection", + "help.desc_9edeaa11": ":\n Contrôle la profondeur d'exploration (0-3)", + "help.desc_9f321d1e": ":\n Écritures, suppressions, changements de\n configuration", + "help.desc_9f78b3ec": ":\n Navigation facilitée dans les fichiers longs", + "help.desc_9fec424d": ": Score\n TF-IDF (défaut)", + "help.desc_a0ec890a": "— Menu de\n modification du texte sélectionné :", + "help.desc_a13f7f2c": "Une fois terminé,\n AI: texte traité ✓ confirme\n le succès", + "help.desc_a4a4e21b": ": Bouton \"×\" pour\n réinitialiser le filtre", + "help.desc_a52fc3b1": ": Télécharge le\n fichier", + "help.desc_a579cf4d": ": Aperçu du\n contenu de la note sans naviguer", + "help.desc_a601f22e": "Allez dans ⚙️ Configurations → onglet\n Webhooks", + "help.desc_a69804cd": "Répertoire dédié :\n .obsigate-backup/ dans le\n répertoire de la vault", + "help.desc_a6cb3b26": "🔤\n Fix spelling & grammar\n : Corrige les fautes d'orthographe\n et de grammaire", + "help.desc_a974f7a6": "Journal : Fichier\n data/audit.log au format JSON\n lines", + "help.desc_a9c2c520": "Les webhooks permettent à ObsiGate de\n notifier automatiquement des services\n externes\n lorsque des fichiers ou dossiers sont modifiés.\n Chaque événement déclenche un\n POST HTTP vers l'URL de votre\n choix, avec un payload JSON détaillé.", + "help.desc_a9db82b5": ": Centre la vue\n sur un nœud spécifique", + "help.desc_ab2c4150": ": Fichiers (carrés)\n et dossiers (cercles) avec icônes", + "help.desc_action_buttons": "Copier, Source, Télécharger, Éditer, Ouvrir dans nouvelle fenêtre", + "help.desc_adv_syntax": ":\n Python, JS, HTML, CSS, Java, C++, Rust, Go\n et bien d'autres", + "help.desc_ae213f54": ":\n Combinez opérateurs et texte libre", + "help.desc_aec0ad2c": "💬 Réécrire — Réécrit le\n texte selon vos instructions personnalisées.\n Une boîte de dialogue vous demande votre\n instruction.", + "help.desc_all_tags": ": Extraits des frontmatters YAML et inline (#tag)", + "help.desc_all_vaults": ": Vue globale de tous vos contenus", + "help.desc_autoscroll": ": La sidebar se positionne automatiquement", + "help.desc_b54c21ef": "Contrôle d'accès par vault\n : Chaque utilisateur voit uniquement ses\n vaults", + "help.desc_b5f89b3b": "ObsiGate intègre un assistant IA directement\n dans l'éditeur de texte. Pour l'activer,\n configurez au moins un provider AI dans le\n fichier .env (DeepSeek, OpenRouter\n ou Gemini).", + "help.desc_b6169f2e": "Les webhooks se gèrent dans le modal\n Configurations (⚙️ menu\n Options), section Webhooks. Réservé aux\n administrateurs.", + "help.desc_b9c94994": ": Aperçu de\n la regex appliquée", + "help.desc_ba4578ae": "Redémarrez le conteneur :\n docker compose down && docker compose\n up -d --build", + "help.desc_bc08f215": "Secret redactor : Masque\n JWT, clés API, tokens GitHub dans les\n aperçus", + "help.desc_beed5686": ": Cliquez sur\n \"Thème\" dans le menu", + "help.desc_breadcrumb": "Chemin du fichier (cliquable pour repositionner la sidebar)", + "help.desc_c1f72521": "{\n \"event\": \"file_created\",\n \"timestamp\": \"2026-06-03T14:30:00.123456+00:00\",\n \"data\": {\n \"vault\": \"IT\",\n \"path\": \"procedures/deploiement.md\"\n }\n}\n\n Sécurité : signature HMAC-SHA256\n \n Si vous configurez un secret, chaque requête\n inclut un header\n X-ObsiGate-Signature :", + "help.desc_c63f02cc": "— Réécrit le\n texte selon vos instructions personnalisées.\n Une boîte de dialogue vous demande votre\n instruction.", + "help.desc_c8532869": ":\n Complétion, réécriture, traduction (voir\n section", + "help.desc_c992f2e5": "Remplissez :\n Nom (descriptif),\n URL (endpoint cible),\n Secret (optionnel)", + "help.desc_case_sensitive": ": Bouton \"Aa\" pour respecter la casse", + "help.desc_cb6f0bfd": ": Ouvrez\n l'éditeur, modifiez, sauvegardez", + "help.desc_cc8e35ba": "Notifications : Alerter un\n canal Slack/Discord quand un document est\n créé", + "help.desc_cdf7bb46": "Recherchez intelligemment :\n Combinez opérateurs et texte libre", + "help.desc_cf5ccd40": ": Compteurs\n par tag dans les résultats", + "help.desc_cfe362a7": "Export PDF : Téléchargement\n du document partagé en PDF via/s/{token}/pdf", + "help.desc_check_btn": ": Sauvegarde\n manuelle", + "help.desc_chip_remove": ": Cliquez sur \"×\" pour retirer un filtre", + "help.desc_chip_view": ": Voir d'un coup d'œil les filtres actifs", + "help.desc_click_segment": ": Navigation vers ce dossier", + "help.desc_click_tab": ": Active l'onglet", + "help.desc_click_vault": ": Focus sur le vault dans la sidebar", + "help.desc_close_btn": ": Ferme l'onglet (sauf s'il est seul)", + "help.desc_cm_autocomplete": ":\n Suggestions contextuelles", + "help.desc_cm_lines": ":\n Navigation facile", + "help.desc_cm_search": ": Ctrl+F pour\n chercher dans le fichier", + "help.desc_cm_syntax": ":\n Support de nombreux langages", + "help.desc_combined": "recherche \"serveur web\" dans les fichiers\n Markdown du vault IT avec le tag linux.", + "help.desc_context_menu": ": Clic\n droit sur un vault ou dossier → Vue\n Graphique", + "help.desc_copy_btn": ": Copie le contenu\n source dans le presse-papiers", + "help.desc_ctrl_tab": ": Onglet suivant", + "help.desc_ctrl_w": ": Fermer l'onglet actif", + "help.desc_d186a19e": ":\n L'onglet \"Récent\" dans la sidebar liste vos\n derniers fichiers", + "help.desc_d3a71d97": "file_modified n'est pas encore\n dispatché (réservé pour version future)", + "help.desc_d5c977ac": ": Les blocs de\n code s'adaptent au thème", + "help.desc_d646b709": "Compte admin : Créé\n automatiquement au premier démarrage", + "help.desc_d66e911c": ": Dans les\n actions du fichier, génère un lien unique", + "help.desc_d915c72b": "Synchronisation : Copier\n les nouveaux fichiers vers un autre système\n (SharePoint, Google Drive)", + "help.desc_d9cdaa89": ": Copier\n les nouveaux fichiers vers un autre système\n (SharePoint, Google Drive)", + "help.desc_d9e8ab0b": "🧰 Boîte ▾ — Outils de\n conversion :\n \n \n 📋\n Convert to list :\n Transforme le texte en liste\n Markdown", + "help.desc_dc4d7186": "Les modifications détectées par le watcher\n filesystem (watchdog)\n ne déclenchent pas de\n webhooks — seules les opérations via l'API\n REST sont prises en compte", + "help.desc_delete_btn_new": ": Bouton\n corbeille pour supprimer", + "help.desc_double_click": ": Ouvre le fichier dans un onglet persistant", + "help.desc_e0525213": "✦ AI — Complétion inline\n (Ctrl+J). Complète\n automatiquement le texte là où se trouve le\n curseur.", + "help.desc_e23c94dd": ": Dans la\n barre d'outils (le cas échéant)", + "help.desc_e36f3eaa": "📐 Make longer :\n Ajoute des détails, exemples ou\n explications", + "help.desc_e3fce7a3": ": Ouvre le\n fichier dans un onglet temporaire (aperçu,\n italique)", + "help.desc_e47d2328": ": La vue\n publique n'affiche que le contenu sans\n édition", + "help.desc_e5246734": ": Onglet\n précédent", + "help.desc_e5b67e3d": ": Votre choix\n est sauvegardé en localStorage", + "help.desc_e5cf90b2": "📝 Summarize :\n Résume le texte de façon concise", + "help.desc_e6129268": "Confort de lecture :\n Ajustez la largeur de la sidebar", + "help.desc_e7e3157a": "Timestamp : Chaque backup\n est horodaté", + "help.desc_e93517a5": ": Téléchargement\n du document partagé en PDF via", + "help.desc_ec5f7a26": "Expiration configurable :\n Durée de vie en heures", + "help.desc_ecf302ae": "Multi-fenêtres : Ouvrez\n plusieurs notes dans des onglets séparés", + "help.desc_edges": ": Wikilinks sortants\n (bleu) et backlinks entrants (vert)", + "help.desc_eebf177f": "ObsiGate v1.7.0 - Porte\n d'entrée web pour vos vaults Obsidian", + "help.desc_ef1531ce": ": Un\n onglet temporaire (italique) est remplacé\n par le prochain clic", + "help.desc_ef3f8158": ": Gérez\n vos patterns de filtrage", + "help.desc_examples": ":\n ext:sh recherche dans les scripts\n bash, ext:py dans les scripts\n Python, ext:md dans les fichiers\n Markdown.\n

", + "help.desc_expand": ": Cliquez sur un dossier", + "help.desc_export_png": ": Sauvegardez le\n graphe en image", + "help.desc_f0adf67a": ": Molette pour\n zoomer, cliquer-glisser pour se déplacer", + "help.desc_f2d4e369": "✏️\n Continue writing :\n Continue l'écriture à partir du\n texte", + "help.desc_f53badcd": "Ajoutez votre clé API dans\n .env :\n DEEPSEEK_API_KEY=sk-...", + "help.desc_f58da6e1": "Cliquez Ajouter", + "help.desc_f9083ce5": ": Téléchargez des\n fichiers pour backup ou partage", + "help.desc_f952db17": "Refresh tokens : Cookies\n HttpOnly avec rotation automatique", + "help.desc_fa126609": "🔷\n Convert to canvas :\n Convertit en diagramme Mermaid.js", + "help.desc_facet_vaults": ": Compteurs par vault", + "help.desc_fc9391f3": "# Exemple avec curl + jq dans un script bash\nWEBHOOK_URL=\"https://discord.com/api/webhooks/...\"\nOBSIGATE_SECRET=\"mon-secret\"\n\n# Lire le payload depuis stdin\nread -r payload\nevent=$(echo \"$payload\" | jq -r '.event')\npath=$(echo \"$payload\" | jq -r '.data.path')\n\ncurl -H \"Content-Type: application/json\" -d \"{\n \\\"content\\\": \\\"📝 **$event** — $path\\\"\n}\" \"$WEBHOOK_URL\"\n\n Tester avec curl\n # Simuler ce qu'ObsiGate envoie (pour tester votre endpoint)\ncurl -X POST https://votre-serveur.com/webhook \\\n -H \"Content-Type: application/json\" \\\n -H \"X-ObsiGate-Event: file_created\" \\\n -H \"X-ObsiGate-Signature: sha256=$(echo -n '{\"event\":\"file_created\",...}' | openssl dgst -sha256 -hmac 'mon-secret' | cut -d' ' -f2)\" \\\n -d '{\"event\":\"file_created\",\"timestamp\":\"2026-06-03T14:30:00Z\",\"data\":{\"vault\":\"IT\",\"path\":\"notes/test.md\"}}'\n\n Limitations actuelles\n \n \n Timeout de 5 secondes par\n requête — les webhooks sont \"fire and\n forget\" (pas de retry)\n \n \n Les modifications détectées par le watcher\n filesystem (watchdog)\n ne déclenchent pas de\n webhooks — seules les opérations via l'API\n REST sont prises en compte\n \n \n file_modified n'est pas encore\n dispatché (réservé pour version future)\n \n Pas de retry automatique en cas d'échec\n \n Pas de filtrage par vault — un webhook\n écoute toutes les vaults\n \n \n \n \n 💾 Sauvegardes et Audits\n\n Backup automatique\n \n ObsiGate crée automatiquement des sauvegardes\n avant chaque modification destructive.", + "help.desc_fdeaf803": ": Chaque type de\n fichier a son icône (markdown, code, etc.)", + "help.desc_file_suggest": ": Suggestions de titres de fichiers", + "help.desc_filter_type": ":\n Inclut/exclut fichiers, dossiers, markdown,\n autres", + "help.desc_filter_usage": "Utilisez la barre de filtrage en haut de la sidebar pour rechercher rapidement :", + "help.desc_filtering": "Barre de recherche pour filtrer fichiers/tags", + "help.desc_find_in_page": ": Ctrl+F pour\n chercher dans le fichier (casse, regex, mot\n entier)", + "help.desc_frontmatter": ": tags: [docker, linux] ou tags: docker, linux", + "help.desc_fullscreen": ": Bouton pour\n agrandir la vue", + "help.desc_graph_intro": "La vue graphe offre une visualisation\n interactive des connexions entre vos notes via\n les wikilinks.", + "help.desc_graph_nav": ":\n Historique de navigation entre les nœuds", + "help.desc_grouped_results": ": Affichage par vault avec chemins complets", + "help.desc_hamburger": "(mobile) : Affiche/masque la sidebar", + "help.desc_hide": "Cliquez sur l'icône sidebar dans le header", + "help.desc_images": ": Support\n de ![[image.png]]", + "help.desc_inline_tags": ": #docker dans le contenu markdown", + "help.desc_instant_filter": ": Tapez pour filtrer fichiers et dossiers", + "help.desc_logo": "Retour à l'accueil", + "help.desc_markdown_all": ":\n Rendu complet du markdown", + "help.desc_md_render": "Les fichiers markdown sont rendus avec :", + "help.desc_menu_header": ": Dropdown \"Vault\" dans le menu Options", + "help.desc_menu_options": ": Accès aux\n paramètres, thème, aide", + "help.desc_op_ext": ": Filtrer par type de fichier", + "help.desc_op_path": ": Filtrer par chemin", + "help.desc_op_phrase": ": Recherche de phrase entre guillemets", + "help.desc_op_tag": ": Filtrer par tag", + "help.desc_op_title": ": Chercher dans les titres uniquement", + "help.desc_op_vault": ": Rechercher dans un vault spécifique", + "help.desc_open_file": ": Cliquez sur le nom du fichier", + "help.desc_open_new": ": Ouvre le fichier dans un nouvel onglet", + "help.desc_patterns": ": Ex: #<% ... %> ou #{{ ... }}", + "help.desc_quick_select": "Dropdown pour changer de vault", + "help.desc_rendered_content": "Markdown avec wikilinks et images", + "help.desc_resize": "Glissez le bord droit pour ajuster la largeur", + "help.desc_save_btn_new": ": Bouton ✓ pour\n enregistrer", + "help.desc_search_all": ": Titre, contenu, tags, chemins", + "help.desc_search_bar": "Recherche globale avec autocomplétion", + "help.desc_search_intro": "

\n Tapez dans la barre de recherche en haut pour\n lancer une recherche fulltext :\n

", + "help.desc_sidebar_toggle": "Masque la sidebar pour plus d'espace", + "help.desc_snippets": ": Extraits avec termes en surbrillance", + "help.desc_source_btn": ": Affiche/masque le\n markdown brut", + "help.desc_specific_vault": ": Focus sur un seul vault", + "help.desc_syntax_hl": ":\n Coloration des blocs de code", + "help.desc_tag_cloud_intro": "

\n L'onglet Tags de la sidebar affiche un nuage de\n tags :\n

", + "help.desc_tag_filter_use": ": Utilisez la barre de filtrage pour chercher un tag", + "help.desc_tag_suggest": ": Suggestions de tags avec compteurs", + "help.desc_tags_tab": "Nuage de tags cliquables", + "help.desc_template_intro": "

\n Dans les Configurations, vous pouvez masquer les\n tags de template :\n

", + "help.desc_title_tags": "Métadonnées du fichier", + "help.desc_trash_btn": ": Suppression du\n fichier", + "help.desc_two_tag_types": "

ObsiGate supporte deux types de tags :

", + "help.desc_vault_context": "Changez de contexte pour filtrer l'affichage :", + "help.desc_vault_indicator": "Affiche le contexte actif (All, vault1, etc.)", + "help.desc_vaults_tab": "Arborescence des fichiers et dossiers", + "help.desc_visual_search": ": Barre\n de recherche pour surligner des nœuds", + "help.desc_wikilinks": ":\n [[lien]] et\n [[lien|texte]]", + "help.double_click": "Double clic", + "help.drag_drop_tabs": "Drag & drop des onglets", + "help.e23c94dd": ": Dans la\n barre d'outils (le cas échéant)", + "help.e3fce7a3": ": Ouvre le\n fichier dans un onglet temporaire (aperçu,\n italique)", + "help.e5b67e3d": ": Votre choix\n est sauvegardé en localStorage", + "help.editor_section": "Éditeur", + "help.ef1531ce": ": Un\n onglet temporaire (italique) est remplacé\n par le prochain clic", + "help.experience": "Expérience", + "help.export": "Export", + "help.external_audit": "Audit externe", + "help.f0adf67a": ": Molette pour\n zoomer, cliquer-glisser pour se déplacer", + "help.fallback_editor": "Éditeur de fallback", + "help.fdeaf803": ": Chaque type de\n fichier a son icône (markdown, code, etc.)", + "help.fe388b67": "Optimisations", + "help.file_actions": "Actions sur le fichier ouvert :", + "help.file_viewer": "Visionneur de fichier", + "help.filter_toggles": "Toggles Aa, wd, .*", + "help.filtering": "Filtrage", + "help.find_capabilities": "Recherche regex, mot entier, case-sensitive dans le document affiché avec TreeWalker DOM.", + "help.find_in_page": "Recherche dans la page", + "help.footer": "© 2026 — Fait avec ☕, 🎧 et quelques", + "help.graph_context": "Menu contextuel", + "help.graph_depth": "Slider de profondeur", + "help.graph_export": "Export PNG", + "help.graph_filter_depth": "Filtres & profondeur", + "help.graph_focus": "Mode focus", + "help.graph_fullscreen": "Plein écran & export PNG", + "help.graph_info": "Panneau d'info", + "help.graph_nav_arrows": "Navigation ← → ↑", + "help.graph_navigation": "Navigation historique ← → ↑", + "help.graph_nodes": "Nœuds", + "help.graph_preview": "Ctrl+survol", + "help.graph_sticky": "Sticky panels", + "help.graph_tag_filter": "Filtre par tag", + "help.graph_type_filter": "Filtre par type", + "help.graph_view": "Vue graphe", + "help.graph_visual": "Recherche visuelle", + "help.graph_zoom": "Zoom/Pan", + "help.graph_zoom_pan": "Zoom & pan molette", + "help.guide_official": "Guide officiel", + "help.hamburger_btn": "Bouton menu hamburger", + "help.header_section": "En-tête", + "help.help_title": "Aide", + "help.hide": "Masquage", + "help.hide_help": "Masquer l'aide", + "help.highlighted_snippets": "Snippets surlignés", + "help.indexes": "ObsiGate indexe et affiche :", + "help.instant": "Instantanée", + "help.light": "Clair", + "help.logo": "Logo ObsiGate", + "help.markdown": "Syntaxe Markdown", + "help.menu_header": "Menu header", + "help.menu_options": "Menu Options", + "help.mermaid_section": "Diagrammes Mermaid", + "help.mermaid_templates": "Templates", + "help.mobile": "Barre flottante résultats", + "help.mobile_editor_gestures": " : balayage vers la gauche → liens entrants, vers la droite → table des matières.", + "help.mobile_editor_gestures_label": "Gestes tactiles", + "help.mobile_editor_intro": "Sur téléphone et tablette, l'édition s'adapte au tactile : barre d'outils flottante, gestes et mode lecture plein écran.", + "help.mobile_editor_paste": " : bouton « Coller » persistant (contourne la restriction iOS).", + "help.mobile_editor_paste_label": "Presse-papiers", + "help.mobile_editor_reading": " : plein écran sans en-tête ni barres latérales ; balayage horizontal pour passer au fichier suivant ou précédent.", + "help.mobile_editor_reading_label": "Mode lecture", + "help.mobile_editor_title": "📱 Édition mobile", + "help.mobile_editor_toolbar": " : ruban horizontal défilable (titres, gras, italique, barré, surligné, code, citation, listes, cases à cocher, liens, tags, pièces jointes). L'icône ⚙ permet d'ajouter, retirer ou réordonner les commandes ; A−/A+ ajustent la taille de la police.", + "help.mobile_editor_toolbar_label": "Ruban d'édition", + "help.mobile_editor_zoom": " : pincement à deux doigts pour zoomer, poignée pour redimensionner la zone d'édition.", + "help.mobile_editor_zoom_label": "Zoom & hauteur", + "help.modal_title": "Guide d'utilisation ObsiGate", + "help.multi_vault": "Multi-vault", + "help.nav_ai": "🤖 IA Éditeur", + "help.nav_backups": "💾 Sauvegardes", + "help.nav_customization": "🎨 Personnalisation", + "help.nav_editing": "✏️ Édition", + "help.nav_files": "📁 Fichiers", + "help.nav_graph": "🗺️ Graphe", + "help.nav_interface": "🧭 Interface", + "help.nav_intro": "📘 Introduction", + "help.nav_mobile_editor": "📱 Mobile", + "help.nav_navigation": "🗺️ Navigation", + "help.nav_palette": "⌨️ Palette", + "help.nav_search": "🔍 Recherche", + "help.nav_security": "🛡️ Sécurité", + "help.nav_sharing": "🔗 Partage", + "help.nav_shortcuts": "⌨️ Raccourcis", + "help.nav_tabs": "📑 Onglets", + "help.nav_tags": "🏷️ Tags", + "help.nav_tips": "💡 Astuces", + "help.nav_webhooks": "🪝 Webhooks", + "help.nav_plugins": "🧩 Plugins", + "help.nav_excalidraw": "🎨 Excalidraw", + "help.new_file": "Nouveau fichier", + "help.new_folder": "Nouveau dossier", + "help.nights": "nuits blanches 😅", + "help.nodes_edges": "Arêtes", + "help.other": "Autres", + "help.outline_panel": "Panneau Plan (droite)", + "help.pagination": "Pagination", + "help.pal_close_the_palette": "Fermer la palette", + "help.pal_delete_a_folder_and_its_contents": "Supprime un dossier et son contenu", + "help.pal_delete_the_file_from_the_active_tab": "Supprime le fichier de l'onglet actif", + "help.pal_move_desc": "Se déplacer dans la liste", + "help.pal_open___select": "Ouvrir/sélectionner", + "help.pal_open_the_editor_on_the_active_tab": "Ouvre l'éditeur sur l'onglet actif", + "help.pal_open_this_guide": "Ouvre ce guide", + "help.pal_popout_desc": "Ouvre le document dans une fenêtre détachée", + "help.pal_toggle_light_dark": "Bascule clair/sombre", + "help.pdf_export": "Export PDF", + "help.persistent_display": "Affichage persistant dans la barre", + "help.persistent_tabs": "Onglets persistants", + "help.popout_button": "Bouton dédié", + "help.powered_by": "Propulsé par Python, FastAPI, vanilla JS, CodeMirror, Mermaid, Lucide Icons et ❤️ pour Obsidian.", + "help.preview_tab": "Prévisualisation", + "help.properties": "Propriétés", + "help.public_shares": "Publication publique", + "help.pwa_section": "PWA", + "help.quick_help": "Raccourcis & Astuces", + "help.quick_select": "Sélection rapide", + "help.rate_limiting": "Rate limiting", + "help.recent_nav": "Navigation récente", + "help.rename": "Renommer", + "help.rendered_content": "Contenu rendu", + "help.rendering_images": "Rendu d'images", + "help.rendering_md": "Rendu dans le Markdown", + "help.resize": "Redimensionnement", + "help.results_counter": "Compteur de résultats", + "help.results_grouped": "Résultats groupés", + "help.search_bar": "Barre de recherche", + "help.search_dropdown": "Dropdown de recherche", + "help.search_everywhere": "Recherche dans tout", + "help.search_facets": "Facettes", + "help.search_filters": "Filtres de recherche", + "help.search_history": "Historique de recherche", + "help.search_operators": "Opérateurs de recherche", + "help.search_placeholder": "Rechercher dans l'aide...", + "help.search_save": "Recherches sauvegardées", + "help.secret_redaction": "Redaction de secrets", + "help.security_section": "Sécurité", + "help.share_button": "Bouton Partager", + "help.shortcut_ai_completion": "Completion IA inline (dans l'éditeur)", + "help.shortcut_close": "Fermer l'éditeur / modale", + "help.shortcut_close_editor": "Fermer l'éditeur / modale", + "help.shortcut_close_palette": "Fermer la palette", + "help.shortcut_close_tab": "Fermer l'onglet", + "help.shortcut_command_palette": "Palette de commandes", + "help.shortcut_file_palette": "Palette de fichiers (nav. rapide)", + "help.shortcut_focus_search": "Focus barre de recherche", + "help.shortcut_forge_help": "Aide de l'éditeur Forge", + "help.shortcut_next_tab": "Onglet suivant", + "help.shortcut_palette": "Palette de commandes", + "help.shortcut_palette_cmd": "Palette de commandes (mode commande)", + "help.shortcut_prev_tab": "Onglet précédent", + "help.shortcut_quick_insert": "Insertion rapide (éditeur Forge)", + "help.shortcut_quick_search": "Recherche rapide (hors champ texte)", + "help.shortcut_redo": "Refaire", + "help.shortcut_save": "Sauvegarder", + "help.shortcut_save_file": "Sauvegarder le fichier ouvert", + "help.shortcut_search_doc": "Rechercher dans le document", + "help.shortcut_select": "Ouvrir/sélectionner", + "help.shortcut_tip": "Survolez un document avec Ctrl pour un aperçu rapide. Cliquez sur Forge dans la barre d'outils pour l'éditeur avancé.", + "help.shortcut_undo": "Annuler", + "help.shortcuts": "Raccourcis clavier", + "help.shortcuts_title": "Raccourcis & Astuces", + "help.sidebar_dropdown": "Sidebar dropdown", + "help.sidebar_features": "Fonctionnalités de la sidebar :", + "help.sidebar_filtering": "Filtrage de la sidebar", + "help.sidebar_section": "Sidebar (barre latérale)", + "help.sidebar_tabs": "La sidebar est divisée en deux onglets :", + "help.sidebar_toggle_btn": "Bouton toggle sidebar", + "help.simple": "Simple", + "help.simple_search": "Recherche simple", + "help.single_click": "Simple clic", + "help.smart_scoring": "Scoring intelligent", + "help.sort_options": "Options de tri", + "help.supported_languages": "Support de nombreux langages", + "help.syncthing": "Conflits Syncthing", + "help.syncthing_conflicts": "Conflits Syncthing", + "help.tab_bar": "Barre d'onglets", + "help.tab_features": "Fonctionnalités", + "help.tab_nav": "Navigation entre onglets", + "help.tabs_section": "Ouverture d'onglets", + "help.theme_section": "Thème", + "help.theme_sync": "Thème synchronisé", + "help.theme_toggle": "Basculez entre les thèmes :", + "help.themes": "Thèmes", + "help.tip_hide_sidebar": "Masquez la sidebar", + "help.tip_sidebar_filter": "Utilisez le filtrage sidebar", + "help.tip_use_tags": "Utilisez les tags", + "help.title": "Aide ObsiGate", + "help.title_tags": "Titre et tags", + "help.toc_title": "SOMMAIRE", + "help.assistant_panel": "🧠 Panneau Assistant (BooksLM)", + "help.assistant_panel_desc": "L'assistant latéral (bouton flottant ou menu contextuel d'un dossier) répond en Markdown formaté et contextualise vos répertoires ou documents. En contexte général, il connaît aussi ce que vous voyez : documents ouverts, répertoire courant, recherche en cours et fichiers récemment modifiés.", + "help.assistant_markdown": "Réponses formatées : titres, listes, tableaux, citations et blocs de code.", + "help.assistant_links": "Les fichiers et chemins cités sont des liens : un simple nom de fichier copie le nom dans le presse-papiers, un dossier est révélé dans l'arborescence, et un chemin de fichier l'ouvre dans le viewer.", + "help.assistant_sessions": "L'icône historique de l'en-tête liste les sessions passées (recharger ou supprimer) ; « + » démarre une nouvelle conversation.", + "help.assistant_agent": "Le bouton « mode agent » active les outils (lire, lister, chercher) ; les actions de modification demandent une confirmation avec aperçu des changements.", + "help.assistant_resize": "Le bord gauche du panneau est redimensionnable ; la largeur est mémorisée.", + "help.assistant_at": "Tapez @ pour joindre un fichier ou un répertoire au contexte, ou pour attacher une image d'un répertoire.", + "help.assistant_slash": "Tapez / pour lancer un skill (recherche, résumé, correction, plan…) ou une commande admin (/help, /providers, /model, /keys).", + "help.assistant_images": "Collez une image dans la zone de saisie (ou joignez-la) pour l'analyser avec un modèle compatible vision. Le bouton ⓘ affiche les capacités du modèle sélectionné, et la liste des modèles est filtrable par recherche.", + "help.toolbar_section": "Barre d'outils AI", + "help.tree_section": "Arborescence des vaults", + "help.use_cases": "Cas d'usage", + "help.vault_indicator": "Indicateur de vault", + "help.vault_selector": "Sélection de vault", + "help.vault_specific": "Vault spécifique", + "help.webhook_blog_post": "article de blog quand un fichier est marqué", + "help.webhook_note": "Note : l'événement", + "help.webhook_notify": "notifier automatiquement des services", + "help.webhook_post": "HTTP vers l'URL de votre", + "help.webhooks": "Webhooks", + "help.welcome_desc": "ObsiGate est votre porte d'entrée web vers vos vaults Obsidian. Accédez, naviguez et recherchez dans toutes vos notes depuis n'importe quel appareil via une interface moderne et responsive.", + "help.welcome_tag1": "⚡ Navigation rapide", + "help.welcome_tag2": "📁 Multi-vault", + "help.welcome_tag3": "🏷️ Tags intelligents", + "help.welcome_tag4": "📖 Lecture et édition", + "help.welcome_tag5": "🔍 Recherche TF-IDF", + "help.welcome_title": "Bienvenue dans ObsiGate", + "help.wikilinks": "Wikilinks", + "help.zoom_pan": "Zoom & Pan", + "mermaid.code": "Code", + "mermaid.copy_svg": "Copier SVG", + "mermaid.download_png": "Télécharger PNG", + "mermaid.preview": "Aperçu", + "mermaid.zoom_in": "Zoom avant", + "mermaid.zoom_out": "Zoom arrière", + "mobile.all_vaults": "📂 Toutes les vaults", + "mobile_editor.add_command": "Ajouter une commande", + "mobile_editor.backlinks": "Liens entrants", + "mobile_editor.bold": "Gras", + "mobile_editor.close": "Fermer", + "mobile_editor.cmd_attachment": "Pièce jointe", + "mobile_editor.cmd_bold": "Gras", + "mobile_editor.cmd_bullet": "Liste à puces", + "mobile_editor.cmd_checkbox": "Case à cocher", + "mobile_editor.cmd_code": "Code en ligne", + "mobile_editor.cmd_codeblock": "Bloc de code", + "mobile_editor.cmd_dedent": "Désindenter", + "mobile_editor.cmd_files": "Modèle / fichiers", + "mobile_editor.cmd_h1": "Titre 1", + "mobile_editor.cmd_h2": "Titre 2", + "mobile_editor.cmd_h3": "Titre 3", + "mobile_editor.cmd_h4": "Titre 4", + "mobile_editor.cmd_h5": "Titre 5", + "mobile_editor.cmd_h6": "Titre 6", + "mobile_editor.cmd_highlight": "Surligné", + "mobile_editor.cmd_indent": "Indenter", + "mobile_editor.cmd_italic": "Italique", + "mobile_editor.cmd_link": "Lien externe", + "mobile_editor.cmd_ordered": "Liste numérotée", + "mobile_editor.cmd_quote": "Citation", + "mobile_editor.cmd_redo": "Refaire", + "mobile_editor.cmd_strike": "Barré", + "mobile_editor.cmd_tag": "Tag", + "mobile_editor.cmd_undo": "Annuler", + "mobile_editor.cmd_wikilink": "Lien interne", + "mobile_editor.code": "Code", + "mobile_editor.customize": "Personnaliser la barre", + "mobile_editor.customize_reset": "Réinitialiser", + "mobile_editor.customize_title": "Personnaliser la barre d'outils", + "mobile_editor.done": "Terminé", + "mobile_editor.error": "Erreur de chargement", + "mobile_editor.font_larger": "Agrandir la police", + "mobile_editor.font_smaller": "Réduire la police", + "mobile_editor.italic": "Italique", + "mobile_editor.link": "Lien", + "mobile_editor.list": "Liste à puces", + "mobile_editor.loading": "Chargement…", + "mobile_editor.move_down": "Descendre", + "mobile_editor.move_up": "Monter", + "mobile_editor.no_backlinks": "Aucun lien entrant", + "mobile_editor.no_headings": "Aucun titre dans ce document", + "mobile_editor.no_next": "Dernier fichier du dossier", + "mobile_editor.no_prev": "Premier fichier du dossier", + "mobile_editor.paste": "Coller", + "mobile_editor.paste_hint": "Appuyez longuement dans le champ puis choisissez « Coller » (accès au presse-papiers refusé).", + "mobile_editor.reading_enter": "Mode lecture", + "mobile_editor.reading_exit": "Quitter le mode lecture", + "mobile_editor.remove_command": "Supprimer", + "mobile_editor.resize": "Ajuster la hauteur de l'éditeur", + "mobile_editor.toc": "Table des matières", + "mobile_editor.toolbar": "Barre d'outils d'édition mobile", + "modal.create_btn": "Créer", + "modal.create_file": "Créer un fichier", + "modal.creating": "Création...", + "modal.delete_dir": "Supprimer le dossier", + "modal.delete_dir_warning": "Tous les fichiers et sous-dossiers seront supprimés définitivement.", + "modal.delete_file": "Supprimer le fichier", + "modal.delete_irreversible": "Cette action est irréversible.", + "modal.delete_permanently": "Supprimer définitivement", + "modal.delete_warning": "Attention !", + "modal.dir_to_delete": "Dossier à supprimer:", + "modal.file_name": "Nom du fichier", + "modal.file_to_delete": "Fichier à supprimer:", + "modal.file_type": "Type de fichier", + "modal.in_folder": "Dans: {path}", + "month.april": "Avril", + "month.august": "Août", + "month.december": "Décembre", + "month.february": "Février", + "month.january": "Janvier", + "month.july": "Juillet", + "month.june": "Juin", + "month.march": "Mars", + "month.may": "Mai", + "month.november": "Novembre", + "month.october": "Octobre", + "month.september": "Septembre", + "offline.all_synced": "Toutes les modifications ont été synchronisées", + "offline.conflict_title": "Conflit de synchronisation", + "offline.keep_local": "Garder version locale", + "offline.keep_server": "Garder version serveur", + "offline.mode_offline": "Mode hors-ligne — vos modifications seront synchronisées au retour", + "offline.pending": "{count} modification(s) en attente", + "offline.reconnected": "Connexion rétablie — synchronisation en cours...", + "offline.status": "Hors-ligne", + "offline.sync_now": "Synchroniser maintenant", + "palette.browse_dirs": "📂 Parcourir les répertoires...", + "palette.browse_hint": "Naviguer dans les vaults pour trouver un fichier", + "palette.browse_in": "Dans {path}", + "palette.browse_no_results": "Aucun résultat — naviguer manuellement", + "palette.browse_open_file": "📂 Ouvrir un fichier dans ce dossier", + "palette.browse_root": "racine", + "palette.close_current": "Fermer fichier courant", + "palette.close_current_desc": "Fermer l'onglet actif sans supprimer", + "palette.cmd_back_home": "🏠 Accueil", + "palette.cmd_back_home_desc": "Retour à l'accueil", + "palette.cmd_config": "⚙️ Configuration", + "palette.cmd_config_desc": "Ouvrir les paramètres", + "palette.cmd_create_dir": "📁 Créer répertoire", + "palette.cmd_create_dir_desc": "Choisir la vault, naviguer, puis nommer le dossier", + "palette.cmd_create_file": "📄 Créer fichier markdown", + "palette.cmd_create_file_desc": "Choisir la vault, naviguer, puis nommer le fichier", + "palette.cmd_delete_dir": "🗑️ Supprimer répertoire", + "palette.cmd_delete_dir_desc": "Choisir la vault, naviguer et supprimer", + "palette.cmd_theme": "🌓 Changer le thème", + "palette.cmd_theme_desc": "Basculer clair/sombre", + "palette.del_all_content": "Tout le contenu sera supprimé", + "palette.delete_current": "Supprimer fichier courant", + "palette.delete_current_desc": "Supprimer le fichier de l'onglet actif", + "palette.delete_file_desc": "Rechercher un fichier à supprimer", + "palette.dir_delete_confirm": "Tout le contenu sera supprimé", + "palette.dir_name": "Nom du dossier", + "palette.empty_dir": "📂 Dossier vide", + "palette.error_loading": "Erreur de chargement", + "palette.error_prefix": "Erreur : {msg}", + "palette.file_name": "Nom du fichier", + "palette.help_desc": "Ouvrir le guide", + "palette.md_hint": "(.md ajouté si besoin)", + "palette.mode_commands": "Commandes", + "palette.mode_files": "Fichiers", + "palette.no_results": "Aucun résultat pour \"{query}\"", + "palette.no_vaults": "Aucune vault trouvée", + "palette.popout_desc": "Ouvrir le document dans une fenêtre", + "palette.reindex_desc": "Forcer la réindexation complète", + "palette.search_commands": "Tapez une commande...", + "palette.search_error": "Erreur de recherche", + "palette.search_files": "Rechercher un fichier...", + "palette.type_command": "Tapez une commande...", + "palette.type_search": "Rechercher un fichier... (+inclure -exclure)", + "palette.vault_count": "{count} fichiers", + "pwa.dismiss": "Plus tard", + "pwa.install_button": "Installer", + "pwa.install_desc": "Installez cette application sur votre appareil pour un accès rapide.", + "pwa.install_title": "Installer ObsiGate", + "search.advanced_operators": "Opérateurs avancés", + "search.aria_label": "Suggestions de recherche", + "search.case_sensitive": "Respecter la casse", + "search.clear": "Effacer", + "search.dropdown_clear_history": "Effacer l'historique", + "search.dropdown_files": "Fichiers", + "search.dropdown_history": "Historique", + "search.error": "Erreur de recherche", + "search.exclude_placeholder": "Exclure: vendor/*, *.lock", + "search.facet_tags": "Tags", + "search.facet_vaults": "Vaults", + "search.files_filtered": "{count} fichier(s) avec filtres", + "search.filter_path_title": "Filtres de chemin (Alt-F)", + "search.filters": "Filtres", + "search.full_text": "Recherche dans tout", + "search.highlighted_snippets": "Snippets surlignés", + "search.include_placeholder": "Inclure: **/*.md, notes/**", + "search.loading": "Recherche en cours...", + "search.no_results": "Aucun résultat trouvé", + "search.operators_help": "Opérateurs : tag:mot, vault:nom, title:mot, path:mot, ext:md", + "search.pagination": "Pagination", + "search.previous": "← Précédent", + "search.query_time": "({time} ms)", + "search.regex": "Expression régulière", + "search.results_count": "{count} résultat(s)", + "search.results_filtered": "{count} résultat(s) pour \"{query}\" avec filtres", + "search.results_for": "{count} résultat(s) pour \"{query}\"", + "search.save_search": "Sauvegarder la recherche", + "search.saved": "Recherche sauvegardée", + "search.sections_all_vaults": "Tous les vaults", + "search.semantic_score": "sim", + "search.semantic_title": "Recherche sémantique (Alt-S)", + "search.semantic_unavailable": "Recherche sémantique indisponible", + "search.simple_search": "Recherche simple", + "search.smart_scoring": "Scoring intelligent", + "search.sort_date": "Date", + "search.sort_relevance": "Pertinence", + "search.sort_title": "Titre", + "search.whole_word": "Mot entier", + "settings.about": "📦 À propos", + "settings.ai": "🤖 IA", + "settings.backend": "⚙️ Backend", + "settings.backend_hint": "Ces paramètres sont sauvegardés sur le serveur. Certains nécessitent un redémarrage ou une réindexation.", + "settings.backend_section": "Paramètres backend", + "settings.client_label": "Ces paramètres s'appliquent immédiatement côté client.", + "settings.diagnostics": "🩺 Diagnostics", + "settings.history_count_desc": "Entre 5 et 100 fichiers (sauvegarde sur le serveur)", + "settings.history_count_label": "Nombre de fichiers dans l'historique", + "settings.history_section": "Historique récent", + "settings.no_restart_badge": "Redémarrage non requis", + "settings.profile": "👤 Profil", + "settings.reindex": "Forcer réindexation", + "settings.restart_badge": "Redémarrage requis", + "settings.save": "Sauvegarder", + "settings.search": "Recherche", + "settings.tabs": "Tabs", + "settings.search_placeholder": "Rechercher...", + "settings.sync": "🔄 Synchronisation", + "settings.themes": "🎨 Thèmes", + "settings.plugins": "🧩 Plugins", + "share.copied": "Lien copié !", + "share.copy_link": "Copier le lien", + "share.create": "Créer un lien de partage", + "share.expires": "Expire le", + "share.never": "Jamais", + "share.revoke": "Révoquer", + "share.title": "Partage public", + "shortcut.ai_completion": "Completion IA inline (dans l'éditeur)", + "shortcut.close_editor": "Fermer l'éditeur / modale", + "shortcut.command_palette": "Palette de commandes", + "shortcut.editor_help": "Aide de l'éditeur Forge", + "shortcut.file_palette": "Palette de fichiers (nav. rapide)", + "shortcut.focus_search": "Focus barre de recherche", + "shortcut.quick_insert": "Insertion rapide (éditeur Forge)", + "shortcut.quick_search": "Recherche rapide (hors champ texte)", + "shortcut.save_file": "Sauvegarder le fichier ouvert", + "shortcut.search_in_doc": "Rechercher dans le document", + "shortcut.tip_preview": "Survolez un document avec **Ctrl** pour un aperçu rapide. Cliquez sur **Forge** dans la barre d'outils pour l'éditeur avancé.", + "sidebar.all_vaults": "Tous les vaults", + "sidebar.case_sensitive": "Respecter la casse", + "sidebar.clear_filter": "Effacer", + "sidebar.expand_collapse": "Développer/Réduire", + "sidebar.file_icons": "Icônes", + "sidebar.filter_instant": "Recherche instantanée", + "sidebar.filter_path": "Filtres de chemin", + "sidebar.filter_placeholder": "Filtrer fichiers...", + "sidebar.filter_results_grouped": "Résultats groupés", + "sidebar.loading": "Chargement...", + "sidebar.no_recent_files": "Aucun fichier récent", + "sidebar.no_results": "Aucun repertoire ou fichier correspondant.", + "sidebar.no_saved_searches": "Aucune recherche sauvegardée", + "sidebar.open_file": "Ouvrir un fichier", + "sidebar.saved_dirs_tab": "Répertoires", + "sidebar.saved_searches_tab": "Recherches", + "sidebar.sidebar_dropdown": "Menu contextuel vault", + "sidebar.sidebar_filtering": "Filtrage de la sidebar", + "sidebar.tab_backups": "Sauvegardes", + "sidebar.tab_recent": "Récents", + "sidebar.tab_saved": "Recherches", + "sidebar.tab_tags": "Tags", + "sidebar.tab_vaults": "Vaults", + "sidebar.vault_context_all": "Toutes les vaults", + "sidebar.vault_specific": "Vault spécifique", + "sync.autocomplete": "Auto-complétion", + "sync.autocomplete_active": "Auto-complétion active", + "sync.connected": "Synchronisé", + "sync.connected_short": "Connecté", + "sync.disconnected": "Déconnecté", + "sync.event_index_progress": "Vault indexé", + "sync.event_index_start": "Démarrage index.", + "sync.event_index_updated": "Mise à jour", + "sync.event_vault_added": "Vault ajouté", + "sync.event_vault_removed": "Vault supprimé", + "sync.index_complete": "Indexation terminée ({count} fichiers)", + "sync.index_reloaded": "Index complet rechargé", + "sync.index_started": "Indexation démarrée ({count} vaults)", + "sync.install_success": "ObsiGate installé avec succès !", + "sync.model_not_loaded": "Modèle non chargé", + "sync.no_provider": "Aucun fournisseur", + "sync.no_recent_events": "Aucun événement récent", + "sync.not_configured": "Non configuré", + "sync.processing": "Traitement en cours…", + "sync.update": "Mettre à jour", + "sync.updating": "Mise à jour...", + "sync.vault_added": "Vault \"{vault}\" ajouté ({count} fichiers)", + "sync.vault_added_label": "Vault ajouté", + "sync.vault_files": "{vault} ({files} fichiers)", + "sync.vault_indexed_label": "Vault indexé", + "sync.vault_removed": "Vault \"{vault}\" supprimé", + "sync.vault_removed_label": "Vault supprimé", + "sync.verifying": "Vérification…", + "theme.change": "Changer le thème", + "theme.dark": "Sombre", + "theme.light": "Clair", + "theme.high_contrast": "Contraste élevé", + "theme.sepia": "Sépia", + "theme.title": "Thème", + "theme.export_all": "Exporter les thèmes", + "theme.import": "Importer un thème", + "theme.import_success": "{count} thème(s) importé(s)", + "theme.import_error": "Erreur d'importation", + "theme.delete_confirm": "Supprimer ce thème personnalisé ?", + "themes.name_gradients": "Degrades subtils", + "themes.name_terminal": "Noir pur & vert", + "toast.ai_keys_saved": "Clés API sauvegardées", + "toast.ai_no_key": "Aucune clé à sauvegarder", + "toast.bookmark_added": "Ajouté aux favoris", + "toast.bookmark_removed": "Retiré des favoris", + "toast.cannot_delete_self": "Impossible de supprimer son propre compte", + "toast.config_client_saved": "Paramètres client sauvegardés", + "toast.config_reset": "Configuration réinitialisée", + "toast.config_saved": "Configuration sauvegardée", + "toast.conflict_resolved": "Conflit résolu", + "toast.copied": "Copié !", + "toast.copy_error": "Erreur lors de la copie", + "toast.create_error": "Erreur lors de la création", + "toast.created": "Créé", + "toast.delete_error": "Erreur lors de la suppression", + "toast.deleted": "Supprimé", + "toast.dir_created": "Dossier \"{name}\" créé", + "toast.dir_deleted": "Dossier supprimé ({count} fichiers)", + "toast.dir_renamed": "Dossier renommé", + "toast.dir_saved_search": "Répertoire sauvegardé dans les recherches", + "toast.error_delete": "Erreur de suppression", + "toast.error_init": "Erreur lors de l'initialisation", + "toast.error_load": "Erreur de chargement", + "toast.error_network": "Erreur réseau", + "toast.error_rename": "Impossible de renommer cet élément", + "toast.file_created": "Fichier \"{name}\" créé", + "toast.file_deleted": "Fichier supprimé", + "toast.file_renamed": "Fichier renommé", + "toast.hidden_saved": "✓ Paramètres sauvegardés", + "toast.index_reloaded": "Index complet rechargé", + "toast.installed": "ObsiGate installé avec succès !", + "toast.link_created": "Lien créé !", + "toast.moved": "Déplacé", + "toast.no_open_file": "Aucun fichier ouvert", + "toast.not_found_tree": "Élément introuvable dans l'arborescence", + "toast.path_copied": "Chemin copié : {path}", + "toast.reindex_done": "Réindexation terminée", + "toast.reindex_started": "Réindexation en cours...", + "toast.rename_error": "Erreur lors du renommage", + "toast.renamed": "Renommé", + "toast.saved": "Sauvegardé", + "toast.search_saved": "Recherche sauvegardée", + "toast.share_revoked": "Partage révoqué", + "toast.url_required": "URL requise", + "toast.user_created": "Utilisateur créé", + "toast.user_deleted": "Utilisateur supprimé", + "toast.user_modified": "Utilisateur modifié", + "toast.viewer_error": "Erreur lors du chargement du viewer", + "toc.hide_panel": "Masquer le panneau", + "toc.no_headings": "Aucun titre dans ce document", + "toc.title": "SUR CETTE PAGE", + "tree.new_file": "Nouveau fichier", + "tree.new_folder": "Nouveau dossier", + "tree.vault_home": "Accueil du vault", + "ui.backups_versions": "Backups / Versions", + "ui.cannot_rename": "Impossible de renommer cet élément", + "ui.delete_name_empty": "Le nom ne peut pas etre vide", + "ui.element_not_found": "Élément introuvable dans l'arborescence", + "ui.vault_readonly": "Vault en lecture seule", + "vault.add_dynamic": "Ajouter une vault", + "vault.reindex": "Réindexer la vault", + "vault.remove_dynamic": "Retirer la vault", + "vaulthome.empty": "Aucun fichier dans ce repertoire", + "vaulthome.error_loading": "Erreur de chargement:", + "vaulthome.file_count": "{count} fichier", + "vaulthome.file_count_plural": "{count} fichiers", + "vaulthome.loading": "Chargement des fichiers...", + "vaulthome.size_bytes": "o", + "vaulthome.size_kb": "Ko", + "vaulthome.size_mb": "Mo", + "viewer.backlinks": "Backlinks", + "viewer.binary_download": "Télécharger le fichier", + "viewer.binary_unsupported": "Fichier binaire non supporté", + "viewer.bookmark_add": "Ajouter aux bookmarks", + "viewer.bookmark_remove": "Retirer des bookmarks", + "viewer.bookmark_toggle": "Ajouter/Retirer des bookmarks", + "viewer.breadcrumb_home": "Accueil", + "viewer.click_to_download": "Cliquez pour le télécharger", + "viewer.copied": "Copié !", + "viewer.copy": "Copier", + "viewer.copy_error": "Erreur lors de la copie", + "viewer.download": "Télécharger", + "viewer.download_md": "Télécharger en .md", + "viewer.download_file": "Télécharger le fichier", + "viewer.pretty": "Pretty", + "viewer.pretty_title": "Mode formaté : couleurs et numéros de ligne", + "viewer.download_pdf": "Télécharger en PDF", + "viewer.edit": "Éditer", + "viewer.error": "Erreur de chargement", + "viewer.export": "Exporter", + "viewer.export_done": "Export terminé", + "viewer.export_epub": "Exporter en ePub", + "viewer.export_error": "Erreur d'export :", + "viewer.export_html": "Exporter en HTML", + "viewer.export_md_bundle": "Exporter en bundle Markdown (.zip)", + "viewer.export_start": "Export en cours...", + "viewer.export_title": "Exporter le document", + "viewer.forge_brand": "Forge", + "viewer.forge_title": "Forge (nouvel éditeur)", + "viewer.index_start": "Démarrage index.", + "viewer.index_updated": "Mise à jour", + "viewer.loaded_from_cache": "Fichier chargé depuis le cache hors-ligne", + "viewer.loading": "Chargement du fichier...", + "viewer.markdown": "Markdown", + "viewer.metadata_created": "Créé", + "viewer.metadata_modified": "Modifié", + "viewer.metadata_path": "Chemin", + "viewer.metadata_size": "Taille", + "viewer.metadata_tags": "Tags", + "viewer.metadata_vault": "Vault", + "viewer.no_headings": "Aucun titre dans ce document", + "viewer.on_this_page": "SUR CETTE PAGE", + "viewer.outline": "Plan", + "viewer.pdf_pages": "{count} pages", + "viewer.popout": "Ouvrir dans une fenêtre", + "viewer.raw": "Brut", + "viewer.share": "Partager", + "viewer.shared_doc_title": "Document partagé — cliquer pour gérer", + "viewer.source": "Source", + "viewer.syncing": "Mise à jour...", + "viewer.toc": "Table des matières", + "viewer.unsupported_file": "Ce fichier est binaire et ne peut pas être affiché", + "webhook.trigger_create": "Création via API ou palette", + "webhook.trigger_delete": "Suppression via API ou éditeur", + "webhook.trigger_dir_create": "Création de dossier via API", + "webhook.trigger_dir_delete": "Suppression de dossier via l'API", + "webhook.trigger_dir_rename": "Renommage de dossier via l'API", + "webhook.trigger_rename": "Renommage via l'API", + "settings.security": "🔒 Sécurité du compte", + "settings.security_desc": "Activez l'authentification à deux facteurs (2FA) pour renforcer la sécurité de votre compte.", + "mfa.title": "Authentification à deux facteurs", + "mfa.subtitle": "Entrez le code à 6 chiffres de votre application d'authentification.", + "mfa.verify": "Vérifier", + "mfa.verifying": "Vérification...", + "mfa.use_recovery": "Utiliser un code de récupération", + "mfa.back_to_login": "Retour à la connexion", + "mfa.recovery_title": "Code de récupération", + "mfa.recovery_subtitle": "Entrez l'un de vos codes de récupération (format : XXXX-XXXX).", + "mfa.use_totp": "Utiliser le code authenticator", + "mfa.status_label": "Authentification à deux facteurs", + "mfa.enabled": "Activée", + "mfa.disabled": "Désactivée", + "mfa.enabled_desc": "Votre compte est protégé par l'authentification à deux facteurs.", + "mfa.setup_desc": "Ajoutez une couche de sécurité supplémentaire à votre compte avec le TOTP.", + "mfa.enable_btn": "Activer la 2FA", + "mfa.disable_btn": "Désactiver la 2FA", + "mfa.scan_qr": "Scannez ce QR code avec votre application d'authentification", + "mfa.manual_entry": "Saisie manuelle (si vous ne pouvez pas scanner)", + "mfa.enter_code": "Entrez le code à 6 chiffres pour confirmer", + "mfa.confirm_enable": "Confirmer et activer", + "mfa.recovery_codes_title": "Codes de récupération", + "mfa.recovery_codes_warning": "Enregistrez ces codes dans un endroit sûr. Chaque code ne peut être utilisé qu'une seule fois.", + "mfa.copy_codes": "Copier", + "mfa.download_codes": "Télécharger", + "mfa.done": "Terminé", + "mfa.codes_copied": "Codes de récupération copiés !", + "mfa.disable_confirm_title": "Désactiver la 2FA", + "mfa.disable_confirm_desc": "Entrez votre mot de passe et un code TOTP valide pour désactiver l'authentification à deux facteurs.", + "mfa.password_label": "Mot de passe", + "mfa.password_placeholder": "Votre mot de passe actuel", + "mfa.totp_code_label": "Code TOTP", + "mfa.disable_confirm_btn": "Désactiver la 2FA", + "mfa.disabled_success": "La 2FA a été désactivée.", + "mfa.fill_all_fields": "Veuillez remplir tous les champs.", + "bookslm.title": "BooksLM", + "bookslm.files_indexed": "{count} fichiers indexés", + "bookslm.chars_loaded": "{chars} caractères chargés", + "bookslm.placeholder": "", + "bookslm.send": "Envoyer", + "bookslm.new_conversation": "Nouvelle conversation", + "bookslm.export": "Exporter la conversation", + "bookslm.toggle_sidebar": "Masquer/Afficher la sidebar AI", + "bookslm.copy": "Copier", + "bookslm.insert": "Ajouter", + "bookslm.insert_hint": "Ajouter la réponse au document ouvert dans l'éditeur", + "bookslm.inserted": "Réponse ajoutée au document", + "bookslm.insert_no_editor": "Aucun document ouvert dans l'éditeur", + "ai.steps_count": "{count} étapes", + "bookslm.copied": "Réponse copiée dans le presse-papiers", + "bookslm.error": "Erreur du service AI", + "bookslm.regenerate": "Régénérer", + "bookslm.suggestion_summary": "Résume ce répertoire", + "bookslm.suggestion_themes": "Quels sont les thèmes principaux ?", + "bookslm.suggestion_contradictions": "Y a-t-il des contradictions entre ces documents ?", + "bookslm.no_context": "Aucun fichier trouvé dans ce répertoire", + "bookslm.context_too_large": "Répertoire trop volumineux — certains fichiers ont été tronqués", + "bookslm.source": "Source", + "bookslm.session_history": "Historique des sessions", + "bookslm.session_delete": "Supprimer la session", + "bookslm.history_empty": "Aucune session enregistrée", + "bookslm.untitled": "Conversation sans titre", + "bookslm.no_vault": "Aucun vault actif pour ouvrir ce lien", + "bookslm.copied_name": "Nom copié : {name}", + "palette.bookslm_open": "BooksLM: Ouvrir pour le répertoire courant", + "palette.bookslm_open_desc": "Ouvre l'assistant AI pour le contexte courant (documents ouverts ou général)", + "palette.bookslm_new": "BooksLM: Nouvelle conversation", + "palette.bookslm_new_desc": "Réinitialise la conversation de l'assistant AI", + "fab.open": "Ouvrir l'assistant AI", + "fab.close": "Fermer l'assistant AI", + "mfa.webauthn_title": "Clés de sécurité (WebAuthn)", + "mfa.webauthn_desc": "Authentifiez-vous avec une clé physique (YubiKey) ou la biométrie de votre appareil (Windows Hello, Touch ID).", + "mfa.webauthn_none": "Aucune clé enregistrée.", + "mfa.webauthn_add": "Ajouter une clé de sécurité", + "mfa.webauthn_label_prompt": "Nom de la clé (ex : YubiKey de poche)", + "mfa.webauthn_added": "Clé de sécurité enregistrée.", + "mfa.webauthn_removed": "Clé de sécurité supprimée.", + "mfa.webauthn_remove": "Retirer", + "mfa.webauthn_remove_confirm": "Entrez votre mot de passe pour retirer cette clé :", + "mfa.webauthn_prompt": "Présentez votre clé de sécurité ou confirmez avec Windows Hello.", + "mfa.webauthn_btn": "Valider avec ma clé", + "mfa.webauthn_cancelled": "Cérémonie WebAuthn annulée.", + "mfa.webauthn_no_key": "Aucune clé de sécurité enregistrée pour ce compte.", + "plugins.title": "🧩 Plugins", + "plugins.description": "Étendez ObsiGate avec des renderers personnalisés, filtres de recherche et actions d'éditeur.", + "plugins.install": "Installer le plugin", + "plugins.template": "Voir le modèle", + "plugins.none": "Aucun plugin installé.", + "plugins.manifest_json": "Manifeste (plugin.json)", + "plugins.code": "Code du plugin (fichier principal)", + "plugins.view_code": "Voir le code", + "plugins.uninstall": "Désinstaller", + "plugins.enable": "Activer", + "plugins.disable": "Désactiver", + "plugins.enabled": "Plugin '{name}' activé.", + "plugins.disabled": "Plugin '{name}' désactivé.", + "plugins.installed": "Plugin '{name}' installé avec succès.", + "plugins.uninstalled": "Plugin '{name}' désinstallé.", + "plugins.confirm_uninstall": "Désinstaller le plugin '{name}' ? Cette action est irréversible.", + "help.plugins_title": "🧩 Plugins", + "help.plugins_intro": "Les plugins étendent ObsiGate : affichage personnalisé des fichiers, filtres de recherche, actions d'édition, widgets et intégrations. Ils s'exécutent dans des Web Workers sandboxés — isolés de la page pour la sécurité.", + "help.plugins_install": "Installation", + "help.plugins_install_1": "Ouvrez Réglages → 🧩 Plugins.", + "help.plugins_install_2": "Cliquez « Installer un plugin ».", + "help.plugins_install_3": "Sélectionnez un fichier .zip contenant le manifest plugin.json et le code du plugin.", + "help.plugins_install_4": "Le manifest est validé (nom, version semver, hooks, permissions) avant installation.", + "help.plugins_manage": "Gestion", + "help.plugins_manage_1": "Activer / Désactiver : boutons sur chaque plugin — les hooks ne tournent que si le plugin est activé.", + "help.plugins_manage_2": "Désinstaller : supprime définitivement le plugin du vault.", + "help.plugins_manage_3": "Code : visualisez le code source du plugin installé.", + "help.plugins_dev": "Développer un plugin", + "help.plugins_dev_intro": "Téléchargez le modèle depuis Réglages → Plugins → « Obtenir le modèle ». Un plugin se compose d'un manifest plugin.json et d'un fichier principal (ex. index.js).", + "help.plugins_hooks": "Hooks disponibles", + "help.plugins_hook_render": "onFileRender", + "help.plugins_hook_render_desc": "transforme le contenu affiché d'un fichier.", + "help.plugins_hook_search": "onSearchFilter", + "help.plugins_hook_search_desc": "filtre les résultats de recherche.", + "help.plugins_hook_editor": "onEditorAction", + "help.plugins_hook_editor_desc": "intercepte les actions de l'éditeur.", + "help.plugins_hook_sidebar": "onSidebarItem", + "help.plugins_hook_sidebar_desc": "ajoute des éléments à la barre latérale.", + "help.plugins_hook_file": "onFileCreate / onFileDelete", + "help.plugins_hook_file_desc": "réagit à la création / suppression de fichiers.", + "help.plugins_hook_vault": "onVaultMount", + "help.plugins_hook_vault_desc": "exécuté au chargement d'un vault.", + "help.plugins_security": "Sécurité", + "help.plugins_security_1": "Sandbox Web Worker : le code plugin tourne isolé, sans accès direct au DOM.", + "help.plugins_security_2": "Permissions : chaque hook déclaré doit être satisfait par les permissions du manifest.", + "help.plugins_security_3": "Empaquetage sécurisé : le .zip est vérifié contre le path traversal à l'installation.", + "help.plugins_security_4": "Admin uniquement : l'installation et la suppression requièrent le rôle admin.", + "help.plugins_template": "Utilisez le bouton Template dans Paramètres > Plugins pour générer un plugin starter valide.", + "help.excalidraw_title": "🎨 Diagrammes Excalidraw", + "help.excalidraw_intro": "Les fichiers .excalidraw et .excalidraw.md s'ouvrent dans un éditeur visuel Excalidraw complet, intégré dans une iframe sandboxée.", + "help.excalidraw_open_title": "Ouverture", + "help.excalidraw_open": "Cliquez sur un fichier .excalidraw dans l'arborescence : l'éditeur s'ouvre à la place du viewer markdown.", + "help.excalidraw_edit": "Dessinez, ajoutez des formes, du texte, des flèches et des images — l'expérience Excalidraw complète.", + "help.excalidraw_save_title": "Sauvegarde", + "help.excalidraw_save": "Les modifications sont sauvegardées automatiquement (2 s) ou avec Ctrl+S. L'éditeur suit le thème clair/sombre.", + "help.excalidraw_search_title": "Recherche", + "help.excalidraw_search": "Le texte des éléments du diagramme est extrait à l'indexation : il est donc recherchable via la recherche full-text.", + "help.excalidraw_compat": "Les fichiers créés avec le plugin Obsidian Excalidraw (y compris le format .excalidraw.md compressé) sont compatibles.", + "help.footer_tagline": "- Porte d'entrée web pour vos vaults Obsidian" } \ No newline at end of file diff --git a/frontend/style.css b/frontend/style.css index c4babdd..d495704 100644 --- a/frontend/style.css +++ b/frontend/style.css @@ -9434,22 +9434,30 @@ body.popup-mode .content-area { .bookslm-activity.done .bookslm-activity-spinner, .bookslm-activity.error .bookslm-activity-spinner { animation: none; border-top-color: currentColor; } @keyframes bookslm-spin { to { transform: rotate(360deg); } } -.bookslm-messages { flex: 1; overflow-y: auto; padding: 16px; display: flex; flex-direction: column; gap: 12px; } -/* The newest turn (the assistant's answer being written) is pinned to the - very top of the messages window via flex `order`, so a submitted post and - its live result stay visible regardless of auto-scroll and prior history. */ -.bookslm-msg { display: flex; flex-direction: column; gap: 4px; } -.bookslm-msg.latest { order: -1; } -.bookslm-msg-meta { font-size: 10px; color: var(--text-secondary); opacity: 0.85; +/* Notion-style AI thread: only this zone scrolls; entries stack vertically + with generous spacing. The latest user post is anchored to the top of the + visible area on send (scrollIntoView block:start + scroll-margin). */ +.bookslm-messages { flex: 1; overflow-y: auto; padding: 20px 16px; display: flex; + flex-direction: column; gap: 24px; } +.bookslm-msg { display: flex; flex-direction: column; gap: 4px; scroll-margin-top: 14px; } +.bookslm-msg.user { align-self: flex-end; max-width: 80%; } +.bookslm-msg.assistant { align-self: stretch; width: 100%; } +.bookslm-msg-meta { font-size: 11px; color: var(--text-secondary); opacity: 0.75; padding: 0 2px; align-self: flex-start; user-select: none; } -.bookslm-copy-btn { align-self: flex-end; font-size: 10px; padding: 2px 8px; - border-radius: 6px; border: 1px solid var(--border); background: var(--surface); - color: var(--text-secondary); cursor: pointer; opacity: 0; transition: opacity 0.15s; } -.bookslm-msg:hover .bookslm-copy-btn { opacity: 1; } -.bookslm-copy-btn:hover { color: var(--accent); border-color: var(--accent); } -.bookslm-bubble { max-width: 85%; padding: 10px 14px; border-radius: 12px; font-size: 14px; line-height: 1.5; word-wrap: break-word; } -.bookslm-bubble.user { align-self: flex-end; background: var(--accent); color: #fff; border-bottom-right-radius: 4px; } -.bookslm-bubble.assistant { align-self: flex-start; background: var(--surface2); color: var(--text-primary); border-bottom-left-radius: 4px; } +/* Hover-revealed action bar (Copier / Ajouter). */ +.bookslm-msg-actions { display: flex; gap: 6px; margin-top: 4px; opacity: 0; + transition: opacity 0.15s; } +.bookslm-msg.user .bookslm-msg-actions { justify-content: flex-end; } +.bookslm-msg:hover .bookslm-msg-actions, +.bookslm-msg-actions:focus-within { opacity: 1; } +.bookslm-msg-action { display: inline-flex; align-items: center; gap: 5px; + font-size: 11px; padding: 3px 9px; border-radius: 6px; border: 1px solid transparent; + background: transparent; color: var(--text-secondary); cursor: pointer; } +.bookslm-msg-action:hover { background: var(--surface2); color: var(--text-primary); + border-color: var(--border); } +.bookslm-bubble { max-width: 85%; padding: 10px 14px; border-radius: 18px; font-size: 14px; line-height: 1.5; word-wrap: break-word; } +.bookslm-bubble.user { align-self: flex-end; background: var(--surface2); color: var(--text-primary); border-bottom-right-radius: 6px; } +.bookslm-bubble.assistant { align-self: flex-start; background: transparent; padding: 0; width: 100%; max-width: 100%; color: var(--text-primary); } .bookslm-bubble.assistant code { background: rgba(0,0,0,0.2); padding: 1px 4px; border-radius: 3px; font-size: 0.9em; } .bookslm-bubble.assistant pre { background: rgba(0,0,0,0.3); padding: 10px; border-radius: 6px; overflow-x: auto; margin: 8px 0; } .bookslm-sources { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 8px; } @@ -9484,7 +9492,13 @@ body.popup-mode .content-area { /* Agent-mode toggle in the header. */ .bookslm-header button.bookslm-btn-agent.active { color: var(--accent); background: var(--surface2); } /* Tool-call trace shown above an assistant answer (agent mode). */ -.bookslm-tool-trace { display: flex; flex-direction: column; gap: 2px; margin-bottom: 6px; } +/* Agent tool calls collapse into a discreet “N steps” line (Notion-style). */ +.bookslm-tool-trace { margin: 0 0 8px; } +.bookslm-tool-trace summary { font-size: 11px; color: var(--text-secondary); + cursor: pointer; user-select: none; list-style: none; } +.bookslm-tool-trace summary::before { content: '> '; } +.bookslm-tool-trace[open] summary { margin-bottom: 4px; } +.bookslm-tool-trace .bookslm-tool-line { padding-left: 12px; } .bookslm-tool-line { font-size: 11px; color: var(--text-secondary); } .bookslm-tool-line.failed { color: #f87171; } /* Mutation confirmation card (two-step propose/apply). */ diff --git a/frontend/sw.js b/frontend/sw.js index 629302f..2036028 100644 --- a/frontend/sw.js +++ b/frontend/sw.js @@ -11,7 +11,7 @@ * cache or Cloudflare does NOT clear the Service Worker Cache Storage, which is * a separate store. Bumping SW_VERSION invalidates it on every release. */ -const SW_VERSION = 'v8'; +const SW_VERSION = 'v9'; const CODE_CACHE = `obsigate-code-${SW_VERSION}`; const RUNTIME_CACHE = `obsigate-runtime-${SW_VERSION}`; const API_CACHE = `obsigate-api-${SW_VERSION}`; diff --git a/tests/frontend/ai.test.mjs b/tests/frontend/ai.test.mjs index d94d1b0..72e150b 100644 --- a/tests/frontend/ai.test.mjs +++ b/tests/frontend/ai.test.mjs @@ -104,6 +104,7 @@ async function main() { const bookslmMod = await import(pathToFileURL(path.join(JS_DIR, "bookslm.js")).href); const { BooksLM, MODE } = bookslmMod; const { collectOpenDocuments, documentsSignature } = bookslmMod; + const { state } = await import(pathToFileURL(path.join(JS_DIR, "state.js")).href); // ── 1. Rewrite modal resolves with the typed instruction ── await test("rewrite modal returns the typed instruction on confirm", async () => { @@ -190,87 +191,141 @@ async function main() { panel.remove(); }); - // ── 4b. Latest turn pinned to the top + provider/model tag + copy buttons ── - await test("latest turn (user post + answer) is pinned to the top of messages", () => { - const b = new BooksLM(); - const panel = b._render(); - b._panel = panel; - document.body.appendChild(panel); - b._messages = [ - { role: "user", content: "ancien" }, - { role: "assistant", content: "ancienne réponse" }, - { role: "user", content: "Nouveau sujet" }, - { role: "assistant", content: "Nouvelle réponse", provider: "deepseek", model: "deepseek-chat" }, - ]; - b._renderMessages(); - const msgs = panel.querySelectorAll(".bookslm-msg"); - // Both bubbles of the latest turn carry the pinning class... - assert.ok(msgs[2].classList.contains("latest"), "latest user pinned"); - assert.ok(msgs[3].classList.contains("latest"), "latest assistant pinned"); - assert.ok(!msgs[0].classList.contains("latest"), "older user not pinned"); - assert.ok(!msgs[1].classList.contains("latest"), "older assistant not pinned"); - panel.remove(); - }); + // ── 4b. Notion-style thread: top-anchored latest post, provider/model tag, action bar ── + await test("thread renders chronologically (user post above its answer)", () => { + const b = new BooksLM(); + const panel = b._render(); + b._panel = panel; + document.body.appendChild(panel); + b._messages = [ + { role: "user", content: "ancien" }, + { role: "assistant", content: "ancienne réponse" }, + { role: "user", content: "Nouveau sujet" }, + { role: "assistant", content: "Nouvelle réponse", provider: "deepseek", model: "deepseek-chat" }, + ]; + b._renderMessages(); + const roles = [...panel.querySelectorAll(".bookslm-messages > .bookslm-msg")].map((el) => + el.classList.contains("user") ? "user" : "assistant"); + assert.deepEqual(roles, ["user", "assistant", "user", "assistant"], "chronological order kept"); + // No background bubble on the assistant answer (Notion-style full-width text). + const aBubble = panel.querySelector(".bookslm-msg.assistant .bookslm-bubble"); + assert.ok(aBubble.classList.contains("assistant"), "assistant bubble class"); + panel.remove(); + }); - await test("assistant answer shows a discreet provider/model tag", () => { - const b = new BooksLM(); - const panel = b._render(); - b._panel = panel; - document.body.appendChild(panel); - b._messages = [ - { role: "user", content: "Bonjour" }, - { role: "assistant", content: "Réponse", provider: "deepseek", model: "deepseek-v3" }, - ]; - b._renderMessages(); - const meta = panel.querySelector(".bookslm-msg.assistant.latest .bookslm-msg-meta"); - assert.ok(meta, "provider/model meta line rendered"); - assert.equal(meta.textContent, "deepseek · deepseek-v3"); - panel.remove(); - }); + await test("sending anchors the latest user post to the top of the thread", async () => { + const b = new BooksLM(); + const panel = b._render(); + b._panel = panel; + document.body.appendChild(panel); + b._messages = [ + { role: "user", content: "ancien" }, + { role: "assistant", content: "ancienne réponse" }, + { role: "user", content: "Dernier sujet" }, + ]; + b._renderMessages(); + let anchored = null; + const users = panel.querySelectorAll(".bookslm-msg.user"); + const last = users[users.length - 1]; + last.scrollIntoView = (opts) => { anchored = opts; }; + b._anchorLatestUser(); + await sleep(10); // requestAnimationFrame shim → setTimeout(0) + assert.ok(anchored, "scrollIntoView called on the latest user post"); + assert.equal(anchored.block, "start"); + panel.remove(); + }); - await test("both user and assistant blocks expose a copy button", () => { - const b = new BooksLM(); - const panel = b._render(); - b._panel = panel; - document.body.appendChild(panel); - b._messages = [ - { role: "user", content: "Question copiable" }, - { role: "assistant", content: "Réponse copiable", provider: "deepseek", model: "m" }, - ]; - b._renderMessages(); - const wrapped = panel.querySelectorAll(".bookslm-msg"); - assert.equal(wrapped.length, 2); - // Both wraps carry a copy button. - assert.ok(panel.querySelector(".bookslm-msg.user .bookslm-copy-btn"), "user copy button"); - assert.ok(panel.querySelector(".bookslm-msg.assistant .bookslm-copy-btn"), "assistant copy button"); - panel.remove(); - }); + await test("assistant answer shows a discreet provider/model tag", () => { + const b = new BooksLM(); + const panel = b._render(); + b._panel = panel; + document.body.appendChild(panel); + b._messages = [ + { role: "user", content: "Bonjour" }, + { role: "assistant", content: "Réponse", provider: "deepseek", model: "deepseek-v3" }, + ]; + b._renderMessages(); + const meta = panel.querySelector(".bookslm-msg.assistant .bookslm-msg-meta"); + assert.ok(meta, "provider/model meta line rendered"); + assert.equal(meta.textContent, "deepseek · deepseek-v3"); + panel.remove(); + }); - await test("copy button copies the raw message text to the clipboard", async () => { - const b = new BooksLM(); - const panel = b._render(); - b._panel = panel; - document.body.appendChild(panel); - b._messages = [{ role: "user", content: "texte à copier" }]; - b._renderMessages(); - const copied = []; - b._copyText = (t) => copied.push(t); - const btn = panel.querySelector(".bookslm-msg.user .bookslm-copy-btn"); - assert.ok(btn, "copy button present"); - btn.click(); - assert.deepEqual(copied, ["texte à copier"], "copy handler receives raw content"); - panel.remove(); - }); + await test("action bar: user has copy, assistant has copy + add", () => { + const b = new BooksLM(); + const panel = b._render(); + b._panel = panel; + document.body.appendChild(panel); + b._messages = [ + { role: "user", content: "Question copiable" }, + { role: "assistant", content: "Réponse copiable", provider: "deepseek", model: "m" }, + ]; + b._renderMessages(); + assert.ok(panel.querySelector(".bookslm-msg.user .bookslm-msg-action-copy"), "user copy action"); + assert.ok(!panel.querySelector(".bookslm-msg.user .bookslm-msg-action-insert"), "no add on user post"); + assert.ok(panel.querySelector(".bookslm-msg.assistant .bookslm-msg-action-copy"), "assistant copy action"); + assert.ok(panel.querySelector(".bookslm-msg.assistant .bookslm-msg-action-insert"), "assistant add action"); + panel.remove(); + }); - await test("empty user content renders no copy button", () => { - const b = new BooksLM(); - const panel = b._render(); - b._panel = panel; - b._messages = [{ role: "user", content: " " }]; - b._renderMessages(); - assert.equal(panel.querySelectorAll(".bookslm-copy-btn").length, 0); - panel.remove(); - }); + await test("copy action copies the raw message text to the clipboard", async () => { + const b = new BooksLM(); + const panel = b._render(); + b._panel = panel; + document.body.appendChild(panel); + b._messages = [{ role: "user", content: "texte à copier" }]; + b._renderMessages(); + const copied = []; + b._copyText = (t) => copied.push(t); + const btn = panel.querySelector(".bookslm-msg.user .bookslm-msg-action-copy"); + assert.ok(btn, "copy button present"); + btn.click(); + assert.deepEqual(copied, ["texte à copier"], "copy handler receives raw content"); + panel.remove(); + }); + + await test("add action inserts the answer at the editor cursor", () => { + const b = new BooksLM(); + const panel = b._render(); + b._panel = panel; + document.body.appendChild(panel); + b._messages = [{ role: "assistant", content: "Réponse à insérer" }]; + b._renderMessages(); + const dispatched = []; + state.editorView = { + state: { selection: { main: { to: 7 } } }, + dispatch: (spec) => dispatched.push(spec), + focus: () => {}, + }; + panel.querySelector(".bookslm-msg.assistant .bookslm-msg-action-insert").click(); + assert.equal(dispatched.length, 1, "editor dispatch called"); + assert.ok(dispatched[0].changes.insert.includes("Réponse à insérer")); + state.editorView = null; + panel.remove(); + }); + + await test("empty content renders no action bar", () => { + const b = new BooksLM(); + const panel = b._render(); + b._panel = panel; + b._messages = [{ role: "user", content: " " }]; + b._renderMessages(); + assert.equal(panel.querySelectorAll(".bookslm-msg-actions").length, 0); + panel.remove(); + }); + + await test("agent tool calls collapse into a discreet steps block", () => { + const b = new BooksLM(); + const trace = b._renderToolActivity([ + { name: "read_file", ok: true }, + { name: "search", ok: true }, + ]); + assert.equal(trace.tagName, "DETAILS", "collapsible details element"); + const summary = trace.querySelector("summary"); + assert.ok(summary, "summary present"); + assert.ok(summary.textContent.trim().length > 0, "summary shows the steps label"); + assert.equal(trace.querySelectorAll(".bookslm-tool-line").length, 2, "each step listed inside"); + }); // ── 5. Source guards: no window.prompt() and authenticated BooksLM ── await test("ai.js no longer uses window.prompt()", async () => {