2cc8c89944
- /settings/staff: staff account table with role badges + permission chips - Invite sheet: email + role template + 8 granular permission checkboxes - Edit permissions dialog with optimistic update - Revoke access with AlertDialog confirmation - React Query hooks wired (useStaffListQuery, mutations) - Full i18n (de/en), mock fallback, loading skeletons - Sidebar nav updated: Personal → /settings/staff with UserCog icon - Added @radix-ui/react-checkbox + Checkbox UI component
348 lines
13 KiB
JSON
348 lines
13 KiB
JSON
{
|
||
"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."
|
||
}
|
||
}
|