From 20313de4e95c6c7baf4efeb01c01e046d8f58120 Mon Sep 17 00:00:00 2001 From: Marcel Date: Thu, 19 Mar 2026 17:53:44 +0100 Subject: [PATCH] feat(i18n): fix remaining hardcoded strings and add login page switcher MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add 9 missing translation keys to de/en/es.json: doc_file_error_preview, doc_download_title, doc_tag_filter_title, doc_conversation_title, doc_preview_iframe_title, doc_image_alt, doc_no_date, person_merge_will_be_deleted, admin_user_delete_confirm - documents/[id]/+page.svelte: replace 6 hardcoded strings with m.*() - persons/[id]/+page.svelte: replace "wird gelöscht." and "Kein Datum" - admin/+page.svelte: replace confirm() string with m.admin_user_delete_confirm() - login/+page.svelte: add top-right DE/EN/ES language switcher (Option B) and wire existing login_* keys to the form labels Closes #12 Co-Authored-By: Claude Sonnet 4.6 --- frontend/messages/de.json | 11 +++++++++ frontend/messages/en.json | 11 +++++++++ frontend/messages/es.json | 11 +++++++++ frontend/src/routes/admin/+page.svelte | 2 +- .../src/routes/documents/[id]/+page.svelte | 12 +++++----- frontend/src/routes/login/+page.svelte | 24 ++++++++++++++++++- frontend/src/routes/persons/[id]/+page.svelte | 4 ++-- 7 files changed, 65 insertions(+), 10 deletions(-) diff --git a/frontend/messages/de.json b/frontend/messages/de.json index 32ed938d..9d994075 100644 --- a/frontend/messages/de.json +++ b/frontend/messages/de.json @@ -155,6 +155,17 @@ "admin_group_delete_confirm": "Gruppe wirklich löschen?", "admin_section_new_group": "Neue Gruppe anlegen", "admin_group_name_placeholder": "Gruppenname (z.B. Editoren)", + "admin_user_delete_confirm": "Benutzer {username} wirklich löschen?", + + "doc_file_error_preview": "Vorschau konnte nicht geladen werden.", + "doc_download_title": "Herunterladen", + "doc_tag_filter_title": "Nach {name} filtern", + "doc_conversation_title": "Konversation anzeigen", + "doc_preview_iframe_title": "Dokumentvorschau", + "doc_image_alt": "Original-Scan", + "doc_no_date": "Kein Datum", + + "person_merge_will_be_deleted": "wird gelöscht.", "comp_typeahead_placeholder": "Namen tippen...", "comp_typeahead_loading": "Suche...", diff --git a/frontend/messages/en.json b/frontend/messages/en.json index 73c6ffca..cb4ec322 100644 --- a/frontend/messages/en.json +++ b/frontend/messages/en.json @@ -155,6 +155,17 @@ "admin_group_delete_confirm": "Really delete group?", "admin_section_new_group": "Create new group", "admin_group_name_placeholder": "Group name (e.g. Editors)", + "admin_user_delete_confirm": "Really delete user {username}?", + + "doc_file_error_preview": "Could not load preview.", + "doc_download_title": "Download", + "doc_tag_filter_title": "Filter by {name}", + "doc_conversation_title": "Show conversation", + "doc_preview_iframe_title": "Document Preview", + "doc_image_alt": "Original scan", + "doc_no_date": "No date", + + "person_merge_will_be_deleted": "will be deleted.", "comp_typeahead_placeholder": "Type a name...", "comp_typeahead_loading": "Searching...", diff --git a/frontend/messages/es.json b/frontend/messages/es.json index 616861e6..90ce4108 100644 --- a/frontend/messages/es.json +++ b/frontend/messages/es.json @@ -155,6 +155,17 @@ "admin_group_delete_confirm": "¿Realmente eliminar el grupo?", "admin_section_new_group": "Crear nuevo grupo", "admin_group_name_placeholder": "Nombre del grupo (p.ej. Editores)", + "admin_user_delete_confirm": "¿Realmente eliminar al usuario {username}?", + + "doc_file_error_preview": "No se pudo cargar la vista previa.", + "doc_download_title": "Descargar", + "doc_tag_filter_title": "Filtrar por {name}", + "doc_conversation_title": "Ver conversación", + "doc_preview_iframe_title": "Vista previa del documento", + "doc_image_alt": "Escaneado original", + "doc_no_date": "Sin fecha", + + "person_merge_will_be_deleted": "será eliminado.", "comp_typeahead_placeholder": "Escriba un nombre...", "comp_typeahead_loading": "Buscando...", diff --git a/frontend/src/routes/admin/+page.svelte b/frontend/src/routes/admin/+page.svelte index 0828f2ee..c0981534 100644 --- a/frontend/src/routes/admin/+page.svelte +++ b/frontend/src/routes/admin/+page.svelte @@ -202,7 +202,7 @@ method="POST" action="?/deleteUser" use:enhance={({ cancel }) => { - if (!confirm(`Benutzer '${user.username}' wirklich löschen?`)) { + if (!confirm(m.admin_user_delete_confirm({ username: user.username }))) { cancel(); } return async ({ update }) => { diff --git a/frontend/src/routes/documents/[id]/+page.svelte b/frontend/src/routes/documents/[id]/+page.svelte index 307291f0..166bf225 100644 --- a/frontend/src/routes/documents/[id]/+page.svelte +++ b/frontend/src/routes/documents/[id]/+page.svelte @@ -33,7 +33,7 @@ } catch (e) { console.error(e); - error = 'Vorschau konnte nicht geladen werden.'; + error = m.doc_file_error_preview(); } finally { isLoading = false; } @@ -87,7 +87,7 @@ href={fileUrl} download={doc.originalFilename} class="text-brand-navy bg-brand-sand/50 hover:bg-brand-mint border border-transparent p-2 rounded transition" - title="Download" + title={m.doc_download_title()} > @@ -163,7 +163,7 @@ {tag.name} @@ -241,7 +241,7 @@ @@ -341,14 +341,14 @@ {:else if fileUrl && doc.originalFilename.toLowerCase().endsWith('.pdf')} {:else if fileUrl}
Original Scan
diff --git a/frontend/src/routes/login/+page.svelte b/frontend/src/routes/login/+page.svelte index 01ca18e7..ee290d40 100644 --- a/frontend/src/routes/login/+page.svelte +++ b/frontend/src/routes/login/+page.svelte @@ -1,12 +1,34 @@ -
+
+ +
+ {#each locales as locale (locale)} + + {/each} +
+
diff --git a/frontend/src/routes/persons/[id]/+page.svelte b/frontend/src/routes/persons/[id]/+page.svelte index 0a010649..3b7b8f3e 100644 --- a/frontend/src/routes/persons/[id]/+page.svelte +++ b/frontend/src/routes/persons/[id]/+page.svelte @@ -189,7 +189,7 @@ {#if showMergeConfirm}

- {m.person_merge_warning()} {person.firstName} {person.lastName} wird gelöscht. + {m.person_merge_warning()} {person.firstName} {person.lastName} {m.person_merge_will_be_deleted()}

{/if} @@ -225,7 +225,7 @@ {doc.title || doc.originalFilename}
- {doc.documentDate ? new Intl.DateTimeFormat('de-DE', { day: 'numeric', month: 'long', year: 'numeric' }).format(new Date(doc.documentDate + 'T12:00:00')) : 'Kein Datum'} + {doc.documentDate ? new Intl.DateTimeFormat('de-DE', { day: 'numeric', month: 'long', year: 'numeric' }).format(new Date(doc.documentDate + 'T12:00:00')) : m.doc_no_date()} {#if doc.location} {doc.location}