diff --git a/apps/mana/apps/web/src/lib/modules/memoro/views/DetailView.svelte b/apps/mana/apps/web/src/lib/modules/memoro/views/DetailView.svelte index 44a9eba46..b045738d0 100644 --- a/apps/mana/apps/web/src/lib/modules/memoro/views/DetailView.svelte +++ b/apps/mana/apps/web/src/lib/modules/memoro/views/DetailView.svelte @@ -15,18 +15,16 @@ import { VisibilityPicker, type VisibilityLevel } from '@mana/shared-privacy'; import type { ViewProps } from '$lib/app-registry'; import type { LocalMemo, ProcessingStatus } from '../types'; + import { _ } from 'svelte-i18n'; - // Human-readable labels for the title-source badge below the title - // input. We use these specific strings (not @mana/shared-llm's - // generic tierLabel) so we can surface the actual model family - // — both browser and mana-server now run Gemma 4 variants, so the - // label stays coherent across tiers. - const TITLE_SOURCE_LABELS: Record = { - none: 'Lokal (regelbasiert)', - browser: 'Auf deinem Gerät (Gemma 4 E2B)', - 'mana-server': 'Mana-Server (Gemma 4 E4B)', - byok: 'Dein API-Key', - cloud: 'Google Gemini', + // Map LlmTier → i18n key (mana-server keyed as 'mana_server' since dots are + // reserved path separators). Strings live in memoro.detail_view.title_sources. + const TITLE_SOURCE_KEYS: Record = { + none: 'memoro.detail_view.title_sources.none', + browser: 'memoro.detail_view.title_sources.browser', + 'mana-server': 'memoro.detail_view.title_sources.mana_server', + byok: 'memoro.detail_view.title_sources.byok', + cloud: 'memoro.detail_view.title_sources.cloud', }; function isLlmTier(value: unknown): value is LlmTier { @@ -84,11 +82,11 @@ return `${m}:${String(s).padStart(2, '0')}`; } - const statusLabels: Record = { - pending: 'Ausstehend', - processing: 'Wird verarbeitet', - completed: 'Fertig', - failed: 'Fehlgeschlagen', + const STATUS_KEYS: Record = { + pending: 'memoro.detail_view.statuses.pending', + processing: 'memoro.detail_view.statuses.processing', + completed: 'memoro.detail_view.statuses.completed', + failed: 'memoro.detail_view.statuses.failed', }; const statusColors: Record = { @@ -130,21 +128,21 @@ if (detail.focused) return null; const metadata = (memo.metadata as Record | null) ?? {}; const source = metadata.titleSource; - return isLlmTier(source) ? TITLE_SOURCE_LABELS[source] : null; + return isLlmTier(source) ? $_(TITLE_SOURCE_KEYS[source]) : null; }); detail.deleteWithUndo({ - label: 'Memo gelöscht', + label: $_('memoro.detail_view.toast_deleted'), delete: () => memosStore.delete(memoId), goBack, })} @@ -156,7 +154,9 @@ bind:value={editTitle} onfocus={detail.focus} onblur={saveField} - placeholder={titleIsGenerating && !editTitle ? 'Titel wird generiert…' : 'Titel…'} + placeholder={titleIsGenerating && !editTitle + ? $_('memoro.detail_view.placeholder_title_generating') + : $_('memoro.detail_view.placeholder_title_idle')} />