Files
cannamanage/cannamanage-frontend/messages/de.json
T
Patrick Plate 05933a08ca
Deploy to Production / test (push) Has been cancelled
Deploy to Production / deploy (push) Has been cancelled
feat(sprint-6): Phase 4 — Immutable audit log
- V8 migration: audit_events table (JSONB metadata, immutable by design)
- AuditEvent entity + AuditEventType enum (18 event types)
- AuditService: log events, paginated query, PDF export
- AuditController: GET /api/v1/audit (paginated, filtered), GET export
- AuditEventRepository with JPQL filtered queries
- Frontend: /audit-log page (read-only, filterable, timezone-aware)
- PDF export button for Behörde inspections
- Sidebar: 'Protokoll' under new Compliance section
- PdfReportGenerator: generateAuditReport method added
- 10-year retention, REVOKE DELETE documented
- Full i18n (de/en) with 18 event type translations
2026-06-12 22:40:40 +02:00

449 lines
17 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"common": {
"appName": "CannaManage",
"loading": "Laden...",
"save": "Speichern",
"cancel": "Abbrechen",
"delete": "Löschen",
"edit": "Bearbeiten",
"create": "Erstellen",
"search": "Suchen",
"filter": "Filtern",
"export": "Exportieren",
"back": "Zurück",
"next": "Weiter",
"confirm": "Bestätigen",
"yes": "Ja",
"no": "Nein",
"noData": "Keine Daten vorhanden"
},
"nav": {
"dashboard": "Dashboard",
"members": "Mitglieder",
"stock": "Bestand",
"distributions": "Ausgaben",
"compliance": "Compliance",
"reports": "Berichte",
"settings": "Einstellungen",
"staff": "Personal",
"portal": "Mitgliederportal"
},
"auth": {
"login": "Anmelden",
"logout": "Abmelden",
"email": "E-Mail-Adresse",
"password": "Passwort",
"forgotPassword": "Passwort vergessen?",
"resetPassword": "Passwort zurücksetzen",
"loginButton": "Anmelden",
"loggingIn": "Wird angemeldet...",
"loginSubtitle": "Melde dich bei deinem Anbauverein an",
"invalidCredentials": "Ungültige E-Mail-Adresse oder Passwort.",
"networkError": "Verbindungsfehler. Bitte versuche es erneut.",
"sessionExpired": "Deine Sitzung ist abgelaufen. Bitte melde dich erneut an.",
"emailInvalid": "Bitte gib eine gültige E-Mail-Adresse ein.",
"passwordRequired": "Bitte gib dein Passwort ein.",
"passwordTooShort": "Passwort muss mindestens 8 Zeichen lang sein.",
"footerText": "Sichere Verwaltung für deinen Cannabis-Anbauverein"
},
"dashboard": {
"title": "Dashboard",
"activeMembers": "Aktive Mitglieder",
"distributionsToday": "Ausgaben heute",
"stockLevel": "Lagerbestand",
"monthlyQuota": "Monatliches Kontingent",
"quickActions": "Schnellaktionen",
"newDistribution": "Neue Ausgabe",
"addMember": "Mitglied hinzufügen",
"recentDistributions": "Letzte Ausgaben",
"stockByStrain": "Bestand nach Sorte",
"date": "Datum",
"member": "Mitglied",
"strain": "Sorte",
"amount": "Menge (g)",
"staff": "Personal",
"grams": "g",
"today": "Heute",
"trend": "+{value}% ggü. Vormonat",
"quotaUsed": "{value}% verbraucht",
"distributionCount": "{count} Ausgaben, {grams}g"
},
"members": {
"title": "Mitgliederverwaltung",
"addMember": "Mitglied hinzufügen",
"name": "Name",
"email": "E-Mail",
"status": "Status",
"memberSince": "Mitglied seit",
"quota": "Kontingent",
"actions": "Aktionen",
"edit": "Bearbeiten",
"active": "Aktiv",
"suspended": "Gesperrt",
"expelled": "Ausgeschlossen",
"back": "Zurück zur Liste",
"save": "Speichern",
"create": "Mitglied anlegen",
"firstName": "Vorname",
"lastName": "Nachname",
"dateOfBirth": "Geburtsdatum",
"phone": "Telefon",
"memberNumber": "Mitgliedsnummer",
"joinedAt": "Beitrittsdatum",
"notes": "Notizen",
"notesPlaceholder": "Optionale Anmerkungen zum Mitglied...",
"under21Warning": "Unter 21 — reduziertes Kontingent (30g/Monat)",
"ageError": "Mitglieder müssen mindestens 18 Jahre alt sein.",
"saved": "Änderungen gespeichert.",
"created": "Mitglied erfolgreich angelegt.",
"search": "Name oder E-Mail suchen...",
"perPage": "Pro Seite",
"showing": "{from}{to} von {total}",
"previous": "Zurück",
"next": "Weiter",
"noResults": "Keine Mitglieder gefunden.",
"notFound": "Mitglied nicht gefunden.",
"personalInfo": "Persönliche Daten",
"membershipInfo": "Mitgliedschaft"
},
"stock": {
"title": "Lager & Chargen",
"newBatch": "Neue Charge",
"stockOverview": "Bestandsübersicht",
"batchId": "Chargen-ID",
"strain": "Sorte",
"thc": "THC %",
"cbd": "CBD %",
"status": "Status",
"available": "Verfügbar",
"availableGrams": "Verfügbar (g)",
"receivedAt": "Eingangsdatum",
"actions": "Aktionen",
"statusAvailable": "Verfügbar",
"statusRecalled": "Rückruf",
"statusDepleted": "Aufgebraucht",
"recall": "Rückruf",
"recallConfirm": "Charge wirklich zurückrufen? Alle offenen Ausgaben mit dieser Charge werden blockiert.",
"recallTitle": "Charge zurückrufen",
"recallSuccess": "Charge zurückgerufen.",
"totalBatches": "Chargen gesamt",
"availableStock": "Verfügbarer Bestand",
"recalledBatches": "Zurückgerufene Chargen",
"strainCount": "Sorten",
"filterAll": "Alle",
"filterAvailable": "Nur verfügbar",
"filterRecalled": "Nur Rückrufe",
"addBatch": "Charge anlegen",
"strainName": "Sortenname",
"amount": "Menge (g)",
"supplier": "Lieferant / Herkunft",
"harvestDate": "Erntedatum",
"notes": "Notizen",
"notesPlaceholder": "Optionale Bemerkungen zur Charge...",
"created": "Charge erfolgreich angelegt.",
"grams": "g",
"confirmRecall": "Rückruf bestätigen",
"lowStock": "Niedrig"
},
"distributions": {
"title": "Ausgaben",
"newDistribution": "Neue Ausgabe",
"todaySummary": "Heute: {count} Ausgaben, {grams}g verteilt",
"dateTime": "Datum/Uhrzeit",
"member": "Mitglied",
"strain": "Sorte",
"amount": "Menge (g)",
"staff": "Personal",
"status": "Status",
"completed": "Abgeschlossen",
"locked": "Gesperrt (unveränderbar)",
"filterToday": "Heute",
"filterWeek": "Diese Woche",
"filterMonth": "Diesen Monat",
"searchMember": "Mitglied suchen...",
"step1": "Mitglied auswählen",
"step2": "Kontingent prüfen",
"step3": "Sorte & Menge",
"step4": "Bestätigung",
"selectMember": "Mitglied suchen (Name oder Nummer)...",
"memberBlocked": "Mitglied ist gesperrt — keine Ausgabe möglich.",
"under21Info": "Reduziertes Kontingent: 30g/Monat (unter 21)",
"dailyRemaining": "Tagesrest",
"monthlyRemaining": "Monatsrest",
"selectBatch": "Charge auswählen",
"available": "verfügbar",
"amountLabel": "Menge in Gramm",
"exceedsDaily": "Überschreitet das Tageslimit ({limit}g).",
"exceedsMonthly": "Überschreitet das Monatslimit ({limit}g).",
"exceedsBatch": "Nicht genügend Bestand in dieser Charge.",
"confirm": "Ausgabe bestätigen",
"summary": "Zusammenfassung",
"success": "Ausgabe erfolgreich erfasst.",
"grams": "g",
"date": "Datum",
"monthlyQuota": "Monatsquote",
"remaining": "Verbleibend"
},
"reports": {
"title": "Berichte",
"monthly": "Monatsbericht",
"monthlyDesc": "Übersicht aller Ausgaben im gewählten Monat, inkl. Mitglieder-Kontingente und Lagerveränderungen.",
"memberList": "Mitgliederliste",
"memberListDesc": "Vollständige Mitgliederliste mit Status, Kontingent-Auslastung und Kontaktdaten.",
"recall": "Rückruf-Bericht",
"recallDesc": "Alle Chargen mit Rückruf-Status und betroffene Ausgaben für Behörden-Meldung.",
"downloadPdf": "Als PDF herunterladen",
"downloadCsv": "Als CSV herunterladen",
"preview": "Vorschau anzeigen",
"generating": "Bericht wird generiert...",
"downloaded": "{name} heruntergeladen.",
"selectMonth": "Monat wählen",
"selectStatus": "Status filtern",
"allStatuses": "Alle",
"activeOnly": "Aktiv",
"suspendedOnly": "Gesperrt",
"dateFrom": "Von",
"dateTo": "Bis",
"previewTitle": "Berichts-Vorschau",
"totalDistributions": "Ausgaben gesamt",
"totalGrams": "Gramm gesamt",
"uniqueMembers": "Verschiedene Mitglieder",
"averagePerMember": "Ø pro Mitglied",
"topStrains": "Top-Sorten",
"affectedDistributions": "Betroffene Ausgaben",
"affectedMembers": "Betroffene Mitglieder",
"recalledBatches": "Zurückgerufene Chargen",
"close": "Schließen",
"complianceNote": "Dieser Bericht ist für die Vorlage bei der zuständigen Behörde geeignet.",
"complianceBadge": "§19 KCanG konform",
"auditTrail": "Alle Berichte werden mit Zeitstempel generiert. Die zugrunde liegenden Ausgabe-Daten sind unveränderbar (Audit-Trail).",
"memberNumber": "Nr.",
"name": "Name",
"status": "Status",
"joinedAt": "Beitritt",
"usage": "Verbrauch",
"strain": "Sorte",
"grams": "Gramm",
"percent": "Anteil",
"batchId": "Chargen-ID",
"recalledAt": "Rückruf am",
"reason": "Grund",
"distributed": "Verteilt",
"original": "Original"
},
"portal": {
"title": "Mein Bereich",
"login": "Mitglieder-Login",
"loginSubtitle": "Melde dich im Mitgliederportal an",
"email": "E-Mail-Adresse",
"password": "Passwort",
"loginButton": "Anmelden",
"loggingIn": "Wird angemeldet...",
"invalidCredentials": "Ungültige E-Mail-Adresse oder Passwort.",
"networkError": "Verbindungsfehler. Bitte versuche es erneut.",
"welcome": "Willkommen zurück, {name}!",
"dashboard": "Übersicht",
"quota": "Mein Kontingent",
"history": "Ausgabe-Verlauf",
"profile": "Profil",
"settings": "Einstellungen",
"logout": "Abmelden",
"dailyQuota": "Tageskontingent",
"monthlyQuota": "Monatskontingent",
"remaining": "verbleibend",
"used": "verbraucht",
"of": "von",
"lastDistribution": "Letzte Ausgabe",
"noDistributions": "Noch keine Ausgaben in diesem Monat.",
"memberSince": "Mitglied seit",
"memberNumber": "Mitgliedsnummer",
"nextAvailable": "Nächste Verfügbarkeit",
"nextAvailableTomorrow": "Morgen ab 00:00 Uhr",
"changePassword": "Passwort ändern",
"currentPassword": "Aktuelles Passwort",
"newPassword": "Neues Passwort",
"confirmPassword": "Passwort bestätigen",
"passwordChanged": "Passwort erfolgreich geändert.",
"passwordMismatch": "Passwörter stimmen nicht überein.",
"club": "Mein Verein",
"quotaWarning": "Achtung: Du hast bereits {percent}% deines Monatskontingents verbraucht.",
"under21Notice": "Für Mitglieder unter 21: Reduziertes Kontingent von 30g/Monat (§19 Abs. 3 KCanG).",
"grams": "g",
"date": "Datum",
"strain": "Sorte",
"amount": "Menge",
"recordedBy": "Ausgegeben von",
"noHistory": "Noch keine Ausgaben vorhanden.",
"personalInfo": "Persönliche Daten",
"language": "Sprache",
"theme": "Design",
"themeLight": "Hell",
"themeDark": "Dunkel",
"themeSystem": "System",
"german": "Deutsch",
"english": "Englisch",
"quickInfo": "Kurzinfo",
"todayAvailable": "Heute noch verfügbar",
"monthAvailable": "Diesen Monat noch verfügbar",
"limitReached": "Limit erreicht",
"pagination": "{from}{to} von {total}",
"previous": "Zurück",
"next": "Weiter",
"allMonths": "Alle Monate",
"footerText": "Cannabis-Anbauverein — Sichere Mitgliederverwaltung",
"adminLogin": "Zum Admin-Login"
},
"staff": {
"title": "Personal",
"invite": "Neues Mitglied einladen",
"name": "Name",
"email": "E-Mail",
"role": "Rolle",
"permissions": "Berechtigungen",
"status": "Status",
"actions": "Aktionen",
"active": "Aktiv",
"revoked": "Widerrufen",
"invited": "Eingeladen",
"editPermissions": "Berechtigungen bearbeiten",
"revokeAccess": "Zugang widerrufen",
"revokeConfirm": "Zugang für {name} wirklich widerrufen? Der Mitarbeiter kann sich nicht mehr anmelden.",
"revokeSuccess": "Zugang widerrufen.",
"inviteTitle": "Mitarbeiter einladen",
"inviteDesc": "Neues Teammitglied per E-Mail einladen und Berechtigungen zuweisen.",
"inviteEmail": "E-Mail-Adresse",
"inviteRole": "Rollenvorlage",
"roleAusgabe": "Ausgabe",
"roleLager": "Lager",
"roleVorstand": "Vorstand",
"roleCustom": "Benutzerdefiniert",
"inviteSend": "Einladung senden",
"inviteSuccess": "Einladung an {email} gesendet.",
"permRecordDistribution": "Ausgabe erfassen",
"permViewMemberList": "Mitgliederliste einsehen",
"permViewMemberQuota": "Kontingent einsehen",
"permAddMember": "Mitglieder anlegen",
"permViewStock": "Lager einsehen",
"permRecordStockIn": "Wareneingang",
"permViewComplianceReport": "Berichte einsehen",
"permManageGrowCalendar": "Anbaukalender verwalten",
"savePermissions": "Speichern",
"permissionsSaved": "Berechtigungen aktualisiert.",
"cancel": "Abbrechen",
"noStaff": "Noch keine Mitarbeiter vorhanden."
},
"api": {
"loading": "Wird geladen...",
"error": "Fehler beim Laden der Daten.",
"retry": "Erneut versuchen",
"offline": "Keine Verbindung zum Server — Daten könnten veraltet sein.",
"networkError": "Netzwerkfehler. Bitte prüfe deine Verbindung.",
"unauthorized": "Sitzung abgelaufen. Bitte erneut anmelden.",
"forbidden": "Keine Berechtigung für diese Aktion.",
"notFound": "Ressource nicht gefunden.",
"quotaExceeded": "Kontingent überschritten.",
"serverError": "Serverfehler. Bitte versuche es später erneut."
},
"consent": {
"title": "Datenschutz-Einwilligung",
"dataProcessing": "Datenverarbeitung",
"dataProcessingDesc": "Ich willige ein, dass meine personenbezogenen Daten (Name, E-Mail, Geburtsdatum, Ausgabe-Historie) zum Zweck der Vereinsverwaltung verarbeitet werden. Rechtsgrundlage: Art. 6 Abs. 1 lit. a DSGVO.",
"marketing": "Marketing-Benachrichtigungen",
"marketingDesc": "Ich möchte über neue Funktionen und Angebote informiert werden.",
"accept": "Ich stimme zu",
"reject": "Ablehnen und Konto löschen",
"required": "Erforderlich",
"revoke": "Einwilligung widerrufen",
"revokeWarning": "Ohne Einwilligung zur Datenverarbeitung kann der Dienst nicht genutzt werden.",
"granted": "Erteilt am",
"revoked": "Widerrufen"
},
"dsgvo": {
"title": "Datenschutz",
"export": "Meine Daten exportieren",
"exportDesc": "Laden Sie alle über Sie gespeicherten Daten als JSON-Datei herunter (Art. 15 DSGVO).",
"exportButton": "Daten herunterladen",
"exporting": "Daten werden zusammengestellt...",
"exported": "Datenexport heruntergeladen.",
"delete": "Konto und Daten löschen",
"deleteDesc": "Alle personenbezogenen Daten werden unwiderruflich gelöscht oder anonymisiert (Art. 17 DSGVO). Ausgabe-Daten bleiben anonymisiert erhalten (gesetzliche Aufbewahrungspflicht).",
"deleteButton": "Konto endgültig löschen",
"deleteConfirm": "Bist du sicher? Diese Aktion kann nicht rückgängig gemacht werden.",
"deleteSuccess": "Dein Konto wurde gelöscht. Du wirst jetzt abgemeldet."
},
"billing": {
"title": "Plan & Abrechnung",
"currentPlan": "Aktueller Plan",
"trial": "Testphase",
"starter": "Starter",
"pro": "Pro",
"enterprise": "Enterprise",
"trialEnds": "Testphase endet am {date}",
"trialExpired": "Deine Testphase ist abgelaufen. Wähle einen Plan, um fortzufahren.",
"trialDaysLeft": "{days} Tage verbleibend",
"memberLimit": "Mitglieder-Limit",
"membersUsed": "{used} / {limit} Mitglieder",
"price": "{price}/Monat",
"nextBilling": "Nächste Abrechnung",
"upgrade": "Plan upgraden",
"manageBilling": "Zahlungsdetails verwalten",
"invoices": "Rechnungen",
"noInvoices": "Noch keine Rechnungen.",
"starterDesc": "Für kleine Vereine bis 30 Mitglieder",
"proDesc": "Für wachsende Vereine bis 100 Mitglieder",
"enterpriseDesc": "Für große Vereine — unbegrenzte Mitglieder",
"starterPrice": "€19",
"proPrice": "€49",
"enterprisePrice": "Auf Anfrage",
"selectPlan": "Plan wählen",
"active": "Aktiv",
"pastDue": "Zahlung ausstehend",
"canceled": "Gekündigt"
},
"audit": {
"title": "Audit-Protokoll",
"subtitle": "Unveränderliches Protokoll aller Vorgänge (10 Jahre Aufbewahrung)",
"timestamp": "Zeitstempel",
"type": "Typ",
"description": "Beschreibung",
"actor": "Akteur",
"entity": "Objekt",
"filterType": "Ereignistyp filtern",
"filterDateFrom": "Von",
"filterDateTo": "Bis",
"filterActor": "Akteur suchen",
"exportPdf": "Als PDF exportieren",
"exporting": "PDF wird generiert...",
"exported": "Audit-Protokoll exportiert.",
"allTypes": "Alle Typen",
"immutable": "Unveränderbar",
"timezone": "Europe/Berlin",
"retentionNote": "Aufbewahrungsfrist: 10 Jahre (KCanG-konform)",
"types": {
"DISTRIBUTION_RECORDED": "Ausgabe erfasst",
"DISTRIBUTION_VOIDED": "Ausgabe storniert",
"MEMBER_CREATED": "Mitglied angelegt",
"MEMBER_UPDATED": "Mitglied aktualisiert",
"MEMBER_SUSPENDED": "Mitglied gesperrt",
"MEMBER_EXPELLED": "Mitglied ausgeschlossen",
"BATCH_CREATED": "Charge angelegt",
"BATCH_RECALLED": "Charge zurückgerufen",
"LOGIN_SUCCESS": "Anmeldung",
"LOGIN_FAILED": "Fehlgeschlagene Anmeldung",
"LOGOUT": "Abmeldung",
"PASSWORD_CHANGED": "Passwort geändert",
"STAFF_INVITED": "Mitarbeiter eingeladen",
"STAFF_PERMISSIONS_CHANGED": "Berechtigungen geändert",
"STAFF_REVOKED": "Zugang entzogen",
"CONSENT_GRANTED": "Einwilligung erteilt",
"CONSENT_REVOKED": "Einwilligung widerrufen",
"DATA_EXPORTED": "Daten exportiert",
"DATA_DELETED": "Daten gelöscht",
"SUBSCRIPTION_STARTED": "Abo gestartet",
"SUBSCRIPTION_CANCELED": "Abo gekündigt",
"PAYMENT_RECEIVED": "Zahlung erhalten",
"PAYMENT_FAILED": "Zahlung fehlgeschlagen"
}
}
}