Files
slp-modular-cms/frontend/src/i18n/locales/en/translation.json
T
SluijsensandClaude Sonnet 5 1b974696bf Maak slug in CMS zichtbaar en inline aanpasbaar
De CMS-admin toonde het nieuwe Slug-veld nog niet — dat bestond alleen
in de API-respons. Voegt een read-only slugweergave onder het
titelveld toe met een potlood-icoon om 'm inline te bewerken.

Backend: Create/UpdateOfferingRequest accepteren nu een optionele
Slug-override. Zonder expliciete waarde blijft het bestaande gedrag
(auto-genereren uit titel, regenereren bij titelwijziging). Met een
expliciete waarde wordt die genormaliseerd en op uniekheid
gecontroleerd; een botsing geeft 409 Conflict (RFC 9457 ProblemDetails,
naar het patroon van MasterControlledAvailabilityException).

Frontend: de slug wordt alleen meegestuurd als de admin 'm daadwerkelijk
bewerkt heeft (dirtyFields.slug), zodat een ongemoeide slug bij een
titelwijziging gewoon blijft auto-regenereren.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-04 15:31:10 +02:00

308 lines
11 KiB
JSON

{
"common": {
"appName": "SlpModularCms",
"loading": "Loading…",
"cancel": "Cancel",
"save": "Save",
"retry": "Retry"
},
"nav": {
"dashboard": "Dashboard",
"users": "Users",
"cms": "CMS",
"offerings": "Offerings",
"profile": "Profile",
"settings": "Settings",
"openMenu": "Open navigation",
"closeMenu": "Close navigation"
},
"theme": {
"switchToLight": "Switch to light theme",
"switchToDark": "Switch to dark theme"
},
"login": {
"title": "Sign in",
"subtitle": "Sign in to your SlpModularCms account",
"email": "Email",
"emailPlaceholder": "you@example.com",
"password": "Password",
"submit": "Sign in",
"submitting": "Signing in…",
"errors": {
"emailRequired": "Email is required",
"emailInvalid": "Enter a valid email address",
"passwordRequired": "Password is required",
"invalidCredentials": "Invalid email or password",
"generic": "Something went wrong. Please try again."
}
},
"setup": {
"title": "System Setup",
"nameLabel": "Full name",
"emailLabel": "Email",
"passwordLabel": "Password",
"confirmPasswordLabel": "Confirm password",
"languageLabel": "Language preference",
"submitButton": "Create owner account",
"successMessage": "Account created. You can now sign in."
},
"inviteComplete": {
"title": "Complete your account",
"emailLabel": "Email",
"nameLabel": "Full name",
"passwordLabel": "Password",
"confirmPasswordLabel": "Confirm password",
"submitButton": "Complete setup",
"loadingMessage": "Validating your invitation…",
"invalidTokenMessage": "This invitation link has expired or is invalid.",
"requestNewInvitationLink": "Request a new invitation link",
"successMessage": "Account setup complete. You can now sign in."
},
"dashboard": {
"title": "Dashboard",
"welcome": "Welcome back, {{name}}"
},
"availability": {
"title": "System Status",
"available": "Available",
"maintenance": "Maintenance",
"unavailable": "Unavailable",
"messageAvailable": "System is running normally.",
"messageMaintenance": "System is undergoing scheduled maintenance.",
"messageUnavailable": "System is currently unavailable.",
"errorTitle": "Could not load status",
"staleLabel": "Last known status",
"retry": "Retry"
},
"userMenu": {
"language": "Language",
"logout": "Sign out"
},
"users": {
"title": "Users",
"inviteButton": "Invite User",
"table": {
"name": "Name",
"email": "Email",
"role": "Role",
"status": "Status",
"createdAt": "Created",
"actions": "Actions"
},
"status": {
"active": "Active",
"inactive": "Inactive",
"pendingInvite": "Pending invite"
},
"actions": {
"copyInviteLink": "Copy invite link",
"changeRole": "Change role",
"deactivate": "Deactivate",
"activate": "Activate",
"delete": "Delete user",
"linkCopied": "Invite link copied to clipboard"
},
"active": {
"successDeactivated": "{{name}} has been deactivated.",
"successActivated": "{{name}} has been activated."
},
"delete": {
"title": "Delete user",
"description": "Are you sure you want to delete {{name}} ({{email}})? This action cannot be undone.",
"descriptionPending": "Are you sure you want to delete the pending invitation for {{email}}? This action cannot be undone.",
"confirmButton": "Delete",
"success": "{{name}} has been deleted."
},
"invite": {
"title": "Invite User",
"emailLabel": "Email address",
"roleLabel": "Role",
"rolePlaceholder": "Select a role",
"submitButton": "Send invitation",
"step2Title": "Invitation created",
"step2Description": "Share the link below with the invitee.",
"linkLabel": "Invite link",
"copyLink": "Copy link",
"close": "Close"
},
"roles": {
"Owner": "Owner",
"Administrator": "Administrator",
"User": "User"
},
"ownerAssign": {
"title": "Assign Owner role",
"description": "You are about to make <strong>{{name}}</strong> an Owner. Owners have full access to the system, including the ability to manage and remove other Owners. Are you sure?",
"confirmButton": "Make Owner"
},
"selfRoleChange": {
"title": "Change your own role",
"description": "You are about to change your own role to <strong>{{role}}</strong>. You will be logged out automatically so the change takes effect immediately.",
"confirmButton": "Change and log out"
},
"errors": {
"lastOwnerRequired": "At least one Owner must remain. Assign another Owner before changing this role.",
"insufficientPermissions": "You do not have permission to perform this action."
}
},
"profile": {
"title": "My Profile",
"name": "Full name",
"email": "Email address",
"role": "Role",
"save": "Save changes",
"saving": "Saving…",
"saveSuccess": "Profile updated successfully",
"changePassword": "Change password",
"changePasswordDialog": {
"title": "Change Password",
"current": "Current password",
"new": "New password",
"confirm": "Confirm new password",
"submit": "Change password",
"submitting": "Changing…",
"success": "Password changed successfully",
"errorCurrent": "Current password is incorrect"
}
},
"settings": {
"title": "System Settings",
"availability": {
"title": "System Availability",
"mode": "Availability mode",
"reason": "Message (optional)",
"save": "Update availability",
"saving": "Updating…",
"saveSuccess": "Availability updated",
"modes": {
"Available": "Available",
"Maintenance": "Maintenance",
"NotAvailable": "Unavailable"
},
"masterControlledTitle": "Controlled by Master CMS",
"masterControlled": "This instance has been disabled by the Master CMS. Availability cannot be changed here until the Master releases it.",
"masterControlledSaveError": "Cannot be changed: the Master CMS controls this status."
},
"modules": { "title": "Module Management", "comingSoon": "Coming soon" },
"systemConfig": { "title": "System Configuration", "comingSoon": "Coming soon" },
"branding": { "title": "Branding / Theme", "comingSoon": "Coming soon" }
},
"cms": {
"title": "CMS Instances",
"addButton": "Add CMS",
"emptyState": {
"heading": "No CMS instances yet",
"description": "Add your first CMS instance to get started."
},
"table": {
"name": "Name",
"url": "URL",
"status": "Status",
"lastContact": "Last Contact",
"disableMessage": "Disable Message",
"actions": "Actions"
},
"status": {
"Available": "Available",
"NotAvailable": "Unavailable",
"Inactive": "Inactive"
},
"actions": {
"setStatus": "Set Status"
},
"add": {
"title": "Add CMS Instance",
"nameLabel": "Name",
"urlLabel": "URL",
"apiKeyLabel": "API Key",
"submitButton": "Add",
"successToast": "CMS instance added successfully",
"errors": {
"conflict": "A CMS instance with this name or URL already exists."
}
},
"setStatus": {
"title": "Set Status",
"statusLabel": "Status",
"disableMessageLabel": "Disable Message",
"disableMessagePlaceholder": "Reason for disabling…",
"submitButton": "Save",
"successContactedToast": "Status updated — cliënt confirmed",
"successUnreachableToast": "Status saved — cliënt unreachable"
}
},
"offerings": {
"title": "Offerings",
"addButton": "Add Offering",
"emptyState": {
"heading": "No offerings yet",
"description": "Add your first offering to get started."
},
"table": {
"title": "Title",
"price": "Price",
"featured": "Featured",
"actions": "Actions"
},
"actions": {
"drag": "Drag to reorder",
"edit": "Edit",
"delete": "Delete",
"moveUp": "Move up",
"moveDown": "Move down",
"markFeatured": "Mark as featured",
"unmarkFeatured": "Remove featured"
},
"deleteDialog": {
"title": "Delete offering",
"message": "Are you sure you want to delete '{{title}}'?",
"confirmButton": "Delete",
"cancelButton": "Cancel"
},
"form": {
"createTitle": "New Offering",
"editTitle": "Edit Offering",
"titleLabel": "Title",
"slugLabel": "Slug",
"slugAutoHint": "Auto-generated from the title",
"editSlugButton": "Edit slug",
"confirmSlugButton": "Confirm slug",
"cancelSlugEditButton": "Cancel slug edit",
"descriptionLabel": "Description",
"priceLabel": "Price",
"priceNoteLabel": "Price note",
"featuresLabel": "Features",
"addFeatureButton": "Add feature",
"removeFeatureButton": "Remove",
"ctaLabelLabel": "Button text",
"featuredLabel": "Featured",
"submitButton": "Save",
"successToast": "Offering saved successfully"
}
},
"error": {
"403": {
"title": "Access Denied",
"message": "You don't have permission to view this page."
},
"404": {
"title": "Page Not Found",
"message": "The page you're looking for doesn't exist."
},
"backToDashboard": "Back to Dashboard",
"unexpected": {
"title": "Something went wrong",
"message": "This page could not be displayed. Try again, or go back to the dashboard."
}
},
"errors": {
"network": "Unable to reach the server. Check your connection and try again.",
"generic": "Something went wrong. Please try again.",
"accessDenied": "You do not have permission to access this page.",
"setupRequired": "System setup required. Please initialize the system first.",
"invalidInvitationToken": "Invalid or expired invitation token.",
"featureUnavailableTitle": "Not available on this instance",
"featureUnavailable": "This feature is only available on a Master CMS instance."
}
}