From 661989d85da32a52311617a0f0bbedf61c1bb363 Mon Sep 17 00:00:00 2001 From: Bruno Charest Date: Thu, 18 Jun 2026 15:59:19 -0400 Subject: [PATCH] fix: wrap 73 LI descriptions across all help sections with data-i18n MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pattern:
  • TERM : French desc → wrapped in Covers: Navigation, Tabs, Search, Tags, Files, Editing, Graph, AI Editor, Palette, Shortcuts, Sharing, Webhooks, Backups, Security, Customization, Tips sections 901 locale keys, 442 data-i18n attributes --- _all_li.py | 168 ++++++++++++++++++ frontend/index.html | 363 ++++++++++++++++----------------------- frontend/locales/en.json | 75 +++++++- frontend/locales/fr.json | 75 +++++++- 4 files changed, 462 insertions(+), 219 deletions(-) create mode 100644 _all_li.py diff --git a/_all_li.py b/_all_li.py new file mode 100644 index 0000000..21cc68a --- /dev/null +++ b/_all_li.py @@ -0,0 +1,168 @@ +"""Wrap ALL
  • French descriptions after in data-i18n spans across entire help guide.""" +import re, json, hashlib + +with open('frontend/index.html', 'r', encoding='utf-8') as f: + html = f.read() + +with open('frontend/locales/fr.json', 'r', encoding='utf-8') as f: fr = json.load(f) +with open('frontend/locales/en.json', 'r', encoding='utf-8') as f: en = json.load(f) + +# Find help body boundaries +start = html.find('id="help-modal"') +depth = 0 +pos = start +while pos < len(html): + no = html.find('', pos+1) + if nc == -1: break + if no != -1 and no < nc: depth += 1; pos = no + else: + if depth == 0: end = nc + 6; break + depth -= 1; pos = nc + +help_body = html[start:end] +count = 0 + +# ── Find ALL patterns: TERM FOLLOWED_BY FRENCH_TEXT ── +# Pattern 1: TERM : French text\n +# Pattern 2: TERM\n : French text\n +# Pattern 3: TERM (context) : French text\n + +# First, find all
  • blocks and extract + trailing text +li_pattern = re.compile( + r'(
  • \s*(]*>[^<]+)\s*' + r'(:?\s*(?:\([^)]+\)\s*:?\s*)?' # optional (context) : + r')([^<]{3,300})' # French description (until next <) + , re.DOTALL) + +translations = {} +to_fix = [] + +for m in re.finditer(r'
  • \s*(]*>[^<]+)\s*(:?\s*(?:\([^)]+\)\s*:?\s*)?)([^<]{3,300})', help_body): + strong_tag = m.group(1) + connector = m.group(2) # e.g. " : " or " (desktop) : " or just " " + desc = m.group(3).strip() + + # Skip if already wrapped in span + full_match = m.group(0) + if '{connector}{desc}' + if old in html: + html = html.replace(old, new) + count += 1 + +print(f"Applied {count} fixes") + +# ── Translate all new keys ── +en_translations = { + 'Recherche globale avec autocomplétion': 'Global search with autocomplete', + 'Affiche le contexte actif (All, vault1, etc.)': 'Shows the active context (All, vault1, etc.)', + 'Accès aux paramètres, thème, aide': 'Access to settings, theme, help', + 'Arborescence des fichiers et dossiers': 'File and folder tree', + 'Nuage de tags cliquables': 'Clickable tag cloud', + 'Barre de recherche pour filtrer fichiers/tags': 'Search bar to filter files/tags', + 'Dropdown pour changer de vault': 'Dropdown to change vault', + 'Glissez le bord droit pour ajuster la largeur': 'Drag the right edge to adjust width', + "Cliquez sur l'icône sidebar dans le header": 'Click the sidebar icon in the header', + 'Chemin du fichier (cliquable pour repositionner la sidebar)': 'File path (clickable to reposition sidebar)', + 'Métadonnées du fichier': 'File metadata', + 'Copier, Source, Télécharger, Éditer, Ouvrir dans nouvelle fenêtre': 'Copy, Source, Download, Edit, Open in new window', + 'Markdown avec wikilinks et images': 'Markdown with wikilinks and images', + 'Affiche/masque la sidebar': 'Show/hide the sidebar', + 'Masque la sidebar pour plus d\'espace': 'Hide the sidebar for more space', + "Retour à l'accueil": 'Return to home', + 'Recherche globale avec autocomplétion': 'Global search with autocomplete', + 'Complète automatiquement le texte là où se trouve le curseur': 'Automatically completes text where the cursor is', + "Améliore la qualité, la clarté et le flux du texte": 'Improves quality, clarity and flow of the text', + "Corrige les fautes d'orthographe et de grammaire": 'Fixes spelling and grammar errors', + "Rend le texte plus concis tout en préservant l'information": 'Makes text more concise while preserving information', + 'Ajoute des détails, exemples ou explications': 'Adds details, examples or explanations', + 'Simplifie le langage, évite le jargon': 'Simplifies language, avoids jargon', + "Réécrit le texte selon vos instructions personnalisées": 'Rewrites the text according to your custom instructions', + 'Explique le texte sélectionné de façon claire': 'Clearly explains the selected text', + 'Résume le texte de façon concise': 'Concisely summarizes the text', + "Continue l'écriture à partir du texte": 'Continues writing from the text', + 'Ton formel et professionnel': 'Formal and professional tone', + 'Ton décontracté et conversationnel': 'Casual and conversational tone', + 'Traduit le texte sélectionné vers une autre langue': 'Translates the selected text to another language', + 'Génère du contenu à partir de la sélection': 'Generates content from the selection', + 'Fichiers (carrés) et dossiers (cercles) avec icônes': 'Files (squares) and folders (circles) with icons', + 'Molette pour zoomer, cliquer-glisser pour se déplacer': 'Scroll wheel to zoom, click-drag to move', + 'Votre choix est sauvegardé en localStorage': 'Your choice is saved in localStorage', + "Dans la barre d'outils (le cas échéant)": 'In the toolbar (when available)', + "Les blocs de code s'adaptent au thème": 'Code blocks adapt to the theme', + 'Les 50 dernières recherches (localStorage)': 'The 50 most recent searches (localStorage)', + 'Restent ouverts jusqu\'à fermeture manuelle': 'Stay open until manually closed', + 'Les tags s\'adaptent au vault sélectionné': 'Tags adapt to the selected vault', + 'Stats index, mémoire, moteur de recherche': 'Index stats, memory, search engine', + 'Délai debounce, résultats par page, timeout': 'Debounce delay, results per page, timeout', + 'Workers, boosts TF-IDF, expansions préfixe': 'Workers, TF-IDF boosts, prefix expansions', + 'Patterns pour masquer les tags template': 'Patterns to hide template tags', + 'Forcer un rescan des vaults': 'Force a vault rescan', + '↑/↓ pour naviguer, Enter pour sélectionner': '↑/↓ to navigate, Enter to select', + 'Chaque type de fichier a son icône (markdown, code, etc.)': 'Each file type has its icon (markdown, code, etc.)', + 'Un onglet temporaire (italique) est remplacé': 'A temporary tab (italic) is replaced', + 'L\'onglet "Récent" dans la sidebar liste vos': 'The "Recent" tab in the sidebar lists your', + 'Ouvre le fichier dans un onglet temporaire (aperçu,': 'Opens the file in a temporary tab (preview,', + 'Complétion, réécriture, traduction (voir': 'Completion, rewrite, translation (see', + 'Résultats classés par pertinence TF-IDF': 'Results ranked by TF-IDF relevance', + 'Auto-save silencieux après 2s d\'inactivité': 'Silent auto-save after 2s of inactivity', + 'Contrôle la profondeur d\'exploration (0-3)': 'Controls exploration depth (0-3)', + "N'affiche que les nœuds avec un tag spécifique": 'Only shows nodes with a specific tag', + 'Métadonnées du nœud (tags, liens, chemin)': 'Node metadata (tags, links, path)', + 'Aperçu du contenu de la note sans naviguer': 'Preview of note content without navigating', + 'Navigation facilitée dans les fichiers longs': 'Easier navigation in long files', + 'Bouton "×" pour réinitialiser le filtre': '"×" button to reset the filter', + 'Sélection rapide en haut de l\'onglet Vault': 'Quick select at the top of the Vault tab', + 'Affichage horizontal avec le nom du fichier': 'Horizontal display with the file name', +} + +for k, v in fr.items(): + if k.startswith('help.desc_') and en.get(k) == v: + if v in en_translations: + en[k] = en_translations[v] + +# Also try to match substrings +for k, v in fr.items(): + if k.startswith('help.desc_') and en.get(k) == v: + for fr_t, en_t in en_translations.items(): + if fr_t in v and len(fr_t) > 15: + en[k] = v.replace(fr_t, en_t) + break + +with open('frontend/index.html', 'w', encoding='utf-8') as f: f.write(html) +with open('frontend/locales/fr.json', 'w', encoding='utf-8') as f: json.dump(fr, f, ensure_ascii=False, indent=2) +with open('frontend/locales/en.json', 'w', encoding='utf-8') as f: json.dump(en, f, ensure_ascii=False, indent=2) + +total = len(re.findall(r'data-i18n(?:-[a-z]+)?="', html)) +print(f'Total tags: {total}, Keys: {len(fr)}') +still_fr = sum(1 for k in en if k.startswith('help.desc_') and en[k] == fr.get(k, '')) +print(f'Untranslated help.desc: {still_fr}') diff --git a/frontend/index.html b/frontend/index.html index 264ce35..455d2ed 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -2839,9 +2839,8 @@ sur le nom du fichier
  • - Icônes : Chaque type de - fichier a son icône (markdown, code, etc.) -
  • + Icônes : Chaque type de + fichier a son icône (markdown, code, etc.)

    Filtrage de la sidebar

    @@ -2859,9 +2858,8 @@ "Aa" pour respecter la casse
  • - Effacer : Bouton "×" pour - réinitialiser le filtre -
  • + Effacer : Bouton "×" pour + réinitialiser le filtre
  • Résultats groupés : Affichage par vault avec chemins complets @@ -2898,9 +2896,8 @@ "Vault" dans le menu Options
  • - Sidebar dropdown : - Sélection rapide en haut de l'onglet Vaults -
  • + Sidebar dropdown : + Sélection rapide en haut de l'onglet Vaults
  • Tous les vaults : Vue globale de tous vos contenus @@ -2922,19 +2919,17 @@

    Ouverture d'onglets

    Navigation entre onglets

    @@ -2947,9 +2942,8 @@ Ctrl+Tab : Onglet suivant
  • - Ctrl+Shift+Tab : Onglet - précédent -
  • + Ctrl+Shift+Tab : Onglet + précédent
  • Ctrl+W : Fermer l'onglet actif @@ -2963,23 +2957,19 @@

    Fonctionnalités

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

    Opérateurs avancés

    @@ -3064,9 +3052,8 @@

    Chips de filtres actifs

    @@ -3096,9 +3082,8 @@ "×" pour retirer un filtre
  • - Couleurs : Chaque type - d'opérateur a sa couleur -
  • + Couleurs : Chaque type + d'opérateur a sa couleur

    Facettes et tri

    @@ -3108,21 +3093,18 @@

    @@ -3140,17 +3122,15 @@ des frontmatters YAML et inline (#tag)
  • - Cliquable : Cliquez pour - filtrer les résultats -
  • + Cliquable : Cliquez pour + filtrer les résultats
  • Filtrage : Utilisez la barre de filtrage pour chercher un tag
  • - Contexte vault : Les tags - s'adaptent au vault sélectionné -
  • + Contexte vault : Les tags + s'adaptent au vault sélectionné

    Tags inline vs frontmatter

    @@ -3167,9 +3147,8 @@ markdown
  • - Fusion automatique : Les - deux types sont combinés -
  • + Fusion automatique : Les + deux types sont combinés

    Filtrage de tags template

    @@ -3184,13 +3163,11 @@ #{{ ... }}
  • - Regex générée : Aperçu de - la regex appliquée -
  • + Regex générée : Aperçu de + la regex appliquée
  • - Ajout/Suppression : Gérez - vos patterns de filtrage -
  • + Ajout/Suppression : Gérez + vos patterns de filtrage @@ -3231,13 +3208,11 @@ markdown brut
  • - Télécharger : Télécharge le - fichier -
  • + Télécharger : Télécharge le + fichier
  • - Éditer : Ouvre l'éditeur - CodeMirror -
  • + Éditer : Ouvre l'éditeur + CodeMirror
  • Ouvrir dans nouvelle fenêtre
  • - Numéros de ligne : - Navigation facilitée dans les fichiers longs -
  • + Numéros de ligne : + Navigation facilitée dans les fichiers longs
  • Find in page : Ctrl+F pour chercher dans le fichier (casse, regex, mot entier)
  • - Sauvegarde automatique : + Sauvegarde automatique : Auto-save silencieux après 2s d'inactivité, - flash vert de confirmation -
  • + flash vert de confirmation
  • Bouton ✓ : Sauvegarde manuelle @@ -3342,9 +3315,9 @@ fichier
  • - Barre d'outils AI : + Barre d'outils AI : Complétion, réécriture, traduction (voir - section 🤖 IA) + section🤖 IA)
  • @@ -3366,25 +3339,21 @@ Graphique
  • - Bouton dédié : Dans la - barre d'outils (le cas échéant) -
  • + Bouton dédié : Dans la + barre d'outils (le cas échéant)

    Interaction