fix: tag + translate all help body headings and paragraphs
CI / lint (push) Failing after 19s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Failing after 10s

- 36 new data-i18n tags on h2/h3/p in help modal body
- Fixed concatenated attributes (pdata-i18n → p data-i18n)
- All section headings translated (Palette, AI Editor, Search, etc.)
- 827 locale keys total, 354 data-i18n attributes
- Help guide title 'Guide utilisation ObsiGate' now translated
This commit is contained in:
2026-06-18 15:43:54 -04:00
parent 31d8c2603e
commit b4fefe483e
3 changed files with 179 additions and 107 deletions
+37 -37
View File
@@ -2822,7 +2822,7 @@
</section> </section>
<section class="help-section" id="help-navigation"> <section class="help-section" id="help-navigation">
<h2>🗺️ Navigation</h2> <h2 data-i18n="help.733f0559">🗺️ Navigation</h2>
<h3 data-i18n="help.tree_section">Arborescence des vaults</h3> <h3 data-i18n="help.tree_section">Arborescence des vaults</h3>
<p data-i18n="auto.4c908ade"> <p data-i18n="auto.4c908ade">
@@ -2914,7 +2914,7 @@
</section> </section>
<section class="help-section" id="help-tabs"> <section class="help-section" id="help-tabs">
<h2>📑 Gestion des onglets</h2> <h2 data-i18n="help.8c5341e0">📑 Gestion des onglets</h2>
<p data-i18n="auto.27a2f7c1"> <p data-i18n="auto.27a2f7c1">
ObsiGate supporte l'ouverture de plusieurs ObsiGate supporte l'ouverture de plusieurs
fichiers simultanément dans des onglets. fichiers simultanément dans des onglets.
@@ -2985,7 +2985,7 @@
</section> </section>
<section class="help-section" id="help-recherche"> <section class="help-section" id="help-recherche">
<h2>🔍 Recherche</h2> <h2 data-i18n="help.adf30d78">🔍 Recherche</h2>
<h3 data-i18n="help.simple_search">Recherche simple</h3> <h3 data-i18n="help.simple_search">Recherche simple</h3>
<p> <p>
@@ -3102,7 +3102,7 @@
</li> </li>
</ul> </ul>
<h3>Facettes et tri</h3> <h3 data-i18n="help.a648c49e">Facettes et tri</h3>
<p data-i18n="auto.cd7332c8"> <p data-i18n="auto.cd7332c8">
Les résultats incluent des facettes pour affiner Les résultats incluent des facettes pour affiner
: :
@@ -3128,9 +3128,9 @@
</section> </section>
<section class="help-section" id="help-tags"> <section class="help-section" id="help-tags">
<h2>🏷️ Tags</h2> <h2 data-i18n="help.2507242f">🏷️ Tags</h2>
<h3>Tag cloud</h3> <h3 data-i18n="help.5f87ea79">Tag cloud</h3>
<p> <p>
L'onglet Tags de la sidebar affiche un nuage de L'onglet Tags de la sidebar affiche un nuage de
tags : tags :
@@ -3154,7 +3154,7 @@
</li> </li>
</ul> </ul>
<h3>Tags inline vs frontmatter</h3> <h3 data-i18n="help.2c03a7ba">Tags inline vs frontmatter</h3>
<p>ObsiGate supporte deux types de tags :</p> <p>ObsiGate supporte deux types de tags :</p>
<ul> <ul>
<li> <li>
@@ -3173,7 +3173,7 @@
</li> </li>
</ul> </ul>
<h3>Filtrage de tags template</h3> <h3 data-i18n="help.63f024d4">Filtrage de tags template</h3>
<p> <p>
Dans les Configurations, vous pouvez masquer les Dans les Configurations, vous pouvez masquer les
tags de template : tags de template :
@@ -3196,9 +3196,9 @@
</section> </section>
<section class="help-section" id="help-fichiers"> <section class="help-section" id="help-fichiers">
<h2>📄 Fichiers</h2> <h2 data-i18n="help.c017944b">📄 Fichiers</h2>
<h3>Visualisation</h3> <h3 data-i18n="help.cf8615b1">Visualisation</h3>
<p>Les fichiers markdown sont rendus avec :</p> <p>Les fichiers markdown sont rendus avec :</p>
<ul> <ul>
<li> <li>
@@ -3352,14 +3352,14 @@
<!-- 🗺️ Graphe --> <!-- 🗺️ Graphe -->
<section class="help-section" id="help-graphe"> <section class="help-section" id="help-graphe">
<h2>🗺️ Vue Graphe</h2> <h2 data-i18n="help.9c7a0a8d">🗺️ Vue Graphe</h2>
<p> <p>
La vue graphe offre une visualisation La vue graphe offre une visualisation
interactive des connexions entre vos notes via interactive des connexions entre vos notes via
les wikilinks. les wikilinks.
</p> </p>
<h3>Ouverture</h3> <h3 data-i18n="help.b6619ac9">Ouverture</h3>
<ul> <ul>
<li> <li>
<strong>Menu contextuel</strong> : Clic <strong>Menu contextuel</strong> : Clic
@@ -3372,7 +3372,7 @@
</li> </li>
</ul> </ul>
<h3>Interaction</h3> <h3 data-i18n="help.61ee5a22">Interaction</h3>
<ul> <ul>
<li> <li>
<strong>Zoom/Pan</strong> : Molette pour <strong>Zoom/Pan</strong> : Molette pour
@@ -3405,7 +3405,7 @@
</li> </li>
</ul> </ul>
<h3>Affichage</h3> <h3 data-i18n="help.8caed987">Affichage</h3>
<ul> <ul>
<li> <li>
<strong>Nœuds</strong> : Fichiers (carrés) <strong>Nœuds</strong> : Fichiers (carrés)
@@ -3446,7 +3446,7 @@
class="help-section" class="help-section"
id="help-personnalisation" id="help-personnalisation"
> >
<h2>🎨 Personnalisation</h2> <h2 data-i18n="help.86e3825d">🎨 Personnalisation</h2>
<h3 data-i18n="auto.337d8626">Thème clair/sombre</h3> <h3 data-i18n="auto.337d8626">Thème clair/sombre</h3>
<p data-i18n="help.theme_toggle">Basculez entre les thèmes :</p> <p data-i18n="help.theme_toggle">Basculez entre les thèmes :</p>
@@ -3469,7 +3469,7 @@
</li> </li>
</ul> </ul>
<h3>Redimensionnement de la sidebar</h3> <h3 data-i18n="help.7bcbb2e3">Redimensionnement de la sidebar</h3>
<p> <p>
Sur desktop, ajustez la largeur de la sidebar : Sur desktop, ajustez la largeur de la sidebar :
</p> </p>
@@ -3523,14 +3523,14 @@
<!-- ⌨️ Palette de commandes --> <!-- ⌨️ Palette de commandes -->
<section class="help-section" id="help-palette"> <section class="help-section" id="help-palette">
<h2>⌨️ Palette de commandes</h2> <h2 data-i18n="help.62308f96">⌨️ Palette de commandes</h2>
<p data-i18n="auto.774dbd63"> <p data-i18n="auto.774dbd63">
La palette de commandes permet d'accéder La palette de commandes permet d'accéder
rapidement aux fichiers et aux actions sans rapidement aux fichiers et aux actions sans
utiliser la souris. utiliser la souris.
</p> </p>
<h3>Ouverture</h3> <h3 data-i18n="help.b6619ac9">Ouverture</h3>
<ul> <ul>
<li> <li>
<strong>Ctrl+Shift+Espace</strong> : Palette <strong>Ctrl+Shift+Espace</strong> : Palette
@@ -3546,7 +3546,7 @@
</li> </li>
</ul> </ul>
<h3>Mode fichiers</h3> <h3 data-i18n="help.6d547397">Mode fichiers</h3>
<p> <p>
Tapez le nom d'un fichier pour le trouver Tapez le nom d'un fichier pour le trouver
rapidement. La recherche utilise l'API rapidement. La recherche utilise l'API
@@ -3555,7 +3555,7 @@
ouvrir le fichier sélectionné. ouvrir le fichier sélectionné.
</p> </p>
<h3>Mode commandes</h3> <h3 data-i18n="help.3cf370b1">Mode commandes</h3>
<p> <p>
Tapez <code>&gt;</code> (ou Ctrl+Alt+Espace) Tapez <code>&gt;</code> (ou Ctrl+Alt+Espace)
pour voir la liste des actions disponibles : pour voir la liste des actions disponibles :
@@ -3624,7 +3624,7 @@
</section> </section>
<section class="help-section" id="help-raccourcis"> <section class="help-section" id="help-raccourcis">
<h2>⌨️ Raccourcis clavier</h2> <h2 data-i18n="help.2a2e5b0f">⌨️ Raccourcis clavier</h2>
<h3 data-i18n="help.nav_navigation">Navigation</h3> <h3 data-i18n="help.nav_navigation">Navigation</h3>
<ul> <ul>
@@ -3870,7 +3870,7 @@
</li> </li>
</ul> </ul>
<h3>Indicateurs visuels</h3> <h3 data-i18n="help.096367af">Indicateurs visuels</h3>
<ul> <ul>
<li> <li>
Pendant une requête AI, un toast Pendant une requête AI, un toast
@@ -3890,7 +3890,7 @@
</li> </li>
</ul> </ul>
<h3>Sauvegarde automatique</h3> <h3 data-i18n="help.2dad2bfd">Sauvegarde automatique</h3>
<p> <p>
L'éditeur sauvegarde automatiquement après 2 L'éditeur sauvegarde automatiquement après 2
secondes d'inactivité. Le bouton de sauvegarde secondes d'inactivité. Le bouton de sauvegarde
@@ -3929,7 +3929,7 @@
<!-- 🔗 Partage --> <!-- 🔗 Partage -->
<section class="help-section" id="help-partage"> <section class="help-section" id="help-partage">
<h2>🔗 Partage et Webhooks</h2> <h2 data-i18n="help.8c65b2f2">🔗 Partage et Webhooks</h2>
<h3 data-i18n="help.public_shares">Publication publique</h3> <h3 data-i18n="help.public_shares">Publication publique</h3>
<p> <p>
@@ -3969,7 +3969,7 @@
<!-- 🪝 Webhooks --> <!-- 🪝 Webhooks -->
<section class="help-section" id="help-webhooks"> <section class="help-section" id="help-webhooks">
<h2>🪝 Webhooks</h2> <h2 data-i18n="help.29afa01d">🪝 Webhooks</h2>
<p> <p>
Les webhooks permettent à ObsiGate de Les webhooks permettent à ObsiGate de
<strong <strong
@@ -4247,7 +4247,7 @@
> >
</p> </p>
<h3>Format du payload</h3> <h3 data-i18n="help.77f4f06e">Format du payload</h3>
<p> <p>
Chaque webhook reçoit un <code>POST</code> avec Chaque webhook reçoit un <code>POST</code> avec
<code>Content-Type: application/json</code> : <code>Content-Type: application/json</code> :
@@ -4320,7 +4320,7 @@
exécution. exécution.
</p> </p>
<h3>Exemples concrets</h3> <h3 data-i18n="help.550b0240">Exemples concrets</h3>
<h4 data-i18n="auto.b419c2c2">Récepteur Python (Flask)</h4> <h4 data-i18n="auto.b419c2c2">Récepteur Python (Flask)</h4>
<pre <pre
@@ -4333,7 +4333,7 @@
" "
><code>from flask import Flask, request\nimport hmac, hashlib\n\napp = Flask(__name__)\nWEBHOOK_SECRET = "mon-secret" # même que dans ObsiGate\n\[email protected]("/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)</code></pre> ><code>from flask import Flask, request\nimport hmac, hashlib\n\napp = Flask(__name__)\nWEBHOOK_SECRET = "mon-secret" # même que dans ObsiGate\n\[email protected]("/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)</code></pre>
<h4>n8n / Make (no-code)</h4> <h4 data-i18n="help.d1ea1dc6">n8n / Make (no-code)</h4>
<ol> <ol>
<li> <li>
Créez un Créez un
@@ -4357,7 +4357,7 @@
</li> </li>
</ol> </ol>
<h4>Notification Discord</h4> <h4 data-i18n="help.229fd3e2">Notification Discord</h4>
<p> <p>
Utilisez un webhook relais (n8n, Make, ou un Utilisez un webhook relais (n8n, Make, ou un
script) pour transformer le payload ObsiGate en script) pour transformer le payload ObsiGate en
@@ -4384,7 +4384,7 @@ curl -H "Content-Type: application/json" -d "{
\"content\": \"📝 **$event** — $path\" \"content\": \"📝 **$event** — $path\"
}" "$WEBHOOK_URL"</code></pre> }" "$WEBHOOK_URL"</code></pre>
<h4>Tester avec curl</h4> <h4 data-i18n="help.40dd7e38">Tester avec curl</h4>
<pre <pre
style=" style="
background: var(--bg-secondary); background: var(--bg-secondary);
@@ -4400,7 +4400,7 @@ curl -X POST https://votre-serveur.com/webhook \
-H "X-ObsiGate-Signature: sha256=$(echo -n '{"event":"file_created",...}' | openssl dgst -sha256 -hmac 'mon-secret' | cut -d' ' -f2)" \ -H "X-ObsiGate-Signature: sha256=$(echo -n '{"event":"file_created",...}' | openssl dgst -sha256 -hmac 'mon-secret' | cut -d' ' -f2)" \
-d '{"event":"file_created","timestamp":"2026-06-03T14:30:00Z","data":{"vault":"IT","path":"notes/test.md"}}'</code></pre> -d '{"event":"file_created","timestamp":"2026-06-03T14:30:00Z","data":{"vault":"IT","path":"notes/test.md"}}'</code></pre>
<h3>Limitations actuelles</h3> <h3 data-i18n="help.381abec7">Limitations actuelles</h3>
<ul> <ul>
<li> <li>
Timeout de <strong>5 secondes</strong> par Timeout de <strong>5 secondes</strong> par
@@ -4426,7 +4426,7 @@ curl -X POST https://votre-serveur.com/webhook \
</ul> </ul>
</section> </section>
<section class="help-section" id="help-sauvegardes"> <section class="help-section" id="help-sauvegardes">
<h2>💾 Sauvegardes et Audits</h2> <h2 data-i18n="help.62549eca">💾 Sauvegardes et Audits</h2>
<h3 data-i18n="help.backup_auto">Backup automatique</h3> <h3 data-i18n="help.backup_auto">Backup automatique</h3>
<p data-i18n="auto.ab5e6155"> <p data-i18n="auto.ab5e6155">
@@ -4477,7 +4477,7 @@ curl -X POST https://votre-serveur.com/webhook \
<section class="help-section" id="help-securite"> <section class="help-section" id="help-securite">
<h2 data-i18n="auto.37561472">🛡️ Sécurité</h2> <h2 data-i18n="auto.37561472">🛡️ Sécurité</h2>
<h3>Authentification</h3> <h3 data-i18n="help.c48fb18a">Authentification</h3>
<ul> <ul>
<li> <li>
<strong>JWT + Argon2id</strong> : Tokens JWT <strong>JWT + Argon2id</strong> : Tokens JWT
@@ -4503,7 +4503,7 @@ curl -X POST https://votre-serveur.com/webhook \
</li> </li>
</ul> </ul>
<h3>Protection</h3> <h3 data-i18n="help.83f1d9ca">Protection</h3>
<ul> <ul>
<li> <li>
<strong>Secret redactor</strong> : Masque <strong>Secret redactor</strong> : Masque
@@ -4532,7 +4532,7 @@ curl -X POST https://votre-serveur.com/webhook \
</section> </section>
<section class="help-section" id="help-astuces"> <section class="help-section" id="help-astuces">
<h2>💡 Astuces et bonnes pratiques</h2> <h2 data-i18n="help.686f8313">💡 Astuces et bonnes pratiques</h2>
<h3 data-i18n="auto.559ef1da">Workflow recommandé</h3> <h3 data-i18n="auto.559ef1da">Workflow recommandé</h3>
<ol> <ol>
@@ -4558,7 +4558,7 @@ curl -X POST https://votre-serveur.com/webhook \
</li> </li>
</ol> </ol>
<h3>Optimisations</h3> <h3 data-i18n="help.fe388b67">Optimisations</h3>
<ul> <ul>
<li> <li>
<strong>Masquez la sidebar</strong> : Plus <strong>Masquez la sidebar</strong> : Plus
@@ -4582,7 +4582,7 @@ curl -X POST https://votre-serveur.com/webhook \
</li> </li>
</ul> </ul>
<h3>Trucs et astuces</h3> <h3 data-i18n="help.2a92203f">Trucs et astuces</h3>
<ul> <ul>
<li> <li>
<strong>Navigation visuelle</strong> : Le <strong>Navigation visuelle</strong> : Le
+37 -1
View File
@@ -792,5 +792,41 @@
"help.00b9572b": "Results ranked by TF-IDF relevance", "help.00b9572b": "Results ranked by TF-IDF relevance",
"help.a4a4e21b": "\"×\" button to reset the filter", "help.a4a4e21b": "\"×\" button to reset the filter",
"help.04df1506": "Global search with autocomplete", "help.04df1506": "Global search with autocomplete",
"help.d5c977ac": "Code blocks adapt to the theme" "help.d5c977ac": "Code blocks adapt to the theme",
"help.733f0559": "🗺️ Navigation",
"help.8c5341e0": "📑 Tab management",
"help.adf30d78": "🔍 Recherche",
"help.a648c49e": "Facets and sorting",
"help.2507242f": "🏷️ Tags",
"help.5f87ea79": "Tag cloud",
"help.2c03a7ba": "Inline vs frontmatter tags",
"help.63f024d4": "Template tag filtering",
"help.c017944b": "📄 Fichiers",
"help.cf8615b1": "Visualization",
"help.9c7a0a8d": "🗺️ Graph View",
"help.b6619ac9": "Opening",
"help.61ee5a22": "Interaction",
"help.8caed987": "Display",
"help.86e3825d": "🎨 Customization",
"help.7bcbb2e3": "Sidebar resizing",
"help.62308f96": "⌨️ Command Palette",
"help.6d547397": "File mode",
"help.3cf370b1": "Command mode",
"help.2a2e5b0f": "⌨️ Keyboard shortcuts",
"help.096367af": "Visual indicators",
"help.2dad2bfd": "Automatic save",
"help.8c65b2f2": "🔗 Sharing and Webhooks",
"help.29afa01d": "🪝 Webhooks",
"help.77f4f06e": "Payload format",
"help.550b0240": "Concrete examples",
"help.d1ea1dc6": "n8n / Make (no-code)",
"help.229fd3e2": "Discord notification",
"help.40dd7e38": "Test with curl",
"help.381abec7": "Current limitations",
"help.62549eca": "💾 Backups and Audits",
"help.c48fb18a": "Authentication",
"help.83f1d9ca": "Protection",
"help.686f8313": "💡 Tips and best practices",
"help.fe388b67": "Optimizations",
"help.2a92203f": "Tips and tricks"
} }
+37 -1
View File
@@ -792,5 +792,41 @@
"help.00b9572b": ":\n Résultats classés par pertinence TF-IDF", "help.00b9572b": ":\n Résultats classés par pertinence TF-IDF",
"help.a4a4e21b": ": Bouton \"×\" pour\n réinitialiser le filtre", "help.a4a4e21b": ": Bouton \"×\" pour\n réinitialiser le filtre",
"help.04df1506": ":\n Recherche globale avec autocomplétion", "help.04df1506": ":\n Recherche globale avec autocomplétion",
"help.d5c977ac": ": Les blocs de\n code s'adaptent au thème" "help.d5c977ac": ": Les blocs de\n code s'adaptent au thème",
"help.733f0559": "🗺️ Navigation",
"help.8c5341e0": "📑 Gestion des onglets",
"help.adf30d78": "🔍 Recherche",
"help.a648c49e": "Facettes et tri",
"help.2507242f": "🏷️ Tags",
"help.5f87ea79": "Tag cloud",
"help.2c03a7ba": "Tags inline vs frontmatter",
"help.63f024d4": "Filtrage de tags template",
"help.c017944b": "📄 Fichiers",
"help.cf8615b1": "Visualisation",
"help.9c7a0a8d": "🗺️ Vue Graphe",
"help.b6619ac9": "Ouverture",
"help.61ee5a22": "Interaction",
"help.8caed987": "Affichage",
"help.86e3825d": "🎨 Personnalisation",
"help.7bcbb2e3": "Redimensionnement de la sidebar",
"help.62308f96": "⌨️ Palette de commandes",
"help.6d547397": "Mode fichiers",
"help.3cf370b1": "Mode commandes",
"help.2a2e5b0f": "⌨️ Raccourcis clavier",
"help.096367af": "Indicateurs visuels",
"help.2dad2bfd": "Sauvegarde automatique",
"help.8c65b2f2": "🔗 Partage et Webhooks",
"help.29afa01d": "🪝 Webhooks",
"help.77f4f06e": "Format du payload",
"help.550b0240": "Exemples concrets",
"help.d1ea1dc6": "n8n / Make (no-code)",
"help.229fd3e2": "Notification Discord",
"help.40dd7e38": "Tester avec curl",
"help.381abec7": "Limitations actuelles",
"help.62549eca": "💾 Sauvegardes et Audits",
"help.c48fb18a": "Authentification",
"help.83f1d9ca": "Protection",
"help.686f8313": "💡 Astuces et bonnes pratiques",
"help.fe388b67": "Optimisations",
"help.2a92203f": "Trucs et astuces"
} }