Fix language setting not being saved to database on admin settings page

- Added default_language field to general settings state in SettingsPage
- Replaced LanguageSelector component with simple select dropdown on settings page
- Fixed public settings endpoint to read general_default_language from database
- Language setting now properly saved when clicking Save Settings button
- Setting is correctly used by gallery login page and legal pages

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
This commit is contained in:
2025-07-08 09:49:45 +02:00
co-authored by Claude
parent cfa0b0da69
commit 2012b0bab9
91 changed files with 6183 additions and 577 deletions
+284
View File
@@ -0,0 +1,284 @@
{
"common": {
"loading": "Loading...",
"error": "Error",
"save": "Save",
"cancel": "Cancel",
"delete": "Delete",
"edit": "Edit",
"add": "Add",
"search": "Search",
"filter": "Filter",
"sortBy": "Sort by",
"yes": "Yes",
"no": "No",
"back": "Back",
"next": "Next",
"previous": "Previous",
"close": "Close",
"logout": "Logout",
"download": "Download",
"downloadAll": "Download All",
"uploading": "Uploading...",
"uploaded": "Uploaded",
"photo": "photo",
"photos": "photos"
},
"navigation": {
"dashboard": "Dashboard",
"events": "Events",
"archives": "Archives",
"settings": "Settings",
"branding": "Branding",
"analytics": "Analytics",
"emailSettings": "Email Settings",
"cmsPages": "CMS Pages"
},
"auth": {
"login": "Login",
"password": "Password",
"enterPassword": "Enter Gallery Password",
"passwordPlaceholder": "Enter the gallery password",
"invalidPassword": "Invalid password",
"sessionExpired": "Session expired",
"pleaseEnterPassword": "Please enter a password",
"passwordHint": "The password was provided by the event organizer. Contact them if you don't have it."
},
"gallery": {
"title": "Photo Gallery",
"welcomeMessage": "Welcome Message",
"expiresOn": "Expires on",
"expires": "Expires",
"expired": "Expired",
"daysRemaining": "{{days}} days remaining",
"dayRemaining": "1 day remaining",
"hoursRemaining": "{{hours}} hours remaining",
"expiredMessage": "This gallery expired on {{date}}",
"contactOrganizer": "Please contact the event organizer if you need access to these photos",
"searchPhotos": "Search photos by filename...",
"sortByDate": "Sort by Date",
"sortByName": "Sort by Name",
"sortBySize": "Sort by Size",
"allPhotos": "All Photos",
"downloadSelected": "Download Selected",
"shareGallery": "Share Gallery",
"needHelp": "Need help? Contact us at",
"noPhotosFound": "No photos found",
"failedToLoad": "Failed to load photos",
"tryAgain": "Try Again",
"loading": "Loading gallery...",
"expiredOn": "This gallery expired on {{date}}.",
"contactOrganizer": "Please contact the event organizer if you need access to these photos.",
"expiresIn": "Gallery expires in {{count}} day",
"expiresIn_plural": "Gallery expires in {{count}} days",
"downloadBefore": "Download your photos before they're no longer available.",
"viewGallery": "View Gallery",
"downloadAll": "Download All",
"downloading": "Downloading {{count}} photo...",
"downloading_plural": "Downloading {{count}} photos...",
"downloadedPhotos": "Downloaded {{count}} photo!",
"downloadedPhotos_plural": "Downloaded {{count}} photos!",
"downloadError": "Some photos failed to download",
"selectPhotos": "Select Photos",
"cancelSelection": "Cancel Selection",
"photosSelected": "{{count}} selected",
"selectAll": "Select All",
"deselectAll": "Deselect All",
"downloadSelected": "Download {{count}} Selected",
"remaining": "remaining",
"selectPhotosHint": "Tip: Use Ctrl+Click (Cmd+Click on Mac) to quickly select multiple photos"
},
"categories": {
"title": "Photo Categories",
"global": "Global Categories",
"eventSpecific": "Event-Specific Categories",
"addCategory": "Add Category",
"categoryName": "Category name",
"noCategory": "No category",
"noCategoriesYet": "No categories yet. Create your first category to organize photos.",
"deleteConfirm": "Are you sure you want to delete \"{{name}}\"?",
"cannotDelete": "Cannot delete category with photos. Please reassign photos first."
},
"events": {
"title": "Events",
"createEvent": "Create Event",
"eventDetails": "Event Details",
"eventName": "Event Name",
"eventType": "Event Type",
"eventDate": "Event Date",
"hostEmail": "Host Email",
"adminEmail": "Admin Email",
"expirationDate": "Expiration Date",
"active": "Active",
"archived": "Archived",
"photoCount": "{{count}} photos",
"totalSize": "Total Size",
"shareLink": "Share Link",
"copyLink": "Copy Link",
"linkCopied": "Link copied!",
"viewGallery": "View Gallery",
"uploadPhotos": "Upload Photos",
"archiveEvent": "Archive Event",
"archiveConfirm": "Are you sure you want to archive this event? This action cannot be undone.",
"extendExpiration": "Extend {{days}} Days"
},
"settings": {
"title": "System Settings",
"general": {
"title": "General",
"siteConfiguration": "Site Configuration",
"siteUrl": "Site URL",
"siteUrlHelp": "Used for generating gallery links in emails",
"defaultExpiration": "Default Expiration (days)",
"maxFileSize": "Max File Size (MB)",
"allowedFileTypes": "Allowed File Types",
"allowedFileTypesHelp": "Comma-separated list of file extensions",
"featureToggles": "Feature Toggles",
"enableWatermark": "Enable watermark on photos",
"enableAnalytics": "Enable analytics tracking",
"enableRegistration": "Allow self-registration for admins",
"maintenanceMode": "Enable maintenance mode",
"language": "Language",
"saveSettings": "Save General Settings"
},
"storage": {
"title": "Storage",
"overview": "Storage Overview",
"totalUsed": "Total Used",
"archiveStorage": "Archive Storage",
"storageLimit": "Storage Limit",
"storageUsage": "Storage Usage",
"storageByEvent": "Storage by Event",
"storageManagement": "Storage Management",
"storageManagementHelp": "Consider archiving or deleting old events to free up storage space. Archived events are compressed and use less storage than active galleries."
},
"security": {
"title": "Security",
"passwordSettings": "Password Settings",
"requirePassword": "Require password for all galleries",
"minPasswordLength": "Minimum Password Length",
"sessionAuth": "Session & Authentication",
"sessionTimeout": "Session Timeout (minutes)",
"maxLoginAttempts": "Max Login Attempts",
"enable2FA": "Enable two-factor authentication for admins",
"recaptchaSettings": "reCAPTCHA Settings",
"enableRecaptcha": "Enable reCAPTCHA for login forms",
"siteKey": "Site Key",
"secretKey": "Secret Key",
"recaptchaHelp": "Get your reCAPTCHA keys from",
"saveSettings": "Save Security Settings"
},
"categories": {
"title": "Categories",
"about": "About Photo Categories",
"aboutText": "Global categories are available for all events. You can also create event-specific categories when editing individual events. Categories help organize photos and allow guests to filter photos by type in the gallery view."
}
},
"branding": {
"title": "Branding & Customization",
"companyInfo": "Company Information",
"companyName": "Company Name",
"companyTagline": "Company Tagline",
"supportEmail": "Support Email",
"footerText": "Footer Text",
"logo": "Logo",
"uploadLogo": "Upload Logo",
"removeLogo": "Remove Logo",
"favicon": "Favicon",
"uploadFavicon": "Upload Favicon",
"removeFavicon": "Remove Favicon",
"watermark": "Watermark",
"enableWatermark": "Enable watermark on photos",
"theme": "Theme",
"themeCustomization": "Theme Customization",
"selectPreset": "Select a preset theme",
"colors": "Colors",
"primaryColor": "Primary Color",
"secondaryColor": "Secondary Color",
"accentColor": "Accent Color",
"customCSS": "Custom CSS",
"preview": "Preview",
"previewInNewTab": "Preview in New Tab",
"reset": "Reset",
"saveChanges": "Save Changes"
},
"admin": {
"title": "Admin Panel",
"welcome": "Welcome back, {{name}}",
"recentActivity": "Recent Activity",
"systemStatus": "System Status",
"totalEvents": "Total Events",
"activeGalleries": "Active Galleries",
"storageUsed": "Storage Used",
"totalPhotos": "Total Photos",
"storagePercent": "{{percent}}% of {{limit}}",
"notifications": "Notifications",
"viewAllNotifications": "View all notifications",
"changePassword": "Change Password",
"loadingDashboard": "Loading dashboard...",
"activeEvents": "Active Events",
"expiringSoon": "Expiring Soon",
"next7Days": "Next 7 days",
"totalViews": "Total Views",
"downloads": "Downloads",
"percentFromLastWeek": "{{percent}}% from last week",
"dashboardSubtitle": "Welcome back! Here's what's happening with your galleries.",
"eventsExpiringSoon": "Events Expiring Soon",
"noEventsExpiring": "No events expiring in the next 7 days",
"daysLeft": "{{count}} day left",
"daysLeft_plural": "{{count}} days left",
"viewAllExpiringEvents": "View all {{count}} expiring events",
"noRecentActivity": "No recent activity",
"viewAllActivity": "View all activity",
"quickActions": "Quick Actions",
"viewArchives": "View Archives",
"analytics": "Analytics"
},
"errors": {
"notFound": "Not Found",
"galleryNotFound": "Gallery Not Found",
"galleryNotFoundMessage": "This gallery does not exist or has been removed.",
"unauthorized": "Unauthorized",
"forbidden": "Forbidden",
"serverError": "Server Error",
"somethingWentWrong": "Something went wrong",
"tryAgainLater": "Please try again later",
"refreshPage": "Refresh Page",
"oopsSomethingWentWrong": "Oops! Something went wrong",
"unexpectedError": "We encountered an unexpected error. Don't worry, your data is safe.",
"goToHomepage": "Go to Homepage",
"errorDetails": "Error Details"
},
"legal": {
"impressum": "Legal Notice",
"datenschutz": "Privacy Policy",
"termsOfService": "Terms of Service",
"cookiePolicy": "Cookie Policy"
},
"toast": {
"saveSuccess": "Changes saved successfully",
"saveError": "Failed to save changes",
"deleteSuccess": "Deleted successfully",
"deleteError": "Failed to delete",
"uploadSuccess": "Upload completed successfully",
"uploadError": "Upload failed",
"loginSuccess": "Login successful",
"loginError": "Login failed",
"passwordChanged": "Password changed successfully",
"linkCopied": "Link copied to clipboard",
"eventCreated": "Event created successfully",
"eventUpdated": "Event updated successfully",
"eventArchived": "Event archived successfully",
"settingsSaved": "Settings saved successfully",
"themeUpdated": "Theme updated successfully",
"brandingUpdated": "Branding updated successfully",
"categoryAdded": "Category added successfully",
"categoryDeleted": "Category deleted successfully",
"categoryUpdated": "Category updated successfully",
"emailConfigSaved": "Email configuration saved successfully",
"testEmailSent": "Test email sent successfully",
"pageUpdated": "Page updated successfully",
"archiveRestored": "Archive restored successfully",
"archiveDeleted": "Archive deleted permanently"
}
}