From 2bbcbe21f0766f145f4394279c893635221c97c4 Mon Sep 17 00:00:00 2001 From: Gamosoft Date: Mon, 15 Dec 2025 18:18:06 +0100 Subject: [PATCH] localize login page --- backend/main.py | 16 ++++-------- frontend/login.html | 64 ++++++++++++++++++++++++++++++++++++++++----- locales/de-DE.json | 9 +++++++ locales/en-US.json | 9 +++++++ locales/es-ES.json | 9 +++++++ locales/fr-FR.json | 9 +++++++ 6 files changed, 99 insertions(+), 17 deletions(-) diff --git a/backend/main.py b/backend/main.py index a7740a2..fe27243 100644 --- a/backend/main.py +++ b/backend/main.py @@ -97,7 +97,8 @@ app.add_middleware( ) print(f"🌐 CORS allowed origins: {allowed_origins}") -# ============================================================================ +# =========================================================== +# ================= # Security Helpers # ============================================================================ @@ -253,14 +254,7 @@ async def login_page(request: Request, error: str = None): async with aiofiles.open(login_path, 'r', encoding='utf-8') as f: content = await f.read() - # Inject error message if present - if error: - content = content.replace('', 'class="error"') - content = content.replace('', - f'
{error}
') - else: - content = content.replace('', '') - content = content.replace('', '') + # No server-side manipulation needed - frontend handles error display via URL params return content @@ -281,8 +275,8 @@ async def login(request: Request, password: str = Form(...)): request.session['authenticated'] = True return RedirectResponse(url="/", status_code=303) else: - # Redirect back to login with error message - return RedirectResponse(url="/login?error=Incorrect+password.+Please+try+again.", status_code=303) + # Redirect back to login with error code (frontend will translate) + return RedirectResponse(url="/login?error=incorrect_password", status_code=303) @app.get("/logout") diff --git a/frontend/login.html b/frontend/login.html index 2b7cf9a..6ae4e0c 100644 --- a/frontend/login.html +++ b/frontend/login.html @@ -6,6 +6,40 @@ Login - NoteDiscovery + + + diff --git a/locales/de-DE.json b/locales/de-DE.json index ae01308..650ce25 100644 --- a/locales/de-DE.json +++ b/locales/de-DE.json @@ -147,6 +147,15 @@ "failed": "HTML-Export fehlgeschlagen: {{error}}" }, + "login": { + "title": "Anmelden", + "tagline": "Deine Selbstgehostete Wissensdatenbank", + "password_placeholder": "Passwort eingeben", + "unlock_button": "🔓 Entsperren", + "footer": "🔒 Sicher & Selbstgehostet", + "error_incorrect_password": "Falsches Passwort. Bitte versuche es erneut." + }, + "images": { "confirm_delete": "Bild \"{{name}}\" löschen?", "upload_failed": "Bild-Upload fehlgeschlagen", diff --git a/locales/en-US.json b/locales/en-US.json index 8b5847d..a68d47b 100644 --- a/locales/en-US.json +++ b/locales/en-US.json @@ -147,6 +147,15 @@ "failed": "Failed to export HTML: {{error}}" }, + "login": { + "title": "Login", + "tagline": "Your Self-Hosted Knowledge Base", + "password_placeholder": "Enter your password", + "unlock_button": "🔓 Unlock", + "footer": "🔒 Secure & Self-Hosted", + "error_incorrect_password": "Incorrect password. Please try again." + }, + "images": { "confirm_delete": "Delete image \"{{name}}\"?", "upload_failed": "Failed to upload image", diff --git a/locales/es-ES.json b/locales/es-ES.json index 6038fb2..2d632fb 100644 --- a/locales/es-ES.json +++ b/locales/es-ES.json @@ -147,6 +147,15 @@ "failed": "Error al exportar HTML: {{error}}" }, + "login": { + "title": "Iniciar sesión", + "tagline": "Tu Base de Conocimientos Autoalojada", + "password_placeholder": "Introduce tu contraseña", + "unlock_button": "🔓 Desbloquear", + "footer": "🔒 Seguro y Autoalojado", + "error_incorrect_password": "Contraseña incorrecta. Por favor, inténtalo de nuevo." + }, + "images": { "confirm_delete": "¿Eliminar imagen \"{{name}}\"?", "upload_failed": "Error al subir imagen", diff --git a/locales/fr-FR.json b/locales/fr-FR.json index 0fe7095..8fb8821 100644 --- a/locales/fr-FR.json +++ b/locales/fr-FR.json @@ -147,6 +147,15 @@ "failed": "Échec de l'export HTML : {{error}}" }, + "login": { + "title": "Connexion", + "tagline": "Votre Base de Connaissances Auto-Hébergée", + "password_placeholder": "Entrez votre mot de passe", + "unlock_button": "🔓 Déverrouiller", + "footer": "🔒 Sécurisé et Auto-Hébergé", + "error_incorrect_password": "Mot de passe incorrect. Veuillez réessayer." + }, + "images": { "confirm_delete": "Supprimer l'image \"{{name}}\" ?", "upload_failed": "Échec du téléchargement de l'image",