feat: comprehensive i18n coverage — all static text + auto-translate toasts
CI / lint (push) Failing after 18s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Failing after 9s

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
This commit is contained in:
2026-06-18 14:01:37 -04:00
parent f85482214e
commit f91a386566
5 changed files with 774 additions and 198 deletions
+172 -190
View File
File diff suppressed because it is too large Load Diff
+24
View File
@@ -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) {
+3 -1
View File
@@ -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) {
+288 -4
View File
@@ -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"
}
+287 -3
View File
@@ -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": "&copy; 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"
}