{ "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" } } }