From f91a3865665ad0816c04801a52bdd8ce6296c094 Mon Sep 17 00:00:00 2001 From: Bruno Charest Date: Thu, 18 Jun 2026 14:01:37 -0400 Subject: [PATCH] =?UTF-8?q?feat:=20comprehensive=20i18n=20coverage=20?= =?UTF-8?q?=E2=80=94=20all=20static=20text=20+=20auto-translate=20toasts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Locale files expanded to 300+ keys covering all sections: - Header menu, sidebar, search, viewer, editor, AI toolbar - Config modal (all sections), help modal, dashboard, graph, mermaid - Context menus, offline UI, palette, auth, shares, backups - All toasts and confirmations Automatic data-i18n tagging in index.html (177 attributes) via Python script — handles all user-facing static text nodes. Zero concatenation errors verified. i18n.js: added tr() reverse-lookup function (French text → key → current locale translation) ui.js: showToast() now auto-translates via tr() — all 24 existing toast call sites benefit automatically --- frontend/index.html | 362 +++++++++++++++++++-------------------- frontend/js/i18n.js | 24 +++ frontend/js/ui.js | 4 +- frontend/locales/en.json | 292 ++++++++++++++++++++++++++++++- frontend/locales/fr.json | 290 ++++++++++++++++++++++++++++++- 5 files changed, 774 insertions(+), 198 deletions(-) diff --git a/frontend/index.html b/frontend/index.html index 402d2a6..8f9969a 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -182,7 +182,7 @@
@@ -330,13 +330,13 @@ type="text" class="search-filter-input" id="search-include-input" - placeholder="Inclure: **/*.md, notes/**" + data-i18n-placeholder="search.include_placeholder" placeholder="Inclure: **/*.md, notes/**" /> @@ -352,7 +352,7 @@ id="search-dropdown-history" >
- Historique + Historique
@@ -896,8 +892,8 @@ aria-labelledby="sidebar-tab-saved" >
- - + +
@@ -988,7 +984,7 @@ id="dashboard-stats-grid" class="dashboard-stats-grid" > -
+
Chargement...
@@ -1161,7 +1157,7 @@ class="dashboard-recent-empty hidden" > - Aucun fichier récent + Aucun fichier récent

Ouvrez un fichier pour le voir apparaître ici @@ -1183,7 +1179,7 @@ class="dashboard-recent-empty" > - Aucun document partagé + Aucun document partagé

Partagez un document pour le voir apparaître ici @@ -1209,7 +1205,7 @@ aria-label="Table des matières" >

@@ -1262,7 +1258,7 @@
- ObsiGate + ObsiGate
-
Configurations
+
Configurations
-
@@ -1698,7 +1690,7 @@
-

Filtrage de tags

+

Filtrage de tags

Définissez les patterns de tags à masquer dans la sidebar. Vous pouvez utiliser des @@ -1717,10 +1709,8 @@ placeholder="Ex: #<% ... %> ou #{{ ... }}" class="config-input" /> -

@@ -1742,7 +1732,7 @@ class="config-section help-section" id="cfg-sync" > -

Synchronisation automatique

+

Synchronisation automatique

Surveillance des fichiers en temps réel via watchdog. Les modifications sont détectées @@ -1851,7 +1841,7 @@ border-radius: 4px; " > - i️ Note : Tous les fichiers + i️ Note : Tous les fichiers sont toujours indexés et cherchables. Ce paramètre contrôle uniquement leur visibilité dans l'interface. @@ -1879,7 +1869,7 @@ class="config-section help-section" id="cfg-diags" > -

Diagnostics

+

Diagnostics

Statistiques de l'index et du moteur de recherche. @@ -1888,15 +1878,13 @@ id="config-diagnostics" class="config-diagnostics" > -

+
Chargement...
- @@ -1909,7 +1897,7 @@

🤖 Cles API Intelligence Artificielle

Configurez vos cles API. Cliquez sur - Tester pour charger les + Tester pour charger les modeles.

@@ -1979,16 +1967,12 @@ class="config-actions-row" style="margin-top: 16px" > - -
-
Chargement...
+
Chargement...
@@ -2058,7 +2042,7 @@ id="config-about" class="config-diagnostics" > -
+
Chargement...
@@ -2076,7 +2060,7 @@ @@ -2087,10 +2071,8 @@ class="config-input" style="flex: 1" /> -
@@ -2701,7 +2683,7 @@
-
Guide officiel
+
Guide officiel

📘 Bienvenue dans ObsiGate

ObsiGate est votre porte d'entrée web vers @@ -2733,17 +2715,17 @@ Expérience - Simple + Simple

Recherche - Instantanée + Instantanée
Accès - Multi-vault + Multi-vault
@@ -2751,91 +2733,91 @@

🧭 Interface utilisateur

-

En-tête

+

En-tête

La barre supérieure contient les éléments essentiels :

  • - Bouton menu hamburger + Bouton menu hamburger (mobile) : Affiche/masque la sidebar
  • - Bouton toggle sidebar + Bouton toggle sidebar (desktop) : Masque la sidebar pour plus d'espace
  • - Logo ObsiGate : Retour à + Logo ObsiGate : Retour à l'accueil
  • - Barre de recherche : + Barre de recherche : Recherche globale avec autocomplétion
  • - Indicateur de vault : + Indicateur de vault : Affiche le contexte actif (All, vault1, etc.)
  • - Menu Options : Accès aux + Menu Options : Accès aux paramètres, thème, aide
-

Sidebar (barre latérale)

-

La sidebar est divisée en deux onglets :

+

Sidebar (barre latérale)

+

La sidebar est divisée en deux onglets :

  • - Vaults : Arborescence des + Vaults : Arborescence des fichiers et dossiers
  • - Tags : Nuage de tags + Tags : Nuage de tags cliquables
-

Fonctionnalités de la sidebar :

+

Fonctionnalités de la sidebar :

  • - Filtrage : Barre de + Filtrage : Barre de recherche pour filtrer fichiers/tags
  • - Sélection rapide : Dropdown + Sélection rapide : Dropdown pour changer de vault
  • - Redimensionnement : Glissez + Redimensionnement : Glissez le bord droit pour ajuster la largeur
  • - Masquage : Cliquez sur + Masquage : Cliquez sur l'icône sidebar dans le header
-

Zone de contenu

-

La zone centrale affiche :

+

Zone de contenu

+

La zone centrale affiche :

  • - Breadcrumb : Chemin du + Breadcrumb : Chemin du fichier (cliquable pour repositionner la sidebar)
  • - Titre et tags : Métadonnées + Titre et tags : Métadonnées du fichier
  • - Boutons d'action : Copier, + Boutons d'action : Copier, Source, Télécharger, Éditer, Ouvrir dans nouvelle fenêtre
  • - Contenu rendu : Markdown + Contenu rendu : Markdown avec wikilinks et images
@@ -2844,7 +2826,7 @@

🗺️ Navigation

-

Arborescence des vaults

+

Arborescence des vaults

Cliquez sur un vault pour l'ouvrir et voir son contenu. Les dossiers affichent un chevron et un @@ -2852,82 +2834,82 @@

  • - Développer/Réduire : + Développer/Réduire : Cliquez sur un dossier
  • - Ouvrir un fichier : Cliquez + Ouvrir un fichier : Cliquez sur le nom du fichier
  • - Icônes : Chaque type de + Icônes : Chaque type de fichier a son icône (markdown, code, etc.)
-

Filtrage de la sidebar

+

Filtrage de la sidebar

Utilisez la barre de filtrage en haut de la sidebar pour rechercher rapidement :

  • - Recherche instantanée : + Recherche instantanée : Tapez pour filtrer fichiers et dossiers
  • - Case-sensitive : Bouton + Case-sensitive : Bouton "Aa" pour respecter la casse
  • - Effacer : Bouton "×" pour + Effacer : Bouton "×" pour réinitialiser le filtre
  • - Résultats groupés : + Résultats groupés : Affichage par vault avec chemins complets
-

Breadcrumb et repositionnement

+

Breadcrumb et repositionnement

Le chemin affiché au-dessus du contenu est interactif :

  • - Cliquez sur le vault : + Cliquez sur le vault : Focus sur le vault dans la sidebar
  • - Cliquez sur un segment : + Cliquez sur un segment : Navigation vers ce dossier
  • - Auto-scroll : La sidebar se + Auto-scroll : La sidebar se positionne automatiquement
-

Sélection de vault

+

Sélection de vault

Changez de contexte pour filtrer l'affichage :

  • - Menu header : Dropdown + Menu header : Dropdown "Vault" dans le menu Options
  • - Sidebar dropdown : + Sidebar dropdown : Sélection rapide en haut de l'onglet Vaults
  • - Tous les vaults : Vue + Tous les vaults : Vue globale de tous vos contenus
  • - Vault spécifique : Focus + Vault spécifique : Focus sur un seul vault
@@ -2940,28 +2922,28 @@ fichiers simultanément dans des onglets.

-

Ouverture d'onglets

+

Ouverture d'onglets

  • - Simple clic : Ouvre le + Simple clic : Ouvre le fichier dans un onglet temporaire (aperçu, italique)
  • - Double clic : Ouvre le + Double clic : Ouvre le fichier dans un onglet persistant
  • - Navigation récente : + Navigation récente : L'onglet "Récent" dans la sidebar liste vos derniers fichiers
-

Navigation entre onglets

+

Navigation entre onglets

  • - Clic sur un onglet : Active + Clic sur un onglet : Active l'onglet
  • @@ -2976,29 +2958,29 @@ actif
  • - Bouton ✕ : Ferme l'onglet + Bouton ✕ : Ferme l'onglet (sauf s'il est seul)
-

Fonctionnalités

+

Fonctionnalités

  • - Barre d'onglets : Affichage + Barre d'onglets : Affichage horizontal avec le nom du fichier et son icône
  • - Onglet actif : Surligné en + Onglet actif : Surligné en couleur d'accentuation
  • - Prévisualisation : Un + Prévisualisation : Un onglet temporaire (italique) est remplacé par le prochain clic
  • - Onglets persistants : + Onglets persistants : Restent ouverts jusqu'à fermeture manuelle
@@ -3007,31 +2989,31 @@

🔍 Recherche

-

Recherche simple

+

Recherche simple

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

  • - Recherche dans tout : + Recherche dans tout : Titre, contenu, tags, chemins
  • - Scoring intelligent : + Scoring intelligent : Résultats classés par pertinence TF-IDF
  • - Snippets surlignés : + Snippets surlignés : Extraits avec termes en surbrillance
  • - Pagination : Navigation par + Pagination : Navigation par pages de 50 résultats
-

Opérateurs avancés

+

Opérateurs avancés

Utilisez des opérateurs pour affiner votre recherche : @@ -3078,22 +3060,22 @@ Markdown du vault IT avec le tag linux.

-

Autocomplétion

+

Autocomplétion

L'autocomplétion vous aide à trouver rapidement :

  • - Historique : Les 50 + Historique : Les 50 dernières recherches (localStorage)
  • - Fichiers : Suggestions de + Fichiers : Suggestions de titres de fichiers
  • - Tags : Suggestions de tags + Tags : Suggestions de tags avec compteurs
  • @@ -3102,7 +3084,7 @@
-

Chips de filtres actifs

+

Chips de filtres actifs

Les opérateurs utilisés s'affichent sous forme de chips colorés : @@ -3161,11 +3143,11 @@ des frontmatters YAML et inline (#tag)

  • - Cliquable : Cliquez pour + Cliquable : Cliquez pour filtrer les résultats
  • - Filtrage : Utilisez la + Filtrage : Utilisez la barre de filtrage pour chercher un tag
  • @@ -3209,7 +3191,7 @@ la regex appliquée
  • - Ajout/Suppression : Gérez + Ajout/Suppression : Gérez vos patterns de filtrage
  • @@ -3240,23 +3222,23 @@ -

    Actions sur fichiers

    -

    Boutons disponibles au-dessus du contenu :

    +

    Actions sur fichiers

    +

    Boutons disponibles au-dessus du contenu :

    • - Copier : Copie le contenu + Copier : Copie le contenu source dans le presse-papiers
    • - Source : Affiche/masque le + Source : Affiche/masque le markdown brut
    • - Télécharger : Télécharge le + Télécharger : Télécharge le fichier
    • - Éditer : Ouvre l'éditeur + Éditer : Ouvre l'éditeur CodeMirror
    • @@ -3279,7 +3261,7 @@ Navigation facile
    • - Autocomplétion : + Autocomplétion : Suggestions contextuelles
    • @@ -3300,11 +3282,11 @@

      ObsiGate indexe et affiche :

      • - Markdown : .md (rendu + Markdown : .md (rendu complet)
      • - Code : .py, .js, .ts, .jsx, + Code : .py, .js, .ts, .jsx, .tsx, .java, .c, .cpp, .rs, .go, etc.
      • @@ -3319,7 +3301,7 @@ Web : .html, .css, .scss
      • - Autres : .txt, .log, .sql, + Autres : .txt, .log, .sql, .csv
      @@ -3363,7 +3345,7 @@ fichier
    • - Barre d'outils AI : + Barre d'outils AI : Complétion, réécriture, traduction (voir section 🤖 IA)
    • @@ -3387,7 +3369,7 @@ Graphique
    • - Bouton dédié : Dans la + Bouton dédié : Dans la barre d'outils (le cas échéant)
    @@ -3416,7 +3398,7 @@ de recherche pour surligner des nœuds
  • - Mode focus : Centre la vue + Mode focus : Centre la vue sur un nœud spécifique
  • @@ -3432,7 +3414,7 @@ et dossiers (cercles) avec icônes
  • - Arêtes : Wikilinks sortants + Arêtes : Wikilinks sortants (bleu) et backlinks entrants (vert)
  • @@ -3440,11 +3422,11 @@ Métadonnées du nœud (tags, liens, chemin)
  • - Ctrl+survol : Aperçu du + Ctrl+survol : Aperçu du contenu de la note sans naviguer
  • - Plein écran : Bouton pour + Plein écran : Bouton pour agrandir la vue
  • @@ -3453,7 +3435,7 @@
  • -

    Performance

    +

    Performance

    La vue utilise l'algorithme Barnes-Hut pour calculer la disposition en O(n log n), @@ -3469,10 +3451,10 @@

    🎨 Personnalisation

    Thème clair/sombre

    -

    Basculez entre les thèmes :

    +

    Basculez entre les thèmes :

    • - Menu Options : Cliquez sur + Menu Options : Cliquez sur "Thème" dans le menu
    • @@ -3519,7 +3501,7 @@

      • - Paramètres de recherche : + Paramètres de recherche : Délai debounce, résultats par page, timeout
      • @@ -3527,11 +3509,11 @@ Workers, boosts TF-IDF, expansions préfixe
      • - Filtrage de tags : Patterns + Filtrage de tags : Patterns pour masquer les tags template
      • - Diagnostics : Stats index, + Diagnostics : Stats index, mémoire, moteur de recherche
      • @@ -3582,7 +3564,7 @@

        • - 🏠 Accueil : Retour à + 🏠 Accueil : Retour à l'accueil
        • @@ -3612,18 +3594,18 @@ Supprime un dossier et son contenu
        • - 🌓 Changer le thème : + 🌓 Changer le thème : Bascule clair/sombre
        • - 🔄 Réindexer : Force la + 🔄 Réindexer : Force la réindexation complète
        • - ❓ Aide : Ouvre ce guide + ❓ Aide : Ouvre ce guide
        • - ⚙️ Configuration : Ouvre + ⚙️ Configuration : Ouvre les paramètres
        @@ -3735,7 +3717,7 @@ ou Gemini).

        -

        Activation

        +

        Activation

        1. Ajoutez votre clé API dans @@ -3759,7 +3741,7 @@
        -

        Barre d'outils AI

        +

        Barre d'outils AI

        La barre d'outils contient les boutons suivants : @@ -3951,14 +3933,14 @@

        🔗 Partage et Webhooks

        -

        Publication publique

        +

        Publication publique

        ObsiGate permet de partager des documents via un lien public temporaire.

        • - Bouton Partager : Dans les + Bouton Partager : Dans les actions du fichier, génère un lien unique
        • @@ -3980,7 +3962,7 @@ et révocation dans les Configurations
        • - Export PDF : Téléchargement + Export PDF : Téléchargement du document partagé en PDF via /s/{token}/pdf
        • @@ -4002,15 +3984,15 @@ choix, avec un payload JSON détaillé.

          -

          Cas d'usage

          +

          Cas d'usage

          • - Automatisation CI/CD : + Automatisation CI/CD : Déclencher un build quand une note de procédure est mise à jour
          • - Synchronisation : Copier + Synchronisation : Copier les nouveaux fichiers vers un autre système (SharePoint, Google Drive)
          • @@ -4020,7 +4002,7 @@ créé
          • - Audit externe : Logger + Audit externe : Logger toutes les modifications dans une base de données externe
          • @@ -4312,10 +4294,10 @@ type d'événement pour un routage rapide.

            -

            Configuration

            +

            Configuration

            Les webhooks se gèrent dans le modal - Configurations (⚙️ menu + Configurations (⚙️ menu Options), section Webhooks. Réservé aux administrateurs.

            @@ -4326,12 +4308,12 @@
          • Remplissez : - Nom (descriptif), - URL (endpoint cible), + Nom (descriptif), + URL (endpoint cible), Secret (optionnel)
          • Cochez les événements à écouter
          • -
          • Cliquez Ajouter
          • +
          • Cliquez Ajouter
          • Les webhooks peuvent être activés/désactivés, @@ -4448,14 +4430,14 @@ curl -X POST https://votre-serveur.com/webhook \

            💾 Sauvegardes et Audits

            -

            Backup automatique

            +

            Backup automatique

            ObsiGate crée automatiquement des sauvegardes avant chaque modification destructive.

            • - Avant écriture : Sauvegarde + Avant écriture : Sauvegarde du contenu original dans .obsigate-backup/
            • @@ -4470,7 +4452,7 @@ curl -X POST https://votre-serveur.com/webhook \
            -

            Audit log

            +

            Audit log

            Toutes les opérations sensibles sont tracées dans un journal. @@ -4513,7 +4495,7 @@ curl -X POST https://votre-serveur.com/webhook \ HttpOnly avec rotation automatique

          • - Rate limiting : 10 + Rate limiting : 10 tentatives / 15 min par IP + verrouillage compte
          • @@ -4541,7 +4523,7 @@ curl -X POST https://votre-serveur.com/webhook \ XSS-Protection
          • - Atomic writes : Écriture + Atomic writes : Écriture via fichier temporaire + renommage atomique
          • @@ -4597,7 +4579,7 @@ curl -X POST https://votre-serveur.com/webhook \ vault: accélèrent la recherche
          • - Breadcrumb cliquable : + Breadcrumb cliquable : Repositionnez rapidement la sidebar
          @@ -4623,7 +4605,7 @@ curl -X POST https://votre-serveur.com/webhook \ le bouton hamburger sur mobile
        • - Wikilinks : Naviguez entre + Wikilinks : Naviguez entre notes comme dans Obsidian
        • @@ -4632,7 +4614,7 @@ curl -X POST https://votre-serveur.com/webhook \
        -

        Cas d'usage avancés

        +

        Cas d'usage avancés

        • Recherche multi-critères : @@ -4651,7 +4633,7 @@ curl -X POST https://votre-serveur.com/webhook \ l'éditeur, modifiez, sauvegardez
        • - Export : Téléchargez des + Export : Téléchargez des fichiers pour backup ou partage
        • @@ -4797,7 +4779,7 @@ curl -X POST https://votre-serveur.com/webhook \ aria-label="Palette de commandes" > - Commandes + Commandes - +
    @@ -4880,7 +4862,7 @@ curl -X POST https://votre-serveur.com/webhook \
    -

    ObsiGate

    +

    ObsiGate

    Vos notes Obsidian,
    simplement accessibles.

    v2.0.0-dev
    @@ -4888,11 +4870,11 @@ curl -X POST https://votre-serveur.com/webhook \
    — - Fichiers + Fichiers
    — - Vaults + Vaults
    285 diff --git a/frontend/js/i18n.js b/frontend/js/i18n.js index 664f253..bd85c51 100644 --- a/frontend/js/i18n.js +++ b/frontend/js/i18n.js @@ -51,6 +51,30 @@ export function t(key, params) { return s; } +// ── Reverse-lookup cache (French text → key) ──────────────────────────── +let _reverseCache = null; + +function _buildReverseCache() { + _reverseCache = {}; + for (const [k, v] of Object.entries(_fallbackStrings)) { + if (k.startsWith('_')) continue; + // Prefer shorter keys when multiple keys map to the same French text + if (!_reverseCache[v] || k.length < _reverseCache[v].length) { + _reverseCache[v] = k; + } + } +} + +/** Translate a French string to the current locale by reverse lookup. + * "Paramètres client sauvegardés" → fr: same, en: "Client settings saved". + * If the string is not found in the FR locale, returns it unchanged. */ +export function tr(frenchText) { + if (!frenchText || _currentLocale === 'fr') return frenchText; + if (!_reverseCache) _buildReverseCache(); + var key = _reverseCache[frenchText]; + return key ? t(key) : frenchText; +} + /** Change locale and re-translate the entire DOM. * Persists to localStorage. */ export async function setLocale(locale) { diff --git a/frontend/js/ui.js b/frontend/js/ui.js index 5457878..1f2788a 100644 --- a/frontend/js/ui.js +++ b/frontend/js/ui.js @@ -6,6 +6,7 @@ import { safeCreateIcons, getFileIcon, escapeHtml } from './utils.js'; import { syncActiveFileTreeItem, refreshSidebarTreePreservingState } from './sidebar.js'; import { GraphViewManager } from './graph.js'; import { DashboardConflictsWidget } from './dashboard.js'; +import { t, tr } from './i18n.js'; // --------------------------------------------------------------------------- // Right Sidebar Manager // --------------------------------------------------------------------------- @@ -347,7 +348,8 @@ export function populateCustomDropdown(dropdownId, optionsList, defaultValue) { /** Display a brief toast message at the bottom of the viewport. */ export function showToast(message, type) { - console.log("showToast called with:", message, type); + // Auto-translate French messages via reverse lookup + message = tr(message); type = type || "info"; let container = document.getElementById("toast-container"); if (!container) { diff --git a/frontend/locales/en.json b/frontend/locales/en.json index 6329d05..318b432 100644 --- a/frontend/locales/en.json +++ b/frontend/locales/en.json @@ -10,6 +10,22 @@ "header.refresh": "Refresh", "header.install_app": "Install app", "header.admin_panel": "Administration", + "header.menu_config": "Settings", + "header.menu_config_desc": "Application settings", + "header.menu_help": "User guide", + "header.menu_help_desc": "Open help", + "header.menu_about": "About", + "header.menu_about_desc": "Version, credits & info", + "header.menu_profile": "Profile", + "header.menu_profile_desc": "Language & preferences", + "header.menu_logout": "Sign out", + "header.menu_logout_desc": "End session", + "header.menu_admin": "Administration", + "header.menu_admin_desc": "Manage users", + "header.sync_status": "Sync", + "header.sidebar_toggle": "Toggle sidebar", + "header.menu_toggle": "Menu", + "header.quick_help": "Quick Help", "sidebar.filter_placeholder": "Filter files...", "sidebar.tab_vaults": "Vaults", @@ -19,6 +35,20 @@ "sidebar.loading": "Loading...", "sidebar.no_results": "No results", "sidebar.vault_context_all": "All vaults", + "sidebar.saved_searches_tab": "Searches", + "sidebar.saved_dirs_tab": "Folders", + "sidebar.no_saved_searches": "No saved searches", + "sidebar.no_recent_files": "No recent files", + "sidebar.case_sensitive": "Case sensitive", + "sidebar.clear_filter": "Clear", + "sidebar.filter_results_grouped": "Grouped results", + "sidebar.filter_instant": "Instant search", + "sidebar.expand_collapse": "Expand/Collapse", + "sidebar.open_file": "Open file", + "sidebar.file_icons": "Icons", + "sidebar.vault_specific": "Specific vault", + "sidebar.sidebar_dropdown": "Vault context menu", + "sidebar.sidebar_filtering": "Sidebar filtering", "search.operators_help": "Operators: tag:word, vault:name, title:word, path:word, ext:md", "search.results_count": "{count} result(s)", @@ -35,6 +65,21 @@ "search.case_sensitive": "Case sensitive", "search.whole_word": "Whole word", "search.regex": "Regular expression", + "search.dropdown_history": "History", + "search.dropdown_files": "Files", + "search.dropdown_clear_history": "Clear history", + "search.clear": "Clear", + "search.filter_path_title": "Path filters (Alt-F)", + "search.aria_label": "Search suggestions", + "search.sections_all_vaults": "All vaults", + "search.simple_search": "Simple search", + "search.full_text": "Search everywhere", + "search.smart_scoring": "Smart scoring", + "search.highlighted_snippets": "Highlighted snippets", + "search.pagination": "Pagination", + "search.advanced_operators": "Advanced operators", + "search.include_placeholder": "Include: **/*.md, notes/**", + "search.exclude_placeholder": "Exclude: vendor/*, *.lock", "viewer.source": "Source", "viewer.markdown": "Markdown", @@ -52,6 +97,17 @@ "viewer.binary_unsupported": "Unsupported binary file", "viewer.binary_download": "Download file", "viewer.pdf_pages": "{count} pages", + "viewer.on_this_page": "ON THIS PAGE", + "viewer.no_headings": "No headings in this document", + "viewer.metadata_tags": "Tags", + "viewer.metadata_created": "Created", + "viewer.metadata_modified": "Modified", + "viewer.metadata_size": "Size", + "viewer.metadata_vault": "Vault", + "viewer.metadata_path": "Path", + "viewer.breadcrumb_home": "Home", + "viewer.unsupported_file": "This file is binary and cannot be displayed", + "viewer.click_to_download": "Click to download", "editor.save": "Save", "editor.cancel": "Cancel", @@ -64,6 +120,8 @@ "editor.find_whole": "Whole word", "editor.no_results": "No results", "editor.close": "Close", + "editor.forge_help": "Forge editor help", + "editor.forge_close_editor": "Close editor / modal", "ai.toolbar_edit": "Edit", "ai.toolbar_tone": "Tone", @@ -90,6 +148,8 @@ "ai.no_api_key": "No API key configured", "ai.select_text": "Select text to process", "ai.done": "AI: text processed", + "ai.completion_added": "AI: completion added", + "ai.rewrite_done": "AI: text rewritten", "dashboard.welcome": "Welcome to ObsiGate", "dashboard.stats": "Statistics", @@ -103,8 +163,22 @@ "dashboard.no_bookmarks": "No bookmarks", "dashboard.no_conflicts": "No conflicts", "dashboard.no_recent": "No recent files", + "dashboard.no_shares": "No shared documents", + "dashboard.shares": "Shares", "config.title": "Settings", + "config.section_search": "Search settings", + "config.section_perf": "Performance", + "config.section_server": "Server", + "config.section_watcher": "Auto sync", + "config.section_profile": "User profile", + "config.section_ai": "AI API keys", + "config.section_hidden": "Hidden files", + "config.section_webhooks": "Webhooks", + "config.section_shares": "Public shares", + "config.section_backups": "Backups", + "config.section_diag": "Diagnostics", + "config.section_about": "About", "config.profile": "User profile", "config.profile_desc": "Personal preferences to customize your ObsiGate experience.", "config.lang_label": "Preferred language", @@ -130,20 +204,213 @@ "config.diagnostics_desc": "Technical information about the server state.", "config.reindex": "Reindex", "config.reindex_desc": "Rebuild the search index for all vaults.", - "config.client_config": "Client configuration", - "config.server_config": "Server configuration", + "config.client_config": "Client config", + "config.server_config": "Server config", + "config.restart_required": "Restart required", + "config.no_restart": "No restart needed", + "config.note": "Note:", + "config.test": "Test", + "config.debounce_label": "Debounce delay (ms)", + "config.results_per_page_label": "Results per page", + "config.min_query_label": "Min. query length", + "config.timeout_label": "Search timeout (ms)", + "config.max_backups_label": "Max backups per file", + "config.workers_label": "Search workers", + "config.max_content_label": "Max content size (bytes)", + "config.title_boost_label": "Title boost", + "config.tag_boost_label": "Tag boost", + "config.prefix_expansions_label": "Max prefix expansions", + "config.tag_filtering_label": "Tag filtering", + "config.watcher_enabled_label": "Enable watcher", + "config.watcher_polling_label": "Polling mode (fallback)", + "config.watcher_interval_label": "Polling interval (s)", + "config.watcher_debounce_label": "Debounce (s)", + "config.ai_deepseek_label": "DeepSeek API Key", + "config.ai_openrouter_label": "OpenRouter API Key", + "config.ai_gemini_label": "Gemini API Key", + "config.ai_default_provider": "Default provider", + "config.ai_model": "Model", + "config.save_ai_keys": "Save keys", + "config.save_backend": "Save server configuration", + "config.reset": "Reset", + "config.add_webhook": "Add", + "config.webhook_name_placeholder": "Name", + "config.webhook_url_placeholder": "URL", + "config.create_share": "Create share", + "config.shares_empty": "No active shares", + "config.hidden_include_label": "Include hidden files", + "config.hidden_whitelist_label": "Whitelist (comma-separated)", + "config.save_hidden": "Save", "help.title": "ObsiGate Help", "help.shortcuts": "Keyboard shortcuts", "help.search_operators": "Search operators", "help.markdown": "Markdown syntax", "help.about": "About", + "help.quick_help": "Quick Help", + "help.shortcut_palette": "Command palette", + "help.shortcut_palette_cmd": "Command palette (command mode)", + "help.shortcut_focus_search": "Focus search bar", + "help.shortcut_save": "Save", + "help.shortcut_close": "Close editor / modal", + "help.shortcut_forge_help": "Forge editor help", + "help.guide_official": "Official guide", + "help.experience": "Experience", + "help.simple": "Simple", + "help.instant": "Instant", + "help.multi_vault": "Multi-vault", + "help.header_section": "Header", + "help.hamburger_btn": "Hamburger menu button", + "help.sidebar_toggle_btn": "Sidebar toggle button", + "help.logo": "ObsiGate logo", + "help.search_bar": "Search bar", + "help.vault_indicator": "Vault indicator", + "help.menu_options": "Options menu", + "help.sidebar_section": "Sidebar", + "help.sidebar_tabs": "The sidebar has two tabs:", + "help.sidebar_features": "Sidebar features:", + "help.filtering": "Filtering", + "help.quick_select": "Quick select", + "help.resize": "Resize", + "help.hide": "Hide", + "help.content_area": "Content area", + "help.content_shows": "The main area displays:", + "help.breadcrumb": "Breadcrumb", + "help.title_tags": "Title and tags", + "help.action_buttons": "Action buttons", + "help.rendered_content": "Rendered content", + "help.tree_section": "Vault tree", + "help.sidebar_filtering": "Sidebar filtering", + "help.case_sensitive": "Case-sensitive", + "help.clear": "Clear", + "help.results_grouped": "Grouped results", + "help.breadcrumb_reposition": "Breadcrumb and repositioning", + "help.click_vault": "Click the vault", + "help.click_segment": "Click a segment", + "help.auto_scroll": "Auto-scroll", + "help.vault_selector": "Vault selector", + "help.menu_header": "Header menu", + "help.sidebar_dropdown": "Sidebar dropdown", + "help.all_vaults": "All vaults", + "help.vault_specific": "Specific vault", + "help.tabs_section": "Opening tabs", + "help.single_click": "Single click", + "help.double_click": "Double click", + "help.recent_nav": "Recent navigation", + "help.tab_nav": "Tab navigation", + "help.click_tab": "Click a tab", + "help.tab_features": "Features", + "help.tab_bar": "Tab bar", + "help.active_tab": "Active tab", + "help.preview_tab": "Preview", + "help.persistent_tabs": "Persistent tabs", + "help.simple_search": "Simple search", + "help.search_everywhere": "Search everywhere", + "help.smart_scoring": "Smart scoring", + "help.highlighted_snippets": "Highlighted snippets", + "help.pagination": "Pagination", + "help.advanced_operators": "Advanced operators", + "help.search_facets": "Facets", + "help.search_save": "Saved searches", + "help.search_history": "Search history", + "help.search_filters": "Search filters", + "help.mermaid_section": "Mermaid diagrams", + "help.rendering_md": "Rendering in Markdown", + "help.themes": "Themes", + "help.code_preview": "Code + Preview", + "help.zoom_pan": "Zoom & Pan", + "help.export": "Export", + "help.mermaid_templates": "Templates", + "help.theme_section": "Theme", + "help.theme_toggle": "Toggle between themes:", + "help.light": "Light", + "help.dark": "Dark", + "help.context_menu": "Context menu (right click)", + "help.context_actions": "File actions", + "help.new_file": "New file", + "help.new_folder": "New folder", + "help.rename": "Rename", + "help.delete": "Delete", + "help.copy_path": "Copy path", + "help.properties": "Properties", + "help.graph_view": "Graph view", + "help.find_in_page": "Find in page", + "help.find_capabilities": "Regex, whole word, case-sensitive search in the displayed document with DOM TreeWalker.", + "help.file_viewer": "File viewer", + "help.file_actions": "Actions on the open file:", + "help.actions_available": "Buttons available above the content:", + "help.actions_detail": "Buttons available above the content:", + "help.share_button": "Share button", + "help.popout_button": "Dedicated button", + "help.outline_panel": "Outline panel (right)", + "help.backlinks_panel": "Backlinks panel", + "help.fallback_editor": "Fallback editor", + "help.editor_section": "Editor", + "help.toolbar_section": "AI toolbar", + "help.ai_features": "Edit, tone, translate, generate and tools via AI.", + "help.security_section": "Security", + "help.audit_log": "Audit log", + "help.backup_auto": "Auto backup", + "help.atomic_writes": "Atomic writes", + "help.rate_limiting": "Rate limiting", + "help.secret_redaction": "Secret redaction", + "help.syncthing_conflicts": "Syncthing conflicts", + "help.before_write": "Before write", + "help.ci_cd": "CI/CD automation", + "help.pwa_section": "PWA", + "help.external_audit": "External audit", + "help.shortcut_prev_tab": "Previous tab", + "help.shortcut_next_tab": "Next tab", + "help.shortcut_close_tab": "Close tab", + "help.shortcut_close_palette": "Close palette", + "help.shortcut_select": "Open/select", + "help.shortcut_undo": "Undo", + "help.shortcut_redo": "Redo", + "help.advanced_use_cases": "Advanced use cases", + "help.use_cases": "Use cases", + "help.other": "Other", + "help.supported_languages": "Many languages supported", + "help.active_filter_chips": "Active filter chips", + "help.clickable": "Clickable", + "help.breadcrumb_clickable": "Clickable breadcrumb", + "help.autocomplete": "Autocomplete", + "help.drag_drop_tabs": "Drag & drop tabs", + "help.persistent_display": "Persistent display in bar", + "help.close_tab_x": "✕ button", + "help.activation": "Activation", + "help.add_remove": "Add/Remove", + "help.nodes_edges": "Edges", + "help.graph_zoom_pan": "Scroll wheel zoom & pan", + "help.graph_fullscreen": "Full screen & PNG export", + "help.graph_filter_depth": "Filters & depth", + "help.graph_focus": "Focus mode", + "help.graph_navigation": "History navigation ← → ↑", + "help.graph_sticky": "Sticky panels", + "help.graph_preview": "Ctrl+hover", + "help.rendering_images": "Image rendering", + "help.wikilinks": "Wikilinks", + "help.syncthing": "Syncthing conflicts", + "help.public_shares": "Public sharing", + "help.webhooks": "Webhooks", + "help.dashboard": "Dashboard statistics", + "help.pdf_export": "PDF export", + "help.command_palette": "Command palette", + "help.search_dropdown": "Search dropdown", + "help.results_counter": "Results counter", + "help.sort_options": "Sort options", + "help.filter_toggles": "Toggles Aa, wd, .*", + "help.mobile": "Floating results bar", + "help.theme_sync": "Synced theme", + "help.configuration": "Settings", + "help.footer": "© 2026 — Made with ☕, 🎧 and a few", + "help.nights": "sleepless nights 😅", + "help.powered_by": "Powered by Python, FastAPI, vanilla JS, CodeMirror, Mermaid, Lucide Icons and ❤️ for Obsidian.", "auth.login_title": "Secure access to your vaults", "auth.username": "Username", "auth.password": "Password", "auth.login_button": "Sign in", - "auth.remember_me": "Remember me", + "auth.remember_me": "Remember me (30 days)", "auth.login_error": "Invalid credentials", "auth.network_error": "Network error — check your connection", "auth.logged_out": "Signed out", @@ -187,6 +454,8 @@ "palette.search_files": "Search files...", "palette.search_commands": "Type a command...", + "palette.mode_files": "Files", + "palette.mode_commands": "Commands", "offline.status": "Offline", "offline.pending": "{count} pending change(s)", @@ -236,6 +505,7 @@ "toast.error_delete": "Delete error", "toast.error_load": "Loading error", "toast.error_network": "Network error", + "toast.error_init": "Initialization error", "toast.reindex_started": "Reindexing...", "toast.reindex_done": "Reindexing complete", "toast.index_reloaded": "Full index reloaded", @@ -244,6 +514,18 @@ "toast.config_saved": "Configuration saved", "toast.config_client_saved": "Client settings saved", "toast.config_reset": "Configuration reset", + "toast.ai_no_key": "No keys to save", + "toast.ai_keys_saved": "API keys saved", + "toast.user_created": "User created", + "toast.user_modified": "User modified", + "toast.user_deleted": "User deleted", + "toast.cannot_delete_self": "Cannot delete your own account", + "toast.url_required": "URL required", + "toast.share_revoked": "Share revoked", + "toast.link_created": "Link created!", + "toast.conflict_resolved": "Conflict resolved", + "toast.search_saved": "Search saved", + "toast.hidden_saved": "✓ Settings saved", "confirm.logout": "Are you sure you want to sign out?", "confirm.delete_file": "Permanently delete this file?", @@ -267,5 +549,7 @@ "vault.reindex": "Reindex vault", "theme.light": "Light", - "theme.dark": "Dark" + "theme.dark": "Dark", + "theme.change": "Change theme", + "theme.title": "Theme" } diff --git a/frontend/locales/fr.json b/frontend/locales/fr.json index 2a9663f..0e27541 100644 --- a/frontend/locales/fr.json +++ b/frontend/locales/fr.json @@ -10,6 +10,22 @@ "header.refresh": "Rafraîchir", "header.install_app": "Installer l'application", "header.admin_panel": "Administration", + "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_about": "À propos", + "header.menu_about_desc": "Version, crédits & info", + "header.menu_profile": "Profil", + "header.menu_profile_desc": "Langue & préférences", + "header.menu_logout": "Déconnexion", + "header.menu_logout_desc": "Quitter la session", + "header.menu_admin": "Administration", + "header.menu_admin_desc": "Gérer les utilisateurs", + "header.sync_status": "Synchronisation", + "header.sidebar_toggle": "Afficher/Masquer la sidebar", + "header.menu_toggle": "Menu", + "header.quick_help": "Raccourcis & Astuces", "sidebar.filter_placeholder": "Filtrer fichiers...", "sidebar.tab_vaults": "Vaults", @@ -19,6 +35,20 @@ "sidebar.loading": "Chargement...", "sidebar.no_results": "Aucun résultat", "sidebar.vault_context_all": "Toutes les vaults", + "sidebar.saved_searches_tab": "Recherches", + "sidebar.saved_dirs_tab": "Répertoires", + "sidebar.no_saved_searches": "Aucune recherche sauvegardée", + "sidebar.no_recent_files": "Aucun fichier récent", + "sidebar.case_sensitive": "Respecter la casse", + "sidebar.clear_filter": "Effacer", + "sidebar.filter_results_grouped": "Résultats groupés", + "sidebar.filter_instant": "Recherche instantanée", + "sidebar.expand_collapse": "Développer/Réduire", + "sidebar.open_file": "Ouvrir un fichier", + "sidebar.file_icons": "Icônes", + "sidebar.vault_specific": "Vault spécifique", + "sidebar.sidebar_dropdown": "Menu contextuel vault", + "sidebar.sidebar_filtering": "Filtrage de la sidebar", "search.operators_help": "Opérateurs : tag:mot, vault:nom, title:mot, path:mot, ext:md", "search.results_count": "{count} résultat(s)", @@ -35,6 +65,21 @@ "search.case_sensitive": "Respecter la casse", "search.whole_word": "Mot entier", "search.regex": "Expression régulière", + "search.dropdown_history": "Historique", + "search.dropdown_files": "Fichiers", + "search.dropdown_clear_history": "Effacer l'historique", + "search.clear": "Effacer", + "search.filter_path_title": "Filtres de chemin (Alt-F)", + "search.aria_label": "Suggestions de recherche", + "search.sections_all_vaults": "Tous les vaults", + "search.simple_search": "Recherche simple", + "search.full_text": "Recherche dans tout", + "search.smart_scoring": "Scoring intelligent", + "search.highlighted_snippets": "Snippets surlignés", + "search.pagination": "Pagination", + "search.advanced_operators": "Opérateurs avancés", + "search.include_placeholder": "Inclure: **/*.md, notes/**", + "search.exclude_placeholder": "Exclure: vendor/*, *.lock", "viewer.source": "Source", "viewer.markdown": "Markdown", @@ -52,6 +97,17 @@ "viewer.binary_unsupported": "Fichier binaire non supporté", "viewer.binary_download": "Télécharger le fichier", "viewer.pdf_pages": "{count} pages", + "viewer.on_this_page": "SUR CETTE PAGE", + "viewer.no_headings": "Aucun titre dans ce document", + "viewer.metadata_tags": "Tags", + "viewer.metadata_created": "Créé", + "viewer.metadata_modified": "Modifié", + "viewer.metadata_size": "Taille", + "viewer.metadata_vault": "Vault", + "viewer.metadata_path": "Chemin", + "viewer.breadcrumb_home": "Accueil", + "viewer.unsupported_file": "Ce fichier est binaire et ne peut pas être affiché", + "viewer.click_to_download": "Cliquez pour le télécharger", "editor.save": "Enregistrer", "editor.cancel": "Annuler", @@ -64,6 +120,8 @@ "editor.find_whole": "Mot entier", "editor.no_results": "Aucun résultat", "editor.close": "Fermer", + "editor.forge_help": "Aide de l'éditeur Forge", + "editor.forge_close_editor": "Fermer l'éditeur / modale", "ai.toolbar_edit": "Éditer", "ai.toolbar_tone": "Ton", @@ -90,6 +148,8 @@ "ai.no_api_key": "Aucune clé API configurée", "ai.select_text": "Sélectionnez du texte à traiter", "ai.done": "AI: texte traité", + "ai.completion_added": "AI: complétion ajoutée", + "ai.rewrite_done": "AI: texte réécrit", "dashboard.welcome": "Bienvenue dans ObsiGate", "dashboard.stats": "Statistiques", @@ -103,8 +163,22 @@ "dashboard.no_bookmarks": "Aucun favori", "dashboard.no_conflicts": "Aucun conflit", "dashboard.no_recent": "Aucun fichier récent", + "dashboard.no_shares": "Aucun document partagé", + "dashboard.shares": "Partages", "config.title": "Configuration", + "config.section_search": "Paramètres de recherche", + "config.section_perf": "Performance", + "config.section_server": "Serveur", + "config.section_watcher": "Synchronisation automatique", + "config.section_profile": "Profil utilisateur", + "config.section_ai": "Clés API IA", + "config.section_hidden": "Fichiers cachés", + "config.section_webhooks": "Webhooks", + "config.section_shares": "Partages publics", + "config.section_backups": "Sauvegardes", + "config.section_diag": "Diagnostics", + "config.section_about": "À propos", "config.profile": "Profil utilisateur", "config.profile_desc": "Préférences personnelles pour personnaliser l'expérience ObsiGate.", "config.lang_label": "Langue préférée", @@ -132,18 +206,211 @@ "config.reindex_desc": "Reconstruire l'index de recherche pour toutes les vaults.", "config.client_config": "Configuration client", "config.server_config": "Configuration serveur", + "config.restart_required": "Redémarrage requis", + "config.no_restart": "Redémarrage non requis", + "config.note": "Note :", + "config.test": "Tester", + "config.debounce_label": "Délai debounce (ms)", + "config.results_per_page_label": "Résultats par page", + "config.min_query_label": "Longueur min. requête", + "config.timeout_label": "Timeout recherche (ms)", + "config.max_backups_label": "Max backups par fichier", + "config.workers_label": "Workers de recherche", + "config.max_content_label": "Taille max contenu (octets)", + "config.title_boost_label": "Boost titre", + "config.tag_boost_label": "Boost tags", + "config.prefix_expansions_label": "Expansions préfixe max", + "config.tag_filtering_label": "Filtrage de tags", + "config.watcher_enabled_label": "Activer la surveillance", + "config.watcher_polling_label": "Mode polling (fallback)", + "config.watcher_interval_label": "Intervalle polling (s)", + "config.watcher_debounce_label": "Debounce (s)", + "config.ai_deepseek_label": "DeepSeek API Key", + "config.ai_openrouter_label": "OpenRouter API Key", + "config.ai_gemini_label": "Gemini API Key", + "config.ai_default_provider": "Fournisseur par défaut", + "config.ai_model": "Modèle", + "config.save_ai_keys": "Enregistrer les clés", + "config.save_backend": "Sauvegarder la configuration serveur", + "config.reset": "Réinitialiser", + "config.add_webhook": "Ajouter", + "config.webhook_name_placeholder": "Nom", + "config.webhook_url_placeholder": "URL", + "config.create_share": "Créer un partage", + "config.shares_empty": "Aucun partage actif", + "config.hidden_include_label": "Inclure les fichiers cachés", + "config.hidden_whitelist_label": "Whitelist (séparés par des virgules)", + "config.save_hidden": "Enregistrer", "help.title": "Aide ObsiGate", "help.shortcuts": "Raccourcis clavier", "help.search_operators": "Opérateurs de recherche", "help.markdown": "Syntaxe Markdown", "help.about": "À propos", + "help.quick_help": "Raccourcis & Astuces", + "help.shortcut_palette": "Palette de commandes", + "help.shortcut_palette_cmd": "Palette de commandes (mode commande)", + "help.shortcut_focus_search": "Focus barre de recherche", + "help.shortcut_save": "Sauvegarder", + "help.shortcut_close": "Fermer l'éditeur / modale", + "help.shortcut_forge_help": "Aide de l'éditeur Forge", + "help.guide_official": "Guide officiel", + "help.experience": "Expérience", + "help.simple": "Simple", + "help.instant": "Instantanée", + "help.multi_vault": "Multi-vault", + "help.header_section": "En-tête", + "help.hamburger_btn": "Bouton menu hamburger", + "help.sidebar_toggle_btn": "Bouton toggle sidebar", + "help.logo": "Logo ObsiGate", + "help.search_bar": "Barre de recherche", + "help.vault_indicator": "Indicateur de vault", + "help.menu_options": "Menu Options", + "help.sidebar_section": "Sidebar (barre latérale)", + "help.sidebar_tabs": "La sidebar est divisée en deux onglets :", + "help.sidebar_features": "Fonctionnalités de la sidebar :", + "help.filtering": "Filtrage", + "help.quick_select": "Sélection rapide", + "help.resize": "Redimensionnement", + "help.hide": "Masquage", + "help.content_area": "Zone de contenu", + "help.content_shows": "La zone centrale affiche :", + "help.breadcrumb": "Breadcrumb", + "help.title_tags": "Titre et tags", + "help.action_buttons": "Boutons d'action", + "help.rendered_content": "Contenu rendu", + "help.tree_section": "Arborescence des vaults", + "help.sidebar_filtering": "Filtrage de la sidebar", + "help.case_sensitive": "Case-sensitive", + "help.clear": "Effacer", + "help.results_grouped": "Résultats groupés", + "help.breadcrumb_reposition": "Breadcrumb et repositionnement", + "help.click_vault": "Cliquez sur le vault", + "help.click_segment": "Cliquez sur un segment", + "help.auto_scroll": "Auto-scroll", + "help.vault_selector": "Sélection de vault", + "help.menu_header": "Menu header", + "help.sidebar_dropdown": "Sidebar dropdown", + "help.all_vaults": "Tous les vaults", + "help.vault_specific": "Vault spécifique", + "help.tabs_section": "Ouverture d'onglets", + "help.single_click": "Simple clic", + "help.double_click": "Double clic", + "help.recent_nav": "Navigation récente", + "help.tab_nav": "Navigation entre onglets", + "help.click_tab": "Clic sur un onglet", + "help.tab_features": "Fonctionnalités", + "help.tab_bar": "Barre d'onglets", + "help.active_tab": "Onglet actif", + "help.preview_tab": "Prévisualisation", + "help.persistent_tabs": "Onglets persistants", + "help.simple_search": "Recherche simple", + "help.search_everywhere": "Recherche dans tout", + "help.smart_scoring": "Scoring intelligent", + "help.highlighted_snippets": "Snippets surlignés", + "help.pagination": "Pagination", + "help.advanced_operators": "Opérateurs avancés", + "help.search_facets": "Facettes", + "help.search_save": "Recherches sauvegardées", + "help.search_history": "Historique de recherche", + "help.search_filters": "Filtres de recherche", + "help.mermaid_section": "Diagrammes Mermaid", + "help.rendering_md": "Rendu dans le Markdown", + "help.themes": "Thèmes", + "help.code_preview": "Code + Prévisualisation", + "help.zoom_pan": "Zoom & Pan", + "help.export": "Export", + "help.mermaid_templates": "Templates", + "help.theme_section": "Thème", + "help.theme_toggle": "Basculez entre les thèmes :", + "help.light": "Clair", + "help.dark": "Sombre", + "help.context_menu": "Menu contextuel (clic droit)", + "help.context_actions": "Actions sur fichiers", + "help.new_file": "Nouveau fichier", + "help.new_folder": "Nouveau dossier", + "help.rename": "Renommer", + "help.delete": "Supprimer", + "help.copy_path": "Copier le chemin", + "help.properties": "Propriétés", + "help.graph_view": "Vue graphe", + "help.find_in_page": "Recherche dans la page", + "help.find_capabilities": "Recherche regex, mot entier, case-sensitive dans le document affiché avec TreeWalker DOM.", + "help.file_viewer": "Visionneur de fichier", + "help.file_actions": "Actions sur le fichier ouvert :", + "help.actions_available": "Boutons disponibles au-dessus du contenu :", + "help.actions_detail": "Boutons disponibles au-dessus du contenu :", + "help.share_button": "Bouton Partager", + "help.popout_button": "Bouton dédié", + "help.outline_panel": "Panneau Plan (droite)", + "help.backlinks_panel": "Panneau Backlinks", + "help.fallback_editor": "Éditeur de fallback", + "help.editor_section": "Éditeur", + "help.toolbar_section": "Barre d'outils AI", + "help.ai_features": "Édition, ton, traduction, génération et outils via AI.", + "help.security_section": "Sécurité", + "help.audit_log": "Audit log", + "help.backup_auto": "Backup automatique", + "help.atomic_writes": "Atomic writes", + "help.rate_limiting": "Rate limiting", + "help.secret_redaction": "Redaction de secrets", + "help.syncthing_conflicts": "Conflits Syncthing", + "help.before_write": "Avant écriture", + "help.ci_cd": "Automatisation CI/CD", + "help.pwa_section": "PWA", + "help.external_audit": "Audit externe", + "help.shortcut_prev_tab": "Onglet précédent", + "help.shortcut_next_tab": "Onglet suivant", + "help.shortcut_close_tab": "Fermer l'onglet", + "help.shortcut_close_palette": "Fermer la palette", + "help.shortcut_select": "Ouvrir/sélectionner", + "help.shortcut_undo": "Annuler", + "help.shortcut_redo": "Refaire", + "help.advanced_use_cases": "Cas d'usage avancés", + "help.use_cases": "Cas d'usage", + "help.other": "Autres", + "help.supported_languages": "Support de nombreux langages", + "help.active_filter_chips": "Chips de filtres actifs", + "help.clickable": "Cliquable", + "help.breadcrumb_clickable": "Breadcrumb cliquable", + "help.autocomplete": "Autocomplétion", + "help.drag_drop_tabs": "Drag & drop des onglets", + "help.persistent_display": "Affichage persistant dans la barre", + "help.close_tab_x": "Bouton ✕", + "help.activation": "Activation", + "help.add_remove": "Ajout/Suppression", + "help.nodes_edges": "Arêtes", + "help.graph_zoom_pan": "Zoom & pan molette", + "help.graph_fullscreen": "Plein écran & export PNG", + "help.graph_filter_depth": "Filtres & profondeur", + "help.graph_focus": "Mode focus", + "help.graph_navigation": "Navigation historique ← → ↑", + "help.graph_sticky": "Sticky panels", + "help.graph_preview": "Ctrl+survol", + "help.rendering_images": "Rendu d'images", + "help.wikilinks": "Wikilinks", + "help.syncthing": "Conflits Syncthing", + "help.public_shares": "Publication publique", + "help.webhooks": "Webhooks", + "help.dashboard": "Dashboard statistiques", + "help.pdf_export": "Export PDF", + "help.command_palette": "Palette de commande", + "help.search_dropdown": "Dropdown de recherche", + "help.results_counter": "Compteur de résultats", + "help.sort_options": "Options de tri", + "help.filter_toggles": "Toggles Aa, wd, .*", + "help.mobile": "Barre flottante résultats", + "help.theme_sync": "Thème synchronisé", + "help.configuration": "Configuration", + "help.footer": "© 2026 — Fait avec ☕, 🎧 et quelques", + "help.nights": "nuits blanches 😅", + "help.powered_by": "Propulsé par Python, FastAPI, vanilla JS, CodeMirror, Mermaid, Lucide Icons et ❤️ pour Obsidian.", - "auth.login_title": "Connexion", + "auth.login_title": "Accès sécurisé à vos vaults", "auth.username": "Nom d'utilisateur", "auth.password": "Mot de passe", "auth.login_button": "Se connecter", - "auth.remember_me": "Se souvenir de moi", + "auth.remember_me": "Se souvenir de moi (30 jours)", "auth.login_error": "Identifiants invalides", "auth.network_error": "Erreur réseau — vérifiez votre connexion", "auth.logged_out": "Déconnecté", @@ -187,6 +454,8 @@ "palette.search_files": "Rechercher un fichier...", "palette.search_commands": "Tapez une commande...", + "palette.mode_files": "Fichiers", + "palette.mode_commands": "Commandes", "offline.status": "Hors-ligne", "offline.pending": "{count} modification(s) en attente", @@ -236,6 +505,7 @@ "toast.error_delete": "Erreur de suppression", "toast.error_load": "Erreur de chargement", "toast.error_network": "Erreur réseau", + "toast.error_init": "Erreur lors de l'initialisation", "toast.reindex_started": "Réindexation en cours...", "toast.reindex_done": "Réindexation terminée", "toast.index_reloaded": "Index complet rechargé", @@ -244,6 +514,18 @@ "toast.config_saved": "Configuration sauvegardée", "toast.config_client_saved": "Paramètres client sauvegardés", "toast.config_reset": "Configuration réinitialisée", + "toast.ai_no_key": "Aucune clé à sauvegarder", + "toast.ai_keys_saved": "Clés API sauvegardées", + "toast.user_created": "Utilisateur créé", + "toast.user_modified": "Utilisateur modifié", + "toast.user_deleted": "Utilisateur supprimé", + "toast.cannot_delete_self": "Impossible de supprimer son propre compte", + "toast.url_required": "URL requise", + "toast.share_revoked": "Partage révoqué", + "toast.link_created": "Lien créé !", + "toast.conflict_resolved": "Conflit résolu", + "toast.search_saved": "Recherche sauvegardée", + "toast.hidden_saved": "✓ Paramètres sauvegardés", "confirm.logout": "Voulez-vous vraiment vous déconnecter ?", "confirm.delete_file": "Supprimer définitivement ce fichier ?", @@ -267,5 +549,7 @@ "vault.reindex": "Réindexer la vault", "theme.light": "Clair", - "theme.dark": "Sombre" + "theme.dark": "Sombre", + "theme.change": "Changer le thème", + "theme.title": "Thème" }