Replace hardcoded French strings with i18n calls
CI / lint (push) Failing after 1m28s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Failing after 17s

Initialize i18n before auth so t() works when rendering
auth-dependent UI, and build the command palette lazily so
translations are loaded first. Bump service worker cache version.
This commit is contained in:
2026-07-20 20:16:34 -04:00
parent cc22ffe6df
commit 790f97e501
17 changed files with 378 additions and 147 deletions
+11 -11
View File
@@ -88,8 +88,8 @@ export const GraphViewManager = {
this._depth = depthSlider ? parseInt(depthSlider.value) : 1;
this._scope = 'directory';
title.textContent = `Vue Graphique — ${vault}${path ? '/' + path : ''}`;
statusEl.textContent = 'Chargement...';
title.textContent = t('graph.title', { vault, path: path ? '/' + path : '' });
statusEl.textContent = t('graph.loading');
modal.classList.add('active');
this._canvas = canvas;
@@ -120,8 +120,8 @@ export const GraphViewManager = {
this._nodes = cached.nodes;
this._edges = cached.edges;
this._scope = cached.scope;
const scopeLabel = this._scope === 'full' ? 'Vault complet' : 'Dossier';
statusEl.textContent = `${this._nodes.length} nœuds, ${this._edges.length} liens · ${scopeLabel} · prof=${this._depth} (cache)`;
const scopeLabel = this._scope === 'full' ? t('graph.scope_full') : t('graph.scope_directory');
statusEl.textContent = `${t('graph.nodes_count', { count: this._nodes.length })}, ${t('graph.edges_count', { count: this._edges.length })} · ${scopeLabel} · ${t('graph.depth_label', { depth: this._depth })} ${t('graph.cache_label')}`;
this._initLayout();
this._startRender();
return;
@@ -149,12 +149,12 @@ export const GraphViewManager = {
};
this._cacheKey = cacheKey;
const scopeLabel = this._scope === 'full' ? 'Vault complet' : 'Dossier';
statusEl.textContent = `${this._nodes.length} nœuds, ${this._edges.length} liens · ${scopeLabel} · prof=${this._depth}`;
const scopeLabel = this._scope === 'full' ? t('graph.scope_full') : t('graph.scope_directory');
statusEl.textContent = `${t('graph.nodes_count', { count: this._nodes.length })}, ${t('graph.edges_count', { count: this._edges.length })} · ${scopeLabel} · ${t('graph.depth_label', { depth: this._depth })}`;
this._initLayout();
this._startRender();
} catch (err) {
statusEl.textContent = 'Erreur de chargement';
statusEl.textContent = t('graph.error_loading');
console.error('Graph error:', err);
}
},
@@ -173,7 +173,7 @@ export const GraphViewManager = {
toggleScope() {
this._scope = this._scope === 'full' ? 'directory' : 'full';
const btn = document.getElementById('graph-full-vault');
if (btn) btn.textContent = this._scope === 'full' ? '📁 Dossier' : '🌐 Tout';
if (btn) btn.textContent = this._scope === 'full' ? t('graph.btn_directory') : t('graph.btn_full');
this.reload();
},
@@ -627,14 +627,14 @@ export const GraphViewManager = {
if (fm.statut) rows.push(`<div><span style="color:var(--text-muted)">📌 Statut</span> <span>${fm.statut}</span></div>`);
if (fm.catégorie || fm.categorie) rows.push(`<div><span style="color:var(--text-muted)">${t('graph.category')}</span> <span>${fm.catégorie || fm.categorie}</span></div>`);
if (fm.publish) rows.push(`<div><span style="color:var(--text-muted)">✅</span> <span>${t('graph.published')}</span></div>`);
if (fm.favoris) rows.push('<div><span style="color:var(--text-muted)">⭐</span> <span>Favoris</span></div>');
if (fm.favoris) rows.push('<div><span style="color:var(--text-muted)">⭐</span> <span>' + t('graph.favorites') + '</span></div>');
if (rows.length > 0) metaRows = rows.join('');
}
const tags = (meta?.tags || node.tags || []).slice(0, 6);
const inc = node.incoming_count || 0;
const out = node.outgoing_count || 0;
const typeIcon = node.type === 'directory' ? '📁' : '📄';
const typeLabel = node.type === 'directory' ? 'Dossier' : (node.path || '').endsWith('.md') ? 'Markdown' : 'Fichier';
const typeLabel = node.type === 'directory' ? t('graph.type_directory') : (node.path || '').endsWith('.md') ? t('graph.type_markdown') : t('graph.type_file');
this._infoContent.innerHTML = `
<div style="display:flex;align-items:flex-start;gap:8px;margin-bottom:8px;padding-right:16px">
@@ -796,7 +796,7 @@ export const GraphViewManager = {
return;
}
// Show loading indicator
this._showPreviewTooltip(node, '<em>Chargement...</em>', screenX, screenY);
this._showPreviewTooltip(node, '<em>' + t('common.loading') + '</em>', screenX, screenY);
try {
const data = await api(`/api/file/${encodeURIComponent(this._vault)}?path=${encodeURIComponent(node.path)}`);
// Strip HTML tags, keep line breaks, limit to 600 chars