From 391017bcfa5f6cba3cfdd2d568210a4aab661452 Mon Sep 17 00:00:00 2001 From: Till JS Date: Mon, 27 Apr 2026 14:31:33 +0200 Subject: [PATCH] =?UTF-8?q?i18n(ai-workbench):=20translate=20ListView=20vi?= =?UTF-8?q?a=20$=5F()=20=E2=80=94=20tabs,=20filters,=20audit=20table,=20ti?= =?UTF-8?q?meline=20buckets?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Tabs (Timeline / Datenzugriff) - Filter labels (Modul/Mission/Agent) with shared "alle" option - Time-range buttons routed via dynamic key labelKey - Audit: loading, error_prefix interpolation, empty paragraph, 4 column headers - Timeline empty state - Bucket revert button (title + Läuft… / Rückgängig label) + event-count tooltip + event-link "Zum Modul" - Confirm + alert summary parts ({n} zurückgenommen / nicht unterstützt / fehlgeschlagen) + "Revert fehlgeschlagen — siehe Console." fallback - Date/time formatters switched to get(locale) ?? 'de' Baselines: hardcoded 1090 → 1082 (8 cleared); missing-keys baseline +1 (ai-workbench.list_view.range_* dynamic key). Co-Authored-By: Claude Opus 4.7 (1M context) --- .../lib/modules/ai-workbench/ListView.svelte | 98 ++++++++++++------- scripts/i18n-hardcoded-baseline.json | 1 - scripts/i18n-missing-baseline.json | 1 + 3 files changed, 64 insertions(+), 36 deletions(-) diff --git a/apps/mana/apps/web/src/lib/modules/ai-workbench/ListView.svelte b/apps/mana/apps/web/src/lib/modules/ai-workbench/ListView.svelte index 5453683ec..c3c5fa68b 100644 --- a/apps/mana/apps/web/src/lib/modules/ai-workbench/ListView.svelte +++ b/apps/mana/apps/web/src/lib/modules/ai-workbench/ListView.svelte @@ -11,6 +11,8 @@ import { fetchDecryptAudit, type AuditRow } from '$lib/data/ai/audit/queries'; import { isMissionGrantsEnabled } from '$lib/api/config'; import type { DomainEvent } from '$lib/data/events/types'; + import { _, locale } from 'svelte-i18n'; + import { get } from 'svelte/store'; let moduleFilter = $state(null); let missionFilter = $state(null); @@ -54,10 +56,16 @@ return title ? `${e.type} · ${title}` : e.type; } function formatTime(iso: string) { - return new Date(iso).toLocaleTimeString('de-DE', { hour: '2-digit', minute: '2-digit' }); + return new Date(iso).toLocaleTimeString(get(locale) ?? 'de', { + hour: '2-digit', + minute: '2-digit', + }); } function formatDate(iso: string) { - return new Date(iso).toLocaleDateString('de-DE', { day: 'numeric', month: 'short' }); + return new Date(iso).toLocaleDateString(get(locale) ?? 'de', { + day: 'numeric', + month: 'short', + }); } // ── Tab switcher: timeline ↔ decrypt audit ───────────── @@ -92,7 +100,7 @@ }); function formatAuditTs(iso: string): string { - return new Date(iso).toLocaleString('de-DE', { + return new Date(iso).toLocaleString(get(locale) ?? 'de', { day: '2-digit', month: '2-digit', hour: '2-digit', @@ -102,17 +110,27 @@ let revertingKey = $state(null); async function handleRevert(key: string, missionId: string, iterationId: string) { - if (!confirm('Alle AI-Writes dieser Iteration zurücknehmen?')) return; + if (!confirm($_('ai-workbench.list_view.confirm_revert'))) return; revertingKey = key; try { const stats = await revertIteration(missionId, iterationId); - const parts = [`${stats.reverted} zurückgenommen`]; - if (stats.skippedUnsupported > 0) parts.push(`${stats.skippedUnsupported} nicht unterstützt`); - if (stats.failed > 0) parts.push(`${stats.failed} fehlgeschlagen`); + const parts = [ + $_('ai-workbench.list_view.revert_summary_done', { values: { n: stats.reverted } }), + ]; + if (stats.skippedUnsupported > 0) + parts.push( + $_('ai-workbench.list_view.revert_summary_unsupported', { + values: { n: stats.skippedUnsupported }, + }) + ); + if (stats.failed > 0) + parts.push( + $_('ai-workbench.list_view.revert_summary_failed', { values: { n: stats.failed } }) + ); alert(parts.join(' · ')); } catch (err) { console.error(err); - alert('Revert fehlgeschlagen — siehe Console.'); + alert($_('ai-workbench.list_view.revert_alert_failed')); } finally { revertingKey = null; } @@ -129,7 +147,7 @@ aria-selected={tab === 'timeline'} onclick={() => (tab = 'timeline')} > - Timeline + {$_('ai-workbench.list_view.tab_timeline')} {#if grantsEnabled} {/if} @@ -148,9 +166,9 @@
{#if tab === 'timeline'} {#if tab === 'timeline'} -
- {#each [{ id: '24h', label: '24h' }, { id: '7d', label: '7T' }, { id: 'all', label: 'alle' }] as const as opt} +
+ {#each [{ id: '24h', labelKey: 'range_24h' }, { id: '7d', labelKey: 'range_7d' }, { id: 'all', labelKey: 'range_all' }] as const as opt} {/each}
@@ -194,23 +212,23 @@ {#if tab === 'audit'} {#if auditLoading} -

Lade Audit…

+

{$_('ai-workbench.list_view.audit_loading')}

{:else if auditError} -

Fehler: {auditError}

+

+ {$_('ai-workbench.list_view.audit_error_prefix', { values: { error: auditError } })} +

{:else if auditRows.length === 0}

- Keine serverseitigen Entschlüsselungen. Der mana-ai Runner hat für diese Mission noch keine - Records gelesen — entweder ist kein Key-Grant erteilt, oder die Mission nutzt nur plaintext - Inputs (goals). + {$_('ai-workbench.list_view.audit_empty')}

{:else} - - - - + + + + @@ -230,8 +248,7 @@ {/if} {:else if buckets.length === 0}

- Noch keine AI-Aktivität. Sobald eine Mission läuft und Proposals approved werden, erscheinen - hier die Änderungen. + {$_('ai-workbench.list_view.timeline_empty')}

{:else}
    @@ -251,8 +268,11 @@ {bucketAgent?.name ?? b.agentDisplayName} · {missionTitleById.get(b.missionId) ?? b.missionId} - {b.events.length}{b.events.length} {#if b.rationale} @@ -264,10 +284,14 @@ class="revert" disabled={revertingKey !== null} onclick={() => handleRevert(b.key, b.missionId, b.iterationId)} - title="Alle Änderungen dieser Iteration zurücknehmen" + title={$_('ai-workbench.list_view.revert_title')} > - {revertingKey === b.key ? 'Läuft…' : 'Rückgängig'} + {revertingKey === b.key + ? $_('ai-workbench.list_view.revert_running') + : $_('ai-workbench.list_view.revert_label')}
      @@ -275,7 +299,11 @@
    • {e.meta.appId} {describeEvent(e)} - +
    • diff --git a/scripts/i18n-hardcoded-baseline.json b/scripts/i18n-hardcoded-baseline.json index 8883ae789..0792e4265 100644 --- a/scripts/i18n-hardcoded-baseline.json +++ b/scripts/i18n-hardcoded-baseline.json @@ -45,7 +45,6 @@ "apps/mana/apps/web/src/lib/modules/admin/tabs/UsersTab.svelte": 3, "apps/mana/apps/web/src/lib/modules/ai-health/ListView.svelte": 2, "apps/mana/apps/web/src/lib/modules/ai-insights/ListView.svelte": 4, - "apps/mana/apps/web/src/lib/modules/ai-workbench/ListView.svelte": 8, "apps/mana/apps/web/src/lib/modules/articles/components/AddUrlForm.svelte": 4, "apps/mana/apps/web/src/lib/modules/articles/components/HighlightMenu.svelte": 5, "apps/mana/apps/web/src/lib/modules/articles/components/HomeSectionSources.svelte": 1, diff --git a/scripts/i18n-missing-baseline.json b/scripts/i18n-missing-baseline.json index 714df92f3..8399b53e1 100644 --- a/scripts/i18n-missing-baseline.json +++ b/scripts/i18n-missing-baseline.json @@ -5,6 +5,7 @@ "apps/mana/apps/web/src/lib/components/PwaUpdatePrompt.svelte": 3, "apps/mana/apps/web/src/lib/modules/ai-agents/ListView.svelte": 2, "apps/mana/apps/web/src/lib/modules/ai-missions/ListView.svelte": 2, + "apps/mana/apps/web/src/lib/modules/ai-workbench/ListView.svelte": 1, "apps/mana/apps/web/src/lib/modules/broadcast/views/DetailView.svelte": 1, "apps/mana/apps/web/src/lib/modules/credits/ListView.svelte": 1, "apps/mana/apps/web/src/lib/modules/dreams/ListView.svelte": 1,
ZeitMissionRecordStatus{$_('ai-workbench.list_view.audit_col_time')}{$_('ai-workbench.list_view.audit_col_mission')}{$_('ai-workbench.list_view.audit_col_record')}{$_('ai-workbench.list_view.audit_col_status')}