Files
picpeak/frontend/src/i18n/locales/en.json
T

2339 lines
104 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.
{
"userManagement": {
"title": "User Management",
"subtitle": "Manage admin users and invitations",
"loading": "Loading users...",
"loadError": "Failed to load users. Please try again.",
"inviteUser": "Invite User",
"createInvitation": "Create Invitation",
"email": "Email Address",
"emailPlaceholder": "[email protected]",
"role": "Role",
"selectRole": "Select a role",
"sendInvitation": "Send Invitation",
"editUser": "Edit User",
"editingUser": "Editing user",
"saveChanges": "Save Changes",
"deactivateUser": "Deactivate User",
"cancelInvitation": "Cancel Invitation",
"invitationSent": "Invitation sent successfully",
"invitationError": "Failed to send invitation",
"invitationCancelled": "Invitation cancelled",
"cancelInvitationError": "Failed to cancel invitation",
"userUpdated": "User updated successfully",
"updateUserError": "Failed to update user",
"userDeactivated": "User deactivated successfully",
"deactivateUserError": "Failed to deactivate user",
"noRole": "No Role",
"neverLoggedIn": "Never logged in",
"expired": "Expired",
"deactivate": "Deactivate",
"cancel": "Cancel",
"tabs": {
"users": "Users",
"invitations": "Invitations"
},
"stats": {
"totalUsers": "Total Users",
"activeUsers": "Active Users",
"pendingInvitations": "Pending Invitations",
"inactiveUsers": "Inactive Users"
},
"status": {
"active": "Active",
"inactive": "Inactive"
},
"table": {
"user": "User",
"email": "Email",
"role": "Role",
"status": "Status",
"lastLogin": "Last Login",
"actions": "Actions",
"invitedBy": "Invited By",
"expires": "Expires"
},
"validation": {
"emailRequired": "Email is required",
"emailInvalid": "Invalid email format",
"roleRequired": "Role is required"
},
"searchUsersPlaceholder": "Search users...",
"searchInvitationsPlaceholder": "Search invitations...",
"noUsers": "No users found",
"noUsersFound": "No users match your search",
"noInvitations": "No pending invitations",
"noInvitationsFound": "No invitations match your search",
"confirmDeactivate": {
"title": "Deactivate User",
"message": "Are you sure you want to deactivate {{name}}? They will no longer be able to log in."
},
"confirmCancelInvitation": {
"title": "Cancel Invitation",
"message": "Are you sure you want to cancel the invitation for {{email}}?"
}
},
"common": {
"loading": "Loading...",
"error": "Error",
"save": "Save",
"cancel": "Cancel",
"delete": "Delete",
"edit": "Edit",
"add": "Add",
"sortBy": "Sort by",
"yes": "Yes",
"no": "No",
"back": "Back",
"next": "Next",
"previous": "Previous",
"close": "Close",
"logout": "Logout",
"change": "Change",
"remove": "Remove",
"download": "Download",
"downloadAll": "Download All",
"photo": "photo",
"photos": "photos",
"video": "video",
"media": "media",
"upload": "Upload",
"customize": "Customize",
"hide": "Hide",
"unknown": "Unknown",
"notSet": "Not set",
"of": "of",
"selected": "Selected",
"chunk": "Chunk",
"optional": "optional",
"tryAgain": "Try Again",
"active": "Active",
"inactive": "Inactive",
"create": "Create",
"unknownDate": "Unknown date",
"pageOf": "Page {{current}} of {{total}}",
"collapse": "Collapse",
"expand": "Expand",
"submitting": "Submitting...",
"copy": "Copy",
"copied": "Copied!",
"applying": "Applying...",
"done": "Done",
"retry": "Retry",
"characters": "characters",
"saveChanges": "Save Changes",
"resetChanges": "Reset Changes",
"dismiss": "Dismiss"
},
"upload": {
"photoCategory": "Photo Category",
"noCategory": "No category",
"eventSpecific": "(Event specific)",
"clickToUpload": "Click to upload or drag and drop",
"fileRequirements": "JPEG, PNG or WebP (max 50MB per file, {{limit}} files per upload)",
"selectedFiles": "Selected files",
"uploading": "Uploading...",
"transferring": "Transferring",
"processing": "Processing photos...",
"processingHint": "Files are uploaded. PicPeak is now generating thumbnails and reading metadata. You can leave this page — work continues in the background.",
"processingProgress": "{{complete}} of {{total}} done",
"retryFailed": "Retry failed",
"uploadComplete": "Upload complete!",
"someFilesFailed": "Some files failed to upload",
"replaceByName": "Replace existing photos with same name",
"uploadPhotos": "Upload Photos",
"uploadMedia": "Upload Photos & Videos",
"maxFilesReached": "Maximum {{limit}} files allowed",
"someFilesSkipped": "Only {{allowed}} more files can be added (limit {{limit}})",
"tooManyFiles": "Maximum {{limit}} files can be uploaded at once",
"limitInfo": "{{selected}} of {{limit}} files selected ({{remaining}} remaining)",
"limitReached": "Upload limit reached ({{limit}} files per batch)",
"replacedFiles_one": "{{count}} photo replaced",
"replacedFiles_other": "{{count}} photos replaced",
"processingFailed_one": "{{count}} photo failed to process",
"processingFailed_other": "{{count}} photos failed to process",
"uploadingChunks_one": "{{count}} chunk uploading",
"uploadingChunks_other": "{{count}} chunks uploading"
},
"navigation": {
"dashboard": "Dashboard",
"events": "Events",
"settings": "Settings"
},
"archives": {
"title": "Archives",
"subtitle": "Manage archived photo galleries",
"loadingArchives": "Loading archives...",
"totalArchives": "Total Archives",
"storageUsed": "Storage Used",
"totalPhotos": "Total Photos",
"avgArchiveSize": "Avg Archive Size",
"searchPlaceholder": "Search archives...",
"allTypes": "All Types",
"wedding": "Wedding",
"birthday": "Birthday",
"corporate": "Corporate",
"other": "Other",
"sortByDate": "Sort by Date",
"sortByName": "Sort by Name",
"sortBySize": "Sort by Size",
"tableHeaders": {
"event": "Event",
"type": "Type",
"archivedDate": "Archived Date",
"size": "Size",
"photos": "Photos",
"actions": "Actions"
},
"noArchivesFound": "No archives found",
"eventDateNA": "Event date: N/A",
"processing": "Processing...",
"download": "Download",
"restore": "Restore",
"delete": "Delete",
"showing": "Showing {{from}} to {{to}} of {{total}} archives",
"page": "Page {{current}} of {{total}}",
"storageManagement": "Storage Management",
"storageInfo": "Archives are stored permanently unless manually deleted. Consider implementing a retention policy to manage storage costs.",
"confirmRestore": "Are you sure you want to restore this archive? The event will become active again.",
"confirmDelete": "Are you sure you want to permanently delete this archive? This action cannot be undone.",
"restoreSuccess": "Archive restored successfully",
"deleteSuccess": "Archive deleted permanently"
},
"auth": {
"password": "Password",
"enterPassword": "Enter Gallery Password",
"passwordPlaceholder": "Enter the gallery password",
"invalidPassword": "Invalid password",
"wrongPassword": "Incorrect password. Please check your password and try again.",
"tooManyAttempts": "Too many failed login attempts. Please try again later.",
"pleaseEnterPassword": "Please enter a password",
"passwordHint": "The password was provided by the event organizer. Contact them if you don't have it."
},
"gallery": {
"expires": "Expires",
"expired": "Expired",
"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",
"feedbackFilter": "Feedback Filter",
"all": "All",
"liked": "Liked",
"favorited": "Favorited",
"favorites": "Favorites",
"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}}.",
"downloadBefore": "Download your photos before they're no longer available.",
"viewGallery": "View Gallery",
"downloadAll": "Download All",
"downloadError": "Some photos failed to download",
"selectPhotos": "Select Photos",
"cancelSelection": "Cancel Selection",
"selectAll": "Select All",
"deselectAll": "Deselect All",
"deleteSelected": "Delete Selected",
"searchByFilename": "Search by filename...",
"uncategorized": "Uncategorized",
"sortAscending": "Sort ascending",
"sortDescending": "Sort descending",
"remaining": "remaining",
"selectPhotosHint": "Tip: Use Ctrl+Click (Cmd+Click on Mac) to quickly select multiple photos",
"filters": "Filters",
"toggleMenu": "Toggle menu",
"allCategories": "All Categories",
"categories": "Categories",
"mediaType": "Media",
"allMedia": "All media",
"photosOnly": "Photos",
"videosOnly": "Videos",
"download": "Download",
"noMedia": "No media uploaded yet",
"searchPlaceholder": "Search photos...",
"sortBy": "Sort By",
"sortByCaptureDate": "Sort by Capture Date",
"sortByRating": "Sort by Rating",
"photoGallery": "Photo Gallery",
"photos": "Photos",
"allRightsReserved": "All rights reserved",
"searchMemories": "Search memories...",
"thankYou": "Thank You",
"thankYouMessage": "For being part of our story and making our special day unforgettable.",
"feedback": {
"title": "Feedback",
"shareThoughts": "Share your thoughts on \"{{name}}\"",
"rateThisMoment": "Rate this moment",
"comments": "Comments",
"noComments": "No comments yet. Be the first!",
"yourName": "Your name",
"yourEmail": "Your email",
"writeLovelyNote": "Write a lovely note...",
"postComment": "Post Comment",
"anonymous": "Anonymous"
},
"rated": "Rated",
"commented": "Commented",
"expiresIn_one": "Gallery expires in {{count}} day",
"expiresIn_other": "Gallery expires in {{count}} days",
"downloading_one": "Downloading 1 photo...",
"downloading_other": "Downloading {{count}} photos...",
"guestRecovery": {
"invalidEmail": "Enter a valid email address",
"codeSent": "Check your inbox for a verification code.",
"requestError": "Could not send code. Try again.",
"invalidCode": "Enter the 6-digit code",
"verifyError": "Invalid or expired code.",
"back": "Back",
"title": "Recover your picks",
"emailStepDescription": "Enter the email you used before. We will send a 6-digit verification code.",
"codeStepDescription": "Enter the 6-digit code we sent to your email.",
"emailLabel": "Email",
"sendCode": "Send code",
"codeLabel": "Verification code",
"verifyCode": "Verify and continue"
},
"guestPrompt": {
"nameRequired": "Name is required",
"invalidEmail": "Invalid email address",
"emailRequired": "Email is required",
"error": "Registration failed",
"title": "Welcome — what's your name?",
"description": "Your picks will be saved under this name so the photographer knows which photos you love.",
"nameLabel": "Your name",
"namePlaceholder": "Enter your name",
"emailLabelRequired": "Email",
"emailLabel": "Email (optional)",
"emailPlaceholder": "[email protected]",
"submit": "Continue",
"alreadyHere": "I've been here before"
},
"footer": {
"forgetMeConfirm": "Your name and selections will be removed from this gallery.",
"forgetMe": "Forget me ({{name}})"
},
"photosCount_one": "{{count}} photo",
"photosCount_other": "{{count}} photos",
"poweredBy": "Powered by PicPeak",
"photosSelected_one": "gallery.photosSelected",
"photosSelected_other": "gallery.photosSelected",
"downloadSelected_one": "gallery.downloadSelected",
"downloadSelected_other": "gallery.downloadSelected"
},
"categories": {
"title": "Photo Categories",
"addCategory": "Add Category",
"eventSpecificCategories": "Event-Specific Categories",
"noEventSpecificCategories": "No event-specific categories. Global categories are available by default.",
"globalCategoriesAlwaysAvailable": "Global Categories (always available):",
"deleteCategoryTitle": "Delete category",
"categoryCreatedSuccess": "Category created successfully",
"categoryDeletedSuccess": "Category deleted successfully",
"failedToCreateCategory": "Failed to create category",
"failedToDeleteCategory": "Failed to delete category",
"categoryName": "Category name",
"noCategoriesYet": "No categories yet. Create your first category to organize photos.",
"deleteConfirm": "Are you sure you want to delete \"{{name}}\"?",
"setCoverPhoto": "Set Cover Photo",
"removeCoverPhoto": "Remove Cover Photo",
"coverPhotoSet": "Cover photo set successfully",
"coverPhotoRemoved": "Cover photo removed",
"failedToSetCoverPhoto": "Failed to set cover photo",
"categoryHeroHint": "If no cover photo is set for a category, the default hero photo will be used."
},
"events": {
"title": "Events",
"create": "Create",
"createEvent": "Create Event",
"totalViews": "Total Views",
"totalDownloads": "Total Downloads",
"uniqueVisitors": "Unique Visitors",
"eventNamePlaceholder": "e.g., John & Jane's Wedding",
"welcomeMessagePlaceholder": "Welcome to our special day! Feel free to download and share these memories...",
"hostEmailPlaceholder": "[email protected]",
"adminEmailPlaceholder": "[email protected]",
"adminEmailPickFromAdmins": "Pick from admins:",
"adminEmailCustom": "Custom email",
"accessAndSecurity": "Access & Security",
"enterPassword": "Enter password",
"passwordPlaceholder": "Enter a secure password",
"confirmPasswordPlaceholder": "Confirm password",
"eventDetails": "Event Details",
"eventName": "Event Name",
"eventType": "Event Type",
"eventDate": "Event Date",
"hostEmail": "Customer Email",
"hostName": "Customer Name",
"hostNamePlaceholder": "John Smith",
"adminEmail": "Admin Email",
"expirationDate": "Expiration Date",
"active": "Active",
"archived": "Archived",
"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",
"backToEvents": "Back to Events",
"loadingEventDetails": "Loading event details...",
"saveChanges": "Save Changes",
"eventExpiresIn": "This event expires in {{days}} days",
"overview": "Overview",
"photos": "Photos",
"categories": "Categories",
"eventInformation": "Event Information",
"sourceMode": "Source Mode",
"sourceModeManaged": "Managed (upload to PicPeak)",
"sourceModeReference": "Reference external folder",
"sourceModeHelp": "Use managed mode for direct uploads or point to a mounted /external-media folder when using local storage.",
"externalFolder": "External Folder",
"externalFolderHint": "These folders are read from the /external-media mount inside your container or host.",
"externalFolderRequired": "Please select an external folder before saving.",
"externalFolderEmpty": "No subfolders",
"clearSelection": "Clear",
"welcomeMessage": "Welcome Message",
"created": "Created",
"expires": "Expires",
"shareWithGuests": "Share this link with guests. They'll need the password to access the gallery.",
"shareWithGuestsPublic": "Share this link with guests. No password is required for this gallery.",
"resetGalleryPassword": "Reset Gallery Password",
"resendCreationEmail": "Resend Creation Email",
"creationEmailResent": "Creation email has been queued for sending",
"failedToResendEmail": "Failed to resend creation email",
"photoStatistics": "Photo Statistics",
"totalPhotos": "Total Photos",
"managePhotos": "Manage Photos",
"actions": "Actions",
"archivingInfo": "Archiving will create a ZIP file of all photos and remove the gallery from public access.",
"archivedOn": "Archived On",
"downloadArchive": "Download Archive",
"loadingPhotos": "Loading photos...",
"photoCategories": "Photo Categories",
"organizeCategoriesInfo": "Organize your photos into categories. Categories help guests navigate and find specific types of photos.",
"categoriesTip": "Tip: Categories are specific to each event. You can create custom categories like \"Ceremony\", \"Reception\", \"Portraits\", etc.",
"galleryPassword": "Gallery Password",
"requirePasswordToggle": "Require password for this gallery",
"requirePasswordToggleHelp": "Disable this if you want to share the gallery without a password. Anyone with the link will be able to view the photos.",
"publicGalleryWarning": "Public galleries are accessible to anyone with the link. Consider enabling download watermarks and monitoring activity.",
"passwordHelperText": "You can use dates like \"04.07.2025\" or any text with 6+ characters",
"confirmPassword": "Confirm Password",
"newPasswordLabel": "New Gallery Password",
"passwordReset": {
"title": "Reset Gallery Password",
"newTitle": "New Password",
"description": "Set a new password for {{eventName}}, or leave both fields empty to have one auto-generated.",
"newPasswordLabel": "New password",
"placeholder": "Leave empty to auto-generate",
"helperText": "Use 6+ characters, or leave blank to auto-generate",
"confirmLabel": "Confirm password",
"sendEmail": "Send email notification",
"sendEmailHelp": "Notify the host about the password change",
"warning": "Note: The old password will no longer work. Make sure to share the new password with the host.",
"submit": "Reset Password",
"successHeading": "Password reset successfully!",
"emailSentNote": "An email notification has been sent to the host.",
"generatedLabel": "Auto-generated gallery password",
"saveSecurelyNote": "Important: Save this password securely. It cannot be recovered once you close this window.",
"done": "Done",
"toastSuccess": "Password reset successfully",
"toastError": "Failed to reset password",
"toastCopied": "Password copied to clipboard",
"errorMinLength": "Password must be at least 6 characters",
"errorMismatch": "Passwords do not match"
},
"themeAndStyle": "Theme & Style",
"galleryExpiration": "Gallery Expiration",
"daysAfterEvent": "days after event date",
"expiresOn": "Expires on",
"noExpiration": "No Expiration",
"noExpirationHelp": "This gallery will remain active until manually archived.",
"photoCap": "Photo Limit",
"photoCapHelp": "Maximum number of photos allowed. 0 = unlimited",
"userUploads": "User Upload Settings",
"allowUserUploads": "Allow guests to upload photos",
"allowUserUploadsHelp": "Enable guests to upload their own photos to this gallery",
"allowUserUploadsDescription": "Enable guests to upload their own photos to this gallery",
"uploadCategory": "Upload Category",
"selectCategory": "Select a category for user uploads",
"uploadCategoryHelp": "All user-uploaded photos will be added to this category",
"allowDownloads": "Allow photo downloads",
"downloadsDisabled": "Downloads Disabled",
"downloadProtection": "Download Protection",
"disableRightClick": "Block right-click menu",
"watermarkDownloads": "Add watermark to downloads",
"enableDevtoolsProtection": "Detect developer tools",
"useCanvasRendering": "Canvas rendering (advanced protection)",
"protectionInfo": "Protection features help prevent unauthorized downloads but cannot block all methods.",
"protectionLevelBasic": "Basic - Right-click blocking only",
"protectionLevelStandard": "Standard - Keyboard shortcuts blocked",
"protectionLevelEnhanced": "Enhanced - Print screen detection",
"protectionLevelMaximum": "Maximum - DevTools detection & canvas rendering",
"heroLogoSettings": "Hero Logo Settings",
"heroLogoVisible": "Display logo in hero section",
"heroLogoSize": "Logo Size",
"heroLogoSizeSmall": "Small",
"heroLogoSizeMedium": "Medium",
"heroLogoSizeLarge": "Large",
"heroLogoSizeXLarge": "Extra Large",
"heroLogoPosition": "Logo Position",
"heroLogoPositionTop": "Top (above title)",
"heroLogoPositionCenter": "Center (between title and dates)",
"heroLogoPositionBottom": "Bottom (below dates)",
"heroLogoInfo": "These settings apply when the gallery uses the Hero layout. You can hide the logo or customize its size and position.",
"eventCustomLogo": "Custom Event Logo",
"eventCustomLogoDescription": "Upload a custom logo for this event. This overrides the global branding logo for this gallery only.",
"uploadEventLogo": "Upload Logo",
"replaceLogo": "Replace",
"removeLogo": "Remove",
"eventLogoUploaded": "Event logo uploaded successfully",
"eventLogoUploadFailed": "Failed to upload event logo",
"eventLogoRemoved": "Event logo removed successfully",
"eventLogoRemoveFailed": "Failed to remove event logo",
"heroLogoVisibleLabel": "Logo visible",
"heroLogoSizeLabel": "Size",
"heroLogoPositionLabel": "Position",
"heroLogoHidden": "Logo hidden",
"heroPhoto": "Hero Photo",
"heroPhotoHelp": "Select a default hero photo for the gallery. You can override this per category.",
"selectHeroPhoto": "Select Hero Photo",
"noHeroPhotoSelected": "No hero photo selected",
"heroPhotoSelected": "Hero photo selected",
"heroImageAnchor": "Hero Image Crop Position",
"heroImageAnchorDescription": "Click on the image to set the focal point for cropping.",
"heroImageAnchorTop": "Top",
"heroImageAnchorCenter": "Center",
"heroImageAnchorBottom": "Bottom",
"heroPreview": "Hero preview",
"noPhotosAvailable": "No photos available",
"inactive": "Inactive",
"expired": "Expired",
"draft": "Draft",
"publishAndNotify": "Publish & Notify Client",
"publishConfirm": "This will make the gallery accessible and send the notification email to the client. Continue?",
"publishSuccess": "Gallery published and client notified!",
"draftBanner": "This gallery is in draft mode. Upload your photos, then publish when ready.",
"subtitle": "Manage your photo galleries and events",
"failedToLoadEvents": "Failed to load events",
"tryAgain": "Try Again",
"bulkArchivePartial": "Archived {{success}} events, {{failed}} failed",
"deleteSelected": "Delete Selected",
"bulkDelete": {
"warning": "This will permanently delete the selected events, all their photos, archives, and audit logs. This action cannot be undone.",
"passwordLabel": "Re-enter your password to confirm",
"passwordPlaceholder": "Your admin password",
"passwordHelp": "We require your password as a safeguard against accidental bulk deletions.",
"incorrectPassword": "Incorrect password. No events were deleted.",
"confirmLabel": "Type {{literal}} to confirm",
"confirmHelp": "A typed confirmation prevents accidental deletions and isn't affected by browser autofill or passkey shortcuts.",
"submit": "Delete {{count}} events",
"processing": "Deleting {{count}} events. This may take a few minutes — please don't close this window.",
"successAll": "Permanently deleted {{count}} events",
"successPartial": "Deleted {{success}} events, {{failed}} failed",
"errorGeneric": "Failed to delete events",
"successAll_one": "events.bulkDelete.successAll",
"successAll_other": "events.bulkDelete.successAll",
"title_one": "Permanently delete {{count}} events?",
"title_other": "Permanently delete {{count}} events?",
"processing_one": "Deleting {{count}} events. This may take a few minutes — please don't close this window.",
"processing_other": "Deleting {{count}} events. This may take a few minutes — please don't close this window.",
"submit_one": "Delete {{count}} events",
"submit_other": "Delete {{count}} events"
},
"searchEventsPlaceholder": "Search events...",
"all": "All",
"expiring": "Expiring",
"clear": "Clear",
"archiveSelected": "Archive Selected",
"publicAccess": "Public access",
"passwordProtected": "Password protected",
"newPasswordRequired": "Please set a password before enabling protection.",
"event": "Event",
"type": "Type",
"date": "Date",
"status": "Status",
"noEventsFound": "No events found",
"stats": {
"totalEvents": "Total Events",
"activeEvents": "Active Events",
"totalPhotos": "Total Photos",
"expiringEvents": "Expiring Soon"
},
"viewDetails": "View Details",
"archiveEventAction": "Archive Event",
"downloadArchiveAction": "Download Archive",
"deleteEvent": "Delete Event",
"deleteEventConfirm": "Are you sure you want to delete this event?",
"downloadArchiveSoon": "Download archive coming soon",
"eventExpiredMessage": "This event has expired",
"guestsCannotAccessGallery": "Guests can no longer access the gallery. Consider archiving this event.",
"warningEmailsHaveBeenSent": "Warning emails have been sent to the customer.",
"extendSevenDays": "Extend 7 Days",
"welcomeMessageLabel": "Welcome Message",
"noWelcomeMessageSet": "No welcome message set",
"copy": "Copy",
"copied": "Copied!",
"archiveStatusTitle": "Archive Status",
"downloadingArchive": "Downloading {{name}} archive...",
"downloadStarted": "Download started",
"failedToDownloadArchive": "Failed to download archive",
"galleryTheme": "Gallery Theme",
"noThemeSet": "No theme configured",
"customizingThemeFor": "Customizing theme for {{event}}",
"customCssTemplate": "Custom CSS Template",
"customCssTemplateDesc": "Apply a custom CSS template to style the gallery with unique visual effects.",
"noTemplate": "No Template",
"useThemeOnly": "Use theme preset only",
"customTemplate": "Custom Template",
"rename": {
"button": "Rename",
"title": "Rename Event",
"validating": "Validating new name...",
"renamingFiles": "Renaming files...",
"complete": "Complete!",
"failed": "Rename failed",
"confirm": "Rename Event",
"success": "Event renamed successfully!",
"filesRenamed_one": "{{count}} files updated",
"filesRenamed_other": "{{count}} files updated",
"newLink": "New Gallery Link",
"currentName": "Current name:",
"newName": "New Event Name",
"enterNewName": "Enter new event name",
"newUrl": "New URL:",
"checkingAvailability": "Checking availability...",
"resendEmail": "Resend invitation email with new gallery link",
"emailTo": "Send updated gallery access email to",
"warningTitle": "Please note:",
"warning1": "The gallery URL will change",
"warning2": "Old URLs will automatically redirect to the new URL",
"warning3": "Photo files may be renamed"
},
"bulkArchiveSuccess_one": "Successfully archived {{count}} event",
"bulkArchiveSuccess_other": "Successfully archived {{count}} events",
"daysLeft_one": "({{count}} day left)",
"daysLeft_other": "({{count}} days left)",
"eventsSelected_one": "{{count}} event selected",
"eventsSelected_other": "{{count}} events selected",
"paginationLabel": "{{from}}{{to}} of {{total}}",
"filtered": "filtered",
"pageOf": "Page {{page}} of {{totalPages}}",
"notFound": "Event not found",
"customerPhone": "Customer Phone",
"customerPhonePlaceholder": "+1 555 555 1234",
"allowPresignedDownload": "Allow direct S3 download (no watermark, S3 mode only)",
"neverExpires": "Never",
"rightClickBlocked": "Right-click blocked",
"devtoolsDetection": "DevTools detection",
"watermarked": "Watermarked",
"importExternal": "Import from External Folder",
"externalImportInfo": "All pictures from the selected folder will be imported.",
"selectExternalFolder": "Select external folder under /external-media",
"importFromSelectedFolder": "Import from selected folder"
},
"settings": {
"title": "System Settings",
"subtitle": "Configure system-wide settings and preferences",
"loadingSettings": "Loading 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)",
"maxFilesPerUpload": "Max Files per Upload",
"maxFilesPerUploadHelp": "Maximum number of photos allowed in a single upload batch (1-{{max}}).",
"allowedFileTypes": "Allowed File Types",
"allowedFileTypesHelp": "Comma-separated list of file extensions",
"featureToggles": "Feature Toggles",
"enableAnalytics": "Enable analytics tracking",
"enableRegistration": "Allow self-registration for admins",
"enableShortGalleryUrls": "Use short gallery URLs",
"enableShortGalleryUrlsHelp": "Removes the event slug from new share links while keeping existing links working.",
"maintenanceMode": "Enable maintenance mode",
"language": "Language",
"defaultLanguageHelp": "Language shown to guests before login",
"saveGeneralSettings": "Save General Settings",
"dateTimeFormat": "Date & Time Format",
"dateFormat": "Date Format",
"dateFormatHelp": "How dates are displayed in emails and throughout the application",
"accountSection": "Admin Account",
"accountUsername": "Admin Username",
"accountUsernameHelp": "Displayed in the admin interface and used in activity logs.",
"accountUsernameRequired": "Username is required",
"accountUsernameLength": "Username must be at least 3 characters",
"accountEmail": "Admin Email",
"accountEmailHelp": "Used for login and receiving security notifications.",
"accountEmailRequired": "Email address is required",
"accountEmailInvalid": "Enter a valid email address",
"accountSaveButton": "Save account details",
"accountSaveSuccess": "Account details updated"
},
"publicSite": {
"badge": "Public Landing",
"title": "Public Landing Page",
"subtitle": "Publish a customized landing page for guests when they visit your domain.",
"loading": "Loading public site settings...",
"enabled": "Enabled",
"disabled": "Disabled",
"htmlLabel": "Landing Page HTML",
"htmlPlaceholder": "Provide the HTML markup for your landing page hero, sections, and calls to action.",
"htmlHelp": "Raw HTML is sanitized on save. Unsafe tags, inline scripts, and disallowed attributes are removed automatically. Tokens such as {{company_name}}, {{company_tagline}}, and {{support_email}} will be substituted with values from Branding settings.",
"cssLabel": "Custom CSS",
"cssPlaceholder": "Optional CSS overrides to adjust layout, colors, or typography.",
"cssHelp": "Imports and JavaScript URLs are stripped. Use standard CSS selectors to override the default styling.",
"saveCta": "Save public site",
"saving": "Saving...",
"saveSuccess": "Public site settings saved.",
"saveError": "Failed to save public site settings.",
"resetCta": "Reset to default",
"resetting": "Resetting...",
"resetSuccess": "Public site template reset to defaults.",
"resetError": "Failed to reset public site template.",
"previewTitle": "Live Preview",
"previewSandboxed": "Sandboxed preview",
"previewDisabled": "Enable the public site to see the live preview.",
"sanitizationNotice": "Scripts, embedded frames, and unsafe attributes are removed before publishing. Only safe HTML, links, and images are allowed.",
"htmlRequired": "Provide HTML content before enabling the public site."
},
"storage": {
"totalUsed": "Total Used",
"archiveStorage": "Archive Storage",
"storageLimit": "Storage Limit",
"storageLimitHelper": "Set a limit for photo storage usage. This limit is advisory and will highlight when reached.",
"softLimitInputLabel": "Limit (GB)",
"softLimitHelper": "Enter the preferred maximum storage usage in gigabytes.",
"recommendedSoftLimit": "Suggested Limit",
"diskCapacity": "Disk Capacity",
"diskCapacityReported": "Disk Capacity (reported)",
"diskAvailable": "Available",
"diskAvailableReported": "Available (reported)",
"diskFreeReported": "Free (reported)",
"diskMetricsUnavailable": "Disk metrics are not available in Docker Desktop or virtualized environments.",
"applyRecommended": "Use recommended",
"applyAvailable": "Match available",
"invalidSoftLimit": "Enter a valid number for the limit.",
"saveSoftLimit": "Save limit",
"limitNotEnforced": "This limit is advisory only and is not enforced automatically.",
"overrideTitle": "Manual capacity override",
"diskOverrideEnvNote": "Disk capacity is controlled by environment variables and cannot be edited here.",
"diskOverrideSettingsHelp": "Set custom capacity values when Docker reports unrealistic figures.",
"overrideCapacityLabel": "Total capacity (GB)",
"overrideCapacityHelper": "Leave blank to use the automatic reading.",
"overrideAvailableLabel": "Available space (GB)",
"overrideAvailableHelper": "Optional. Leave blank to calculate from total capacity minus used storage.",
"saveOverride": "Save capacity override",
"capacityRequiredForAvailable": "Enter a total capacity before setting available space.",
"availableExceedsCapacity": "Available space cannot exceed the total capacity.",
"storageUsage": "Storage Usage",
"unlimited": "Unlimited"
},
"security": {
"title": "Security",
"passwordSettings": "Password Settings",
"minPasswordLength": "Minimum Password Length",
"passwordComplexity": "Password Complexity",
"passwordComplexityHelp": "Security level required for gallery passwords",
"complexitySimple": "Simple (6+ chars, any text)",
"complexityModerate": "Moderate (8+ chars, mixed case/numbers)",
"complexityStrong": "Strong (12+ chars, uppercase/lowercase/numbers)",
"complexityVeryStrong": "Very Strong (12+ chars, all character types)",
"sessionAuth": "Session & Authentication",
"sessionTimeout": "Session Timeout (minutes)",
"maxLoginAttempts": "Max Login Attempts",
"maxLoginAttemptsHelp": "Maximum failed login attempts per IP before lockout",
"attemptWindowMinutes": "Attempt Window (minutes)",
"attemptWindowMinutesHelp": "How long to look back when counting failed login attempts",
"lockoutDurationMinutes": "Lockout Duration (minutes)",
"lockoutDurationMinutesHelp": "How long the gallery or account stays locked after too many failures",
"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",
"saveSecuritySettings": "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."
},
"systemStatus": {
"title": "System Status",
"storageOverview": "Storage Overview",
"systemInfo": "System Information",
"databaseInfo": "Database Information",
"platform": "Platform",
"nodeVersion": "Node Version",
"uptime": "Uptime",
"cpuCores": "CPU Cores",
"memoryUsage": "Memory Usage",
"memoryUsed": "Memory Used",
"photos": "Photos",
"admins": "Admins",
"dbSize": "Database Size",
"services": "Background Services",
"fileWatcher": "File Watcher",
"fileWatcherDesc": "Monitors for new photos",
"expirationChecker": "Expiration Checker",
"expirationCheckerDesc": "Archives expired galleries",
"emailProcessor": "Email Processor",
"emailProcessorDesc": "Sends queued emails",
"emailQueue": "Email Queue Status",
"pending": "Pending",
"sent": "Sent",
"failed": "Failed",
"lastUpdate": "Last update"
},
"photoDimensions": {
"title": "Photo Dimensions",
"totalPhotos": "Total Photos",
"withDimensions": "With Dimensions",
"missingDimensions": "Missing Dimensions",
"repairButton": "Repair Dimensions",
"repairing": "Repairing...",
"noneToRepair": "All photos already have dimensions",
"resultSuccess": "Last repair: {{success}} updated, {{failed}} failed",
"description": "Backfill missing width/height for photos uploaded before dimension tracking was added. Required for Masonry and Mosaic layouts."
},
"updateNotifications": {
"title": "Update Notifications",
"description": "Receive email notifications when new versions of PicPeak are available.",
"enableEmails": "Enable email notifications",
"enableEmailsDesc": "Send email to admins when a new version is available",
"recipients": "Email Recipients",
"recipientsPlaceholder": "[email protected], [email protected]",
"recipientsHelper": "Comma-separated email addresses. Leave empty to send to all admin users.",
"lastNotified": "Last notification sent for version: {{version}}",
"checkNow": "Check & Notify",
"sendTest": "Send Test Email",
"saved": "Settings saved",
"saveError": "Failed to save settings",
"emailFailed": "Failed to send notification",
"checkSuccess": "Notification sent for new version",
"checkNoAction": "No notification needed: {{reason}}",
"checkError": "Failed to check for updates",
"emailSent_one": "Notification email sent to {{count}} recipients",
"emailSent_other": "Notification email sent to {{count}} recipients"
},
"events": {
"title": "Event Creation",
"requiredFields": "Required Fields",
"requiredFieldsDescription": "Configure which contact fields are required when creating new events.",
"requireCustomerName": "Require customer name",
"requireCustomerNameHelp": "Customer name must be provided for new events",
"requireCustomerEmail": "Require customer email",
"requireCustomerEmailHelp": "Customer email must be provided for new events",
"customerEmailWarning": "Required for sending gallery invitations",
"requireAdminEmail": "Require admin email",
"requireAdminEmailHelp": "Admin email must be provided for new events",
"adminEmailWarning": "Required for receiving event notifications",
"requireEventDate": "Require event date",
"requireEventDateHelp": "Event date must be provided when creating events",
"eventDateWarning": "Gallery URLs will use random identifiers instead of dates",
"requireExpiration": "Require expiration date",
"requireExpirationHelp": "Galleries must have an expiration date",
"expirationWarning": "Galleries without expiration will remain active until manually archived",
"saveSettings": "Save Event Settings",
"noteTitle": "Note",
"noteText": "These settings only affect new event creation. Existing events are not affected. Default behavior requires all fields.",
"defaultRequirePassword": "Require password by default",
"defaultRequirePasswordHelp": "Pre-check \"Require password\" when creating new events. Disable for quicker creation of public galleries.",
"showGalleryFilterBar": "Show filter bar in galleries",
"showGalleryFilterBarHelp": "Display the search-by-filename and sort controls above grid-layout galleries. Disable for a cleaner layout.",
"enablePhoneField": "Enable phone number field",
"enablePhoneFieldHelp": "Adds an optional phone number input to the event form. Useful for downstream automations like WhatsApp delivery via n8n. Always optional even when enabled."
},
"imageSecurity": {
"title": "Image Protection",
"saveSuccess": "Image security settings saved",
"saveError": "Failed to save settings",
"loadError": "Failed to load image security settings",
"defaultProtection": "Default Protection Settings",
"defaultProtectionHelp": "These settings apply to all new events. Individual events can override these defaults.",
"protectionLevel": "Default Protection Level",
"imageQuality": "Default Image Quality",
"fragmentationLevel": "Fragmentation Level",
"enableDevtools": "Enable DevTools detection by default",
"enableCanvas": "Enable canvas rendering by default (advanced protection)",
"rateLimiting": "Rate Limiting",
"rateLimitingHelp": "Limit how many images can be requested to prevent scraping.",
"requestsPerMinute": "Requests per minute",
"requestsPer5Minutes": "Requests per 5 min",
"requestsPerHour": "Requests per hour",
"securityMonitoring": "Security Monitoring",
"suspiciousThreshold": "Suspicious activity threshold",
"autoBlockThreshold": "Auto-block threshold",
"enableMonitoring": "Enable security monitoring",
"blockSuspiciousIps": "Automatically block suspicious IPs",
"logEvents": "Log security events to database",
"infoTitle": "About Image Protection",
"infoText": "These protection features help prevent casual downloading and copying but cannot block all methods. Determined users may still find ways to capture images. Consider using watermarks and legal agreements for comprehensive protection."
},
"moderation": {
"title": "Moderation",
"wordFilters": "Word Filters",
"description": "Manage words that should be filtered or blocked in comments",
"addFilter": "Add New Filter",
"enterWord": "Enter word to filter",
"searchFilters": "Search filters...",
"filterAdded": "Word filter added successfully",
"filterExists": "This word filter already exists",
"addError": "Failed to add word filter",
"filterUpdated": "Word filter updated successfully",
"updateError": "Failed to update word filter",
"filterDeleted": "Word filter deleted successfully",
"deleteError": "Failed to delete word filter",
"wordRequired": "Please enter a word to filter",
"confirmDelete": "Are you sure you want to delete this word filter?",
"loading": "Loading word filters...",
"noMatchingFilters": "No matching filters found",
"noFilters": "No word filters configured yet",
"severityLow": "Low",
"severityModerate": "Moderate",
"severityHigh": "High",
"severityBlock": "Block",
"severityLevels": "Severity Levels",
"lowDescription": "Word is flagged for review but not automatically blocked",
"moderateDescription": "Comment requires manual approval before being visible",
"highDescription": "Comment is automatically hidden and requires admin review",
"blockDescription": "Comment is rejected immediately and cannot be submitted"
},
"styling": {
"title": "Custom CSS"
},
"thumbnails": {
"title": "Thumbnails",
"dimensionsTitle": "Thumbnail Dimensions & Quality",
"dimensionsHelp": "Configure the size and quality of auto-generated thumbnails. Higher values produce better-looking previews but increase storage and load times.",
"width": "Width (px)",
"widthHelp": "50-1000 pixels",
"height": "Height (px)",
"heightHelp": "50-1000 pixels",
"quality": "Quality",
"qualityHelp": "1-100, higher = better quality but larger files",
"format": "Format",
"fit": "Fit Mode",
"fitHelp": "How images are resized to fit the thumbnail dimensions. \"Cover\" crops to fill, \"Contain\" fits within bounds.",
"regenerateTitle": "Regenerate Thumbnails",
"regenerateHelp": "After changing thumbnail settings, regenerate all existing thumbnails to apply the new configuration. This runs in the background and may take a while for large galleries.",
"regenerateButton": "Regenerate All Thumbnails",
"regenerateStarted": "Thumbnail regeneration started",
"regenerateError": "Failed to start thumbnail regeneration",
"saveSuccess": "Thumbnail settings saved",
"saveError": "Failed to save thumbnail settings",
"loadError": "Failed to load thumbnail settings",
"infoTitle": "About Thumbnails",
"infoText": "Thumbnails are smaller preview images generated from your originals. Increasing the size or quality improves how photos look in the gallery grid but uses more storage and bandwidth. After changing settings, use \"Regenerate All Thumbnails\" to update existing photos."
},
"seo": {
"title": "SEO & Robots",
"indexingTitle": "Search Engine Indexing",
"allowIndexing": "Allow search engine indexing",
"allowIndexingHelp": "When disabled, all crawlers are blocked via robots.txt. Recommended off for private photo platforms.",
"sitemapUrl": "Sitemap URL",
"sitemapUrlHelp": "Optional. Added to robots.txt if provided.",
"aiBlockingTitle": "AI & Bot Blocking",
"blockAiCrawlers": "Block AI/LLM crawlers",
"blockAiCrawlersHelp": "Prevent AI training bots from accessing your content.",
"blockedAgents": "Blocked AI agents",
"addAgentPlaceholder": "Enter agent name...",
"blockSocialBots": "Block social media preview bots",
"blockSocialBotsHelp": "Prevent link previews on Twitter, Facebook, LinkedIn, etc.",
"metaTagsTitle": "Meta Tags & Custom Rules",
"metaNoindex": "Add noindex meta tag",
"metaNoindexHelp": "Tells search engines not to index pages (HTML-level, complements robots.txt).",
"metaNofollow": "Add nofollow meta tag",
"metaNofollowHelp": "Tells search engines not to follow links on pages.",
"metaNoai": "Add noai/noimageai meta tag",
"metaNoaiHelp": "Signals that content should not be used for AI training.",
"customRules": "Custom robots.txt rules",
"ruleAgentPlaceholder": "User-agent",
"rulePathPlaceholder": "Disallow path",
"showPreview": "Show robots.txt preview",
"hidePreview": "Hide robots.txt preview",
"saveSettings": "Save SEO Settings"
},
"analytics": {
"title": "Analytics",
"umamiIntegration": "Umami Analytics Integration",
"enableUmami": "Enable Umami Analytics",
"umamiUrl": "Umami URL",
"umamiUrlHelp": "The URL of your Umami instance (e.g., https://analytics.yourdomain.com)",
"websiteId": "Website ID",
"websiteIdHelp": "Your Umami website ID (found in Umami dashboard)",
"shareUrl": "Share URL (Optional)",
"shareUrlHelp": "Public share URL for embedding the full dashboard (create in Umami)",
"umamiInfo": "About Umami Analytics",
"umamiInfoText": "Umami is a privacy-focused, open-source analytics platform. It tracks page views, unique visitors, and custom events without using cookies.",
"learnMore": "Learn more about Umami",
"saveAnalyticsSettings": "Save Analytics Settings",
"backendAnalytics": "Backend Analytics",
"backendAnalyticsText": "The system also tracks basic analytics server-side for security and performance monitoring.",
"tracked": "Tracked Metrics",
"galleryViews": "Gallery page views",
"photoDownloads": "Individual and bulk downloads",
"uniqueVisitors": "Unique visitors by IP",
"deviceTypes": "Device types from user agents",
"privacy": "Privacy",
"privacyText": "IP addresses are hashed for privacy. No personal data is stored. Analytics data is retained for 90 days."
},
"groups": {
"general": "General",
"display": "Display",
"privacySecurity": "Privacy & Security",
"integrations": "Integrations",
"system": "System"
},
"apiTokens": {
"title": "API Tokens",
"createError": "Failed to create token",
"revoked": "Token revoked",
"subtitle": "Long-lived bearer tokens for the public /api/v1 surface — n8n integrations, custom apps, scripts. Tokens act as the admin user that minted them, intersected with the chosen scopes.",
"copyNow": "Copy this token now — it will not be shown again.",
"copied": "Copied",
"copyFailed": "Copy failed",
"name": "Name",
"namePlaceholder": "e.g. n8n production",
"scopes": "Scopes",
"generate": "Generate Token",
"scopeHint": "admin > write > read. A read-only token cannot mutate, even if its owner is super_admin.",
"existing": "Existing tokens",
"lastUsed": "Last used",
"created": "Created",
"status": "Status",
"statusRevoked": "Revoked",
"statusExpired": "Expired",
"statusActive": "Active",
"confirmRevoke": "settings.apiTokens.confirmRevoke",
"revoke": "Revoke",
"empty": "No tokens yet. Generate one above to get started."
},
"webhooks": {
"title": "Webhooks",
"subtitle": "POST event notifications to your URL the moment something happens — gallery published, photo uploaded, event archived, etc. Signed with HMAC-SHA256 in the X-PicPeak-Signature header.",
"piiNotice": "event.* payloads include customer contact info (name, email, phone) and the gallery share token if you have stored them. Only point webhooks at receivers you trust — they have everything needed to message the customer or open the gallery.",
"copyNow": "Copy this signing secret now — it will not be shown again.",
"name": "Name",
"url": "Receiver URL",
"events": "Subscribe to events",
"filter": "Filter (JSON, optional)",
"template": "Template (optional)",
"create": "Create Webhook",
"existing": "Existing webhooks",
"empty": "No webhooks yet. Create one above to start receiving event notifications."
},
"sectionLabel": "Settings section",
"navAriaLabel": "Settings navigation"
},
"analytics": {
"title": "Analytics Dashboard",
"subtitle": "Track gallery performance and visitor engagement",
"detailedSubtitle": "Detailed analytics powered by Umami",
"loadingAnalytics": "Loading analytics...",
"showSummaryView": "Show Summary View",
"fullDashboard": "Full Dashboard",
"refresh": "Refresh",
"last7Days": "Last 7 days",
"last30Days": "Last 30 days",
"last90Days": "Last 90 days",
"pageViews": "Page Views",
"uniqueVisitors": "Unique Visitors",
"totalDownloads": "Total Downloads",
"topGallery": "Top Gallery",
"topPages": "Top Pages",
"views": "views",
"visitors": "unique visitors",
"topDownloadsByGallery": "Top Downloads by Gallery",
"deviceBreakdown": "Device Breakdown",
"desktop": "Desktop",
"mobile": "Mobile",
"tablet": "Tablet",
"storageUsage": "Storage Usage",
"used": "Used",
"of": "of",
"totalPhotos": "Total Photos",
"activeEvents": "Active Events",
"notConfigured": "Umami Analytics Not Configured",
"configureInstructions": "To see real analytics data, configure Umami in your environment variables and admin panel settings."
},
"branding": {
"title": "Branding & Themes",
"subtitle": "Customize the look and feel of your galleries",
"loadingBranding": "Loading branding settings...",
"themeAndStyle": "Theme & Style",
"companyInfo": "Company Information",
"companyName": "Company Name",
"companyNameHelp": "Displayed in gallery headers and emails",
"companyTagline": "Company Tagline",
"companyTaglineHelp": "A short description of your business",
"supportEmail": "Support Email",
"supportEmailHelp": "Contact email for guest support",
"footerText": "Footer Text",
"logo": "Logo",
"uploadLogo": "Upload Logo",
"logoHelp": "Recommended size: 200x60px, PNG or JPEG",
"favicon": "Favicon",
"currentFavicon": "Current favicon",
"uploadFavicon": "Upload Favicon",
"removeFavicon": "Remove Favicon",
"faviconHelp": "PNG or ICO format, recommended size: 32x32px",
"watermarkSettings": "Watermark Settings",
"enableWatermarks": "Enable Watermarks",
"watermarkHelp": "Add your company name as a watermark on downloaded photos",
"watermarkLogo": "Watermark Logo",
"currentWatermark": "Current watermark",
"uploadWatermarkLogo": "Upload Watermark Logo",
"watermarkPosition": "Watermark Position",
"topLeft": "Top Left",
"topRight": "Top Right",
"center": "Center",
"bottomLeft": "Bottom Left",
"bottomRight": "Bottom Right",
"watermarkOpacity": "Watermark Opacity",
"watermarkSize": "Watermark Size",
"theme": "Theme",
"galleryTheme": "Gallery Theme",
"colors": "Colors",
"accentColor": "Accent Color",
"backgroundColor": "Background Color",
"textColor": "Text Color",
"colorMode": "Color Mode",
"colorModeLight": "Light",
"colorModeDark": "Dark",
"colorModeAuto": "Auto",
"colorModeHelp": "Auto follows the visitor's system preference.",
"preview": "Preview",
"saveChanges": "Save Changes",
"applyLivePreview": "Apply changes immediately (Live Preview)",
"eventSpecificThemes": "Event-Specific Themes",
"eventThemesInfo": "You can override these global theme settings for individual events when creating or editing them.",
"themePresets": "Theme Presets",
"galleryLayout": "Gallery Layout",
"layoutSettings": "Layout Settings",
"photoSpacing": "Photo Spacing",
"spacing": {
"tight": "Tight",
"normal": "Normal",
"relaxed": "Relaxed"
},
"photoAnimation": "Photo Animation",
"animation": {
"none": "None",
"fade": "Fade",
"scale": "Scale",
"slide": "Slide"
},
"columns": "Columns",
"mobile": "Mobile",
"tablet": "Tablet",
"desktop": "Desktop",
"enableAutoplay": "Enable Autoplay",
"autoplayInterval": "Autoplay Interval (seconds)",
"groupPhotosBy": "Group Photos By",
"grouping": {
"day": "Day",
"week": "Week",
"month": "Month"
},
"masonryMode": "Layout Mode",
"masonryModeOptions": {
"columns": "Columns (Pinterest-style)",
"rows": "Rows (Custom justified)",
"flickr": "Flickr (Battle-tested justified)",
"justified": "Google Photos (Knuth-Plass algorithm)"
},
"masonryModeHint": {
"columns": "Pinterest-style vertical columns with varied heights",
"rows": "Custom row-based justified layout",
"flickr": "Flickr's open-source justified layout algorithm",
"justified": "Google Photos-style rows using Knuth-Plass algorithm for optimal breaks"
},
"targetRowHeight": "Target Row Height",
"targetRowHeightHint": "Height in pixels (150-400). Photos will scale to fit rows.",
"lastRowBehavior": "Last Row Alignment",
"lastRowOptions": {
"left": "Left aligned",
"center": "Centered",
"justify": "Justified (stretch)"
},
"thumbnailScale": "Thumbnail Scale",
"thumbnailScaleOptions": {
"xs": "XS — Most photos",
"sm": "SM — More photos",
"md": "MD — Default",
"lg": "LG — Larger photos",
"xl": "XL — Largest photos"
},
"thumbnailScaleHint": "Adjusts column count relative to the base grid columns",
"typographyAndStyle": "Typography & Style",
"bodyFont": "Body Font",
"headingFont": "Heading Font",
"sameAsBody": "Same as body",
"fontSize": "Font Size",
"fontSizes": {
"small": "Small",
"normal": "Normal",
"large": "Large"
},
"borderRadius": "Border Radius",
"borderRadiusOptions": {
"none": "None",
"small": "Small",
"medium": "Medium",
"large": "Large"
},
"shadowStyle": "Shadow Style",
"shadowOptions": {
"none": "None",
"subtle": "Subtle",
"normal": "Normal",
"dramatic": "Dramatic"
},
"backgroundPattern": "Background",
"backgroundOptions": {
"none": "None",
"dots": "Dots",
"grid": "Grid",
"waves": "Waves"
},
"customCSSHelp": "Advanced: Add custom CSS to further customize the appearance",
"cssInstructions": {
"title": "How to use Custom CSS",
"variables": "Theme CSS Variables",
"variablesDesc": "Use these CSS variables to match your theme presets:",
"layouts": "Custom Gallery Layouts",
"layoutsDesc": "Target gallery elements with these selectors:",
"glassEffect": "Glassmorphism Effect",
"glassEffectDesc": "Create modern glass effects:",
"tip": "Tip",
"tipText": "Use CSS Templates from Settings > CSS Templates for pre-built designs like Apple Liquid Glass."
},
"resetToDefault": "Reset to Default",
"applyTheme": "Apply Theme",
"saveTheme": "Save Theme",
"previewLayout": "Preview Layout",
"livePreview": "Live Preview",
"heroPlaceholderText": "Your event's hero photo will appear here",
"whiteLabel": "White Label",
"hidePoweredBy": "Hide \"Powered by PicPeak\" branding",
"hidePoweredByHelp": "Remove the PicPeak attribution from gallery footers for a fully white-labeled experience",
"logoCustomization": "Logo Customization",
"changeLogo": "Change Logo",
"logoSizeSmall": "Small (32px)",
"logoSizeMedium": "Medium (48px)",
"logoSizeLarge": "Large (64px)",
"logoSizeXLarge": "Extra Large (96px)",
"logoSizeCustom": "Custom",
"logoMaxHeight": "Maximum Height (pixels)",
"logoMaxHeightHelp": "Set a custom maximum height for the logo (20-200 pixels)",
"logoPosition": "Logo Position in Header",
"logoDisplayMode": "Display Mode",
"logoOnly": "Logo Only",
"textOnly": "Company Name Only",
"logoAndText": "Logo and Company Name",
"showLogoInHeader": "Show logo in gallery header",
"showLogoInHeaderHelp": "Display the logo in the main header bar",
"showLogoInHero": "Show logo in hero section",
"showLogoInHeroHelp": "Display the logo in hero sections (for non-grid layouts)",
"headerStyle": "Header Style",
"headerStyleDescription": "Choose how the gallery header appears. The header style is independent of the photo layout.",
"heroDividerStyle": "Divider Style",
"heroDividerDescription": "Choose how the transition between the hero image and gallery content looks.",
"controlsStyle": "Controls Style",
"controlsStyleDescription": "Choose how gallery filters and controls are displayed.",
"controlsStyleOptions": {
"classic": "Classic",
"sidebar": "Sidebar"
},
"controlsStyleDescriptions": {
"classic": "Inline filter bar below header",
"sidebar": "Menu button opens sidebar with filters"
},
"controlsStyleHeroWarning": "Sidebar is recommended for hero headers to prevent controls appearing above the hero image.",
"betaThumbnailWarningTitle": "Low thumbnail resolution detected",
"betaThumbnailWarningText": "Your thumbnails are currently {{width}}×{{height}}px. Beta themes display photos at larger sizes and require at least {{recommended}}×{{recommended}}px for good quality. Increase the thumbnail dimensions in Settings > Thumbnails and regenerate.",
"betaThumbnailWarningLink": "Go to Thumbnail Settings",
"logoSize": "Logo Size",
"surfaceColor": "Surface",
"elevatedColor": "Elevated",
"borderColor": "Border",
"mutedTextColor": "Muted text",
"accentDarkColor": "Accent (filled)",
"syncFromBranding": "Sync from Branding",
"forceColorMode": "Force color mode",
"forceColorModeHelp": "Lock the entire admin and public site to dark or light. The user-facing dark/light toggle is hidden whenever a lock is active. Per-event themes that try to override the colour mode are also forced to follow.",
"forceColorModeNone": "No force (user choice)",
"forceColorModeDark": "Force dark",
"forceColorModeLight": "Force light",
"colorGroupSurfaces": "Surfaces",
"colorGroupSurfacesHelp": "The neutral layers behind your content. Background sits furthest back; Surface and Elevated stack on top.",
"backgroundColorHelp": "The page itself — body background of every gallery, admin page and CMS page.",
"surfaceColorHelp": "Cards, sidebar, header bar and navigation. The first layer above Background.",
"elevatedColorHelp": "Panels that float above cards: image placeholders, hover/active rows, modal headers, code blocks.",
"borderColorHelp": "Dividers, table grid lines, card outlines, input borders.",
"colorGroupText": "Text",
"colorGroupTextHelp": "Foreground text colours. Primary is for everything readers focus on; Secondary is for supporting copy.",
"textColorHelp": "Headlines, body copy, table cells, form input values, navigation labels — the main text colour.",
"mutedTextColorHelp": "Captions, helper text under inputs, table column headers, footer links, dates and metadata.",
"colorGroupAccent": "Accent",
"colorGroupAccentHelp": "Brand colours that highlight interactive elements. Use a strong colour pair — Accent is for outlines/text, Accent Dark is for filled buttons.",
"accentColorHelp": "Links, icons, focus rings, hover states on primary buttons, active sidebar item underline. Should read clearly on both Background and Surface.",
"accentDarkColorHelp": "Filled CTA buttons, active sidebar item background, badges and tags. Needs enough contrast for white text to be readable on top.",
"cssTemplate": "CSS Template",
"cssTemplateDescription": "Select a pre-built CSS template to apply application-wide styling to this gallery. Templates can be managed in Settings > CSS Templates.",
"noTemplate": "No Template",
"noTemplateDescription": "Use only theme settings without a CSS template",
"templateSlot": "Slot {{slot}}",
"eventCustomCSS": "Event-specific Custom CSS"
},
"admin": {
"title": "Admin Panel",
"recentActivity": "Recent Activity",
"storageUsed": "Storage Used",
"totalPhotos": "Total Photos",
"storagePercent": "{{percent}}% of limit {{limit}}",
"storageSoftLimitConfigured": "Configured limit: {{limit}}",
"storageSoftLimitRecommended": "Suggested limit: {{limit}}",
"version": "Version",
"archivedEvents": "Archived Events",
"systemHealth": "System Health",
"health": {
"checking": "Checking..."
},
"updates": {
"available": "Update Available",
"newVersion": "Version {{version}} is available",
"currentVersion": "Current: {{version}}",
"channel": "Channel: {{channel}}",
"channelStable": "Stable",
"channelBeta": "Beta",
"beta": "BETA",
"viewReleaseNotes": "View Release Notes",
"updateAvailableShort": "v{{version}} available",
"upToDate": "You're up to date",
"updateNow": "Update Now",
"updateDialog": {
"title": "Update PicPeak",
"detectedEnv": "Detected Environment",
"beforeUpdating": "Before updating:",
"updateCommands": "Update Commands:",
"afterUpdating": "After updating:",
"copyAllCommands": "Copy All Commands",
"completeChecklist": "Complete the checklist before updating",
"error": "Failed to load update instructions"
}
},
"notifications": "Notifications",
"markAllRead": "Mark all read",
"clearAll": "Clear all",
"close": "Close",
"noNotificationsMessage": "No notifications",
"notificationMessages": {
"eventCreated": "New event \"{{eventName}}\" was created",
"eventArchived": "Event \"{{eventName}}\" was archived",
"eventUpdated": "Event \"{{eventName}}\" was updated",
"eventDeleted": "Event \"{{eventName}}\" was deleted",
"photoDeleted": "Photo deleted from \"{{eventName}}\"",
"eventExpiring": "Event \"{{eventName}}\" expires in {{days}} days",
"eventExpired": "Event \"{{eventName}}\" has expired",
"passwordChanged": "Password changed by {{actorName}}",
"passwordReset": "Password reset for \"{{eventName}}\"",
"settingsUpdated": "{{type}} settings updated",
"emailTemplateUpdated": "Email template \"{{template}}\" updated",
"storageWarning": "Storage usage at {{percentage}}%",
"adminLogout": "Admin {{actorName}} logged out",
"categoryCreated": "Category \"{{name}}\" created for \"{{eventName}}\"",
"categoryUpdated": "Category \"{{name}}\" updated for \"{{eventName}}\"",
"categoryDeleted": "Category \"{{name}}\" deleted from \"{{eventName}}\"",
"cmsPageUpdated": "CMS page \"{{slug}}\" updated",
"emailConfigUpdated": "Email configuration updated",
"faviconUploaded": "Favicon uploaded",
"brandingUpdated": "Branding settings updated",
"generalSettingsUpdated": "General settings updated",
"securitySettingsUpdated": "Security settings updated",
"themeUpdated": "Theme settings updated",
"archiveDownloaded": "Archive downloaded for \"{{eventName}}\"",
"archiveDeleted": "Archive deleted for \"{{eventName}}\"",
"archiveRestored": "Archive restored for \"{{eventName}}\"",
"systemActivity": "System activity: {{type}}",
"adminProfileUpdated": "Admin profile updated by {{actorName}}",
"photosUploaded_one": "{{count}} photo uploaded to \"{{eventName}}\"",
"photosUploaded_other": "{{count}} photos uploaded to \"{{eventName}}\"",
"photosBulkDeleted_one": "{{count}} photo deleted from \"{{eventName}}\"",
"photosBulkDeleted_other": "{{count}} photos deleted from \"{{eventName}}\"",
"bulkDownload_one": "{{count}} photo downloaded from \"{{eventName}}\"",
"bulkDownload_other": "{{count}} photos downloaded from \"{{eventName}}\""
},
"notificationToasts": {
"markedAllRead": "All notifications marked as read",
"clearedAll_one": "Cleared {{count}} notification",
"clearedAll_other": "Cleared {{count}} notifications"
},
"changePassword": "Change Password",
"darkMode": "Switch to dark mode",
"lightMode": "Switch to light mode",
"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",
"noRecentActivity": "No recent activity",
"photos": {
"hidden": "Hidden",
"hideSelected": "Hide",
"showSelected": "Show",
"hiddenSuccess": "Photos hidden from guests",
"visibleSuccess": "Photos now visible to guests",
"processingStatus": "Processing…",
"processingFailed": "Failed",
"retryQueued": "Retry queued"
},
"events": {
"tabs": {
"guests": "Guests"
}
},
"daysLeft_one": "{{count}} day left",
"daysLeft_other": "{{count}} days left",
"viewAllExpiringEvents_one": "View all {{count}} expiring events",
"viewAllExpiringEvents_other": "View all {{count}} expiring events",
"guests": {
"loading": "Loading...",
"aggregate": {
"empty": "No guest picks yet.",
"description": "Photos sorted by how many distinct guests liked or favorited them."
},
"inviteCreated": "Invite created",
"inviteCreateError": "Failed to create invite",
"inviteRevoked": "Invite revoked",
"inviteRevokeError": "Failed to revoke invite",
"invitesTitle": "Guest invites",
"createInvite": "Create invite",
"inviteName": "Guest name",
"inviteEmail": "Email (optional)",
"generateInvite": "Generate invite link",
"existingInvites": "Existing invites",
"noInvites": "No invites yet",
"copyLink": "Copy link",
"revokeInvite": "Revoke",
"deletedToast": "Guest removed",
"deletedError": "Failed to remove guest",
"mergedToast": "Guests merged",
"mergedError": "Failed to merge guests",
"forgetGuestConfirm": "Remove this guest? Their picks will be anonymized but kept in aggregate totals.",
"exportError": "Export failed",
"mergeSelectAtLeastTwo": "Select at least 2 guests to merge",
"mergeConfirm_one": "Merge {{count}} guests into {{name}}? This cannot be undone.",
"mergeConfirm_other": "Merge {{count}} guests into {{name}}? This cannot be undone.",
"backToList": "Back to list",
"title": "Guests",
"mergeSelected_one": "{{count}} selected",
"mergeSelected_other": "{{count}} selected",
"mergeNow": "Merge selected",
"aggregateView": "By popularity",
"mergeMode": "Merge",
"exportAll": "Export all",
"empty": "No guests have registered yet.",
"columns": {
"name": "Name",
"email": "Email",
"likes": "Likes",
"favorites": "Favorites",
"comments": "Comments",
"ratings": "Ratings",
"lastSeen": "Last seen"
},
"view": "View details",
"export": "Export",
"forgetGuest": "Remove guest",
"loadingDetail": "Loading selections...",
"detail": {
"noComments": "No comments",
"empty": "No selections in this category"
}
}
},
"acceptInvitation": {
"title": "Accept Invitation",
"subtitle": "Create your admin account",
"validating": "Validating invitation...",
"invalidToken": "Invalid Invitation",
"invalidTokenMessage": "This invitation link is invalid or has expired. Please contact your administrator for a new invitation.",
"alreadyUsedMessage": "This invitation has already been used to create an account.",
"invitedAs": "You've been invited as",
"expiresAt": "Invitation expires",
"usernameLabel": "Username",
"usernamePlaceholder": "Choose a username",
"usernameHelp": "3-50 characters, letters, numbers, underscores, and hyphens only",
"passwordLabel": "Password",
"passwordPlaceholder": "Create a strong password",
"confirmPasswordLabel": "Confirm Password",
"confirmPasswordPlaceholder": "Confirm your password",
"passwordStrength": "Password strength",
"requirements": {
"title": "Password requirements:",
"minLength": "At least 12 characters",
"uppercase": "At least one uppercase letter",
"lowercase": "At least one lowercase letter",
"number": "At least one number",
"special": "At least one special character"
},
"strength": {
"weak": "Weak",
"fair": "Fair",
"good": "Good",
"strong": "Strong"
},
"createAccount": "Create Account",
"success": "Account Created!",
"successMessage": "Your account has been created successfully. You can now log in with your credentials.",
"redirecting": "Redirecting to login in {{seconds}}...",
"goToLogin": "Go to Login",
"contactAdminMessage": "Please contact your administrator to request a new invitation.",
"passwordsMatch": "Passwords match",
"alreadyHaveAccount": "Already have an account?",
"signIn": "Sign in",
"errors": {
"usernameRequired": "Username is required",
"usernameTooShort": "Username must be at least 3 characters",
"usernameTooLong": "Username must be at most 50 characters",
"usernameInvalid": "Username can only contain letters, numbers, underscores, and hyphens",
"passwordRequired": "Password is required",
"passwordsDoNotMatch": "Passwords do not match",
"confirmPasswordRequired": "Please confirm your password",
"genericError": "Failed to create account. Please try again."
}
},
"errors": {
"galleryNotFound": "Gallery Not Found",
"galleryNotFoundMessage": "This gallery does not exist or has been removed.",
"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",
"requiredFields": "Please fill in all required fields",
"enterTestEmail": "Please enter a test email address",
"eventCreationFailed": "Failed to create event",
"noShareLink": "No share link available",
"copyFailed": "Failed to copy link"
},
"validation": {
"eventNameRequired": "Event name is required",
"hostEmailRequired": "Customer email is required",
"hostNameRequired": "Customer name is required",
"adminEmailRequired": "Admin email is required",
"invalidEmailFormat": "Invalid email format",
"passwordRequired": "Password is required",
"passwordMinLength": "Password must be at least 6 characters",
"passwordsDoNotMatch": "Passwords do not match",
"expirationRange": "Expiration must be between 1 and 365 days",
"required": "This field is required",
"expirationRequired": "Expiration date is required.",
"eventDateRequired": "validation.eventDateRequired",
"passwordTooSimple": "Password cannot be just numbers. Consider using a date format like \"04.07.2025\""
},
"legal": {
"impressum": "Legal Notice",
"datenschutz": "Privacy 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",
"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",
"categoryUpdated": "Category updated successfully",
"emailConfigSaved": "Email configuration saved successfully",
"brandingThemeMissing": "No branding theme has been saved yet.",
"brandingPaletteSynced": "Palette synced from Branding."
},
"email": {
"title": "Email Configuration",
"subtitle": "Configure email settings for notifications",
"loadingSettings": "Loading email settings...",
"smtpConfiguration": "SMTP Configuration",
"smtpHost": "SMTP Host",
"fromEmail": "From Email",
"fromName": "From Name",
"emailTemplates": "Email Templates",
"smtpSettings": "SMTP Settings",
"testEmailSuccess": "Test email sent successfully",
"saveSmtpSettings": "Save SMTP Settings",
"testEmailSection": "Test Email",
"beforeTesting": "Before testing:",
"saveSmtpFirst": "Save your SMTP settings first",
"ensureFirewall": "Ensure your firewall allows outbound SMTP",
"gmailAppPassword": "For Gmail, use an app-specific password",
"testEmailAddressLabel": "Test Email Address",
"sendTestEmailButton": "Send Test Email",
"commonSmtpSettings": "Common SMTP Settings:",
"editTemplate": "Edit Template",
"templateName": "Template Name",
"subjectLine": "Subject Line",
"emailBody": "Email Body",
"preview": "Preview",
"save": "Save",
"templates": "Templates",
"port": "Port",
"security": "Security",
"username": "Username",
"password": "Password",
"enterPassword": "Enter password",
"ignoreSslErrors": "Ignore SSL/TLS certificate errors",
"ignoreSslWarning": "Warning: Disabling certificate verification makes the connection vulnerable to man-in-the-middle attacks. Only enable this if you trust the SMTP server and understand the security implications.",
"brandingTitle": "Email Branding",
"brandingDescription": "Customize the colors used in email templates. Changes apply to the header bar, buttons, links, and footer background.",
"primaryColor": "Primary Color",
"secondaryColor": "Footer Background",
"saveEmailColors": "Save Email Colors",
"editor": {
"bold": "Bold",
"italic": "Italic",
"bulletList": "Bullet List",
"numberedList": "Numbered List",
"blockquote": "Blockquote",
"link": "Add Link",
"horizontalRule": "Horizontal Rule",
"alignLeft": "Align Left",
"alignCenter": "Align Center",
"alignRight": "Align Right",
"clearFormatting": "Clear Formatting",
"undo": "Undo",
"redo": "Redo",
"insertVariable": "Insert Variable",
"sourceMode": "Source",
"visualMode": "Visual",
"enterUrl": "Enter URL...",
"addLink": "Add",
"cancel": "Cancel"
},
"copiedFromLanguage": "Copied content from {{language}}",
"noTranslation": "No translation yet",
"noTranslationYet": "No translation exists for this language yet. Copy from an existing language to get started:",
"copyFrom": "Copy from",
"syncedFromBranding": "Email colours synced from Branding. Click Save to apply.",
"syncFromBranding": "Sync from Branding",
"primaryColorHelp": "Header bar, H2 headings, button background, link colour. Maps to Branding → Accent (filled).",
"secondaryColorHelp": "Footer bar background. Maps to Branding → Surface.",
"bodyBgColor": "Page background",
"bodyBgColorHelp": "The wrapper around the email card — what the recipient sees behind the email itself. Maps to Branding → Background.",
"containerBgColor": "Email card",
"containerBgColorHelp": "The white card that holds the email content. Maps to Branding → Surface.",
"listBgColor": "Info panel",
"listBgColorHelp": "Background of the bulleted info panels inside the email body. Maps to Branding → Elevated.",
"bodyTextColor": "Body text",
"bodyTextColorHelp": "Paragraph and bold text colour. Maps to Branding → Primary text.",
"mutedTextColor": "Footer text",
"mutedTextColorHelp": "Footer text and copyright line. Maps to Branding → Secondary text.",
"buttonTextColor": "Button text",
"buttonTextColorHelp": "Text colour on filled buttons. Should contrast cleanly against the Primary colour. No Branding equivalent — usually white."
},
"cms": {
"title": "CMS Pages",
"subtitle": "Manage legal and informational pages",
"loadingPages": "Loading pages...",
"pages": "Pages",
"previewLinks": "Preview Links",
"englishVersion": "English Version",
"germanVersion": "German Version",
"editPage": "Edit {{page}}",
"pageTitle": "Page Title",
"pageContent": "Page Content",
"pageTitlePlaceholder": "Enter page title...",
"lastUpdated": "Last updated:",
"pageUpdated": "Page updated successfully",
"useExternalUrl": "Use external URL",
"useExternalUrlHelp": "Redirect visitors to an external page instead of showing the internal content. The internal title and content stay saved as a fallback.",
"externalUrl": "External URL",
"externalUrlPlaceholder": "https://example.com/impressum",
"externalUrlInvalid": "Must be a valid https:// URL",
"externalUrlActive": "External URL is active — internal content is preserved but not shown to visitors.",
"logoUploaded": "Logo uploaded",
"logoCleared": "Logo cleared",
"pageLogo": "Page Logo",
"pageLogoHelp": "Optional. If set, used in place of the global branding logo on this page.",
"noLogo": "no override",
"replaceLogo": "Replace Logo",
"uploadLogo": "Upload Logo",
"clearLogo": "Use site default"
},
"eventTypes": {
"title": "Event Types",
"subtitle": "Customize event types and their default themes",
"loading": "Loading event types...",
"loadError": "Failed to load event types",
"createNew": "New Event Type",
"edit": "Edit Event Type",
"created": "Event type created successfully",
"updated": "Event type updated successfully",
"deleted": "Event type deleted successfully",
"createError": "Failed to create event type",
"updateError": "Failed to update event type",
"deleteError": "Failed to delete event type",
"searchPlaceholder": "Search event types...",
"showInactive": "Show inactive",
"noResults": "No event types found",
"empty": "No event types yet",
"system": "System",
"table": {
"type": "Type",
"slugPrefix": "URL Prefix",
"theme": "Default Theme",
"status": "Status",
"actions": "Actions"
},
"form": {
"name": "Display Name",
"namePlaceholder": "e.g., Family Shoot",
"slugPrefix": "URL Prefix",
"slugPrefixPlaceholder": "e.g., family",
"slugPreview": "Example URL:",
"emoji": "Icon",
"themePreset": "Default Theme",
"isActive": "Active (visible in event creation)"
},
"validation": {
"slugFormat": "Only letters, numbers, and hyphens allowed"
},
"slugInfo": {
"title": "URL Prefix Info:",
"description": "The URL prefix is used to generate gallery URLs. For example, an event type with prefix \"family\" will create URLs like: family-smith-family-2025-01-22"
},
"deleteConfirm": {
"title": "Delete Event Type",
"message": "Are you sure you want to delete",
"warning": "This action cannot be undone. Make sure no events are using this type."
}
},
"backup": {
"title": "Backup Management",
"subtitle": "Manage system backups, configure automated backups, and restore from previous backups.",
"tabs": {
"dashboard": "Dashboard",
"configuration": "Configuration",
"history": "Backup History",
"restore": "Restore"
},
"status": {
"inProgress": "Backup in progress...",
"lastBackup": "Last backup",
"noBackups": "No backups found",
"nextBackup": "Next backup",
"notScheduled": "Not scheduled",
"enabled": "Enabled",
"disabled": "Disabled"
},
"actions": {
"runBackupNow": "Run Backup Now",
"starting": "Starting...",
"testConnection": "Test Connection",
"delete": "Delete",
"view": "View Details",
"download": "Download"
},
"dashboard": {
"health": {
"title": "Backup Health"
},
"healthMessages": {
"noBackups": "No backups found",
"lastBackupFailed": "Last backup failed",
"upToDate": "Backup is up to date",
"recent": "Backup is recent",
"gettingOld": "Backup is getting old",
"outdated": "Backup is outdated"
},
"stats": {
"totalBackups": "Total Backups",
"backupSize": "Backup Size",
"lastDuration": "Last Duration",
"backupStatus": "Backup Status",
"last": "Last",
"files": "files",
"active": "Active",
"inactive": "Inactive",
"noBackupsYet": "No backups yet"
},
"recentActivity": {
"title": "Recent Backup Activity"
},
"notConfigured": {
"title": "Backup Not Configured",
"message": "Please configure backup settings in the Configuration tab before running backups."
},
"actions": {
"runBackupNow": "Run Backup Now",
"running": "Running..."
},
"coverage": {
"title": "Backup Coverage",
"included": "Included",
"excluded": "Excluded"
},
"storageDestination": "Storage Destination",
"backupType": "{{type}} backup",
"noDestinationSet": "No destination set"
},
"configuration": {
"enableBackup": "Enable Automated Backups",
"enableBackupHelp": "Automatically create backups according to the configured schedule",
"destinationType": "Backup Destination",
"destinationTypes": {
"local": {
"name": "Local Storage",
"description": "Store backups on the local server filesystem"
},
"rsync": {
"name": "Remote Server (Rsync)",
"description": "Sync backups to a remote server via SSH/Rsync"
},
"s3": {
"name": "S3 Compatible Storage",
"description": "Store backups in Amazon S3 or compatible object storage"
}
},
"fields": {
"destinationPath": "Destination Path",
"destinationPathHelp": "Local directory path for storing backups",
"destinationPathPlaceholder": "/path/to/backup/directory",
"rsyncHost": "Remote Host",
"rsyncHostPlaceholder": "backup.example.com",
"rsyncUser": "SSH User",
"rsyncUserPlaceholder": "backup-user",
"rsyncPath": "Remote Path",
"rsyncPathPlaceholder": "/home/backup/photo-sharing",
"rsyncSshKey": "SSH Private Key",
"rsyncSshKeyHelp": "SSH private key for authentication (optional)",
"rsyncSshKeyPlaceholder": "-----BEGIN RSA PRIVATE KEY-----",
"s3Endpoint": "S3 Endpoint",
"s3EndpointHelp": "S3 API endpoint (e.g., s3.amazonaws.com)",
"s3Bucket": "Bucket Name",
"s3AccessKey": "Access Key ID",
"s3SecretKey": "Secret Access Key",
"s3Region": "Region"
},
"schedule": {
"title": "Backup Schedule",
"scheduleType": "Schedule Type",
"options": {
"hourly": "Every hour",
"daily": "Daily",
"weekly": "Weekly",
"custom": "Custom cron expression"
},
"customCron": "Cron Expression",
"customCronHelp": "Enter a valid cron expression (e.g., 0 3 * * *)",
"retention": "Retention Period",
"retentionDays": "Keep backups for",
"retentionHelp": "days (older backups will be automatically deleted)"
},
"whatToBackup": {
"title": "What to Backup",
"database": "Database",
"databaseHelp": "All event data, settings, and configurations",
"photos": "Photos",
"photosHelp": "All uploaded photos in active galleries",
"archives": "Archives",
"archivesHelp": "Archived event ZIP files",
"thumbnails": "Thumbnails",
"thumbnailsHelp": "Generated thumbnail images (can be recreated)"
},
"advancedOptions": {
"title": "Advanced Options",
"compression": "Enable Compression",
"compressionHelp": "Compress backup files to save storage space",
"encryption": "Enable Encryption",
"encryptionHelp": "Encrypt backups for additional security",
"encryptionPassphrase": "Encryption Passphrase",
"encryptionPassphraseHelp": "Strong passphrase for backup encryption"
},
"messages": {
"requiredFields": "Please fill in all required fields",
"connectionSuccess": "Connection test successful!",
"connectionFailed": "Connection test failed"
},
"testingConnection": "Testing connection...",
"saveSettings": "Save Configuration",
"savingSettings": "Saving..."
},
"history": {
"searchPlaceholder": "Search backups...",
"columns": {
"status": "Status",
"dateTime": "Date & Time",
"type": "Type",
"size": "Size",
"duration": "Duration",
"actions": "Actions"
},
"details": {
"backupDetails": "Backup Details",
"destination": "Destination",
"started": "Started",
"completed": "Completed",
"contentBackedUp": "Content Backed Up",
"errorDetails": "Error Details",
"manifest": "Manifest"
},
"pagination": {
"showing": "Showing {{from}}-{{to}} of {{total}} backups",
"previous": "Previous",
"next": "Next"
}
},
"restore": {
"steps": {
"selectSource": "Select Source",
"chooseBackup": "Choose Backup",
"restoreOptions": "Restore Options",
"reviewConfirm": "Review & Confirm",
"progress": "Restore Progress"
},
"source": {
"title": "Select Backup Source",
"subtitle": "Choose where to restore the backup from",
"local": {
"name": "Local Backup",
"description": "Restore from local filesystem"
},
"s3": {
"name": "S3 Storage",
"description": "Restore from S3 bucket"
},
"upload": {
"name": "Upload Backup",
"description": "Upload a backup file",
"comingSoon": "Upload functionality coming soon"
},
"configuration": {
"s3": "S3 Configuration",
"endpoint": "S3 Endpoint URL",
"bucket": "Bucket Name",
"accessKey": "Access Key ID",
"secretKey": "Secret Access Key"
}
},
"backup": {
"title": "Choose Backup to Restore",
"subtitle": "Select from available backups",
"noBackupsFound": "No backups found in selected source",
"encrypted": "Encrypted Backup",
"encryptedMessage": "You'll need to provide the encryption passphrase to restore this backup.",
"enterPassphrase": "Enter encryption passphrase",
"at": "at"
},
"restoreTypes": {
"full": {
"name": "Full Restore",
"description": "Restore everything including database, photos, and archives",
"warning": "This will replace all current data"
},
"database": {
"name": "Database Only",
"description": "Restore only the database (settings, events, users)",
"warning": "Current database will be replaced"
},
"files": {
"name": "Files Only",
"description": "Restore only photos and archives",
"warning": "Existing files may be overwritten"
},
"selective": {
"name": "Selective Restore",
"description": "Choose specific items to restore",
"warning": "Only selected items will be restored"
}
},
"options": {
"title": "Restore Options",
"subtitle": "Choose what to restore",
"additionalOptions": {
"title": "Additional Options",
"skipPreBackup": "Skip Pre-Restore Backup",
"skipPreBackupHelp": "By default, a backup is created before restore. Check this to skip it.",
"force": "Force Restore",
"forceHelp": "Override safety checks and warnings (use with caution)"
}
},
"confirmation": {
"title": "Review & Confirm",
"subtitle": "Please review your restore configuration",
"validation": {
"passed": "Validation Passed",
"failed": "Validation Failed",
"checking": "Validating restore configuration..."
},
"spaceCheck": {
"title": "Storage Space",
"required": "Required",
"available": "Available",
"insufficient": "Insufficient storage space"
},
"summary": {
"title": "Restore Summary",
"source": "Source",
"backupDate": "Backup Date",
"restoreType": "Restore Type",
"preBackup": "Pre-backup",
"enabled": "Enabled",
"skipped": "Skipped"
},
"warning": {
"title": "Important Notice",
"message": "This restore operation will replace existing data. Make sure you have a current backup before proceeding. This action cannot be undone."
}
},
"progress": {
"title": "Restore Progress",
"inProgress": "Restore in progress...",
"completed": "Restore completed",
"overallProgress": "Overall Progress",
"current": "Current",
"statusDetails": "Status Details",
"restoreLogs": "Restore Logs",
"success": {
"title": "Restore Completed Successfully",
"message": "Your data has been restored. Please verify everything is working correctly."
}
},
"actions": {
"back": "Back",
"next": "Next",
"startRestore": "Start Restore",
"starting": "Starting...",
"validating": "Validating...",
"startNewRestore": "Start New Restore"
}
},
"messages": {
"backupStarted": "Backup started successfully",
"backupFailed": "Failed to start backup",
"configUpdated": "Backup configuration updated",
"configUpdateFailed": "Failed to update configuration"
}
},
"cssTemplates": {
"title": "Custom CSS Templates",
"template": "Template",
"templateName": "Template Name",
"enableTemplate": "Enable this template",
"enableHint": "Enabled templates can be selected when creating events",
"cssContent": "CSS Content",
"cssHint": "Use .gallery-page to scope styles to the gallery. Available variables: --gallery-bg, --gallery-text, --gallery-accent",
"securityNotice": "Security Notice",
"securityText": "CSS is sanitized to prevent malicious code. External URLs, @import, and JavaScript expressions are blocked.",
"resetToDefault": "Reset to Default",
"resetConfirm": "Reset this template to the default? Your changes will be lost.",
"unsavedChanges": "Unsaved changes",
"saveTemplate": "Save Template",
"lastUpdated": "Last updated",
"saved": "Template saved successfully",
"saveFailed": "Failed to save template",
"sanitizationWarning": "Some CSS patterns were blocked for security",
"reset": "Template reset to default",
"resetFailed": "Failed to reset template"
},
"maintenance": {
"title": "System Maintenance",
"message": "We're currently performing scheduled maintenance to improve our service. We'll be back online shortly.",
"urgentMatters": "For urgent matters, please contact"
},
"passwordChange": {
"title": "Change Password",
"currentPassword": "Current Password",
"newPassword": "New Password",
"confirmPassword": "Confirm New Password",
"currentPasswordPlaceholder": "Enter current password",
"newPasswordPlaceholder": "Enter new password",
"confirmPasswordPlaceholder": "Confirm new password",
"requirements": "Password Requirements:",
"minLength": "At least 6 characters long",
"mustDiffer": "Must be different from current password",
"success": "Password changed successfully",
"failed": "Failed to change password",
"currentRequired": "Current password is required",
"newRequired": "New password is required",
"minLengthError": "Password must be at least 6 characters",
"confirmRequired": "Please confirm your new password",
"noMatch": "Passwords do not match",
"mustBeDifferent": "New password must be different from current password",
"cancel": "Cancel"
},
"mandatoryPasswordChange": {
"title": "Password Change Required",
"description": "For security reasons, you must change your password before accessing the admin panel.",
"success": "Password changed successfully! You can now access the admin panel.",
"minLength": "At least 12 characters long",
"mustContainUpperLower": "Must contain uppercase and lowercase letters",
"mustContainNumbers": "Must contain numbers",
"mustContainSpecial": "Must contain special characters (!@#$%^&*)",
"minLengthError": "Password must be at least 12 characters",
"mustContainLowercase": "Password must contain lowercase letters",
"mustContainUppercase": "Password must contain uppercase letters",
"mustContainNumbersError": "Password must contain numbers",
"mustContainSpecialError": "Password must contain special characters"
},
"offline": {
"backOnline": "Back online",
"noConnection": "No internet connection"
},
"download": {
"downloading": "Downloading...",
"percentComplete": "% complete"
},
"passwordGenerator": {
"weak": "Weak",
"fair": "Fair",
"good": "Good",
"strong": "Strong",
"generating": "Generating...",
"generatePassword": "Generate Password",
"showSuggestions": "Show password suggestions",
"moreOptions": "More Options",
"suggestions": "Password Suggestions",
"characters": "characters",
"copyPassword": "Copy password",
"use": "Use",
"pattern": "Pattern:",
"patternDescription": "Passwords are generated using your event name and date. Example: \"Venue2024$August\" for better security and memorability."
},
"feedback": {
"comments": "Comments",
"addComment": "Add Comment",
"yourName": "Your name",
"yourEmail": "Your email",
"writeComment": "Write a comment...",
"submit": "Submit",
"commentSubmitted": "Comment submitted",
"commentError": "Failed to submit comment",
"rateLimited": "Please wait before commenting again",
"commentRequired": "Comment is required",
"nameRequired": "Name is required",
"emailRequired": "Email is required",
"anonymous": "Anonymous",
"pendingApproval": "Pending approval",
"noComments": "No comments yet. Be the first to comment!",
"rating": "Rating",
"likes": "Likes",
"settings": {
"title": "Guest Feedback Settings",
"enableFeedback": "Enable feedback",
"feedbackTypes": "Feedback Types",
"ratings": "Star Ratings",
"ratingsDesc": "Allow guests to rate photos (1-5 stars)",
"likes": "Likes",
"likesDesc": "Simple like/unlike functionality",
"comments": "Comments",
"commentsDesc": "Text comments on photos",
"favorites": "Favorites",
"favoritesDesc": "Mark photos as favorites",
"identityMode": "Identity Mode",
"identityModeSimple": "Simple feedback",
"identityModeSimpleDesc": "Anonymous, device-based. All visitors on the same device share state.",
"identityModeGuest": "Per-guest selections",
"identityModeGuestDesc": "Each visitor enters their name. Enables per-guest tracking and admin insights.",
"privacyModeration": "Privacy & Moderation",
"requireInfo": "Require Name & Email",
"requireInfoDesc": "Guests must provide name and email to leave feedback",
"moderateComments": "Moderate Comments",
"moderateCommentsDesc": "Comments require approval before being visible",
"showToGuests": "Show Feedback to Guests",
"showToGuestsDesc": "Other guests can see ratings, likes, and approved comments",
"enableRateLimiting": "Enable Rate Limiting",
"rateLimitingDesc": "Prevent spam by limiting feedback frequency",
"timeWindow": "Time Window (minutes)",
"maxRequests": "Max Requests"
},
"settingsUpdated": "Feedback settings updated",
"settingsUpdateError": "Failed to update settings",
"moderated": "Feedback moderated",
"deleted": "Feedback deleted",
"exported": "Feedback exported",
"exportError": "Failed to export feedback",
"title": "Feedback Management",
"exportCSV": "Export CSV",
"exportJSON": "Export JSON",
"tabs": {
"settings": "Settings",
"feedback": "Feedback",
"analytics": "Analytics",
"moderation": "Moderation"
},
"allTypes": "All Types",
"types": {
"rating": "Ratings",
"like": "Likes",
"comment": "Comments",
"favorite": "Favorites"
},
"allStatuses": "All Statuses",
"status": {
"pending": "Pending",
"approved": "Approved",
"hidden": "Hidden"
},
"noFeedback": "No feedback found",
"approve": "Approve",
"hide": "Hide",
"unhide": "Unhide",
"confirmDelete": "Are you sure you want to delete this feedback?",
"avgRating": "Average Rating",
"totalRatings_one": "{{count}} ratings",
"totalRatings_other": "{{count}} ratings",
"totalLikes": "Total Likes",
"totalComments": "Total Comments",
"pendingModeration_one": "{{count}} pending",
"pendingModeration_other": "{{count}} pending",
"totalInteractions": "Total Interactions",
"topRated": "Top Rated Photos",
"recentComments": "Recent Comments",
"wordFilters": "Word Filters",
"wordFiltersDesc": "Manage blocked words for comment moderation",
"manageFilters": "Manage Word Filters",
"manage": "Manage Feedback",
"ratingSubmitted": "Rating submitted",
"ratingError": "Failed to submit rating",
"rateStar_one": "Rate {{count}} stars",
"rateStar_other": "Rate {{count}} stars",
"ratingsCount_one": "{{count}} ratings",
"ratingsCount_other": "{{count}} ratings",
"likeError": "Failed to update like",
"unlike": "Unlike",
"like": "Like",
"favoriteError": "Failed to update favorite",
"unfavorite": "Remove from favorites",
"favorite": "Add to favorites",
"invalidEmail": "Invalid email address",
"identityRequired": "Your Information Required",
"identityReason": "Please provide your name and email to submit {{type}}.",
"namePlaceholder": "Enter your name",
"emailPlaceholder": "Enter your email",
"submitFeedback": "Submit Feedback",
"moderationSuccess": "feedback.moderationSuccess",
"pendingModeration": "Pending Moderation",
"pending": "pending",
"noPendingComments": "No comments pending moderation",
"onPhoto": "On photo",
"showAll_one": "Show all {{count}} pending comments",
"showAll_other": "Show all {{count}} pending comments",
"viewAllFeedback": "View all feedback & settings"
},
"filter": {
"feedbackFilters": "Feedback Filters",
"clear": "Clear",
"rating": "Rating",
"hasLikes": "Has likes",
"hasFavorites": "Has favorites",
"hasComments": "Has comments",
"showingPhotos": "Total photos",
"withRatings": "With ratings",
"combineWith": "Combine with"
},
"adminLogin": {
"title": "Admin Login",
"subtitle": "Sign in to manage your photo galleries",
"sessionExpired": "Your session has expired. Please log in again.",
"emailLabel": "Email Address",
"emailPlaceholder": "[email protected]",
"emailRequired": "Email is required",
"invalidEmail": "Invalid email format",
"passwordLabel": "Password",
"passwordPlaceholder": "Enter your password",
"passwordRequired": "Password is required",
"passwordMinLength": "Password must be at least 6 characters",
"rememberMe": "Remember me",
"signIn": "Sign In",
"loginSuccess": "Login successful!",
"networkError": "Network error. Please check your connection and try again.",
"tooManyAttempts": "Too many login attempts. Please try again later.",
"invalidCredentials": "Invalid email or password",
"generalError": "An error occurred. Please try again.",
"needHelp": "Need help? Contact",
"poweredBy": "Powered by PicPeak",
"devModeHint": "Development Mode: Use email: [email protected], password: admin123"
},
"clientAccess": {
"title": "Client Access",
"description": "Review photos and manage visibility before the gallery is shared with guests.",
"pinLabel": "Client PIN",
"pinPlaceholder": "Enter your client PIN",
"enterPin": "Please enter your client PIN",
"invalidPin": "Invalid PIN. Please try again.",
"loginFailed": "Authentication failed. Please try again.",
"loginButton": "Access Gallery",
"guestHint": "Looking for the guest gallery?",
"guestLink": "Go to guest view",
"banner": "Client Mode",
"visibleCount": "{{visible}} of {{total}} photos visible to guests",
"hideSelected": "Hide Selected",
"showSelected": "Show Selected",
"adminTitle": "Client Access",
"enableToggle": "Enable Client Access",
"enableDescription": "Allow clients to review and hide photos before the gallery is shared with guests.",
"pinHelperText": "The client will use this PIN to access the review page.",
"pinUpdated": "Client PIN updated",
"setPin": "Set PIN",
"linkLabel": "Client Access Link",
"regenerateToken": "Regenerate link",
"tokenRegenerated": "Client access link regenerated"
},
"export": {
"button": "Export",
"success": "Export downloaded successfully",
"error": "Export failed: ",
"exportFiltered": "Export filtered photos",
"hint": "Select photos or apply filters to export",
"exportSelected_one": "Export {{count}} selected",
"exportSelected_other": "Export {{count}} selected"
},
"photoSort": {
"defaultSort": "Default Photo Sort",
"uploadDateNewest": "Upload Date (Newest First)",
"uploadDateOldest": "Upload Date (Oldest First)",
"captureDateNewest": "Date Taken (Newest First)",
"captureDateOldest": "Date Taken (Oldest First)",
"filenameAZ": "Filename (A-Z)",
"filenameZA": "Filename (Z-A)",
"dateTaken": "Date Taken"
},
"photos": {
"moveToCategory_one": "Move {{count}} photos to category",
"moveToCategory_other": "Move {{count}} photos to category",
"selectCategory": "Select category",
"uncategorized": "Uncategorized",
"movePhotos": "Move Photos",
"selectedCategory": "selected category",
"movedToCategory_one": "{{count}} photos moved to {{category}}",
"movedToCategory_other": "{{count}} photos moved to {{category}}",
"moveToCategoryFailed": "Failed to move photos to category",
"moveToCategory": "Move to Category"
}
}