added some missing translations

This commit is contained in:
Gamosoft 2025-12-15 15:45:10 +01:00
parent 6ffd474752
commit 849ff88134
8 changed files with 66 additions and 24 deletions

View File

@ -80,8 +80,9 @@ if 'AUTHENTICATION_SECRET_KEY' in os.environ:
# Initialize app
app = FastAPI(
title=config['app']['name'],
description=config['app']['tagline'],
version=config['app']['version']
version=config['app']['version'],
docs_url=None, # Disable Swagger UI at /docs
redoc_url=None # Disable ReDoc at /redoc
)
# CORS middleware configuration
@ -325,8 +326,7 @@ async def api_documentation():
return {
"app": {
"name": config['app']['name'],
"version": config['app']['version'],
"description": config['app']['tagline']
"version": config['app']['version']
},
"endpoints": [
{
@ -339,7 +339,7 @@ async def api_documentation():
"method": "GET",
"path": "/api/config",
"description": "Get application configuration",
"response": "{ name, tagline, version, searchEnabled }"
"response": "{ name, version, searchEnabled }"
},
{
"method": "GET",
@ -489,7 +489,6 @@ async def get_config():
"""Get app configuration for frontend"""
return {
"name": config['app']['name'],
"tagline": config['app']['tagline'],
"version": config['app']['version'],
"searchEnabled": config['search']['enabled'],
"demoMode": DEMO_MODE, # Expose demo mode flag to frontend

View File

@ -3,7 +3,7 @@
app:
name: "NoteDiscovery"
tagline: "Your Self-Hosted Knowledge Base"
# Tagline is now localized - see locales/*.json files (app.tagline key)
server:
host: "0.0.0.0"
@ -28,7 +28,7 @@ search:
authentication:
# Authentication settings
# Set enabled to true to require login
enabled: false
enabled: true
# ⚠️ SECURITY WARNING: Change these values before exposing to the internet!
# Default values below are for LOCAL TESTING ONLY

View File

@ -36,7 +36,6 @@ function noteApp() {
return {
// App state
appName: 'NoteDiscovery',
appTagline: 'Your Self-Hosted Knowledge Base',
appVersion: '0.0.0',
authEnabled: false,
notes: [],
@ -568,7 +567,6 @@ function noteApp() {
const response = await fetch('/api/config');
const config = await response.json();
this.appName = config.name;
this.appTagline = config.tagline;
this.appVersion = config.version || '0.0.0';
this.authEnabled = config.authentication?.enabled || false;
} catch (error) {
@ -1441,7 +1439,7 @@ function noteApp() {
</button>
<span class="flex items-center gap-1 flex-1" style="overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 500; pointer-events: none;">
<span>${folder.name}</span>
${folder.notes.length === 0 && (!folder.children || Object.keys(folder.children).length === 0) ? '<span class="text-xs" style="color: var(--text-tertiary); font-weight: 400;">(empty)</span>' : ''}
${folder.notes.length === 0 && (!folder.children || Object.keys(folder.children).length === 0) ? `<span class="text-xs" style="color: var(--text-tertiary); font-weight: 400;">(${this.t('folders.empty')})</span>` : ''}
</span>
</div>
<div class="hover-buttons flex gap-1 transition-opacity absolute right-2 top-1/2 transform -translate-y-1/2" style="opacity: 0; pointer-events: none; background: linear-gradient(to right, transparent, var(--bg-hover) 20%, var(--bg-hover)); padding-left: 20px;" onclick="event.stopPropagation()">

View File

@ -1394,7 +1394,8 @@
<!-- Empty state -->
<template x-if="notes.length === 0 && allFolders.length === 0">
<div class="px-3 py-4 text-sm text-center" style="color: var(--text-tertiary);">
No notes or folders yet.<br>Create your first note or folder!
<span x-text="t('sidebar.no_notes_yet')"></span><br>
<span x-text="t('sidebar.create_first')"></span>
</div>
</template>
</div>
@ -1763,7 +1764,7 @@
<!-- Header -->
<div class="mb-6">
<h1 class="text-3xl font-bold mb-2" style="color: var(--text-primary);" x-text="appName"></h1>
<p class="text-lg" style="color: var(--text-secondary);" x-text="appTagline"></p>
<p class="text-lg" style="color: var(--text-secondary);" x-text="t('app.tagline')"></p>
<!-- Demo Mode Warning Banner -->
<div x-data="{ showDemoBanner: false }" x-init="fetch('/api/config').then(r => r.json()).then(d => showDemoBanner = d.demoMode || false)" x-show="showDemoBanner" class="mt-4 flex items-center px-4 py-2.5 text-sm rounded-lg" style="background: linear-gradient(135deg, #ff6b6b 0%, #ff8e53 100%); color: white; font-weight: 500;">
<svg class="w-5 h-5 mr-2 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
@ -1800,11 +1801,11 @@
<div class="flex flex-wrap items-center gap-4 text-sm" style="color: var(--text-secondary);">
<span class="font-semibold" style="color: var(--text-primary);">
<span x-text="homepageNotes().length"></span>
<span x-text="homepageNotes().length === 1 ? 'note' : 'notes'"></span>
<span x-text="homepageNotes().length === 1 ? t('homepage.note_singular') : t('homepage.note_plural')"></span>
</span>
<span x-show="homepageFolders().length > 0">
<span x-text="homepageFolders().length"></span>
<span x-text="homepageFolders().length === 1 ? 'folder' : 'folders'"></span>
<span x-text="homepageFolders().length === 1 ? t('homepage.folder_singular') : t('homepage.folder_plural')"></span>
</span>
<button
@click="dropdownTargetFolder = selectedHomepageFolder; toggleNewDropdown($event)"
@ -1875,7 +1876,7 @@
<!-- Folder Metadata -->
<div class="flex items-center justify-between text-xs mt-auto pt-2" style="color: var(--text-tertiary);">
<span x-text="folder.noteCount + ' ' + (folder.noteCount === 1 ? 'note' : 'notes')"></span>
<span x-text="folder.noteCount + ' ' + (folder.noteCount === 1 ? t('homepage.note_singular') : t('homepage.note_plural'))"></span>
<svg class="w-4 h-4" style="color: var(--accent-primary);" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"></path>
</svg>

View File

@ -5,6 +5,10 @@
"flag": "🇩🇪"
},
"app": {
"tagline": "Deine Selbstgehostete Wissensdatenbank"
},
"common": {
"save": "Speichern",
"cancel": "Abbrechen",
@ -37,6 +41,8 @@
"drag_hint": "💡 Ziehen=Verschieben",
"root_folder": "📂 Hauptordner",
"no_notes": "Noch keine Notizen. Erstelle deine erste Notiz!",
"no_notes_yet": "Noch keine Notizen oder Ordner.",
"create_first": "Erstelle deine erste Notiz oder Ordner!",
"no_favorites": "Noch keine Favoriten",
"no_results": "Keine Ergebnisse gefunden",
"expand_all": "Alle Ordner aufklappen",
@ -86,7 +92,8 @@
"prompt_name_with_path": "Neuen Ordner erstellen.\nOrdnerpfad eingeben (z.B. \"Projekte\" oder \"Arbeit/2025\"):",
"prompt_rename": "Ordner \"{{name}}\" umbenennen zu:",
"invalid_name": "Ungültiger Ordnername.",
"cannot_move_into_self": "Ordner kann nicht in sich selbst oder einen Unterordner verschoben werden."
"cannot_move_into_self": "Ordner kann nicht in sich selbst oder einen Unterordner verschoben werden.",
"empty": "leer"
},
"toolbar": {
@ -178,7 +185,11 @@
"get_started": "Erstelle etwas, um loszulegen",
"no_notes_title": "Noch keine Notizen",
"no_notes_desc": "Erstelle deine erste Notiz oder Ordner",
"folder_empty": "Dieser Ordner ist leer"
"folder_empty": "Dieser Ordner ist leer",
"note_singular": "Notiz",
"note_plural": "Notizen",
"folder_singular": "Ordner",
"folder_plural": "Ordner"
}
}

View File

@ -5,6 +5,10 @@
"flag": "🇺🇸"
},
"app": {
"tagline": "Your Self-Hosted Knowledge Base"
},
"common": {
"save": "Save",
"cancel": "Cancel",
@ -37,6 +41,8 @@
"drag_hint": "💡 Drag=Move",
"root_folder": "📂 Root folder",
"no_notes": "No notes yet. Create your first note!",
"no_notes_yet": "No notes or folders yet.",
"create_first": "Create your first note or folder!",
"no_favorites": "No favorites yet",
"no_results": "No results found",
"expand_all": "Expand all folders",
@ -86,7 +92,8 @@
"prompt_name_with_path": "Create new folder.\nEnter folder path (e.g., \"Projects\" or \"Work/2025\"):",
"prompt_rename": "Rename folder \"{{name}}\" to:",
"invalid_name": "Invalid folder name.",
"cannot_move_into_self": "Cannot move folder into itself or its subfolder."
"cannot_move_into_self": "Cannot move folder into itself or its subfolder.",
"empty": "empty"
},
"toolbar": {
@ -178,7 +185,11 @@
"get_started": "Create something to get started",
"no_notes_title": "No notes yet",
"no_notes_desc": "Create your first note or folder",
"folder_empty": "This folder is empty"
"folder_empty": "This folder is empty",
"note_singular": "note",
"note_plural": "notes",
"folder_singular": "folder",
"folder_plural": "folders"
}
}

View File

@ -5,6 +5,10 @@
"flag": "🇪🇸"
},
"app": {
"tagline": "Tu Base de Conocimientos Autoalojada"
},
"common": {
"save": "Guardar",
"cancel": "Cancelar",
@ -37,6 +41,8 @@
"drag_hint": "💡 Arrastrar=Mover",
"root_folder": "📂 Carpeta raíz",
"no_notes": "Aún no hay notas. ¡Crea tu primera nota!",
"no_notes_yet": "Aún no hay notas ni carpetas.",
"create_first": "¡Crea tu primera nota o carpeta!",
"no_favorites": "Aún no hay favoritos",
"no_results": "No se encontraron resultados",
"expand_all": "Expandir todas las carpetas",
@ -86,7 +92,8 @@
"prompt_name_with_path": "Crear nueva carpeta.\nIntroduce la ruta de la carpeta (ej., \"Proyectos\" o \"Trabajo/2025\"):",
"prompt_rename": "Renombrar carpeta \"{{name}}\" a:",
"invalid_name": "Nombre de carpeta inválido.",
"cannot_move_into_self": "No se puede mover una carpeta dentro de sí misma o de una subcarpeta."
"cannot_move_into_self": "No se puede mover una carpeta dentro de sí misma o de una subcarpeta.",
"empty": "vacía"
},
"toolbar": {
@ -178,7 +185,11 @@
"get_started": "Crea algo para empezar",
"no_notes_title": "Aún no hay notas",
"no_notes_desc": "Crea tu primera nota o carpeta",
"folder_empty": "Esta carpeta está vacía"
"folder_empty": "Esta carpeta está vacía",
"note_singular": "nota",
"note_plural": "notas",
"folder_singular": "carpeta",
"folder_plural": "carpetas"
}
}

View File

@ -5,6 +5,10 @@
"flag": "🇫🇷"
},
"app": {
"tagline": "Votre Base de Connaissances Auto-Hébergée"
},
"common": {
"save": "Enregistrer",
"cancel": "Annuler",
@ -37,6 +41,8 @@
"drag_hint": "💡 Glisser=Déplacer",
"root_folder": "📂 Dossier racine",
"no_notes": "Pas encore de notes. Créez votre première note !",
"no_notes_yet": "Pas encore de notes ni de dossiers.",
"create_first": "Créez votre première note ou dossier !",
"no_favorites": "Pas encore de favoris",
"no_results": "Aucun résultat trouvé",
"expand_all": "Développer tous les dossiers",
@ -86,7 +92,8 @@
"prompt_name_with_path": "Créer un nouveau dossier.\nEntrez le chemin du dossier (ex. \"Projets\" ou \"Travail/2025\") :",
"prompt_rename": "Renommer le dossier \"{{name}}\" en :",
"invalid_name": "Nom de dossier invalide.",
"cannot_move_into_self": "Impossible de déplacer un dossier dans lui-même ou dans un sous-dossier."
"cannot_move_into_self": "Impossible de déplacer un dossier dans lui-même ou dans un sous-dossier.",
"empty": "vide"
},
"toolbar": {
@ -178,7 +185,11 @@
"get_started": "Créez quelque chose pour commencer",
"no_notes_title": "Pas encore de notes",
"no_notes_desc": "Créez votre première note ou dossier",
"folder_empty": "Ce dossier est vide"
"folder_empty": "Ce dossier est vide",
"note_singular": "note",
"note_plural": "notes",
"folder_singular": "dossier",
"folder_plural": "dossiers"
}
}