Raiju/admin/lang/en.json
2026-10-25 06:05:42 +03:00

2094 lines
132 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.

{
"dashboard": "Dashboard",
"nav.pages": "Pages",
"nav.messages": "Messages",
"nav.news": "News",
"nav.events": "Events",
"nav.settings": "Settings",
"nav.logout": "Log Out",
"nav.collapse_sidebar": "Collapse",
"nav.expand_sidebar": "Expand",
"nav.view_site": "View Site",
"btn.load": "Load",
"btn.save": "Save",
"btn.cancel": "Cancel",
"btn.confirm": "Confirm",
"btn.close": "Close",
"btn.back": "Back",
"btn.delete": "Delete",
"btn.browse": "Browse",
"btn.clear": "Clear",
"btn.refresh": "Refresh",
"btn.restore": "Restore",
"btn.saving": "Saving...",
"btn.changing": "Changing...",
"pages.title": "Pages",
"pages.new_page": "+ New Page",
"pages.trash": "Trash",
"pages.col_title": "Title",
"pages.col_date": "Last Modified",
"pages.edit": "Edit",
"pages.view": "View",
"pages.duplicate": "Duplicate",
"pages.create": "+ Create",
"pages.all_pages": "All Pages",
"pages.back_to_pages": "Back to Pages",
"trash.title": "Trash",
"trash.col_page": "Page",
"trash.col_deleted": "Deleted",
"trash.col_actions": "Actions",
"trash.empty": "Trash is empty.",
"trash.empty_trash": "Empty Trash",
"editor.title": "Content Editor",
"editor.expand_all": "Expand All",
"editor.collapse_all": "Collapse All",
"editor.not_saved_yet": "Not saved yet",
"editor.last_saved": "Last saved: {date}",
"editor.move_to_trash": "Move to Trash",
"editor.undo": "Undo (⌘Z)",
"editor.redo": "Redo (⇧⌘Z)",
"editor.meta_page": "Page:",
"editor.meta_lang": "Lang:",
"editor.items": "{count} items",
"editor.fields": "{count} fields",
"editor.field_groups": "Field groups",
"editor.field_groups_count": "{count} field groups",
"editor.add_item": "+ Add item",
"editor.add_section": "Add new section:",
"editor.no_sections": "No sections yet.",
"editor.search_sections": "Search sections",
"editor.filter_all_types": "All types",
"editor.compact_mode": "Compact",
"editor.expand_section": "Expand section",
"editor.collapse_section": "Collapse section",
"editor.insert_section": "Insert section",
"editor.insert_here": "Insert here",
"editor.section_issues": "{count} issues",
"editor.section_issue": "{count} issue",
"editor.no_section_matches": "No matching sections.",
"editor.drag_section": "Drag section",
"editor.missing_media": "Missing media path",
"editor.missing_alt": "Missing alt text",
"editor.duplicate_h1": "Additional H1 heading",
"editor.select_image": "Select Image",
"editor.tab_content": "Content",
"editor.sections": "Sections",
"editor.page_settings": "Page Settings",
"editor.meta_title": "Title",
"editor.meta_description": "Description",
"editor.nav_locations": "Navigation",
"editor.nav_custom_hint": "Custom, e.g. sidebar",
"editor.breadcrumb": "Breadcrumb",
"editor.breadcrumb_label": "Label",
"editor.breadcrumb_href": "Link (slug)",
"editor.breadcrumb_add": "Add item",
"editor.breadcrumb_hint": "Last item is the current page (no link needed).",
"events.title": "Events",
"events.new_event": "+ New Event",
"events.no_events": "No events yet.",
"events.start_date": "Start date",
"events.start_time": "Start time",
"events.end_date": "End date",
"events.end_time": "End time",
"events.url": "URL",
"events.untitled": "(untitled)",
"events.save_events": "Save Events",
"events.col_date": "Date",
"events.col_location": "Location",
"events.col_status": "Status",
"events.status_upcoming": "Upcoming",
"events.status_today": "Today",
"events.status_past": "Past",
"events.status_draft": "Draft",
"events.confirm_delete_permanent": "Permanently delete event \"{title}\"? This cannot be undone.",
"events.back_to_events": "Back to Events",
"mails.title": "Contact Messages",
"mails.source_hint": "Submissions from the contact form appear here. raiju stores them locally even when no email notification is sent.",
"mails.all_forms": "All forms",
"mails.filter_form": "Filter by form",
"mails.col_form": "Form",
"mails.col_from": "From",
"mails.col_subject": "Subject",
"mails.col_received": "Received",
"mails.mark_all_read": "Mark all as read",
"mails.no_messages": "No messages",
"mails.detail_title": "Message Details",
"mails.date": "Date:",
"mails.name": "Name:",
"mails.email": "Email:",
"mails.phone": "Phone:",
"mails.preferred_date": "Preferred Date:",
"mails.message": "Message:",
"mails.form": "Form:",
"mails.form_fields": "Fields:",
"mails.sort_read": "Sort by read/unread",
"mails.sort_starred": "Sort by starred",
"mails.mark_read": "Mark as read",
"mails.mark_unread": "Mark as unread",
"mails.star": "Star message",
"mails.unstar": "Remove star",
"settings.title": "Settings",
"settings.branding": "Branding",
"settings.branding_desc": "Customize the logo, name, and branding visibility. Disable branding for white-label use.",
"settings.logo": "Logo",
"settings.logo_light": "Logo (light mode)",
"settings.logo_dark": "Logo (dark mode)",
"settings.logo_dark_hint": "Optional. Shown only in dark mode. Leave empty if the same logo works for both themes.",
"settings.frontend_logos": "Frontend logos",
"settings.frontend_logos_hint": "These logos appear only on the public site. Recommended size: SVG or PNG around 320 × 96 px.",
"settings.favicon": "Favicon",
"settings.favicon_hint": "Shown in the browser tab and the backend. Recommended: square SVG or 512 × 512 px PNG.",
"settings.site_identity": "Site identity",
"settings.admin_interface": "Admin interface",
"settings.header_display": "Header display",
"settings.header_display_hint": "When no logo is set, show the following in the page header:",
"settings.logo_display": "When no logo is set",
"settings.logo_display_favicon": "Favicon",
"settings.logo_display_text": "Site name",
"settings.logo_display_both": "Favicon and site name",
"settings.site_name": "Site Name",
"settings.site_name_hint": "Shown in the browser tab, the public header when selected below, and the admin interface.",
"settings.site_name_placeholder": "Site name",
"settings.show_branding": "Show branding in admin",
"settings.branding_hint": "When disabled, the logo and site name are hidden from the admin bar and login page.",
"settings.save_branding": "Save Branding",
"settings.theme": "Theme",
"settings.theme_desc": "Look of the admin area: theme, mode, base colour, font and density.",
"settings.admin_theme": "Admin Theme",
"settings.theme_light": "Light",
"settings.theme_dark": "Dark",
"settings.theme_system": "System",
"settings.appearance": "Appearance",
"settings.theme_preset": "Theme",
"settings.theme_preset_hint": "Sets surfaces, borders, radii, sidebar and the matching font; the font stays free to change below. Every theme has a light and a dark variant.",
"settings.preset_soft": "Soft",
"settings.preset_soft_desc": "Tinted sidebar, white cards, shadcn/ui measures.",
"settings.preset_classic": "Classic",
"settings.preset_classic_desc": "Dark sidebar, light stage, flat – close to WordPress.",
"settings.preset_paper": "Paper",
"settings.preset_paper_desc": "White, hairlines only, lots of calm.",
"settings.preset_studio": "Studio",
"settings.preset_studio_desc": "Monochrome like Vercel: black buttons, hairlines, base colour as accent only.",
"settings.preset_console": "Console",
"settings.preset_console_desc": "Monospace, small caps, crosshair selection, one strong accent – like an ops console.",
"settings.preset_pop": "Pop",
"settings.preset_pop_desc": "Dark gradient sidebar, colourful pill labels, soft rounded cards – playful and friendly.",
"settings.theme_mode": "Mode",
"settings.base_color": "Base colour",
"settings.base_color_hint": "Buttons, links, active states and the tint of the surfaces derive from this one colour. Contrast is kept readable automatically.",
"settings.font": "Font",
"settings.font_hint": "Loaded locally from the admin folder. No external requests are made.",
"settings.font_system": "System (no file)",
"settings.font_inter": "Inter",
"settings.font_plex": "IBM Plex Sans",
"settings.font_atkinson": "Atkinson Hyperlegible",
"settings.font_public": "Public Sans",
"settings.font_size": "Text size",
"settings.font_size_hint": "Changes only the dashboard's type, not spacing or controls.",
"settings.font_size_small": "Small",
"settings.font_size_default": "Default",
"settings.font_size_large": "Large",
"settings.font_geist_mono": "Geist Mono",
"settings.density": "Density",
"settings.density_hint": "“Automatic” follows the window width: compact on small screens, more spacious on large ones.",
"settings.density_auto": "Automatic",
"settings.density_compact": "Compact",
"settings.density_comfortable": "Comfortable",
"settings.advanced": "Advanced",
"settings.sidebar_bg_light": "Sidebar colour (light)",
"settings.sidebar_bg_dark": "Sidebar colour (dark)",
"forms.title": "Forms",
"forms.desc": "Manage simple JSON-backed forms. This view is meant for small edits to existing forms: copy, required fields, options, column widths, and notification behavior.",
"forms.forms": "Forms",
"forms.select_form": "Select form",
"forms.new": "New",
"forms.save": "Save form",
"forms.base_data": "Base data",
"forms.form_id": "Form ID",
"forms.form_id_hint": "Used for embedding and submissions, for example contact or submit-event.",
"forms.label": "Label",
"forms.description": "Description",
"forms.enabled": "Enabled",
"forms.store": "Store locally",
"forms.email": "Send email",
"forms.subject": "Subject",
"forms.success_text": "Success message",
"forms.fields": "Fields",
"forms.add_field": "Add field",
"forms.type": "Type",
"forms.key": "Key",
"forms.placeholder": "Placeholder",
"forms.width": "Width",
"forms.required": "Required",
"forms.options": "Options",
"forms.options_hint": "For select and radio fields, enter one option per line. Use value|Label only when the stored value should differ from the visible label.",
"forms.empty": "No forms yet.",
"forms.field_count": "{count} fields",
"forms.new_field": "New field",
"forms.default_success": "Thank you for your message.",
"forms.contact_default": "Contact form",
"forms.saved": "Form saved.",
"forms.load_error": "Could not load form.",
"forms.save_error": "Could not save form.",
"settings.theme_section_light": "Light Theme",
"settings.theme_section_dark": "Dark Theme",
"settings.dark_section_hint": "Leave fields empty to inherit values from the light theme. Click the ↺ icon to reset a field to auto.",
"settings.primary_color": "Primary Color",
"settings.primary_color_hint": "Used for buttons, links, and interactive elements.",
"settings.accent_color": "Accent Color",
"settings.accent_color_hint": "For highlights and brand accents. Leave empty to use the base colour.",
"settings.danger_color": "Danger colour (red)",
"settings.warning_color": "Notice colour (yellow)",
"settings.success_color": "Success colour (green)",
"settings.semantic_colors_hint": "For errors, warnings and confirmations. Leave empty for the defaults; success then follows the base colour.",
"settings.sidebar_bg": "Background (sidebar & topbar)",
"settings.sidebar_bg_hint": "Derived from the base colour by the theme, but can be overridden.",
"settings.auto_badge": "Auto",
"settings.reset_to_auto": "Reset to automatic value",
"settings.reset_colors": "Restore defaults",
"settings.button_style": "Editor Button Style",
"settings.button_glow": "Glow Effect",
"settings.button_glow_hint": "Adds a glow to editor buttons.",
"settings.button_radius": "Border Radius",
"settings.button_radius_hint": "Controls the roundness of editor buttons (0 = square, 24 = pill).",
"settings.preview_primary": "Primary Button",
"settings.preview_secondary": "Secondary Button",
"settings.save_theme": "Save Theme",
"settings.invalid_color": "Invalid color format. Use hex (#RRGGBB).",
"settings.theme_color_adjusted": "{field} was adjusted to {value} to keep the interface readable.",
"settings.contrast_ok": "Contrast: {ratio}:1",
"settings.contrast_error": "Contrast: {ratio}:1 - below UI minimum 3:1",
"settings.text_contrast_ok": "Contrast with text: {ratio}:1",
"settings.text_contrast_error": "Contrast with text: {ratio}:1 - below UI minimum 3:1",
"settings.contrast_invalid": "Enter a valid hex color to calculate contrast.",
"settings.language": "Language",
"settings.admin_language": "Admin Language",
"settings.admin_language_hint": "Language for the admin interface. Default follows the site's primary language.",
"settings.admin_language_default": "Default ({lang})",
"settings.save_language": "Save Language",
"settings.ai_label_artwork": "AI labels on images",
"settings.ai_label_artwork_en": "English – “AI generated” (default)",
"settings.ai_label_artwork_page": "Page language – “KI generiert” on German pages",
"settings.ai_label_artwork_hint": "Applies to the labels on AI-generated and AI-modified images on the website. The alt text for screen readers always follows the page language.",
"editor.language_tabs": "Languages",
"editor.translate_from_active": "Translate from active language",
"editor.translating": "Translating...",
"editor.translate_done": "Translations inserted.",
"editor.translate_no_source": "No source text to translate.",
"editor.translate_invalid_response": "AI returned an unreadable translation.",
"settings.password": "Password",
"settings.my_account": "My Account",
"settings.change_password": "Change Password",
"settings.current_password": "Current Password",
"settings.new_password": "New Password",
"settings.confirm_password": "Confirm New Password",
"settings.pw_requirements": "Password requirements:",
"settings.pw_length": "At least 8 characters",
"settings.pw_upper": "Uppercase letter",
"settings.pw_lower": "Lowercase letter",
"settings.pw_digit": "Digit",
"settings.pw_special": "Special character",
"settings.pw_match": "Passwords match",
"settings.email": "Email",
"settings.email_desc": "Configure how the contact form sends emails. Messages are always saved locally in the admin inbox, even if sending fails.",
"settings.email_method": "Sending Method",
"settings.sendmail_hint": "Uses the server's built-in mail function (PHP mail). For emails to be delivered reliably, the server's IP address must be authorized to send mail for the sender domain (SPF record). This method works without credentials but delivery is not guaranteed.",
"settings.recipient_email": "Recipient Email",
"settings.recipient_email_hint": "Contact form messages are sent to this address. Separate multiple addresses with commas.",
"settings.bcc_email": "BCC Email",
"settings.bcc_email_hint": "Optional blind-copy recipients. Separate multiple addresses with commas.",
"settings.from_email": "Sender Email (From)",
"settings.from_email_hint": "The 'From' address shown to the recipient. Should match your SMTP account or domain.",
"settings.from_name": "Sender Name",
"settings.smtp_settings": "SMTP Server",
"settings.smtp_host": "Host",
"settings.smtp_port": "Port",
"settings.smtp_encryption": "Encryption",
"settings.smtp_encryption_none": "None (not recommended)",
"settings.smtp_username": "Username",
"settings.smtp_password": "Password",
"settings.smtp_password_placeholder": "Enter password",
"settings.smtp_password_hint": "Leave empty to keep the saved password unchanged.",
"settings.save_email": "Save Email Settings",
"settings.test_email": "Send Test Email",
"settings.testing_email": "Sending...",
"settings.test_email_success": "Test email sent successfully! Check your inbox.",
"settings.test_email_error": "Failed to send test email.",
"settings.recipient_required": "Please enter a recipient email address first.",
"toast.email_saved": "Email settings saved",
"settings.danger_zone": "Reset",
"settings.danger_zone_desc": "Irreversible actions. Proceed with extreme caution.",
"settings.total_reset": "Total Reset",
"settings.total_reset_desc": "Completely resets the installation to factory state. Deletes all content, pages, images, news, backups, settings, and configuration. After the reset, the setup wizard will appear as if raiju was freshly installed.",
"settings.total_reset_warning": "This action is irreversible. All data will be permanently deleted.",
"settings.total_reset_confirm_label": "Type DELETE to confirm:",
"settings.total_reset_confirm_placeholder": "DELETE",
"settings.total_reset_btn": "Reset Everything",
"settings.total_reset_mismatch": "Please type DELETE exactly to confirm.",
"toast.total_reset_success": "Installation reset. Redirecting to setup wizard...",
"security.warning": "Security Warning:",
"security.weak_password": "Your current password does not meet minimum security requirements (at least 8 characters with a mix of uppercase, lowercase, digits, and special characters).",
"security.change_now": "Please change it immediately",
"security.change_link": "Change password",
"backups.title": "Backups",
"backups.no_backups": "No backups available",
"backups.view": "View",
"backups.restore": "Restore",
"backups.delete": "Delete",
"toast.saved": "Saved successfully!",
"toast.page_duplicated": "Page duplicated: {slug}",
"toast.page_trashed": "Page moved to trash",
"toast.page_created": "Page created: {title}",
"toast.page_restored": "Page restored",
"toast.page_deleted": "Page permanently deleted",
"toast.trash_emptied": "Trash emptied",
"toast.backup_restored": "Backup restored!",
"toast.backup_deleted": "Backup deleted.",
"toast.branding_saved": "Branding saved",
"toast.theme_saved": "Theme saved",
"toast.password_changed": "Password changed successfully!",
"toast.all_read": "All marked as read",
"toast.message_deleted": "Message deleted",
"toast.events_saved": "Events saved!",
"toast.event_deleted": "Event permanently deleted",
"toast.event_trashed": "Event moved to trash",
"toast.event_restored": "Event restored",
"toast.no_images": "No images found. Upload images first.",
"toast.error_loading": "Error loading: {message}",
"toast.error_saving": "Error saving: {message}",
"toast.error_generic": "Error: {message}",
"toast.error_loading_images": "Error loading images: {message}",
"toast.error_loading_events": "Error loading events: {message}",
"toast.error_loading_settings": "Error loading settings: {message}",
"toast.events_date_required": "Date and title are required",
"toast.language_saved": "Language saved",
"modal.new_page": "New Page",
"modal.new_page_title": "Title",
"modal.new_page_title_placeholder": "My New Page",
"modal.new_page_slug": "Slug",
"modal.new_page_slug_placeholder": "my-new-page",
"modal.new_page_slug_hint": "Lowercase URL path; use slashes for nested pages. Auto-generated from title.",
"modal.create_page": "Create Page",
"modal.delete_permanently": "Delete Permanently",
"modal.delete_confirm": "Are you sure you want to permanently delete \"{title}\" ({page})? This cannot be undone.",
"modal.empty_trash": "Empty Trash",
"modal.empty_trash_confirm": "Are you sure you want to permanently delete all trashed pages? This cannot be undone.",
"modal.restore_backup": "Restore Backup",
"modal.restore_backup_confirm": "Restore this backup? The current state will be saved first.",
"modal.delete_backup": "Delete Backup",
"modal.delete_backup_confirm": "Are you sure you want to delete this backup? This cannot be undone.",
"modal.delete_message": "Delete Message",
"modal.delete_message_confirm": "Are you sure you want to delete this message?",
"modal.select_logo": "Select Logo",
"login.title": "Sign in",
"login.username": "Username",
"login.password": "Password",
"login.show_password": "Show password",
"login.hide_password": "Hide password",
"login.button": "Login",
"login.back_to_site": "Back to website",
"login.error_locked": "Account locked due to too many failed attempts. Please try again in {time}.",
"login.error_too_many": "Too many failed attempts. Please wait before trying again.",
"login.error_wait": "Invalid credentials. Please wait before trying again.",
"login.error_invalid": "Invalid username or password",
"login.hour": "h",
"login.minute": "min",
"setup.page_title": "Setup - raiju CMS",
"setup.complete_title": "Setup Complete",
"setup.complete_message": "raiju CMS has been configured successfully.",
"setup.complete_login_hint": "You can now log in with the credentials you just created.",
"setup.go_to_login": "Go to Login",
"setup.title": "Setup",
"setup.subtitle": "Initial Configuration",
"setup.site_name": "Site Name",
"setup.site_name_placeholder": "My Website",
"setup.primary_language": "Primary Language",
"setup.primary_language_hint": "Pages in this language live at the root URL (no prefix).",
"setup.additional_language": "Additional Language (optional)",
"setup.additional_language_none": "— None —",
"setup.additional_language_hint": "Pages in this language will be under /{code}/.",
"setup.admin_username": "Admin Username",
"setup.password": "Password",
"setup.generate": "Generate",
"setup.confirm_password": "Confirm Password",
"setup.pw_length": "At least 8 characters",
"setup.pw_upper": "Uppercase letter",
"setup.pw_lower": "Lowercase letter",
"setup.pw_digit": "Digit",
"setup.pw_special": "Special character",
"setup.create_config": "Create Configuration",
"setup.error_site_name": "Please enter a site name.",
"setup.error_username": "Please enter an admin username.",
"setup.error_username_short": "Username must be at least 3 characters.",
"setup.error_password": "Please enter a password.",
"setup.error_password_mismatch": "Passwords do not match.",
"setup.error_password_weak": "Password does not meet requirements: at least 8 characters with uppercase, lowercase, digits, and special characters.",
"setup.error_write": "Could not write config.php. Please check that the admin/ directory is writable by the web server.",
"setup.copied": "Copied!",
"setup.copy": "Copy",
"block.text": "Text",
"block.youtube": "YouTube",
"block.soundcloud": "SoundCloud",
"block.audio": "Audio",
"block.card": "Card",
"block.heading": "Heading",
"block.quote": "Quote",
"block.image": "Image",
"block.list": "List",
"block.divider": "Divider",
"block.spacer": "Spacer",
"field.title": "Title",
"field.heading_level": "Heading Level",
"field.content": "Content",
"field.style": "Style",
"field.video_id": "Video ID",
"field.video_id_hint": "The video ID from the YouTube URL (after v=)",
"field.track_id": "Track ID",
"field.track_id_hint": "Find the track ID in the SoundCloud embed URL",
"field.audio_file": "Audio File",
"field.description": "Description",
"field.heading_text": "Heading Text",
"field.level": "Level",
"field.subtitle": "Subtitle (optional)",
"field.quote_text": "Quote Text",
"field.attribution": "Attribution (optional)",
"field.alt_text": "Alt Text",
"field.caption": "Caption (optional)",
"field.width": "Width",
"field.title_optional": "Title (optional)",
"field.list_items": "List Items",
"field.height": "Height",
"option.default": "Default",
"option.highlight": "Highlight",
"option.large": "Large",
"option.h1_page_title": "H1 — Page Title",
"option.h2_section": "H2 — Section",
"option.h3_subsection": "H3 — Subsection",
"option.h4_small": "H4 — Small",
"option.full_width": "Full Width",
"option.medium_75": "Medium (75%)",
"option.small_50": "Small (50%)",
"option.bullet_list": "Bullet List",
"option.numbered_list": "Numbered List",
"option.small": "Small",
"option.medium": "Medium",
"option.extra_large": "Extra Large",
"news.title": "News",
"news.new_post": "+ New Post",
"news.no_posts": "No posts yet.",
"news.edit": "Edit",
"news.delete": "Delete Post",
"news.untitled": "(untitled)",
"news.save_posts": "Save",
"news.post_title": "Title",
"news.post_slug": "Slug",
"news.post_date": "Date",
"news.post_author": "Author",
"news.post_excerpt": "Excerpt",
"news.post_image": "Cover Image",
"news.post_content": "Content",
"news.draft": "Draft",
"news.published": "Published",
"news.post_language": "Language",
"news.publish": "Publish",
"news.unpublish": "Unpublish",
"news.view": "View",
"news.all_posts": "All News",
"news.read_more": "Read more",
"toast.news_saved": "Post saved!",
"toast.news_deleted": "Post deleted",
"toast.news_created": "Post created",
"toast.error_loading_news": "Error loading news: {message}",
"toast.news_date_required": "Date and title are required",
"modal.delete_post": "Delete Post",
"modal.delete_post_confirm": "Are you sure you want to delete \"{title}\"? This cannot be undone.",
"settings.backup": "Backup",
"settings.backup_desc": "Thanks to raiju's flat-file architecture, backups are quick and simple — download a complete copy of your site including all content, templates, images, and configuration.",
"settings.backup_site": "Site Backup",
"settings.backup_site_desc": "Creates a ZIP archive of the entire site directory. Development files (node_modules, .git, etc.) are excluded.",
"settings.backup_create": "Create Backup",
"settings.backup_creating": "Creating backup…",
"settings.backup_downloading": "Downloading…",
"toast.backup_site_created": "Backup created — download started.",
"toast.backup_site_failed": "Backup failed: {message}",
"settings.restore_title": "Restore from Backup",
"settings.restore_desc": "Upload a previously downloaded raiju backup ZIP to restore your site.",
"settings.restore_mode_prompt": "Restore type — choose one option",
"settings.restore_full": "Full Restore",
"settings.restore_full_desc": "Replaces everything — CMS files, content, images, and configuration. A backup of the current state is created automatically before restoring.",
"settings.restore_content": "Content Only",
"settings.restore_content_desc": "Replaces only your content, images, fonts, and page templates. CMS core files and admin credentials remain unchanged.",
"settings.restore_select_file": "Select ZIP file",
"settings.restore_change_file": "Change file",
"settings.restore_btn": "Restore",
"settings.restore_uploading": "Uploading & restoring…",
"settings.restore_warning_full": "This will replace your entire site with the contents of the backup ZIP. A backup of the current state will be created first. This cannot be undone easily. Are you sure?",
"settings.restore_warning_content": "This will replace all content, images, fonts, and page templates with the contents of the backup ZIP. CMS core files and your login credentials will not be affected. Continue?",
"settings.scheduled_backups": "Automated backups",
"settings.scheduled_backups_desc": "Run periodic full-site backups via a server cron job or a secret web-cron URL. The retention rules below decide how many tiered copies to keep — tight enough for fast incident recovery, loose enough to surface issues that only show up months later.",
"settings.scheduled_enabled": "Scheduled backups enabled",
"settings.scheduled_enabled_hint": "When off, the server or web cron exits without doing anything. Manual backups via the button above still work.",
"settings.cron_mode": "Execution",
"settings.cron_mode_server": "Server cron",
"settings.cron_mode_web": "Web cron",
"settings.cron_mode_hint": "Server cron is more reliable. Web cron is meant for hosts that do not provide cron jobs.",
"settings.retention_title": "Retention",
"settings.retention_hint": "Backups are tagged daily, weekly, monthly, or yearly when they're created. The numbers below say how many of each tier to keep before the oldest of that tier is deleted.",
"settings.retention_daily": "Daily",
"settings.retention_weekly": "Weekly",
"settings.retention_monthly": "Monthly",
"settings.retention_yearly": "Yearly",
"settings.storage_limit": "Storage limit (MB)",
"settings.storage_limit_hint": "Hard cap on total backup storage. When reached, the oldest non-manual backups are deleted even if they're still within retention. 0 = no cap.",
"settings.backup_settings_save": "Save backup settings",
"settings.remote_backups": "Remote backup targets",
"settings.remote_backups_hint": "After each scheduled backup, raiju uploads the ZIP to every enabled target. Uploads are placed in a per-site subfolder below the configured remote path. Access tokens and passwords are saved in settings and hidden after saving.",
"settings.remote_oauth_beta_note": "Beta note: Browser-based connections to Dropbox, Google Drive, and Microsoft OneDrive may be limited depending on the providers' approval status.",
"settings.remote_add_target": "Add target",
"settings.remote_empty": "No remote targets configured yet.",
"settings.remote_test": "Test",
"settings.remote_upload": "Upload remote",
"settings.remote_uploading": "Uploading…",
"settings.remote_files": "Remote files",
"settings.remote_files_empty": "No remote backups found.",
"settings.remote_import": "Import",
"settings.remote_delete": "Delete remote backup",
"settings.remote_delete_confirm": "Delete this backup from remote storage? The local copy is not affected.",
"settings.remote_hint_sftp": "Requires an SSH/SFTP account and the PHP ssh2 extension on the raiju server.",
"settings.remote_hint_ftp": "Use this for classic FTP accounts such as Plesk FTP users. Enable FTPS when the server supports encrypted FTP.",
"settings.remote_error_dropbox_access_token_missing": "Dropbox access token is missing.",
"settings.remote_error_google_access_token_missing": "Google Drive access token is missing.",
"settings.remote_error_onedrive_access_token_missing": "OneDrive access token is missing.",
"settings.remote_error_ssh2_required": "PHP ssh2 extension is required for SFTP/SCP uploads.",
"settings.remote_error_ftp_required": "PHP FTP extension is required for FTP/FTPS uploads.",
"settings.remote_not_tested": "Not tested yet.",
"settings.remote_last_upload": "Last upload: {date} — {message}",
"settings.remote_placeholder_optional": "Optional",
"settings.remote_connect_dropbox": "Connect Dropbox",
"settings.remote_connect_google": "Connect Google",
"settings.remote_connect_onedrive": "Connect OneDrive",
"settings.remote_field_app_key": "App key",
"settings.remote_field_client_id": "Client ID",
"settings.remote_field_client_secret": "Client secret",
"settings.remote_field_access_token": "Access token",
"settings.remote_field_refresh_token": "Refresh token",
"settings.remote_field_path": "Folder path",
"settings.remote_field_folder_id": "Folder ID",
"settings.remote_field_folder_path": "Folder path",
"settings.remote_field_host": "Host",
"settings.remote_field_port": "Port",
"settings.remote_field_username": "Username",
"settings.remote_field_password": "Password",
"settings.remote_field_remote_path": "Remote path",
"settings.remote_field_ssl": "Use FTPS",
"settings.remote_field_passive": "Passive mode",
"settings.remote_field_endpoint": "Endpoint",
"settings.remote_field_region": "Region",
"settings.remote_field_bucket": "Bucket",
"settings.remote_field_prefix": "Prefix",
"settings.remote_field_access_key": "Access key",
"settings.remote_field_secret_key": "Secret key",
"settings.remote_field_path_style": "Use path-style URLs",
"settings.remote_field_url": "WebDAV URL",
"settings.remote_field_bearer_token": "Bearer token",
"settings.cron_setup": "Cron setup",
"settings.cron_setup_hint": "Create a daily scheduled task at 03:00. In Plesk choose “Run a PHP script”, enter the script path, and set the arguments to --action=run. This avoids relying on a php command in Plesk's PATH. If you use “Run a command”, use the absolute path to the PHP CLI binary.",
"settings.cron_script_path": "Script path",
"settings.cron_arguments": "Arguments",
"settings.cron_shell_command": "Command fallback",
"settings.web_cron_url": "Web-cron URL",
"settings.web_cron_hint": "If your host does not allow cron jobs, call this secret URL once per day through an external service such as cron-job.org or easycron.com. Anyone who knows this URL can start scheduled backups.",
"settings.cron_copy": "Copy",
"settings.cron_copied": "Copied",
"settings.last_run": "Last run",
"settings.last_run_never": "Never",
"settings.last_run_warning": "Cron has not run in {days} days — verify the crontab is active.",
"settings.last_run_ok": "Cron is running on schedule.",
"settings.last_run_error": "Last run failed: {message}",
"settings.storage_summary": "Storage in use",
"settings.storage_count": "{count} backup(s), total {size}",
"settings.storage_oldest": "Oldest: {date}",
"settings.storage_newest": "Newest: {date}",
"settings.backup_list_title": "Stored backups",
"settings.backup_list_empty": "No backups stored yet. Run the cron job once or click \"Create backup now\" above.",
"settings.backup_list_col_date": "Date",
"settings.backup_list_col_tier": "Tier",
"settings.backup_list_col_size": "Size",
"settings.backup_list_col_actions": "Actions",
"settings.backup_download": "Download",
"settings.backup_restore_from_pool": "Restore",
"settings.backup_delete": "Delete",
"settings.backup_delete_confirm": "Delete this backup? This cannot be undone.",
"settings.backup_restore_pool_warning_full": "This will replace your entire site with the contents of the selected backup. A new backup of the current state is created first. Continue?",
"settings.backup_restore_pool_warning_content": "This will replace your content, images, fonts, and page templates with the contents of the selected backup. CMS core files and your login credentials are not affected. Continue?",
"toast.scheduled_backup_settings_saved": "Backup settings saved.",
"toast.scheduled_backup_settings_failed": "Failed to save backup settings: {message}",
"toast.backup_delete_failed": "Failed to delete backup: {message}",
"toast.remote_test_success": "Remote target test succeeded.",
"toast.remote_test_failed": "Remote target test failed: {message}",
"toast.remote_upload_success": "Remote upload complete.",
"toast.remote_upload_failed": "Remote upload failed: {message}",
"toast.remote_list_failed": "Failed to load remote backups: {message}",
"toast.remote_import_success": "Remote backup imported locally.",
"toast.remote_import_failed": "Failed to import remote backup: {message}",
"toast.remote_delete_success": "Remote backup deleted.",
"toast.remote_delete_failed": "Failed to delete remote backup: {message}",
"toast.remote_no_enabled_targets": "No enabled remote targets configured.",
"toast.remote_dropbox_connected": "Dropbox connected.",
"toast.remote_oauth_connected": "Cloud storage connected.",
"toast.remote_dropbox_app_key_missing": "Enter and save a Dropbox app key first.",
"toast.remote_client_id_missing": "Enter and save a client ID first.",
"toast.remote_dropbox_connect_failed": "Dropbox connection failed: {message}",
"toast.remote_oauth_connect_failed": "Cloud storage connection failed: {message}",
"toast.restore_success_full": "Full restore complete — {extracted} files restored.",
"toast.restore_success_content": "Content restored — {extracted} files updated.",
"toast.restore_failed": "Restore failed: {message}",
"settings.users": "Users",
"settings.users_desc": "Manage user accounts and roles. Admins can manage all settings; editors can edit content only.",
"settings.email_missing_title": "Email address missing",
"settings.email_missing_text": "Your account has no email address. Without it, password reset via email won't work.",
"settings.email_missing_link": "Add email address now",
"settings.add_user": "Add User",
"settings.edit_user": "Edit User",
"settings.delete_user": "Delete User",
"settings.delete_user_confirm": "Are you sure you want to delete the user \"{username}\"? This cannot be undone.",
"settings.user_username": "Username",
"settings.user_email": "Email",
"settings.user_role": "Role",
"settings.user_last_login": "Last Login",
"settings.user_actions": "Actions",
"settings.user_you": "you",
"settings.reset_password": "Reset Password",
"settings.reset_password_prompt": "Enter new password for {username}:",
"toast.user_created": "User created",
"toast.user_updated": "User updated",
"toast.user_deleted": "User deleted",
"settings.email_inactive": "Inactive",
"settings.email_inactive_hint": "Email sending is disabled. Contact form submissions will be saved locally but no emails will be sent. Enable SMTP or Sendmail to send emails.",
"settings.menus": "Menus",
"settings.menus_desc": "Manage the order of pages in each navigation menu.",
"settings.menu_select": "Select menu",
"settings.menu_order_empty": "No pages in this menu.",
"settings.menu_order_saved": "Menu order saved.",
"setup.admin_email": "Email (optional)",
"setup.admin_email_placeholder": "admin@example.com",
"setup.admin_email_hint": "Used for password reset. Can be added later in Settings.",
"login.forgot_password": "Forgot password?",
"login.back_to_login": "Back to login",
"login.reset_desc": "Enter your email address and we'll send you a link to reset your password.",
"login.reset_email_label": "Email Address",
"login.reset_send": "Send Reset Link",
"login.reset_sent": "If an account with that email exists, a reset link has been sent.",
"login.reset_rate_limit": "Too many reset requests. Please try again later.",
"login.reset_invalid_token": "This reset link is invalid or has expired.",
"login.reset_password_mismatch": "Passwords do not match.",
"login.reset_password_weak": "Password does not meet requirements.",
"login.reset_new_password_desc": "Enter your new password.",
"login.reset_set_password": "Set New Password",
"login.reset_success": "Password has been reset successfully. You can now log in.",
"login.reset_email_subject": "Password Reset",
"login.reset_email_body": "Hi {username},\n\nYou requested a password reset. Click the link below to set a new password:\n\n{url}\n\nThis link expires in 1 hour.\n\nIf you did not request this, you can safely ignore this email.",
"login.session_expired": "Your session has expired. Please sign in again.",
"editor.nav_add_custom": "Add menu",
"close": "Close",
"banner.frontend_edit_title": "Editing inline?",
"banner.frontend_edit_text": "You came from a public page. You can edit it directly in the frontend.",
"banner.frontend_edit_cta": "Return to that page",
"settings.frontend_login_redirect": "After login",
"settings.frontend_login_redirect_hint": "Where to send a user who logs in via the footer year double-click.",
"settings.frontend_login_redirect_auto": "Return to the page they came from (recommended)",
"settings.frontend_login_redirect_dashboard": "Always land in the dashboard",
"settings.login": "Login",
"settings.login_visual": "Login design",
"settings.visual_brand_asset": "Brand above text",
"settings.visual_brand_none": "None",
"settings.visual_brand_favicon": "Favicon",
"settings.visual_brand_logo": "Logo",
"settings.visual_image": "Image",
"settings.visual_image_hint": "Optional image from the image manager. Use background for a full-screen cover, or place it on the left or right side.",
"settings.visual_image_layout": "Image layout",
"settings.visual_image_none": "No image",
"settings.visual_image_left": "Left image",
"settings.visual_image_right": "Right image",
"settings.visual_image_background": "Background image",
"settings.visual_overlay_color": "Overlay color",
"settings.visual_overlay_color_hint": "Shown over background images; transparency is controlled with the slider.",
"settings.visual_login_box": "Login box",
"settings.visual_login_box_card": "Show box",
"settings.visual_login_box_plain": "No box",
"settings.visual_box_color": "Box color",
"settings.visual_box_color_hint": "Background color of the login box.",
"settings.visual_box_text_color": "Text color",
"settings.visual_box_text_color_hint": "Text color inside the login box.",
"settings.save_login": "Save Login Settings",
"toast.login_saved": "Login settings saved",
"settings.save_menus": "Save Menus",
"settings.favicon_png": "PNG fallback",
"settings.favicon_png_hint": "Optional PNG icon for browsers, pinned tabs, and touch devices that prefer a raster fallback. Recommended size: 512 × 512 px.",
"settings.logo_size": "Logo size",
"settings.logo_size_hint": "Controls the logo height in the public page header.",
"settings.logo_size_small": "Small",
"settings.logo_size_medium": "Medium",
"settings.logo_size_large": "Large",
"settings.default_og_image": "Default Open Graph image",
"settings.default_og_image_hint": "Used for sharing previews when a page has no custom Open Graph image. JPG/PNG only; recommended size: 1200 × 630 px.",
"settings.admin_logo": "Admin logo",
"settings.admin_logo_hint": "Optional logo for the admin top bar. Leave empty to use the favicon. Recommended size: SVG or PNG around 256 × 64 px.",
"settings.reset_branding": "Reset Branding",
"mails.delete_read": "Delete read",
"mails.delete_read_count": "Delete read ({count})",
"mails.open_email_settings": "Open Email Settings",
"mails.email_inactive_title": "Email sending is inactive:",
"mails.email_inactive_text": "Messages are saved locally, but no email notification is sent. Enable SMTP or Sendmail to receive notifications.",
"mails.email_recipient_missing_title": "Recipient email is missing:",
"mails.email_recipient_missing_text": "Messages are saved locally, but no email notification can be sent until a recipient address is set.",
"toast.read_messages_deleted": "{count} read messages deleted",
"modal.delete_read_messages": "Delete read messages",
"modal.delete_read_messages_confirm": "Delete {count} read messages? This cannot be undone.",
"nav.image_manager": "Image Manager",
"nav.media_library": "Media Library",
"nav.icon_manager": "Icon Manager",
"media_manager": "Media Library",
"image_manager": "Image Manager",
"image.formats_hint": "Supported image formats: JPG, PNG, WebP, GIF, SVG",
"audio.formats_hint": "Supported audio formats: MP3, WAV, OGG, M4A, AAC, FLAC",
"media.video_formats_hint": "Supported video formats: MP4, WebM, MOV, M4V",
"media.document_formats_hint": "Supported documents: PDF, Office, text files",
"media.type_all": "All",
"media.type_images": "Images",
"media.type_audio": "Audio",
"media.type_video": "Video",
"media.type_documents": "Documents",
"media.no_files": "No files found.",
"media.no_selection": "No file selected.",
"media.selection_count": "{count} files selected",
"media.file": "File",
"media.open_file": "Open file",
"media.folder": "Folder",
"media.folders": "Folders",
"media.folder_all": "All folders",
"media.folder_root": "Main folder",
"media.folder_create": "New folder",
"media.folder_create_prompt": "Folder name (letters, numbers, hyphen, underscore, dot; one level only):",
"media.download_file": "Download image",
"media.folder_created": "Folder created",
"media.folder_delete": "Delete folder",
"media.folder_delete_confirm": "Delete the empty folder \"{folder}\"?",
"media.folder_deleted": "Folder deleted",
"media.move_file": "Move file",
"media.move_file_prompt": "Move to folder. Leave empty for no folder. Available: {folders}",
"media.file_moved": "File moved",
"media.rename_file": "Rename file",
"media.ai_label": "AI label",
"media.ai_none": "No label",
"media.ai_generated": "AI-generated",
"media.ai_generated_desc": "Created with AI, e.g. with an image generator",
"media.ai_modified": "AI-modified",
"media.ai_modified_desc": "Real photo changed with AI, e.g. with generative fill or expand",
"media.ai_hint": "Realistic images created or changed with AI must be disclosed under Art. 50 of the EU AI Act. The label appears on the website automatically.",
"media.ai_saved": "AI label saved",
"media.ai_detected": "AI provenance detected: the image was labelled.",
"media.large_title": "Large for a web page ({size}). Better embed a smaller version.",
"media.large_badge": "large",
"media.download_original": "Download original ({size})",
"media.original_title": "Original kept: {size}, {width} × {height} px. Pages use the web version; the download hands out the original.",
"media.original_badge": "Original",
"media.original_copy_path": "Copy original path",
"media.original_view": "View original",
"media.original_hint": "Pages embed the web version. The original lives in assets/images-originals/ for downloads and print, not for embedding; it follows the file on rename, move and delete.",
"media.original_info": "{size}, {width} × {height} px (web version {web})",
"media.original_dialog_title": "Original file",
"media.web_version_created": "Web version created: {width} × {height} px, {size}. The original is kept; open it through the “Original” badge on the file.",
"media.size_limit_error": "{name} is too large (max. {max} MB).",
"media.server_limit_error": "{name} is too large: the server accepts uploads up to {max} MB (upload_max_filesize / post_max_size).",
"media.server_limit": "server limit {max} MB",
"media.upload_limit": "up to {max} MB per file",
"media.ai_badge": "AI",
"media.rename_new_name": "New filename",
"media.rename_scan_references": "Search JSON content for existing references first",
"media.rename_extension_hint": "The file extension cannot be changed. .jpeg and .jpg count as equivalent.",
"media.rename_references_found": "{count} reference(s) found in JSON content.",
"media.rename_references_confirm": "If you rename the file anyway, existing pages may still point to the old path.",
"media.rename_confirm_anyway": "Rename anyway",
"media.file_renamed": "File renamed",
"media.uploading_multiple": "Uploading files...",
"media.uploaded_multiple": "{count} files uploaded",
"media.upload_partial": "{uploaded} of {total} files uploaded.",
"media.previous_image": "Previous image",
"media.next_image": "Next image",
"image.library": "Library",
"image.no_selection": "No image selected.",
"image.trash": "Trash",
"image.search": "Search files",
"image.grid_view": "Grid view",
"image.list_view": "List view",
"image.upload": "Upload",
"image.drop_files": "Drop files here",
"image.or": "or",
"image.select": "Select",
"image.empty_trash": "Empty trash",
"image.col_filename": "Filename",
"image.col_size": "Size",
"image.col_date": "Date",
"image.copy_path": "Copy path",
"image.replace": "Replace",
"image.restore": "Restore",
"image.delete_permanently": "Delete permanently",
"image.no_search_results": "No matching files.",
"image.loading": "Loading...",
"image.uploading": "Uploading...",
"image.uploaded": "File uploaded",
"image.trashed": "File moved to trash",
"image.restored": "File restored",
"image.replaced": "File replaced",
"image.replacing": "Replacing...",
"image.deleted_permanently": "File deleted permanently",
"image.trash_emptied": "Trash emptied",
"image.empty_trash_confirm": "Empty the media trash? This cannot be undone.",
"image.delete_permanently_confirm": "Delete this file permanently? This cannot be undone.",
"image.exists": "A file with this name already exists.",
"image.overwrite_file": "Overwrite file",
"image.overwrite_desc": "Replace the existing file with the uploaded file.",
"image.save_new_name": "Save with new name",
"image.save_new_desc": "Keep both files and save the upload with a new name.",
"image.choose_file": "Choose file",
"image.format_error": "This file type is not supported.",
"image.size_error": "This file is too large.",
"image.trash_hint": "Files in trash can be restored or deleted permanently.",
"image_preview": "Image preview",
"icons.title": "Icon Manager",
"icons.add_icon": "Add Icon",
"icons.edit_icon": "Edit Icon",
"icons.delete_icon": "Delete Icon",
"icons.empty": "No icons available.",
"icons.path": "Icon set: {path}",
"icons.filter": "Search icons",
"icons.filter_placeholder": "Name, key, or tag",
"icons.sort": "Sort order",
"icons.sort_alpha": "Alphabetical",
"icons.sort_newest": "Newest first",
"icons.sort_oldest": "Oldest first",
"icons.key": "Icon key",
"icons.key_hint": "Renaming an icon key can break existing content that references the old key.",
"icons.label": "Label",
"icons.tags": "Tags",
"icons.tags_hint": "Stored metadata for search and filtering in icon pickers; does not affect rendering.",
"icons.viewbox": "ViewBox",
"icons.svg": "SVG code",
"icons.svg_hint": "Paste SVG inner markup or a full <svg>. raiju stores only the inner markup and adds the outer <svg> with a 24x24 viewBox when rendering. Scripts, event handlers, external references, and unsupported tags are removed on save.",
"icons.preview": "Preview",
"icons.source_core": "Core default",
"icons.source_custom": "Custom",
"icons.rename_warning_title": "Icon key changed",
"icons.rename_warning": "Existing JSON content may still reference the old icon key and will then fall back to the default icon.",
"icons.rename_confirm": "Rename this icon key? Existing content may still reference the old key.",
"icons.delete_confirm": "Delete icon \"{key}\"? Existing content that references this key will fall back to the default icon.",
"icons.saved": "Icon saved.",
"icons.deleted": "Icon deleted.",
"icons.load_error": "Error loading icons: {message}",
"icons.save_error": "Error saving icon: {message}",
"icons.delete_error": "Error deleting icon: {message}",
"icons.cleanup": "Clean up",
"icons.current_color": "Use currentColor",
"icons.cleanup_done": "SVG code cleaned up.",
"icons.import_icon": "Import from Icon Library",
"icons.icon_set": "Icon set",
"icons.search": "Search",
"icons.import": "Import",
"icons.imported_short": "Imported",
"icons.imported": "Icon imported.",
"icons.import_empty": "No icons found.",
"icons.import_loading": "Loading icons ...",
"icons.import_error": "Error importing icon: {message}",
"icons.import_query_short": "Enter at least 2 characters.",
"icons.import_license_hint": "Searching {set} through Iconify. License: {license}. Imported icons are stored locally.",
"icons.current_color_done": "Icon colors set to currentColor.",
"settings.access": "Access",
"settings.access_desc": "Control maintenance mode and preview bypass access.",
"settings.maintenance": "Maintenance mode",
"settings.maintenance_enabled": "Enable maintenance mode",
"settings.maintenance_mode": "Mode",
"settings.maintenance_mode_maintenance": "Maintenance",
"settings.maintenance_mode_offline": "Back soon",
"settings.maintenance_mode_launch": "Launch countdown",
"settings.maintenance_title": "Title",
"settings.maintenance_text": "Text",
"settings.maintenance_default_title": "Maintenance",
"settings.maintenance_default_text": "We will be back online shortly.",
"settings.maintenance_until": "Unavailable until",
"settings.maintenance_countdown": "Show countdown",
"settings.access_bypass": "Bypass link",
"settings.access_bypass_desc": "These links keep the website reachable while maintenance mode is on. A link is the site address, a question mark, the URL parameter, an equals sign and the key. Create several links for different people and revoke each one by deleting it.",
"settings.access_bypass_link": "Link:",
"settings.access_bypass_key_placeholder": "KEY",
"settings.access_bypass_param": "URL parameter",
"settings.access_bypass_key": "Key",
"settings.access_bypass_add": "Add link",
"settings.access_bypass_remove": "Remove link",
"settings.group_site": "Site",
"settings.group_features": "Features",
"settings.group_users": "Users",
"settings.group_system": "System",
"settings.modules": "Dashboard modules",
"settings.modules_nav": "Modules",
"settings.modules_desc": "Control which dashboard feature areas are available in this installation.",
"settings.modules_hint": "Disabled modules are hidden from dashboard navigation. When AI Features is off, AI tools and AI buttons are hidden throughout the admin UI. Existing content remains stored and can be re-enabled later.",
"settings.media_web_quality": "WebP quality (50–95)",
"settings.media_web_max_side": "Longest side of the web version (px)",
"settings.media_web_version_hint": "Large JPG, PNG and WebP images are scaled to the longest side and saved as WebP on upload; pages embed that version. The original stays under assets/images-originals/ and can be downloaded from the media library.",
"settings.media_web_version": "Create a web version on upload",
"settings.media_max_upload_hint": "Applies to JPG, PNG, WebP, GIF and SVG. The server caps uploads as well (upload_max_filesize, post_max_size); the system status shows both values.",
"settings.media_max_upload": "Upload limit for images (MB)",
"settings.media_section": "Media library",
"settings.module_ai": "AI Features",
"settings.module_news": "News",
"settings.module_events": "Events",
"settings.module_messages": "Messages",
"settings.module_icon_manager": "Icon Manager",
"settings.privacy": "Privacy",
"settings.privacy_desc": "Control frontend privacy behavior and local browser storage.",
"settings.email_obfuscation": "Obfuscate email addresses",
"settings.email_obfuscation_hint": "Public pages replace email addresses with JavaScript-decoded placeholders.",
"settings.remember_public_theme": "Remember public theme choice",
"settings.remember_public_theme_hint": "Stores the visitor's light/dark preference in local browser storage. Disable for highly privacy-sensitive sites.",
"settings.save_access": "Save Access Settings",
"settings.save_modules": "Save Dashboard Modules",
"settings.save_privacy": "Save Privacy Settings",
"toast.access_saved": "Access settings saved.",
"toast.modules_saved": "Dashboard modules saved.",
"toast.privacy_saved": "Privacy settings saved.",
"editor.visibility": "Visibility",
"editor.visibility_public": "Public",
"editor.visibility_private": "Private, password protected",
"editor.visibility_password": "Page password",
"editor.visibility_title": "Password page title",
"editor.visibility_text": "Password page text",
"editor.visibility_password_hint": "Required when switching the page to private.",
"editor.visibility_password_set": "A password is already stored. Enter a new one only to replace it.",
"editor.seo": "SEO / AEO",
"editor.settings_basics": "Basics",
"editor.settings_navigation": "Navigation",
"editor.settings_access": "Access",
"editor.seo_hint": "Search previews, answer summaries, sharing, and indexing.",
"editor.ai_fill_seo": "Fill SEO fields with AI",
"editor.ai_fill_field": "Fill this field with AI",
"editor.ai_generating": "AI is generating...",
"editor.ai_done": "AI suggestion inserted.",
"editor.ai_unavailable": "AI text generation is not active.",
"editor.seo_title": "SEO title (defaults to page title)",
"editor.seo_description": "Meta description (defaults to page description)",
"editor.seo_answer_summary": "Short answer / AI summary for answer engines",
"editor.seo_canonical": "Canonical URL (optional)",
"editor.seo_robots_index": "Index, follow",
"editor.seo_robots_noindex": "Noindex, follow",
"editor.seo_robots_private": "Noindex, nofollow",
"editor.seo_og_title": "Open Graph title",
"editor.seo_og_description": "Open Graph description",
"editor.seo_og_image": "Open Graph image",
"editor.seo_og_image_format": "Open Graph images must be JPG or PNG files from /assets/images/.",
"editor.seo_sitemap": "Include in XML sitemap",
"ai.title": "AI",
"ai.settings": "AI Settings",
"ai.settings_desc": "Configure an OpenAI-compatible AI provider, budgets, quotas, and enabled AI features.",
"ai.open_settings": "AI Settings",
"ai.not_configured_title": "AI is not configured",
"ai.not_configured_text": "Add an API key or configure an explicitly allowed local provider before AI tools can be used.",
"ai.module_disabled_status": "AI features are disabled in Modules.",
"ai.dismiss_notice": "Dismiss AI notice",
"ai.disabled_status": "A provider is configured, but AI features are disabled.",
"ai.configured_status": "AI is configured and enabled. Usage limits and audit logging are active.",
"ai.assistant": "Assistant",
"ai.assistant_placeholder": "Ask how to change settings, edit content, or use raiju.",
"ai.text_generator": "Text generator",
"ai.text_placeholder": "Example: Write an SEO meta description for this page...",
"ai.image_generator": "Image generator",
"ai.image_prompt": "Image prompt",
"ai.image_placeholder": "Describe the image to generate.",
"ai.image_generator_disabled": "The image generator is disabled in AI settings.",
"ai.image_filename": "Filename",
"ai.image_filename_placeholder": "e.g. homepage-hero",
"ai.image_filename_hint": "Without file extension. The output format determines .png, .jpg, or .webp.",
"ai.image_filename_suggest": "Suggest from prompt",
"ai.send": "Send",
"ai.chat_shortcuts": "Enter to send · Cmd/Ctrl+Enter for a line break.",
"ai.chat_shortcuts_mac": "Enter to send · Cmd+Enter for a line break.",
"ai.chat_shortcuts_ctrl": "Enter to send · Ctrl+Enter for a line break.",
"ai.answering": "Generating answer...",
"ai.generate_text": "Generate Text",
"ai.generate_image": "Generate Image",
"ai.generate_images": "Generate Images",
"ai.generating": "Generating...",
"ai.max_output_tokens": "Max output tokens",
"ai.image_size": "Resolution / orientation",
"ai.image_size_auto": "Auto",
"ai.image_scale": "Resolution",
"ai.image_cost_per_image": "Estimated cost per image: {cost}",
"ai.image_size_note": "Computed image size: {size}.",
"ai.image_size_note_auto": "Provider chooses the image size automatically.",
"ai.image_orientation_square": "Square",
"ai.image_orientation_landscape": "Landscape",
"ai.image_orientation_portrait": "Portrait",
"ai.image_format": "Format",
"ai.image_quality": "Quality / detail level",
"ai.image_auto": "Auto",
"ai.image_quality_low": "Low",
"ai.image_quality_medium": "Medium",
"ai.image_quality_high": "High",
"ai.image_background": "Background",
"ai.image_background_opaque": "Opaque",
"ai.image_background_transparent": "Transparent",
"ai.image_moderation": "Provider safety",
"ai.image_moderation_standard": "Standard",
"ai.image_moderation_low": "Less strict",
"ai.image_compression": "Compression",
"ai.image_count": "Images",
"ai.image_count_increase": "Increase image count",
"ai.image_count_decrease": "Decrease image count",
"ai.image_reference": "Reference image",
"ai.image_reference_upload": "Upload image",
"ai.image_reference_library": "Media Library",
"ai.image_reference_none": "No reference image",
"ai.image_reference_count": "{count} of {max} reference images",
"ai.image_reference_file": "Reference image",
"ai.image_reference_remove": "Remove reference image",
"ai.improve_prompt": "Improve prompt",
"ai.improving_prompt": "Improving...",
"ai.image_group_auto": "Auto",
"ai.image_group_square": "Square",
"ai.image_group_landscape": "Landscape",
"ai.image_group_portrait": "Portrait",
"ai.image_history_title": "Recent generations",
"ai.image_history_hint": "Saved locally with prompt, model, options, status, and media links.",
"ai.image_history_empty": "No image generations saved yet.",
"ai.image_history_load_more": "Load more",
"ai.image_history_clear": "Clear history",
"ai.image_history_clear_confirm": "Clear the complete image generation history? Generated image files remain in the Media Library.",
"ai.image_history_cleared": "Image generation history cleared.",
"ai.image_history_use_prompt": "Use prompt",
"ai.image_history_error": "No image",
"ai.image_history_status_success": "Created",
"ai.image_history_status_error": "Failed",
"ai.image_job_queued": "Image generation started in the background.",
"ai.image_job_finished": "Image generation finished.",
"ai.image_job_failed": "Image generation failed.",
"ai.image_model_missing_note": "Add an image model in AI Settings before generating images.",
"ai.image_anthropic_note": "Anthropic has no image API. Choose an image service so that the agent and the image tools can create images.",
"ai.image_openrouter_note": "OpenRouter image generation uses compatible multimodal models such as Gemini; options may vary by model.",
"ai.image_field_hint": "Need a new image for this field?",
"ai.open_image_generator": "AI Image Generator",
"ai.provider": "Provider",
"ai.enable_ai": "Enable AI features",
"ai.openai_compatible": "OpenAI-compatible",
"ai.anthropic": "Anthropic (Claude)",
"ai.openrouter": "OpenRouter",
"ai.kie": "Kie.ai",
"ai.openrouter_image_gpt": "GPT Image 2",
"ai.openai_image_gpt": "GPT Image 2",
"ai.openrouter_image_gemini_flash": "Nano Banana 2",
"ai.openrouter_image_gemini_pro": "Nano Banana Pro",
"ai.openrouter_image_model_hint": "OpenRouter requires provider-prefixed model IDs; raiju stores the selected ID automatically.",
"ai.base_url": "Base URL",
"ai.allow_local_provider": "Allow local/private provider URL",
"ai.allow_local_provider_hint": "Required for Ollama, LM Studio, or self-hosted providers on localhost/private networks.",
"ai.api_key": "API key",
"ai.api_key_saved": "API key saved. Leave unchanged to keep it.",
"ai.api_key_missing": "No API key stored. Local providers may work without one.",
"ai.clear_api_key": "Remove stored API key",
"ai.organization": "OpenAI organization ID (optional)",
"ai.models": "Models",
"ai.chat_model": "Chat model",
"ai.text_model": "Text model",
"ai.image_model": "Image model",
"ai.features": "Features",
"ai.feature_assistant": "Backend assistant",
"ai.feature_seo": "SEO/text generation",
"ai.feature_images": "Image generation",
"ai.assistant_surface_visual_editor": "Show chatbot in Visual Editor",
"ai.assistant_surface_dashboard": "Show chatbot in Dashboard",
"ai.assistant_force_english": "Ignore dashboard language setting - always use English for the chatbot",
"ai.assistant_force_english_hint": "When enabled, the AI Assistant answers in English even if the dashboard is shown in another language.",
"ai.limits": "Limits",
"ai.monthly_budget": "Monthly budget (cents)",
"ai.daily_requests": "Daily requests",
"ai.daily_text_requests": "Daily text requests",
"ai.daily_image_requests": "Daily image requests",
"ai.max_input_tokens": "Max input tokens",
"ai.max_input_tokens_hint": "Recommendation: 64,000. Enough for the agent and long pages; lower it only to save cost on very small sites.",
"ai.max_output_tokens_hint": "Recommendation: 16,000. Reasoning models count their thinking towards this limit, so a low value can cut answers off. The limit only caps one answer; you pay for what is generated.",
"ai.request_timeout": "Request timeout (sec.)",
"ai.request_timeout_hint": "Recommendation: 300 seconds for image generation; text requests usually finish much faster.",
"ai.pricing": "Cost estimates",
"ai.input_price": "Input cents / 1M tokens",
"ai.output_price": "Output cents / 1M tokens",
"ai.image_price": "Default price per image (cents)",
"ai.save_settings": "Save AI Settings",
"ai.test_connection": "Test Connection",
"ai.testing": "Testing...",
"ai.connection_ok": "AI connection works.",
"ai.settings_saved": "AI settings saved.",
"ai.audit_tab": "Content audit",
"ai.audit_hint": "Scan all pages for missing or weak SEO descriptions and images without alt text. The scan itself is free; suggestions use the AI text model.",
"ai.audit_run": "Run audit",
"ai.audit_running": "Scanning pages...",
"ai.audit_empty": "No pages found.",
"ai.audit_col_page": "Page",
"ai.audit_col_description": "SEO description",
"ai.audit_col_alt": "Image alt texts",
"ai.audit_status_missing": "Missing",
"ai.audit_status_short": "Too short",
"ai.audit_status_long": "Too long",
"ai.audit_status_ok": "OK",
"ai.audit_alt_missing": "{count} missing",
"ai.audit_suggest": "Suggest description",
"ai.audit_apply": "Apply",
"ai.audit_applied": "Applied",
"ai.audit_apply_confirm": "Save this description to \"{page}\"? A backup is created first.",
"ai.usage_panel": "Usage this month",
"ai.usage_requests_today": "Requests today",
"ai.usage_text_image_split": "{text} text · {images} image",
"ai.usage_cost_month": "Cost this month",
"ai.usage_requests_month": "{requests} requests",
"ai.usage_tokens_month": "Tokens this month",
"ai.usage_tokens_split": "{input} in · {output} out",
"ai.usage_budget": "Monthly budget",
"ai.usage_budget_value": "{spent} of {budget} ({percent}%)",
"ai.pricing_autofilled": "Pricing fields were filled from the OpenRouter model data. Review and save.",
"ai.model_list_open": "Show model suggestions",
"ai.usage_summary": "Today: {today} requests · Month: {cost}",
"dashboard_home.title": "Dashboard",
"dashboard_home.page_views_today": "Views today",
"dashboard_home.page_views_30d": "Views in 30 days",
"dashboard_home.visitors_30d": "Visitors in 30 days",
"dashboard_home.visits_30d": "Visits in 30 days",
"dashboard_home.bots_filtered": "Bots filtered",
"dashboard_home.pages": "Pages",
"dashboard_home.news": "News posts",
"dashboard_home.top_pages": "Top pages",
"dashboard_home.referrers": "Referrers",
"dashboard_home.devices": "Devices",
"dashboard_home.browsers_os": "Browsers / OS",
"dashboard_home.no_views": "No page views recorded yet.",
"dashboard_home.no_data": "No data yet.",
"dashboard_home.views_detail": "{views} views · {visitors} visitors · {visits} visits",
"dashboard_home.ai_status": "AI status",
"dashboard_home.ai_tools": "AI tools",
"dashboard_home.analytics": "Analytics",
"dashboard_home.analytics_hint": "Visitor overview for the last 30 days with bot traffic filtered.",
"dashboard_home.analytics_details": "Technology details",
"dashboard_home.content_overview": "Content overview",
"dashboard_home.traffic_curve": "Traffic trend",
"dashboard_home.views_label": "views",
"dashboard_home.analytics_range": "Analytics range",
"dashboard_home.range_days": "30 days",
"dashboard_home.range_months": "12 months",
"dashboard_home.range_years": "Years",
"dashboard_home.range_label_days": "last {count} days",
"dashboard_home.range_label_months": "last {count} months",
"dashboard_home.range_label_years": "all years",
"dashboard_home.views_period": "Views in {period}",
"dashboard_home.visitors_period": "Visitors in {period}",
"dashboard_home.visits_period": "Visits in {period}",
"dashboard_home.hourly_distribution": "Today by hour",
"dashboard_home.today": "Today",
"dashboard_home.site_status": "Site status",
"dashboard_home.unread_messages": "Unread messages",
"dashboard_home.backup_status": "Last backup",
"dashboard_home.auto_backup": "Auto backup",
"dashboard_home.no_backup": "No backup",
"dashboard_home.active": "Active",
"dashboard_home.inactive": "Inactive",
"dashboard_home.recent_edit": "Last edited",
"dashboard_home.current_user": "Signed in",
"save": "Save",
"saving": "Saving...",
"cancel": "Cancel",
"delete": "Delete",
"edit": "Edit",
"logout": "Log out",
"show": "Show",
"hide": "Hide",
"undo": "Undo",
"redo": "Redo",
"bold": "Bold",
"italic": "Italic",
"insert_link": "Insert link",
"clean_formatting": "Clean formatting",
"visual_editor": "Visual editor",
"edit_reminder.title": "Edit this page?",
"edit_reminder.message": "You are logged in. Activate the visual editor to edit text and images directly on this page.",
"edit_reminder.dismiss": "Keep browsing",
"edit_reminder.activate": "Activate visual editor",
"content_editor": "Content editor",
"edit_block_title": "Edit block",
"edit_mode_hint": "Edit mode is active.",
"drag_reorder": "Drag to reorder",
"search_blocks": "Search blocks",
"add_block": "Add block",
"cat.content": "Content",
"cat.media": "Media",
"cat.embed": "Embed",
"cat.cards": "Cards",
"cat.layout": "Layout",
"cat.interactive": "Interactive",
"btn.move_up": "Move up",
"btn.move_down": "Move down",
"nav.edit_mode_active": "Edit mode active",
"nav.unsaved_changes": "Unsaved changes",
"link_internal": "Internal link",
"link_external": "External link",
"link_target": "Link target",
"link_open_new_tab": "Open in new tab",
"link_offer_download": "Offer as download",
"footer.edit": "Edit footer",
"footer.copyright": "Copyright",
"footer.link_text": "Link text",
"footer.link_url": "Link URL",
"item.delete": "Delete item",
"item.delete_confirm": "Delete this item?",
"section.delete": "Delete section",
"section.delete_confirm": "Delete this section?",
"section.reload_hint": "Reload the page to see the updated section layout.",
"image.col_actions": "Actions",
"editor.change_image": "Change image",
"audio.manager": "Audio Library",
"audio.upload": "Upload audio",
"audio.select": "Select audio",
"audio.search": "Search audio",
"audio.no_files": "No audio files found.",
"audio.loading": "Loading audio...",
"audio.play": "Play audio",
"audio.playing": "Playing audio",
"audio.delete": "Delete audio",
"audio.delete_confirm": "Delete this audio file?",
"audio.uploaded": "Audio uploaded",
"audio.trashed": "Audio moved to trash",
"audio.trash_hint": "Audio files in trash can be restored or deleted permanently.",
"audio.error_loading": "Error loading audio files.",
"audio.format_error": "This audio format is not supported.",
"audio.size_error": "This audio file is too large.",
"event.new": "New event",
"event.edit": "Edit event",
"event.delete": "Delete event",
"event.delete_confirm": "Delete this event? This cannot be undone.",
"event.cannot_undo": "This cannot be undone.",
"event.copy_to_all": "Copy to all languages",
"event.date_required": "Start date is required.",
"event.title": "Title",
"event.location": "Location",
"event.description": "Description",
"event.admission": "Admission",
"event.url": "URL",
"event.image": "Image",
"event.start_date": "Start date",
"event.start_time": "Start time",
"event.end_date": "End date",
"event.end_time": "End time",
"history.title": "History",
"history.empty": "No history entries yet.",
"history.restore": "Restore",
"history.restore_title": "Restore version",
"history.restore_confirm": "Restore this version? Current unsaved changes will be lost.",
"history.overwrite": "Overwrite current content",
"history.overwrite_warning": "This will overwrite the current content.",
"history.not_found": "History entry not found.",
"history.clear": "Clear history",
"history.clear_confirm": "Clear history? This cannot be undone.",
"history.cleared": "History cleared.",
"toast.error": "Something went wrong.",
"toast.error_saving_short": "Could not save.",
"toast.error_deleting": "Could not delete.",
"toast.error_undo": "Could not undo.",
"toast.upload_error": "Upload failed.",
"toast.no_changes": "No changes to save.",
"toast.copied": "Copied.",
"toast.copied_to_empty": "Copied into empty field.",
"toast.change_queued": "Change queued.",
"toast.order_changed": "Order changed.",
"toast.hidden": "Hidden.",
"toast.visible": "Visible.",
"toast.row_hidden": "Row hidden.",
"toast.row_visible": "Row visible.",
"toast.event_hidden": "Event hidden.",
"toast.event_visible": "Event visible.",
"toast.undone": "Change undone.",
"toast.formatting_cleaned": "Formatting cleaned.",
"toast.select_text_first": "Select text first.",
"toast.sort_same_section": "Items can only be sorted within the same section.",
"copilot.title": "AI Assistant",
"copilot.type_page": "Standard page",
"copilot.type_news": "News post",
"copilot.type_event": "Event / appointment",
"copilot.type_form": "Form",
"copilot.subtitle": "Safe editor assistance",
"copilot.close": "Close AI Assistant",
"copilot.placeholder": "Ask how to change this page...",
"copilot.ask": "Ask AI Assistant",
"copilot.draft_changes": "Draft changes",
"copilot.draft_content": "Draft content",
"copilot.draft_image": "Image",
"copilot.shortcut_needs_prompt": "Enter an instruction first.",
"copilot.draft_changes_hint": "Open a guided dialog to prepare a reviewed page change.",
"copilot.draft_content_hint": "Open a guided dialog to prepare a new page, news post, event, or appointment.",
"copilot.draft_image_hint": "Open image options and enter or refine the image prompt.",
"copilot.send": "Send",
"copilot.not_ready": "AI is not ready yet. Check AI Settings in the dashboard.",
"copilot.current_page": "current page",
"copilot.field_hints": "{count} editable field hints found",
"copilot.selected_field": "Selected field: {field}",
"copilot.missing": "Missing: {fields}",
"copilot.create_draft": "Create draft",
"copilot.needs_details_hint": "Ask another message with the missing details before creating.",
"copilot.complete_details": "Complete details",
"copilot.complete_details_title": "Complete content details",
"copilot.update_draft": "Update draft",
"copilot.update_draft_instruction": "Update the content draft with the submitted form fields.",
"copilot.content_draft_title": "{type} draft",
"copilot.ready_to_create": "Ready to create",
"copilot.needs_details": "Needs details",
"copilot.private_draft": "Private draft",
"copilot.hidden_draft": "Hidden draft",
"copilot.draft_created": "Draft created",
"copilot.open_dashboard": "Open in dashboard",
"copilot.open_preview": "Open preview URL",
"copilot.created_title": "{type} created",
"copilot.last_change": "Last AI change applied",
"copilot.undo": "Undo",
"copilot.alt_text": "Alt text",
"copilot.current": "Current",
"copilot.draft": "Draft",
"copilot.review_backup": "Review before applying. A backup is created server-side.",
"copilot.apply": "Apply",
"copilot.copy": "Copy",
"copilot.copied_message": "Copied the draft value for {field}.",
"copilot.copy_failed": "Could not copy the draft value.",
"copilot.publish": "Publish",
"copilot.publish_confirm": "Publish this draft now?",
"copilot.published_message": "Published {type} \"{id}\".",
"copilot.intro_message": "I can help with this page and explain how to edit or create content safely. Write what you want to change or create.",
"copilot.no_response": "No response.",
"copilot.suggestions_ready": "I drafted safe field-level suggestions. Review the preview cards below.",
"copilot.no_safe_field": "I could not map that request to a safe editable field on this page yet.",
"copilot.content_draft_ready_message": "I prepared a new {type} draft. Review the preview before creating it.",
"copilot.content_draft_needs_details_message": "I prepared a draft, but it needs more details before it can be created.",
"copilot.content_unavailable": "Content creation is not available for your role or this site configuration.",
"copilot.image_unavailable": "Image generation is not available for your role, this page, or the current AI settings.",
"copilot.no_image_field": "I could not find an editable image field on this page.",
"copilot.choose_image_field": "Which image field should I use?",
"copilot.image_options_title": "Image options",
"copilot.image_options_hint": "Choose the target image and generation mode.",
"copilot.image_mode_label": "Mode",
"copilot.image_mode_generate": "From prompt",
"copilot.image_mode_edit": "With reference image",
"copilot.image_size": "Size",
"copilot.image_size_auto": "Auto",
"copilot.image_size_square": "Square",
"copilot.image_size_landscape": "Landscape",
"copilot.image_size_portrait": "Portrait",
"copilot.image_count": "Images",
"copilot.image_format": "Format",
"copilot.image_quality": "Quality",
"copilot.image_quality_auto": "Auto",
"copilot.image_quality_low": "Low",
"copilot.image_quality_medium": "Medium",
"copilot.image_quality_high": "High",
"copilot.image_generate_action": "Generate image",
"copilot.image_options_ready": "Choose the image field and whether to generate a new image or edit the current one.",
"copilot.image_job_queued": "Image generation is running in the background. You can keep working; I will show the preview when it is ready.",
"copilot.image_draft_ready": "Generated image ready. Review the preview card before applying it.",
"copilot.image_no_proposal": "Image generation returned no preview.",
"copilot.apply_confirm": "Apply this AI draft to \"{field}\"?",
"copilot.applied_message": "Applied the draft to {field}. A backup was created before saving.",
"copilot.undo_confirm": "Undo the last AI change on this page? The current state will be backed up first.",
"copilot.undo_message": "Restored the page from the backup. Reloading the page now.",
"copilot.create_confirm": "Create this {type} draft?",
"copilot.created_message": "Created {type} draft \"{id}\". It is not published publicly by default.",
"copilot.created_page_navigation_hint": "Open the page in the Content Editor and set Page Settings / Navigation if it should appear in a menu.",
"copilot.navigation_manual_required": "No change was applied. I cannot safely change page navigation directly from chat yet. Open Page Settings / Navigation in the Content Editor and select the menus where this page should appear.",
"copilot.image_request_failed": "Image generation failed.",
"copilot.working_translate": "Translating the page content...",
"copilot.translate_ready": "I drafted {target} translations. Review the preview cards below; applying saves them to the {target} page.",
"copilot.translate_no_fields": "I could not draft translations for this page. Check that the target language page exists and has translatable fields.",
"copilot.translate_unavailable": "Translation drafts are not available for your role or on this surface. Open the page in the Visual Editor to translate it.",
"copilot.request_failed": "AI Assistant request failed.",
"copilot.proposal_summary_title": "Planned changes",
"copilot.proposal_summary_hint": "{count} changes will be reviewed together.",
"copilot.apply_all": "Apply all",
"copilot.apply_all_confirm_title": "Apply all AI drafts?",
"copilot.apply_all_confirm_body": "Apply these {count} AI drafts? A backup is created for every changed page state.",
"copilot.applied_all_message": "Applied {count} AI drafts. A backup was created before each save.",
"copilot.apply_confirm_title": "Apply AI draft?",
"copilot.confirm_title": "Confirm action",
"copilot.modal_cancel": "Cancel",
"copilot.modal_confirm": "Confirm",
"copilot.enable_visual_editor_title": "Activate Visual Editor?",
"copilot.enable_visual_editor_action": "Activate Visual Editor",
"copilot.undo_confirm_title": "Undo last AI change?",
"copilot.create_confirm_title": "Create draft?",
"copilot.publish_confirm_title": "Publish draft?",
"copilot.summary_hide": "Hide field",
"copilot.summary_show": "Show field",
"copilot.summary_image": "Replace image",
"copilot.request_timeout": "AI Assistant request timed out. No change was applied.",
"copilot.working": "AI Assistant is working...",
"copilot.working_context": "Loading page context...",
"copilot.working_chat": "Thinking about your question...",
"copilot.working_draft": "Drafting a safe change...",
"copilot.working_content": "Preparing a content draft...",
"copilot.working_image": "Generating image...",
"copilot.working_apply": "Applying the confirmed change...",
"copilot.working_undo": "Restoring the previous version...",
"copilot.working_create": "Creating the confirmed draft...",
"copilot.working_publish": "Publishing the confirmed draft...",
"copilot.enable_visual_editor_confirm": "The Visual Editor must be active before AI changes can be prepared on this page. Activate it now?",
"copilot.visual_editor_required": "No change was made. Activate the Visual Editor first, then ask me to prepare the change again.",
"copilot.visual_editor_enabled": "Visual Editor is active. I will prepare the change as a preview first.",
"copilot.visual_editor_unavailable": "The Visual Editor is not available on this page, so I cannot safely prepare page changes here.",
"copilot.use_current_image_confirm": "Use the current image as a reference for editing? Choose Cancel to generate a new image from the prompt only.",
"copilot.maximize": "Maximize AI Assistant",
"copilot.minimize": "Minimize AI Assistant",
"copilot.no_pending_preview": "There is no reviewed AI preview waiting to apply. Ask for a change first, then use the preview card.",
"copilot.image_prompt": "Prompt",
"copilot.image_prompt_placeholder": "Describe the image to generate...",
"copilot.image_prompt_required": "Add a prompt before generating an image.",
"copilot.image_request_timeout": "Image generation timed out. No image preview was created.",
"copilot.session_expired": "Your session expired. Please log in again in the dashboard, then reload this page.",
"copilot.applied_image_message": "Applied the generated image to {field}. A backup was created before saving.",
"copilot.generated_image": "Generated image",
"copilot.generated_image_applied": "Generated image applied",
"copilot.history": "Chat history",
"copilot.history_loading": "Loading chat history...",
"copilot.history_empty": "No archived chats yet.",
"copilot.new_chat": "New chat",
"copilot.delete_chat": "Delete chat",
"copilot.delete_chat_title": "Delete chat?",
"copilot.delete_chat_confirm": "Delete this AI Assistant chat history? This cannot be undone.",
"copilot.untitled_chat": "Untitled chat",
"copilot.dashboard_context": "Dashboard",
"copilot.dashboard_hint": "General site and dashboard assistance",
"copilot.undo_detail": "Changed: {field}",
"copilot.unknown_field": "selected field",
"copilot.section_field_label": "Section {section} {field}",
"copilot.change_details_title": "Prepare change",
"copilot.change_details_hint": "Describe the change. The Assistant will create a reviewable preview before anything is applied.",
"copilot.target_field": "Target",
"copilot.current_selection_none": "No field selected",
"copilot.change_instruction": "Change instruction",
"copilot.change_instruction_placeholder": "Describe what should change on this page...",
"copilot.prepare_preview": "Prepare preview",
"copilot.content_type": "Content type",
"copilot.content_type_page": "Page",
"copilot.content_type_news": "News post",
"copilot.content_type_event": "Event / appointment",
"copilot.choose_target_field": "Choose target field",
"copilot.choose_target_field_placeholder": "Select a field...",
"copilot.choose_target_field_hint": "You can also click an editable element on the page before opening this dialog.",
"copilot.choose_target_required": "Choose the field you want to change first.",
"copilot.current_field_content": "Current content",
"copilot.current_field_empty": "This field is currently empty.",
"copilot.current_field_select": "Choose a target field to preview its current content.",
"copilot.dash_apply": "Apply",
"copilot.dash_open_btn": "Open",
"copilot.dash_dismiss": "Dismiss",
"copilot.dash_applying": "Working...",
"copilot.dash_done": "Done.",
"copilot.dash_failed": "That did not work.",
"copilot.dash_opened": "Opened.",
"copilot.dash_language_reload": "Saved. The dashboard reloads in the new language.",
"copilot.dash_adjusted": "Saved. The colour was adjusted slightly so it stays readable.",
"copilot.dash_saved": "Saved.",
"copilot.dash_open_title": "Open {target}",
"copilot.dash_change_title": "Change {setting}",
"copilot.dash_already": "{setting} is already {value}.",
"copilot.dash_setting_adminTheme": "dashboard theme",
"copilot.dash_setting_primaryColor": "main colour of the dashboard",
"copilot.dash_setting_accentColor": "accent colour of the dashboard",
"copilot.dash_setting_adminLanguage": "dashboard language",
"copilot.dash_value_light": "Light",
"copilot.dash_value_dark": "Dark",
"copilot.dash_value_system": "Follow the device",
"copilot.dash_actions_ready": "I prepared this for you. Check the card and confirm it.",
"copilot.dash_not_possible": "I could not prepare that. Tell me what you want to change or where you want to go, and I will show you the way.",
"copilot.dash_open_new_tab": "Open in a new tab",
"copilot.dash_where_title": "Here is where to find it: {name}",
"copilot.dash_where_lead": "I can't do that for you here, but this is where you find it:",
"copilot.dash_admin_only": "That is reserved for administrators. This is where it is in the dashboard:",
"copilot.dash_module_off_title": "{target} is switched off",
"copilot.dash_value_unclear": "I could not use that value. You can set it yourself here: {name}",
"copilot.map_admin_only": "Only administrators can do this.",
"copilot.map_module_off": "This module is switched off. You can switch it on under {path}.",
"copilot.safety_blocked": "I discarded this suggestion: it looked like fraud, phishing, malware, hate, or adult or unlawful content.",
"copilot.safety_note": "Safety note: this text asks for passwords or payment details, has links that need a second look, or contains instructions aimed at an AI. Check it carefully before applying.",
"ai.image_jobs_title": "Image jobs",
"ai.image_jobs_check": "Check jobs",
"ai.image_jobs_idle": "No open image jobs.",
"ai.image_jobs_open": "{count} image job(s) queued or running.",
"ai.image_jobs_finished": "Latest image job finished.",
"ai.image_jobs_failed": "Latest image job failed.",
"lists.summary_empty": "0 entries",
"lists.summary_range": "Showing {from}-{to} of {total} entries",
"lists.pagination": "Pagination",
"lists.previous_page": "Previous page",
"lists.next_page": "Next page",
"settings.list_pagination": "Lists & pagination",
"settings.dashboard_design": "Design",
"settings.list_pagination_desc": "Controls how many entries dashboard lists show before pagination appears.",
"settings.items_per_page": "Entries per page",
"settings.items_per_page_hint": "Used for pages, news, events, trash views and messages. Default: 50.",
"settings.icon_items_per_page": "Icon Manager entries per page",
"settings.icon_items_per_page_hint": "Used only for the Icon Manager grid. Default: 50.",
"settings.media_items_per_page": "Media Library entries per page",
"settings.media_items_per_page_hint": "Used for the Media Library grid and list views. Default: 25.",
"conflict.changed": "Changed in the meantime",
"conflict.reload_required": "Load the current version before saving.",
"conflict.hint": "Your changes have not been saved. Compare the versions, save a copy if needed, then reload to edit the current version.",
"conflict.yours": "Your unsaved version",
"conflict.current": "Current saved version",
"conflict.unavailable": "The current version could not be loaded.",
"conflict.keep": "Keep editing",
"conflict.download": "Download my changes",
"conflict.reload": "Discard changes and reload",
"system.title": "System status",
"system.loading": "Loading system status…",
"system.runtime": "PHP and extensions",
"system.storage": "Storage and backups",
"system.available": "Available",
"system.missing": "Missing",
"system.writable": "Writable",
"system.not_writable": "Missing or not writable",
"system.last_backup": "Latest successful backup",
"system.no_backup": "No backup available",
"system.failed_jobs": "Failed image jobs",
"system.state": "Status",
"system.no_failed_jobs": "No failed jobs in the latest 100 jobs",
"system.requests": "Open AI reservations",
"system.no_requests": "No open reservations",
"system.resolve_hint": "Check the provider’s request history before resolving an uncertain request. A reservation can be resolved after 15 minutes of inactivity. “Charged” records the reserved estimate; it does not import an invoice.",
"system.details": "Show details",
"system.request_id": "Request ID",
"system.provider_tasks": "Provider task IDs",
"system.resolve_charged": "Provider charged the request",
"system.resolve_released": "Provider did not charge",
"system.load_failed": "System status could not be loaded. Please try again.",
"security_check.title": "Security",
"security_check.run": "Check now",
"security_check.running": "Checking…",
"security_check.pending": "Not checked yet",
"security_check.checked_at": "Last checked: {date}",
"security_check.how_to_fix": "How to fix",
"security_check.copy": "Copy",
"security_check.copied": "Copied",
"security_check.unknown": "Could not be checked",
"security_check.unknown_reason": "Could not be checked: {reason}",
"security_check.skipped_local": "Checked only under a public address",
"security_check.skipped_dev_server": "Not possible on the PHP development server",
"security_check.skipped_scheme": "Checked only when the dashboard uses https://",
"security_check.skipped_port": "Not checked for addresses with a custom port",
"security_check.reason_unreachable": "the server could not load a test file from {url} ({detail})",
"security_check.reason_auth": "the site is password-protected (HTTP 401)",
"security_check.reason_status": "unexpected server response ({detail})",
"security_check.reason_not_writable": "test files could not be created",
"security_check.reason_no_curl": "the PHP extension curl is missing",
"security_check.reason_host": "the site address is unknown",
"security_check.folders": "Internal folders",
"security_check.folders_ok": "Not publicly accessible",
"security_check.folders_critical": "Publicly accessible: {paths}",
"security_check.folders_warning": "Publicly accessible: {paths}",
"security_check.folders_skipped_local": "Local installation: checked only via “Check now”",
"security_check.folders_fix": "The web server delivers files from these folders directly and bypasses .htaccess, usually because an nginx server in front delivers static files itself. This exposes, among others, user accounts with password hashes (content/users.json), settings with the SMTP password and web cron token (content/settings.json), form submissions (content/mails.json) and backups (backups/). Block the folders in the site's nginx configuration and check again. If the site was already publicly reachable like this, change the passwords, the SMTP password and the web cron token afterwards.",
"security_check.folders_fix_trash": "The web server delivers files from the media trash folders directly and bypasses .htaccess, usually because an nginx server in front delivers images and media itself. Anyone who knows the address of a deleted file can still download it. Block the folders in the site's nginx configuration and check again.",
"security_check.folders_hestia": "HestiaCP: save the lines as /home/<user>/conf/web/{domain}/nginx.ssl.conf_raiju (for http:// also as nginx.conf_raiju), then reload nginx as root: nginx -t && systemctl reload nginx",
"security_check.folders_plesk": "Plesk: switch off “Serve static files directly by nginx” (with the default “Smart static files processing”, .htaccess applies) or add the lines under “Apache & nginx Settings” → “Additional nginx directives”.",
"security_check.folders_htaccess": "Without nginx in front, .htaccess is probably missing (include hidden files when uploading) or Apache ignores it (AllowOverride All).",
"security_check.folders_manual": "Check from outside that the server blocks an existing file, for example with: curl -I {url} (expected status: 403 or 404).",
"security_check.probe_exposed": "public (HTTP {status})",
"security_check.probe_protected": "blocked (HTTP {status})",
"security_check.probe_unknown": "unclear (HTTP {status})",
"security_check.probe_skipped": "not checked",
"security_check.http": "Unencrypted access",
"security_check.http_redirect": "http:// redirects to https://",
"security_check.http_closed": "Not reachable via http://",
"security_check.http_open": "Also reachable without encryption via http://",
"security_check.http_fix": "Enable the permanent redirect from http:// to https:// in your hosting panel so logins and form submissions are never sent unencrypted.",
"security_check.https": "Encryption",
"security_check.https_ok": "The dashboard uses https://",
"security_check.https_warning": "The dashboard runs unencrypted via http://",
"security_check.https_fix": "Passwords and sessions can be intercepted. Set up a TLS certificate (for example Let’s Encrypt in your hosting panel) and open the site via https://.",
"security_check.cookie": "Session cookie",
"security_check.cookie_ok": "Sent over HTTPS only (Secure)",
"security_check.cookie_warning": "PHP does not recognise HTTPS; the session cookie lacks the Secure flag",
"security_check.cookie_fix": "Usually a proxy in front ends the encryption without telling PHP. Pass it on, for example with “fastcgi_param HTTPS on;” (nginx with PHP-FPM) or “SetEnvIf X-Forwarded-Proto https HTTPS=on” (Apache behind a proxy).",
"security_check.client_ip": "Visitor IP address",
"security_check.client_ip_ok": "Recognised",
"security_check.client_ip_warning": "All requests seem to come from {ip}",
"security_check.client_ip_fix": "A proxy in front does not pass on the visitors' IP addresses. The login lockout after failed attempts, form spam protection and statistics can then not tell visitors apart, and failed attempts by one person can lock everyone out. Pass the real address on in the web server (Apache: mod_remoteip with RemoteIPHeader, nginx: real_ip_header with set_real_ip_from).",
"security_check.errors": "PHP error messages",
"security_check.errors_ok": "Hidden from visitors",
"security_check.errors_warning": "Shown to visitors (display_errors)",
"security_check.errors_fix": "Error messages can reveal server paths and internal details. Set display_errors = Off and log_errors = On in the PHP configuration (hosting panel, php.ini or .user.ini).",
"security_check.dev_login": "Development login",
"security_check.dev_login_ok": "Switched off",
"security_check.dev_login_note": "Switched on; only accepted via localhost",
"security_check.dev_login_warning": "Switched on behind a local proxy",
"security_check.dev_login_fix": "The development login accepts the password “dev” for requests via localhost. Behind a proxy on the same server, requests can look local. Switch it off on public servers in admin/config.php: define('RAIJU_DEV_LOGIN', false);",
"security_check.php": "PHP version",
"security_check.php_ok": "PHP {version}, security updates until {until}",
"security_check.php_current": "PHP {version}",
"security_check.php_warning": "PHP {version}: security updates ended on {until}",
"security_check.php_fix": "Select a current PHP version in your hosting panel (8.4 or 8.5 recommended). Some Linux distributions keep patching older versions themselves.",
"security_check.banner_title": "Security warning: internal folders are publicly accessible",
"security_check.banner_text": "Anyone can download files from {paths} because the web server bypasses the .htaccess protection.",
"security_check.banner_data": "This includes password hashes, settings and backups.",
"security_check.banner_cta": "Details and fix",
"security_check.badge": "Security warnings: {count}",
"ai.reserved": "Reserved estimate",
"ai.pending_requests": "{count} open requests",
"ai.budget_explanation": "Costs are based on the price of the model actually used (catalog price or your own price). The local limit includes completed usage and open reservations. Actual provider charges may differ; check the provider’s billing dashboard.",
"analytics.disabled": "Analytics is disabled. Existing statistics are retained.",
"analytics.empty": "No page views in this period yet. Visits by signed-in administrators are excluded.",
"analytics.error": "Statistics could not be loaded. Existing data has been preserved.",
"analytics.enabled": "Collect anonymous website statistics",
"analytics.hint": "Stores aggregate views and short-lived visitor hashes without raw IP addresses.",
"pages.search_title": "Search page titles",
"nav.skip_content": "Skip to main content",
"btn.insert": "Insert",
"seo.title_short": "SEO title is too short.",
"seo.title_long": "SEO title is too long.",
"seo.description_short": "Meta description is too short or missing.",
"seo.description_long": "Meta description is too long.",
"seo.canonical_missing": "Canonical URL is missing.",
"seo.noindex": "The page is marked noindex.",
"seo.h1_missing": "No H1 heading was found in the page data.",
"seo.image_missing": "Open Graph image is missing.",
"seo.alt_missing": "{count} image(s) have no alternative text.",
"seo.green": "SEO looks good",
"seo.yellow": "Review SEO",
"seo.red": "SEO needs attention",
"seo.no_issues": "No major technical SEO issues found.",
"api.forbidden": "You do not have permission for this action.",
"api.csrf": "Your session token is no longer valid. Reload the page and try again.",
"api.invalid_json": "The content could not be read. Please check the submitted data.",
"api.storage": "The file could not be saved. Check storage access in System status.",
"agent.title": "AI agent",
"agent.intro": "The agent works through your request, prepares a package of changes and shows it to you. Nothing goes live until you apply it.",
"agent.mode_label": "Mode",
"agent.mode_agent": "Agent",
"agent.mode_agent_hint": "The agent prepares a complete change package for you to review.",
"agent.mode_classic": "Classic",
"agent.mode_classic_hint": "Ask questions and draft single changes step by step.",
"agent.placeholder": "Tell the agent what to change, e.g. “Add a news post about …”",
"agent.placeholder_busy": "The agent is working…",
"agent.placeholder_answer": "Answer the agent…",
"agent.placeholder_changes": "What should be different in the package?",
"agent.status_thinking": "Thinking…",
"agent.status_waiting_image": "Waiting for the image…",
"agent.status_ready": "Ready",
"agent.status_conflict": "Out of date",
"agent.status_check": "Needs attention",
"agent.cancel": "Cancel",
"agent.cancelling": "Cancelling…",
"agent.cancelled": "The agent was cancelled. Nothing was changed.",
"agent.steps_title": "{count} steps",
"agent.step_failed": "did not work",
"agent.retry": "Start again",
"agent.continue": "Continue",
"agent.busy": "The agent is still working. Try again in a moment.",
"agent.error_generic": "The agent could not finish.",
"agent.error_connection": "The connection was interrupted.",
"agent.step.unknown": "Working",
"agent.step.get_site_overview": "Looking at the site",
"agent.step.get_page_capabilities": "Checking what can be edited on {detail}",
"agent.step.read_content": "Reading {detail}",
"agent.step.list_content": "Listing {detail}",
"agent.step.list_media": "Browsing the media library",
"agent.step.list_run_media": "Checking the attached images",
"agent.step.search_stock_images": "Searching stock photos: {detail}",
"agent.step.import_stock_image": "Downloading a stock photo",
"agent.step.generate_image": "Generating an image",
"agent.step.search_web": "Researching: {detail}",
"agent.step.read_web_result": "Reading a source",
"agent.step.stage_set_field": "Changing {detail}",
"agent.step.stage_set_image": "Setting an image on {detail}",
"agent.step.stage_add_list_item": "Adding an item to {detail}",
"agent.step.stage_hide_list_item": "Hiding or showing an item on {detail}",
"agent.step.stage_remove_list_item": "Removing an item from {detail}",
"agent.step.stage_move_list_item": "Moving an item on {detail}",
"agent.step.stage_add_section": "Adding a section to {detail}",
"agent.step.stage_create_news": "Creating a news post",
"agent.step.stage_create_event": "Creating an event",
"agent.step.stage_create_page": "Creating a page",
"agent.step.stage_set_page_menus": "Changing the menus of {detail}",
"agent.step.stage_revert_op": "Taking back a change",
"agent.step.validate_changeset": "Checking the package",
"agent.step.ask_user": "Asking you a question",
"agent.step.present_changeset": "Preparing the review",
"agent.package_title": "Change package",
"agent.open_questions": "Open questions",
"agent.target_page": "Page: {name}",
"agent.target_news": "News post: {name}",
"agent.target_event": "Event: {name}",
"agent.target_shared": "Shared content: {name}",
"agent.before": "Before",
"agent.after": "After",
"agent.empty_value": "(empty)",
"agent.destructive": "Deletes content",
"agent.validation_ok": "All checks passed",
"agent.validation_errors": "Problems found",
"agent.validation_warnings": "Notes",
"agent.where_title": "Where to find it",
"agent.step.find_in_dashboard": "Looking up where this is in the dashboard",
"agent.risk_title": "Safety check: please look closely",
"agent.risk_confirm_title": "Apply despite the safety notes?",
"agent.risk_confirm_body": "The safety check flagged this package. Apply it only if it is exactly what you asked for. You can undo the package afterwards.",
"agent.risk_confirm_button": "Apply anyway",
"agent.safety_confirm_needed": "This package has safety notes. Read them in the review and confirm them to apply it.",
"agent.safety.mass_removal": "{count} of {total} parts of {target} would be removed, hidden or emptied.",
"agent.safety.list_emptied": "The list “{list}” on {target} would end up empty.",
"agent.safety.large_text_loss": "About {percent} % of the text of {target} would be gone.",
"agent.safety.too_many_removals": "This package would remove, hide or empty {count} parts of the website.",
"agent.safety.too_many_creations": "This package would create {count} pages, news posts or events.",
"agent.safety.menu_changes": "This package would change the menus of {count} pages.",
"agent.safety.too_many_targets": "This package touches {count} pages, news posts or events.",
"agent.safety.contact_changed": "An e-mail address, phone number or bank detail on {target} would be replaced by another one.",
"agent.safety.content_blocked": "The new text for {target} looks like fraud, phishing, malware, hate, adult or unlawful content and was stopped.",
"agent.safety.content_caution": "The new text for {target} asks visitors for passwords or payment details, or has links that need a second look.",
"agent.safety.content_injection": "The new text for {target} contains instructions aimed at an AI. That can be a sign of a manipulated source.",
"agent.safety_refuse.mass_delete": "I won't empty a page or delete a whole site in one go. Tell me which sections or items to remove or hide, a few at a time, and I'll prepare that for you to review. Everything can be undone afterwards.",
"agent.safety_refuse.hate": "I can't help with this: it would spread hatred or incite violence against people.",
"agent.safety_refuse.create_crime": "I can't help with this: it would create fraudulent, harmful, adult or unlawful content.",
"agent.render_failed": "A page needs attention",
"agent.images": "Images",
"agent.image_ai": "AI-generated",
"agent.image_stock": "Stock photo",
"agent.image_generated": "Generated image",
"agent.image_upload": "Your upload",
"agent.sources": "Sources",
"agent.source_warning": "This page contains text that tries to instruct an AI. It was ignored.",
"agent.conflict": "The content changed after the agent started. Revalidate the package to continue.",
"agent.revalidate": "Revalidate",
"agent.preview": "Preview",
"agent.preview_hint": "Opens the page with the changes. Only you see it.",
"agent.preview_page": "Preview: {name}",
"agent.preview_banner": "Preview: these changes have not been applied yet. Only you see the page like this.",
"agent.preview_back": "Back to the assistant",
"agent.op.set_field": "Change “{field}”",
"agent.op.set_image": "Set image “{field}”",
"agent.op.list_insert": "Add item to “{field}”",
"agent.op.list_hide": "Hide item {n} of “{field}”",
"agent.op.list_show": "Show item {n} of “{field}”",
"agent.op.list_remove": "Remove item {n} of “{field}”",
"agent.op.list_move": "Move item {from} to {to} in “{field}”",
"agent.op.section_insert": "Add {type} section",
"agent.op.create_news": "Create news post",
"agent.op.create_event": "Create event",
"agent.op.create_page": "Create page",
"agent.op.set_page_menus": "Change the menus of this page",
"agent.op.in_section": "{what} in section {n} ({type}): “{title}”",
"agent.op.in_section_untitled": "{what} in section {n} ({type})",
"agent.op.item": "(item {item})",
"agent.field.content": "Text",
"agent.field.text": "Text",
"agent.field.title": "Title",
"agent.field.heading": "Heading",
"agent.field.subtitle": "Subtitle",
"agent.field.description": "Description",
"agent.field.caption": "Caption",
"agent.field.image": "Image",
"agent.field.items": "Items",
"agent.field.alt": "Alt text",
"agent.apply": "Apply changes",
"agent.apply_confirm_title": "Apply this package?",
"agent.apply_confirm_body": "{count} changes will be saved. Changes to existing content go live right away; new content stays hidden until you publish it. You can undo the package afterwards.",
"agent.apply_confirm_body_live": "{count} changes will be saved and go live right away. You can undo the package afterwards.",
"agent.apply_confirm_button": "Apply",
"agent.apply_failed": "The package could not be applied. {message}",
"agent.discard": "Discard",
"agent.discard_confirm_title": "Discard this package?",
"agent.discard_confirm_body": "The staged changes and images are deleted. Nothing on your site changes.",
"agent.discard_confirm_button": "Discard",
"agent.discarded": "The package was discarded. Nothing was changed.",
"agent.request_changes": "Request changes",
"agent.applied_title": "Changes applied",
"agent.applied_note": "A backup was made. Changes to existing content are live; new content is hidden until you publish it.",
"agent.applied_note_live": "A backup was made. The changes are live. Undo restores the previous state.",
"agent.applied_summary": "The previous package was applied.",
"agent.undo": "Undo",
"agent.undo_confirm_title": "Undo this package?",
"agent.undo_confirm_body": "The affected content returns to the state before the package.",
"agent.undone": "The package was undone.",
"agent.publish": "Publish",
"agent.publish_confirm_title": "Publish this item?",
"agent.publish_confirm_body": "It becomes visible to visitors.",
"agent.publish_not_allowed": "Publishing needs a role with that right.",
"agent.published": "Published",
"agent.item_news": "News post",
"agent.item_event": "Event",
"agent.item_page": "Page",
"agent.item_section": "Section",
"agent.item_list_item": "List item",
"agent.reload": "Reload page",
"agent.attach": "Attach images",
"agent.attach_hint": "Attach images (JPEG, PNG or WebP). The agent can use them in the package.",
"agent.attach_blocked": "Attach images before you send a request.",
"agent.drop_hint": "Drop images here to attach them",
"agent.upload_busy": "Uploading…",
"agent.upload_failed": "{name}: {message}",
"agent.upload_limit": "You can attach up to {count} images at once.",
"agent.upload_size": "{name} is too large (max. {size} MB).",
"agent.upload_type": "Only JPEG, PNG and WebP images can be attached.",
"agent.chips_remove": "Remove images",
"ai.agent_title": "AI agent",
"ai.agent_hint": "The agent works through a request on its own, prepares a package of changes and waits for confirmation. It needs a provider with tool calling and uses several AI requests per run.",
"ai.agent_enable": "Enable the AI agent",
"ai.agent_status_ready": "The agent is ready.",
"ai.agent_status_off": "The agent is switched off.",
"ai.agent_status_ai_off": "Turn on AI and add an API key first.",
"ai.agent_status_no_tools": "The selected provider or model does not support tool calling, so the agent stays unavailable.",
"ai.agent_status_no_gd": "The PHP extension GD is missing, so images cannot be prepared.",
"ai.agent_status_no_webp": "GD has no WebP support; images are stored as JPEG.",
"ai.agent_status_limits": "An agent run needs several AI requests. Raise the daily limits (now {requests} requests) and the maximum input tokens (now {tokens}); about 300 requests per day and 64,000 tokens are a good start.",
"ai.agent_limits": "Limits per run",
"ai.agent_runs_per_hour": "Runs per hour and user",
"ai.agent_max_turns": "Model turns per round",
"ai.agent_max_tool_calls": "Tool calls per round",
"ai.agent_max_cost": "Cost cap per run (cents)",
"ai.agent_max_runtime": "Maximum duration (minutes)",
"ai.agent_uploads": "Image uploads per 10 minutes",
"ai.agent_roles": "What editors may do",
"ai.agent_roles_hint": "Administrators may do everything. Editors can always change existing text, images and links.",
"ai.agent_right_publish": "Publish new content",
"ai.agent_right_stockImages": "Use stock photos",
"ai.agent_right_uploadImages": "Attach their own images",
"ai.agent_right_generateImages": "Generate AI images",
"ai.agent_right_research": "Research on the web",
"ai.agent_right_structural": "Add, remove and move items and sections",
"ai.agent_right_createPages": "Create pages",
"ai.agent_right_createNews": "Create news posts",
"ai.agent_right_createEvents": "Create events",
"ai.agent_right_editSharedContent": "Change shared content (footer, sidebar)",
"ai.agent_images": "Images",
"ai.agent_media_folder": "Media folder for agent images",
"ai.agent_media_folder_hint": "Lowercase letters, digits, - and _. Images the agent brings in are stored in this folder of assets/images/.",
"ai.agent_credit_in_news": "Add photo credits to news posts",
"ai.agent_pexels_key": "Pexels API key (stock photos)",
"ai.agent_research": "Web research",
"ai.agent_brave_key": "Brave Search API key",
"ai.agent_clear_key": "Remove stored API key",
"ai.agent_allow_domains": "Only allow these sites (one per line, optional)",
"ai.agent_deny_domains": "Never read these sites (one per line)",
"ai.agent_respect_robots": "Respect robots.txt of the sites",
"ai.agent_sources_in_news": "Append a list of sources to news posts",
"ai.agent_clear_cache": "Clear page scan cache",
"ai.agent_cache_cleared": "Cache cleared ({count} files).",
"ai.agent_cache_hint": "The agent scans your page templates to learn what is editable. Clear the cache after you changed templates by hand.",
"system.agent": "AI agent",
"system.agent_state": "Agent",
"system.agent_on": "Enabled",
"system.agent_off": "Disabled",
"system.agent_tools": "Tool calling",
"system.agent_gd": "Image processing (GD)",
"system.agent_webp": "WebP output",
"system.agent_research": "Web research key",
"system.agent_stock": "Stock photo key",
"system.agent_storage_note": "The agent keeps its data under content/, which the security check above proves is not public.",
"system.upload_note": "When the PHP limit is below the image limit, the PHP limit applies. It is set in php.ini, .user.ini or .htaccess (upload_max_filesize, post_max_size); the .htaccess carries an example.",
"system.upload_no_webp": "Not possible: GD without WebP",
"system.upload_off": "Off",
"system.upload_on": "Active",
"system.upload_unlimited": "Unlimited",
"system.upload_memory": "Memory (memory_limit)",
"system.upload_web_version": "Web version on upload",
"system.upload_server_bound": "the PHP limit of {max} MB applies",
"system.upload_image_limit": "Image limit of the media library",
"system.upload_server_limit": "PHP upload limit",
"system.uploads": "Uploads",
"system.configured": "Configured",
"system.not_configured": "Not configured",
"agent.step.read_url": "Reading {detail}",
"ai.agent_research_hint": "Without a Brave key the agent can still read web addresses that the user writes in the chat.",
"ai.models_loading": "Loading the models of your provider…",
"ai.models_loaded": "{count} models loaded from your provider.",
"ai.models_failed": "The model list could not be loaded ({message}). You can still type a model name.",
"ai.agent_recommended_limits": "Use recommended limits",
"ai.agent_recommended_limits_hint": "Raises token and request limits that are below what the agent needs (64,000 input tokens, 16,000 output tokens, 300 requests per day). Higher values stay.",
"ai.agent_limits_raised": "Limits raised to what the agent needs. Save to keep them.",
"ai.agent_limits_fine": "Your limits are already high enough.",
"ai.limit_kind_month": "Monthly AI budget",
"ai.limit_kind_requests": "Daily AI requests",
"ai.limit_kind_text": "Daily AI text requests",
"ai.limit_kind_images": "Daily AI image requests",
"ai.limit_warning": "{kind}: {used} of {limit} used ({percent} %). Raise the limit in time.",
"ai.limit_reached": "{kind}: limit reached ({used} of {limit}). New AI requests are blocked until the limit is raised or the period ends.",
"ai.limit_adjust": "Adjust limits",
"ai.limit_raise": "Raise by 50 %",
"ai.limit_raised": "Limits raised by half. Save to keep them.",
"ai.limit_ask_admin": "Ask an administrator to raise the limit.",
"ai.limit_dismiss": "Dismiss",
"ai.limits_hint": "Limits are guides, not hard walls: a request that starts below the limit may finish, and an agent run in progress may use up to about 10 % more before it is stopped. New requests are blocked once a limit is reached. The image limit is strict.",
"settings.search_engines": "Search engines",
"settings.noindex_site": "Block this website for search engines (staging)",
"settings.noindex_site_hint": "Blocks the website in robots.txt, in the robots meta tag and in the X-Robots-Tag, and empties the sitemap. Meant for test and staging sites. Turn the block off as soon as the website is live.",
"settings.site_url": "Website address",
"settings.site_url_hint": "The public address with https://, for example https://www.example.com. It appears in canonical links and in the sitemap. Leave empty to use the address that is being visited. Update it after moving from staging to the live domain.",
"system.badge": "Notices: {count}",
"seo_check.title": "Search engines",
"seo_check.running": "Checking …",
"seo_check.pending": "Not checked yet",
"seo_check.url": "Address:",
"seo_check.expected": "Expected for a live website:",
"seo_check.allow": "Allow indexing",
"seo_check.allowed": "The block is lifted. The check is running again.",
"seo_check.where_meta": "robots meta tag",
"seo_check.where_header": "X-Robots-Tag",
"seo_check.skipped_local": "Local installation: only checked under a public address",
"seo_check.skipped_dev_server": "Not possible on the PHP development server",
"seo_check.unknown_unreachable": "Could not be checked: the server cannot reach its own address ({detail})",
"seo_check.unknown_auth": "Could not be checked: the website has access protection (HTTP 401)",
"seo_check.unknown_host": "Could not be checked: the address of the website is unknown",
"seo_check.unknown_no_curl": "Could not be checked: the PHP extension curl is missing",
"seo_check.unknown_fix": "Check from outside whether the address is reachable, for example with: curl -I {url}",
"seo_check.robots_txt": "robots.txt",
"seo_check.robots_txt_ok": "Allows search engines",
"seo_check.robots_txt_blocked": "Blocks all search engines (Disallow: /)",
"seo_check.robots_txt_status": "Answers with {detail}",
"seo_check.robots_txt_sitemap_host": "Points to a sitemap at another address: {detail}",
"seo_check.robots_txt_no_sitemap": "Contains no reference to the sitemap",
"seo_check.robots_txt_expected": "No “Disallow: /” for all search engines and a reference to this website's sitemap.",
"seo_check.robots_txt_fix_blocked_setting": "The block comes from the setting “Block this website for search engines” (Settings → Branding → Search engines). If the website is live, allow indexing with the button below or turn the setting off.",
"seo_check.robots_txt_fix_blocked_file": "A robots.txt file in the main folder of the website replaces Raiju's own robots.txt. If the website is live, delete the file or remove the line “Disallow: /” from it. Raiju then serves the robots.txt itself.",
"seo_check.robots_txt_fix_blocked_unknown": "The block comes neither from the Raiju setting nor from a file in the main folder. Check whether a hosting rule, a proxy or another system replaces the robots.txt.",
"seo_check.robots_txt_fix_status": "The robots.txt is not served normally. Check the redirects and rules of the hosting for this address.",
"seo_check.robots_txt_fix_sitemap_host": "The robots.txt names the sitemap of another address, usually the staging domain. Enter the correct website address under Settings → Branding → Search engines, or adjust a custom robots.txt in the main folder.",
"seo_check.robots_txt_fix_no_sitemap": "Add a line “Sitemap: https://your-domain/sitemap.xml” to the robots.txt, or delete a custom robots.txt in the main folder so that Raiju generates it.",
"seo_check.page_robots": "Home page for search engines",
"seo_check.page_robots_ok": "No noindex in the robots meta tag or the X-Robots-Tag",
"seo_check.page_robots_noindex": "noindex found: {where}",
"seo_check.page_robots_redirect": "Redirects to another address: {detail}",
"seo_check.page_robots_status": "Answers with {detail}",
"seo_check.page_robots_expected": "Neither the robots meta tag nor the X-Robots-Tag contains noindex, and the address does not redirect to another domain.",
"seo_check.page_robots_fix_noindex_setting": "The block comes from the setting “Block this website for search engines” (Settings → Branding → Search engines). If the website is live, allow indexing with the button below or turn the setting off.",
"seo_check.page_robots_fix_noindex_other": "The setting “Block this website for search engines” is off, yet the home page delivers noindex. Check the home page (SEO settings: Robots), custom files such as includes/header.php, the .htaccess, and rules of the hosting or a proxy for an X-Robots-Tag.",
"seo_check.page_robots_fix_redirect": "The address redirects to another domain, for example the staging domain or a parking page. Check the redirects in the hosting control panel and in the .htaccess.",
"seo_check.page_robots_fix_status": "The home page is not served normally. Check the redirects and rules of the hosting for this address.",
"seo_check.sitemap": "sitemap.xml",
"seo_check.sitemap_ok": "Valid, {count} addresses",
"seo_check.sitemap_status": "Answers with {detail}",
"seo_check.sitemap_not_xml": "Is not a valid sitemap (not XML)",
"seo_check.sitemap_empty": "Contains no pages",
"seo_check.sitemap_empty_blocked": "Empty because the website is blocked",
"seo_check.sitemap_host": "{count} addresses belong to another domain, for example {detail}",
"seo_check.sitemap_http": "{count} addresses use http://, for example {detail}",
"seo_check.sitemap_expected": "Valid XML with the pages of this website, all addresses on the same domain and with https://.",
"seo_check.sitemap_fix_status": "The sitemap.xml is not served normally. Check the redirects and rules of the hosting for this address.",
"seo_check.sitemap_fix_not_xml": "There is no sitemap at this address, probably an error or maintenance page or a broken sitemap.xml file in the main folder. Delete a custom file so that Raiju generates the sitemap.",
"seo_check.sitemap_fix_empty": "All pages are excluded from the sitemap (private, noindex or “do not include in sitemap”), or there are no public pages yet. Check the SEO settings of the pages.",
"seo_check.sitemap_fix_empty_blocked": "The sitemap stays empty while the website is blocked. It fills as soon as indexing is allowed.",
"seo_check.sitemap_fix_host": "The sitemap names addresses of another domain, usually the staging domain. Enter the correct website address under Settings → Branding → Search engines. If a custom sitemap.xml lies in the main folder, regenerate or delete it.",
"seo_check.sitemap_fix_http": "The sitemap names addresses with http:// although the website runs over https://. Enter the address with https:// under Settings → Branding → Search engines. Behind a proxy, it must pass on X-Forwarded-Proto.",
"seo_check.site_url": "Website address (setting)",
"seo_check.site_url_ok": "Matches the address being visited",
"seo_check.site_url_host": "Set to {url}, but visited at {detail}",
"seo_check.site_url_scheme": "Set to {url}, but the website runs over https://",
"seo_check.site_url_expected": "The same domain as the address being visited, with https://.",
"seo_check.site_url_fix_host": "This address appears in canonical links, hreflang and in the sitemap. After moving from staging to the live domain it must be updated (Settings → Branding → Search engines), otherwise search engines point to the old domain.",
"seo_check.site_url_fix_scheme": "Enter the address with https:// under Settings → Branding → Search engines.",
"seo_check.page_noindex": "Single pages with noindex",
"seo_check.page_noindex_ok": "None",
"seo_check.page_noindex_note": "{count} of {total} public pages are set to noindex",
"seo_check.page_noindex_expected": "Only pages that are meant to stay out of search engines.",
"seo_check.page_noindex_fix_note": "That is fine if intended, for example for thank-you pages. Otherwise change the “Robots” setting in the SEO area of the page (page list).",
"seo_check.maintenance": "Maintenance mode",
"seo_check.maintenance_ok": "Off",
"seo_check.maintenance_warning": "On: visitors and search engines get the maintenance page (HTTP 503)",
"seo_check.maintenance_expected": "Maintenance mode switched off.",
"seo_check.maintenance_fix_warning": "Turn maintenance mode off under Settings → Access as soon as the website is live. Long-lasting 503 responses make pages drop out of the search index.",
"seo_check.banner_title": "This website is blocked for search engines",
"seo_check.banner_text_setting": "The setting “Block this website for search engines” is on. On a staging or test site that is correct. Once the website is live, it will not appear in Google like this.",
"seo_check.banner_text_other": "Blocked via: {where}. On a staging or test site that is correct. Once the website is live, it will not appear in Google like this.",
"ai.organization_hint": "Only needed if API requests must be explicitly assigned to a specific OpenAI organization. Otherwise leave empty.",
"ai.model_label": "Model",
"ai.model_group_chat": "Chat/Agent",
"ai.model_group_chat_hint": "For the assistant, the AI agent and full content drafts. Quality matters here.",
"ai.model_group_text": "Text/SEO",
"ai.model_group_text_hint": "For single field suggestions, short text revisions and SEO texts. Can be a cheaper, faster model.",
"ai.model_group_both": "Chat/Agent and Text/SEO",
"ai.reasoning_effort": "Reasoning effort",
"ai.reasoning_recommended_with": "Recommended ({level})",
"ai.reasoning_low": "Low",
"ai.reasoning_medium": "Medium",
"ai.reasoning_high": "High",
"ai.reasoning_legacy": "Previous behavior (provider default)",
"ai.reasoning_hint": "Higher reasoning effort can help with complex tasks, but often increases response time and cost. The recommended setting is enough for normal tasks.",
"ai.reasoning_unknown": "No reasoning level is known for this model. The provider’s default setting applies.",
"ai.reasoning_reset": "The model does not support the selected level. Reset to “Recommended”.",
"ai.pricing_hint": "Prices apply per provider and model, in USD or EUR per 1M tokens. Without your own price the catalog price is used. Cache reads and reasoning tokens are counted as the provider reports them; reasoning effort carries no surcharge.",
"ai.price_input": "Input price (per 1M tokens)",
"ai.price_output": "Output price (per 1M tokens)",
"ai.price_currency": "Currency",
"ai.price_remove": "Remove own price",
"ai.price_unknown": "Price not on file",
"ai.price_unknown_notice": "No price is on file for at least one model. Without a price the monthly budget cannot be monitored reliably in money; only the request limits apply. Enter your own price below.",
"ai.price_status_catalog": "Catalog price: {input} / {output} USD per 1M tokens (input / output), as of {date}.",
"ai.price_status_override": "Own price: {input} / {output} {currency} per 1M tokens (input / output).",
"ai.price_status_migrated": "Carried-over estimate: {input} / {output} {currency} per 1M tokens (input / output). You can overwrite or remove it.",
"ai.price_tier_multiplier": "Above {tokens} input tokens the whole request is charged at: input ×{input}, output ×{output}.",
"ai.price_tier_absolute": "Above {tokens} input tokens the whole request is charged at {input} / {output} USD.",
"ai.fx_custom": "Own exchange rate (USD per 1 EUR)",
"ai.fx_hint": "Currently: 1 EUR = {rate} USD (as of {date}, {source}). USD prices are converted to euros with it.",
"ai.fx_own": "own rate",
"ai.usage_unpriced": "{count} requests this month have no price on file. Their cost is not included in the total.",
"ai.remove_key_title": "Remove API key",
"ai.remove_key_confirm": "The stored key is deleted immediately, regardless of other unsaved changes. The features that use it are unavailable until you save a new key.",
"ai.remove_key_button": "Remove key",
"ai.key_removed": "The stored key was removed.",
"ai.agent_offer_title": "Enable the AI agent?",
"ai.agent_offer_text": "The AI agent works especially well with {model}. Enable it now?",
"ai.agent_offer_confirm": "Enable agent",
"mails.storage_off_title": "New messages are not stored here",
"mails.storage_off_text": "“Store locally” is turned off for every enabled form. Incoming messages therefore do not appear in this list and only arrive by email, if email delivery is set up.",
"mails.forms_disabled_title": "No form is enabled",
"mails.forms_disabled_text": "As long as no form is enabled, visitors cannot send messages and this list stays empty.",
"mails.open_forms_settings": "Open forms",
"ai.agent_classic_mode": "Offer the classic mode in the chat",
"ai.agent_classic_mode_hint": "The chat can switch between the agent and the classic assistant. The classic mode is faster and cheaper for questions and single text suggestions. Turn it off if the chat should show the agent only.",
"ai.images_section": "Images",
"ai.images_section_hint": "Images come from their own service, independent of the chat provider. The AI agent, the assistant and the image generator all use it.",
"ai.image_service": "Image service",
"ai.image_service_inherit": "Same as chat provider",
"ai.image_service_openai": "OpenAI",
"ai.image_service_openrouter": "OpenRouter",
"ai.image_service_kie": "Kie.ai",
"ai.image_service_fal": "fal.ai",
"ai.image_service_comet": "Comet API",
"ai.image_service_custom": "Custom (OpenAI-compatible)",
"ai.image_service_inherit_hint": "Uses the image models of the chat provider (not possible with Anthropic).",
"ai.image_service_inherit_anthropic": "Anthropic has no image API. Choose an image service so that the agent and the image tools can create images.",
"ai.image_service_key_own": "Own key saved. Leave unchanged to keep it.",
"ai.image_service_key_chat": "No own key: the key of the chat provider with the same name is used. Enter a key here to use a separate one.",
"ai.image_service_key_none": "No API key stored for this service.",
"ai.image_service_unverified": "The parameters of this model have not been checked against the provider’s documentation. Defaults are used; add model-specific parameters below if needed.",
"ai.image_service_custom_base_url": "Base URL",
"ai.image_service_custom_base_url_hint": "Address of a service with an OpenAI-compatible /images/generations endpoint, for example https://api.example.com/v1. Local addresses need the option “Allow local/private provider URL”.",
"ai.image_service_custom_base_url_missing": "Enter the base URL of the image service.",
"ai.image_service_size_mode": "Size parameter",
"ai.image_service_size_mode_size": "Pixel size (size: 1024x1024)",
"ai.image_service_size_mode_aspect": "Aspect ratio (aspect_ratio: 16:9)",
"ai.image_service_size_mode_none": "Send no size",
"ai.image_service_auth_style": "Authentication",
"ai.image_service_extra_params": "Custom parameters (JSON)",
"ai.image_service_extra_params_hint": "Optional. Added to every request of this service, for example model-specific options. Do not enter keys here. prompt, model and n are set by raiju.",
"ai.image_price_model": "Image price",
"ai.image_price_per_image": "Price per image",
"ai.image_price_status_override": "Own price: {price} {currency} per image.",
"ai.image_price_status_catalog": "Catalog price: {price} {currency} per image, as of {date}.",
"ai.image_price_status_default": "No price is on file for this model: the default price of {cents} cents per image applies.",
"ai.usage_unpriced_images": "{count} image requests this month have no price on file. Their cost is not included in the total.",
"ai.image_price_tables": "Prices by resolution and quality (optional)",
"ai.image_price_tables_hint": "If the model charges differently per resolution step or quality, enter the price per image for each. A request uses the price of its resolution, then of its quality, then the price per image above. Empty fields use the price per image.",
"ai.image_price_status_tables": "Prices by resolution or quality are also set.",
"ai.image_price_status_tables_only": "Prices by resolution or quality are set; requests that match none use the default price per image.",
"ai.image_service_models_loaded": "{count} models loaded from the service. You can still type any model ID.",
"ai.image_service_unusable_key": "The image service {service} has no API key yet. Add one under AI settings → Images.",
"ai.image_service_unusable_model": "No image model is chosen for {service}. Choose one under AI settings → Images.",
"ai.image_price_status_catalog_tables": "Catalog prices by resolution or quality, as of {date}."
}