Files
cannamanage/cannamanage-frontend/messages/en.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
16 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": "Loading...",
"save": "Save",
"cancel": "Cancel",
"delete": "Delete",
"edit": "Edit",
"create": "Create",
"search": "Search",
"filter": "Filter",
"export": "Export",
"back": "Back",
"next": "Next",
"confirm": "Confirm",
"yes": "Yes",
"no": "No",
"noData": "No data available"
},
"nav": {
"dashboard": "Dashboard",
"members": "Members",
"stock": "Stock",
"distributions": "Distributions",
"compliance": "Compliance",
"reports": "Reports",
"settings": "Settings",
"staff": "Staff",
"portal": "Member Portal"
},
"auth": {
"login": "Sign In",
"logout": "Sign Out",
"email": "Email address",
"password": "Password",
"forgotPassword": "Forgot password?",
"resetPassword": "Reset Password",
"loginButton": "Sign In",
"loggingIn": "Signing in...",
"loginSubtitle": "Sign in to your cannabis club",
"invalidCredentials": "Invalid email address or password.",
"networkError": "Connection error. Please try again.",
"sessionExpired": "Your session has expired. Please sign in again.",
"emailInvalid": "Please enter a valid email address.",
"passwordRequired": "Please enter your password.",
"passwordTooShort": "Password must be at least 8 characters.",
"footerText": "Secure management for your cannabis cultivation club"
},
"dashboard": {
"title": "Dashboard",
"activeMembers": "Active Members",
"distributionsToday": "Distributions Today",
"stockLevel": "Stock Level",
"monthlyQuota": "Monthly Quota",
"quickActions": "Quick Actions",
"newDistribution": "New Distribution",
"addMember": "Add Member",
"recentDistributions": "Recent Distributions",
"stockByStrain": "Stock by Strain",
"date": "Date",
"member": "Member",
"strain": "Strain",
"amount": "Amount (g)",
"staff": "Staff",
"grams": "g",
"today": "Today",
"trend": "+{value}% vs last month",
"quotaUsed": "{value}% used",
"distributionCount": "{count} distributions, {grams}g"
},
"members": {
"title": "Member Management",
"addMember": "Add Member",
"name": "Name",
"email": "Email",
"status": "Status",
"memberSince": "Member Since",
"quota": "Quota",
"actions": "Actions",
"edit": "Edit",
"active": "Active",
"suspended": "Suspended",
"expelled": "Expelled",
"back": "Back to List",
"save": "Save",
"create": "Create Member",
"firstName": "First Name",
"lastName": "Last Name",
"dateOfBirth": "Date of Birth",
"phone": "Phone",
"memberNumber": "Member Number",
"joinedAt": "Joined At",
"notes": "Notes",
"notesPlaceholder": "Optional notes about the member...",
"under21Warning": "Under 21 — reduced quota (30g/month)",
"ageError": "Members must be at least 18 years old.",
"saved": "Changes saved.",
"created": "Member created successfully.",
"search": "Search name or email...",
"perPage": "Per page",
"showing": "{from}{to} of {total}",
"previous": "Previous",
"next": "Next",
"noResults": "No members found.",
"notFound": "Member not found.",
"personalInfo": "Personal Information",
"membershipInfo": "Membership"
},
"stock": {
"title": "Stock & Batches",
"newBatch": "New Batch",
"stockOverview": "Stock Overview",
"batchId": "Batch ID",
"strain": "Strain",
"thc": "THC %",
"cbd": "CBD %",
"status": "Status",
"available": "Available",
"availableGrams": "Available (g)",
"receivedAt": "Received",
"actions": "Actions",
"statusAvailable": "Available",
"statusRecalled": "Recalled",
"statusDepleted": "Depleted",
"recall": "Recall",
"recallConfirm": "Really recall this batch? All open distributions with this batch will be blocked.",
"recallTitle": "Recall Batch",
"recallSuccess": "Batch recalled.",
"totalBatches": "Total Batches",
"availableStock": "Available Stock",
"recalledBatches": "Recalled Batches",
"strainCount": "Strains",
"filterAll": "All",
"filterAvailable": "Available only",
"filterRecalled": "Recalled only",
"addBatch": "Add Batch",
"strainName": "Strain Name",
"amount": "Amount (g)",
"supplier": "Supplier / Origin",
"harvestDate": "Harvest Date",
"notes": "Notes",
"notesPlaceholder": "Optional notes about the batch...",
"created": "Batch created successfully.",
"grams": "g",
"confirmRecall": "Confirm Recall",
"lowStock": "Low"
},
"distributions": {
"title": "Distributions",
"newDistribution": "New Distribution",
"todaySummary": "Today: {count} distributions, {grams}g distributed",
"dateTime": "Date/Time",
"member": "Member",
"strain": "Strain",
"amount": "Amount (g)",
"staff": "Staff",
"status": "Status",
"completed": "Completed",
"locked": "Locked (immutable)",
"filterToday": "Today",
"filterWeek": "This Week",
"filterMonth": "This Month",
"searchMember": "Search member...",
"step1": "Select Member",
"step2": "Check Quota",
"step3": "Strain & Amount",
"step4": "Confirmation",
"selectMember": "Search member (name or number)...",
"memberBlocked": "Member is blocked — distribution not possible.",
"under21Info": "Reduced quota: 30g/month (under 21)",
"dailyRemaining": "Daily remaining",
"monthlyRemaining": "Monthly remaining",
"selectBatch": "Select batch",
"available": "available",
"amountLabel": "Amount in grams",
"exceedsDaily": "Exceeds daily limit ({limit}g).",
"exceedsMonthly": "Exceeds monthly limit ({limit}g).",
"exceedsBatch": "Insufficient stock in this batch.",
"confirm": "Confirm Distribution",
"summary": "Summary",
"success": "Distribution recorded successfully.",
"grams": "g",
"date": "Date",
"monthlyQuota": "Monthly Quota",
"remaining": "Remaining"
},
"reports": {
"title": "Reports",
"monthly": "Monthly Report",
"monthlyDesc": "Overview of all distributions in the selected month, including member quotas and stock changes.",
"memberList": "Member List",
"memberListDesc": "Complete member list with status, quota utilization and contact details.",
"recall": "Recall Report",
"recallDesc": "All batches with recall status and affected distributions for regulatory reporting.",
"downloadPdf": "Download as PDF",
"downloadCsv": "Download as CSV",
"preview": "Show Preview",
"generating": "Generating report...",
"downloaded": "{name} downloaded.",
"selectMonth": "Select month",
"selectStatus": "Filter by status",
"allStatuses": "All",
"activeOnly": "Active",
"suspendedOnly": "Suspended",
"dateFrom": "From",
"dateTo": "To",
"previewTitle": "Report Preview",
"totalDistributions": "Total Distributions",
"totalGrams": "Total Grams",
"uniqueMembers": "Unique Members",
"averagePerMember": "Avg per Member",
"topStrains": "Top Strains",
"affectedDistributions": "Affected Distributions",
"affectedMembers": "Affected Members",
"recalledBatches": "Recalled Batches",
"close": "Close",
"complianceNote": "This report is suitable for submission to the responsible authority.",
"complianceBadge": "§19 KCanG compliant",
"auditTrail": "All reports are generated with timestamps. The underlying distribution data is immutable (audit trail).",
"memberNumber": "No.",
"name": "Name",
"status": "Status",
"joinedAt": "Joined",
"usage": "Usage",
"strain": "Strain",
"grams": "Grams",
"percent": "Share",
"batchId": "Batch ID",
"recalledAt": "Recalled on",
"reason": "Reason",
"distributed": "Distributed",
"original": "Original"
},
"portal": {
"title": "My Area",
"login": "Member Login",
"loginSubtitle": "Sign in to the member portal",
"email": "Email address",
"password": "Password",
"loginButton": "Sign In",
"loggingIn": "Signing in...",
"invalidCredentials": "Invalid email address or password.",
"networkError": "Connection error. Please try again.",
"welcome": "Welcome back, {name}!",
"dashboard": "Overview",
"quota": "My Quota",
"history": "Distribution History",
"profile": "Profile",
"settings": "Settings",
"logout": "Sign Out",
"dailyQuota": "Daily Quota",
"monthlyQuota": "Monthly Quota",
"remaining": "remaining",
"used": "used",
"of": "of",
"lastDistribution": "Last Distribution",
"noDistributions": "No distributions this month yet.",
"memberSince": "Member since",
"memberNumber": "Member number",
"nextAvailable": "Next available",
"nextAvailableTomorrow": "Tomorrow at 00:00",
"changePassword": "Change Password",
"currentPassword": "Current Password",
"newPassword": "New Password",
"confirmPassword": "Confirm Password",
"passwordChanged": "Password changed successfully.",
"passwordMismatch": "Passwords do not match.",
"club": "My Club",
"quotaWarning": "Warning: You have already used {percent}% of your monthly quota.",
"under21Notice": "For members under 21: Reduced quota of 30g/month (§19 Abs. 3 KCanG).",
"grams": "g",
"date": "Date",
"strain": "Strain",
"amount": "Amount",
"recordedBy": "Recorded by",
"noHistory": "No distributions recorded yet.",
"personalInfo": "Personal Information",
"language": "Language",
"theme": "Theme",
"themeLight": "Light",
"themeDark": "Dark",
"themeSystem": "System",
"german": "German",
"english": "English",
"quickInfo": "Quick Info",
"todayAvailable": "Available today",
"monthAvailable": "Available this month",
"limitReached": "Limit reached",
"pagination": "{from}{to} of {total}",
"previous": "Previous",
"next": "Next",
"allMonths": "All months",
"footerText": "Cannabis cultivation club — Secure member management",
"adminLogin": "Go to Admin Login"
},
"staff": {
"title": "Staff",
"invite": "Invite New Member",
"name": "Name",
"email": "Email",
"role": "Role",
"permissions": "Permissions",
"status": "Status",
"actions": "Actions",
"active": "Active",
"revoked": "Revoked",
"invited": "Invited",
"editPermissions": "Edit Permissions",
"revokeAccess": "Revoke Access",
"revokeConfirm": "Really revoke access for {name}? The staff member will no longer be able to sign in.",
"revokeSuccess": "Access revoked.",
"inviteTitle": "Invite Staff Member",
"inviteDesc": "Invite a new team member via email and assign permissions.",
"inviteEmail": "Email address",
"inviteRole": "Role template",
"roleAusgabe": "Distribution",
"roleLager": "Stock",
"roleVorstand": "Board",
"roleCustom": "Custom",
"inviteSend": "Send Invitation",
"inviteSuccess": "Invitation sent to {email}.",
"permRecordDistribution": "Record Distribution",
"permViewMemberList": "View Member List",
"permViewMemberQuota": "View Quota",
"permAddMember": "Add Members",
"permViewStock": "View Stock",
"permRecordStockIn": "Record Stock In",
"permViewComplianceReport": "View Reports",
"permManageGrowCalendar": "Manage Grow Calendar",
"savePermissions": "Save",
"permissionsSaved": "Permissions updated.",
"cancel": "Cancel",
"noStaff": "No staff members yet."
},
"api": {
"loading": "Loading...",
"error": "Failed to load data.",
"retry": "Try again",
"offline": "No connection to server — data may be outdated.",
"networkError": "Network error. Please check your connection.",
"unauthorized": "Session expired. Please sign in again.",
"forbidden": "You do not have permission for this action.",
"notFound": "Resource not found.",
"quotaExceeded": "Quota exceeded.",
"serverError": "Server error. Please try again later."
},
"consent": {
"title": "Privacy Consent",
"dataProcessing": "Data Processing",
"dataProcessingDesc": "I consent to the processing of my personal data (name, email, date of birth, distribution history) for the purpose of club management. Legal basis: Art. 6(1)(a) GDPR.",
"marketing": "Marketing Notifications",
"marketingDesc": "I would like to receive information about new features and offers.",
"accept": "I agree",
"reject": "Decline and delete account",
"required": "Required",
"revoke": "Revoke consent",
"revokeWarning": "Without consent for data processing, the service cannot be used.",
"granted": "Granted on",
"revoked": "Revoked"
},
"dsgvo": {
"title": "Privacy",
"export": "Export my data",
"exportDesc": "Download all data stored about you as a JSON file (Art. 15 GDPR).",
"exportButton": "Download data",
"exporting": "Compiling data...",
"exported": "Data export downloaded.",
"delete": "Delete account and data",
"deleteDesc": "All personal data will be irreversibly deleted or anonymized (Art. 17 GDPR). Distribution data will be retained in anonymized form (legal retention requirement).",
"deleteButton": "Permanently delete account",
"deleteConfirm": "Are you sure? This action cannot be undone.",
"deleteSuccess": "Your account has been deleted. You will now be logged out."
},
"billing": {
"title": "Plan & Billing",
"currentPlan": "Current Plan",
"trial": "Free Trial",
"starter": "Starter",
"pro": "Pro",
"enterprise": "Enterprise",
"trialEnds": "Trial ends on {date}",
"trialExpired": "Your trial has expired. Choose a plan to continue.",
"trialDaysLeft": "{days} days remaining",
"memberLimit": "Member limit",
"membersUsed": "{used} / {limit} members",
"price": "{price}/month",
"nextBilling": "Next billing date",
"upgrade": "Upgrade plan",
"manageBilling": "Manage payment details",
"invoices": "Invoices",
"noInvoices": "No invoices yet.",
"starterDesc": "For small clubs up to 30 members",
"proDesc": "For growing clubs up to 100 members",
"enterpriseDesc": "For large clubs — unlimited members",
"starterPrice": "€19",
"proPrice": "€49",
"enterprisePrice": "On request",
"selectPlan": "Select plan",
"active": "Active",
"pastDue": "Past due",
"canceled": "Canceled"
},
"audit": {
"title": "Audit Log",
"subtitle": "Immutable log of all operations (10-year retention)",
"timestamp": "Timestamp",
"type": "Type",
"description": "Description",
"actor": "Actor",
"entity": "Entity",
"filterType": "Filter by event type",
"filterDateFrom": "From",
"filterDateTo": "To",
"filterActor": "Search actor",
"exportPdf": "Export as PDF",
"exporting": "Generating PDF...",
"exported": "Audit log exported.",
"allTypes": "All types",
"immutable": "Immutable",
"timezone": "Europe/Berlin",
"retentionNote": "Retention period: 10 years (KCanG-compliant)",
"types": {
"DISTRIBUTION_RECORDED": "Distribution recorded",
"DISTRIBUTION_VOIDED": "Distribution voided",
"MEMBER_CREATED": "Member created",
"MEMBER_UPDATED": "Member updated",
"MEMBER_SUSPENDED": "Member suspended",
"MEMBER_EXPELLED": "Member expelled",
"BATCH_CREATED": "Batch created",
"BATCH_RECALLED": "Batch recalled",
"LOGIN_SUCCESS": "Login",
"LOGIN_FAILED": "Failed login",
"LOGOUT": "Logout",
"PASSWORD_CHANGED": "Password changed",
"STAFF_INVITED": "Staff invited",
"STAFF_PERMISSIONS_CHANGED": "Permissions changed",
"STAFF_REVOKED": "Access revoked",
"CONSENT_GRANTED": "Consent granted",
"CONSENT_REVOKED": "Consent revoked",
"DATA_EXPORTED": "Data exported",
"DATA_DELETED": "Data deleted",
"SUBSCRIPTION_STARTED": "Subscription started",
"SUBSCRIPTION_CANCELED": "Subscription canceled",
"PAYMENT_RECEIVED": "Payment received",
"PAYMENT_FAILED": "Payment failed"
}
}
}