feat: add shared overview and harden frontend session state (#407)

This commit is contained in:
Daniel Volz
2026-03-10 06:26:03 +01:00
committed by GitHub
parent 733fe2f38a
commit 105eb7bc0d
37 changed files with 3281 additions and 1138 deletions
+48 -1
View File
@@ -292,6 +292,18 @@
"title": "Sprache",
"select": "Sprache auswählen"
},
"apiKey": {
"title": "API-Zugriff",
"generateTitle": "API-Key erzeugen",
"generateDesc": "Erstellt einen neuen API-Key mit Schreibrechten. Der vorherige Key wird automatisch ungültig.",
"generateButton": "Key erzeugen",
"generating": "Wird erzeugt...",
"currentToken": "Neuer API-Key",
"copyButton": "Kopieren",
"copied": "Kopiert",
"copyHint": "Diesen Key jetzt kopieren. Er wird nur einmal angezeigt und kann später nicht erneut abgerufen werden.",
"generateError": "API-Key konnte nicht erzeugt werden"
},
"notifications": {
"title": "Benachrichtigungen",
"channels": "Kanäle",
@@ -312,7 +324,11 @@
},
"email": {
"recipient": "Empfänger",
"notConfigured": "Nicht konfiguriert"
"notConfigured": "Nicht konfiguriert",
"serverNotConfigured": "E-Mail-Benachrichtigungen bleiben deaktiviert, bis SMTP im Backend konfiguriert ist.",
"loadErrorAuth": "Die E-Mail-Einstellungen konnten nicht geladen werden, weil deine Sitzung nicht mehr gültig ist. Bitte melde dich erneut an.",
"loadErrorForbidden": "Die E-Mail-Einstellungen konnten nicht geladen werden, weil diese Sitzung sie nicht lesen darf.",
"loadErrorGeneric": "Die Verfügbarkeit von E-Mail konnte nicht geprüft werden, weil das Laden der Einstellungen fehlgeschlagen ist."
},
"push": {
"url": "URL",
@@ -541,7 +557,10 @@
"generating": "Wird generiert...",
"generateAnother": "Weiteren Link generieren",
"linkGenerated": "Teilen-Link erstellt!",
"scheduleLink": "Zeitplan-Link",
"overviewLink": "Übersichts-Link",
"copyLink": "Link kopieren",
"copyOverviewLink": "Übersichts-Link kopieren",
"copied": "In Zwischenablage kopiert!",
"noPeople": "Keine Medikamente mit 'Eingenommen von' zugewiesen. Füge zuerst eine Person zu einem Medikament hinzu.",
"scheduleFor": "Zeitplan für",
@@ -557,6 +576,34 @@
"expiredOn": "Abgelaufen am: {{date}}"
}
},
"sharedOverview": {
"title": "Medikamentenübersicht für {{person}}",
"sharedBy": "Geteilt von {{user}}",
"expiredOn": "Abgelaufen am: {{date}}",
"noMedications": "Für diesen Teilen-Link sind keine Medikamente verfügbar.",
"columns": {
"name": "Name",
"package": "Packung",
"stock": "Bestand",
"daysLeft": "Tage übrig",
"nextIntake": "Nächste Einnahme",
"depletion": "Aufgebraucht",
"priority": "Priorität"
},
"priority": {
"normal": "Normal",
"high": "Hoch"
},
"stock": {
"of": "{{current}} von {{capacity}}"
},
"error": {
"notFound": "Teilen-Link nicht gefunden",
"expired": "Dieser geteilte Übersichts-Link ist abgelaufen",
"rateLimit": "Zu viele Anfragen. Bitte versuche es in einem Moment erneut.",
"generic": "Die Medikamentenübersicht konnte nicht geladen werden"
}
},
"exportImport": {
"title": "Datenexport / -import",
"description": "Sichere deine Daten oder übertrage sie auf ein anderes Gerät.",
+48 -1
View File
@@ -292,6 +292,18 @@
"title": "Language",
"select": "Select language"
},
"apiKey": {
"title": "API Access",
"generateTitle": "Generate API key",
"generateDesc": "Creates a new write-capable API key. The previous key becomes invalid automatically.",
"generateButton": "Generate key",
"generating": "Generating...",
"currentToken": "New API key",
"copyButton": "Copy",
"copied": "Copied",
"copyHint": "Copy this key now. It is shown only once and cannot be retrieved later.",
"generateError": "Failed to generate API key"
},
"notifications": {
"title": "Notifications",
"channels": "Channels",
@@ -312,7 +324,11 @@
},
"email": {
"recipient": "Recipient",
"notConfigured": "Not configured"
"notConfigured": "Not configured",
"serverNotConfigured": "Email notifications stay unavailable until SMTP is configured on the backend.",
"loadErrorAuth": "Email settings could not be loaded because your session is no longer valid. Please sign in again.",
"loadErrorForbidden": "Email settings could not be loaded because this session is not allowed to read them.",
"loadErrorGeneric": "Email availability could not be verified because loading settings failed."
},
"push": {
"url": "URL",
@@ -541,7 +557,10 @@
"generating": "Generating...",
"generateAnother": "Generate another link",
"linkGenerated": "Share link generated!",
"scheduleLink": "Schedule link",
"overviewLink": "Overview link",
"copyLink": "Copy Link",
"copyOverviewLink": "Copy Overview Link",
"copied": "Copied to clipboard!",
"noPeople": "No medications with 'Taken by' assigned. Add a person to a medication first.",
"scheduleFor": "Schedule for",
@@ -557,6 +576,34 @@
"expiredOn": "Expired on: {{date}}"
}
},
"sharedOverview": {
"title": "Medication Overview for {{person}}",
"sharedBy": "Shared by {{user}}",
"expiredOn": "Expired on: {{date}}",
"noMedications": "No medications available for this share link.",
"columns": {
"name": "Name",
"package": "Package",
"stock": "Stock",
"daysLeft": "Days left",
"nextIntake": "Next intake",
"depletion": "Depletion",
"priority": "Priority"
},
"priority": {
"normal": "Normal",
"high": "High"
},
"stock": {
"of": "{{current}} of {{capacity}}"
},
"error": {
"notFound": "Share link not found",
"expired": "This shared overview link has expired",
"rateLimit": "Too many requests. Please try again in a moment.",
"generic": "Failed to load medication overview"
}
},
"exportImport": {
"title": "Data Export / Import",
"description": "Backup your data or transfer it to another device.",